RPG Saga Engine Manual
Version 0.1.0
2026-10-06
1. Introduction
In short: RPG Saga Engine is a framework for role-playing games in Unreal Engine 5.8: battles in several modes, characters, abilities, items, exploration, dialog, quests, saves and an enemy AI, all driven by data you author in the editor. You make a game with its tools, mostly without code or Blueprints. This chapter says what is in the box, how the plugin is organised, and how to read the rest of the manual.
1.1 Basics
1.1.1 What the plugin is
RPG Saga Engine gives you the systems a JRPG or a tactical RPG needs, and the editor tools to fill them with your own content:
- Battles in six styles that share the same party, abilities, items and rules: grid Tactics on your live map, Free Tactics (live tactics with free movement in meters), classic ATB, turn-based (by round or by timeline) and real-time Action combat, from sword fights to shooters. Each encounter names its own mode. The player never chooses it.
- Characters and growth: classes, stats and resources you define, levels, equipment, recruitable units, guests, Pacts (summons), and three growth systems (levels only, points to spend, or a growth board).
- Story and world: a global story state (flags and variables), a visual dialog editor, quests, puzzles, shops, inns, save points, maps, a clock and weather, and living NPCs.
- An adaptive enemy AI that gets smarter or makes more mistakes depending on how you play, without changing enemy stats.
- Editor tools: RPG Saga Studio (wizards for every task), the Configurator (every setting in one window), spreadsheet import and export, a battle simulator, a whole-campaign balance tool and many more.
Everything you make is ordinary Unreal data: Data Assets, Data Tables and Project Settings. You can open it, edit it, version it, import it from spreadsheets or script it.
1.1.2 Who it is for
- Designers and solo developers who would rather spend their time on the story, the characters and the world than on writing battle systems. The Studio explains every choice.
- Blueprint users who want to react to the game from their own actors and widgets. Every system has a Blueprint API in the category RPG Saga.
- Programmers and teams who want a tested, data-driven base to extend. The C++ source is included and every system has extension points (subclasses, interfaces, delegates, command handlers).
You do not need to write code to make a complete game. You need to know the Unreal editor: how to open a project, use the Content Browser, press Play and edit a Details panel.
1.1.3 The four layers of a game
The Studio organises making a game in four layers, from the bottom up. Each layer builds on the one below, and the included starter set already fills the lower ones, so you can start at any layer.
| Layer | What it holds |
|---|---|
| 1. Game foundation | The rules everything stands on: the words the game uses, stats and resources, battle formulas, elements, equipment slots, the battle menu, battle modes, progression and money. |
| 2. Archetypes | Templates you make content from: hero classes, enemy types, NPC types, ability and item families. |
| 3. Content | What the player meets: characters, enemies, abilities, items, dialogs, quests. |
| 4. World | Where it happens: battle zones, populated areas, save points, the map, battles. |
Chapter Game foundation and archetypes covers the first two layers. Later chapters cover content and world systems one by one.
1.2 How it works
1.2.1 Logic and presentation are separate
The plugin is split into modules, and the compiler enforces one rule: rules and state never depend on presentation. All game logic (battle rules, grids, pathfinding, abilities, items, AI, conditions and effects, story state, save structures) lives in a module with no actors, no widgets and no input. Because of this a battle can run headless, with no window and no rendering. The battle simulator, the balance tools and the automated tests all rely on it.
Presentation (actors, camera, input, UI, the world) sits on top and talks to the rules through events (delegates) and commands. Chapter Core concepts explains this in practice.
1.2.2 The modules
| Module | Type | What it contains | Depends on |
|---|---|---|---|
RSECore | Runtime | Data assets, tags, settings, state and rules: battle in every mode, grid and pathfinding, abilities, items, AI, conditions and effects, narrative state, quests, economy, growth, the command bus and the save structures. No actors, components, UI, rendering or input. | Engine base modules, GameplayTags |
RSE | Runtime | Presentation and world: actors and pawns, camera, input, debug drawing, UI screens and HUDs, exploration in the world, and the orchestration of save and load. | RSECore |
RSEEditor | Editor | Studio, Configurator, wizards, importers, visual editors (dialog, quest, growth board), validation, world tools, balance tools. Never part of a packaged game. | RSECore, RSE |
RSENet | Runtime | The co-op transport: carries commands to the host and replicates state sections to guests. | RSECore, RSE, RSEOnline |
RSEOnline | Runtime | Sessions and lobbies on LAN, Steam or Epic Online Services, resolved at run time through Online Subsystem. | RSECore, RSE |
RSEGAS | Runtime | Optional bridge: characters built on the Gameplay Ability System fight in RSE battles. Inactive until an actor has the bridge component. | RSECore, RSE, Gameplay Abilities |
RSEGASEditor | Editor | Export tools for the GAS bridge. | RSECore, RSEGAS |
RSEStateTree | Runtime | Optional StateTree nodes that ask the utility AI, carry out its actions, keep a range and start battles. Nothing runs until a tree uses them. | RSECore, RSE, StateTree |
RSEStateTreeEditor | Editor | Editor support for those nodes. | RSEStateTree |
RSECommonUI | Runtime | Optional Common UI host: pushes the plugin's screens onto your Common UI layer stacks. Off by default. | RSECore, RSE, Common UI |
The boundaries are strict:
RSECorenever includes anything fromRSE,RSEEditoror any optional module.- The plugin never depends on a game module or on content under
/Game. - The optional bridges (
RSEGAS,RSEStateTree,RSECommonUI) are inert until you use them. If you never touch them they cost nothing.
1.2.3 Where things live on disk
- Plugin content is under
/RPGSagaEngine/(turn on Content Browser → Settings → Show Plugin Content to see it): the starter data (/RPGSagaEngine/Data/...), the example map, the UI styles and more. Plugin assets are templates: the Studio never edits them in place and offers Create a copy in the project instead. - Your content goes into your own folders, for example
/Game/MyRPG. The wizards create assets only there. - Settings are under Project Settings → RPG Saga Engine and are saved to your project's
Config/DefaultGame.ini. - Gameplay tags are defined in the plugin's
Config/Tagsfiles and in your own tag sources.
1.2.4 What the plugin turns on for you
The plugin enables the engine plugins it needs: Enhanced Input, Niagara, Animation Warping (optional), IK Rig (editor only), Online Subsystem and its utilities, Gameplay Tags Editor (editor only), and for the optional bridges Gameplay Abilities, StateTree, Gameplay StateTree and Common UI. None is Beta or Experimental. The plugin targets Windows (Win64) and Unreal Engine 5.8.
1.3 How to read this manual
The chapters go from the general to the specific.
- Installation and your first project gets the plugin running and a playable slice open.
- Core concepts explains the ideas every other chapter uses: data-driven content, settings, rules profiles, tags, events, saved state and validation. Read it before the system chapters.
- Systems (foundation, characters, progression, abilities, items, battles, AI, story, exploration, world, visuals, UI, save, networking and so on) each follow the same shape. Chapter Game foundation and archetypes starts the series.
- Reference chapters (Editor tools, Extending the plugin, Troubleshooting and FAQ, the Glossary) and four generated appendices complete the book.
Every system chapter has the same sections: Basics (the idea and a first working example using the editor), How it works, Key classes and assets, Settings, Blueprint usage, C++ usage, Advanced and Troubleshooting. If you only want to make a game, read Basics and Settings and skim the rest. If you extend the plugin, read Advanced and C++ usage.
The generated appendices are produced from the code, so they are always current:
- Appendix A: every Blueprint node, event and override;
- Appendix B: every Developer Settings class and its properties;
- Appendix C: every
RSE.*console variable and command; - Appendix D: every data asset type and its properties.
1.3.1 Conventions
- Class names are written as in the code:
URSE...for objects,ARSE...for actors,FRSE...for structs,ERSE...for enums. - Blueprint node names are written as the editor shows them, in bold or in step lists: Get Party Subsystem, Add Party Member.
- Menu paths use an arrow: Project Settings → RPG Saga Engine → Party.
- Settings are named as they appear in Project Settings, with their defaults when the default matters.
1.4 Key classes and assets
You will meet these first. Each has its own chapter.
| Class / asset | Module | Role |
|---|---|---|
URSEGameFoundation | RSECore | The rule book of your game, applied into the project's settings. |
URSEArchetype (and its kinds) | RSECore | Templates that content follows. |
URSECharacterData, URSEClassData | RSECore | A character and its fixed class. |
URSEPartySubsystem | RSECore | The party's state for the whole session. |
URSEAbilityData, URSEItemData | RSECore | One ability or item; works in every battle mode. |
URSEEncounterData | RSECore | One battle: its mode, enemies, rewards and rules. |
URSERulesProfile | RSECore | A set of rule overrides for a zone, a boss or a chapter. |
URSEDeveloperSettings | RSECore | Base of every settings page under Project Settings → RPG Saga Engine. |
URSECommandSubsystem | RSECore | The command bus: the one path by which player actions change state. |
1.5 Troubleshooting
- I cannot find a feature the manual describes. Check that you run the matching plugin version, and that the feature is not switched off in Project Settings → RPG Saga Engine → Features (see Core concepts).
- A class named here is not in my C++ project. Add the module to your
Build.cs(RSECore, plusRSEfor presentation classes). The optional bridges are separate modules.
1.6 See also
- Installation and your first project
- Core concepts
- Product pages:
docs/product/index.md(overview),docs/product/modularity.md(using only part of the framework).
2. Installation and your first project
In short: Install the plugin (from Fab or by hand), enable it, and either open the Starter project or run Set up the project in RPG Saga Studio. In about 45 minutes you will have a playable slice, a character of your own and a battle you made yourself. This chapter walks through every step and tells you where each window is.
2.1 Basics
2.1.1 What you need
- Unreal Engine 5.8 on Windows (Win64).
- A project. A new blank project is fine (Blueprint or C++, any template). You do not need to write code.
- About 1 GB of free disk space for the plugin and the content it creates.
The plugin turns on the engine plugins it needs by itself (see Introduction).
2.1.2 Step 1: install the plugin
From Fab (recommended).
- In the Epic Games Launcher, open your Fab Library, find RPG Saga Engine and choose Install to Engine, then pick 5.8.
- The launcher copies the compiled plugin into the engine's plugin folder (
Engine/Plugins/Marketplace). It is then available to every 5.8 project on the computer.
By hand (a zip or a source copy). Copy the RPGSagaEngine folder into your project's Plugins folder (create the folder next to the .uproject if it does not exist). A copy without a Binaries folder must be compiled: the project has to be a C++ project and you need Visual Studio 2022 with the Game development with C++ workload. When the editor offers to rebuild the missing modules, answer Yes.
Install the plugin once: either in the engine (Fab) or in the project's Plugins folder, not both.
2.1.3 Step 2: enable it
- Open your project.
- Edit → Plugins, type RPG Saga in the search box, tick RPG Saga Engine.
- Press Restart Now.
After the restart you should see:
- an RPG Saga Engine menu in the main menu bar, just before Help;
- a Studio button on the level editor toolbar;
- the RPG Saga Studio window, which opens by itself and comes to the front.
The RPG Saga Engine menu is short on purpose:
| Entry | What it does |
|---|---|
| Studio | Opens RPG Saga Studio, where you make your game. |
| Configurator | Every setting of the framework in one window, grouped and searchable. |
| Validate All Data | Checks every setting and data asset; the results open in the Message Log. |
| Help | Opens the documentation. |
| Advanced tools | Every other tool, in sections: Project Setup (Configurator, New RPG Project..., Install UE Mannequin Kit), Content (Import Character Pack..., Create New), World (Encounter Layout Mode, Open Example Map), Balance, and Check and Help. |
2.1.4 Step 3: the fast way, the Starter project
If you downloaded the Starter project from the product page, unzip it, install the plugin (Step 1), open the project and press Play. It is a blank Blueprint-only project with a tiny playable game already made by the plugin's own tools: a village with people living their daily routines, a trader, a save point, an elder who gives a quest, a house you can enter, and one battle of every mode (grid Tactics, free-movement Tactics, active-time, turn-based at a gate, and a real-time Action arena).
The zip contains neither the plugin (it comes from Fab) nor the engine's mannequin (it comes from your own engine; the first item of the First steps list installs it).
The first time you open the project, RPG Saga Studio opens by itself with a First steps list at the top of its start page:
| # | Step | Do it | Ticks by itself when |
|---|---|---|---|
| 1 | Install the mannequin | copies the engine's mannequin and the plugin's animation kit | the kit is in the project |
| 2 | Choose a foundation | opens the foundation wizard | a foundation preset is applied |
| 3 | Choose a UI style | opens the UI Styles page | the project sets its own default style |
| 4 | Play the slice | opens the starter map and plays it | you played a map of the starter project |
| 5 | Create a character | opens the New Character wizard | the project has a character the starter did not make |
| 6 | Create a battle | opens the New Battle page | the project has a battle the starter did not make |
| 7 | Scan an asset pack for interiors | opens the kit wizard | the project has an interior kit |
| 8 | Translate with AI | opens the Configurator at Content Import | a translated language exists |
| 9 | Read Getting Started | opens the documentation | you opened it from the list |
Hide this list removes it from the start page, and Show the first steps brings it back. Nothing in it is required.
Making a Starter project yourself. Any project with the plugin can generate the same slice with the New RPG Project commandlet:
UnrealEditor-Cmd.exe <Project>.uproject -run=RSENewProject -Root=/Game/Starter -Genre=Hybrid -Slice=Starter
[-Foundation=Tactics] [-UIStyle=<style id>] [-NoKit]
-Foundation applies a foundation preset (its UI style becomes the default), -UIStyle picks the default UI style by its id, and -NoKit leaves the mannequin out. -DryRun prints the plan without writing anything. The people, shop, house and battle sites of the slice are listed in Project Settings → RPG Saga Engine → Starter Project, so you can change what it contains.
2.1.5 Step 4: see what the framework does (optional)
Before you build anything, play the plugin's own example:
- RPG Saga Engine → Advanced tools → Open Example Map (or the Learn panel on the right of the Studio). The map is
/RPGSagaEngine/Examples/Maps/L_RSE_StarterExample. - Press Play. Walk with WASD or the left stick, interact with E or the bottom face button.
The map is the first zone of the starter set: a guide explains the map, a quartermaster recruits the other starter heroes, a trader sells gear, the tall grass starts random classic battles, a patrol roams the field, a Tactics battlefield hosts the zone's key battle, and a boss waits at the far end. Characters are placeholder shapes until you install a body (next step). That is expected.
To browse the plugin's own assets, turn on Content Browser → Settings → Show Plugin Content. They are under RPG Saga Engine Content. They are templates: the Studio never changes them and offers Create a copy in the project instead.
2.1.6 Step 5: tour of RPG Saga Studio
Open RPG Saga Engine → Studio (or the Studio toolbar button).
The start page shows your game in four layers (see Introduction). Each card opens a short wizard or tool inside the Studio, and Back to the Studio (bottom left) returns to the start page.
| Layer | Cards |
|---|---|
| 1. Game foundation | Configure the foundation, Set up the project, Change the preset, Progression system, Formula tester, All settings (the Configurator). |
| 2. Archetypes | New class, New enemy type, New NPC type, Growth board, Archetype library. |
| 3. Content | New character, New enemy, New ability, New item, New dialog, New quest, New teacher, Weapon with mastery. |
| 4. World | New battle zone, Populate a zone, Save point, Generate the map, New battle, New action battle. |
On the right of the page:
- Continue where you left off lists the assets you created or edited lately, with thumbnails.
- Learn has short guides and the example map.
- Show advanced tools everywhere puts the Advanced tools menu sections directly into the main menu.
In a new project with no foundation applied, a blue banner says New project? Start with the foundation. You can ignore it; the starter set works as it is.
Explanations. The Explanations switch in the Studio's top right corner has three levels: Beginner (the default: a "Why it matters" panel on every page, tooltips and ? buttons), Normal (tooltips and ? buttons) and Expert (the bare fields). A ? button opens the documentation page for its field. The texts live in the data table DT_RSE_StudioHelp (Project Settings → RPG Saga Engine → Studio → Help Table), so they are translated with the rest of the plugin.
2.1.7 Step 6: set up your project
- In the Studio, 1. Game foundation → Set up the project. (The same wizard is at RPG Saga Engine → Advanced tools → New RPG Project....)
- Choose:
- the content root, the folder for everything the wizard creates, for example
/Game/MyRPG; - the genre preset: JRPG (ATB), Turn-based (rounds), Turn-based (CTB), Tactics only or Hybrid (Tactics + classic). It sets the default rules and the kinds of battle your first map gets;
- the theme, the visual style, the languages, and whether the new maps become the project's startup maps;
- Start From Example Map (optional): your first map becomes a copy of the example zone;
- Copy Starter Content (optional): your own editable copy of the starter set;
- Install Mannequin Kit: leave it ticked. It copies the UE5 mannequin from your engine's templates and gives the starter characters real bodies and animations. (Later: Advanced tools → Install UE Mannequin Kit.)
- the content root, the folder for everything the wizard creates, for example
- Read the plan on the right: every asset it will create and every setting it will change. Nothing is written yet.
- Press Apply, then Open start map.
You now have a main menu map and a first map with a Player Start, a save point, an NPC who talks and battle sites for your genre, plus a starting party. Everything is in your own folders and in your Config/Default*.ini. Nothing is written into the plugin, and the new content validates clean.
Press Play. The first time a system appears (the first battle, the time gauges, the rows), a short tutorial card explains it and pauses the game until you page through it. Each card shows once per save, and they can be turned off in the game's Options.
2.1.8 Step 7: pick a foundation preset
The foundation is the rule book of your game. You can keep the starter rules, or start from another genre:
- 1. Game foundation → Configure the foundation.
- Choose a starting preset (see Game foundation and archetypes).
- Press Next through the pages. Each has a live preview on the right and Use recommended values.
- On Summary and Apply, press Check my project (changes nothing), then Apply.
Nothing is written before Apply. You can come back and change the preset at any time with Change the preset.
2.1.9 Step 8: make your first character
- 3. Content → New character. A live 3D preview turns on at the right.
- Who is it? Type a name, choose Hero.
- Start from: pick a hero class archetype, for example Paladin.
- How does it look? Keep the look, or pick one you imported.
- Which class? Confirm the class and the starting level.
- What can it do? The abilities by level; leave them as they are.
- Where does it appear? Choose In the starting party.
- Summary and Create, then Open the character sheet. The sheet shows everything about the character on one page, with Test in battle: a few quick simulated battles that tell you the win rate without opening a level.
Characters and party explains what you just made.
2.1.10 Step 9: make your first battle and play it
- Open the first map. In the viewport, look at an open, flat piece of ground near the Player Start: the battle is placed in front of the camera.
- 4. World → New battle. Choose the battle mode (for example Tactics), add one or two enemies, read the estimated difficulty (aim for Fair), set rewards, and under Where it happens choose A Tactics zone.
- Create, then Test now for a quick simulated check. Undo (Ctrl+Z) removes what was placed.
- Save the level (Ctrl+S) and press Play. Walk into the battle site. The world turns into a grid on the ground. Place your units on the blue tiles and start. Moving and acting both cost Action Points, in any order.
You have made a playable RPG battle without code.
2.1.11 Step 10: check your work
RPG Saga Engine → Validate All Data checks every setting, rules profile and data asset. The results open in the Message Log under RPG Saga Engine Validation. Run it before you package and whenever something behaves strangely.
2.2 How it works
- The plugin loads its modules at editor start: the runtime modules (
RSECore,RSE,RSENet,RSEOnlineand the optional bridges) and the editor modules (RSEEditorand friends). - Plugin defaults (
Config/Defaults/Game.iniinside the plugin) are applied under your project's config: a key is used only when yourConfig/DefaultGame.inidoes not set it. This is how a plugin-only project already has the starter content registered with the Asset Manager. - The wizards write only to your project: assets into the content root you chose, settings into your
Config/Default*.ini. They show a plan first and write nothing until you press Apply. - The Studio is a front end. Every card ends up creating ordinary data assets and settings. Anything you can do in the Studio, you can also do in the Content Browser, the Configurator or Project Settings.
2.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSENewProjectCommandlet | RSEEditor | The Set up the project wizard without its window (-run=RSENewProject). |
URSEWizardSettings | RSEEditor | Project Settings → RPG Saga Engine → Wizards: genre presets, example map, starter folders. |
URSEStarterSliceSettings | RSEEditor | Project Settings → RPG Saga Engine → Starter Project: the contents of the starter slice. |
URSEStudioSettings | RSEEditor | Project Settings → RPG Saga Engine → Studio: help table, previews, role fields. |
/RPGSagaEngine/Examples/Maps/L_RSE_StarterExample | content | The example map: zone 1 of the starter set. |
/RPGSagaEngine/Data/Foundation/DA_Foundation_* | content | The foundation presets. |
2.4 Settings
| Where | What |
|---|---|
| Editor Preferences → Plugins → RPG Saga Studio | Explanation level, open sheets on double-click, open the Studio at startup. |
| Project Settings → RPG Saga Engine → Wizards | Genre presets, theme presets, the example map, the starter content folders, the starter map layout. |
| Project Settings → RPG Saga Engine → Starter Project | The people, shop, house and battle sites of the Starter slice. |
| Project Settings → RPG Saga Engine → Studio | The help table, the test battle used by Test in battle, the 3D preview and role-field rules. |
The full lists are in Appendix B.
2.5 Blueprint usage
The setup tools are editor tools and need no graph. In your own game graphs, two nodes are useful on day one:
- Is Feature Enabled (category RPG Saga → Features) tells your own UI whether a system is switched on.
- Get Party Subsystem (category RPG Saga → Party) returns the object that holds your party.
Example: show a Quests button only when quests are on.
- In your widget, Event Construct.
- Is Feature Enabled with Feature = Quests.
- Set Visibility of the button from the result (Visible or Collapsed).
See Appendix A for every node.
2.6 C++ usage
A C++ project that uses plugin classes adds the modules to its Build.cs:
PublicDependencyModuleNames.AddRange(new string[] { "RSECore", "RSE" });
// Add "RSEGAS", "RSEStateTree" or "RSECommonUI" only if you use those optional bridges.
Then include headers by their domain folder, for example Characters/RSEPartySubsystem.h. Never add RSEEditor to a game module that ships in a packaged build.
2.7 Advanced
- Command-line setup.
-run=RSENewProjectaccepts-Root,-Genre,-Theme,-MenuMapName,-FirstMapName,-Enemies,-NoMenuMap,-NoFirstMap,-NoParty,-NoKit,-NoSettings(create assets and maps only),-DryRun,-Slice=Starter,-Foundation=<preset>and-UIStyle=<style id>. Use it on a build machine to produce the same starting point every time. - Unattended runs. The Studio never opens by itself when the editor runs unattended, in automation, in commandlets or with
-NoRSEStudio. - Using only part of the plugin. Systems can be switched off in Project Settings → RPG Saga Engine → Features, and our state can live inside your own SaveGame. See Core concepts and
docs/product/modularity.md. - Packaging. The plugin ships compiled for Win64. A Blueprint-only project never shows a compile prompt.
2.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No RPG Saga Engine menu | The plugin is not enabled, or failed to load | Edit → Plugins, tick it, restart. Check the Output Log for LogPluginManager and RSE. |
| "Missing or built with a different engine version" | The copy has no binaries for this engine | Install from Fab with Install to Engine, or rebuild in a C++ project with Visual Studio 2022. |
| The plugin loads twice or behaves oddly | Installed both in the engine and in the project | Remove one copy and restart. |
| The Studio does not open at startup | The setting is off, or the run is unattended | Untick Don't show at startup in the Studio, or set Open Studio At Startup in Editor Preferences. Use the toolbar button. |
| Characters are grey placeholder shapes | No body is installed | Advanced tools → Install UE Mannequin Kit, or import a character pack. |
| The wizard says there is no UE5 mannequin | The engine templates are not installed | In the editor, Add Feature or Content Pack → Third Person, then run the wizard or the kit again. |
| A tool the manual mentions is not in the menu | Some tools show only in context | See Editor tools; for example Encounter Layout appears when a Tactics zone or ATB stage is selected. |
2.9 See also
- Core concepts
- Game foundation and archetypes
- Characters and party
- Editor tools
- Product pages:
docs/product/getting-started.md,docs/product/studio.md,docs/product/starter-content.md,docs/product/editors-and-wizards.md.
3. Core concepts
In short: A handful of ideas explain how the whole plugin works: content is data, rules are settings, state is plain serializable data, logic is separate from presentation, and everything is checked by validation. Learn them once here and every other chapter will read the same way.
3.1 Basics
3.1.1 Content is data
Everything a player meets in an RPG Saga Engine game (a class, a character, an ability, an item, an enemy group, a dialog, a quest) is a data asset you create in the Content Browser or with a Studio wizard. New content means new data, not new code or new Blueprints.
Data assets derive from URSEPrimaryDataAsset. They share a few fields:
- Display Name: the player-facing, localizable name. While it is empty, the asset name is shown, so placeholder content still reads.
- Dev Notes: design notes for your team (editor only, stripped from packaged builds).
- Balance Locked: tells the balance tools never to change this asset.
- Archetype link (editor only): the template the asset follows. See Game foundation and archetypes.
Data assets refer to each other by reference (a class lists abilities, a character names its class). Saved games never store those references as pointers: they store IDs (see below), so content can be renamed, moved or removed between versions without breaking old saves.
3.1.2 IDs and the Asset Manager
Every data asset has a Primary Asset Id: its type (the first native class name, for example RSEAbilityData) plus its asset name. Save files, runtime state and the tools use this stable ID. Two practical consequences:
- Give assets clear, stable names (
DA_Ability_Fireball,DA_Char_Hero) and avoid renaming them after players have saves. If you must, add a redirect: the save system applies Unreal's core redirects and the Asset Manager's redirects when it loads old content references. - The folders are scanned by the Asset Manager. The plugin registers its own folders (for example
/RPGSagaEngine/Data/Abilities) through its default config. The Set up the project wizard registers your content root the same way, so your assets are found at run time.
3.1.3 Gameplay tags
Gameplay Tags name the things that content and rules share: stats, resources, elements, statuses, classes, equipment kinds and story flags. The plugin uses tag families with a fixed root:
| Root | Examples of what lives there |
|---|---|
Stat.* | Stat.MaxHP, Stat.Attack, Stat.Speed, Stat.ActionPoints |
Resource.* | Resource.HP, Resource.MP, Resource.Resonance |
Element.* | damage types: fire, ice, and your own |
Class.* | one tag per class |
Trait.* | movement traits, status immunities and other granted abilities |
Equip.Type.*, Equip.Slot.* | kinds of equipment and slot types |
Ability.Type.* | ability categories (attack, skill, magic...), used to sort the battle menu |
Battle.Mode.* | Battle.Mode.Tactics, ATB, Turn, FreeTactics, Action |
Progression.Points.* | growth point currencies |
Tags are edited in Project Settings → Gameplay Tags. The plugin's own tags are in its Config/Tags files. Your tags go in your project's tag sources. Only the tags that C++ code references directly are native (RSEGameplayTags::Battle_Mode_Tactics and so on). All content tags are plain data, so you can add your own stats, elements and statuses without code.
3.1.4 Settings: the rules of your game
Global rules live in Project Settings → RPG Saga Engine, one page per system (Battle, Grid, Items, Economy, Party, Progression and more). Each page is a subclass of URSEDeveloperSettings, saved to your project's Config/DefaultGame.ini. You can edit them in three places:
- Project Settings → RPG Saga Engine → <page>;
- the Configurator (RPG Saga Engine → Configurator): every settings page in one window, grouped by domain, searchable, with validation, a Reset section to defaults button and quick test launch buttons;
- the Studio's wizards, which write settings for you and show what they will change first.
There are no tunable numbers hardcoded in the plugin. If a rule has a number, it has a setting or a field on a data asset.
3.1.5 Rules profiles
A Rules Profile (URSERulesProfile) overrides some settings for one place: a boss, a chapter, a "story mode", a genre. A profile holds one override per settings page (a section) and only stores what differs from the global settings. Everything else follows the global values.
Lookup order for a setting, in the first match wins:
- the encounter's own profile (an encounter can name one);
- the game's active profile (chosen by the story with the Set Rules Profile effect, saved with the game, default from Project Settings → RPG Saga Engine → Rules Profiles → Default Profile);
- the profile's parent, then its parent's parent, and so on;
- the global settings.
A running battle copies the profile it started with, so switching the game's profile never changes a battle in progress. Some fields are global only because they must match your content (for example the tile size of the grid, the maximum level, the starting party). A profile's value for them is ignored and validation warns when it differs.
To make a profile in the Configurator, open Rules Profiles → New profile, then Add override on the sections you want to change. Debug commands: RSE.Rules.Dump logs the active profile and its overridden sections; RSE.Rules.SetProfile <AssetName | None> switches it.
3.1.6 Feature toggles
Project Settings → RPG Saga Engine → Features has one checkbox per system (Grid Tactics, Live Tactics, ATB / Turn-Based, Action Combat, Dialog, Quests, Story Scenes, Inventory, Economy, Growth / Progression, Living NPCs, Time and Weather, Map and Minimap, Stealth, Puzzles, Cards, Bestiary, Tutorials, Adaptive Difficulty, Online and Co-op). All are on by default. A switched-off system is not created at all: its subsystems do not exist, so it costs no memory or time, and its menu pages, option rows and HUD widgets disappear.
Never switched off: the party, the save system, the story state (flags and variables), the rules and the command bus.
The Configurator's Validate button warns about combinations that leave something half-working (for example Quests on, Dialog off). For one test run only, -RSEDisableFeatures=Quests,Cards on the command line turns features off without touching your settings.
3.1.7 Validation
Data is checked in the editor with Unreal's standard Data Validation (IsDataValid), so problems appear when you save, in the Message Log and in the Content Browser. RPG Saga Engine → Validate All Data checks every setting, rules profile and data asset at once and opens the results in the Message Log under RPG Saga Engine Validation. The Studio's wizards keep Create disabled until every problem is fixed, and say why at the bottom of the window.
Run Validate All Data before you package and whenever something behaves strangely.
3.2 How it works
3.2.1 Data → rules → presentation
The plugin has three layers, and information flows one way:
data assets + settings -> rules and state (RSECore) -> presentation (RSE)
(what you author) (what happens) (what the player sees)
- Data is authored by you.
- Rules (
RSECore) read the data and compute what happens: damage, turn order, pathfinding, conditions, effects, story state. They use no actors, no widgets, no input and no rendering. - Presentation (
RSE) reads the rules' state and events and shows them: actors in the world, animation, camera, HUDs and menus.
Because rules never include presentation, a battle can run headless. The battle simulator, Test in battle, the difficulty estimates and the automated tests all play real battles with no window. Presentation reacts to what rules report through events (delegates), and sends player actions back as commands.
3.2.2 State is plain data
All runtime state (the party, inventory, story flags, quests, progression) is stored in plain structs whose saved fields are marked SaveGame. Content is referenced by soft path or ID, never by pointer. Three properties follow:
- Saving is serializing those structs. A system that wants to be saved registers a save participant with the save system, which owns one named section of the save file (
Party,Narrative,Quests...). Each section has a version number, so old saves are converted by the system that owns the section, and fields added later load as their defaults. - Missing content never crashes a load. Content removed since the save was made is dropped with a warning.
- State is the unit of networking. The same sections are what co-op replicates (see Co-op and online).
The Blueprint nodes of the Save Interop group (Export Sections To Bytes, Import Sections From Bytes and friends) let you keep plugin state inside your own SaveGame. See Save and load.
3.2.3 Commands: one path for player actions
Player actions that change shared state go through the command bus (URSECommandSubsystem). A command is a small struct (Add Party Member, Equip Item, Bind Pact, Unlock Growth Node) with a handler that validates it and then applies it:
Submit(command) -> validate -> apply -> result (Applied / Rejected / ...)
In single player it runs locally, on the spot. In a co-op session a guest's command travels to the host, which validates and applies it and sends the result back. There is one code path for every mode, so your own systems become network-ready by using it. Menus, input and Blueprint nodes all send commands; the authority's own systems (battle results, loads, story effects) write state directly.
3.2.4 Conditions and effects: one language for content
Dialogs, quests, puzzles, encounters, interactions and abilities all use the same primitives:
- a condition is a question about the game state: has the item, a flag has a value, a member is in the party, a puzzle is solved (
URSEConditionsubclasses such as Flag Is, Has Item, Member In Party, Puzzle Solved, combined with All Of, Any Of and Not); - an effect is a change: set a flag, give or take an item, add a member, give experience, start a battle, start a dialog, unlock an area (
URSEWorldEffectsubclasses such as Set Flag, Give Item, Add Member, Start Battle, Start Dialog, Unlock Area).
You add them inline in any data asset's list. Every effect also has an Only If gate. Story, dialog and quests covers the full list. Your own conditions and effects can be Blueprint classes (Extending the plugin).
3.2.5 Formulas as data
Derived stats, combat damage, hit chance and resource gains are small formulas written in data (FRSEExpression), compiled once when the project loads and evaluated without allocations. The language has numbers, + - * / % ^, comparisons, && and ||, and the functions min, max, clamp, floor, ceil, round, abs, sqrt, pow and if. Names refer to stats by short name (Stamina), to the unit with a scope (Attacker.Attack, Target.Defense) and to context variables (Level, Power). See Game foundation and archetypes.
3.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEPrimaryDataAsset | RSECore | Base of all content definitions: name, notes, archetype link, validation. |
URSEDeveloperSettings | RSECore | Base of every settings page; subclasses appear under Project Settings → RPG Saga Engine. |
URSERulesProfile | RSECore | A set of per-section rule overrides, with an optional parent. |
URSERulesSettings | RSECore | Rules Profiles page: the default profile and session rule options. |
URSERulesSubsystem | RSECore | Holds the game's active profile and resolves the profile of a battle. |
URSEFeatureSettings | RSECore | Features page: one switch per system. |
URSECommandSubsystem | RSECore | The command bus. |
URSEWorldEffect, URSECondition | RSECore | Base classes of effects and conditions. |
FRSEExpression | RSECore | A formula written in data. |
IRSESaveParticipant | RSECore | A system's save section. |
URSESaveSubsystem | RSECore | Collects the sections, writes and reads save files. |
3.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Features | One checkbox per system. All on by default. |
| Project Settings → RPG Saga Engine → Rules Profiles | Default Profile (a new game's profile) and Session Rule Options (option rows whose values are the host's in co-op). |
| Project Settings → RPG Saga Engine → Commands | Handler classes for the command bus (Blueprint or C++). |
Configurator (RPG Saga Engine → Configurator) | All pages in one window, with the Rules Profiles panel and the tools. |
Every page is documented in Appendix B.
3.4.1 Console variables and commands
Debug switches are console variables and commands under RSE.*; no debug behaviour is hardcoded. A few you will use early:
| Name | What it does |
|---|---|
RSE.Rules.Dump | Logs the active rules profile and its overridden sections. |
RSE.Rules.SetProfile <name or None> | Switches the game's rules profile. |
RSE.Party.List | Logs each party member's HP, MP, KO state and lasting statuses. |
RSE.Items.Give <Item> [Count] | Adds an item to the party inventory. |
RSE.Encounter.Debug, RSE.NPC.Debug, RSE.Camera.FramingDebug | Debug drawing and logging for encounters, NPCs and the battle camera. |
The full list is in Appendix C.
3.5 Blueprint usage
All Blueprint nodes are under the category RPG Saga. Systems that need the game's state take a hidden World Context Object, so you can call them from any actor, widget or game instance.
Reading the game's rules and state:
- Event BeginPlay
- Is Feature Enabled (Feature = Dialog)
- Branch on the result, then create your dialog button only on True.
Switching the rules profile from a graph:
- In data, prefer the story effect Set Rules Profile. In a graph, use Get Game Instance Subsystem (class
RSERulesSubsystem), then call Set Active Profile on it and pass your profile asset. - Bind to On Rules Profile Changed on the same object to refresh your UI.
Sending a command from Blueprint:
- Make Instanced Struct with the command type, for example Add Party Member.
- Fill its fields (Character = your character asset).
- Get Game Instance Subsystem (class
RSECommandSubsystem) → Submit Command. - Read the result's Status.
Most systems also have convenience nodes that do the same in one call. For example, Add Party Member in the party library sends that command for you. See Appendix A.
3.6 C++ usage
Read a rule through the active profile instead of the raw settings, so profiles keep working:
#include "Core/RSERulesSubsystem.h"
#include "Battle/Common/RSEBattleSettings.h"
int32 GetATBPartySize(const UObject* WorldContext)
{
const URSERulesProfile* Profile = URSERulesSubsystem::GetActiveProfileFor(WorldContext);
const URSEBattleSettings* Battle = RSERules::Get<URSEBattleSettings>(Profile);
return Battle->ATBPartySize;
}
Never call GetDefault<T>() for a settings class that is a rules profile section in rule code. RSERules::GetGlobal<T>() states the intent when you do want the global value.
A new settings page is a subclass of URSEDeveloperSettings:
UCLASS(Config = Game, DefaultConfig, EditInlineNew, meta = (DisplayName = "My Rules"))
class UMyRulesSettings : public URSEDeveloperSettings
{
GENERATED_BODY()
public:
// A rules profile may override this page.
virtual bool IsProfileSection() const override { return true; }
UPROPERTY(Config, EditAnywhere, Category = "Combat", meta = (ClampMin = "0"))
float MyBonus = 1.f;
};
It appears under Project Settings → RPG Saga Engine and in the Configurator automatically. Add EditInlineNew and IsProfileSection only if a profile may override it.
A system that stores its own save section registers a struct:
// In a UGameInstanceSubsystem::Initialize
URSESaveSubsystem* Save = Collection.InitializeDependency<URSESaveSubsystem>();
Save->RegisterStruct<FMyState>(TEXT("MyState"), /*Version*/ 1, this, [this] { return &State; });
// After changing State at run time (the authority only):
Save->MarkSectionChanged(TEXT("MyState"));
Gate a subsystem on a feature toggle with RSE_FEATURE_GATE(ERSEFeature::Cards) right after GENERATED_BODY(), or by calling RSEFeatures::IsEnabled from ShouldCreateSubsystem.
3.7 Advanced
- Profile sections. Only settings classes that return
truefromIsProfileSection()can be overridden. A profile's section is created inline (EditInlineNew), initialised from the global values the first time, and stores a value only if it differs. UseGetGlobalOnlyProperties()for fields that must always come from the global settings. - Writing rules code. Rule code reads settings through
RSERules::Get<T>(Profile)and never through the class default object. Battles read through their own copy of the profile (URSEBattle::GetRules<T>()). - Subsystem lookup in tests. Headless tests create subsystems with
NewObjectwithout a subsystem collection.RSESubsystemLookup::FindFor<T>(Object)finds either kind, so write rule code with it when it must run in tests. - No Tick by default. Systems use events, timers and one-shot tickers. If you add a system, do the same.
- Heavy references are soft. Mesh, texture and animation references on data assets are
TSoftObjectPtr, so loading a data asset never pulls its art in. - Save versions. Never rename a section id once saves exist. Bump the version and convert old bytes in
ReadSaveSection. - Extending the language. New conditions and effects are subclasses of
URSEConditionandURSEWorldEffect, or Blueprint classes of Custom (Blueprint). Both areEditInlineNew, so they appear in every list at once. - Plugin defaults. The plugin's
Config/Defaults/Game.iniis applied under your config at load. A key you set in yourDefaultGame.iniwins. A list you set (any+Key=or!Key=ClearArray) replaces the plugin's list.
3.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| A setting you changed has no effect in a boss fight | The boss's encounter or the active rules profile overrides it | Run RSE.Rules.Dump, then edit the setting in the profile (Configurator → Rules Profiles) instead of the global page. |
| A profile's value is ignored | The field is global only | The Configurator hides global-only fields in profiles and lists them in a note. Edit the global page. |
| A system's menu page or HUD is missing | Its feature is switched off | Project Settings → RPG Saga Engine → Features. Check -RSEDisableFeatures in the command line. |
| Old saves lose a character or item after a rename | The content ID changed | Add a core redirect or an Asset Manager redirect for the old name. |
| Create is disabled in a wizard | A validation problem | Read the reason at the bottom of the window; fix it, or run Validate All Data. |
| A new settings page is under Other in the Configurator | It is not in a group | Project Settings → Editor → RPG Saga Engine Configurator → Groups: add the class to a group. |
| A guest in co-op cannot change something | The command is host-only | Host-only commands (saves, session rules, giving characters) are refused for guests by design. |
3.9 See also
- Game foundation and archetypes
- Story, dialog and quests
- Save and load
- Co-op and online
- Extending the plugin
- Product pages:
docs/product/modularity.md,docs/product/glossary.md; design notesdocs/design/rules-profiles.md,docs/design/configurator.md,docs/design/attributes.md.
4. Game foundation and archetypes
In short: The Game Foundation is the rule book of your game: what you call things, which stats and resources exist, how damage is computed, which elements and equipment slots there are, which battle modes you use, and how progression and money work. Archetypes are templates you make content from ("a typical knight", "a healing spell"). You choose a foundation preset first, then make content that follows archetypes.
4.1 Basics
4.1.1 What the foundation decides
The foundation answers "what kind of RPG is this?". Does it have MP or Stamina? Fire and ice, or plasma and radiation? Grid battles or active-time battles? It has nine parts:
| # | Part | Examples |
|---|---|---|
| 1 | Vocabulary | "Party", "Class", "Magic", "Lv", the names of elements and equipment kinds |
| 2 | Stats and resources | HP, MP, Stamina, Attack, Speed; derived stats with formulas |
| 3 | Combat formulas | physical and magical damage, healing, hit chance, critical chance |
| 4 | Elements and damage types | fire, ice, plasma, and the weakness table |
| 5 | Equipment and items | equipment slots, equipment kinds, item categories, inventory mode |
| 6 | Ability categories and the battle menu | Attack, Skills, Magic, Items, Actions |
| 7 | Battle modes and party size | which modes are on, the default mode for new battles, party size |
| 8 | Progression | maximum level, experience curve, progression system |
| 9 | Economy | currency name and symbol, starting money, sell ratio |
Applying a foundation writes into settings you can also edit by hand (the attribute registry, Combat Formulas, Battle, Turn-Based Battle, Items, Command Menu, Progression, Economy, Bestiary and Game Terms). Nothing new runs in the game: a foundation is a convenient, validated way to set a lot of settings at once, and you can keep editing Project Settings afterwards.
4.1.2 Foundation presets
Presets live in /RPGSagaEngine/Data/Foundation and appear as cards on the first page of the wizard.
| Preset | In short |
|---|---|
| JRPG Classic | The framework's standard setup: HP, MP, Resonance, eleven stats, eight elements, every battle mode. |
| Tactics | Grid battles only, bigger flank, back and height bonuses. |
| Empty | HP, four stats and one attack, turn-based battles: build the rest yourself. |
| Dark Fantasy | Stamina and Fury instead of MP, four elements, deadlier criticals, scarce healing. |
| Sci-fi RPG | Energy and Tech instead of MP and Magic, physical, energy and plasma damage, firearms, implant and chip slots. |
| Post-apocalyptic | Stamina and Adrenaline, ballistic, fire, toxic and radiation damage, caps as money. |
| Steampunk | Steam that refills every turn, fire, voltage and impact damage, pistols and sabres, gadget slots. |
| Action: Swords | Real-time sword fights: the Melee action preset, Action as the starting mode, Tactics and classic battles off. |
| Action: Shooter | Real-time shooting with cover: the Shooter action preset, Action as the starting mode. |
Every preset except Empty comes with a small starter set made for it (four hero classes with their heroes, five abilities per class that use the preset's resources and damage types, eight items, five enemies and three battles). Every preset is validated and played in a simulated battle in each of its modes by the plugin's automated tests.
4.1.3 First working example: apply a preset
- Open the Studio: RPG Saga Engine → Studio.
- 1. Game foundation → Configure the foundation.
- On the first page, pick a starting preset (for example Dark Fantasy) or My current setup (your Project Settings as they are).
- Go through the pages: Vocabulary, Stats and resources, Battle formulas, Elements, Equipment and items, Abilities and the battle menu, Battle modes, Progression, Economy. Each has a short explanation, the fields, Use recommended values (back to the preset's values for this page) and a live preview on the right: | Page | Preview | |---|---| | Vocabulary | the battle screen and command menu with your words | | Stats and resources | a sample character's stats at any level (derived stats use your formulas) | | Battle formulas | a damage calculator: power, attack, defense, result | | Elements | the weakness matrix: what a 100-damage hit does to a weak, resistant, immune or absorbing target | | Equipment and items | what a character wears and the inventory tabs | | Abilities and the battle menu | the command menu | | Battle modes | the modes and the party size | | Progression | experience needed at levels 2, 5, 10, 20, 50 and the last level | | Economy | starting money, what a 100 item sells for, an inn night |
- On Summary and Apply, press Check my project (changes nothing). It lists the tags to add and the content that uses stats, elements, slots or categories the foundation drops, with a proposed replacement for each (for example MP becomes Energy). Change the replacements if you want and press Apply the replacements to my content.
- Optionally tick Copy the starter content into my project when I press Apply and Use the starter heroes as my starting party.
- Press Apply. The foundation is saved in your project (
/Game/Foundation) and written into Project Settings. It stays blocked while content would break, unless you tick Apply anyway.
Pick the foundation first, before you make much content: it is cheaper to choose "Stamina instead of MP" on day one than to replace it in a hundred abilities later (although the replacement tool does that for you).
4.1.4 Archetypes
An archetype is a template you create content from: "Knight", "Goblin", "Merchant", "Healing spell". Content made from an archetype remembers it and follows it for every field you did not change.
| Kind | Class | Creates | Starter archetypes (/RPGSagaEngine/Data/Archetypes) |
|---|---|---|---|
| Hero Class Archetype | URSEHeroArchetype | a Class | Paladin, Warrior, Sorcerer, Cleric, Ranger, Rogue, Monk, Summoner |
| Enemy Type | URSEEnemyArchetype | an enemy Character | Beast, Brawler, Construct, Druid, Knight, Marksman, Pyromancer, Poisoner, Witch, Wraith |
| NPC Type | URSENPCArchetype | an NPC's Interaction | Merchant, Quest giver, Recruiter, Innkeeper, Card player, Passer-by and more |
| Ability Family | URSEAbilityFamily | an Ability | weapon attack, elemental spell, area spell, healing, revive, status attack, buff, ranged shot |
| Item Family | URSEItemFamily | an Item | potion, status cure, bomb, melee and ranged weapons, armor, helmet, shield, accessory |
Working with them in the Studio:
- 2. Archetypes → Archetype library shows every archetype of your project and of the plugin. Filter by kind, role (tank, damage, support, merchant...), library tag, search text, or Mine only.
- Click a card. The right panel offers New character from it / New enemy from it, Create content from it, Open the archetype sheet, Duplicate, Duplicate as child (a variant that keeps following the original, such as Fire Knight from Knight), Show who uses it and Update content from it....
- Plugin archetypes are templates. Duplicate one into your project before you change it.
- New class, New enemy type and New NPC type make a new archetype in three steps: start from, name and one-sentence summary, Create. You set its values on its sheet.
4.1.5 How content follows its archetype
- An inherited field is shown greyed, with from archetype X next to it.
- A field you change becomes overridden and is yours. Editing an inherited field anywhere (the sheet, the generic editor, the Details panel) marks it overridden automatically.
- Reset to archetype brings the archetype's value back. Reset all to archetype drops every override. Keep my changes marks every difference as an override.
- Nothing changes silently. When you save an archetype and some content now differs, a notification offers Review changes. The update list shows every asset made from the archetype with what would change (old value, new value). Check the assets that should follow, press Apply to checked. Values an asset changed itself are listed as kept and never touched. Plugin assets are never changed from here.
- When a variant (child archetype) changes, Continue with ... reviews its own content the same way.
- The game never loads archetypes: content always holds its final values, so there is no runtime cost, and content made without an archetype works exactly the same.
Make an archetype for anything you will create more than three times (a family of goblins, a kind of healing potion).
4.2 How it works
4.2.1 Applying a foundation
A foundation (URSEGameFoundation) is a data asset only; it is editor-only and never cooked. Applying it:
- Validates it (
Validate Foundation): missing required stats (Stat.Speed; Tactics also needsStat.ActionPointsandStat.Jump),Resource.HP, formulas that do not compile, unknown tags, empty menus. - Adds missing tags to the project's tag file (Game Foundation → New Tag Source,
RSE_Foundation_Project.iniby default). - Checks change safety: scans the project's content (and, if you ask, the framework's own settings: Pacts, Bestiary, Progression Designer) for stats, elements, slots and categories the new foundation drops, and proposes replacements (the foundation's Suggested Replacements first).
- Writes the project's attribute registry and command menu layout (into Game Foundation → Project Foundation Folder,
/Game/Foundation), writes the settings and saves them toConfig/DefaultGame.ini, and remembers the foundation (Applied Foundation). - Optionally copies the starter content into
/Game/StarterContent/<Preset>(Starter Content Folder), keeps assets you already have, and can make the starter heroes your starting party.
Copying again never loses your edits: assets already there are kept. Reset starter assets that are already in my project is off by default; on, existing assets go back to the starter values, but nothing is ever deleted or moved. The copies point at each other, never at the plugin's originals. A foundation's UI style becomes the project's default style when you apply it in the Studio.
4.2.2 Stats, resources and the attribute registry
Stats and resources are defined in an Attribute Registry (URSEAttributeRegistry), chosen in Project Settings → RPG Saga Engine → Attributes. Without one, the framework's built-in definitions (HP, MP, Resonance and the standard stats) apply, which reproduce the default rules exactly.
An attribute (FRSEAttributeDefinition) is a stat such as Stat.Attack: tag, display name, short label, the short name formulas use, a category and description, a minimum and optional maximum, a rounding mode (None, Floor, Round, Ceil), an optional Derivation formula, and whether it shows in menus. A plain attribute comes from class growth and modifiers. A derived attribute has a formula over other attributes, for example 50 + Stamina * 10 + Level * 5 for Max HP. Formulas can read Level and Base (the attribute's own base value from class growth).
A resource (FRSEResourceDefinition) is a current value with a maximum that changes in battle: Resource.HP, Resource.MP, Resource.Resonance, or your own (Rage, Steam). Its fields are:
- Maximum: an attribute (
Stat.MaxHP) or a formula; Availability, a formula that says whether a unit has the resource at all (HasPact); - Start: Full, Empty or a fixed value; Persists After Battle, so the party keeps the value between battles and saves it (HP and MP usually do);
- Change over time: Regen Per Turn, Regen Per Second (ATB and real-time modes), and gain rules that grow the resource on battle events (damage dealt, damage taken, kill, perfect command, block, ability used);
- HUD style: where it shows, the bar style, colors that follow the UI theme, a low-value color and an icon.
Resource.HP is the life resource: 0 defeats a unit. Every other rule is data.
4.2.3 Formulas and stats
The order of operations for one stat is always the same, whatever the order of its sources (class, equipment, statuses, Pacts, growth boards, personal modifiers):
- Base: the class's growth at the level, or, for a derived stat, the formula's result.
- Add: plus the sum of all Add values.
- Percent: times
1 + (sum of all Percent values) / 100, so 20 means +20%. - Multiply: times the product of all Multiply values (1.5 is +50%, two of them multiply each other).
- Override: the stat becomes the Override value (with several, the last source wins).
- Clamp Min / Clamp Max: at least the largest Clamp Min, at most the smallest Clamp Max (if they cross, the maximum wins).
- The attribute's own rounding and its Min and Max from the registry.
A Multiply of 0 sets the stat to 0, so validation of an equipment asset warns about it. Examples: a ring with Multiply 1.1 on Attack, a curse with Clamp Max 50 on Speed, a boss phase with Override 999 on Defense.
Combat formulas (Project Settings → RPG Saga Engine → Combat Formulas, a rules-profile section) are the same kind of formulas: which stats feed physical and magical offense and defense, and the expressions for Defense Factor, Physical Damage, Magical Damage, Fixed Damage, Healing, Hit Chance, Critical Chance, Critical Multiplier and Final Damage. Names inside them: Power, Offense, Defense, DefenseFactor, Position, Variance, HitBonus, Damage, Affinity, Level and the battle's constants (such as DefenseConstant), plus Attacker.<stat> and Target.<stat> for any stat. The defaults reproduce the framework's original numbers.
Formula tester. Studio → Formula tester (also Test with a real class and equipment under the stats preview of the foundation wizard). Pick a character, a class or a hero class archetype, a level and the equipment worn, add extra modifiers to try, and press Compute. Every attribute and derived stat is listed with its final value, the value it started from, the modifiers that apply in order, and its formula. Problems are highlighted: red for an unknown variable, a syntax error or a cycle (the base value is used until you fix it), orange for a division where a stat it reads is 0 (the formula counts that part as 0).
4.2.4 Elements and the weakness table
Elements are tags under Element.*. A unit's affinity to an element is one of Normal, Weak, Resist, Immune or Absorb. When sources disagree, the strongest protection wins (Absorb over Immune over Resist), and Resist plus Weak cancel to Normal. The damage multiplier per affinity is the Affinity Multipliers map in Project Settings → RPG Saga Engine → Battle; a foundation can write its own.
4.2.5 Equipment slots and item categories
Equipment slots (FRSEEquipmentSlotDef) are a list in Project Settings → RPG Saga Engine → Items → Equipment Slots: a slot id (Weapon, Accessory1), a display name, the slot type it accepts (Equip.Slot.*), the body part for the paperdoll, an empty icon, and where an item worn there is shown on the body. The foundation also names the off-hand slot that a two-handed weapon occupies, the equipment kinds classes may use (Equip.Type.*: firearms, blades, implants) and the item categories for inventory tabs. A Equipment Slot Set asset (URSEEquipmentSlotSet) can hold a ready slot layout and apply it to the project.
The foundation also sets the inventory mode: Shared (one party grid: classic JRPG, ATB, Tactics) or Per Character (a bag per member and a stash at save points). It can be switched later in both directions.
4.2.6 The battle command menu
The classic battle menu (Project Settings → RPG Saga Engine → Command Menu) is a layout (URSECommandMenuLayout): an ordered list of top-level commands. Each command (FRSECommandMenuEntry) has an id, a label, a help line, a kind and the ability types that go into it (children included), plus options:
- Kind: Ability uses the first matching ability at once (an "Attack" command), List opens a list (Skills, Magic, Items, Actions).
- Catch All: abilities no other command takes come here (one command should have it).
- Include Summons, Include Items, Include Flee.
A class can name its own layout (URSEClassData::CommandMenu) and a layout can rename or hide commands for one class (Class Overrides). Commands with nothing in them are hidden or shown disabled (Empty Groups). The menu remembers the cursor per unit (Remember Cursor).
4.2.7 Game Terms: the words on screen
Every screen reads its vocabulary from Game Terms (Project Settings → RPG Saga Engine → Game Terms): the battle HUDs, party menu, shop, battle results, save and load screens, bestiary, battle log and Pact screens. Change a term (or apply a foundation) and every screen follows, with no restart. The ids screens ask for:
| Id | Default | Used for |
|---|---|---|
Party | Party | party menu columns, shop comparison |
Class | Class | class names on cards |
Level / LevelShort | Level / Lv | "Lv 12" on cards, rows and results |
Experience / ExperienceShort | Experience / EXP | results, the party menu |
Abilities, Skills, Magic | Abilities, Skills, Magic | party menu pages and ability groups |
Items, KeyItems, Equipment | Items, Key Items, Equipment | party menu pages, shop tabs, results |
Money | Money | the results label (amounts use the Economy currency) |
Enemies | Enemies | target lists, bestiary, results |
HP, MP | from the attribute registry | HP lines, "Not enough MP." (MP is the main spendable resource: Energy, Stamina, Steam...) |
Tag Names gives player-facing names to tags (Element.Fire becomes "Fire", Equip.Type.Weapon.Firearm becomes "Firearm"). The ability groups of the party menu use the names of the ability categories.
Screen texts in Project Settings use the words as arguments, for example {Term.LevelShort} {Level} or +{Amount} {Term.ExperienceShort}. Keep the argument to follow the game's vocabulary, or type a fixed word to override it for that screen only. Terms are localizable text.
4.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEGameFoundation | RSECore | The foundation data asset (nine parts + starter content). Editor-only. |
URSEFoundationLibrary | RSECore | Validate, capture the current setup, apply, impact report, test battles, game terms. |
URSEFoundationEditorLibrary | RSEEditor | Project-level operations: plan, apply to project, copy starter content, add tags. |
URSEFoundationSettings | RSECore | Game Foundation page: folders, tag source, change safety, test battle, starter balance. |
URSEGameTermsSettings, RSEGameTerms | RSECore | Game Terms page and the lookup screens use. |
URSEAttributeRegistry | RSECore | Attribute and resource definitions. |
URSEAttributeSettings | RSECore | Attributes page: which registry the game uses (a profile section). |
URSECombatFormulaSettings | RSECore | Combat Formulas page (a profile section). |
URSECommandMenuLayout, URSECommandMenuSettings | RSECore | The battle command menu and its page. |
URSEFormulaTesterLibrary | RSECore | Run and format a formula test. |
URSEArchetype and its kinds | RSECore | Templates: URSEHeroArchetype, URSEEnemyArchetype, URSENPCArchetype, URSEAbilityFamily, URSEItemFamily. |
URSEArchetypeLibrary | RSECore | Link, inherit, override, reset and propagate (editor data). |
URSEArchetypeEditorLibrary | RSEEditor | Find, create, duplicate and propagate across the project. |
4.4 Settings
| Where | What |
|---|---|
| Game Foundation | Applied Foundation, Project Foundation Folder (/Game/Foundation), Starter Content Folder (/Game/StarterContent), New Tag Source (RSE_Foundation_Project.ini), Library Folders, Managed Tag Roots, Report Settings References, the test battle, the starter balance band. |
| Game Terms | Terms (words by id) and Tag Names. |
| Attributes | Registry: the attribute registry the game uses. |
| Combat Formulas | The stats that feed offense and defense, and the nine formulas. |
| Battle | Affinity Multipliers, positioning (flank, back, height) multipliers, ATB Party Size (default 4), Default Encounter Mode, hit chance limits. |
| Command Menu | Default Layout, Fallback Entries, Empty Groups, Remember Cursor, Show Back Entry. |
| Items, Economy, Progression | Slots and categories; currency and shops; maximum level and experience curve. |
Every page is in Appendix B.
4.5 Blueprint usage
At run time, the foundation's words and rules are available through simple nodes (category RPG Saga → Foundation):
- Get Game Term (Id, Fallback) returns the game's word for an id.
- Resolve Game Terms (Text) fills the
{Term.<Id>}arguments of any text. - Get Known Game Terms lists every word with its default and current value.
- Get Tag Display Name (Tag) returns a tag's player-facing name.
Example: a custom HUD label that follows the game's vocabulary.
- Event Construct in your widget.
- Get Game Term with Id = LevelShort, Fallback = "Lv".
- Format Text with
{0} {1}(term, current level) and Set Text on your label.
In the editor (Editor Utility Blueprints and Python), the foundation tools are categories RPG Saga → Foundation and RPG Saga → Studio → Foundation:
- Validate Foundation, Is Foundation Valid, Get Foundation Presets, Get Missing Tags;
- Plan Foundation Apply To Project (changes nothing), Apply Foundation To Project, Apply Foundation With Starter Content;
- Copy Starter Content To Project, Copy Starter Content With Options, Plan Starter Content Copy;
- Create Project Foundation, Analyze Impact, Apply Replacement Mapping To Project;
- Run Foundation Test Battle, Run Starter Content Battles;
- Run Formula Test and Format Formula Test Report.
Archetypes (categories RPG Saga → Archetypes and RPG Saga → Studio → Archetypes): Find Archetypes, Create Content From Archetype, Duplicate Archetype, Create Archetype From Content, Find Assets Using Archetype, Compute Propagation In Project, Apply Propagation And Save, Set Parent Archetype, Reset Field To Archetype, Is Field Inherited, Is Field Overridden, Get Out Of Date Fields.
Example: make a new goblin from an archetype in an Editor Utility Blueprint.
- Find Archetypes (Kind =
RSEEnemyArchetype, Content Class =RSECharacterData). - Pick the archetype, then Create Content From Archetype (Folder =
/Game/MyRPG/Enemies, Asset Name =DA_Char_Goblin, Save = true). - Check Out Error is empty.
The full node list is in Appendix A.
4.6 C++ usage
Apply a foundation from an editor module and read the result:
#include "Foundation/RSEFoundationLibrary.h"
#include "Archetypes/RSEFoundationEditorLibrary.h"
void ApplyPreset(const URSEGameFoundation* Preset)
{
// 1. Dry run: lists errors, missing tags and content that would break.
const FRSEFoundationApplyReport Plan = URSEFoundationEditorLibrary::PlanFoundationApplyToProject(Preset);
// 2. Apply. Refused (nothing written) when content would break and bAllowBreakingChanges is false.
const FRSEFoundationApplyReport Report =
URSEFoundationEditorLibrary::ApplyFoundationToProject(Preset, /*bAllowBreakingChanges*/ false);
}
Read the game's words at run time in your own widgets:
#include "Foundation/RSEGameTerms.h"
const FText PartyWord = RSEGameTerms::Get(RSEGameTerms::Party, NSLOCTEXT("MyUI", "Party", "Party"));
const FText Label = RSEGameTerms::Resolve(FText::FromString(TEXT("{Term.LevelShort} 5")));
Compute a stat the way the game does:
FRSEFormulaTestInput Input;
Input.Character = MyCharacter; // or ClassData / Archetype
Input.Level = 20;
const FRSEFormulaTestResult Result = URSEFormulaTesterLibrary::RunFormulaTest(Input);
UE_LOG(LogTemp, Display, TEXT("%s"), *URSEFormulaTesterLibrary::FormatFormulaTestReport(Result));
Extension points: a new archetype kind is a subclass of URSEArchetype that overrides GetBaseContentClass() (and InitializeNewTemplate() for kind-specific defaults); all archetype classes share one Asset Manager type, RSEArchetype. Terms are plain ids, so a game can define any id of its own and use {Term.MyWord} in screen texts.
4.7 Advanced
- Per-zone or per-boss formulas. Combat Formulas, Attributes and Battle are profile sections, so a Rules Profile can give a boss other formulas or a zone another attribute registry. Keep persistent resources consistent between registries used in the same game.
- Suggested replacements. A foundation's Suggested Replacements map (for example
Resource.MPtoResource.Energy) is what the breaking-change report offers first. Fill it when you make your own foundation that drops tags of the plugin's. - Your own foundation. Change the preset → My current setup captures the project's settings into a foundation asset in your project (
Create Project Foundation), which you edit in the wizard. Presets in the plugin stay untouched. - Resource gain rules. A gain rule's amount is a formula that can read
Amount,DamagePercentand, for Pacts, the Pact rates, so a resource can grow in proportion to damage taken or on perfect commands. Pact resources use this (see Characters and party). - Archetype internals. An archetype holds a Template (an instanced data asset of its Content Class) and a list of Non Inherited Fields (identity such as the class tag, copied once at creation). Content stores an
FRSEArchetypeLink(the archetype plus the overridden field names), which is editor-only data. Propagation recomputes differences when you apply, so a stale report can never overwrite anything. - Scripting archetypes. Use Set Template From Content to turn a hand-made asset into a template, Detach From Archetype to stop an asset following its archetype (it keeps its values), and Validate Archetype Link in batch checks.
4.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Apply is blocked | Your content uses a stat, element, slot or category the new foundation drops | Use Check my project, adjust the proposed replacements, Apply the replacements to my content, then Apply again (or tick Apply anyway). |
| A plugin archetype cannot be edited | Plugin assets are templates | Duplicate it into your project. |
| Content did not change after I edited its archetype | Nothing changes silently | Open Review changes (or Update content from it...), check the assets and apply. |
| A screen still shows an old word | That screen's text in Project Settings has a fixed word | Replace it with the {Term.<Id>} argument. |
| A stat shows an unexpected value | A modifier source you forgot (equipment, status, Pact, growth) | Use the Formula tester with the same character, level and equipment: it lists each step. |
| A formula is red in the tester | Unknown name, syntax error or a cycle | Fix the name (use the attribute's short name) or break the cycle; the base value is used meanwhile. |
| Validation reports a missing stat with Tactics on | Tactics needs Stat.ActionPoints and Stat.Jump | Keep both stats in the registry, or turn Tactics off in the foundation's battle modes. |
| The wizard's test battle fails in a mode | The foundation lacks something that mode needs | Read the issue list on Summary and Apply; the test plays one quick battle per mode. |
4.9 See also
- Core concepts for settings and rules profiles
- Characters and party
- Progression
- Abilities and statuses
- Items, inventory and economy
- Product pages:
docs/product/archetypes-and-foundation.md,docs/product/studio.md,docs/product/starter-content.md; design notesdocs/design/studio.md,docs/design/attributes.md.
5. Characters and party
In short: A class (
URSEClassData) defines stat growth, abilities by level and allowed equipment. A character (URSECharacterData) is a specific hero, recruit or enemy with a fixed class plus personal traits. The party (URSEPartySubsystem) holds who is in your team, their levels, equipment, resources and Pacts for the whole game, and survives level changes and saves.
5.1 Basics
5.1.1 The three kinds of character
Every character has a Roster that says where it can fight:
| Roster | What it is | Fights in |
|---|---|---|
| Main | A story character: found in the world and recruited as the story goes. | Every battle mode. |
| Secondary | A recruited unit (a mercenary, a volunteer). | Grid Tactics only. |
| Enemy | An enemy or neutral unit, controlled by the AI. | Every battle mode, on the other side. |
Two more ideas modify this:
- Guest: a character with Guest ticked is a temporary party member. It always wears its Default Equipment and the player cannot change it, for exactly as long as it is in the party. A guest keeps a fixed loadout, build and Pact.
- Class is fixed. There is no job change. A character keeps its class for the whole game. What changes a character over time is levels, equipment, the progression system (Progression) and, for main characters, Pacts.
The same character, class, stats and abilities work in every battle mode.
5.1.2 First working example: make a class, a hero and put it in the party
- Archetypes first. In the Studio, 2. Archetypes → Archetype library, pick a hero class archetype such as Paladin and press Create content from it. That creates a class in your project.
- A hero. 3. Content → New character. Answer the seven steps: Who is it? (name, Hero), Start from (an archetype or an existing character), How does it look?, Which class? (and starting level), What can it do? (abilities by level, with checkboxes), Where does it appear?, Summary and Create.
- Where does it appear? offers four choices:
- Not yet: only the asset is made.
- In the starting party: the hero is part of a new game's party (the Studio updates Party → Starting Members for you).
- Recruitable in the world: an NPC with a "Join us?" dialog is placed in front of the camera, with a story flag that remembers the recruitment.
- An enemy in the world: an encounter and a spawner or battle zone.
- After Create, open the character sheet. Press Test in battle to play a few quick simulated battles and read the win rate.
The same one-click actions are available on any Character asset: right-click it, RPG Saga: Character Actions, then Add to Starting Party, Make Recruitable or Make Enemy. Undo removes what was placed in the level.
5.1.3 The character sheet
Double-click a Character asset to open its sheet: header (portrait, name, role, class, level, valid or not), buttons (Test in battle, Add to party, Make recruitable, Make enemy, Duplicate, Open generic editor) and tabs: General, Look (live preview), Class & stats (the stats at the starting level), Abilities, Equipment and In game. Simple / Advanced shows the essential fields or all of them. Only the fields that make sense for the role are shown (an enemy has no guest flag and no Add to party button, a hero has no loot table). The class and the look can be edited right on the sheet.
Characters and classes that come with the plugin are templates: the sheet shows a Create a copy in the project button, and only your character changes.
5.1.4 The fields of a character
| Field | Meaning |
|---|---|
| Class | The fixed class. |
| Roster | Main, Secondary or Enemy. |
| Starting Level | Level when the character first joins (default 1). |
| Control | Player or AI. Guests can be either; enemies are AI. |
| Default ATB Row | Front or back, for classic battles. Casters and archers usually stand in the back. |
| Experience Reward | What the party gets when the character is defeated as an enemy. 0 = the formula in the Progression settings. |
| Loot Table, Default AI Profile | Rewards and AI for enemies. An encounter may override the AI profile. |
| Guest, Default Equipment | A guest wears the default equipment, locked. Other characters start with it. |
| Personal Modifiers, Personal Affinities, Personal Traits | Differences from the class: a sturdier knight, a hero weak to fire. They are combined with the class's. |
| Growth Plan, Bag Size | An own growth plan and (per-character inventory) bag size, instead of the class's. |
| Appearance, Portrait, Follower Profile, Attack Presentations | Presentation only. Battles and saves never read them. |
| Bestiary fields | Description, category, hide from the bestiary. |
5.1.5 The class
A class (URSEClassData) has:
- a Class Tag (
Class.*), the class's identity; - Stat Growth: for each stat a Base at level 1 and a Per Level value (
Base + PerLevel × (Level − 1)); - Affinities (elemental weak, resist, immune, absorb) and Granted Tags (traits such as
Trait.Move.Levitate); - Allowed Equipment Types (
Equip.Type.*; a parent tag allows all its children); - Abilities: each ability with the level it unlocks at;
- an optional Command Menu layout and Growth Plan (see Progression);
- an optional Bag Size.
Stats not listed are zero unless a modifier adds them. Derived stats (Max HP computed from Stamina) follow the foundation's formulas (Game foundation and archetypes). An ability the class lists at level 1 is known from the start; later ones unlock when the character reaches that level.
5.1.6 Levels and experience
A character's level and experience are part of the party's state. The experience needed in total to reach level L is
ExperienceBase × (L − 1) ^ ExperienceExponent + ExperiencePerLevel × (L − 1)
unless an Experience Curve (a float curve of total experience by level) replaces the formula. Defaults: maximum level 99, base 15, exponent 2, per level 0. When a character gains experience, every level reached raises the stats from class growth, raises current HP and MP by the gain in their maximums, and unlocks the class abilities of that level. Experience from a battle is shared among the members still standing. Enemies give EnemyExperienceBase + EnemyExperiencePerLevel × (Level − 1) unless their character sets a reward. All of these are in Project Settings → RPG Saga Engine → Progression.
5.1.7 Party and roster
The party is the list of characters the player controls. Related notions:
- Starting Members: the new-game party (Project Settings → RPG Saga Engine → Party → New Game).
- Formation (classic battles): the members that fight in ATB and turn-based battles, in order. The rest are the reserve. By default the first members that can fight in classic battles fill it, up to ATB Party Size (Battle, default 4). The first change in the party menu makes it explicit. Secondary characters cannot join it.
- Rows: each character is in the front or back row (its default row, or the player's choice). The back row deals and takes less melee physical damage by default (magic and bows are not affected).
- Tactics roster: every member can be deployed in a grid battle, up to the number of deployment tiles.
- Vitals: each member's current resources, KO state and lasting statuses between battles.
The party menu (Formation page) is where the player changes these. In exploration, the visible party follows the leader in formation and the player can switch leader; see Exploration.
5.1.8 Recruitment, guests and leaving
Characters join and leave through story effects, dialogs and quests, or from Blueprint:
- Recruit with the effect Add Member (data) or the node Add Party Member (Blueprint). Main, Secondary and Guest characters all use it. It does nothing if the character is already a member.
- Guests are simply characters marked Guest: add them when the scene needs them and remove them afterwards. They come with their own equipment, fixed for their stay.
- Leave with Remove Member or Remove Party Member and a departure kind:
- Permanent: the character leaves for good and its equipment returns to the inventory (guests always keep theirs);
- Parallel Scenario: the character leaves for another storyline and will come back, keeping its equipment.
- Restore Party (Restore Party node) gives full HP and MP, removes KO and statuses, for everyone or one character.
- Set Level can start a recruit at the party's average or highest level plus an offset (a late joiner catching up), or at an exact level.
- Give Experience, Learn Ability and Forget Ability are effects too.
A recruit usually comes from an NPC (ARSENPC) whose interaction runs a dialog with the Add Member effect. Make Recruitable builds exactly that. Which characters are available can depend on story state: use conditions such as Member In Party and Member Not KO in dialogs, quests and puzzles.
5.1.9 NPC types
NPC types are archetypes (URSENPCArchetype) that create an NPC's interaction: Merchant, Quest giver, Recruiter, Innkeeper, Card player, Passer-by, Blacksmith, Elder, Priest and more, in /RPGSagaEngine/Data/Archetypes/NPCs. Pick one in 2. Archetypes → New NPC type or the library, then place the NPC (ARSENPC) in the level. NPC routines and barks are covered in Exploration.
5.1.10 Pacts
A Pact is the customization layer of main characters (who have a fixed class): an original summon system with affinities, abilities that extend the class, and a summon, a temporary unit the player controls, in every battle mode.
What a Pact (URSEPactData) gives its holder:
- Affinities and granted tags (a resistance, a status immunity);
- Abilities learned with Pact points, each with a point cost, an optional prerequisite ability, and an optional Replaces: a Pact ability that upgrades a class ability takes its place while learned;
- a summon ability (always available to the holder) that creates the summon character: a unit with its own class, stats and abilities, at the summoner's level or a level you set.
Rules:
- Only main characters hold Pacts. A character holds one Pact; a Pact is held by one character at a time. Guests keep a fixed loadout.
- Pacts change only outside battle.
- The party obtains Pacts from the story, optional bosses or puzzles.
- The summon costs Resonance (
Resource.Resonance): a full bar, consumed. Resonance builds when the holder acts (Resonance On Act, default 15), when it takes a damaging hit (Resonance On Hit, 10) and with the share of max HP lost (Resonance Per Damage Percent, 0.5). The bar's size and its gain rules are the resource's definition in the attribute registry. - In Tactics the summon stays on the grid for Summon Turns Tactics of its own turns (default 3) on free tiles near the summoner. In ATB it takes the summoner's place for Summon Turns ATB commands (default 3).
- If the summon is defeated before it expires the summoner suffers backlash: Backlash Damage Percent of its max HP (default 25) and optionally a status.
- Winning a battle earns Pact points for each Pact that fought: Points Per Victory (default 10) plus Points Per Enemy Defeated (default 2).
Create a Pact with Advanced tools → Create New → Pact: description, summoned unit and an existing summon ability.
5.2 How it works
5.2.1 From data to a unit in battle
URSECharacterData ──► class stat growth at the level
│ + personal modifiers, affinities, traits
│ + equipment, Pact, statuses, growth (added by their owners)
▼
FRSEAttributeSet (the unit's stats) ──► battle unit ──► presentation actor
URSECharacterData::InitializeAttributes(Level, OutAttributes) produces the class stats at a level plus the character's personal traits. Equipment, Pacts, statuses and progression add their own sources, aggregated in the order of operations you saw in chapter 3. A battle spawns units from the party's state (level, equipment, resources, Pact, progression) or from an encounter's enemy list, then runs them with no knowledge of actors.
5.2.2 The party state
URSEPartySubsystem owns the party's state for the whole game session (it survives level changes). The state (FRSEPartyState) holds: members, inventory and item containers, money, shop purchases, encounter-rate effects, vitals and equipment per character, the formation and ATB rows, owned Pacts with their holders and progress, learned and forgotten abilities per character, progression (level and experience), the growth state of the progression systems, and each member's battle hotbar order.
The state is read-only to screens: GetState() returns it, and changes go through party commands or through GetStateForApply() for the authority's own systems (battle results, loads, story effects), which marks the Party section changed so the write is never silent. The Party section is saved with the game and replicated in co-op.
Before a battle the director remembers the whole party state (SaveBattleSnapshot); a Retry after defeat puts the party back exactly as it was.
5.2.3 Commands
Party changes are commands on the command bus (Core concepts). The party commands include: Set Formation, Set ATB Row, Move In Formation, Set Battle Menu Order, Cast Field Ability, Use Field Item, Equip Item, Unequip Item, Bind Pact, Unbind Pact, Learn Pact Ability, Buy Item, Sell Item, Rest At Inn, Add Party Member, Remove Party Member, Restore Party, Learn Ability, Set Member Resource, Add Experience, Add Party Experience, Set Level, Give Pact, Award Pact Points, Give Item, Take Item, Add Money and Spend Money. Story-driven ones (adding members, experience, Pacts, items, money) are host-only in co-op; the player's own choices (equipment, formation, Pact binding) are open to every player, subject to the co-op rules (for example Guest Equipment).
5.2.4 Events
Subscribe instead of polling:
OnMemberResourceChanged(character, resource, old, new) fires when a member's resource changes outside battle (healing items, inns, story effects). Battles report their own on the battle object.OnAbilityLearned(character, ability, learned) fires when a character learns or forgets an ability for good (story effects, scrolls, nodes).
5.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEClassData | RSECore | A fixed class: stat growth, abilities by level, allowed equipment. |
URSECharacterData | RSECore | A hero, recruit or enemy: class, roster, control, traits, equipment, presentation. |
ERSECharacterRoster, ERSEBattleControl | RSECore | Main, Secondary, Enemy; Player or AI. |
URSEPartySubsystem | RSECore | The party's state for the whole session; resource access and events. |
FRSEPartyState | RSECore | The serializable party: members, equipment, vitals, Pacts, progress. |
URSEBlueprintLibrary_Party | RSECore | Blueprint access to members, levels, attributes, equipment, formation and Pacts. |
URSEPartySettings | RSECore | Party page: starting members, defeat recovery. |
URSEPactData, URSEPactSettings | RSECore | A Pact; global Pact rules. |
FRSECmd_* party commands | RSECore | Commands such as FRSECmd_AddPartyMember. |
ARSENPC | RSE | An NPC actor with an interaction (recruiters, merchants). |
URSEPartyFieldSubsystem | RSE | The visible party in exploration: followers, leader switching. |
URSEPartyMenuWidget | RSE | The party menu screen. |
5.4 Settings
| Where | What |
|---|---|
| Party → New Game → Starting Members | The new-game party (global only). |
| Party → Defeat | Defeat Recovery HP Percent (default 0) and Defeat Recovery Min HP (default 1): HP fallen members regain after a story battle the party may lose. |
| Progression | Max Level (99), the experience curve (Experience Base 15, Exponent 2, Per Level 0, optional Experience Curve), enemy experience, enemy level scaling and enemy stat growth. |
| Battle | ATB Party Size (default 4). |
| Pacts | Summon Resource (Resource.Resonance), initial CT and ATB fractions of a summon, Summon Placement Range (3 tiles), Backlash Can Defeat (off), Points Per Victory (10), Points Per Enemy Defeated (2), Award Fallen Members (off). |
| Party Field | The visible party's follower rules (pace, drift, idle behaviours). |
| Character Actions (editor) | The recruit flag root and tag source, and the enemy battle mode used by the one-click actions. |
Per-Pact numbers (Resonance rates, summon turns, backlash) live on the Pact asset. The full lists are in Appendix B.
5.5 Blueprint usage
The party library is under RPG Saga → Party (nodes take a hidden World Context). The most used nodes:
| Task | Nodes |
|---|---|
| Members | Get Party Members, Is Party Member, Add Party Member, Remove Party Member, Restore Party |
| Levels | Get Level, Get Experience, Get Experience To Next Level, Add Experience, Add Experience To Party, Set Level |
| Stats | Get Member Attribute, Get Member Attributes, Get Member Resource, Get Member Resource Max, Modify Member Resource, Get Member Vitals, Is Member KO |
| Abilities | Get Member Abilities, Learn Ability, Forget Ability, Has Learned Ability, Get Learned Abilities |
| Formation | Get ATB Formation, Get Tactics Roster, Is In ATB Formation, Set In ATB Formation, Get ATB Row, Set ATB Row, Get ATB Party Size |
| Equipment | Get Equipment, Get Equipped Item, Can Equip, Equip, Unequip, Get Equip Candidates, Preview Equip |
| Pacts | Get Owned Pacts, Give Pact, Has Pact, Can Bind Pact, Bind Pact, Unbind Pact, Get Bound Pact, Get Pact Holder, Get Pact Points, Award Pact Points, Can Learn Pact Ability, Learn Pact Ability, Get Learned Pact Abilities |
Example 1: a treasure room that recruits a hero and gives the party experience.
- Event ActorBeginOverlap on your trigger volume.
- Add Party Member (Character =
DA_Char_Wren). Branch on the returned bool: False means she was already in the party. - Add Experience To Party (Amount = 200, Only Standing = true).
Example 2: show a level-up banner.
- In your HUD widget, Event Construct → Get Party Subsystem.
- Bind Event to On Ability Learned (your custom event shows "Character learned Ability").
- After awarding experience elsewhere, read the Add Experience return value (Level Up Result): Old Level, New Level and New Abilities.
Example 3: bind a Pact outside battle.
- Can Bind Pact (Character, Pact). On Ok, Bind Pact.
- Otherwise show the refusal reason: Not Owned, Not Main Character, Guest Character, Bound To Other Character or In Battle.
Result enums to know: ERSEFormationResult (Ok, NotMember, TacticsOnly, Full, LastActiveMember, InBattle), ERSEEquipResult, ERSEPactBindResult, ERSEPactLearnResult.
In data, the same changes are story effects: Add Member, Remove Member (with a departure kind), Restore Party, Set Level, Give Experience, Learn Ability, Forget Ability, and conditions Member In Party, Member Not KO. The party library has no story effect for giving a Pact: use the node Give Pact in a Custom (Blueprint) effect (override On Execute), or call it from your own graph. See Appendix A.
5.6 C++ usage
Read party state through the subsystem. Send changes as commands so single player, host and guests all work:
#include "Characters/RSEPartySubsystem.h"
#include "Characters/RSEPartyCommands.h"
#include "Commands/RSECommandSubsystem.h"
void RecruitHero(UGameInstance* GameInstance, URSECharacterData* Hero)
{
if (URSECommandSubsystem* Bus = GameInstance->GetSubsystem<URSECommandSubsystem>())
{
FRSECmd_AddPartyMember Command;
Command.Character = Hero;
const FRSECommandResult Result = Bus->Submit(Command);
if (Result.Status != ERSECommandStatus::Applied)
{
UE_LOG(LogTemp, Warning, TEXT("Recruit refused (status %d)"), static_cast<int32>(Result.Status));
}
}
}
int32 GetHeroLevel(const URSEPartySubsystem& Party, const URSECharacterData& Hero)
{
return Party.GetState().GetLevel(Hero);
}
Gate on resources and stats with the subsystem:
const float HP = Party->GetMemberResource(Hero, RSEGameplayTags::Resource_HP);
const float MaxHP = Party->GetMemberResourceMax(Hero, RSEGameplayTags::Resource_HP);
const float Attack = Party->GetMemberAttribute(Hero, RSEGameplayTags::Stat_Attack);
Extension points:
- A new party action is a new command struct derived from
FRSEPartyStateCommand(overrideValidate,ExecuteandGetPermission) or fromFRSECommandwith a registered handler. Because it is a command, it works in co-op with no RPC code. - Your own state goes in its own save section, not in the party state (Core concepts).
- Subscribe to
OnMemberResourceChangedandOnAbilityLearned(bothBlueprintAssignable) or, in C++, toFRSEPartyState::OnAbilityLearned().
5.7 Advanced
- Per-character data you can add.
Personal Modifierstake any stat modifier operation (Add, Percent, Multiply, Override, Clamp Min, Clamp Max). Use Override for a scripted boss phase and Clamp Max for a curse. - Presentation overrides.
Presentation Overridesgive a character its own look for an ability (a hero from a character pack swinging its own staff), andAttack PresentationswithAttack Order(Random or Sequential) turn plain attacks into a combo. Presentation only: rules ignore them. - Per-character inventory. When the inventory mode is Per Character, Bag Size on the character or class sets each member's bag. See Items, inventory and economy.
- Battle snapshots.
SaveBattleSnapshotandRestoreBattleSnapshotgive Retry. There is no saving or suspending during a battle. - Quiet settles. Setup writes (level start effects, rules applied) are not loot. Wrap them in
FRSEQuietSettleScopeso containers settle without toasts. - Co-op. In a session, each member is controlled by the companion AI, the host or a guest. Guests change only the equipment and Pacts of the member they play (host rule Guest Equipment). The visible party and delegated commands are in
URSEPartyFieldSubsystem. - Simulating parties. The battle simulator, Balance My Campaign and the Progression Designer build party members with a typical build for the progression system in use, so balance stays valid whichever you choose.
- Debug commands (development builds):
RSE.Party.List,RSE.Party.Add <Character>,RSE.Party.Set <Character...>,RSE.Party.Restore [Name],RSE.Party.KO <Name>,RSE.Party.SetHP <Name> <HP>,RSE.Party.GiveExperience <Member|all> <Amount>,RSE.Party.SetLevel <Member|all> <Level>,RSE.Party.Levels.
5.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| A recruit cannot join ATB battles | Roster is Secondary (Tactics only) | Make it Main, or use it only in Tactics. |
| Set In ATB Formation returns Full | The classic party is at ATB Party Size | Remove someone from the formation first, or raise Battle → ATB Party Size. |
| Set In ATB Formation returns Last Active Member | At least one member must stay in the classic party | Add the replacement before removing the last one. |
| A hero's equipment cannot be changed | The character is a Guest | By design; untick Guest for a permanent member. |
| A Pact will not bind | Not owned, not a main character, guest, held elsewhere, or in battle | Read the Pact Bind Result; give the Pact first (Give Pact) and bind outside battle. |
| A new-game party is empty | Party → Starting Members is empty | Use Add to Starting Party on a character or fill the list. |
| Equipment returned to the inventory when a member left | Departure was Permanent | Use Parallel Scenario for a member who will come back. |
| The enemy gives no experience | Experience Reward is 0 and the enemy formula gives 0 | Set the character's reward or Progression → Enemy Experience Base / Per Level. |
| A character shows grey placeholder shapes | No Appearance or no body installed | See Character visuals and animation. |
5.9 See also
- Core concepts
- Game foundation and archetypes
- Progression
- Abilities and statuses
- Items, inventory and economy
- Story, dialog and quests
- Product pages:
docs/product/studio.md(New character, character sheet),docs/product/editors-and-wizards.md,docs/product/starter-content.md; design notesdocs/design/characters.md,docs/design/pacts.md.
6. Progression
In short: Progression is how your heroes grow. Every game has levels (stats from the class, abilities at their unlock levels). On top you choose one of three systems: Classic (levels only), Classic + Points (the player spends attribute and ability points) or Classic + Growth Board (the player opens nodes on a board). Four optional sources add more ways to learn: equipment mastery, teachers, learning from enemies and use growth. Everything is data, and generators fill it in from your classes.
6.1 Basics
6.1.1 Levels and the three systems
In every system, a class still learns its abilities at their levels and its stats still grow with each level (Characters and party). The other two systems add a layer the player builds.
| System | What the player does | Where the data lives |
|---|---|---|
| Classic | Nothing extra: levels do it all. | The class (stat growth, abilities by level). |
| Classic + Points | Each level gives attribute points (raise key attributes, with a price that rises and caps per level) and ability points (buy abilities from the class's catalog; some need others first, a level or story progress). | The class's Growth Plan (URSEGrowthPlan). |
| Classic + Growth Board | Levels and won battles give board points. The player opens nodes next to the ones already open: stat boosts, passives, abilities, gates, junctions and keystones. | The class's Growth Board (URSEGrowthBoard), or one shared board. |
Points are never lost: a character's available points are computed from its level and its plan (level grants + bonus points − spent points), so an old save, or a plan you rebalanced later, always gets the right amount. Spending is final unless your game allows a respec.
6.1.2 First working example
- Open the Studio and go to 1. Game foundation → Progression system (or Project Settings → RPG Saga Engine → Progression Systems). Pick a system.
- Classic + Points: nothing else is needed to try it. The starter hero classes come with a plan, and every other class uses the default plan (Default Plan).
- Classic + Growth Board: open 2. Archetypes → Growth board, pick a class and press Generate Board. Open the result in the board editor and change anything you like.
- Press Play, open the party menu, go to the Growth page and spend the points.
If the Growth page does not show, the game is using Classic. Pick another system, or let the player choose at New Game (see below).
6.1.3 Growth Plans
A Growth Plan (URSEGrowthPlan) belongs to a class (Class → Growth Plan) or to one character (Character → Growth Plan). A class without a plan uses Progression Systems → Default Plan. A plan holds:
- Point Grants: points per level for each currency (
Progression.Points.*): At Start, Per Level, and Extra At Levels for milestones. The three built-in currencies areProgression.Points.Attribute,.Abilityand.Board. Add your own currencies as tags underProgression.Points. - Attributes (Classic + Points): the key attributes the player may raise. Per attribute: Value Per Point, Cost Per Point, Cost Increase Every N points by Cost Increase, Max Points and Max Points Per Level.
- Ability Catalog (Classic + Points): abilities the player can buy, each with Cost, Currency, Required Level, Prerequisites (abilities from any source) and story Conditions.
- Board: the class's Growth Board.
- Enemy Learning: rules for learning abilities from enemies (see below).
6.1.4 Growth Boards
A board is a set of nodes joined by edges. Each character starts on its start node (per character, per class, or the board's default) and can open any node next to an open one, if it has the points, the level and the story conditions.
Node kinds (ERSEGrowthNodeKind):
| Kind | What it does |
|---|---|
| Stat Boost | Raises stats (its Modifiers, any modifier operation). |
| Passive | Grants an always-on passive ability. |
| Ability | Grants an active ability. |
| Gate | Opens only when its conditions hold (a level, a story flag, an item), then lets the path continue. |
| Hub | A junction: usually free, gives nothing, and opens every path that leaves it, so the player chooses a direction there. The start node is one. |
| Keystone | A region's build-defining prize: a strong ability and/or a large stat boost, at the end of a region. |
A node also has an Id, a Label, a Position, a Tier (0 common to 3 rare, drawn as a ring), a Cost, a Required Level, optional required class tags, a Region, and gate conditions and text.
Regions are themed parts of the board (offense, defense, magic, utility): nodes name their region, and the screen tints it and writes its name. Layout presets (ERSEGrowthLayoutPreset) arrange generated boards:
- Constellation: star clusters linked by long bridges (straight lines);
- Radial Wheel: spokes, rims and a sector per region (arcs);
- Tree / Roots: a trunk forking into a limb per region (curves);
- Grid Lattice: a spine with blocks above and below, right angles only;
- Hex Web: a hexagonal web with honeycomb regions, 60-degree angles;
- Auto: the preset for the class's archetype role (Role Layouts), or Fallback Layout.
Boards are clean by rule: no crossing edges, no overlapping nodes, no edge over a node (Progression Systems → Board → Layout Rules). Generated boards always pass. For boards you lay out yourself, Check Layout and asset validation list the problems.
Scope: Board Scope is Per Class (each class's plan names its board) or Shared (every character uses Shared Board, each from its own start node). Travel Cost Per Step makes each step from where the character stands to the node it opens cost extra points (0 = no cost).
Looks: each board names a Board Style (URSEGrowthBoardStyle): the words on screen (a "Constellation" of "Stars" paid in "Starlight" with an "Ignite" button, or "Roots", "Knots", "Sap" and "Grow", or "Circuit", "Sockets", "Charge" and "Wire"), colors per node kind (following the active UI style by default), node shapes, straight or curved edges, icons, glows and a layered backdrop. Three starter styles ship in /RPGSagaEngine/Data/Growth/Styles. Make your own to give your game its own identity.
The board editor: double-click a board. Add nodes from the right-click menu, draw links between nodes, move nodes freely, and edit the selected node in Details. The Issues tab lists unreachable nodes, missing abilities and other problems. Layout Preset generates the board again from its class in another preset.
In game: the player clicks a node (or presses Confirm) and a small menu opens next to it: Unlock with its cost, Details, Cancel. The member strip shows each member's portrait, name and points. Undo takes any step back for free while the page stays open.
6.1.5 Generators: content from your classes
The generators build balanced, editable progression from a class. The class's stat growth tells them what the class develops (its role), and its ability pool tells them what it can learn.
- Generate Point Tables (Generate Growth Point Tables): key attributes, points per level, prices and caps, and a catalog spread over the levels with learning paths.
- Generate Board (Generate Growth Board): a themed region per key attribute in the chosen layout preset (an entrance junction that forks into two rails, a loop, a side path on each rail, a level gate, the remaining abilities and the region's keystone), bridges between neighbouring regions, and the weakest abilities nearest the start.
They are deterministic: the same class, pool and seed always give the same result, so you can re-run them after changing the class, then edit by hand. The Studio fills the ability pool for you (abilities like the class's own) and uses the archetype's role (Role Emphasis) to favor the right stats. Starting values are in Progression Systems → Generator (Generator Defaults).
6.1.6 Equipment mastery
On a weapon or armor, add Mastery Abilities (an ability and the Points To Master). While the item is equipped the wearer can use those abilities. Every won battle gives mastery points (Mastery Points Per Victory plus Per Enemy, times the item's Mastery Rate). At the goal, the ability is learned for good and stays after the item is removed. The party menu shows the progress ("Riposte: 12 / 30"). The Studio's 3. Content → Weapon with mastery wizard makes such an item.
6.1.7 Teachers
A Teacher (URSETeacherData) lists offers. Each has the ability, the price (money, items, the learner's points), who may learn it (class tags or traits, level) and story conditions. An offer is hidden, or greyed out with the reason when Show When Locked is on, until its conditions hold. A teacher can also offer a respec for money.
- From a dialog: the effect Open Teacher opens the teacher's screen; Teach Ability gives one lesson; the condition Can Learn From Teacher checks the price first.
- The Studio's 3. Content → New teacher wizard makes one.
6.1.8 Learning from enemies
Add Enemy Learning rules to a class's plan, or let a trait do it for any character (Progression Systems → Trait Learning). A rule has a trigger, a chance per battle, an optional list of abilities or ability types, and whether the character must survive and the battle be won:
- Hit By: the character was damaged or affected by the ability.
- Seen: any enemy used it in the battle.
Never Learnable Types keeps attacks and monster-only actions out. Switch the whole feature off with Enable Enemy Learning.
6.1.9 Use growth
Turn on Progression Systems → Enable Use Growth. Abilities then rank up with use. Each ability uses its own Use Growth curve (URSEUseGrowthCurve) or the Default Use Growth curve: ranks reached after a number of battle uses, each with its power (percent of base) and cost (percent of base). The battle menus show the cost the character really pays. Exclude an ability with Exclude From Use Growth (summons, item abilities and story actions are never ranked). The starter set has DA_UseGrowth_Standard.
6.1.10 Respec and free undo
Respec Mode (Progression Systems → Respec):
| Mode | Behaviour |
|---|---|
| Off | Spent points are final. |
| Item | Consumes the Respec Item per reset. |
| NPC | Only at a teacher that offers it, for its price. |
| Free | Any time outside battle, for free (default). |
A respec gives back the points spent on attributes, catalog abilities and board nodes, minus Respec Point Penalty (0.1 by default: 10%, rounded, per currency; 0 gives everything back). The Growth page says exactly how much before the player confirms. Lessons from teachers, mastery and use ranks stay.
Free undo: while the Growth page stays open, the player can take back the last steps (raise, learn, unlock, Auto) for free, one at a time, up to Max Undo Steps (default 50). Closing the page makes them final.
6.1.11 Choosing the system per game, or letting the player choose
The system is part of the rules, so each foundation preset sets its own (Game Foundation → Progression → Progression System). Turn on Player Chooses At New Game to ask the player when a new game starts. The offered systems (New Game Choices, all three when empty), their names and descriptions, and the question text are in the settings.
6.2 How it works
6.2.1 Points, never stored as available
Available(Currency) = LevelGrants(Level) + BonusPoints − SpentPoints
Level grants come from the character's plan (FRSEPointsGrant::GetTotalAt(Level)). Bonus points come from battles, story effects and items. The state per character (FRSECharacterGrowth) records bonus points, spent points (and the share a respec keeps), attribute points, bought abilities, unlocked node ids and the current node (for travel cost), mastery progress, ability use counters, respec count and points lost to respecs. It is saved inside the Party section (FRSEPartyState::Growth), so co-op replicates it with the party. Only the undo journal of the open page is not saved.
6.2.2 What each system adds to a unit
For a battle unit or the party menu, the progression contributes:
- stats as an attribute source (attribute points times Value Per Point, board Stat Boost and Keystone modifiers) in the usual order of operations;
- abilities (bought catalog abilities, board Ability and Passive nodes, mastered or learned abilities) alongside class, equipment and Pact abilities;
- ranks for use growth (power and cost multipliers) applied when the unit is built.
After each won battle, RSEGrowth::ProcessBattle awards battle points (Battle Points rewards, default 5 board points per victory), mastery points, enemy-learned abilities and use counters, and returns the rewards for the results screen.
6.2.3 Commands
Every spend is a party command that works for the host and for guests: Allocate Attribute Points, Buy Growth Ability, Unlock Growth Node, Respec Character, Learn From Teacher, Auto Allocate Growth, Undo Growth Step, Clear Growth Undo, Set Progression System and Award Growth Points. A guest builds only the character it plays (Co-op Rules → Guest Equipment); choosing the system and awarding points are host-only. Guests (temporary members) keep a fixed build.
6.2.4 Automatic allocation
Characters nobody builds by hand (AI-controlled members, autoplay) spend their points with the Allocation Policy. After each battle and level-up, AI-controlled members spend automatically (Auto Allocate AI Controlled). The Auto button on the Growth page uses the policy too. The battle simulator, Balance My Campaign and the Progression Designer simulate party members with a typical build for the system in use (every point spent by the policy, battle points estimated with Simulated Victories Per Level and Simulated Enemies Per Victory), so balance stays valid whichever system you choose.
6.2.5 The Progression Designer
"Does my game have the pace I want?" The Progression Designer plays your whole campaign in the battle simulator with a standard party and shows where the party ends up under- or over-leveled, where battles drag on, where players would have to grind and where battles are too easy. An advisor proposes values (experience curve, enemy experience, enemy and class stat growth) and applies them only when you confirm, with undo.
- Make one progression zone per chapter (
URSEProgressionZoneData): enemy level range, expected battles, target entry and exit levels, regular encounters, key battles. - Make a campaign (
URSECampaignProgressionData): the zones in order, the standard party, targets and simulation settings. - Open RPG Saga Engine → Configurator → Tools → Progression Designer, pick the campaign, press Run projection, read the charts, then Run advisor. Tick the recommendations to keep and press Apply selected.
Zones also scale enemy levels in the game itself: a regular battle gets enemies at the party's level (plus offsets) inside the zone's range. Those rules (Scale Enemy Levels, Party Level Source, Enemy Level Offset, Overlevel Bias, Enemy Level Variance) are on the Progression page. The starter set includes a finished example, DA_Campaign_Starter. Full details are in docs/product/progression-designer.md.
6.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEGrowthSettings | RSECore | Progression Systems page: system, boards, respec, mastery, use growth, enemy learning, allocation, generator. |
URSEGrowthPlan | RSECore | A class's or character's points, attribute and ability catalog, board and enemy learning. |
URSEGrowthBoard, FRSEGrowthNode, FRSEGrowthEdge | RSECore | A board: nodes, edges, regions, layout preset. |
URSEGrowthBoardStyle | RSECore | A board's words, colors, shapes and backdrop. |
URSETeacherData | RSECore | A teacher's offers and respec. |
URSEUseGrowthCurve | RSECore | Ranks reached by battle uses. |
URSEGrowthAllocationPolicy | RSECore | Blueprintable policy that spends points for AI-controlled and simulated members. |
FRSEGrowthState, FRSECharacterGrowth | RSECore | The saved state of progression, inside the party state. |
RSEGrowth (namespace) | RSECore | The rules: points, allocation, boards, respec, undo, teachers, mastery, battle processing. |
URSEBlueprintLibrary_Growth | RSECore | Blueprint access (category RPG Saga → Progression). |
URSEProgressionSettings | RSECore | Progression page: levels, experience curve, enemy levels. |
URSEProgressionZoneData, URSECampaignProgressionData | RSECore | The Progression Designer's zones and campaigns. |
URSEGrowthEditorSettings | RSEEditor | Progression Tools page and editor helpers. |
/RPGSagaEngine/Data/Growth | content | Starter plans, boards, board styles, DA_Teacher_Example, DA_UseGrowth_Standard. |
6.4 Settings
Project Settings → RPG Saga Engine → Progression Systems (a rules-profile section). The properties that matter most, with their defaults:
| Group | Property | Default | What it does |
|---|---|---|---|
| System | System | Classic | The progression system. |
| System | Player Chooses At New Game, New Game Choices | off | Ask the player at New Game. |
| Plans | Default Plan | empty | Plan of classes that have none. |
| Board | Board Scope, Shared Board, Default Board Style | Per Class | Where a board comes from and how it looks. |
| Board | Travel Cost Per Step | 0 | Points per step walked on the board. |
| Board | Layout Rules | What makes a layout clean. | |
| Battle Points | Battle Points | 5 board points per victory | Points earned for won battles, per currency. |
| Respec | Respec Mode | Free | Off, Item, NPC or Free. |
| Respec | Respec Item, Respec Point Penalty | 0.1 | The item consumed; the share of spent points a reset keeps. |
| Respec | Max Undo Steps | 50 | Free undo depth. |
| Mastery | Enable Mastery, Mastery Points Per Victory, Per Enemy | on, 2, 1 | Equipment mastery rates. |
| Use Growth | Enable Use Growth, Default Use Growth | off | Abilities rank up with use. |
| Enemy Learning | Enable Enemy Learning, Trait Learning, Never Learnable Types | on | Learning from enemies. |
| Automatic Allocation | Allocation Policy Class, Auto Allocate AI Controlled, Score Weights | built-in, on | How points are spent for members nobody builds. |
| Automatic Allocation | Simulated Victories Per Level, Simulated Enemies Per Victory | 4, 3 | Pacing assumed by simulations and generators. |
| Generator | Generator Defaults, Region Themes, Role Layouts, Fallback Layout, Role Emphasis | Inputs of the generators. |
Related pages: Progression (maximum level, experience curve, enemy levels), Growth UI (the Growth page and board screen), Progression Designer (Power Samples, default 20) and, in the editor, Progression Tools (value ranges the AI schema uses). Full lists are in Appendix B.
Data fields: Class / Character → Growth Plan; Ability → Use Growth, Exclude From Use Growth; Equipment → Mastery Abilities, Mastery Rate.
6.5 Blueprint usage
All nodes are in the category RPG Saga → Progression (hidden World Context). Reading:
Get Progression System, Get Available Growth Points (Character, Currency), Get Growth Currencies, Get Allocated Attribute Points, Is Growth Node Unlocked, Get Growth Node Cost, Get Growth Plan, Get Growth Board, Get Mastery Points, Get Ability Rank, Get Growth Options, Can Learn From Teacher, Describe Growth Result.
Changing (each returns a Growth Result: Ok, Invalid Arguments, Not Member, Wrong System, Not Available, Not Enough Points, Cap Reached, Missing Prerequisite, Level Too Low, Conditions Not Met, Already Owned, Not Adjacent, Respec Not Allowed, Missing Item, Not Enough Money, Nothing To Reset, In Battle, Guest Character):
Allocate Attribute Points, Buy Growth Ability, Unlock Growth Node, Respec Character, Learn From Teacher, Auto Allocate Growth, Set Progression System, Award Growth Points.
Editor tools (category RPG Saga → Progression → Generator): Get Growth Generator Defaults, Generate Growth Point Tables, Generate Growth Board, Get Growth Board Problems, plus fill-level estimates.
Example 1: give board points as a quest reward.
- In your reward graph, Award Growth Points (Character =
DA_Char_Hero, Currency =Progression.Points.Board, Amount = 3). - Branch on the result: anything other than Ok can be reported with Describe Growth Result.
In data, use the effect Award Growth Points in the quest's reward list instead.
Example 2: a custom "Spend all" button.
- Auto Allocate Growth (Character).
- Get Available Growth Points (Character, Currency =
Progression.Points.Attribute) to refresh the label.
Story effects and conditions (data): Open Teacher, Teach Ability, Award Growth Points; Progression System Is, Has Growth Node, Can Learn From Teacher.
6.6 C++ usage
Read points with the RSEGrowth rules, and spend them through the library, which sends the matching party command (so it works for the host and for guests):
#include "Growth/RSEGrowth.h"
#include "Growth/RSEGrowthTags.h"
#include "Growth/RSEBlueprintLibrary_Growth.h"
#include "Characters/RSEPartySubsystem.h"
#include "Core/RSEGameplayTags.h"
void SpendOnAttack(UGameInstance* GI, const URSECharacterData& Hero)
{
URSEPartySubsystem* Party = GI->GetSubsystem<URSEPartySubsystem>();
const int32 Points = RSEGrowth::GetAvailablePoints(
Party->GetState(), Hero, RSEGrowthTags::Points_Attribute);
if (Points <= 0)
{
return;
}
// Sends the Allocate Attribute Points command and returns its result:
URSEBlueprintLibrary_Growth::AllocateAttributePoints(GI, &Hero, RSEGameplayTags::Stat_Attack, 1);
}
A custom allocation policy (deterministic, so simulations stay reproducible):
UCLASS()
class UMyPolicy : public URSEGrowthAllocationPolicy
{
GENERATED_BODY()
public:
virtual int32 ChooseOption_Implementation(const URSECharacterData* Character, int32 Level,
const TArray<FRSEGrowthOption>& Options) const override
{
// Prefer abilities over attributes; -1 stops spending.
for (int32 Index = 0; Index < Options.Num(); ++Index)
{
if (Options[Index].Kind == ERSEGrowthOptionKind::Ability) { return Index; }
}
return Options.IsEmpty() ? -1 : 0;
}
};
Set it in Progression Systems → Allocation Policy Class. The same class works as a Blueprint child (override Choose Option).
6.7 Advanced
- Your own currencies. Add a tag under
Progression.Points(for exampleProgression.Points.Mastery), give it a Point Grant in a plan, and price nodes or catalog entries in it. Battle rewards (Battle Points) can award it, optionally only for one system (Only For System). - Rules profiles. The system is part of the rules, so a profile can switch it per chapter or per game mode. Progression Systems is a profile section.
- Importing AI-written progression. The progression schema (
rse.progression/1) describes a class's plan, board, mastery items, teachers and enemy learning in one JSON file. Configurator → Tools → Content Import → Export AI pack writes a prompt generated from your project; the importer checks the answer, shows a dry run and never deletes anything or changes the plugin's own assets. Seedocs/product/progression-ai-schema.mdand Editor tools. - Command line.
UnrealEditor-Cmd <Project>.uproject -run=RSEProgression -Campaign=<asset> [-Advisor] [-Out=<dir>] [-Set=ExperienceBase=12,...]runs the Progression Designer headless (the-Setoption projects what-if values without changing anything).-run=RSEContentImport -Source=<folder> [-DryRun]imports progression files. - Performance. Boards are plain data. The board screen reads the style and the node list only while the Growth page is open.
- Networking. The state lives in the Party section; commands are validated by the host. Undo is also checked by the host.
- Balance. After changing a plan, re-run the Progression Designer: the power curves show whether a system pulls ahead too fast. Keep gates for story beats (a flag) and pacing (a level) so players cannot rush a branch.
6.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The Growth page does not show | The game uses Classic | Pick another system, or let the player choose at New Game. |
| A node cannot be opened | It needs a neighbouring open node, its level, its story condition, or more points (travel cost included) | The node's details say which. |
| A class has no points | It has no plan and Default Plan is empty, or the plan has no grant for that currency | Add a plan or a Point Grant. |
| Allocate Attribute Points returns Wrong System | The call belongs to another system than the game's | Check Get Progression System. |
| Cap Reached on an attribute | Max Points or Max Points Per Level of that attribute | Raise the cap in the plan, or wait for a higher level. |
| Simulated battles became much easier | The simulator now builds characters with their points spent | Re-balance with Balance My Campaign, or set the scenario's progression system to Classic to compare. |
| Guests cannot be built | Guests keep a fixed build | By design. |
| A respec returns fewer points than were spent | Respec Point Penalty | Set it to 0 to give everything back. |
| Enemy learning never triggers | The trigger, chance, survival or victory rule is not met, or the type is in Never Learnable Types | Check the rule in the plan, and the battle result. |
6.9 See also
- Characters and party
- Game foundation and archetypes
- Abilities and statuses
- Items, inventory and economy
- Battle fundamentals for the battle simulator and Balance My Campaign
- Product pages:
docs/product/progression.md,docs/product/progression-designer.md,docs/product/progression-ai-schema.md; design notesdocs/design/progression-systems.md,docs/design/progression-designer.md.
7. Abilities and statuses
In short: An ability is anything a unit can do in battle: a sword strike, a spell, a heal, a thrown bomb. A status is a lasting effect on a unit: poison, haste, a shield, charm. Both are data assets. One ability works in every battle mode, with its own rules per mode. You build new content by filling fields and picking effects, not by writing code.
7.1 Basics
7.1.1 The words
| Word | Meaning |
|---|---|
| Ability | A data asset (URSEAbilityData). Shared fields (type, element, cost, effects) plus separate rules per battle mode. |
| Effect | One thing an ability does: damage, heal, apply a status, knock back, summon. Effects are small objects listed in the ability's Effects array. |
| Status | A data asset (URSEStatusData) that changes a unit while it lasts: stat modifiers, granted tags, damage or healing over time, a shield, control over who the unit fights for. |
| Use condition | A yes/no check on the user that must hold before the ability can be chosen ("needs a shield equipped", "HP below 30%"). |
| Reaction | A passive trigger: when something happens (the unit is hit, an enemy moves), the unit uses a response ability by itself. |
| Passive | An ability that is never chosen from a menu. It only grants modifiers or reactions while the unit has it. |
| Tier family | A group of abilities shown as one menu entry that opens into stronger tiers (Fire, then Fire II, then Fire III). |
7.1.2 Make your first ability
- Open RPG Saga Engine → Studio → Content → New ability, or right-click a folder in the Content Browser and choose RPG Saga → Ability. The wizard walks through the same fields as the asset, and its last step shows the ability in action.
- Give it a Description, an Ability Type tag (
Ability.Type.Attack,Skill,MagicorAction: this decides which command of the battle menu lists it), an optional Element, and a Target Filter (enemies, allies, allies and self, self, all units). - Under Costs add what it consumes (for example
Resource.MP, 8). Under Item Costs you can add ammunition (1 Arrow). - Under Effects press + and pick Damage. Choose the Kind (Physical, Magical or Fixed), the Power, and whether it can miss or crit. Add Apply Status next to it if you want, with a Chance.
- Fill the rules for the modes you use. A grid battle reads Tactics Rules (range, area, Action Point cost), a classic battle reads ATB Rules (scope, row behavior, charge time). The turn-based mode uses the ATB rules too.
- Give the ability to someone: add it to a class's ability list, to a piece of equipment's Granted Abilities, to a Pact, or teach it with a story effect (see Learning and forgetting abilities).
- Press Test ability (below) to measure it without playing.
The plugin ships a full set of examples in /RPGSagaEngine/Data/Abilities/: DA_Ability_Strike, DA_Ability_Fire (area, elemental, costs MP), DA_Ability_Cure, DA_Ability_Raise (a revive), DA_Ability_ShieldBash (a use condition), DA_Ability_PoisonDart (a status), DA_Ability_TK_Overwatch (a reaction) and many more. Open them to see how a finished ability looks.
7.1.3 Test an ability without playing
Every ability sheet has a Test & preview tab and a Test ability button. The Studio wizard shows the same tools.
- Pick the battle mode (Grid, Live, ATB or Turn), the caster (any character or an archetype) and the targets (a preset: one enemy, three enemies, an ally and two enemies, a boss, three allies).
- Set the level, the seed and the number of runs. For abilities usable only at low HP, set the caster's HP %.
- Press Test ability. Each run uses a fresh headless mini battle, so hundreds of runs take about a second. The report lists, per unit, how often it was affected, hits, misses, crits, damage and healing per use (lowest, highest, average), the real chance each status landed, what one use costs, the area it covers and a Step by step trace of the first use.
- Copy as text puts the report on the clipboard.
The same seed always gives the same numbers, so you can change one value and compare. Above the table a 3D preview plays the ability's presentation (animation, effects, projectile, floating numbers) in a small private world, with Loop, speed and camera choices. Defaults for both are in Project Settings → RPG Saga Engine → Ability Test and Studio → Ability Preview.
7.2 How it works
An ability's life, in every battle mode:
- A unit has a list of abilities, gathered from its class, equipment, Pact and the abilities it learned.
- When the player (or the AI) picks one, the battle checks the use conditions, the costs (resources, item costs, Action Points in grid battles) and the mode's own rules (range, scope, ready state). A refusal carries a reason that the menu shows.
- The battle resolves each effect in the Effects array. Effects that work per target run once per affected unit. Effects that move the user or change the field (leap, dash, teleport, zones, summons) run once per use before the per-target ones.
- Every change becomes a battle event (damage dealt, status applied, unit moved, reaction triggered...). The presentation layer listens to those events to play animations and numbers. The rules never wait for the presentation.
- After the action, queued reactions resolve (a counterattack, a guard), up to a depth limit that stops endless chains.
All randomness comes from one seeded stream per battle. The same seed and the same commands always give the same battle, in the editor, in the simulator and over the network.
7.2.1 Per-mode rules
| Mode | Rules block | Main fields |
|---|---|---|
| Grid Tactics | Tactics Rules (FRSEAbilityTacticsRules) | Action Point cost, min and max range, vertical tolerance, line of sight, area shape and radius, falloff, trajectory (direct or arc), uses per turn, ends turn, power multiplier |
| ATB and turn-based | ATB Rules (FRSEAbilityATBRules) | scope (single, row, all), ignores rows, charge time, power multiplier |
| Free Tactics | Free Tactics Rules | reach in meters and shapes on the live map (see Free Tactics) |
| Action | Action Rules | real-time timings and hit shapes (see Action battles) |
| Outside battle | Field Rules (FRSEAbilityFieldRules) | usable from the party menu, can target the whole party, party power multiplier, and whether it can act on the world |
Each mode block has a Power Multiplier so you can balance one mode without touching the others.
Area shapes for Tactics are Single, Diamond, Cross, Line, Cone, Ring, Rectangle and Mask (a hand-drawn pattern). Power can fall off with distance from the center, and an Arc trajectory flies over lower obstacles.
7.2.2 Effects you can pick
Pick effects in the Effects list; the display names below are what you see in the picker.
| Group | Effects |
|---|---|
| Core | Damage, Heal, Revive, Apply Status, Remove Status, Learn Ability, Summon |
| Position | Knockback / Pull, Teleport, Swap Positions, Leap / Hop-over, Dash / Charge |
| Combat | Multi-hit, Chain / Bounce, Drain, Shield / Barrier, Taunt / Provoke, Steal, Dispel / Purge, Turn Manipulation, Action Points, Transform, Capture / Recruit, Scan |
| Resources | Resource Gain / Loss (any resource, with a formula such as 10 + Attacker.Magic * 0.2) |
| Field | Summon Units, Create Zone, Spawn Object (grid battles; the classic modes use a documented fallback) |
| Custom | Custom (Blueprint), for your own logic |
Position effects have a documented meaning in the classic modes too. A knockback becomes a row change, a swap exchanges rows, a spawned wall does nothing. The picker's tooltip and the validation tell you when an effect has no meaning in a mode.
7.2.3 Statuses
A status (URSEStatusData) is data too. The main fields:
- Status Tag: its identity (
Status.Poison). Tags let abilities, conditions and the AI refer to it. - Duration Turns: counted in the bearer's own turns.
0means until removed. - Stacking: Refresh restarts the duration, Ignore keeps the first application.
- Immunity Tag: a unit with this tag (from equipment, a class trait, a Pact) cannot receive the status.
- Persists After Battle and Removed By Damage.
- While Active: stat Modifiers, element Affinities and Granted Tags. Tags such as
Status.Block.Move,Status.Block.ActandStatus.Block.Turnstop moving, acting or the whole turn. - Periodic: Periodic Timing (turn start or turn end) and a percent of max HP. Positive damages (poison), negative heals (regeneration).
- Toolkit: Polarity (Neutral, Buff, Debuff), Dispellable, Shield Absorbs (None, All, Physical, Magical) and Taunt.
- AI Value Scale: how much the AI values applying the status.
0ignores it,2doubles it. - Behaviors (control): see below.
Stat modifiers always combine in the same order: base, add, percent, multiply, override, clamp, then the attribute's own bounds. The result never depends on which status or item came first.
7.2.4 Control statuses
A status can change who decides what its bearer does. Add a Behavior under Control → Behaviors:
| Behavior | What it does |
|---|---|
| Confuse | Each single-target action goes, with Redirect Chance, to a random unit the bearer could reach: an ally, an enemy, or itself. |
| Charm | The bearer fights for the other side (or a Fixed Team) under the AI while the status lasts. |
| Berserk | The bearer attacks on its own and may only use abilities of the allowed types (basic attacks by default). |
| Custom (Blueprint) | Your own: override Allows Ability, Get Control Team, Redirect Target and On Turn Started. |
They work in every battle mode and the AI follows them. A party member under control is played by the AI until the status ends (by duration, a cure, damage if Removed By Damage is on, the unit falling, or the battle's end). When the last fighter of a side is charmed away, that side has lost. The starter content includes Confuse, Charm and Frenzy statuses with example abilities (Bewilder, Enthrall, Incite).
7.2.5 Use conditions
Use Conditions is a list of checks on the user. All must hold in every mode. The menus show a failed ability disabled with a reason: the ability's Use Conditions Text when filled in, otherwise the failing condition's own text. The AI and the simulator never choose a disabled ability.
| Condition | Holds when |
|---|---|
| Health, Resource, Attribute | a percentage, resource or final attribute compares with a value |
| Has Status | the user has (or lacks) a status |
| Has Tag | the user has (or lacks) gameplay tags: class, equipment types (Equip.Type.Shield), traits |
| Equipped | the user wears an equipment type or a specific item |
| Row | front or back row (classic modes) |
| Position | grid: next to an enemy, alone, on high ground, flanking |
| Identity | the user is one of some characters, or has a class tag |
| Battle Mode | Tactics, ATB or turn-based |
| Unit Count, Turn Number, Enemies In Range | counts compared with a number |
| Story | story conditions: flags, items, party members, puzzles (the same language dialogs use) |
| Not / Any Of | combine other conditions |
Conditions about "the target" cannot go here, because no target is chosen yet. Validation reports them.
7.2.6 Item costs and ammunition
Item Costs consume items from the team's items on every use. The menu shows "1 Arrow (x12)". Without enough items the ability is disabled. Enemies ignore item costs unless Enemies Pay Item Costs is on in Ability Toolkit.
7.2.7 Reactions and passives
An ability with Passive ticked never appears in menus. Two lists make it useful:
- Reactions: each
URSEAbilityReactionhas a Trigger (Damage Taken, Attacked, Ally Damaged, Enemy Moved, Defeated, Kill, Turn Start, Turn End), a Source (who may trigger it), a Response ability, an Aim, a Chance, Max Per Turn and more. Enemy Moved is overwatch, grid only. - Passive Modifiers: stat modifiers, affinities and tags applied while their conditions hold.
Reactions are queued and resolved after the action that caused them, up to Max Reaction Depth (default 1, so a counter is not countered).
7.2.8 Tier families
A URSEAbilityTierFamily asset lists abilities from the base tier up. The battle menu shows the family as one entry, and choosing it opens the tiers the unit knows, each with its own cost and power. A new family is one data asset.
7.2.9 Learning and forgetting abilities
A character can learn an ability for good outside its class progression. Learned abilities appear after class, equipment and Pact abilities, in every battle mode, and are saved.
- Learn Ability and Forget Ability are story effects (dialog choices, quest rewards, puzzles, interactions). The learner can be one character, every member, or members whose tags match.
- A manual is a consumable whose use ability has the effect Learn Ability, is usable in the field and targets an ally. See
DA_Item_ManualBerserkSlashin/RPGSagaEngine/Data/Items/.
7.2.10 Presentation and action commands
How an ability looks (animation, effects, camera, sounds) is separate from what it does. The Presentation block points to a timeline asset; empty means a default from the approach (melee, ranged, in place) and the moment (normal or super move). See Camera and battle presentation.
An ability can also ask for a timed button press (Action Command): a ring closes and a Good or Perfect press adds a bonus, and enemy attacks can be blocked with a timed press. The windows and bonuses are on the ability; the global rules are in Project Settings → RPG Saga Engine → Action Commands.
7.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEAbilityData | RSECore | The ability data asset. |
URSEAbilityEffect | RSECore | Base of every effect (URSEEffect_Damage, URSEEffect_Heal, URSEEffect_ApplyStatus...). |
URSEEffect_Custom | RSECore | Blueprintable effect for your own logic. |
URSEStatusData | RSECore | The status data asset. |
URSEStatusBehavior | RSECore | Base of control behaviors (_Confuse, _Charm, _Berserk, _Custom). |
URSEAbilityReaction, URSEPassiveModifier | RSECore | Reaction and passive entries inside an ability. |
URSEAICondition | RSECore | Base of use conditions (URSEAICondition_HasTag, _Equipped, _Row, _Position, _Identity, _BattleMode, _Story). |
URSEAbilityTierFamily | RSECore | A family of tiers shown as one menu entry. |
URSEAbilityTestLibrary | RSECore | Runs the headless ability test from Blueprint, Python or C++. |
URSEGASBridgeComponent | RSEGAS | Connects a character's Ability System Component to battles. |
7.4 Settings
Project Settings → RPG Saga Engine:
| Group | What it holds |
|---|---|
| Ability Toolkit | Max Reaction Depth (1), Reactions In Classic Modes (on), taunt rules (Taunt Forces Target, Taunt Target Multiplier), Max Leap Chain (8), Max Slide Tiles (3), Max Bonus Action Points (4), One Zone Per Tile, Max Chain Explosions (32), Can Target Objects, Capture Needs Victory, Enemies Pay Item Costs (off), and the AI value of each effect. It is a rules-profile section. |
| Ability Info | Labels for role tags and how the battle menu groups and describes abilities. |
| Ability Test | Default caster, target presets, level, runs, team sizes of the headless test. |
| Action Commands | Global timing windows and bonuses for timed presses. |
| Combat Formulas | The damage, heal, hit and critical formulas (see Battle fundamentals). |
The full lists are in Appendix B. The asset types are in Appendix D.
7.5 Blueprint usage
Teach an ability from a Blueprint:
- Event (for example On Interact) → Learn Ability (Character =
DA_Char_Hero, Ability =DA_Ability_Fire). - Branch on the returned result to show a message if the character already knew it.
Related nodes in the party library (category RPG Saga | Party | Abilities): Forget Ability, Has Learned Ability, Get Learned Abilities, Get Member Abilities. The party subsystem has an On Ability Learned event.
Run the headless test from a script:
- Make Ability Test Request (Ability, Mode tag).
- Adjust the request (caster, targets, runs, seed).
- Run Ability Test → Ability Test Report To Text → Print String.
Write a custom effect:
- Create a Blueprint class with parent Custom (Blueprint) (
URSEEffect_Custom). - Override On Apply (Battle, Source Id, Target Id, Target Tile, Power Multiplier). Inside, call the battle's nodes: Deal Damage, Heal Unit, Change Resource, Apply Status, Remove Statuses, Shift Turn.
- Draw random numbers only with Roll Int and Roll Percent. They come from the battle's stream, so replays and the simulator stay exact.
- Override Preview Damage to give the AI and the damage forecast an expected value. Without it the AI sees no value in the effect.
- Tick Once Per Use if the effect should run once instead of per target.
- Add your class to an ability's Effects list.
A custom reaction condition is a Blueprint subclass of Reaction that overrides Can Trigger. A custom passive overrides Is Active For. A custom use condition is a subclass of AI Condition: override Is Met and Get Requirement Text.
The full node list is in Appendix A.
7.6 C++ usage
A new effect in C++ is a subclass of URSEAbilityEffect. Override Apply and, so the AI can see it, AddToPreview.
UCLASS(meta = (DisplayName = "Drain Morale"))
class UMyEffect_DrainMorale : public URSEAbilityEffect
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, Category = "Morale", meta = (ClampMin = "0"))
float Amount = 10.f;
virtual void Apply(const FRSEAbilityContext& Context, int32 TargetId) const override
{
Context.Battle->ChangeResource(Context.SourceId, TargetId, MoraleTag, -Amount);
}
virtual bool AppliesOncePerUse() const override { return false; }
private:
FGameplayTag MoraleTag;
};
The picker lists every concrete subclass with its DisplayName, so no registration is needed. Useful overrides: AddToPreview (what the AI and the forecast read), CheckRequirement (extra conditions beyond costs), ApplyInField (what the effect does from the party menu), AppliesOncePerUse, DescribeEffect (tooltip text) and ValidateInAbility (editor validation).
Run the headless ability test from C++:
FRSEAbilityTestRequest Request = URSEAbilityTestLibrary::MakeAbilityTestRequest(Ability, ModeTag);
Request.Runs = 200;
const FRSEAbilityTestReport Report = URSEAbilityTestLibrary::RunAbilityTest(Request);
UE_LOG(LogTemp, Log, TEXT("%s"), *URSEAbilityTestLibrary::AbilityTestReportToText(Report));
7.7 Advanced
7.7.1 Gameplay Ability System bridge (RSEGAS)
Teams that already use Unreal's Gameplay Ability System can keep it. The RSEGAS module is a bridge: the battle stays the source of truth for hits, damage and turns, and the bridge mirrors values in and out. RSECore never uses GAS types, and nothing happens until an actor has the component.
Setup:
- Create an RSE GAS Attribute Map data asset. Add one row per value the battle should read or write: the RSE tag (
Stat.Attack,Resource.HP), the GAS attribute, a Direction (In, Out or Both) and a Scale. With the included RSE GAS Sample Attribute Set, press Fill Sample Rows. - Optionally create an RSE GAS Status Map (statuses to loose tags and effects) and an RSE GAS Ability Map (an event tag or ability tags sent when an RSE ability is used).
- On your character Blueprint, add the RSE GAS Bridge component. Set Character (the RSE character data asset) and the maps. If the Ability System Component lives elsewhere, call Set Ability System.
What flows:
- In: stats and resources at battle start, outside attribute changes while the battle runs, GAS tags to statuses.
- Out: resource changes as instant Gameplay Effects, statuses as tags and optional effects, battle events as Gameplay Events (tags such as
Event.RSE.DamagedandEvent.RSE.AbilityUsed), and with Restore After Battle the attributes return to their old values.
The component's options (Supply Stats, Apply Results To GAS, Mirror Statuses, Forward Events, Forward External Changes, Restore After Battle, Priority) are all on by default except Restore After Battle.
RSE abilities can also run your GAS content. In an ability's Effects list add Apply Gameplay Effect (GAS) or Activate Gameplay Ability (GAS). In a presentation timeline add the Gameplay Cue (GAS) step. These do nothing on units without a bridge or on a machine that is not the authority.
Export to GAS (editor, one way) generates Gameplay Effects and Gameplay Abilities from your statuses and abilities (RPG Saga Engine → Advanced tools → Content → Export to GAS..., or the RSEGASExport commandlet). Always start with a dry run. The report lists what GAS cannot hold (grid rules, reactions, control behaviors...). Defaults live in Project Settings → RPG Saga Engine → GAS Export.
7.7.2 Content from spreadsheets and AI
Abilities, statuses and their use conditions can be created and updated from spreadsheets (Configurator → Tools → Content Import), and they appear in the AI prompt packs. The effect type in a sheet is the display name without spaces, for example KnockbackPull(Distance=2). See Editor tools.
7.7.3 Network and performance notes
- The battle runs on the host; effects, statuses and reactions are deterministic, so guests see the same results (Co-op and online).
- Effects run on the authority only. GAS effects follow the same rule.
- Keep
AddToPreviewcheap. The AI calls it for every ability and target it considers.
7.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The ability is always disabled | Read the reason in the command help. A Has Tag on an equipment type needs the equipped item to grant that type (its Granted Tags). |
| Validation says a condition is "about the target" | Use conditions run before a target is chosen. Move the check to the effects or the targeting rules. |
| Test ability shows nothing affected | Check the targeting rules for the chosen mode (range, area, target filter). The Step by step list says why a use was refused. |
| The preview shows no effects | The ability's presentation has empty slots. Fill them or use the Animation & FX Library. |
| A charmed party member never gets commands | Intended. The AI plays it until the status ends. |
| Enemies use arrows they do not have | Intended. Turn on Enemies Pay Item Costs in Ability Toolkit to change it. |
| A manual is refused | The member already knows the ability, or the item is not usable in the field or does not target an ally. |
| Counterattacks never fire | Max Reaction Depth is 0, or the trigger unit is out of range (Requires Range), or the classic modes have Reactions In Classic Modes off. |
| The AI never uses my custom effect | Preview Damage (Blueprint) or AddToPreview (C++) is not overridden, so the AI sees no value. |
7.9 See also
- Battle fundamentals, Grid Tactics and ATB and turn-based for the rules each mode adds.
- Items, inventory and economy for consumables whose use is an ability.
- Enemy AI and adaptive difficulty for how the AI values abilities and statuses.
- Product pages:
docs/product/abilities.md,docs/product/gas-interop.md.
8. Items, inventory and economy
In short: One item system serves every battle mode and exploration. Items are data assets in four kinds (consumables, equipment, key items, documents). The party carries them in a shared grid or in per-character bags, and money, shops, inns, chests and loot tables are built from the same data and the same Conditions and Effects language as dialogs and quests.
8.1 Basics
8.1.1 The four kinds of item
| Kind | Asset class | What it is for |
|---|---|---|
| Consumable | URSEConsumableData | Used up: potions, bombs, cures, manuals. Its effect is an ability (Use Ability). |
| Equipment | URSEEquipmentData | Worn or wielded. Gives stats, affinities, tags and abilities while equipped. |
| Key item | URSEItemData | Story and puzzle items. Never used up by accident, never sold, never discarded. |
| Document | URSEDocumentData | A readable note or book, with one or more pages of text. |
All kinds share one asset type, so there is one ID space for saves and one place to look items up.
Fields every item has (URSEItemData):
- Description and an Icon (or Item Mesh, which the icon tools frame for you).
- Max Stack (
0means the project default, 99). - Buy Price, Sell Price Override (
-1= automatic) and Sellable. A price of0means the item has no value: a shop can only sell it with a price override, and the party cannot sell it. - Grid Size (cells), Rarity (
Item.Rarity.*tag), Category (Item.Category.*tag) and Weight for the grid inventory.
8.1.2 Make your first consumable
- RPG Saga Engine → Studio → Content → New item (pick a family such as potion, status cure or bomb), or make the data asset by hand in the Content Browser (Miscellaneous → Data Asset, class
RSEConsumableData). - Set the Use Ability. Either pick an existing ability (a heal, a bomb) or make a new one. The ability's Tactics Rules give the item its range, area and Action Point cost in grid battles, and its ATB Rules give it a scope in classic battles. That is how a bomb has an area on the grid and hits a row in ATB.
- Tick Usable In Battle (default on). To allow use from the party menu, open the use ability's Field Rules and tick Usable In Field.
- Set Buy Price. Optionally add the item to a shop and a loot table.
The plugin ships examples in /RPGSagaEngine/Data/Items/: DA_Item_Potion, DA_Item_Ether, DA_Item_Bomb, DA_Item_Antidote, DA_Item_RevivalPlume, DA_Item_ManualBerserkSlash (teaches an ability), DA_Key_SpireKey (a key item), DA_Doc_FieldGuide (a document) and a full set of DA_Equip_* equipment.
8.1.3 Equipment
An equipment item has a Slot Type (Equip.Slot.*) and an Equipment Type (Equip.Type.*). Classes list the types they may use. While worn it gives:
- Modifiers (stat modifiers), Affinities (element weakness, resistance, immunity, absorb) and Granted Tags (traits such as status immunities, and the type tag itself, so a shield lets its wearer use shield abilities);
- Granted Abilities: abilities usable only while it is worn.
Other fields: Two Handed (weapons that also occupy the off-hand slot), Mastery Abilities and Mastery Rate (the item teaches an ability for good after enough use), Bag Size Bonus and Carry Capacity Bonus (a backpack in the per-character inventory), Appearance Part and Weapon Presentation (how it looks on the body, see Weapons), and Action Weapon for action battles.
The slots a character has are a list in Project Settings → RPG Saga Engine → Items → Equipment Slots. Each slot has an id (Weapon, OffHand, Accessory1...), a name, the slot type it accepts, and optional body part and attach settings for the paperdoll. You can start from an Equipment Slot Set preset (use Apply To Project), or let a Game Foundation preset write the list for you.
Equipment results are explicit. Equip returns Ok, Unknown Slot, Wrong Slot, Class Cannot Use, Not In Inventory, Locked (a guest's fixed equipment) or Blocked By Two Handed.
8.1.4 Documents and key items
A document shows its pages when the player reads it from the inventory. A key item is used on the thing in front of the player ("Use on door") or combined with another key item. The puzzles that react to them are in Exploration.
8.1.5 Money, shops, inns and chests
- Money is one currency with the name, symbol and format you choose.
- A shop (
URSEShopData) lists stock. Each entry can override the price, limit the quantity forever, and appear only while story conditions hold ("after the smith joined"). - An inn restores the party for a price.
- A chest is an actor with items, money, an optional key and an "opened" flag saved with the story.
- Loot tables (
URSELootTable) give enemies and encounters their drops.
Shops, loot tables and chests are plain data and actors, described below. A shop is opened by the Open Shop story effect, for example from an NPC's dialog.
8.2 How it works
8.2.1 The flow
Items (data) ──► Inventory (RSECore: stacks, grid layouts, containers)
│ │
Party state ◄────┘ └──► Loot distribution rule ──► who receives what
(money, equipment, shop stock)
Economy rules (RSECore) ──► Shop / Inn / Chest / Battle loot
Screens (RSE): inventory, shop, chest, reward feed
- RSECore holds the rules: stacks, equipment checks, prices, buying and selling, loot rolls, distribution. They are headless and tested.
- RSE holds the screens (inventory board, shop, party menu) and the world actors (chest, stash point).
- Every inventory change is a serializable command (
FRSEInventoryCommand): Move In Grid, Equip, Unequip, Use Item, Sort Container, Discard, Transfer, Auto Distribute, Give Money. The host validates and applies it. That is why co-op works without extra code.
8.2.2 Inventory modes
Project Settings → RPG Saga Engine → Inventory Rules → Mode:
| Mode | Behavior | Best for |
|---|---|---|
| Shared (default) | One party inventory, shown as a grid with tabs. Everyone uses it. | Classic JRPG, ATB, Tactics |
| Per Character | Each member carries a bag. A large shared stash opens at save points (or rest places, or anywhere, by Stash Access). Key items and documents stay shared. | Live-field and action games |
The mode can change at any time, in either direction. A profile or a Game Foundation preset can set it. Per Character to Shared merges every bag, the stash and the pending loot. Shared to Per Character distributes the items by the distribution rule (Migration: Distribute) or puts everything in the stash (All To Stash). Equipment worn never moves. Nothing is lost.
In Per Character, loot that nobody can carry waits in a Pending Loot tab until taken or distributed (Overflow), and you can add weight: Use Weight gives each member a Carry Capacity (base plus a stat plus equipment), with Overweight Rule Display Only or Block Adding.
8.2.3 Who receives loot
Everything the party gains passes one settle step with a source (battle, chest, pickup, quest, shop, story). A distribution rule only ranks the receivers. The framework fills the best receiver, then the others, then the stash, then the Overflow rule. Built-in rules:
| Rule | Behavior |
|---|---|
| Smart (default) | Equipment goes to the member who gains most from it (weighted stat changes, with Stat Weights and Minimum Upgrade). Consumables are balanced, steered by Role Rules (ethers to mages). Deterministic. |
| Picker | Whoever picked it up (the leader for battle rewards). |
| Round Robin | Next member for each stack. |
| All To Stash | Everything goes to the stash. |
A different rule can be set globally, per chest (Loot Rule) or per encounter. You can write your own (see Advanced).
8.2.4 Battle loot and money
On victory the rules roll the loot table of every defeated enemy, in battle order, then the encounter's own loot (Encounter Loot) and its Reward Items. Each entry rolls on its own, so several can drop. The dice come from a stream derived from the battle's seed, so the same battle always drops the same things. The simulator rolls loot exactly like the game.
One battle never gives more money than Battle Money Cap allows for the level of its strongest defeated enemy (a curve you edit). This keeps a late boss's loot table from paying a fortune when used on an early enemy.
8.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEItemData | RSECore | Base item; also the key item class. |
URSEConsumableData | RSECore | Consumable with a Use Ability. |
URSEEquipmentData | RSECore | Equipment. |
URSEDocumentData | RSECore | Readable document. |
URSESaveItemData | RSE | A consumable that saves the game anywhere allowed (see Save and load). |
URSEEquipmentSlotSet | RSECore | An editor-only preset of equipment slots (classic JRPG set, action-RPG set). Apply To Project writes it into Items → Equipment Slots. |
FRSEInventory, FRSEItemStack | RSECore | The shared inventory: stacks of soft item references. |
URSEInventorySubsystem | RSECore | Receives and applies inventory commands. Fires On Command Applied. |
URSEInventoryPermissionPolicy | RSECore | Who may do what in co-op. |
URSELootDistributionRule | RSECore | Base of distribution rules (URSELootRule_Smart, _Picker, _RoundRobin, _AllToStash). |
URSEShopData | RSECore | A shop's stock and rules. |
URSELootTable | RSECore | Money range and weighted drops. |
ARSEChest | RSE | A chest actor. |
URSEStashPointComponent | RSE | Marks an actor (inn, camp) as a place that opens the stash. |
URSEBlueprintLibrary_Items | RSECore | Give, take, count items, money, shop and inn functions. |
8.4 Settings
Project Settings → RPG Saga Engine:
| Group | Key settings (defaults) |
|---|---|
| Items | Default Max Stack (99), Equipment Slots, Off Hand Slot Id, Starting Items, Rarity Tiers and Default Rarity, Stash Tabs (grid containers with filters), Sort Order, Max Item Grid Size (4x4), Allow Discard (off), Permission Policy Class. |
| Inventory Rules | Mode (Shared), Shared Kinds, Migration (Distribute), the Bag, Stash and Pending Loot containers, Stash Access (Save Points) and Stash Access Radius, Money Mode, weight options, Distribution Rule, Auto Distribute Rule, Overflow (Pending Loot), Stat Weights, Role Rules. A rules-profile section. |
| Economy | Currency Name, Currency Symbol, Money Format ({Amount}, {Symbol}, {Name}), Max Money, Starting Money (200), Sell Ratio (0.5), Buy Price Multiplier (1), Default Inn Cost (50), Inn Revives KO (on), Cap Battle Money and the Battle Money Cap curve. Sell ratio, price multiplier and inn settings can change per profile. The currency, cap and starting money are global. |
| Inventory UI, Economy UI | The screens' look and behavior (RSE). |
The complete lists are in Appendix B.
8.5 Blueprint usage
All nodes below are in the RPG Saga | Items and RPG Saga | Economy categories.
Give the player an item when an NPC dialog ends:
- In the dialog, add the story effect Give Item (Item =
DA_Item_Potion, Count = 3). No Blueprint needed. Use the Has Item and Take Item conditions and effects the same way. - From Blueprint instead: Event → Give Item (Item =
DA_Item_Potion, Count = 3). The node returns how many were added, capped by the stack limit.
Check a key item before opening a door:
- Has Item (Item =
DA_Key_SpireKey) → Branch. - True: Take Item (if the key is used up), then open the door.
Open a shop and buy:
- Dialog effect Open Shop (Shop =
DA_Shop_Starter_Z1). The screen opens after the running dialog ends. - Scripted purchases: Can Buy (Shop, Entry Index) → Buy (Shop, Entry Index, Count). Both return a result: Ok, Not Enough Money, Out Of Stock, Unavailable, Inventory Full, Not Sellable or Not Enough Items. Get Buy Price, Get Stock Left and Get Max Buy Count feed a custom shop UI.
Money and inns: Get Money, Add Money, Spend Money, Get Inn Cost and Rest At Inn. In story data use the Has Money condition and the Give Money, Take Money and Rest At Inn effects. Gate the inn choice with Has Money.
Equipment: the party library offers Get Equipment, Get Equipped Item, Can Equip, Equip, Unequip, Get Equip Candidates and Preview Equip (the stats before and after).
React to changes: bind to the inventory subsystem's On Command Applied.
For a full list see Appendix A.
8.6 C++ usage
#include "Items/RSEBlueprintLibrary_Items.h"
// Reward the player and report what happened.
const int32 Added = URSEBlueprintLibrary_Items::GiveItem(this, PotionAsset, 3);
if (URSEBlueprintLibrary_Items::HasItem(this, KeyAsset))
{
URSEBlueprintLibrary_Items::TakeItem(this, KeyAsset, 1);
}
const ERSEShopResult Result = URSEBlueprintLibrary_Items::Buy(this, ShopAsset, /*EntryIndex*/ 0, /*Count*/ 1);
Equipment changes go through the party library (URSEBlueprintLibrary_Party::Equip, which returns ERSEEquipResult). If you write your own inventory screen, send FRSEInventoryCommand structs through URSEInventorySubsystem::SubmitCommand. Never write the party state directly.
Extension points:
URSELootDistributionRule: overrideRankTargets(aBlueprintNativeEvent) to decide who receives items.URSEInventoryPermissionPolicy: overrideCanIssue,CanChangeEquipment,CanIssuePartyCommandandCanUseContainer.- A new item kind of behavior: make a consumable whose use ability has a Custom effect.
8.7 Advanced
8.7.1 Grid containers and stash tabs
The shared inventory is drawn as a grid. Stash Tabs is a list of container definitions (id, name, icon, grid size, filter). An item appears in the first tab whose filter accepts it, so every item always has a place. A filter matches item kinds and a gameplay tag query over rarity, category, slot and equipment type. A container with Max Height 0 grows as needed. A bounded container (a chest) leaves items it cannot fit unplaced. Sort Order lists the keys auto-sort compares (kind, rarity, category, equip slot, size, name).
8.7.2 Writing a distribution rule
Create a Blueprint class derived from RSE Loot Distribution Rule, override Rank Targets, and pick it in Inventory Rules → Distribution Rule. The input is the party state and a query (the items and their source). The output is a ranked list of containers. Do not fill containers yourself. The framework fills them in order and handles overflow.
8.7.3 Co-op
Each inventory change is a serializable command that the host validates and applies. Pickups To Picker In Coop sends what a player picks up to that player's member first. With Per Character inventory and the default policy, a guest may take items only from the bag of the member they play (see Co-op and online).
8.7.4 Save and migration
Inventory state, grid layouts, shop purchases and money are part of the party save section, so old saves load into the mode in use and distribute as described above. See Save and load.
8.7.5 Content from spreadsheets
Items, shops and loot tables import from spreadsheets (Configurator → Tools → Content Import) and appear in the AI prompt packs. See Editor tools.
8.7.6 Performance
The inventory board draws without per-frame rebuilds. It refreshes when a command is applied. Item icons can be a live 3D preview (Inventory UI settings, CVars RSE.Inventory.LivePreview, RSE.Inventory.PreviewScale, RSE.Inventory.PreviewRate). See Appendix C.
8.7.7 Development commands
In development builds: RSE.Items.Give, RSE.Items.List, RSE.Items.Reset, RSE.Economy.Money, RSE.Economy.OpenShop, RSE.Economy.Rest and RSE.Inventory.ForceStashAccess (stash everywhere). Appendix C lists the arguments.
8.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| A shop will not sell my item | Its Buy Price is 0 and the entry has no Price Override. Set one. |
| The player cannot sell an item | Key items and documents never sell. Check Sellable and a non-zero price. |
| An item vanished from the sale list | Worn equipment is not in the inventory. Unequip it first. |
| Equip returns Class Cannot Use | The class does not list the item's Equipment Type. |
| Equip returns Wrong Slot | Slot Type does not match any slot's Accepts Slot Type in Items → Equipment Slots. |
| A consumable cannot be used from the menu | The use ability's Field Rules → Usable In Field is off, or the target filter does not allow an ally. |
| The player cannot discard items | Items → Allow Discard is off (the default). Key items and documents can never be discarded. |
| A chest stays closed | Its Opened Flag is missing, a Required Key is not held, a condition fails, or the stack limit would be exceeded. |
| Loot went to the wrong member (Per Character) | The distribution rule decides. Check Stat Weights, Role Rules and the encounter's or chest's Loot Rule. |
| Money from a battle is lower than the table | Cap Battle Money limits it by the strongest defeated enemy's level. Adjust the curve or turn it off. |
| The stash will not open | Stash Access is Save Points and the player is outside Stash Access Radius. Add a RSE Stash Point component to an inn or camp, or change the access. |
8.9 See also
- Abilities and statuses for use abilities, manuals and item costs.
- Battle fundamentals for rewards and loot after a fight.
- Characters and party for equipment on characters and the party menu.
- Save and load and Co-op and online.
- Product pages:
docs/product/starter-content.md,docs/product/faq.md.
9. Battle fundamentals
In short: Every fight in the plugin is an encounter: a data asset that names the battle mode, the enemies, the rules, the objectives and the rewards. The modes (grid Tactics, Free Tactics, ATB, turn-based, Action) share one core: units, abilities, damage, statuses, victory and defeat, rewards. This chapter covers that shared core, how encounters start, the battle mode override, battle sites, and the headless battle simulator that tests it all without graphics.
9.1 Basics
9.1.1 The words
| Word | Meaning |
|---|---|
| Battle mode | How a fight is played. The content decides it, never the player: Battle.Mode.Tactics, FreeTactics, ATB, Turn or Action. |
| Encounter | One battle as a data asset (URSEEncounterData). |
| Battle director | The actor that runs one battle on the map: ARSETacticsBattleDirector for a grid, ARSEATBBattleDirector for a classic stage. |
| Battle site | An actor (ARSEEncounterSite) that holds one encounter's places for every mode, so the same encounter can run in any mode that makes sense. |
| Unit | One combatant in a battle. Each unit has an id used by the battle's functions. |
| Team | A side. Player and enemy teams are gameplay tags (Team.Player, Team.Enemy). |
| Rules profile | A data asset that overrides some settings (damage, grid, AI...) for one encounter, a boss, or the whole game. |
9.1.2 Make your first encounter
- Open RPG Saga Engine → Studio → World → New battle (see the Studio). Pick a battle mode, add enemies from your library, set levels and rewards, and let the wizard place the battle in the open level.
- Or create the asset by hand: Miscellaneous → Data Asset →
RSEEncounterData. Set Battle Mode, add entries to Enemies, and (for grid battles) lay them out with the Encounter Layout mode (below). - Put a trigger in the level: an RSE Encounter Trigger volume that points at the director (or at an RSE Encounter Site). Walk into it in Play.
- Check the encounter with the headless simulator (below) before you tune it by playing.
The starter set in /RPGSagaEngine/Data/Encounters/ has a whole campaign of examples (DA_Encounter_Starter_Z1_Pack, _Elite, _Key, _Boss and so on for each zone).
9.1.3 What an encounter holds
| Group | Fields |
|---|---|
| Mode | Battle Mode, Co-op Conversion and Co-op Alternative (how a live battle behaves in co-op), Allow Mode Override, Override Modes, Mode Rules Profiles. |
| Sides | Player Team, Enemy Team, Enemies (character, level, tile and facing for grids, row for classic, AI profile, key unit, Pact, starting statuses), Enemy Items (the enemy team's item pouch), Required Characters. |
| Levels | Level Mode: Scaled (enemy levels follow the party within the progression zone's range) or Fixed (story and boss battles). Progression Zone, Scaled Level Offset. |
| Objectives | Victory Conditions and Defeat Conditions. Empty victory means "defeat every other team". Losing every player unit is always a defeat. |
| Rewards | Reward Items, Loot Rule, Encounter Loot (money and drops), Victory Effects (story effects run on a win). Experience comes from the defeated enemies. |
| Flow | Can Flee (classic battles), Defeat Continues Story (the party may lose without a game over). |
| AI | Intelligence, Min Intelligence, Max Intelligence (the limits adaptive difficulty may use). |
| Grid | Deployment Tiles, Field Objects (walls, barrels). |
| Scripted | Reinforcements and Battle Events. |
| Presentation | Rules Profile, Battle Music, Transition Style, Intro Text. |
| Balance | Balance Role for the balance tools (Auto, Normal, Elite, Key, Boss, Ultra, Excluded). |
Encounters hold no tile coordinates for the grid itself. The grid belongs to the map (see Grid Tactics).
9.1.4 Objectives
Victory and defeat conditions are small objects. The built-in ones:
- Team Defeated: every unit of a team is down.
- Character Defeated: one named character falls (a boss to kill, an escort to protect).
- Turns Elapsed: a team has taken a number of turns (survive, or a time limit).
- Team Reaches Tiles: any unit of a team stands on given tiles (reach the exit). Grid battles only.
Each has a Description the HUD shows as the objective text. Any of the victory conditions met means a win. A new condition is a Blueprint or C++ subclass of URSEBattleCondition that overrides IsMet.
9.1.5 Encounter Layout (grid and classic stages)
Instead of typing coordinates, use the Encounter Layout mode:
- Select a Tactics Zone (bake its grid first) or an ATB Stage.
- Press the Encounter Layout toolbar button, or choose RPG Saga Engine → Advanced tools → Encounter Layout Mode.
- Pick an encounter, then Add Enemy and click a tile, Paint Deployment for the player's start tiles, or Add Field Object for walls and barrels.
- Read the Issues list: an enemy on a blocked tile, two enemies on one tile, no deployment tile, a zone without a baked grid. Fix every error.
Keys: E/Q rotate, Delete removes, R switches an ATB enemy's row, Ctrl+Z / Ctrl+Y undo and redo (a whole brush stroke is one step). The mode edits only the encounter asset, so battles read exactly what you saw.
9.1.6 Battle zones and sites
The quickest way to place a battle in a level is RPG Saga Engine → Advanced tools → Make Battle Zone Here... (or right-click in the viewport → RPG Saga → Make Battle Zone Here). It builds a ready battle site from an area: a Tactics zone with its director, the encounter laid out, a trigger, and optionally a classic stage next to it. Run it again with the same name and it updates the site instead of making a second one. Several sites on one map work. See World building.
9.1.7 Rewards and results
On victory the party receives experience (split among members that took part), loot, money and any progression rewards (battle points, mastery, new abilities, ranks). Then:
- Screen (default for Tactics and classic modes): a results screen after a short delay, with a game-over screen on defeat.
- Feed (default for live battles): no blocking screen. Floating "+340 XP" texts appear over each character with an animated "level up" line, and a stack of notifications slides in at the side for items, money, Pact points, recruits, bestiary entries and quest changes. Exploration continues at once.
The style is set in Project Settings → RPG Saga Engine → Battle Flow UI → Results Presentation (Screen or Feed) and, for Free Tactics, in the Free Tactics settings. The look of the feed is a style asset (URSERewardFeedStyle) selected in Reward Feed. Providers (URSERewardToastProvider) decide what becomes a notification, and you can add your own. A battle that is lost with Defeat Continues Story ticked shows no game over: the fallen members get back on their feet (see the party settings' defeat recovery) and the game goes on.
9.2 How it works
9.2.1 Layers
URSEEncounterData ──► Director (RSE) ──► URSEBattle subclass (RSECore) ──► battle events ──► presentation (RSE)
(data) builds units, Tactics / ATB / Turn / FreeTactics / (damage, status, animations, camera,
deployment, AI Action: the rules, headless turn, defeat...) UI, sounds
URSEBattle is the common base. It owns the units, resources, damage, healing, statuses, reactions, objectives and the event stream. Each mode adds one subclass: URSETacticsBattle, URSEATBBattle (and URSETurnBattle derived from it), the Free Tactics and Action battles. Because the rules never touch actors or rendering, a battle can run headless for tests and simulation. The director turns battle events (ERSEBattleEventType: Turn Started, Ability Used, Damage Dealt, Status Applied, Unit Defeated, Reaction Triggered, Battle Ended and many more) into animations and UI.
9.2.2 The action pipeline
When a unit uses an ability or item:
- The mode checks the command is legal (whose turn, resources, range or scope, use conditions, item availability).
- Costs are paid (resources, items, Action Points in grids, charge time in ATB).
- The ability's effects resolve, per target and once per use (see Abilities). Positional modifiers of the mode apply (flank and height in grids, rows in classic battles).
- Damage, healing and statuses become events. Shields absorb, affinities scale, the unit may fall.
- Reactions queue and resolve (counterattacks, guards, overwatch), up to Max Reaction Depth.
- Objectives are checked after every state change. The battle ends with an outcome: Victory, Defeat or Fled.
9.2.3 Damage and hits
The formulas are data (Project Settings → RPG Saga Engine → Combat Formulas) and a rules profile can replace them. The defaults:
- Physical and magical damage =
Power * Offense * DefenseFactor * Position * Variance.Offenseis Attack (physical) or Magic (magical),DefenseFactorisDefenseConstant / (DefenseConstant + max(0, Defense)), so armor has diminishing returns and never makes a unit immune. - Fixed damage (bombs) ignores stats, defense, position and variance.
- Then a critical hit multiplies the damage, a minimum damage applies, and the target's element affinity scales it.
- Hit chance =
Attacker.Accuracy - Target.Evasion + HitBonus, clamped to the minimum and maximum hit chance. - Healing from magic =
Power * Attacker.Magic * Variance. Fixed and percent-of-max restores stay as authored.
Element affinities are Normal, Weak, Resist, Immune and Absorb. When several sources apply, Absorb wins, then Immune, then Resist. Weak and Resist together cancel. The multipliers are in Battle → Elements → Affinity Multipliers (defaults 1, 2, 0.5, 0 and -1, so absorb heals).
The offense and defense stats, the formulas and the attribute registry are part of the Game Foundation (see Game foundation).
9.2.4 Determinism
All randomness comes from one seeded stream per battle (loot dice come from a stream derived from the same seed). The same seed and the same commands give the same battle. Custom code must draw numbers with Roll Int and Roll Percent on the battle, never with the engine's global random functions.
9.2.5 Starting a battle
An encounter trigger is the usual start: a volume the player walks into (Repeat: One Shot or Repeatable), touching a roaming enemy, or a random encounter area while walking (see Exploration). The story effect Start Battle starts one from a dialog or a cutscene. Everything funnels into the exploration subsystem, which resolves the mode, finds the battle site and calls the right director.
9.2.6 The battle mode override
The content decides each encounter's mode. The battle mode override is a session setting that fights every encounter that allows it in a different mode. It exists for demo menus, test tools and showcase captures. A story game leaves it empty.
Set it:
| From | How |
|---|---|
| Blueprint | Get Game Instance Subsystem (RSE Battle Mode Override Subsystem) → Set Battle Mode Override (Battle.Mode.*), or Clear Battle Mode Override |
| Console | RSE.Battle.ModeOverride Tactics, Live, ATB, Turn, Action or None (no argument shows the current value) |
| Command line | -RSEBattleMode=ATB |
| C++ | URSEBattleModeOverrideSubsystem::Get(this)->SetBattleModeOverride(Tag) |
It lasts as long as the game instance and is never saved. The encounter's side has three fields: Allow Mode Override (off for scripted battles that only work in one mode), Override Modes (the modes it may use; empty means every mode its data supports) and Mode Rules Profiles (a rules profile per mode).
A battle in another mode runs on a transient copy of the encounter: the mode set, the mode's rules profile applied, the same name (so ids, quests and bestiary entries stay the same). What each mode needs, and what happens when the encounter does not author it:
| Mode | Needs | Automatic fallback |
|---|---|---|
| Grid Tactics | A Tactics zone with its director (from the site) | Deployment tiles along the zone's near edge. Enemies are laid out on the far rows when their tiles are off the grid, blocked or shared. |
| ATB / turn-based | An ATB director with a stage | Every enemy in front. Those after Auto Front Row Size go to the back row. |
| Free Tactics | Nothing (where the party stands) | The site's live area. A party outside Live Area Radius is brought to Party Start first. |
| Action | The action presentation | The live area, or the site's Action Area. |
Technical values are in Project Settings → RPG Saga Engine → Battle Mode Override (overridable modes, Fall Back To Own Mode, fallback sizes). When an override cannot run, the encounter is fought in its own mode with a warning. A site's Log Mode Report button, or URSEBattleModeOverrideLibrary::GetEncounterModeReport, lists for every mode whether the encounter can run in it and which fallbacks it uses.
9.2.7 Encounter sites
ARSEEncounterSite holds one encounter's places for every mode: Tactics Director (its zone is the grid), ATB Director (its stage), the live area (Live Area Radius, Party Start) and an optional Action Area. Encounter triggers point at a site (Site), and the Start Battle effect and StartEncounter find the site of their encounter. Use it when one encounter should work in several modes.
9.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEEncounterData | RSECore | The encounter data asset. |
URSEBattle | RSECore | Headless core: units, resources, damage, statuses, reactions, objectives, events. |
URSETacticsBattle, URSEATBBattle, URSETurnBattle | RSECore | Mode rules (grid, ATB, turn-based). |
URSEBattleCondition | RSECore | Base of objectives (URSECondition_TeamDefeated, _CharacterDefeated, _TurnsElapsed, _ReachTiles). |
URSEBattleModeOverrideSubsystem, URSEBattleModeOverrideLibrary | RSECore | The mode override, resolution and reports. |
URSECombatFormulaSettings | RSECore | The damage and hit formulas as data. |
FRSEBattleRewards | RSECore | What a victory gives (experience, items, money, growth, statistics). |
ARSETacticsBattleDirector, ARSEATBBattleDirector | RSE | Run a battle on the map and present its events. |
ARSEEncounterTrigger, ARSEEncounterSite | RSE | Start a battle from the world, and hold its places per mode. |
URSEBattleFlowSubsystem | RSE | Results and game-over screens. |
URSERewardFeedSubsystem | RSE | The notification feed after a win. |
RSEBattleSim (namespace) | RSECore | The headless simulator: LoadScenarioFile, Run, Summarize, RunAndWriteReport. |
9.4 Settings
Project Settings → RPG Saga Engine:
| Group | What it holds |
|---|---|
| Battle | Tactics turn order (CT threshold 100, CT costs), KO countdown, damage constants (Defense Constant 100, Min Damage 1, Variance Min/Max 0.9 to 1.1, Critical Multiplier 1.5, Base Critical Chance 5), hit chance limits (5 to 100), flank and height rules, ATB timing and flee chance, Default Encounter Mode. A rules-profile section. |
| Combat Formulas | The offense and defense stats and every formula. A rules-profile section. |
| Battle Mode Override | Overridable modes and fallbacks. |
| Battle Flow UI | Results and game-over screens, delays (Results Delay 1.2 s), Results Presentation. |
| Reward Feed | The notification style, widget class and icons. |
| Battle Simulator | Defaults for the simulator (below). |
| Balance | Bands and levels for Balance My Campaign. |
| Encounters | Contact rules (preemptive and back attacks), default teams, random encounter options. |
See Appendix B for the full lists.
9.5 Blueprint usage
From the RPG Saga | Battle library:
- Start Encounter (Encounter, Source): starts a battle as if the player walked in.
- Is In Battle, Get Current Battle, Get Current Encounter, Get Current Battle Outcome.
- Find Tactics Director, Find ATB Director.
Start a boss fight from a lever:
- Event On Interact (a lever) → Start Encounter (Encounter =
DA_Encounter_Starter_Z1_Boss). - Bind the exploration subsystem's On Encounter Ended to continue the story.
React to a battle event on a director: bind On Event Presented (it carries the battle event) to show custom numbers or play a sound.
Write a battle effect (for custom abilities): the battle nodes are Deal Damage, Heal Unit, Change Resource, Apply Status, Remove Statuses, Shift Turn, Defeat Unit, Scan Unit, Roll Int and Roll Percent, plus the getters Get Unit, Get Unit Ids, Get Unit Attribute, Get Unit Resource, Unit Has Status, Are Units Enemies and Get Outcome.
See Appendix A for every node.
9.6 C++ usage
Running a battle headless, as the simulator and the tests do:
URSEATBBattle* Battle = NewObject<URSEATBBattle>();
Battle->Initialize(Spawns, /*Seed*/ 42, /*bCanFlee*/ true);
while (!Battle->IsBattleOver())
{
Battle->Advance(0.1f);
for (int32 UnitId : Battle->GetReadyUnits())
{
// Choose a command (or let RSEATBAI::Act decide).
Battle->IssueCommand(UnitId, Ability, TargetId);
}
}
const ERSEBattleOutcome Outcome = Battle->GetOutcome();
To react to events without a director, bind to the battle's event delegate and switch on ERSEBattleEventType. A new objective is a subclass of URSEBattleCondition. A new kind of reward presentation is a URSERewardToastProvider.
9.7 Advanced
9.7.1 Rules profiles
A rules profile (URSERulesProfile) overrides chosen settings sections (Battle, Grid, Combat Formulas, Ability Toolkit, Turn-Based Battle, Inventory Rules, Economy, AI...) for one encounter, one mode, a chapter or the game. Set it on the encounter (Rules Profile), on a mode (Mode Rules Profiles), on a director (Rules Profile Override) or as the project default. Some properties are structure and stay global, such as tile size and the currency.
9.7.2 The battle simulator
The simulator plays whole battles with no rendering, AI against AI, many times with different seeds, and reports what happened. It is the fastest way to find a pushover or a brick wall.
Ways to run it:
- Configurator → Tools → Battle Simulator: pick the encounter, a rules profile (empty means as in the game), the number of battles, the party's level and the AI intelligence of each side, optionally a sweep (a parameter from a start to an end by a step). Run, then Open report.
- Console:
RSE.Sim.Run <scenario.json> [Runs](development builds). - Command line:
UnrealEditor-Cmd.exe MyGame.uproject -run=RSEBattleSim -Scenario=Config/BattleSim/MyScenario.json -unattended -nullrhiwith optional-Out=and-Runs=.
A scenario is a small JSON file:
{
"Name": "Zone1_LevelSweep",
"Encounter": "/RPGSagaEngine/Data/Encounters/DA_Encounter_Starter_Z1_Pack",
"Runs": 40,
"Seed": 2000,
"PlayerIntelligence": 0.8,
"Sweep": { "Parameter": "PartyLevel", "From": 1, "To": 10, "Step": 1 }
}
Fields you will use most: Encounter, Mode, Party, PartyItems, RulesProfile, RulesOverrides, Runs, Seed, PlayerIntelligence, EnemyIntelligence, PartyLevel, EnemyLevelMultiplier, ProgressionZone, MaxTurns, MaxSeconds, Grid and Sweep. Sweep parameters include PartyLevel, EnemyLevelMultiplier, the two intelligences, EnemyAIProfile and Rules:<Section>.<Field>, for example Rules:Battle.CriticalMultiplier.
Each run writes results.csv (one row per battle), summary.json and summary.html to Saved/BattleSim/<date-time>_<scenario>/. Read the win rate (how hard the fight is), the median turns and the HP left (tempo and how close the wins are), the performance score (which way adaptive difficulty would push) and the damage per ability (the candidates to tune). A battle that reaches the turn or time guard is a Timeout. The same scenario and seed always give the same results.
Grid battles need a grid. The simulator uses the zone of the map that runs the encounter, a named zone, or a generated grid (Width, Depth, optional height noise). The values are in Project Settings → RPG Saga Engine → Battle Simulator (default runs 50, seed 1, intelligence 0.8, guards 400 turns and 1200 seconds).
9.7.3 Balance My Campaign
RPG Saga Engine → Advanced tools → Balance My Campaign... plays every encounter of every progression zone with the simulator, flags what is too easy, too hard, too long, a stalemate, a one-shot or an ability cliff, proposes the smallest data changes that fix it, verifies each proposal on the same seeds and applies the ticked ones as one undoable step. It needs a campaign asset (the one the Progression Designer uses). Each encounter's Balance Role picks its win-rate band. Assets with Balance Locked are never touched. The command line is -run=RSEBalanceCampaign -Campaign=/Game/.../DA_Campaign_Main, with -Analyze, -Apply and -FailOnFlags for continuous integration. Reports go to Saved/Balance/.
9.7.4 Networking
The host runs the battle. Guests send commands. Because the rules are deterministic and the state is serializable, this needs no extra code from you (Co-op and online).
9.7.5 Performance
Battle logic does no per-frame allocation in the formulas (they are compiled expressions). Presentation cost is your main budget. The RSE.Battle.Presentation.Speed CVar scales presentation timings and RSE.Battle.Presentation.ReduceEffects trims effects (Platforms and performance).
9.7.6 Debugging commands
In development builds: RSE.Battle.StartEncounter <Asset>, RSE.Battle.Start, RSE.Battle.Restart, RSE.Battle.AutoPlay 1 (the AI plays your party too), RSE.Exploration.Encounter [Filter | ATB | Turn | Tactics] and RSE.Encounter.Debug 1. Appendix C lists them with help text.
9.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| Walking into the trigger does nothing | The trigger has no director or site, or a Repeat setting already used it. For classic battles the map needs an ATB Battle Director with an ATB Stage. |
| The encounter list in Encounter Layout is empty | Only encounters of the target's kind show (grid for a zone, classic for a stage). Make one with New battle. |
| "Zone without a baked grid" | Select the Tactics Zone and press Bake Grid. |
| A mode override seems ignored | The encounter has Allow Mode Override off, or Override Modes excludes it. Check the mode report. |
| The override falls back to the encounter's own mode | The map has no zone or stage for the requested mode. Add a site, or turn off Fall Back To Own Mode to see the failure. |
| The same battle plays out differently | Custom code uses engine random functions. Use the battle's Roll Int and Roll Percent. |
| Simulator says the grid is missing | No zone on the map runs this encounter. Pass Grid in the scenario, or use "Generate": true. |
| A boss is a one-shot for the party | Run Balance My Campaign, or lower the offense in the encounter's rules profile. |
| No results screen after a win | Results Presentation is Feed, or the Free Tactics results mode is None. |
| A lost story battle shows game over | Tick Defeat Continues Story on the encounter. |
9.9 See also
- Abilities and statuses, Items, inventory and economy.
- Grid Tactics, ATB and turn-based, Free Tactics, Action battles.
- Enemy AI and adaptive difficulty, Exploration for random and visible encounters.
- Product pages:
docs/product/encounter-editor.md,docs/product/random-encounters.md,docs/product/balance-tool.md.
10. Grid Tactics
In short: Grid Tactics is turn-based combat on a square grid laid over your live level. Tiles have height and terrain, units face a direction, and position matters: flanking, high ground, cover, line of sight. Turn order follows a per-unit charge counter (CT), and each turn is paid with Action Points (AP) that you spend on moving and acting in any order. Use it for story battles, bosses and any fight where where you stand matters.
10.1 Basics
10.1.1 The words
| Word | Meaning |
|---|---|
| Tactics zone | The actor (ARSETacticsZone) that marks where the battle happens. Its grid is measured from your level geometry. |
| Bake Grid | Measuring the level under the zone: which tiles are walkable, how high each one is. You do it once in the editor. |
| Tile | One square of the grid (100 cm by default). It has a height (in steps), a terrain and a walkable flag. |
| Height step | The unit of height (50 cm by default). Climbing and dropping are measured in steps. |
| CT (charge time) | Each unit fills a counter at its own speed. At 100 the unit takes a turn. Fast units act more often. |
| AP (Action Points) | The budget of one turn (the unit's Stat.ActionPoints). Moving and acting both spend it. |
| Facing | The direction a unit looks: North, East, South or West. Attacks from the side or the back hit harder and more often. |
| Deployment tiles | The tiles where the player places units before the battle starts. |
| Director | The actor (ARSETacticsBattleDirector) that runs one grid battle: deployment, turns, AI and presentation. |
10.1.2 Set up your first grid battle
The fast way:
- Open a level with open, mostly flat ground.
- Choose RPG Saga Engine → Advanced tools → Make Battle Zone Here... (or right-click in the viewport → RPG Saga → Make Battle Zone Here). Pick an encounter. The tool traces the grid, picks deployment tiles, places the enemies, and adds a zone, a director and a trigger. Press Apply.
- Play. Walk into the trigger. The world turns into a grid, you place your units on the blue tiles and start the battle.
The manual way (to learn what the tool does):
- Place an RSE Tactics Zone (search "Tactics Zone" in Place Actors). Its origin is the corner of tile (0,0). The grid follows the actor's location and yaw.
- Set Grid Width and Grid Depth (12 by 12 by default) and press Bake Grid in Details. Tiles that are too steep, or have no clearance above them, become unwalkable.
- Place an RSE Tactics Battle Director. Set Zone to your zone and Encounter to an encounter asset. (Or leave the director to be found by a trigger or a battle site.)
- Lay out the enemies and the deployment tiles with the Encounter Layout mode (see Battle fundamentals).
- Add an RSE Encounter Trigger that points at the director. Play.
Fix a wrong tile with Tile Overrides on the zone (height, terrain, walkable), then Bake Grid again. Mark scenery the bake should ignore with the actor tag RSE.GridIgnore.
10.1.3 How a battle plays
- Deployment. The player sees the deployment tiles, places the roster characters (click a blue tile or use the buttons Place, Withdraw, Auto Deploy) and presses Start Battle. Required characters must be placed. With free slots the game asks for confirmation. The encounter's Max Deployed Units (4 by default) limits how many.
- Turns. The unit whose CT reaches the threshold takes a turn. It gets AP equal to its
ActionPointsstat. - Move and act. Blue tiles show where the unit can walk. Hovering a tile draws the real path with its AP cost ("5 AP (3 left)"). Choose an ability and the range, the area and who it hits are previewed, with the hit chance, damage range and a KO marker. Moving and acting mix freely: move, attack, move again, as long as AP last.
- End turn. The player picks the unit's facing. A turn that used no AP costs 60 CT, one that used them all costs 100, and partial use is in between, so a unit that does less comes back sooner.
- Victory or defeat by the encounter's objectives. Then the results flow starts.
A fallen unit stays on the grid for KO Countdown Turns (3) of its own turns. Revive it in time or it leaves the battle.
A danger zone key toggles an overlay of every tile the enemies can hit on their next turn.
10.2 How it works
10.2.1 Data to rules to presentation
Level geometry ──Bake──► ARSETacticsZone.Grid (FRSETacticalGrid, saved in the level)
│
URSEEncounterData ─► ARSETacticsBattleDirector ─► URSETacticsBattle (RSECore, headless)
(deployment, AI turns, grid, CT, AP, movement, targeting,
presentation, input) positional damage, zones, objects
▲ │
└────── battle events ◄──────────┘
URSETacticsBattle holds all the rules and runs without a world. The grid stays inside the battle, and at runtime nothing scans the level. An unbaked zone is baked once at the start of play with a warning (Bake If Empty At Runtime), but the right fix is to press Bake Grid in the editor and save the level.
10.2.2 Movement
- Four directions (North is +X, East is +Y). Heights are whole steps.
- A step is allowed when the target tile is walkable, its terrain is not impassable, the height difference fits the unit's jump (
Stat.Jumpup, jump plus Jump Down Bonus down) and no enemy stands there. - The cost of a step is the terrain's Move Cost plus a height cost: Climb Cost Per Step (default 1) for each step up and Descend Cost Per Step (default 0) for each step down. Stairs (
Terrain.Stairs) cancel the height cost. - Units can pass through allies but not stop on them. Enemies block fully.
- Pathfinding is A* over the real costs. The AI uses the same queries.
Terrains are gameplay tags with rules in Project Settings → RPG Saga Engine → Grid → Terrain Rules: move cost, impassable, water, no climb cost, an Evasion Bonus and a Defense Bonus Percent for the unit standing there, and a display name. The starter terrains are Ground, Grass, Sand (cost 2), Swamp (3), Stairs, Shallow Water (2) and Deep Water (impassable).
Movement traits are tags a unit gets from its class, equipment, a Pact or a status:
| Tag | Effect |
|---|---|
Trait.Move.IgnoreTerrainCost | Every walkable tile costs 1. |
Trait.Move.Levitate | No height limits or costs. Crosses water. Walls still block. |
Trait.Move.WaterWalk | Water costs 1 and deep water is open. |
10.2.3 Turn order and Action Points
CT fills every tick with the unit's Speed. At CT Threshold (100) the unit acts. After the turn it pays between Turn CT Cost Idle (60) and Turn CT Cost Full (100). The HUD shows the predicted order (PredictTurnOrder in the code). Statuses with Status.Block.Turn skip the turn, Status.Block.Move and Status.Block.Act stop one half. Turn manipulation effects change CT, and the Action Points effect adds or removes AP now or next turn (limited by Max Bonus Action Points).
10.2.4 Position and damage
Tactics adds three things to the shared damage rules:
- Facing. A hit from the side deals 1.25 times the damage (Side Damage Multiplier) with +10 hit chance (Side Hit Bonus). From behind it is 1.5 times with +25 (Back Damage Multiplier, Back Hit Bonus).
- Height. Damage changes by 10% per height step the attacker stands above the target (Height Damage Per Step), clamped between 0.7 and 1.5.
- Terrain. The target's tile gives it its evasion bonus and defense bonus.
All of this is in one breakdown (FRSETacticsPositionalBreakdown) used by the real hit, the AI's estimate and the forecast the player sees, so they always agree. The values are in Battle → Tactics → Positioning.
10.2.5 Targeting, shapes and line of sight
An ability's Tactics Rules decide what can be targeted: Min Range and Max Range (Manhattan distance in tiles), Vertical Tolerance (height difference), and Requires Line Of Sight. Line of sight is traced from an eye height above the tile surface (Line Of Sight Eye Height, 2 steps). Walls and tall objects block it. A Direct trajectory is a straight shot. An Arc (with Arc Height) flies over lower obstacles. Height Steps Per Range Bonus gives extra range from high ground.
The area is one of Single, Diamond, Cross, Line, Cone, Ring, Rectangle or Mask. A Mask is a hand-drawn pattern of rows separated by / or |, where X or # is a hit tile, O the center and @ a hit center. Area Centered On Caster makes the shape start at the user (a blast around you, a cone in front). Falloff lowers power with distance from the center.
10.2.6 Zones and field objects
Grid battles add two kinds of field content, both data assets:
- Tile zones (
URSETileZoneData): an area effect that lasts a number of turns. It has Effects On Enter and Effects On Turn Start, a Trigger Filter, Extra Move Cost (the pathfinder pays it), Slippery (units slide), Trap (triggers once, optionally Hidden From Enemies) and Removes Zones (fire melts ice). Examples in/RPGSagaEngine/Data/Field/:DA_Zone_FireGround,DA_Zone_HealingSpring,DA_Zone_SpikeTrap. - Field objects (
URSEFieldObjectData): walls, barriers, crates, explosive barrels. They have HP, can block movement and line of sight, expire after a number of turns, and can explode, chaining to neighbors (up to Max Chain Explosions). Examples:DA_Object_StoneWall,DA_Object_ExplosiveBarrel.
Abilities create them with Create Zone and Spawn Object effects. Encounters can place objects from the start (Field Objects). Movement is evaluated tile by tile, so traps, zones, overwatch and sliding trigger on each tile.
10.2.7 Deployment
FRSEDeployment (RSECore, no world) holds the roster, the deployment tiles and the placements. CheckStart answers Ready, Not Full, Missing Required or No Units. AutoDeploy places required characters first, then the rest, putting short-range units on tiles closest to the enemy and long-range units behind. Units already placed never move.
10.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSETacticsBattle | RSECore | The headless grid battle: CT, AP, movement, targeting, positional combat, zones. |
FRSETacticalGrid, FRSEGridCoord | RSECore | The grid and tile coordinates. |
URSEGridSettings | RSECore | Tile size, height step, terrain rules, cost rules. |
RSEGridPathfinding, RSEGridQueries | RSECore | Reachable tiles, A* paths, ranges, shapes, line of sight (pure functions). |
FRSEDeployment | RSECore | Deployment rules. |
URSETileZoneData, URSEFieldObjectData | RSECore | Zone and object data assets. |
ARSETacticsZone | RSE | The zone actor: bake, overrides, drawing. |
ARSETacticsBattleDirector | RSE | Runs the battle and presents it. |
ARSEGridUnit | RSE | The unit actor on the grid (placeholder body, or the character's look). |
ARSETacticsPlayerController, ARSETacticsCameraPawn | RSE | Input and the battle camera. |
ARSEPathPreview, ARSETargetPreview | RSE | The path line and the target preview. |
10.4 Settings
Project Settings → RPG Saga Engine:
| Group | What it holds |
|---|---|
| Grid | Tile Size (100 cm), Height Step Size (50 cm), Default Terrain, Terrain Rules, Cost Rules (climb, descend, levitate). Tile size, height step and default terrain are global only, because levels are built for them. A rules-profile section. |
| Battle | CT and AP rules, KO Countdown Turns (3), Jump Down Bonus (1), the positioning rules (side, back, height, line-of-sight eye height). |
| Tactics Zone | Bake trace settings (Bake Trace Channel, Required Clearance, Min Walkable Normal Z, Bake Min Surface Size, Bake Ignore Tag), the grid look (Grid Visual Mode: Projected or Tiles), highlight colors, unit placeholder look and movement speed. |
| Tactics Camera | Pitch (-50), initial yaw (45), field of view (35), distance limits, zoom and pan speeds, rotation step (90 degrees). |
| Tactics Path Preview | The look of the path line. |
| Target Preview | The targeting preview: Default Style (Classic or Modern), colors, labels, what to mark. Players can pick their own in the options. |
| Input | The input actions, including Danger Zone Action. |
See Appendix B for every property.
10.5 Blueprint usage
Start a grid battle from a button:
- Event (a menu button) → Find Tactics Director (Encounter =
DA_Encounter_Starter_Z1_Skirmish). - Branch on Is Valid. True: Set Encounter, then Begin Encounter. If you want to skip deployment, tick Auto Deploy on the director and call Start Battle.
- Bind On Event Presented on the director to show your own numbers, or use the shipped HUD.
Useful director nodes: Begin Encounter, Start Battle, Restart Encounter, End Encounter, Get Phase (Idle, Deployment, Battle, Finished), Get Battle, Get Battle Outcome, Is Awaiting Command, Is Playback Idle, Get Unit Actor, Get Last Rewards.
Rebake from a tool: the zone's Bake Grid and Clear Grid are callable in the editor, and RSE.Tactics.BakeZones rebakes every zone in the level in development builds.
The full node list is in Appendix A.
10.6 C++ usage
Move and attack in a headless grid battle (a test, a tool, an AI):
URSETacticsBattle* Battle = NewObject<URSETacticsBattle>();
Battle->Initialize(Grid, Spawns, /*Seed*/ 7);
Battle->StartBattle();
TArray<FRSEGridReachableTile> Reach;
Battle->GetActiveUnitReachableTilesWithCost(Reach);
if (Battle->MoveActiveUnit(Goal))
{
const ERSEAbilityUseResult Result = Battle->UseAbility(Ability, Target);
if (Result == ERSEAbilityUseResult::Ok)
{
Battle->EndTurn(ERSEGridDirection::South);
}
}
ERSEAbilityUseResult explains refusals: Not Active Unit, Blocked, Unknown Ability, Not Enough Action Points, Not Enough Resources, Uses Per Turn Reached, Invalid Target, Item Unavailable, Requirement Not Met. For the player's UI use ForecastAbilityAt, GetTargetingTilesFrom and GetAreaPreviewFrom. They use the same path as the real resolution and never change the battle.
From a director, the same commands are CommandMove, CommandAbility, CommandItem, CommandEndTurn, DeployPlace and DeployWithdraw.
Extension points:
- A new effect that works on the grid: a subclass of
URSEAbilityEffectthat overridesPreviewDisplacement(to preview movement) and uses the battle's grid functions (ComputePush,ApplyPush,IsTileStandable). - A new terrain: a gameplay tag under
Terrain.*plus a row in Grid → Terrain Rules. - A new objective: a
URSEBattleConditionsubclass. - Your own unit actor: set the director's Unit Actor Class to a subclass of
ARSEGridUnit.
10.7 Advanced
10.7.1 Terrain from the world
The bake traces straight down for every tile. A tile is walkable when the surface is flat enough and has clear space above. Surfaces that do not block pawns, pawns, objects narrower than Bake Min Surface Size and anything tagged RSE.GridIgnore are skipped. Combat roles on level actors (cover, obstacle, difficult terrain, high ground) can change tiles during the bake (see World building). The bake keeps the exact surface under each tile, so units, the path line and the highlights sit on the real ground even on slopes.
10.7.2 Grid visuals
Grid Visual Mode is Projected by default: one decal over the zone drawn from a small texture, which looks right on uneven ground and costs one draw call. Tiles draws instanced meshes. Projected needs a grid decal material. Without it the mode falls back to Tiles. You can show the grid only in battle (Show Grid Only In Battle) and play a reveal animation when the battle starts.
10.7.3 Rules profiles for tactics
Tile size and height step are global because levels are built for them. Everything else (costs, positioning, CT, KO countdown) can change per encounter through a rules profile. A boss can use a profile with no side bonus, a swamp level a profile with cheaper water.
10.7.4 AI
The AI plans on the same reachable tiles and costs. It scores flanks, height, line-of-sight blocking and danger tiles according to its intelligence value (see Enemy AI and adaptive difficulty). The director's AI Think Delay and Event Pause set the presentation pace.
10.7.5 Networking
The host runs the grid battle and guests send commands (FRSECmd family). The battle is deterministic, so every machine can mirror it (Co-op and online).
10.7.6 Performance
- The grid is data in the level. Nothing is scanned at runtime.
- The director has no per-frame cost beyond its presentation.
- The danger zone and the previews recompute only when the battle changes.
- Use Projected for live-map battles and keep the Combat Area free of clutter.
10.7.7 Development commands
In development builds: RSE.Tactics.ShowReach [Unit], RSE.Tactics.MoveUnit X Y [Unit], RSE.Tactics.BakeZones, RSE.Tactics.Demo approach|use|wait, RSE.Tactics.Deploy [start], RSE.Tactics.Preview style Classic|Modern|Default and RSE.Battle.AutoPlay 1. See Appendix C.
10.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| No grid appears, or "zone without a baked grid" | Press Bake Grid on the zone and save the level. |
| Many tiles are unwalkable | The surface is too steep (Min Walkable Normal Z) or something is within Required Clearance above it. Use Tile Overrides, or tag props RSE.GridIgnore. |
| The grid floats above or sinks into the ground | The zone's origin is too high or low, or Bake Trace Height Above misses the ground. Move the zone and rebake. |
| A unit cannot reach a tile that looks close | Height difference above its jump, a costly terrain, or an enemy blocks the path. Hover the tile to read the path cost. |
| An ability shows no valid targets | Min Range, Max Range, Vertical Tolerance or line of sight. Use Test ability in Grid mode to read the step-by-step reasons. |
| Units start on invalid tiles | A start tile is off the grid or blocked. The game moves them to the nearest free tile. Fix the layout in Encounter Layout. |
| The grid looks wrong in the Projected mode | The grid decal material is not set or the surface is too steep for Projected Min Normal Z. Switch to Tiles. |
| The enemy never moves close | The AI's intelligence, or the encounter's profile. Check the AI chapter. |
| The player cannot start the battle | A required character is not placed, or nobody is placed. The message names the character. |
10.9 See also
- Battle fundamentals for encounters, objectives, rewards and the simulator.
- Abilities and statuses for Tactics Rules, area shapes and reactions (overwatch).
- Free Tactics for the same idea without a grid.
- World building for Make Battle Zone Here and combat roles.
- Camera and battle presentation.
- Product pages:
docs/product/encounter-editor.md,docs/product/combat-roles.md,docs/product/world-tools.md.
11. ATB and turn-based
In short: The classic battle modes are menu-driven fights on a stage where two sides face each other in rows. ATB gives every unit a time bar that fills until the unit can act. Turn-based drops the bar: one unit acts at a time, in a round (everyone once, fastest first) or on a timeline (fast units come around more often). They share the same party, abilities, items and menus as the grid mode, and one director and one stage run both.
11.1 Basics
11.1.1 The words
| Word | Meaning |
|---|---|
| ATB (Active Time Battle) | Each unit has a gauge that fills over time. A full gauge makes the unit ready for one command. |
| Wait / Active | The two time settings. In Wait (default) time stops while the player picks from a menu. In Active it keeps running. |
| Round-based | Turn-based style where each round every unit acts once, fastest first. |
| CTB (timeline) | Turn-based style where a hidden gauge jumps straight to the next full one, so fast units act more often and slow actions delay the next turn. |
| Rows | Front row and back row. By default the back row deals and takes half physical melee damage. Magic and bows ignore rows. |
| Scope | How many a classic ability hits: Single, Row or All. |
| ATB stage | The actor (ARSEATBStage) that holds the two sides' slots and the battle camera. |
| ATB director | The actor (ARSEATBBattleDirector) that runs the battle on a stage. It runs ATB and turn-based. |
| Command menu | The list of commands a ready unit chooses from (Attack, Skills, Magic, Items, Actions). |
11.1.2 Set up your first classic battle
- Put an RSE ATB Stage in your level on open ground (or inside a dedicated arena). It shows the two sides' slots in the editor.
- Put an RSE ATB Battle Director next to it. Set its Stage and its Encounter (an encounter whose Battle Mode is
Battle.Mode.ATBorBattle.Mode.Turn). - Add an RSE Encounter Trigger that points at the director, or use Make Battle Zone Here (which can add a stage), or the Studio's World → New battle (see Editor tools).
- Play. Walk into the trigger. The party stands in its formation (set in the party menu), the enemies in their rows, and the bars start to fill.
Layout the enemies and their rows with the Encounter Layout mode on the stage: drag an enemy to another slot or row, or press R to swap its row. Each enemy's ATB Row is also a field on the encounter.
11.1.3 Play a classic battle
- A unit's gauge fills. When it is full the command menu opens for it. A banner says "Mira's turn".
- Choose a command (the menu's structure is data, see below), then a target. The target list shows enemies by name, allies for heals, or groups ("Front row", "All enemies" with the number of targets).
- The action plays. Abilities with a Charge Time wait before they resolve. If the target fell meanwhile, the ability hits another valid target on the same side.
- Commands given while an action is still showing are not lost. They queue and run right after it.
- Flee (if the encounter allows it) tries to escape. The chance depends on the speed of your party compared to the enemies. A failed attempt costs the unit's turn.
Switch characters with the next-unit key. Wait or Active can be toggled in the battle with its key (and the player can store a preference in the options).
11.2 How it works
11.2.1 One director, two time models
URSEATBBattle is the ATB battle (headless, in RSECore). URSETurnBattle derives from it and replaces only the time model. Everything else is shared: commands, rows, scopes, items, flee, summons, statuses, objectives, AI. The director picks the class with URSETurnBattleSettings::ResolveClassicMode:
- the profile's Classic Mode Override (empty,
Battle.Mode.ATBorBattle.Mode.Turn), else - the encounter's Battle Mode (
Turnmeans turn-based, anything else ATB).
That is how a rules profile can switch every classic battle of a game at once.
11.2.2 ATB timing
- A gauge fills at ATB Fill Per Speed (2.0) gauge points per second per point of Speed, up to ATB Gauge Max (100). A Speed 10 unit is ready every 5 seconds.
- At battle start each gauge begins at ATB Initial Gauge Per Speed (3) times Speed, never full.
- Time advances in fixed steps (ATB Step Seconds, 1/30 s), so a battle is deterministic for a seed.
- A full gauge makes the unit ready for one command. It then pays the ability's charge time (if any) and the gauge restarts.
- Haste and slow work through the Speed stat (status modifiers).
Wait and Active are a presentation rule: the director stops calling Advance while a menu is open in Wait mode.
- Wait Pause says which open menus stop time: Any Menu (default), Submenus And Targeting (time flows on the first list) or Targeting Only.
- Wait Pauses Enemies (on): while time stands still, ready enemies wait too.
- Active Menu Time Scale: in Active mode, the speed while the player is in a sub-list or choosing a target (1 = full speed).
- Busy Commands: Queue (default) or Reject a command given while an action shows.
- Time never runs while animations play.
Initiative. If the player touches an unaware visible enemy from behind, the battle is Preemptive: the party's gauges start filled and the enemies' empty. If a chasing enemy catches the party from behind it is a Back Attack, the reverse. The shares are Initiative Gauge Fraction and Surprised Gauge Fraction in Encounters settings. The turn-based round mode has no gauges and only records it.
11.2.3 Rows, scopes and flee
- A unit in the back row deals and takes ATB Back Row Physical Multiplier (0.5) of melee physical damage, each side applying it separately. Magic and abilities with Ignores Row (bows, throwing) are not affected.
- Scope comes from the ability's ATB Rules: Single (one target), Row (the target's row), All (the target's whole side).
- Flee chance = Flee Base Chance (40%) plus Flee Chance Per Speed (3) for each point the party's average Speed exceeds the enemies', limited to 5% to 95%. Set Can Flee off on the encounter for bosses and story battles. A successful flee ends the battle as Fled.
- Pact summons take the summoner's place in the row, and the summoner steps out until the summon ends (see Characters and party).
11.2.4 Turn-based styles
Set in Project Settings → RPG Saga Engine → Turn-Based Battle (a rules-profile section):
| Setting | Meaning |
|---|---|
| Turn Order Style | Round-based (classic) or CTB (timeline). |
| Initiative Variance (Round) | Initiative is Speed times (1 plus or minus this), rolled per unit each round. Default 0.1. 0 = strict Speed order. |
| Reorder On Speed Change (Round) | A haste or slow reorders the units still waiting in the round. |
| Charge Delay Scale (CTB) | An ability's charge time becomes extra waiting before its user's next turn, times this. The action itself resolves at once. 0 = every action costs the same. |
| Tie Break | Player First, Enemy First or Random (a fixed coin flip per unit and battle). Then Speed, then the unit id. |
| Turn Order Preview Count | How many upcoming turns the HUD strip shows (8). |
| Classic Mode Override, Classic Encounters Enabled | Switch all classic battles to one mode, or switch classic encounters off for a Tactics-only game. |
In Round mode every active unit acts once per round, in order of initiative. A unit that falls or steps out loses its place. A summon that arrives mid-round acts from the next round. Charge times are ignored: abilities resolve at once.
In CTB mode the ATB gauge still exists (using the same fill rates as ATB) but the timeline jumps straight to the next full gauge. A unit twice as fast acts twice as often. The HUD shows the turn order strip. GetTurnOrderPreview replays the timeline on copies of the gauges.
Exactly one unit is ready at a time in turn-based modes, so Wait and Active do not matter there.
11.2.5 The command menu
The structure of the menu is data, not code. A Command Menu Layout asset (URSECommandMenuLayout) lists the top-level commands. Each one has an id, a label, a help line and a kind:
- Ability: uses the first of the unit's abilities that matches, and goes straight to targeting ("Attack").
- List: opens a list of the matching abilities, and optionally the party's items, Flee and summons.
Abilities sort into commands by their Ability Type tag (Ability.Type.Attack, Skill, Magic, Action). The first command that accepts an ability's type takes it. Abilities no command takes go to the command with Catch All ticked. A list command can also tick Include Items, Include Flee and Include Summons. Passives never appear.
- Set the project's layout in Project Settings → RPG Saga Engine → Command Menu → Default Layout. Without an asset, the Fallback Entries list gives Attack, Skills, Magic, Items and Actions.
- A class can name another layout (
URSEClassData::CommandMenu). A layout can also rename or hide commands for a class tag (Class Overrides: Magic becomes "Songs" for a bard). - Empty Groups hides empty commands or shows them greyed out. Remember Cursor opens each list where the unit's cursor was.
- The same menu structure is used in grid battles (with Move and End Turn added).
While a command is highlighted the help area shows its description, target scope, cost, element and charge time. At targeting, a cursor sits over the target and smaller ones over everyone the ability hits.
11.2.6 The stage and formation
ARSEATBStage holds the two sides' slots: Front Row Distance (300 cm), Row Spacing (180 cm) and Unit Spacing (170 cm), Lanes Per Row (a row holds this many units before newcomers use the other row), a camera, and a box showing the area. A stage can sit in an arena or directly on the live map, where the camera is framed so obstructions fade.
FRSEATBFormation (RSE, no world) gives every unit a side, a row and a lane across the row. Lanes are kept for the whole battle (fallen units lie where they stood). A row change from a knockback or swap moves only that unit. Reinforcements take the nearest free lane. A unit pushed out of place by an animation glides back after the action.
The party in a classic battle is the ATB formation (active members, default four, ATB Party Size) and their chosen rows, set in the party menu. Recruitable secondary characters never join classic battles.
11.2.7 The HUD
URSEATBHUDWidget shows the party with HP, MP and gauge state (READY, charging, QUEUED, KO), the enemies as clickable chips, the command column with the banner and help, the target list and card, the time mode, and the log. In turn-based modes it shows the round and the turn order strip (the Turn Order Bar settings control its look). Data flows through view models, so a custom UMG screen can use the same values. Text formats and sizes are in Classic Battle UI.
11.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEATBBattle | RSECore | The headless ATB battle: gauges, commands, rows, flee. |
URSETurnBattle | RSECore | Turn-based (round or CTB). Derives from URSEATBBattle. |
URSEBattleSettings | RSECore | ATB timing, rows, flee (Project Settings → Battle). |
URSETurnBattleSettings | RSECore | Turn-based styles (Project Settings → Turn-Based Battle). |
URSECommandMenuLayout | RSECore | The command menu layout data asset. |
RSEATBCommands | RSECore | The command queue and the active unit rule. |
ARSEATBStage | RSE | The stage actor. |
ARSEATBBattleDirector | RSE | Runs and presents the battle. |
URSEATBCommandComponent | RSE | Player command input on the controller: menus, targeting, unit switching. |
URSEATBHUDWidget | RSE | The classic battle HUD. |
DA_Rules_Genre_ClassicATB, _TurnRound, _TurnCTB, _TacticsOnly, _Hybrid | Content | Rules profiles in /RPGSagaEngine/Data/Rules/ that set the classic mode. |
11.4 Settings
Project Settings → RPG Saga Engine:
| Group | Key settings (defaults) |
|---|---|
| Battle → ATB | ATB Gauge Max (100), ATB Fill Per Speed (2), ATB Initial Gauge Per Speed (3), ATB Step Seconds (0.033), ATB Back Row Physical Multiplier (0.5), ATB Party Size (4), Default ATB Time Mode (Wait), Wait Pause (Any Menu), Wait Pauses Enemies (on), Active Menu Time Scale (1), Busy Commands (Queue). |
| Battle → ATB → Flee | Flee Base Chance (40), Flee Chance Per Speed (3), Flee Min Chance (5), Flee Max Chance (95). |
| Turn-Based Battle | The table above. |
| Command Menu | Default Layout, Fallback Entries, Empty Groups, remember cursor, back and flee labels. |
| Classic Battle UI | Banner, titles, help placement, cursor and target list look and text. |
| Turn Order Bar | The strip's size, scale and colors. |
| Encounters | Allow Preemptive, Allow Back Attack, Initiative Gauge Fraction, Surprised Gauge Fraction. |
| Ability Toolkit | Reactions In Classic Modes and the other rules that touch classic battles. |
The player's own Wait or Active choice is stored in their options and overrides the default. See Appendix B for the full list.
11.5 Blueprint usage
Start a classic battle on the stage next to the player:
- Event (an NPC dialog's effect, or a button) → Find ATB Director (Encounter =
DA_Encounter_Starter_Z1_Skirmish). - Start Battle (Encounter Override = your encounter). The director keeps its own encounter again after End Battle.
- For a surprise attack, call Set Next Initiative (Preemptive or Back Attack) first.
Useful director nodes: Start Battle, End Battle, Set Next Initiative, Get Battle Initiative, Get Phase (Idle, Battle, Finished), Is Active, Get Battle, Get Battle Mode, Get Time Mode, Set Time Mode, Get Time Scale, Is Command Queued, Is Playback Idle, Get Battle Outcome, Get Encounter. The On Event Presented event carries every shown battle event.
Switch between Wait and Active from an options menu: Set Time Mode (Wait or Active) on the director. The settings class stores the player's choice with URSEBattleSettings::SetPlayerATBTimeMode.
Change a character's row from the party menu: the party library has Get ATB Row and Set ATB Row, plus Get ATB Formation, Is In ATB Formation and Set In ATB Formation.
In a battle effect, Get Unit and Get Unit Ids give units, and Shift Turn moves a unit sooner or later: in ATB it changes the gauge, in a round it moves the unit to the front or back of the round, on the CTB timeline it changes the gauge.
See Appendix A.
11.6 C++ usage
The classic battle runs headless exactly as the simulator and tests drive it:
URSETurnBattle* Battle = NewObject<URSETurnBattle>();
Battle->Initialize(Spawns, /*Seed*/ 11, /*bCanFlee*/ true);
while (!Battle->IsBattleOver())
{
Battle->Advance(0.f); // turn-based: makes the next unit ready
for (int32 UnitId : Battle->GetReadyUnits())
{
if (Battle->CanUseAbility(UnitId, Ability) == ERSEATBCommandResult::Ok)
{
TArray<int32> Targets;
Battle->GetValidTargets(UnitId, Ability, Targets);
Battle->IssueCommand(UnitId, Ability, Targets[0]);
}
else
{
Battle->PassTurn(UnitId);
}
}
}
ERSEATBCommandResult explains refusals: Not Ready, Blocked, Unknown Ability, Not Enough Resources, Invalid Target, Item Unavailable, Requirement Not Met, or Queued (accepted while an action is shown). Use GetAffectedUnits for a scope's real targets and GetFleeChance for the HUD. Turn-based previews come from URSETurnBattle::GetTurnOrderPreview.
Extension points on URSEATBBattle (virtual): Advance, GetActionTimeCost, UsesChargeTime, OnActionFinished, OnBattleInitialized, ApplyTurnShift. A new time model is a subclass that overrides these, which is exactly what URSETurnBattle does.
11.7 Advanced
11.7.1 Presets by genre
The rules profiles DA_Rules_Genre_ClassicATB, DA_Rules_Genre_TurnRound, DA_Rules_Genre_TurnCTB, DA_Rules_Genre_TacticsOnly and DA_Rules_Genre_Hybrid set the classic mode for a whole game. Choose one as the project default (Rules Profiles → Default Profile or Set as default in the Configurator), switch it from the story with the Set Rules Profile effect, or put it on one encounter. Hybrid has no override, so every encounter picks its own mode.
11.7.2 More than one classic encounter on a map
A map has one classic director, and the controller uses the first. An encounter trigger's Classic Encounter replaces the director's encounter for the fight that trigger starts, and the director gets its own encounter back at the end. The same works from code with StartBattle(EncounterOverride).
11.7.3 Customizing the menu
Write a new layout asset per class for different command sets (a "Songs" command, a "Tricks" command with a hidden Magic). For a completely different screen, replace the HUD widget class and bind to the view models (CurrentList, MenuPath, HelpText, the target list). The actions on the view model (HoverTarget, ChooseTarget, ToggleTimeMode...) are the same ones the default screen uses.
11.7.4 Action commands and timing
Abilities with an Action Command ask for a timed press before they are issued. The grade becomes part of the command, so it stays deterministic. Enemy attacks on a unit with a shield can open a block prompt. Setting Action Commands → Default Player Mode (or the player's option) to Offense Only or None removes prompts (see Abilities).
11.7.5 Networking and AI
The host runs the battle. Guests send commands. Enemy AI acts as soon as a unit is ready after a short AI Think Delay, and a gauge-aware AI interrupts charging units according to its intelligence (see Enemy AI). In co-op, each local player has its own command component.
11.7.6 Performance
The battle logic is a fixed-step loop with a small state. A very large number of units mainly costs presentation. Keep ATB Step Seconds at the default unless you need finer timing.
11.7.7 Development commands
In development builds: RSE.Battle.StartATB, RSE.Battle.StartTurn [EncounterName], RSE.ATB.Mode Wait|Active, RSE.ATB.Input select | cancel | up | down | next | toggle | block | ... (menu input without a keyboard), RSE.Battle.AutoPlay 1 (the AI plays your party too) and RSE.Exploration.Encounter ATB|Turn.
11.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The trigger does nothing | The map has no ATB Battle Director, or the director has no Stage. Add them (or Make Battle Zone Here). |
| Classic encounters never start | Classic Encounters Enabled is off in Turn-Based Battle. Turn it on, or the active rules profile is Tactics Only. |
| Every battle is ATB even though the encounter says Turn | The profile's Classic Mode Override is set to ATB. Clear it. |
| Time never stops in menus | Default ATB Time Mode is Active, or the player chose Active. Check Wait Pause too. |
| Enemies act while I choose | Wait Pauses Enemies is off, or the mode is Active. |
| The back row does the same damage as the front | The ability is magic or has Ignores Row. Only melee physical damage is halved. |
| A command seems lost | It was queued and dropped when its turn came (the target fell with no replacement, or the unit lost its MP). The HUD message says why. |
| No flee option | The encounter has Can Flee off, or the menu layout has no list command with Include Flee ticked. |
| The turn order strip is missing | Only turn-based modes show it. ATB shows gauges. |
| Units overlap on the stage | Lanes Per Row or the spacing values are too small for your unit count. |
11.9 See also
- Battle fundamentals for encounters, objectives, rewards and the simulator.
- Abilities and statuses for ATB Rules, scope, charge time and action commands.
- Characters and party for formations, rows and Pact summons.
- Enemy AI and adaptive difficulty, Camera and battle presentation, User interface.
- Product page:
docs/product/encounter-editor.md.
12. Free Tactics (Live)
In short: Free Tactics is a turn-based battle mode that is fought right on the exploration map, with free movement in meters instead of grid tiles. There is no loading screen and no battle map: enemies notice the party, the camera lifts into a tactical view, and everyone fights from where they stand. Use it for modern party-tactics fights: cover, height, surfaces, doors, summons and a battlefield you can break.
12.1 Basics
12.1.1 What the player sees
- Being noticed. Enemies have a vision cone and hearing. A bar fills above their heads while they see or hear the party. When it is full, a ! appears and the battle starts. The bar empties again if the party gets out of sight. Sneaking makes the party harder to see and hear. Tall grass and shadows hide it even better.
- How the battle opens. There are three openings:
- They noticed you: normal initiative.
- You reached them unseen (from behind, sneaking): a surprise round. The party acts first and the enemies lose their first turn.
- They were waiting in ambush: the enemies act first and the party loses its first turn.
- A turn. The active character sees a soft outline on the ground that shows how far it can walk. Pointing at the ground shows the path and its length. Pointing at a target shows the damage, the chance to hit and the chance of a critical hit, with cover, height and flanking already counted. Walking and acting happen in any order until the turn's budget is spent or the player picks End Turn. Commands that cannot be used right now are dimmed and say why.
- Others join. Groups standing close to the fight join from the start. Enemies that walk past and notice the battle join at the start of the next round. Party members near the leader fight from where they stand.
- Running away. Flee works when no enemy that can see the character is within the escape radius. Fled units keep their HP. When everyone still standing has fled, the battle ends as an escape.
- The end. On victory, a banner lists experience, money and items, and the player keeps exploring from where they stand. On defeat, the Game Over screen offers Retry battle, which puts everything back as it was just before the fight.
12.1.2 Make a group fight in Free Tactics
- Select an Encounter Spawner in your level.
- In the Details panel, under Free Tactics, tick Free Tactics.
- Optional: tick Ambush so the group attacks first when it notices the party.
Or open an Encounter asset and set its Battle Mode to Free Tactics. Every spawner that uses it, and every trigger that starts it, then fights in Free Tactics. See Battle fundamentals for encounters and the battle mode override. A camp that should stand guard instead of wandering needs a Roaming Behavior whose Idle is Stand; Detection Speed on the behavior makes a group notice faster or slower.
12.1.3 Try it in two minutes
Open /RPGSagaEngine/Examples/Maps/L_RSE_StarterExample, press Play, open the console and type:
RSE.FreeTactics.Setup 16
A camp with walls, crates and tall grass appears 16 m in front of you. Walk toward it, or sneak around and strike from behind for a surprise round. RSE.FreeTactics.Setup 16 ambush makes the camp lie in ambush instead. These test commands are not in shipping builds. The map /RPGSagaEngine/Examples/Maps/L_RSE_FreeTacticsInterior is a two-floor house with stairs, a balcony, ladders, doors, windows and a basement. See Appendix C for every console command.
12.1.4 Hide a spot in tall grass or shadow
Place a volume over the grass and add the actor tag RSE.TallGrass (or RSE.Shadow). How much each tag hides is set in Project Settings → RPG Saga Engine → Stealth → Concealment Tags. You can add your own tags there.
12.1.5 Keep something out of the battle area
The battle area is measured from your level when the fight starts: walls, rocks and crates become cover. Any actor tagged RSE.FreeTacticsIgnore is left out (foliage, decorations, effects). The combat roles you give your assets decide what counts as full cover, half cover, rough ground or nothing at all (see Enemy AI and adaptive difficulty for the Combat Role Configurator).
12.2 How it works
Exploration (enemy notices party, or a trigger / dialog starts an encounter)
-> URSEFreeTacticsSubsystem gathers who takes part (the group, the called-for-help enemies, nearby party members)
-> ARSEFreeTacticsDirector captures the area into a navigation snapshot (meters, floors, cover, doors)
-> URSEFreeTacticsBattle (RSECore) runs the rules: turn order, budgets, commands, surfaces, objects, AI
-> the director shows the battle's events (camera, overlay, HUD, effects) and turns input into commands
-> victory / defeat / escape -> back to exploration, no transition
The rules run without a world. URSEFreeTacticsBattle is plain data and logic in RSECore, so the same battle runs in the headless battle simulator and in automated tests. The director in RSE only captures the area, presents the events and turns the player's input into commands.
Every decision is a command. A move, an ability, a flee, a door, a jump and End Turn are each one FRSEFreeTacticsCommand. The battle validates a command (ExecuteCommand) and either applies it or refuses it with an ERSEFreeCommandResult (not your turn, cannot reach, action rejected, cannot flee, cannot use door, cannot jump). Commands are plain serializable data, which is why the same battle can be saved, replayed and driven over the network.
Who decides is a Free Tactics Controller (URSEFreeTacticsController): the local player (a queued controller that waits for input), the companion AI or the enemy AI. You can swap controllers per team or per unit at any time.
Turn order is individual Charge Time by default (fast units act more often), with an optional team-based round mode. Turn budget is either one shared Action Point pool, or three separate budgets: movement in meters, an action and a bonus action (the default).
Determinism. Every random roll (a slip, a status) uses the battle's seed, so the same commands give the same battle.
12.2.1 Battle feel
A live battle should feel like a fight, not like a menu. The classic modes are not changed by any of it, and every piece can be turned off.
- The start. A ring spreads on the ground from the point where the party and the enemies met, time slows down for a moment, the enemies that noticed you turn toward the party and shout a short line, the HUD fades in and the music crossfades to the battle music. Nobody is teleported: a unit that stands where it cannot is nudged a few centimeters (Max Start Nudge).
- Every action at its pace. Each action plays in phases: wind-up (a spell charges with a magic circle and its area is marked on the ground), the action itself (a spell or shot flies to its target and the hit waits for it), impact (a flash, a few frames of hit-stop, the target flinches) and recovery. Defaults per kind of action (melee, ranged, spell, support, item) live in Battle Feel → Pacing, and a presentation asset or an ability can override them.
- Juice. Weapon trails, damage numbers tinted by element, looping effects while a status lasts, an optional impact shake and a camera that glides to the active character without close-ups.
- What the enemy is about to do. On an enemy's turn a small icon (attack, spell, heal, buff, debuff, item, summon, move, flee) shows over it for a moment before it acts, sometimes with a short line. The icons, colors and lines are in Battle Feel → Intent.
12.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEFreeTacticsBattle | RSECore | The rules and state of one battle: units, turns, budgets, surfaces, objects, doors, overwatch, flee |
FRSEFreeTacticsCommand | RSECore | One decision (Move, UseAction, EndTurn, Flee, Door, Jump) as plain data |
URSEFreeTacticsController | RSECore | Abstract, Blueprintable: decides commands for a unit or team (ProvideCommand) |
URSEFreeTacticsQueuedController | RSECore | A controller fed from outside; the local player and remote players use it |
URSEFreeTacticsAIController | RSECore | The enemy and companion AI (see Enemy AI and adaptive difficulty) |
URSECoverProvider | RSECore | Decides what cover a blocker gives; subclass to change the rules |
URSEFreeTacticsSettings | RSECore | Rules (Project Settings → Free Tactics), a rules-profile section |
URSEFreeTacticsFieldSettings | RSECore | Battlefield rules: surfaces, objects, pushes, jumps, falls |
URSESurfaceData | RSECore | Data asset: one ground surface (fire, water, oil...) |
URSEFieldObjectData | RSECore | Data asset: what a breakable or explosive object does when it breaks |
FRSEAbilityFreeTacticsRules | RSECore | Per-ability meters-based rules (range, area, cost, Overwatch) |
URSEFreeTacticsSubsystem | RSE | World subsystem that starts battles and gathers participants |
ARSEFreeTacticsDirector | RSE | The map director: captures the area, presents events, turns input into commands |
ARSESurfaceSpot | RSE | Placed actor that lays a surface when a battle starts |
ARSEDoor, ARSELadder, ARSEInteriorVolume | RSE | Doors, ladders and interior camera/battle-area volumes |
URSEPartyFieldSubsystem | RSE | The visible party: leader switching, formation, party orders |
URSEPartyCommandData | RSECore | Data asset: one party order |
URSEFollowerProfile | RSECore | Data asset: formation values and idle behaviors of followers |
URSEExplorationCameraSubsystem | RSE | The tactical exploration camera shared with battles |
12.4 Settings
Everything is in Project Settings → RPG Saga Engine. The groups that matter for Free Tactics:
| Group | What you tune |
|---|---|
| Free Tactics | Space (meters per tile, unit radius, start nudge), navigation (snapshot cell size, step limits, any-angle paths), turns (action model, movement meters, actions and bonus actions, turn order), combat (arcs, height bonus), cover, opportunity attacks, openings, joining, fleeing, summons, doors, the AI's weights. A rules-profile section, so zones and bosses may override it. |
| Free Tactics (Presentation) | Slow motion at the start, battle area size and growth, camera, ground overlay style, pace, victory banner, fallen enemies, texts. |
| Free Tactics Field | Surfaces, the reaction table, breakable objects, pushes, the fall damage curve, jumping, how much the AI cares about surfaces and barrels. A rules-profile section. |
| Free Tactics Field (Presentation) | How surfaces, explosions, cover shields, forecasts, lines of fire and cutaways look. |
| Free Tactics (Co-op) | Who commands unassigned units, turn timeout, guest pacing, pulling far players in. |
| Battle Feel | The entry, per-action pacing, juice, status visuals, intent icons and lines. |
| Stealth | Detection bar speeds, sneaking, hearing, concealment tags. |
| Party Field | Formation, follow distances, party orders. |
| Exploration | Camera style, tactical camera limits, camera input actions. |
| Camera Occlusion | What fades or hides in front of the party. |
Defaults worth knowing (all in Free Tactics):
| Setting | Default |
|---|---|
| Action Model | Movement + action + bonus action |
| Movement Meters (Fixed source) | 9 m per turn, 1 action, 1 bonus action |
| Turn Order | Individual (Charge Time) |
| Meters Per Tile | 1.5 m |
| Opportunity Attacks | Off. Reactions then come from Overwatch abilities. |
| Surprise Rounds | On |
| Call For Help Radius | 12 m |
| Party Join Radius | 20 m |
| Escape Radius / Escape Hidden Radius | 8 m / 3 m |
| Pursuit Leash Radius | 20 m |
| Summon Placement Range | 6 m |
| Doors in battle | On, a door costs a bonus action |
Every value is checked when you save (IsDataValid). For example the editor warns when the overlay material does not match the overlay style, or when the tactical camera's zoom limits are the wrong way round. See Appendix B for the full list.
12.5 Blueprint usage
12.5.1 Start a battle from a trigger or a dialog
- Event (Box Trigger overlap, or a dialog effect) → Get RSE Free Tactics Subsystem (a world subsystem node).
- Start Encounter Battle (Encounter =
DA_Encounter_Camp, Opening = Normal, Enemy Actors = the enemies standing in your level, Source = Self). - Branch on the returned Boolean: false means a battle cannot start now.
Start Group Battle does the same for a visible group of an Encounter Spawner (Spawner, Group Index, Opening). The opening is ERSEFreeOpening: Normal, Player Surprise or Enemy Surprise.
12.5.2 Ask what is going on
- Is Battle Active and Get Active Director on the subsystem.
- On the director: Get Battle, Is Awaiting Player, Get Input Mode, Get Unit Actor, Get Unit Id Of, Get Unit Name, Is Entry Playing.
- On the battle: Get Round, Is Surprised, Can Flee Battle, Check Flee, Has Escaped, Get Door Count, Is Door Open.
12.5.3 Write your own controller
- Create a Blueprint class from Free Tactics Controller.
- Override Provide Command (Battle, Unit Id → Out Command, return value). Fill the command (for example Make Move style: Type = Move, Unit Id, Point) and return true, or return false to wait.
- Optional: override On Command Rejected to react when the battle refuses a command.
- On the battle, call Set Team Controller (a team tag) or Set Unit Controller (a unit id).
12.5.4 Change the battlefield from a script
- Create Surface Circle (Creator Id, Data =
DA_Surface_Oil, Center, Radius, Duration Override) and Remove Surface. - Spawn Object, Damage Object (a barrel taking damage can explode).
- Check Jump and Preview From Destination for custom UI.
- Toggle Door and, on an RSE Door actor, Set Locked and Set Open.
12.5.5 Presentation events
The director exposes On Event Presented, On Callout (a bark or an intent over a unit), On Notice and On Custom Menu Command. Bind them in a HUD Blueprint. See Appendix A for every node.
12.6 C++ usage
Drive a battle from code, for example from a custom controller:
UCLASS()
class UMyHoldPositionController : public URSEFreeTacticsController
{
GENERATED_BODY()
protected:
virtual bool ProvideCommand_Implementation(URSEFreeTacticsBattle* Battle, int32 UnitId,
FRSEFreeTacticsCommand& OutCommand) override
{
// Never move: end the turn facing north.
OutCommand = FRSEFreeTacticsCommand::MakeEndTurn(UnitId, 0.f);
return true;
}
};
// Somewhere that owns the battle:
Battle->SetUnitController(UnitId, NewObject<UMyHoldPositionController>(Battle));
const ERSEFreeCommandResult Result = Battle->ExecuteCommand(
FRSEFreeTacticsCommand::MakeMove(UnitId, FVector(4.f, 0.f, 0.f)));
Start a battle from C++:
if (URSEFreeTacticsSubsystem* Free = URSEFreeTacticsSubsystem::Get(this))
{
Free->StartEncounterBattle(Encounter, ERSEFreeOpening::PlayerSurprise, EnemyActors, this);
}
Extension points:
URSEFreeTacticsController(C++ or Blueprint) for any decision logic.URSECoverProvider: subclass and set it in Free Tactics → Cover → Cover Provider. Or callSetCoverProvideron a battle.- Command-bus integration:
FRSEFreeTacticsCommandderives fromFRSECommand, so it travels through the same bus as the rest of the plugin (see Co-op and online). - Try the rules headless in the battle simulator: ``
UnrealEditor-Cmd.exe YourProject.uproject -run=RSEBattleSim "-Scenario=Plugins/RPGSagaEngine/Config/BattleSim/FreeTacticsSkirmish.json"``
12.7 Advanced
12.7.1 The battlefield
The ground itself takes part in the fight.
Surfaces. Fire, water, electrified water, ice, oil, poison, blood and steam lie on the ground as areas measured in meters and drawn on the real terrain. When two surfaces meet, or an attack of an element hits one, they react: fire on oil makes a bigger fire, lightning on water electrifies it, cold freezes water, fire melts ice, water puts fire out. Reactions can chain (burning oil reaches a barrel, the barrel explodes). The AI avoids harmful surfaces and likes to ignite oil or electrify the water its enemies stand in.
To make your own surface:
- Create an RSE Surface Data asset (or duplicate one of
/RPGSagaEngine/Data/Field/DA_Surface_*). - Give it a Zone Tag (for example
Zone.Tar), a name, a color and a Look (Liquid, Fire, Frozen, Oil, Toxic, Electric, Vapor). - Fill in what it does: Effects On Enter, Effects On Turn Start, Duration Turns, Move Cost Multiplier, Slip Chance, Slip Status and the Visual.
- Add its reactions in Project Settings → Free Tactics Field → Interactions: one row per pair (this surface + this element, surface or weather = that surface, or nothing to remove it).
- Let an ability make it with a Create Zone effect.
Surfaces already lying in the level. Place an RSE Surface Spot actor over a ford, a puddle of oil or a marsh and set its Surface. Scale its box to the area (or tick Circle). When a battle starts, every spot inside the battle area lays its surface. Duration Rounds 0 keeps it for the whole battle, -1 uses the surface's own duration. Outside battles the spot does nothing and is not drawn.
Breakable and explosive objects. Give a mesh the combat role Destructible or Explosive. The role sets the hit points, and its Break Object (a Field Object Data asset) sets the explosion's damage and radius, the surface it leaves and the effects it plays. Examples: DA_Object_ExplosiveBarrel, DA_Object_Crate. A broken object stops being cover.
Pushes, jumps and falls. Shove and every Knockback effect push a unit back in meters: into a wall it takes collision damage, off a ledge it falls and takes damage by height (the Fall Damage curve). Jump is a command next to Move that crosses gaps and climbs low ledges; it costs movement or the bonus action, as you set in Free Tactics Field → Jumping. Leap, Dash, Teleport and Swap work in meters too.
Reading the battlefield. Pointing at a spot you can walk to shows cover shields on the side of each enemy it covers from, plus the hit and critical chance each enemy would have against you there. A line of fire shows green when clear, yellow through cover and red where a wall blocks it. Roofs, upper floors and tree canopies tagged with the combat role Overhead (or an actor tag from Cutaway Tags) are cut away while the camera looks under them.
12.7.2 Abilities in meters and Overwatch
An ability without its own Free Tactics rules is converted from its Tactics rules (1 tile = Meters Per Tile). To tune it, open the ability and turn on Free Tactics Rules → Override: Action Cost, Action Point Cost, Min and Max Range, vertical tolerance, line of sight and trajectory (direct or arc), area shape (single, circle, cone, line), radius, falloff, uses per turn and whether it ends the turn.
Overwatch (a stance) is set in the same struct. Tick Overwatch → Enabled on an ability: using it puts the unit on watch until its next turn. The first enemy that enters, or moves within, its watch Range is answered at once with the Response ability at Damage Factor (0.7 by default). By default it spends the rest of the turn and ends it. Overwatch is how reactions come into the live mode while Opportunity Attacks stays off.
If you turn Opportunity Attacks on, a unit that walks out of an enemy's melee reach provokes a strike. The traits Trait.Reaction.OpportunityAttack and Trait.Reaction.NoOpportunityAttack (on a class, character, equipment or status) decide for their unit whatever the setting says.
12.7.3 Summons
Summons appear where the summoner points. The ground shows every legal spot (within Summon Placement Range, standable, with room for the creature, not on anybody, in the summoner's sight). A refused spot says why. A big creature takes more room: set Summon Footprint Radius on the Pact, or Footprint Radius on the Summon Units effect.
12.7.4 Inside buildings
The battle map is measured with every floor of every spot, so units can fight on a balcony over the yard, a bridge, a basement.
- Stairs made of separate steps: tag each step
RSE.Floor. Ramps and wide stairs need no tag. - Ladders: place an RSE Ladder, move its Bottom Point and Top Point widgets onto the two floors it joins.
- Doors: place an RSE Door. In exploration the player opens it with the interact button. In battle a unit next to it opens or closes it (Open Door / Close Door). A closed door blocks the way and line of sight; a locked one does not open. Enemies open a door when it is the only way to the party.
- Windows: a gap in a wall that units can see and shoot through but not walk through. A glass pane that should block the way but not the view takes the tag
RSE.Window. - Interior Volumes: place an RSE Interior Volume over each building, cave or room. Inside it the exploration camera moves closer (or, with Fixed Angle, keeps a fixed rotation for a classic pre-rendered room look). A battle that starts inside measures only the volume (plus Battle Area Margin) and uses the volume's Battle Camera. The highest Priority wins where volumes overlap.
Each floor needs its own collision (one slab per actor or per component): one mesh holding several floors is read as its top floor only.
12.7.5 The visible party
Outside battle the party walks behind the leader in formation. Switch Leader and Party Command are input actions in Project Settings → Exploration. Party Command opens a radial menu of orders (Search here, Open / unlock, Guard here, Come to me, Stay, Scout ahead). Each order is a Party Command Data asset (requirements, chance of success with a bonus for preferred classes, effects on success and on failure, the noise of a failure, texts), added in Project Settings → Party Field → Commands. Members keep a loose place that drifts, close up in corridors, stroll and play idle animations when the leader stands still. That comes from a Follower Profile asset (formation values and a weighted list of idle behaviors with cooldowns). Add a behavior by adding an entry, or by subclassing RSE Idle Behavior (URSEIdleBehavior) in Blueprint. RSE Idle Spot actors give them benches and walls to use.
In Blueprint, the party field subsystem offers Cycle Leader, Set Leader, Follow, Stay, Refresh Followers and Toggle Command Menu.
12.7.6 The exploration camera
Outside battle the party is seen from above at a tactical angle, and the same camera runs the battles, so a fight starts with the camera simply taking over. Zoom, tilt, turn and pan are all player-controlled (and rebindable in Options). Walls and trees fade only where they hide a character:
- materials with the fade function show a soft dithered circle around the hidden character;
- any other mesh turns into a ghost (
M_RSE_CameraOcclusionGhost) while it covers enough of a character; - hiding is the last resort.
To add the exact fade to your own materials, select them in the Content Browser, then right click → RPG Saga: Add Camera Occlusion Fade (and RPG Saga: Remove Camera Occlusion Fade to undo). The tool changes only materials under Camera Occlusion → Opt In Content Roots (/Game/ by default) and keeps backups in Saved/RSE/CameraOcclusionBackups/. Tag an actor RSE.NoFade to keep it from ever fading, and RSE.Ground for ground meshes. Place an RSE Exploration Camera (Level) actor to give one level its own camera style or limits (a town can keep the classic close third-person camera while the rest of the game uses the tactical one). In Blueprint, Get Camera Style, Set Camera Style and Clear Camera Style on the exploration camera subsystem switch it live. See Camera and battle presentation.
12.7.7 Co-op
Free Tactics is host-authoritative. The host's battle owns the rules; guests present the host's events and send commands for the units they play. Settings in Project Settings → Free Tactics (Co-op):
- Companion Units: party units that no player plays are commanded by the AI (default) or by the host.
- Turn Timeout Seconds (45 s) and Turn Timeout Action: when a guest does not answer in time, the host takes over (default), the AI plays the turn, or the battle waits.
- Guest Playback Wait Max, Catch Up Backlog, Catch Up Playback Rate: the host waits for guests to show the events so far, but never longer than the limit; a guest that falls behind plays the backlog faster.
- Pull In Far Players: players farther than Party Join Radius are brought next to the leader with a short fade.
- Reconnect Retakes Unit At Once: a player who reconnects gets their unit back immediately, or watches until the battle ends.
Single-player games read none of this. See Co-op and online.
12.7.8 Performance notes
The navigation snapshot cell size (Snapshot Cell Size, 0.25 m) trades path detail against memory and capture time; raise it for large battle areas. Max Search Cells guards path searches. The AI samples AI Candidate Positions per decision, so lower it on weak hardware. Nothing in the mode needs Tick outside an active battle.
12.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The group never starts a Free Tactics battle | The encounter's Battle Mode is not Free Tactics, or the spawner's Free Tactics box is off | Set the Battle Mode on the Encounter, or tick Free Tactics on the spawner |
| Units stand inside a wall at the start | The wall was captured as walkable, or has no collision | Give it collision and a combat role (Full cover or Obstacle) |
| Foliage or a decoration blocks movement | It was captured as an obstacle | Tag the actor RSE.FreeTacticsIgnore, or give it the Neutral decoration role |
| Units on different floors block each other, or the upper floor is not walkable | One mesh holds several floors | Split the floors into separate slabs, one per actor or component |
| Stairs cannot be climbed | Steps are separate narrow meshes | Tag each step RSE.Floor, or raise Max Step Up a little |
| Flee is dimmed ("Enemy near") | A seeing enemy is within Escape Radius | Walk away first, or use Escape Rounds for a delayed escape |
| Flee does nothing for a boss | The encounter's Can Flee is off | Turn it on, or keep the boss unfleeable on purpose |
| No opportunity attacks | Opportunity Attacks is off by default | Turn it on in Free Tactics, or give abilities an Overwatch stance |
| A surface does not react | No row in Free Tactics Field → Interactions for that pair | Add the row |
| A wall hides the party instead of fading | The mesh is translucent or not a mesh | Add the fade to its material, or tag it for a ghost; see the camera tool above |
| A battle in a house shows the wrong camera | Two volumes overlap with equal priority | Raise the Priority of the one that should win |
12.9 See also
- Battle fundamentals for encounters, rewards and the simulator.
- Grid Tactics for the grid mode that shares abilities and Action Points.
- Enemy AI and adaptive difficulty for how enemies choose.
- Exploration for stealth, encounters on the map and reinforcements.
- Co-op and online for the network model.
- Product pages in
docs/product/:free-tactics.md,combat-roles.md,coop.md.
13. Action battles
In short: Action battles are fought live. The player swings a sword, rolls, guards, parries, aims a gun or casts a spell, and the enemies do the same, all on the party, classes, abilities, items and statuses you already built for the other modes. Use it for a sword game, a shooter, or a hybrid. The fight happens where the party stands (in a bounded arena or in the open), alone or in co-op.
13.1 Basics
13.1.1 What an action battle is
An encounter is an action battle when its Battle Mode is Action (Battle.Mode.Action). Nothing else about the encounter changes: enemies, levels, rewards, loot and story effects are the same fields as in any other encounter. Start it like any battle: a story effect that starts an encounter, or an Encounter Trigger with its Action Encounter set (walk in and the battle starts where the party stands).
Every action battle is framed one of two ways (a rule of its rules profile):
| Framing | What the player sees | How it ends |
|---|---|---|
| Bounded (default) | A combat area with a banner and a ring on the ground, then a results screen | The enemies fall, the party falls, or every party member stays outside the area for a few seconds (fled) |
| Open | No results screen: loot appears as toasts and the world carries on | The enemies fall, the party falls, or the party gets far enough from every enemy for long enough (fled) |
Bounded fits arenas, bosses and set pieces. Open fits roaming enemies in a living world. Victory and defeat use the same objectives as every other mode. Defeat shows the game over screen, and Retry puts everyone back where they stood. There is no saving during a battle, as in every mode.
13.1.2 Three presets
All numbers of the mode are one settings section, Action Battle, and also a section of every rules profile. Three presets set every number to a starting point (Apply Preset on the section, or one of the shipped rules profiles):
| Preset | Profile | Feel |
|---|---|---|
| Melee | DA_Rules_Action_Melee | Cooldown abilities, guard and parry, 0.3 s of i-frames on a dodge |
| Shooter | DA_Rules_Action_Shooter | Cooldown abilities, no guard or parry, a short roll, strong aim assist, long lock-on |
| Hybrid | DA_Rules_Action_Hybrid | A gauge that hits fill and abilities spend (no cooldowns), guard and parry |
The Game Foundation can also start a project as an action game: the presets Action: Swords and Action: Shooter (Studio → Foundation) turn the Action mode on, write the matching preset into the Action Battle rules and make Action the mode new battles start with. See Game foundation and archetypes.
13.1.3 Your first action battle
- In RPG Saga Studio, open World → New Action Battle.
- Pick a preset, a bounded area (with its radius) or an open fight, the enemies, and optionally a weapon per class.
- Press Simulate. The real-time AI plays quick headless battles on both sides and tells you how fair the fight is (Easy, Fair, Hard, Very hard).
- Press Create. The wizard makes the Action encounter, plus a small rules profile if the framing or the area differs from the preset. It can place an Encounter Trigger in front of the camera.
- Play. The example map
/RPGSagaEngine/Examples/Maps/L_RSE_ActionArenahas a Melee, a Shooter and a Hybrid encounter.
If a character has no weapon, everyone punches: link an Action Weapon from the character's equipment, or set a Default Weapon in the rules.
13.1.4 Default controls
All keys are remappable in Project Settings → Action Battle (Presentation) → Input, or give your project its own Input Mapping Context.
| Action | Keyboard and mouse | Gamepad |
|---|---|---|
| Light attack / fire | Left mouse | Right trigger |
| Heavy attack | F | Right shoulder |
| Aim | Right mouse | Left trigger |
| Guard | Q | Left shoulder |
| Parry | E | Top face button |
| Dodge | Space | Right face button |
| Lock on | Middle mouse | Right stick click |
| Next / previous target | Mouse wheel | D-pad right / left |
| Switch character | Tab | D-pad up |
| Reload | R | Left face button |
| Party orders | G, then 1 to 5 |
13.2 How it works
Encounter (Battle Mode = Action) starts where the party stands
-> URSEActionBattleSubsystem::StartEncounterBattle spawns the director
-> ARSEActionBattleDirector builds a URSEActionBattle (RSECore) and binds each character
-> input -> URSEActionControlsComponent -> FRSEActionCommand -> URSEActionBattle::ExecuteCommand
-> the battle steps at a fixed rate (Step Seconds): phases, stamina, poise, cooldowns, projectiles
-> hits are claimed by the presentation (animation windows, traces, projectile actors); the host validates every claim
-> events -> URSEActionCombatComponent plays montages, effects and hit reactions; the HUD follows
The simulation is separate from the picture. URSEActionBattle in RSECore advances in fixed steps (StepSeconds, 1/30 s by default), so a seed replays exactly and the battle can run headless in the simulator and in tests. The presentation in RSE moves characters, plays animation, claims hits and draws the HUD.
Every action has phases. Windup (telegraphed), Active (it can hit now), Recovery. Dodges have i-frames. Guarding reduces damage and drains stamina, and a block that runs out of stamina is a guard break. A parry is a timed guard that staggers a melee attacker. Poise absorbs hits until the unit staggers.
Hits are claimed, then checked. The character's attack opens a hit window (from an RSE Action Hit Window animation notify state, or from the action's own timing). The presentation claims what the attack touches. The battle accepts a claim only if the action exists, it is inside the active window (plus a latency tolerance), within reach (plus a tolerance), and only once per victim. This is the same check that keeps co-op honest.
Abilities in real time. Every ability you already have works at once. Without its own Action rules, an ability gets derived rules from its other data: self abilities stay on the caster, allies are healed or buffed directly, enemies within a tile or so are melee, enemy areas become areas (tiles times meters per tile), everything else is a projectile. Damage, element, statuses, shields, reactions and costs remain the ability's shared data, so the same effects resolve in every mode. Statuses run on a per-unit clock (Seconds Per Turn is "one turn").
Ability pacing is one big choice (Ability Pacing in the rules): Cooldown (each ability has a cooldown), Gauge (hits dealt, hits taken and parries fill segments, abilities spend them) or Resource Only (MP and similar, no cooldowns).
13.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEActionBattle | RSECore | The rules and state of one battle: units, phases, stamina, poise, cooldowns, projectiles, claims |
FRSEActionCommand | RSECore | One decision (attack, ability, dodge, guard, ...) as plain data |
URSEActionRules | RSECore | Rules (Project Settings → Action Battle), a rules-profile section |
URSEActionWeaponData | RSECore | Data asset: a weapon with combos, fire modes, block and parry permissions |
URSEActionComboData | RSECore | Data asset: a chain of combo steps (power, windup, windows, hitbox, montage section) |
FRSEAbilityActionRules | RSECore | Per-ability real-time rules (ActionRules on an ability) |
URSEActionAIRules | RSECore | Real-time AI numbers (Project Settings → Action AI) |
URSEActionAIController | RSECore | The real-time AI for enemies and companions nobody plays |
URSEActionBattleSubsystem | RSE | World subsystem: starts action battles, finds the active director |
ARSEActionBattleDirector | RSE | The presenter of one battle (Blueprintable, not placeable): flow, hits, HUD, camera |
URSEActionCombatComponent | RSE | "RSE Action Combat": what a character does in an action battle |
URSEActionControlsComponent | RSE | "RSE Action Controls": the player's input, lock-on, party orders, switching character |
ARSEActionCameraRig | RSE | The action camera (combat, aim and lock-on profiles) |
ARSEActionProjectileActor | RSE | The projectile actor (Blueprintable) |
URSEAnimNotifyState_ActionHitWindow | RSE | Animation notify state that opens a hit window |
URSEActionPresentationSettings | RSE | Presentation settings (Project Settings → Action Battle (Presentation)) |
URSEActionHUDWidget | RSE | The action HUD |
The shipped weapons live in /RPGSagaEngine/Data/Action: Sword, Dagger, Greatsword, Rifle, Pistol, Shotgun, Bow, Staff and Gunblade. Make your own by duplicating one. The Studio never edits the shipped ones.
13.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Action Battle | Every rule of the mode: time step, stamina, dodge, guard, parry, poise, ability pacing and gauge, framing, movement, targeting and aim assist, input buffer, items, derived ability rules, network tolerances, simulator. Also a rules-profile section. |
| … → Action AI | Think rate, positioning, reactions, stamina habits, party orders. Also a rules-profile section. |
| … → Action Battle (Presentation) | Encounter flow, hits, weapon visuals, feel (hit-stop, shake, afterimages), camera profiles, targeting, input, HUD. |
| … → Features → Action Combat | Switches the whole mode off. Action encounters then refuse to start. |
| … → Battle → Default Encounter Mode | The mode new battles start with in the wizards. |
Defaults worth knowing (Action Battle rules):
| Setting | Default |
|---|---|
| Step Seconds | 1/30 s |
| Seconds Per Turn | 5 s |
| Stamina Max / regen | 100 / 35 per second (after a 0.8 s delay) |
| Dodge | 25 stamina, 0.5 s, 0.3 s of invulnerability |
| Block Damage Multiplier | 0.25, Block Angle 140 degrees |
| Parry Window | 0.2 s |
| Poise Max | 100 |
| Framing | Bounded, Bounded Area Radius 25 m, Leave Area Seconds 3 |
| Lock On Range | 20 m |
| Input Buffer Seconds | 0.15 s |
Every number is validated (URSEActionRules::Validate). See Appendix B for the full list.
13.5 Blueprint usage
13.5.1 Start an action battle from a script
- Event (Box Trigger overlap, or a dialog effect) → Get RSE Action Battle Subsystem.
- Start Encounter Battle (Encounter = a Battle Mode = Action encounter, Enemy Actors = the enemies standing in the level, Source = Self).
- Branch on the returned Boolean.
For no-script setups, place an Encounter Trigger and set its Action Encounter. The trigger's validation warns if a Tactics or ATB director is also set, or if the encounter's mode is not Action.
13.5.2 Ask what is going on
- On the subsystem: Is Battle Active, Get Active Director.
- On a character's RSE Action Combat component: Find Action Combat (static, from an actor), Is In Action Battle, Get Unit Id, Get Director, Is Hit Window Open, Get Muzzle Location, Get Character Mesh.
- On the player's RSE Action Controls component: Find Action Controls (from a player controller), Is Action Input Active, Get Controlled Unit, Get Lock Target, Get Soft Target, Is Aiming, Is Guarding, Get Selectable Abilities, Get Selected Ability.
13.5.3 Drive the controls yourself (custom input, touch, scripted scenes)
- Press Input (Input = Light Attack, Heavy Attack, Aim, Guard, Parry, Dodge, Lock On, Next Target, Previous Target and so on, Pressed = true or false).
- Add Look (Yaw Degrees, Pitch Degrees), Toggle Lock On, Lock On Unit, Switch Target.
- Issue Party Order (Order = Free, Follow, Attack My Target, Hold Position, Defend Me), Cycle Party Order, Switch Character.
13.5.4 React to what happens
Bind On Action Event on the RSE Action Combat component (one battle event about this character: it acts, it is hit, it guards...), On Hit Claimed (a hit of this character's attack was claimed), or On Battle Event on the director. A Blueprint character that wants to play its own animations turns Play Action Anims off and plays montages from On Action Event.
13.5.5 Add hit windows to your animations
In a montage or animation, add an RSE Action Hit Window notify state across the frames where the weapon is dangerous. Without it, hits come at the action's timing, which still works but ignores the animation.
13.6 C++ usage
Start a battle and read a character's combat state:
if (URSEActionBattleSubsystem* Action = URSEActionBattleSubsystem::Get(this)) // via the world
{
Action->StartEncounterBattle(Encounter, EnemyActors, /*Source*/ this);
}
if (URSEActionCombatComponent* Combat = URSEActionCombatComponent::FindActionCombat(Character))
{
if (Combat->IsInActionBattle() && Combat->IsHitWindowOpen())
{
// A custom effect while the weapon is dangerous.
}
}
Feed input to a custom pawn without the stock input mapping:
if (URSEActionControlsComponent* Controls = URSEActionControlsComponent::FindActionControls(PlayerController))
{
Controls->PressInput(ERSEActionInput::Dodge, true);
Controls->PressInput(ERSEActionInput::Dodge, false);
}
Extension points:
- A Blueprint or C++ child of
ARSEActionBattleDirector(set in Action Battle (Presentation) → Flow → Director Class) adds its own reactions to the stock presenter. - A child of
ARSEActionProjectileActor(Hits → Projectile Class) gives projectiles their own mesh, trail and impact. - An ability can use custom logic classes as in every mode (see Abilities and statuses).
- Subclass
URSEWeaponPresentationBasedata (an action weapon's Weapon Presentation) to change how a weapon looks when it swings or fires (see Weapons).
13.7 Advanced
13.7.1 Weapons and combos
A weapon is a RSE Action Weapon Data asset, linked from an equipment item (Action Weapon on the item). Units without one use the rules' Default Weapon; units with neither fight with their basic attack and derived rules.
A weapon has:
- a Light Combo and a Heavy Combo (
URSEActionComboData): chains of Steps. Each step names an ability, a Power Multiplier, Windup, Active Time and Recovery, a Combo Window (pressing Attack inside it chains the next step; pressing a little early is buffered), a Cancel Window Start (dodge or guard may cancel from there), Stamina Cost, Poise Damage, an optional own Hitbox and a Montage Section name. A combo can Loop; - Fire Modes for ranged weapons: delivery (hitscan or projectile), ability, fire interval, burst count, automatic, pellets per shot (shotguns), base spread, spread per shot, recoil, magazine size, reload time, an Ammo Item, range with falloff, projectile speed, radius, gravity and pierce. The Light input fires when a weapon has no light combo, and the Heavy input likewise;
- Can Block and Can Parry permissions, and an optional Block Damage Multiplier override;
- a Weapon Presentation (soft reference), and a Melee Hitbox.
13.7.2 Per-ability real-time rules
On an ability, Action Rules → Override lets you set the delivery (melee, projectile, hitscan, area, direct, self), the hitbox, windup, active time, recovery, cancel window, cooldown, stamina, gauge cost, poise damage, reach, projectile speed, radius, gravity, homing and pierce. Leave it off and the derived rules from the rules asset's Derived Ability Rules apply (melee range 2.2 m, windup 0.35 s, recovery 0.45 s, a cooldown from a base plus the resource cost).
13.7.3 The AI
Enemies, and companions nobody plays, are driven by URSEActionAIController: one real-time AI with the same intelligence dial (0 to 1) as the other modes. It thinks on a throttled cadence (0.6 s at intelligence 0 down to 0.25 s at 1, staggered across units), scores options with the shared utility brain plus real-time terms (travel time, windup to interrupt, stamina reserve), samples where to stand (rings, distance, danger, flanking, cover, line of sight, retreat, the combat area), and has a reactive layer that answers telegraphs and incoming projectiles with a parry, a block or a well-timed dodge. The reaction chance runs from 5 percent at intelligence 0 to 90 percent at 1, and reaction time and timing error follow it. Combat roles act in real time: tanks intercept and guard, snipers keep their range, controllers disable first, supports heal and buff, berserkers press. See Enemy AI and adaptive difficulty.
13.7.4 Party orders
Companions follow live orders: Free, Follow, Attack My Target, Hold Position, Defend Me. The order wheel opens on G (or keys 1 to 5). Switch Character hands control to another member, and the one left behind is driven by the AI with its order. Orders go through the command bus, so Co-op Rules → Companion Orders decides who may order whom.
13.7.5 Camera and feel
The camera has three profiles (Combat Camera, Aim Camera, Lock On Camera) with a collision probe and a trauma shake, blended over Camera Blend Seconds. Feel settings give hit-stop (their own time only, never the world's, so co-op is safe), shake on hits dealt, taken and heavy, dodge afterimages, bursts for hit, block and parry, a muzzle flash and a shot color. See Camera and battle presentation.
13.7.6 Finishers
A kill or stagger by a player can play a finisher, a paired animation between attacker and victim from the Animation & FX Library's paired clips. Players choose Off, Sometimes or Always in Options → Finishers. It never changes who wins and is skipped when no pair fits. See Character visuals and animation.
13.7.7 Co-op
The host runs the battle. Guests see it live and claim the hits of their own character. Hit claims are validated by the host (the action, the active window plus a latency tolerance, the reach plus a tolerance, once per victim). The tolerances, the position history length and the mirror rate are rules (Network section of Action Battle), and a guest's predicted dodge is smoothed rather than snapped (Dodge Reconcile settings). Action encounters stay live in co-op; they are never converted to turn-based. See Co-op and online.
13.7.8 Make a sword game or a shooter
A sword game:
- Foundation preset Action: Swords.
- Give each class a weapon: duplicate Sword, Dagger or Greatsword, tune the combo steps, link it from an equipment item.
- Build an animation style in the Animation & FX Library, apply it to your characters, then run Dress My Abilities so combo, dodge, block and parry clips fill the action animation slots.
- New Action Battle: Melee, bounded area, enemies, Simulate until it reads Fair, Create.
- Tune the feel: parry window, dodge i-frames, poise, stamina.
A shooter:
- Foundation preset Action: Shooter.
- Choose Rifle, Pistol, Shotgun or Bow. Set Ammo Item on the fire modes for a limited reserve.
- Put cover in your level (the simulator scatters its own from Sim Cover Count).
- New Action Battle: Shooter, an open fight for roaming enemies, Simulate.
- Tune aim assist, lock-on range and HUD layout.
A game that mixes both uses the Hybrid preset.
13.7.9 Performance notes
The component adds no Tick outside a hit window, a dodge or a hit-stop. The AI thinks on a throttle and a stagger, so a big crowd never decides on the same step. Lower Position Directions and Position Rings in Action AI on weak hardware.
13.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The battle does not start | Features → Action Combat is off, or the trigger's Action Encounter is empty | Turn the feature on, set the encounter |
| The trigger reports an error | A Tactics or ATB director is set as well, or the encounter's mode is not Action | Clear the director, set Battle Mode to Action |
| Everyone punches | The unit has no weapon | Link an Action Weapon from its equipment, or set Default Weapon in the rules |
| No animations, but hits land | There are no action clips | Build a style and run Dress My Abilities |
| Hits feel ignored by the animation | No RSE Action Hit Window notify state | Add the notify state to the montage |
| Fights are too easy or too hard | Enemy levels or the AI floor | Simulate in the Studio, then adjust levels or the AI floor in Action AI |
| Shots start at the wrong place | No Muzzle socket | Add a socket named like Muzzle Socket on the mesh, or change the property on the component |
| The player cannot guard | The weapon forbids it, or guard is off | Check Can Block on the weapon and Guard Enabled in the rules |
13.9 See also
- Battle fundamentals for encounters, rewards and the simulator.
- Abilities and statuses for the shared ability data.
- Weapons and Camera and battle presentation.
- Enemy AI and adaptive difficulty and Co-op and online.
- Product pages in
docs/product/:action-combat.md,weapons.md,coop.md.
14. Enemy AI and adaptive difficulty
In short: Every enemy (and every companion nobody plays) fights with an AI profile: a small data asset that says what the unit goes after. One utility AI serves every battle mode. A single number per mode, the intelligence (0 clumsy, 1 sharp), says how well it does it, and adaptive difficulty moves that number slowly from how the player is doing. Boss phases, team roles, rules and scorers make special enemies without code. If you already have Behavior Trees or StateTrees, nodes let them ask the utility AI what to do.
14.1 Basics
14.1.1 The idea: profile plus intelligence
- The profile (
URSEAIProfile, assets namedDA_AI_*) is what the unit wants: damage, kills, healing, statuses, safety, distance, protecting allies. - The intelligence is how well it pursues that. At low values it sometimes picks the second or third best move (plausible mistakes, never stupid ones), forgets weaknesses, ignores danger and rarely coordinates. At high values it uses weaknesses, focuses fire, guards its team, anticipates and (in the live modes) answers telegraphs with a well-timed dodge.
- The player never chooses a difficulty. The game starts at "Medium" (0.5) and adapts the enemies' intelligence only, never their stats or the rewards. Player progress (level, gear) always counts.
The same profile drives grid Tactics, Free Tactics, ATB, turn-based and Action battles. Each mode has an adapter that turns the shared scoring into its own commands.
14.1.2 Pick a ready style
- RPG Saga Studio → New enemy, step Abilities and AI: pick a style card. Each card has a one-line description.
- Want something else? Studio → New AI style (or Configurator → Tools → AI Profile Preview → New AI style...):
- pick a base style (the Boss tab lists the boss styles);
- name it, choose its team role and move the sliders;
- check the curves over intelligence;
- Simulate: your starting party fights test enemies that play the new style, then the base style;
- Create. The profile appears in the New Enemy wizard's list.
The ready styles:
| Style | Role | What it does |
|---|---|---|
| Berserker | Damage | Charges the nearest foe and never backs off; hits harder the more hurt it is |
| Sniper | Damage | Shoots from as far as it can and backs away from anyone who closes in |
| Summoner | Support | Calls its creatures first and stays safely behind them |
| Tank | Tank | Stands between enemies and its fragile allies, taunts, guards, blocks corridors |
| Controller | Controller | Sleeps, slows and weakens before dealing damage; casters and healers first |
| Coward | None | Weak hitter that runs away when hurt |
| Healer | Support | Keeps allies alive: raises and heals first, buffs, stays out of reach |
| Skirmisher | Damage | Darts in to strike from the side, then pulls back |
| Ambusher | Damage | Holds position until a foe is within reach, then strikes hard |
| Pack Hunter | Damage | Every member goes for the same prey until it falls |
Older profiles (Aggressive, Cautious, Guardian, Hunter, Support, Trickster) stay available. Boss styles are a profile plus phases: Juggernaut, Summoner Lord, Phase Shifter, Glass Cannon Caster, Enrage Timer and Duelist. They use only plugin content, so they work in an empty project. Replace the abilities and summons with yours.
14.1.3 Bosses and phases (no code)
A boss profile has Phases, entered in order at safe points (before any AI decision). In the AI Style wizard's Boss tab each step is one phase:
- When: HP below a percentage, an own turn count, a number of allies down, or custom conditions.
- Then: a banner and a line, statuses gained or removed, abilities gained or lost, units that join (count, how many turns), a new behavior (profile), a second wind (HP restored to a percentage), a cinematic.
Everything else of a phase (extra triggers, rules) stays editable in the profile. Create writes DA_AI_<Name> in your project. Creating again with the same name updates the profile in place, so enemies using it keep it. Plugin styles are never changed.
14.1.4 Set per-encounter limits
On an Encounter asset, Min Intelligence and Max Intelligence bound what adaptive difficulty may do for that fight. A boss with Min Intelligence 0.7 never drops below 0.7, however poorly the player does. To pin a fight at one value, set both to it.
14.2 How it works
Battle starts
-> URSEDifficultySubsystem::BeginBattle resolves the intelligence for the mode and encounter
-> each AI turn: the mode's adapter builds options (abilities x targets x positions)
-> the shared utility brain scores them: profile weights (curves over intelligence) + rules + scorers + role terms
-> "decision quality" noise: at low intelligence the 2nd or 3rd best option may win
-> the Decision Policy (optional Blueprint) may override the choice
-> the mode turns it into a command (Free Tactics, Tactics, ATB, turn-based or Action)
Battle ends
-> URSEDifficultySubsystem::RecordBattle measures it and nudges the intelligence for that mode
14.2.1 Utility scoring
Every option gets a score from the profile's weights. A weight is an FRSEAIScalar: a constant, a range over intelligence (Min at 0, Max at 1) or a curve. Weights include damage, kill bonus, flanking, status value, healing, danger avoidance, preferred distance, protecting allies, retreat HP, resource cost, and the intelligence knobs: Decision Quality, Weakness Knowledge, Danger Awareness, Focus Fire, VIP Focus, Pact Awareness, Charge Interrupt and Resource Management. Gates switch whole behaviors (flanking, protecting the support, combos) on only from a given intelligence. Global numbers (the noise temperature at low and high intelligence, focus-fire weight, item use penalty, summon value) are in Project Settings → AI.
14.2.2 Team roles
A profile's Role gives the unit team behavior in every mode:
| Role | Behavior |
|---|---|
| Tank | Holds the line: stands on the enemy's way to a fragile ally (support, controller, VIP, a healer, a badly hurt ally), prefers taunts and guards allies the enemy can reach |
| Damage | Goes for kills (a likely kill is worth more) and high-value targets: dangerous enemies, casters, healers |
| Controller | Disables and debuffs before raw damage, casters and healers first, areas that catch several enemies |
| Support | Heals, plus buffs on allies enemies can reach; the others guard it |
Only the weights of the unit's own role apply (the Team Role category of the profile).
14.2.3 Rules and scorers
- Rules (
FRSEAIRule, "gambits") are ordered if-then entries evaluated inside the pipeline. When every condition holds they Force an action, add a score Bonus or Forbid abilities. Each can apply only within an intelligence band. - Scorers (
URSEAIScorer) are extra considerations added to every ability option: weight times a raw value. Built in: Target Status, Target Missing HP, Target Threat, Target Is Caster Or Healer, Preferred Range, Ally Needs Protection, Area Value and Setup Combo. - Conditions (
URSEAICondition) are small tests used by rules and phases: Health, Resource, Attribute, Weak To Element, Has Status, Enemies In Range, Unit Count, Turn Number, Phase, Intelligence, Target Is Focus, Not, Any Of, and use conditions such as Has Tag, Equipped, Row, Position, Identity, Battle Mode and Story.
14.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEAIProfile | RSECore | The AI profile data asset: weights, gates, role, rules, scorers, phases, last stand, decision policy |
FRSEAIScalar | RSECore | A value that may change with intelligence (constant, range or curve) |
FRSEAIRule | RSECore | One if-then rule |
FRSEAIPhase | RSECore | One boss phase |
URSEAICondition, URSEAIScorer | RSECore | Abstract, Blueprintable extension points |
URSEAIDecisionPolicy | RSECore | Abstract, Blueprintable: the last word on every decision |
URSEAIBattleBrain | RSECore | The AI state of one battle: phases, team blackboard, debugger records |
URSEFreeTacticsAIController, URSEActionAIController | RSECore | Mode controllers for Free Tactics and Action |
URSEAISettings | RSECore | Global AI numbers (Project Settings → AI), a rules-profile section |
URSEDifficultySubsystem | RSECore | Game-instance subsystem: owns the adaptive state, resolves intelligence, records battles |
URSEDifficultySettings | RSECore | Project Settings → Difficulty |
URSEAIStyleLibrary | RSECore | Blueprint/Python helpers behind the AI Style wizard |
URSEAIInterop | RSE | Shared logic of the Behavior Tree and StateTree nodes |
URSEActionInterop, URSEActionAgents | RSE | Action battle side of the interop, and finding an actor's action agent |
URSECombatRoleRegistry, URSECombatRoleSettings | RSECore | What your props mean in battle (cover, obstacles, ...) |
14.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → AI | Candidate limits (Max Move Candidates), noise (Noise Top Options, temperature at min and max intelligence), danger awareness floor, focus fire, VIP multiplier, ATB charge interrupt, item penalties, revive and summon value |
| … → Action AI | Real-time numbers: think rate, positioning, reactions, party orders (see Action battles) |
| … → Free Tactics → AI | Candidate positions, cover, height, spacing, overwatch and opportunity risk weights, single move, jumps |
| … → Difficulty | The adaptive controller (below) |
| … → AI Debugger | The in-game debugger |
| … → Combat Roles | Roles, suggestions, registries |
14.4.1 Adaptive difficulty settings
Tactics and ATB each have their own intelligence and their own history, so an ATB fight never moves the Tactics value (the turn-based modes use the ATB value).
| Setting | Default | Meaning |
|---|---|---|
| Enabled | on | Off: the encounter's own intelligence is used and nothing is recorded |
| Tactics / ATB → Start Intelligence | 0.5 / 0.5 | "Medium" at a new game |
| Tactics → Target / Worst Turns Per Enemy | 4 / 10 | Tempo that counts as "even" and as "struggling" |
| ATB → Target / Worst Turns Per Enemy | 3 / 8 | The same for ATB |
| Min / Max Intelligence | 0.15 / 1 | Global limits |
| Window Size | 5 | Battles averaged per mode |
| Min Battles To Adjust | 3 | Battles needed before the first change |
| Gain | 0.2 | Speed of adjustment |
| Dead Zone | 0.05 | Distance from "even" that changes nothing |
| Max Step Up / Down | 0.05 / 0.03 | Largest change per battle; falling is slower than rising |
| Tempo / Damage / Fallen Weight | 1 / 1 / 1 | Weights in the battle score |
| Target / Worst Damage Taken Share | 0.35 / 1 | Share of the party's max HP lost |
| Target / Worst Fallen Share | 0.1 / 0.75 | Share of units that fell |
| Retry Penalty | 0.1 | Score lost per retry of a won fight |
| Retry Weight Falloff | 0.5 | Weight of repeated defeats at one encounter (1, 0.5, 0.25...) |
| Record Escapes | off | Whether fleeing counts |
How it works: after each battle the subsystem scores it from 0 (the player struggled) through 0.5 (even) to 1 (the player dominated), from turns per enemy, damage taken and units fallen. A defeat scores 0. The controller is relative: it moves the intelligence only while the average of the last few battles sits above or below 0.5, so a player who plays an even game at 0.8 stays at 0.8. Repeated losses at one encounter count less and less, so losing on purpose does not fool it.
The intelligence a battle actually uses comes from, in order: the RSE.Difficulty.Override console variable (0 to 1, debug), else the adaptive value for the mode clamped to the global limits and then the encounter's Min and Max (the encounter's own Intelligence field is ignored while adaptive difficulty is on), else the encounter's Intelligence when adaptive is off. Rules profiles can override the Difficulty section per zone or boss.
14.5 Blueprint usage
14.5.1 Make a "royal guard" with a Decision Policy
A Decision Policy has the last word on a unit's decision, after the utility scored and picked an option.
- Create a Blueprint with the parent AI Decision Policy.
- Override Override Decision: you get the context, the options (best first: kind, ability, item, target, score) and the index the AI picked. Set Out Index and return true to take another option.
- Override Override Target: when the final option uses an ability, you get every unit that ability was scored on. Return true with another Out Target Id to aim it there.
- Set it on the profile (Decision Policy). Keep it deterministic: read the battle, never change it, no global random. Rules marked Force are not sent to the policy.
Use the RPG Saga | AI nodes to read the battle: Get Unit, Get HP Percent, Has Status, Get Resource, Get Attribute, Is Weak To, Get Distance, Are Enemies, Count Units, Get Team Focus Target, Get Unit Ids, Evaluate Scalar.
For a "royal guard" that never attacks the player's leader while the queen lives: in Override Target, if the candidate is the VIP and a Queen team value is set, return another candidate.
14.5.2 Add your own scorer or condition
- Parent AI Scorer, override Score (Context → float). Add it in the profile's Scorers with a Weight.
- Parent AI Condition, override Is Met (Context → bool). Use it in rules and phases.
14.5.3 Read or set intelligence
On the difficulty subsystem: Get Mode Intelligence, Set Mode Intelligence and Get Intelligence For Encounter.
14.5.4 Change a unit's behavior mid-fight
A battle script effect Change AI Profile (URSEBattleScriptEffect_ChangeAIProfile) swaps the profile from a scripted beat. Boss phases do the same through their Profile field.
14.6 C++ usage
A custom scorer:
UCLASS(meta = (DisplayName = "Prefer Burning Targets"))
class UMyBurningScorer : public URSEAIScorer
{
GENERATED_BODY()
protected:
virtual float Score_Implementation(const FRSEAIContext& Context) const override
{
FRSEBattleUnit Target;
if (!URSEAIBlueprintLibrary::GetUnit(Context, Context.TargetId, Target)) { return 0.f; }
return URSEAIBlueprintLibrary::HasStatus(Context, Context.TargetId, MyTags::Status_Burning) ? 1.f : 0.f;
}
};
Read the adaptive value from the game-instance subsystem:
if (URSEDifficultySubsystem* Difficulty = GetGameInstance()->GetSubsystem<URSEDifficultySubsystem>())
{
const float Tactics = Difficulty->GetModeIntelligence(RSEGameplayTags::Battle_Mode_Tactics);
UE_LOG(LogTemp, Log, TEXT("Tactics intelligence %.2f"), Tactics);
}
The state (FRSEDifficultyState) is SaveGame data: each mode's value and window, plus retries per encounter. It is part of the save (see Save and load). ResetToNewGame() puts everything back to Medium.
Extension points: subclasses of URSEAICondition, URSEAIScorer and URSEAIDecisionPolicy (C++ or Blueprint), the URSEFreeTacticsController for a fully custom Free Tactics decision-maker, and the interop below.
14.7 Advanced
14.7.1 Combat roles: what your props mean in battle
Battles run on your real map. A thick tree trunk should protect a unit behind it, a bush should not, a pebble should not matter and a pile of buckets should not end up in the middle of a fight. Combat roles tell the engine what each object means. You set them once per asset (a folder at a time if you like), and every placed copy follows. Nothing in your asset packs is modified: roles live in a registry asset in your project (/Game/Generated/DA_CombatRoles), listed in Project Settings → Combat Roles → Registries.
| Role | In battle |
|---|---|
| Full cover | Blocks line of sight and projectiles; occupies its tiles |
| Half cover | Attacks against a unit behind it hit less often; occupies its tiles |
| Obstacle | Cannot be crossed, protects nobody |
| Difficult terrain | Can be crossed, costs more movement |
| Climbable / high ground | Units stand on it and get the height advantage |
| Destructible cover | Half cover that can be broken (Free Tactics gives it hit points) |
| Explosive | Half cover that explodes when broken |
| Overhead | Looked through; the Free Tactics camera cuts it away |
| Neutral decoration | Does not matter; the grid looks through it |
| Avoid in combat areas | Small clutter that placement tools keep out of combat areas |
Quick start:
- In the Content Browser, right click an asset-pack folder → RPG Saga: Suggest Combat Roles (Unassigned Only). Every mesh and Blueprint gets a suggestion from its shape and its name.
- Right click the folder → RPG Saga: Combat Roles... to review the list in the Combat Role Configurator. Check rows, pick a Role, Apply to Checked. Manual choices always win over suggestions.
- Press Bake Grid again on Tactics zones (roles are read at bake time).
One placed object can differ from its asset: add the RSE Combat Role component to the actor, or an actor tag named like the role tag (for example CombatRole.Neutral). Place an RSE Combat Area over spots where you want battles and press Check to count free tiles and list clutter. In Blueprint, the node group RPG Saga | Combat Roles has Get Component Role, Get Actor Role, Get Asset Role, Get Cover Info, Is In Combat Area and Can Place At. Roles are data: add your own in Project Settings → Combat Roles → Roles with a new CombatRole. gameplay tag.
14.7.2 Behavior Tree and StateTree interop
Already have enemies, companions or NPCs run by a Behavior Tree or a StateTree? Keep them. Nodes for both let your trees ask the utility AI what to do, carry the answer out, keep a distance, start a battle and test the plugin's conditions. Movement, animation and combat code stay yours. Behavior Tree nodes are built into the RSE module; StateTree nodes are in the RSEStateTree module (enable RPG Saga Engine - StateTree Bridge in Edit → Plugins).
| What it does | Behavior Tree | StateTree |
|---|---|---|
| Asks the utility AI what the pawn should do | task RSE: Pick Best Action | task RSE: Pick Best Action |
| Carries an action out | task RSE: Execute Ability | task RSE: Execute Ability |
| Walks to a distance from a target | task RSE: Move To Preferred Range | task RSE: Move To Preferred Range |
| Starts a battle with the party | task RSE: Start Battle With Target | task RSE: Start Battle With Target |
| Runs an Interaction asset | (your own task) | task RSE: Run Interaction |
| Tests plugin conditions | decorator RSE: Condition | condition RSE: Condition, RSE: Flag Is |
| Is the pawn in a battle / its turn | decorator RSE: In Battle | condition RSE: In Battle |
| Does a unit have a status | decorator RSE: Has Status | condition RSE: Has Status |
| Tracks target, threat, distance | service RSE: Update Threat / Target | evaluator RSE: Update Threat / Target |
For action battles there are nodes of their own, with the same names in both systems: RSE Action: Attack, RSE Action: Use Ability, RSE Action: React To Threat, RSE Action: Keep Preferred Range, RSE Action: Target In Reach (decorator or condition) and RSE Action: Incoming Telegraph (decorator or condition).
Behavior Tree setup. Make a Blackboard with the keys you want (Target Actor as Object of base class Actor; Kind as Name; Ability as Object of base class RSE Ability Data; Item as Object of base class RSE Consumable Data; Target Location as Vector; Door Index as Int; Score, Threat and Distance as Float; In Battle as Bool). In your tree, pick the keys in each node's Output and Input groups. Every key is optional. BT_RSE_ExampleEnemy with BB_RSE_ExampleEnemy is in the plugin's example content. Its branches, from the top: fight on its turn (RSE: In Battle with Require Own Turn → Pick Best Action → Execute Ability), hunt the party (Move To Preferred Range → Start Battle With Target) and wait. If it is missing, run RSE.AIInterop.CreateExampleBT in the editor.
StateTree setup. Use the StateTree AI Component schema or the StateTree Component schema. Bind Pick Best Action's Output properties (Kind, Ability, Item, Target Actor, Target Location, Door Index, Score) to the inputs of Execute Ability. ST_RSE_ExampleEnemy is the example; RSE.StateTree.CreateExample creates it if missing.
Who decides. The battle stays the judge: whatever a tree does in a battle is a command like any other, validated and applied by the battle (the same in every mode and in the simulator). In Free Tactics the enemy side is played by the battle's own AI controller, and trees read and act around it. In Grid Tactics and ATB a tree can play a whole side: give it to an AI controller with no pawn and call Claim Battle Side (library RSE AI Interop, with the controller and the side's team tag). Release Battle Side hands it back. In action battles each unit is either the framework's or your pawn's own brain.
Your pawn in an action battle. Implement the RSE Action Agent interface (Class Settings → Interfaces) on your pawn or a component:
| Function | What it does |
|---|---|
| Can Accept Action Order | The pawn can take an order now |
| Order Move To (Location, Acceptance Radius) | Walk or run there; return true when you took it |
| Order Use Ability (Ability, Target Actor, Target Location) | Play the ability with your animation and code |
| Order Stop | Cancel the order |
| Is Busy With Order | An order is still being carried out |
| Get Action Battle Control | Framework (our action AI plays the unit, the default) or Own Brain (your tree plays it) |
| On Action Battle Joined / On Action Battle Left | Optional notifications |
To drive a boss with your own Behavior Tree: make the boss a Character with an AI controller, add the interface and return Own Brain, start the Action encounter passing your pawn in Enemy Actors, copy BT_RSE_ExampleBoss from the example content and run it. It answers the telegraph (RSE Action: Incoming Telegraph → React To Threat), strikes when in reach (Target In Reach → Attack) and closes in (Keep Preferred Range with Use Ability Reach). Add your own phase decorator above Strike and put Use Ability with the boss's special move in it.
The action nodes act only on the machine that hosts the battle; on a guest they read and do nothing. Decisions happen when a node runs, never every frame, and use the battle's seed, so the same state gives the same decision.
Without a tree. The library RSE AI Interop offers Is Actor In Battle, Is Actors Turn, Actor Has Status, Pick Best Action For (returns a decision without doing anything: good for hints) and Execute Decision.
14.7.3 Debugging the AI
RSE.AI.Debug 1(or the AI button of the battle HUD): every decision with its top options and score terms (for example Role: kill focus, Role: taunt, Scorer: <name>). The debugger also notes when a Decision Policy changed a decision.RSE.Difficulty.Override <0-1>fixes the intelligence of every battle (-1turns it off).RSE.Difficulty.Log 1logs every recorded battle (metrics, score, weight, change).- The battle simulator prints an
enemy AI:line with behavior statistics. See Battle fundamentals. - Configurator → Tools → AI Profile Preview shows the curves, gates, rules, scorers and phases of a profile.
14.7.4 Performance notes
Decisions are sampled and capped: Max Move Candidates in AI settings, AI Candidate Positions in Free Tactics, a think interval in Action AI. Weights resolve once per decision, so curves cost nothing inside the scoring loop. Lower the caps for weak hardware.
14.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Enemies always play perfectly or terribly | Intelligence pinned by the encounter's Min and Max, or by RSE.Difficulty.Override | Widen the limits, set the override to -1 |
| Changing the encounter's Intelligence does nothing | Adaptive difficulty is on, and it ignores that field | Pin with Min and Max Intelligence, or turn Difficulty → Enabled off |
| The AI never gets harder | Fewer than Min Battles To Adjust battles, or the player sits inside the Dead Zone | Play more battles, or lower the dead zone; use RSE.Difficulty.Log 1 |
| A custom style does not appear in the New Enemy wizard | It was not created with Create | Run Create in the AI Style wizard |
| Pick Best Action always fails | The pawn is not a unit of a running battle, or it is not its turn | Check with Is Actor In Battle and Is Actors Turn; put RSE: In Battle with Require Own Turn above it |
| Execute Ability fails in battle | The battle refused the command (not active, not enough AP or MP, target out of range) | See the log category LogRSEAIInterop |
| Our AI and my tree both move the boss | The unit is not excluded from the framework AI | Return Own Brain from Get Action Battle Control before the battle starts |
| A Grid Tactics or ATB side does nothing | The controller has a pawn, or was not claimed | Use a controller with no pawn and Claim Battle Side with the side's team tag |
| A tree gives no cover | A combat role missing, or collision only on the canopy | Check the blocking volume in the Combat Role Configurator and set the role by hand |
| Roles did nothing on the grid | The grid was not baked again | Bake the Tactics zones again and check Bake Uses Combat Roles |
14.9 See also
- Battle fundamentals, Grid Tactics, ATB and turn-based, Free Tactics (Live) and Action battles.
- Characters and party for which profile a character uses.
- Product pages in
docs/product/:enemy-ai.md,ai-interop.md,combat-roles.md,ai-workflow.md,balance-tool.md. - Appendix A, Appendix B, Appendix C and Appendix D.
15. Story, dialog and quests
In short: One small language tells the whole story. Conditions ask a question ("does the party carry the key? is the flag set?") and effects change the world ("give an item, start a battle, recruit a character"). Dialogs, quests, puzzles, scenes and encounters all use them, and they all read and write one saved story state of flags and variables. Branching dialogs, quests with several endings, parallel scenarios and cinematics are data you assemble in editors, with no code.
15.1 Basics
15.1.1 The story state
The story state is one saved record of what has happened. Its keys are Gameplay Tags under five roots:
| Root | Holds | Missing value |
|---|---|---|
Narrative.Flag.* | true or false | false |
Narrative.Var.* | an integer (counters, choices, affinity) | 0 |
Narrative.Puzzle.* | a puzzle solved | not solved |
Narrative.Area.* | an area, door or shortcut unlocked | locked |
Narrative.Event.* | a scene or optional event seen | not seen |
Examples: Narrative.Flag.Chapter1.MetMira, Narrative.Var.Chapter1.MiraTrust, Narrative.Puzzle.Mansion.ClockTower.
Keys are tags so that you pick them from a list (no typos), organize them by chapter, and rename them with a redirect without breaking data. Declare new keys in a tag file under the plugin's or your project's tags (Project Settings → GameplayTags). Validation rejects a key under the wrong root, for example a flag used as a variable. A new game starts from the values in Project Settings → RPG Saga Engine → Narrative (starting flags, variables and unlocked areas).
Never delete a tag that a save may contain: rename it with a redirect.
15.1.2 Conditions and effects
Conditions are questions. A condition set has a mode (All or Any) and a list of conditions. An empty set passes. The common ones:
| Condition | True when |
|---|---|
| Has Item | The shared inventory holds at least that many |
| Flag Is | A flag has the wanted value |
| Variable Compare | A variable compares true (==, !=, <, <=, >, >=; missing = 0) |
| Member In Party / Member Not KO | A character is in the party (and standing) |
| Puzzle Solved / Area Unlocked / Event Seen | The matching state key is set |
| Instigator Is | Who or what triggered this (the player, a certain actor) |
| Has Money | The party has that much money |
| Quest State / Quest Objective Complete / Ending Is | A quest or ending condition |
| Time Of Day Is Between / Phase Of Day Is / Weather Is / Day Number / Season Is | The clock and weather |
| Place Discovered / Area Visited | Travel state |
| NPC Is At Activity | A living NPC is doing something |
| Has Card / Beat Card Opponent | The card game |
| Dialog Node Visited / Dialog Option Chosen / Dialog Seen | Dialog history (dialogs with history on) |
| All Of / Any Of / Not | Combine other conditions |
| Custom (Blueprint) | Your own class |
A condition that lacks the state it needs (for example no party) does not pass.
Effects change the world. Every effect has an optional Only If gate (itself a condition set), so you can write small branches without a separate asset. The common ones:
| Group | Effects |
|---|---|
| State | Set Flag, Modify Variable (Set or Add), Mark Puzzle Solved, Unlock Area, Mark Event Seen |
| Items and money | Give Item, Take Item, Give Money, Take Money, Open Shop, Rest At Inn |
| Party | Add Member, Remove Member (Permanent or Parallel Scenario), Restore Party, Set Level, Give Experience, Learn Ability, Forget Ability, Teach Ability, Award Growth Points, Open Teacher |
| Story flow | Start Battle, Start Dialog, Play Scene, Start Quest, Set Quest Stage, Complete Quest Objective, Complete Quest, Fail Quest, Add Ending Score, Request Point Of No Return |
| World | Set Time, Advance Time, Set Weather, Lock Weather, Set Clock, Set NPC Schedule, Discover Place, Travel To, Open World Map, Change Encounter Rate, Remove Encounter Rate, Alert Enemies, Report Crime, Set Data Layer State |
| Puzzles | Open Code Lock, Use Item On Object, Apply Examine |
| Presentation | Play Music, Stop Music, Restore Music, Play Sound, Show Tutorial |
| Rules | Set Rules Profile |
| Custom | Custom (Blueprint) |
An effect only broadcasts a real change: setting a flag to the value it already has sends no event.
15.1.3 An Interaction asset
URSEInteractionData (RSE Interaction Data) is the standard shape for examinable objects, doors, simple NPCs and puzzle pieces: Conditions → Effects on success, Failed Effects otherwise (for example "It is locked."), and with One Shot, Completed Effects after the first success ("The chest is empty."). The world actor only points at the asset. See Exploration.
15.1.4 Your first branching dialog
- In the Content Browser, right click a folder → RPG Saga → Dialog, fill the short form, press Create.
- Double-click the dialog to open the visual dialog editor.
- Right click the graph → Add Line, connect it from the green Dialog Start, and type the speaker and text.
- Add a Choice node: one output pin per option. Give each option text, and optional conditions and effects.
- Add an Effect node on one branch (for example Set Flag
Narrative.Flag.Chapter1.MetMira). - Press Play from Here in the toolbar. It starts the dialog in Play In Editor at the selected node.
- To start it in the world, place an RSE NPC and set its dialog (see Exploration), or use the Start Dialog effect from anywhere.
Dialog node types:
| Node | Does | Outputs |
|---|---|---|
| Line | A speaker says something (text, portrait, expression, media, voice) | Next |
| Choice | The player picks from options (conditions, once-only, unavailable modes, hints) | One per option |
| Branch | Tests conditions | One per "If", then Else |
| Effect | Runs an effect list | Next |
| Cue | Camera, sequence, emote, expression, look-at, sound, screen effect, wait, or a generic cue | Next |
| Jump | Go to a node, or to another dialog (a call that returns) | Go to, After return |
| End | Ends the dialog | none |
Text markup inside a line: <color=Danger>...</color> named colors (the look is in the UI style, never in the text), styles (emphasis, shout, whisper, shake, wave), {p=0.4} for a pause, {speed=0.5}...{/speed} for speed, and {cue=N} to fire the line's cue at that character.
Presentation is a tag on the dialog (Dialog Start → Presentation): Box (default), Cinematic (a title card and letterbox), Bark (a short line over a head, no choices) and Battle (in-battle banter, cannot start battles).
15.1.5 Your first quest
- Right click → RPG Saga → Quest. Double-click to open the visual quest editor.
- Select Quest Start to set the category (Main, Side, Card, Event, or your own
Quest.Category.*tag), the description, the giver, and Available When. - Add Stages (blue). Each has a journal entry and objectives. An objective completes when its Complete When conditions pass, when its Progress Variable reaches Required Progress, or explicitly (the Complete Quest Objective effect, usually from a dialog).
- Add Outcomes: green for success, red for failure, each with a final journal entry and effects (the rewards).
- Wire transitions: each stage output goes to another stage or to an outcome. With no transitions a stage continues to the next in the list, and after the last stage the quest ends with the default success outcome.
- Start it with the Start Quest effect, or tick Auto Start (optionally limited to certain maps).
15.2 How it works
Content (dialog, quest, interaction, scene, encounter) holds a condition set and an effect list
-> URSENarrativeSubsystem (game instance) owns FRSENarrativeState and runs them
-> conditions read a read-only FRSEConditionContext (story state + party + inventory + money + time)
-> effects write through an FRSEEffectContext and raise events
-> RSECore effects that need the world (battle, dialog, scene, screen) raise a request;
the RSE presentation layer carries it out
Everything story-related lives in RSECore, which knows no actors, UI or input. The dialog UI, scene player, NPCs and triggers in RSE react to requests such as Start Dialog, Play Scene and Start Battle. This keeps the story testable without a world and makes it part of the save.
Quest states are Not Started, Active, Completed, Failed, Missed and Abandoned. Failed means the player failed inside the quest. Missed means the story moved on before the quest was finished: a failure rule marked Missed, or the point of no return (see below). Only Side quests can be abandoned (Can Abandon).
Endings. An Ending Set (URSEEndingSetData, linked from Project Settings → Quests → Ending Set) defines endings, key choices and a hidden score. The Add Ending Score effect raises the score from anywhere. Request Point Of No Return asks the player to confirm that the story cannot go back, and quests marked to fail there become Missed. Ending Is tests the result.
15.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
FRSENarrativeState | RSECore | The saved flags, variables, solved puzzles, unlocked areas, seen events and one-shot interactions |
URSENarrativeSubsystem | RSECore | Game-instance subsystem: owns the state, creates contexts, runs interactions, raises events |
URSENarrativeSettings | RSECore | Project Settings → Narrative: the state of a new game |
URSECondition, FRSEConditionSet | RSECore | One question, and a list of them (All or Any) |
URSEWorldEffect, FRSEEffectList | RSECore | One change, and an ordered list of them |
URSEInteractionData | RSECore | Data asset: conditions, effects, failed effects, one-shot |
URSEDialogData | RSECore | Data asset: a dialog graph of instanced nodes (URSEDialogNode_Line, _Choice, _Branch, _Effect, _Cue, _Jump, _End) |
URSESpeakerData | RSECore | Data asset: a speaker (name, portraits, expressions) |
URSEDialogSubsystem, URSEDialogRunner | RSECore | Runs a dialog; headless |
URSEDialogSettings | RSECore | Text speed, auto-advance, co-op choice rules |
URSEQuestData | RSECore | Data asset: stages, objectives, transitions, outcomes, failure rules |
URSEQuestSubsystem, URSEQuestSettings | RSECore | Quest state and commands; Project Settings → Quests |
URSEEndingSetData | RSECore | Data asset: endings, key choices, score |
URSESceneData | RSECore | Data asset: a Sequencer scene with bindings, dialog sync, end effects, music |
URSEOptionalSceneData, ARSEOptionalSceneTrigger | RSECore, RSE | An optional scene and the actor that offers it |
URSEScenePlayerSubsystem | RSE | Plays scenes: letterbox, skip, input lock, HUD hide, save block |
ARSESceneTrigger | RSE | Volume that plays a scene when the player walks in |
ARSENPC, URSESpeakerComponent, URSENPCTalkComponent | RSE | NPCs and the component that registers a speaker for dialogs and scenes |
URSECinematicLibrary | RSEEditor | Editor library behind Cinematic from Screenplay |
15.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Narrative | The starting flags, variables and unlocked areas of a new game |
| … → Dialog | Characters per second (40 default), text speed steps, auto-advance times, fast-forward, co-op choice deciders and vote rules |
| … → Dialog UI | Player speaker tags, portraits, boxes (see User interface) |
| … → Quests | Ending Set, load quests from the Asset Manager, auto-track started quests, evaluation passes |
| … → Cinematics | Output folder, timing, shots, camera, staging, animation of generated cutscenes |
| … → Scenes | The scene player's defaults (letterbox, blend out) |
See Appendix B for the full list.
15.5 Blueprint usage
The story library URSEBlueprintLibrary_Narrative has static nodes that need no object reference.
15.5.1 Read and write the story state
- Is Flag Set (Flag), Set Flag (Flag, Value), Get Variable, Set Variable, Add To Variable (Delta), Is Puzzle Solved, Set Puzzle Solved, Is Area Unlocked, Set Area Unlocked, Is Event Seen, Set Event Seen.
Example, gating a door in a level Blueprint:
- Event (the player overlaps a trigger) → Is Flag Set (Flag =
Narrative.Flag.Chapter1.MetMira). - Branch: True → open the door. False → Start Dialog (Dialog =
DA_Dlg_DoorLocked, Initiator = a speaker tag).
15.5.2 Run conditions and effects from a Blueprint
- Check Conditions (a Condition Set variable you expose) and Run Effects (an Effect List variable). Both structs show their instanced editor in the Details panel, so designers fill them in without code.
- Run Interaction and Can Run Interaction (an Interaction asset).
- Request Battle (Encounter), Request Scene (Scene, Event, Mark Seen), Request Screen.
15.5.3 Dialogs and quests
- Start Dialog (Dialog, Initiator, Start Node), Is Dialog Active, Abort Dialog.
- Start Quest (Quest, Ignore Availability), Complete Quest Objective (Quest, Objective), Get Quest Status, Is Quest Active.
- Subsystem getters: Get Narrative Subsystem, Get Dialog Subsystem, Get Quest Subsystem. The quest subsystem also offers Set Stage, Complete Quest, Fail Quest, Abandon Quest, Set Tracked Quest, Get Current Stage, Get Quests, Get Objective Views, Get Journal, Evaluate Ending, Get Ending Score, Request Point Of No Return and Confirm Point Of No Return.
15.5.4 Write a custom condition or effect
Create a Blueprint with the parent Custom (Blueprint) condition or effect. The library's Context... and Effect... nodes read and change the story from inside it: Context Is Flag Set, Context Get Variable, Context Get Item Count, Context Is Party Member, Context Get Level, Context Get Money, Effect Set Flag, Effect Modify Variable, Effect Give Item, Effect Take Item, Effect Add Money, Effect Add Member, Effect Remove Member, Effect Run Effects, Effect Request Battle.
See Appendix A for every node.
15.6 C++ usage
A custom condition and a custom effect:
UCLASS(meta = (DisplayName = "Moon Is Full"))
class UMyCondition_MoonIsFull : public URSECondition
{
GENERATED_BODY()
public:
virtual bool Evaluate(const FRSEConditionContext& Context) const override
{
return Context.Narrative && Context.Narrative->GetVariable(MyTags::Var_MoonPhase) == 4;
}
};
UCLASS(meta = (DisplayName = "Ring The Bell"))
class UMyEffect_RingBell : public URSEWorldEffect
{
GENERATED_BODY()
public:
virtual void Execute(FRSEEffectContext& Context) const override
{
URSEBlueprintLibrary_Narrative::EffectSetFlag(Context, MyTags::Flag_BellRung, true);
}
};
Both show up in the instanced picker of every condition set and effect list. They run headless, so unit-test them without a world.
Drive the story from code:
if (URSENarrativeSubsystem* Story = URSENarrativeSubsystem::GetNarrativeSubsystem(this)) // or GameInstance->GetSubsystem
{
const bool bMet = Story->GetFlag(MyTags::Flag_MetMira);
Story->RunInteraction(MyInteraction);
}
Extension points: subclasses of URSECondition and URSEWorldEffect; dialog node classes (your own node type appears in the editor's Add Node menu); URSEDialogCue for your own cue; URSEDialogControlPolicy for co-op rules of who may advance or choose.
15.7 Advanced
15.7.1 Parallel scenarios
The plugin has no special "scenario" class: a parallel scenario is a pattern of the primitives above, in the style of a classic multi-party story.
- A story beat splits the party. Run Remove Member with Departure = Parallel Scenario for each character leaving. Their equipment stays on them (a Permanent departure returns it to the inventory; guests always keep theirs).
- Run Add Member for the characters of the other group, and Set Flag
Narrative.Flag.Act2.GroupBso the rest of the content can ask which group you are playing. - Play the segment in its own level or area, with its own quests, dialogs and encounters gated by that flag.
- At the convergence, Add Member the first group back. A returning character keeps what it wore.
Because the story state is one record, a decision made in either segment (a flag, a variable, an ending score) is visible to the other.
15.7.2 Optional events
Optional scenes, where the player may watch what other characters are doing elsewhere, have their own pieces.
- Create an Optional Scene Data asset (
URSEOptionalSceneData): a Display Name (the title shown to the player), an Event (aNarrative.Event.*tag that records it was seen), Conditions (when it is available), the Dialog that plays as the scene, Effects run when it is watched, and Missed When Skipped. - Place an Optional Scene Trigger (
ARSEOptionalSceneTrigger, an interactable actor with a large radius) in the level and set its Scene. - While the player stands in range and the scene is available (conditions pass, the event is not yet seen), a discreet prompt offers it: "Optional scene: {Title}". Interacting watches it: the event is marked seen, the effects run and the dialog plays. Walking away ignores it: it stays available, or is missed for good when Missed When Skipped is on.
- Use the Event Seen condition to branch later content on whether the player saw it.
A scene can also be a full Sequencer scene (below) offered by an RSE Scene Trigger volume, or started from any effect list with Play Scene. A scene already seen is not queued again.
15.7.3 Scenes with Sequencer
A Scene Data (URSESceneData) plays a Level Sequence. Its parts:
- Bindings: tagged Sequencer bindings played by real actors. Source is the Player, a dialog Speaker or an Actor Tag. Mode is Replace (the real actor plays it) or Stand In (the sequence's own stand-in plays and the real actor hides, lending its look). A binding can have Conditions and a Fallback (placeholder or hide).
- Dialog Sync: Cues (a sequence plays to each dialog cue and waits for its dialog) or Line Sections (the dialog drives the sequence: each line has a section that plays once, then its hold loops until the player continues).
- End Effects (run once when the scene ends or is skipped), Skippable, Hide Player, Keep State At End, Blend Out Seconds, and Music with fade and restore.
While a scene plays: letterbox, skip with confirmation, input locked, HUD hidden, saving blocked, then the camera blends back. Scenes queue: one at a time. Start one with RSE.Scene.Play <scene>, Skip with RSE.Scene.Skip.
15.7.4 Cinematic from Screenplay
Making a conversation into a staged cutscene by hand takes hours. Cinematic from Screenplay turns a dialog (or a pasted screenplay) into a Level Sequence plus scene data in one step. It places the speakers, sets up cine cameras with a shot grammar, times every line and writes LS_Cine_<Dialog> and DA_Scene_Cine_<Dialog>. The result is a first pass you can polish in Sequencer.
- Open the level where the scene happens.
- Right click a Dialog → RPG Saga: Cinematic from Screenplay... (or RPG Saga Engine → Advanced tools).
- Leave Staging and Anchor on Auto, or select the NPC or marker the scene happens around.
- Press Dry Run and read the report (cast, shots, cameras, warnings). Nothing changes.
- Press Generate, then Open Sequence. Tick Place Scene Trigger (or use the Play Scene effect) and press Play.
The tool follows a shot grammar: an establishing wide, an over-the-shoulder shot for each line, close-ups for emotional lines, reaction shots, two-shots for quick back-and-forth and the 180 degree rule so screen directions never flip. Timing comes from the voice, or the text length divided by a reading speed. Speakers talk, gesture and turn toward each other using the character's animation set.
Stage directions go at the start of a line in a screenplay: [shot:close], [camera:over:Mira], [pause:1.5], [move:Mira:to:Door], [anim:Mira:AM_Bow]. They are stored on the line and never shown in game.
Running it again updates only what the tool made: it lives in a Sequencer folder named RSE Generated, and tracks you add on its bindings are kept. Command line and console:
UnrealEditor-Cmd <Project>.uproject -run=RSECinematic -Map=/Game/Maps/L_Town -Dialog=<path> [-DryRun] [-Report=<file>]
In the open editor, RSE.Cinematic.Generate Dialog=... does the same. Settings are in Project Settings → Cinematics.
15.7.5 Dialogs: the details
- History. Turn on Track History on a dialog to save visited nodes and chosen options. Once-only options, "already chosen" markers and the history conditions need it.
- Portraits and media. Lines pick a speaker, an expression (
Dialog.Expression.*tags: Happy, Angry, Sad, Surprised and your own) and optional media. See Character visuals and animation. - Co-op. Choices are decided by the Default rules (story choices versus system prompts), the speaker, the host, or a vote of every player. Set per choice, with defaults in Project Settings → Dialog → Co-op.
- Localization. Every player-facing text is an
FTextwith a deterministic key (Dlg.<AssetName>namespace, the node id as key), so translations survive edits. See Localization. - Import and export. The toolbar has Import Script and Export Script, the screenplay format of the content pipeline (
=== DIALOG <Id>...). Import shows the changes first. - Validation. Validate and the Issues panel check every dialog;
RSE.Dialog.Explore <dialog>walks every path and reports dead ends.
15.7.6 Quests: the details
- Failure rules (
Fail When): conditions that fail the quest, optionally with Missed set, with their own outcome. - Objective flow: Parallel (all at once) or Sequential. Optional objectives never block the stage. Hidden objectives appear in the journal only when completed. An objective completed stays completed even if the condition becomes false later (for example the item was handed over).
- Auto-track. Started quests become the tracked quest unless Auto Track Started Quests is off.
- Quest-giver markers use the
Quest.Giver.*andQuest.Region.*tags (NPC markers and map markers). - Console.
RSE.Quests.List,Start,Complete,Fail,Track,Abandon,Ending,Dump,Trace;RSE.Narrative.Dump,SetandResetread and change the story state.RSE.Dialog.Start <dialog>,RSE.Dialog.Dump.
15.7.7 Networking
The story state, dialogs, quests and scenes run on the host in co-op. Dialog advance and choice are commands that the host validates (FRSECmd_DialogAdvance, FRSECmd_DialogChoose and so on), so who may advance or choose is a rule, not a hack. See Co-op and online.
15.7.8 Performance notes
Conditions and effects are cheap synchronous reads and writes. Quest evaluation re-runs when story state changes, up to Max Evaluation Passes (64) per change so that cascading transitions settle. Dialogs and scenes load their soft references when they start.
15.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| A flag never changes | The effect has an Only If gate that fails, or the tag is under the wrong root | Run RSE.Narrative.Dump, check the gate and the root |
| A tag is "invalid" after a load | The tag was deleted from the tag file | Restore it, or rename with a redirect |
| A dialog option is missing | Its conditions fail, or its Unavailable Mode hides it | Check the option; use the Show disabled with hint mode if you want it greyed |
| A once-only option repeats | The dialog does not Track History | Turn it on |
| A quest never advances | Its objective has no condition and no counter (explicit only), or no transition passes | Complete it with the effect, or add a condition; check RSE.Quests.Dump |
| A quest says Missed | A failure rule marked Missed passed, or the point of no return was passed | Check Fail When and Fails At Point Of No Return |
| A scene plays twice | It has no Seen Event | Set a Narrative.Event.* tag |
| Nothing happens on Play Scene | The scene has no Sequence, or the scene queue is busy | Check Scene Data validation and RSE.Scene.Dump |
| Generated camera looks through a wall | The tool does not avoid objects | Move the anchor, or edit the camera in Sequencer |
| A character stands still while speaking | Its animation set has no Talk animation | Add one to the animation set |
| "The Dialogs content type is disabled" | Pasted screenplays import through Content Import | Enable the Dialogs type in Project Settings → Content Import |
15.9 See also
- Core concepts for tags, data assets and validation.
- Characters and party for recruitment, guests and leaving members.
- Exploration for NPCs, interactions, triggers and puzzles that use these effects.
- Camera and battle presentation and User interface.
- Save and load for how the story state is saved.
- Product pages in
docs/product/:editors-and-wizards.md,cinematics.md,ai-workflow.md,localization.md.
16. Exploration
In short: Exploration is everything the party does between battles: examining and talking, opening locks, solving puzzles, walking through zone exits, saving at save points, meeting enemies on the map (random or visible), reading the map and the clock, and sharing the world with NPCs who live their own day. All of it is placed as actors in your level and filled with data assets, and all of it reads and writes the same story state as dialogs and quests.
16.1 Basics
16.1.1 The pieces in one picture
| You want | You place | You fill |
|---|---|---|
| An object the player examines, or an NPC who talks | Interactable Actor, or RSE NPC | An Interaction asset, a Dialog, an Examine asset |
| A chest, campfire, signpost, shrine, herb patch | RSE World Interactable | An Interactable Data asset (the kind) |
| A locked door or chest, a trap | RSE Lockable, RSE Trap | A Lock or Trap data asset |
| A door that opens when the story says so | Puzzle Door | Open Conditions |
| A passage to another level | Zone Exit | The destination map and arrival point |
| A place to save | Save Point | A Save Point Id |
| Battles on the map | RSE Encounter Spawner, RSE Random Encounter Area | Encounter pools and roaming behaviors |
| Help arriving mid-battle | A Reinforcement data asset | On the spawner, encounter or pool |
| A map, minimap and compass | Run Generate Map | Nothing |
| A sun, moon and weather | Time of Day & Weather actor | A profile and a weather table |
| Villagers with a day | RSE NPC plus NPC Place actors | A Schedule asset or an NPC Style |
16.1.2 Interactions and examining
Almost everything the player walks up to is an ARSEInteractableActor or a subclass. While the player stands in its range, a prompt appears ("Examine", "Talk", "Open") and pressing Interact runs, in order:
- a puzzle piece if the actor has one (item use, examine text, a code lock; see Puzzles below);
- its Interaction asset (conditions, then effects; failed effects otherwise);
- its Dialog, after a successful interaction or always (Dialog Only On Success).
The prompt is gated by Prompt Conditions, the same condition sets as everywhere else. Priority and Interaction Radius / Reach decide which of several close objects is focused. See Story, dialog and quests for the condition and effect language.
A first example, a note on a desk:
- Create an Examine Data asset (Content Browser → Miscellaneous → Data Asset → RSE Examine Data). Add responses: each has conditions and lines, and the first one whose conditions pass is shown. Add a Pickup item with a Taken Flag so it is given once, and the save remembers it.
- Place an Interactable Actor (Place Actors, search "Interactable") and set its Examine.
- Play. The lines appear in the narrator box. Examining again after taking the item shows the second response.
16.1.3 The interaction library
RSE World Interactable (ARSEWorldInteractable) is one actor that becomes a chest, campfire, torch, lantern, signpost, danger warning, examine spot, shrine, gathering node, viewpoint, obstacle or class action, depending on the Interactable Data asset (URSEInteractableData) you give it. The plugin's kinds are in /RPGSagaEngine/Data/Interactables (DA_Interactable_*). Place the actor, pick the kind, and the placeholder look appears. Turn Use Data Look off to keep a mesh you set on the actor.
| Kind | What it does |
|---|---|
| Chest | Loot rolled once, scaled by the danger of the place; may be locked |
| Light | Lit by hand, at night, or always; a campfire can rest the party and open the save screen |
| Signpost | Lists what lies each way and reveals those places on the world map |
| Danger warning | Says what lies ahead and the recommended level, rated against your party |
| Examine | Lines, a one-time find, story effects the first time |
| Shrine | A lasting blessing, then a cooldown in game hours |
| Gather node | Gives items, then grows back |
| Viewpoint | Reveals places on the world map and the fog around it |
| Obstacle | Crossed with a ladder, rope or jump once the party can; some only once it learned something |
| Class actions | A thief picks a lock, a mage lights or burns, a warrior breaks or pushes |
| Destructible | Barrels, crates and pots with weighted outcomes (loot, a poison cloud, an explosion) |
| Reactive | Reacts to abilities (fire lights a torch, frost freezes a pond) |
Every kind also has Use Conditions, Effects (run after every successful use), an Icon, a Prompt, a Look (meshes per state) and Placement rules that Populate Interactions uses (see World building).
Requirements are one shared block: required class tags, member tags (a class's granted tags or a personal Trait.*), abilities, items, story conditions and a requirement text. The first party member who meets it does the action.
16.1.4 Puzzles, doors and locks
Puzzles are data built from the same primitives, plus a few generic pieces:
| Piece | What it does |
|---|---|
| Examine Data | State-dependent text and a one-time pickup |
| Item Use Data | Which key items the object accepts, what they do, whether they are consumed |
| Code Lock Data | Digits, symbols or clock hands; a solution, attempts, success, failure and lockout effects |
| Item Recipe Data | A + B makes C; listed in Project Settings → Puzzles → Recipes. The player may freely try any two key items |
| Puzzle Door | Open while its Open Conditions pass (for example Area Unlocked), animated, saved through the story state |
| Lock Data + RSE Lockable | A door or chest with a key, a lockpicking minigame or auto resolve |
| Trap Data + RSE Trap | Hidden traps the party can spot, disarm or set off |
A clock-tower puzzle, step by step:
- Place an Interactable Actor over the clock face. Set Examine (the description), Item Use (accepts the Minute Hand key item, sets a flag) and Code Lock (a Clock Hands lock with the solution 7:15).
- The player examines it, is asked "Use the Minute Hand?", then the lock screen opens.
- The lock's Success Effects run Unlock Area
Narrative.Area.Mansion.Vault. - A Puzzle Door with Open Conditions = Area Unlocked
Narrative.Area.Mansion.Vaultopens by itself.
Combining items is also in the party menu (Key Items → item → Combine → second item). Locks, traps, stealing, dialog battles, distractions and fallen members are the Exploration RPG layer:
- Skills. Perception, Disarm, Lockpick and Pickpocket come from stats, level and class or trait bonuses (Project Settings → Exploration RPG → Skills). Attempts share one chance formula with a minimum and maximum.
- Traps. Spotting is passive (the party compares Perception with the trap's Detect Difficulty within a radius). Disarm with Interact, or send a follower with the Open / unlock party command. Stepping on a trap sets it off, found or not.
- Locks. A key opens at once. Otherwise the best member picks it: the lockpick minigame (a marker sweeps a bar; press Confirm inside the green spot to set pins) or auto resolve.
- Stealing. Sneak behind an NPC with a Pickpocket asset: the prompt becomes "Steal". Failure may be noticed and runs the purse's Caught Effects (the NPC fights, guards come, prices rise).
- Distractions. Hold the Distract input to throw a stone; visible enemies walk over to look.
- Fallen members. After a battle they get up, or stay down with a "Revive" prompt, depending on Fallen Members → After Battle.
16.1.5 Travel between zones and the world map
Place an Zone Exit (ARSEZoneExit) at the edge of a level. Set Destination Map, the Destination Arrival Point (a named player-start-like point in the other level), optional Exit Conditions and Requires Confirmation. An Area Volume names an area for the map and for danger rating. Travel Destination data assets describe fast-travel places for the world map screen. The travel subsystem blocks fast travel in battles, cutscenes and no-travel zones and says why.
16.1.6 Save points
Place an Save Point (ARSESavePoint) and give it a Save Point Id. Interacting opens the save screen. A campfire kind of the interaction library can also be a save point. Other rules (the consumable save item, no-save zones) are in Save and load.
16.1.7 Enemies on the map
Two classic styles, both without code:
Random battles while walking:
- Create an Encounter Pool (
URSEEncounterPoolData): entries (character, weight, max per group, level mode), group size, optional elite groups. - Place an RSE Random Encounter Area (
ARSERandomEncounterArea), scale its box over the ground, tick Enabled and add an entry with Kind = Generated and your pool. A table can mix Predefined and Generated entries. - The map needs a classic battle director for ATB encounters (an RSE ATB Battle Director with its ATB Stage).
Visible enemies that patrol, flee or chase:
- Place an RSE Encounter Spawner (
ARSEEncounterSpawner). Set Pool (or a predefined encounter) and a Behavior (URSERoamingBehaviorData,DA_Roam_*). - Behaviors are Passive, Cautious (flees) or Aggressive (notices in a sight cone or by hearing, shows "!", chases, gives up).
- For Free Tactics battles tick Free Tactics on the spawner (see Free Tactics (Live)).
Touching a group starts its battle. From behind while unnoticed is a preemptive strike; being touched from behind by a chaser is a back attack. Respawn policy, patrol points, follower counts, activation radius and grace times are on the spawner and in Project Settings → Encounters.
Repel and Lure: create an ability with the Encounter Rate effect (Multiplier 0 = none, 2 = double; duration in steps or seconds) and a consumable that uses it. Equipment traits and the player's Battle frequency option multiply the rate too.
16.1.8 Time of day and weather
Place a Time of Day & Weather actor (ARSETimeOfDayActor) anywhere. It drives the sun, moon, sky, fog, clouds and colors. By default one real hour is one game day. Preview any hour in the editor from the actor's Preview section. Looks live in Time of Day Profile assets (Bright stylized, Moody, Realistic ship with the plugin). Weather is six types (Clear, Cloudy, Rain, Storm, Fog, Snow) chosen by a Weather Table; give a level or a Weather Volume its own table. A Night Light component turns lamps on at dusk.
The clock changes gameplay: roaming enemies see, hear and chase differently by phase and weather, encounter pools can change at night, and battle modifiers can weaken fire in rain. See Settings below.
16.1.9 Living NPCs
Every RSE NPC has a Living NPC component (URSENPCBehaviorComponent). Without a schedule it stands where you put it. To give an NPC a day:
- Place NPC Place actors (
ARSENPCPlace): a Spot (where it stands), an Area (where it wanders), or a Route (waypoints with pauses). Give each a Place Id. - Create a Schedule (
URSENPCScheduleData): entries with a When (hours, phases, weathers, conditions) and a Do (activity tag, movement Stay, Wander, Route or Away, a place, speed, dialog while in this activity). The first entry that holds wins; the Default applies otherwise. - Set the NPC's Schedule, then test with
RSE.Time.Set 19.9.
Faster: the plugin ships sixteen NPC Styles (URSENPCStyleData: shopkeeper, farmer, guard patrol, night watch, child, priest and more) that bundle a day, reactions, bark lines and names. Populate NPCs (in the world tools) applies one.
16.1.10 Maps, minimap and compass
Open your level, save it, and run Generate Map (Studio → World → Generate the map). It draws a printed-looking map from above, writes T_Map_<Level> and DA_Map_<Level>, and the level finds its map by itself. In play you get a minimap, a compass bar and a full area map (M or View). Markers (save points, exits, shops, recruits, quest givers, enemies) appear by themselves, and quest objectives with a Map Target show on all three. Players drop typed pins from a pin wheel. Fog of war and a zone-difficulty tint are optional.
16.2 How it works
Placed actor (Interactable Actor, NPC, Lockable, Trap, Zone Exit, Save Point, Spawner ...)
-> player Interact (command through the command bus; the host applies it in co-op)
-> URSENarrativeSubsystem: conditions -> effects; effects that need the world raise requests
-> RSE presentation: dialog UI, battle start, scene, lock screen, travel, save screen
The rules and data of each system live in RSECore (pools, schedules, locks, traps, the clock, map data, puzzles). Actors, overlays, widgets and cameras live in RSE. Exploration state (spotted, disarmed, opened, lit, gathered, defeated groups, world steps, the clock, the weather, pins, fog) is saved with the game.
Hand-off to battle. A visible group, a trigger, a dialog effect or a random area asks the exploration subsystem to start a battle. Free Tactics fights where you stand with no transition; ATB and grid Tactics use their directors and stages. After the battle the party is back where it was.
Stealth. Enemies have a vision cone and hearing. A detection meter fills while the party is seen or heard (faster near, slower far, slower while sneaking, hidden by tall grass or shadow) and the ! appears when it is full. Surprise decides the opening (see Free Tactics (Live)). Stealth settings are in Project Settings → Stealth.
16.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
ARSEInteractableActor | RSE | Base of everything the player interacts with |
URSEInteractableComponent | RSE | Lets any actor take part in the interaction system |
URSEInteractionData | RSECore | Conditions and effects of an interaction |
ARSENPC, URSENPCBehaviorComponent | RSE | NPCs and the Living NPC component |
ARSEWorldInteractable, URSEInteractableData, URSEInteractableBehavior | RSE, RSECore | The interaction library: actor, kind and behavior base |
URSEExamineData, URSEItemUseData, URSECodeLockData, URSEItemRecipeData | RSECore | Puzzle data |
ARSEPuzzleDoor, ARSEOptionalSceneTrigger | RSE | A door that follows the story; an optional scene offer |
ARSELockableActor, URSELockData | RSE, RSECore | Lockable door or chest and its lock |
ARSETrapActor, URSETrapData | RSE, RSECore | A trap and its data |
URSEExploreRPGSubsystem | RSE | Skills, searching, distractions, fallen members, revive |
ARSEZoneExit, URSETravelSubsystem, URSETravelDestinationData | RSE, RSECore | Zone exits, fast travel, the world map |
ARSESavePoint, ARSEAreaVolume | RSE | A save point; a named area |
ARSEEncounterSpawner, ARSERandomEncounterArea, URSEEncounterSubsystem | RSE | Visible enemies, random battles, rate and frequency |
URSEEncounterPoolData, URSERoamingBehaviorData | RSECore | Pools and roaming behaviors |
URSEReinforcementData, URSEBattleScriptRunner | RSECore | Reinforcements and scripted battle events |
ARSEReinforcementSpawnPoint | RSE | Where help may come from (Free Tactics) |
URSEMapData, URSEMapStyle, URSEMapSubsystem | RSECore | Map data, look and runtime state |
ARSEMapBoundsVolume, ARSEMapRegionVolume, URSEMapMarkerComponent | RSE | Map bounds, region names, markers |
ARSETimeOfDayActor, URSETimeOfDayProfile | RSE | Sky and lighting |
URSETimeSubsystem, URSEWeatherTableData | RSECore | Clock, weather and their tables |
ARSEWeatherVolume, URSENightLightComponent | RSE | Local weather rules; lamps at night |
URSENPCScheduleData, ARSENPCPlace, URSENPCStyleData, URSENPCReactionData | RSECore, RSE | NPC days, places, styles and reactions |
URSENPCActivityBehavior | RSECore | Scriptable activity (Blueprintable) |
URSEWorldReactionSubsystem | RSE | Abilities changing the world |
16.4 Settings
Project Settings → RPG Saga Engine, groups used by exploration (full lists in Appendix B):
| Group | What it holds |
|---|---|
| Interactables | Compass points, danger ratings, default verbs, which kinds Populate Interactions places |
| Living World | Highlights, hints and sparkles over usable objects, default interact animations |
| World Reactions | The rule table: which ability on which object gives which result |
| Puzzles, Puzzle UI | Default texts, recipes, lock and door looks |
| Exploration RPG, Exploration RPG (Presentation) | Skills, traps, locks, stealing, distractions, fallen members, texts |
| Encounters, Encounters (World) | Default teams, rate effects and traits, frequency levels, contact, grace times, visible enemy look |
| Reinforcements, Reinforcements (Presentation) | Call rules, interrupting statuses, spawn point rules, banners, runners |
| Stealth | Detection speeds, sneaking, hearing, concealment tags |
| Map Generator, Map & Minimap | Picture generation, categories, minimap, compass, pins, fog, quests |
| Time of Day, Time of Day Visuals, Weather Visuals, Time & Weather Rules | Day length, start, phases, seasons, the sky, enemy and battle effects |
| Living NPCs | Reactions, crimes, defaults for NPC movement |
| Travel | Fast travel rules and the world map |
Time defaults: one real hour is one game day (Day Length Minutes 60), the game starts at 08:00 on day 1, Dawn / Day / Dusk / Night phases, and the clock pauses in battles, dialogs, cutscenes and menus.
16.5 Blueprint usage
Run a story effect from a trigger. Event (Box Trigger overlap) → Is Flag Set (the story library from Story, dialog and quests) → Branch → Start Dialog or Run Interaction.
React to an interaction. On an Interactable Actor (or a subclass), bind On Interacted (Interactable, Interacting Pawn, Succeeded). Or override On Interact in a Blueprint subclass: such a Blueprint is interactable even without any data (a lever, a switch). Override Can Interact (Custom) for an extra availability rule. Other nodes: Interact, Request Interact, Set Interaction Enabled, Get Prompt Text, Can Interact Now.
Read and change the clock. Get Game Instance Subsystem (class RSE Time Subsystem), then Get Hour, Get Day, Get Phase, Is Phase, Get Weather, Is Weather, Get Time Text, Set Time, Advance Time, Set Weather, Lock Weather, Set Time Scale. Events: On Hour Changed, On Phase Changed, On Day Changed, On Time Skipped, On Weather Changed.
Encounters. On the Encounter Subsystem: Get Encounter Rate Multiplier, Add Rate Effect / Remove Rate Effect, Get Frequency Index / Set Frequency Index, Get World Steps, Compose Encounter (a fresh group from a pool), Start Classic Encounter (an encounter with an initiative). On a spawner: Set Spawner Enabled, Get Group Count, Is Group Defeated, Respawn All, Force Contact.
Travel. On the travel subsystem: Travel To Destination, Is Traveling, Get Current Area, Get Destinations, Get Fast Travel Block.
NPCs. On a Living NPC component: Get NPC Id, Get Current Activity, Is Available, Refresh Schedule, Begin Talk / End Talk, Notify Danger, Report Crime, Try Start Chat. On the NPC world subsystem: Raise Danger, Clear Raised Danger, Report Crime.
Scripted activities. Create a Blueprint with parent NPC Activity Behavior and override Begin, Tick, End, Can Interrupt; pick the class in the schedule entry's Do → Behavior. Built-ins: Use Spot, Wander, Chat, Work At Station.
See Appendix A for every node.
16.6 C++ usage
A custom interactable that reuses the whole interaction pipeline:
UCLASS()
class AMyLever : public ARSEInteractableActor
{
GENERATED_BODY()
public:
virtual bool Interact(APawn* InteractingPawn) override
{
const bool bOk = Super::Interact(InteractingPawn); // runs Interaction, Dialog, puzzle pieces
if (bOk) { Toggle(); }
return bOk;
}
private:
void Toggle();
};
A new interaction-library behavior (appears in the Behavior picker of every kind):
UCLASS(meta = (DisplayName = "Ring Bell"))
class UMyBellBehavior : public URSEInteractableBehavior
{
GENERATED_BODY()
// Override the prompt, availability, use and visual of the behavior, as the shipped ones do.
};
Read the clock from code:
if (URSETimeSubsystem* Time = GetGameInstance()->GetSubsystem<URSETimeSubsystem>())
{
if (Time->IsPhase(MyTags::Phase_Night)) { /* spawn the owl */ }
Time->AdvanceTime(8.f); // a night's rest
}
Extension points: subclasses of ARSEInteractableActor, URSEInteractableBehavior (a new kind of behavior), URSENPCActivityBehavior, URSEBattleScriptEffect (a scripted battle effect), and implementing IRSEMapMarkerSource (Should Show Map Marker) or IRSEWorldReactive on your own actors to join the map or the world reactions.
16.7 Advanced
16.7.1 Reinforcements and scripted battle events
A lone sentry shouts "To me!", three friends run out of the trees and join at the next round. Kill him first and nobody comes.
- Create a Reinforcement Data asset (
URSEReinforcementData). Set Caller (Leader or Any Member), Call Turns (1 = the call completes at the caller's next turn), Call Bark, and Cancel If Caller Interrupted. - Add a Wave: a trigger (When Alerted, Battle Start, Round Reached, HP Below, Unit Defeated, Reinforcements Arrived, Objective Changed, Condition, After Previous Wave, Manual), the units (or a pool), delays and the min and max distance they appear at.
- Put it on the spawner's Reinforcements, on its encounter, its pool or its roaming behavior.
- Try it with
RSE.Reinforcements.Setup, thenRSE.FreeTactics.Start.RSE.Reinforcements.Statuslists calls and runners.
In Free Tactics the battle picks hidden points between the minimum and maximum distance: out of the camera's view and out of every party member's line of sight, on standable ground with a path to the fight, and inside the battle area. Place RSE Reinforcement Spawn Point actors where help should come from (the end of a road, a cave): Spawn Points decides whether they are Fallback, Prefer or Only. Runners show on the minimap and compass, and join at the start of the next round. Leftover decides what happens if the battle ends first: they vanish, or become a visible roaming group.
Other modes: in grid Tactics the units enter at the edge tiles nearest the caller; in ATB and turn-based they step into the formation. The bark, banner and sounds work everywhere.
Scripted battle events are an ordered list on an encounter (Battle Events): a trigger, a speaker, a line or a dialog, a camera (Reframe, Cinematic, None), Talk Only or Act Now, and effects (Call Reinforcements, Change AI Profile, Apply Status, Spawn Surface, Change Objective, Play Cue, or your own URSEBattleScriptEffect). For example a boss at half HP shouts, calls his sellswords, gains a status and acts at once. From Blueprint, the director's Get Script Runner returns a URSEBattleScriptRunner with Start Reinforcements, Fire Event, Get Calls, Get Incoming Count, Is Calling and the events On Call Started, On Wave Called, On Wave Arrived, On Script Event.
16.7.2 Dialog battles and who strikes first
The Start Battle effect has an Opening (From Context, Normal, Party First, Speaker First), Scene NPCs Fight (the NPC who speaks and combatant NPCs nearby fight where they stand in Free Tactics), a Faction, Combatants and an Encounter. From Context means a dialog choice lets the party strike first and a speaker's line lets the speaker's side strike first. Make an NPC a combatant in its NPC | Combat category.
16.7.3 Reactions and crimes for living NPCs
When a battle starts nearby, living NPCs react instead of freezing, then return to their day: an NPC Reaction asset (URSENPCReactionData) chooses Flee, Watch, Cower, Help or Ignore, with trigger distance and delays. Guards answer crimes (NPC.Crime.* tags: Theft, Trespass, Assault, or your own) they see or hear by warning, chasing and running effects (a fine, a battle). Crimes come from pickpocketing, attacking an NPC, and the Report Crime effect.
16.7.4 Abilities on the world
One rule table in Project Settings → World Reactions → Rules lets a fire spell light torches, ice put out lights and freeze a pond, and wind clear fog. Mark an ability Usable On World and give objects Reactive Tags. Use URSEWorldReactionSubsystem (Apply Ability At, Cast On World, Would React) from Blueprint.
16.7.5 Maps in depth
- Layers. Generate Map sorts meshes into ground, roads, water, forests, buildings and rocks by actor or component tags (
MapBuilding,MapWater,MapForest,MapRock,MapGround,MapHide,MapCanopy), then by name words, then by size. - Bounds and regions. An RSE Map Bounds Volume sets what the map covers (its arrow points up). RSE Map Region Volume writes region names with an importance (Major, Normal, Minor).
- Styles. Clean, Painted, Parchment and Blueprint ship; duplicate a Map Style asset for your own.
- Markers and objectives. Add the RSE Map Marker component to any actor. Give a quest objective a Map Target and the marker the same Target Id to show it on the area map, minimap and compass.
- Batch.
RSE.Map.Generate,RSE.Map.Generate All, or theRSEMapGeneratecommandlet with-AllowCommandletRendering. - Performance. Maps are static pictures. The minimap and compass update on a light timer. The fog is a small texture updated only when something new is explored.
16.7.6 Time and weather in depth
- Rules in Time & Weather Rules (also a rules-profile section): roaming enemies by phase and weather (sight, hearing, reaction, chase speed, aggression, density), other encounter pools at night, and battle modifiers by weather or phase.
- Conditions and effects for stories: Time Of Day Is Between, Phase Of Day Is, Weather Is, Day Number, Season Is; Set Time, Advance Time, Set Weather, Lock Weather, Set Clock.
- Materials. The weather writes wetness, puddles, snow cover, wind and more into the material parameter collection
MPC_RSEWeather; any material can read it.M_RSE_WeatherGroundis a ready example. - Indoors. Place a Weather Volume with Blocks Precipitation, or set Weather Mode to None and Time Mode to Fixed Hour on the actor for a dungeon.
- Steam Deck and low settings. The sky updates less often, clouds are a painted layer and precipitation uses about a third of the particles. Only the lamps nearest the camera stay real lights.
16.7.7 Multiplayer notes
An interaction is a command: in co-op the host applies it for the player who pressed the key, and lines and notifications show for that player. NPC decisions, reactions and chases run on the host; movement replicates as usual. See Co-op and online.
16.7.8 Performance notes
Groups of visible enemies sleep beyond their Activation Radius and think a few times a second. NPCs update on schedule changes and on a timer, not every frame. Interactables have no Tick. Night lights cap the number of real lights near the camera.
16.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No prompt on an object | Prompt Conditions fail, the object is spent, or it is disabled | Check the conditions; Set Interaction Enabled; for World Interactables check the kind's Use Conditions |
| An examine pickup repeats | The Taken Flag is missing | Set it; it is required and saved |
| A door never opens | Its Open Conditions read the wrong tag | Check the Area or flag the unlock effect writes |
| No random battles | The area is not Enabled, its box misses the ground, no ATB director on the map, or a Repel or x0 trait is active | RSE.Encounter.Status shows the rate |
| A visible enemy is a grey placeholder | Its character has no Appearance | Set one, or the spawner's Appearance Override |
| Enemies walk into walls | No navigation mesh | Add a Nav Mesh Bounds Volume |
| Aggressive enemies never notice the party | A Repel is active with Rate Scales Enemy Detection, or sight is too short | RSE.Encounter.Debug 1 draws the cones |
| Battles start again right after one ends | Grace time too short | Raise Post Battle Grace Seconds |
| A lantern does not light at night | Its schedule is not Night, or the level has no Time of Day actor | Set it, and place the actor |
| NPC stays at one spot | No schedule, or its places do not exist | Set a schedule; place NPC Places with matching ids |
| An NPC does not return after a battle | Reactions are off or its activity cannot be interrupted | Check Reactions → React To Battles |
| "Save the level first" on Generate Map | The level was never saved | Save it |
| A forest shows as buildings on the map | Name rules guessed wrong | Tag the meshes MapForest / MapBuilding |
| No minimap in play | No DA_Map_<Level>, or the player turned it off | Run Generate Map |
| The reinforcements never arrive | The call was interrupted, or the battle ended first | RSE.Reinforcements.Status; see Leftover |
16.9 See also
- Story, dialog and quests for conditions, effects, dialogs and scenes.
- Free Tactics (Live) for battles on the live map, stealth and the party in the world.
- Battle fundamentals for encounters and rewards.
- World building for Populate Zone, interiors and test rooms.
- Save and load, Co-op and online, Platforms and performance.
- Product pages in
docs/product/:exploration-rpg.md,interaction-library.md,random-encounters.md,reinforcements.md,maps-and-minimap.md,time-and-weather.md,living-npcs.md.
17. World building
In short: a handful of editor tools turn an empty stretch of your map into playable content: a battle site, a populated zone, buildings you can walk into, interiors built from your own asset packs. Test rooms prove the framework works, and the World Partition support keeps saves, locks and battles correct in big streamed worlds. Use this chapter when you stop testing in a grey box and start building your real maps.
17.1 Basics
17.1.1 The tools at a glance
| You want | Use | Where |
|---|---|---|
| A place where a battle happens on the live map | Make Battle Zone Here | Studio: World → New battle zone |
| Random encounters, enemies, chests, a save point and a trader for an area | Populate Zone | Studio: World → Populate a zone |
| Signposts, warnings, fires, lanterns, notes along roads | Populate Interactions | Modes → RPG Saga: World Tools |
| People who live in an area, caravan routes, barrels and crates, ladders and ledges | The living world tools | Modes → RPG Saga: World Tools |
| Buildings the party can enter | Building Analyzer, RSE Building Entrance | World Tools, or by hand |
| Interiors built from a pack's own walls and furniture | Interiors from Asset Packs wizard | RPG Saga Engine → World → Interiors from Asset Packs |
| Small proof maps with a smoke test | Test Rooms | RPG Saga Engine → Advanced tools → World → Test Rooms |
All the placement tools work the same way: choose an area, press Preview (nothing changes, markers and a report show what would happen), then press Apply. Apply is one undo step, and running a tool again on the same place or with the same group name replaces its earlier result instead of doubling it.
17.1.2 Your first battle site
- Open your level and point the viewport at the ground where the battle should be.
- Open the tool: in the Studio, World → New battle zone; or right-click the viewport and choose RPG Saga → Make Battle Zone Here; or Modes → RPG Saga: World Tools for the panel with every option.
- Set the area. Drag a rectangle on the ground (left-drag while the mode is open), or click a point and pick a Size Preset (Small 8 × 8, Medium 12 × 12, Large 16 × 16, Wide 20 × 12 tiles). Use Camera Focus and Use Selection Bounds are the other two ways.
- Pick an encounter, or a progression zone to generate an enemy group from its encounter pools.
- Press Preview. Green tiles are walkable, dark ones blocked, blue ones are deployment tiles, red markers are enemies (the arrow is their facing), orange marks the classic stage. Problems get a pink cross.
- Press Apply. Press Ctrl+Z if you do not like it.
You get, in the Outliner folder BattleSites/<Site>: a baked Tactics zone, its battle director (waiting for its trigger), the encounter layout (deployment tiles and enemies written into the encounter), an optional trigger over the deployment tiles, and an optional classic battle stage on flat, clear ground nearby. Give the site a name: running the tool again with the same name updates it.
17.1.3 Your first populated zone
- Open World → Populate a zone.
- Pick a progression zone, the area, optionally a Populate Rules asset (Content Browser → Add → Miscellaneous → Data Asset) and a shop for the trader.
- Preview shows one labeled marker per placement and its distance from the Player Start.
- Apply places them in the folder
Populate_<Zone>. Press Re-roll and Apply again until you like the layout: each Apply first removes what the previous run of the same zone placed.
17.1.4 Your first building you can enter
- Open Modes → RPG Saga: World Tools → Building Analyzer and press Preview. Every building is outlined in the color of its proposed mode with its door and the reason.
- Correct any proposal in Mode Overrides or Template Overrides, then Apply.
- Open the new interior asset's template map, replace the placeholder props (tagged
RSE.InteriorPlaceholder) with your own, and put your NPCs on the RSE Interior Slot markers. - Play and walk to the door.
17.2 How it works
17.2.1 Battle sites and the grid on the live map
A battle zone is an ARSETacticsZone placed on your level as it is. Bake Grid traces the real ground under every tile (exact height and slope, besides the whole-step height the rules use). Units, the turn marker and every highlight stand on the measured surface. The tool previews with the same trace as Bake Grid, so what you see is what you get. Anything a character cannot stand on is skipped: surfaces that do not block pawns (grass), pawns, objects narrower than Bake Min Surface Size, and anything tagged RSE.GridIgnore.
Grid Visual Mode (Project Settings → RPG Saga Engine → Tactics Zone, overridable per zone):
- Projected (default): one decal paints the grid and all highlights onto the level. One draw call, follows slopes and steps. Needs the deferred renderer.
- Tiles: an instanced flat mesh per tile on the measured surface. For forward or mobile renderers.
Several battle sites can share a map: the player's controller switches to the site whose battle starts. When a battle starts, a unit standing off the grid or on a blocked or taken tile moves to the nearest free walkable tile, with a log warning.
17.2.2 Populate rules
Populate Zone places these kinds: random encounter areas, enemy spawners with patrol points, chests (money and loot by level, higher the farther from the Player Start, each with its own Opened flag), a save point near the Player Start, a trader NPC, and optional signposts and zone exits. The Populate Rules asset sets, per kind, a count (plus more per 100 m² up to a maximum), a minimum spacing, and a band of path distance from the Player Start. Kinds keep a distance from each other and from what is already in the level, stay away from Tactics zones and classic stages, and obey a total density cap.
Placement follows the navmesh when the level has one, so every placement is reachable. Without one, Apply adds a Nav Mesh Bounds Volume over the area and builds it. The seed decides everything: the same seed gives the same layout.
17.2.3 Populate Interactions and the living world tools
Populate Interactions places the interaction library: signposts at crossroads (their arms named after the point of interest down each road), danger warnings where a road enters a dangerous zone, chests, fires, lanterns and notes beside roads, and gathering nodes, remains and shrines in the wilds. Roads are RSE Road spline actors (any actor tagged RSE.Road also counts). Without roads, the navmesh paths between points of interest are used. Each interactable kind has a Placement block that says where it may go, its weight, spacing and density.
The living world tools are four more entries of the Tool list in the World Tools mode:
- Populate NPCs: people who live in the area, with a schedule or a wander radius, bark pools, appearances and names.
- Place Caravan Route: a road between stops, along the navmesh or straight, looped or back and forth.
- Populate Destructibles: clusters of barrels, crates and pots where the interaction library would put them.
- Traversal Analyzer: samples the ground and proposes ladders, climbs, vaults, jumps and swim volumes. Untick a proposal's Accepted to skip it.
17.2.4 Buildings
Every building is entered in one of three ways, set on one actor placed at its door, RSE Building Entrance (ARSEBuildingEntrance):
- Real Door: the building has a walkable inside in the level. An RSE Door opens by itself when the party comes close, and an RSE Interior Volume inside brings the camera closer. Door Access can lock it behind opening hours, a key or story conditions.
- Separate Interior: nothing is behind the door. Interacting (or, with Enter On Touch, walking into the doorway) blacks the screen out for a moment and the party stands in a separate small map loaded far from the playable area. The interior's RSE Interior Exit brings the party back to the entrance's Exit Point.
- Decor: no access, optionally a line when examined (Decor Text).
The entrance finds its real door in order: a door actor next to the building, a socket of the building's mesh named with a door word ("Door", "Entrance_Front"), a door-shaped opening found by probing the facade with rays, and last the Assumed Door Side. Detect Door (button on the entrance) runs the same search. To place an entrance yourself, move and turn it so its arrow points out of the building, set Door Width and Door Height, and tick Keep Placement: the analyzer then leaves it alone. Place Exit Point puts the exit on walkable ground in front of the door, on the navmesh when there is one.
An Interior Data asset (URSEInteriorData) describes where the door leads: the map, the template, the entry point (an RSE Arrival Point id such as Entry, or an actor tag), the blackout time, Closed Phases (for example night), a Key item, story Conditions, and the texts shown when closed or locked. The ready templates (DA_InteriorTemplate_Inn, _House, _Shop, _Smithy, _Temple, _Cellar, plus Tower, Manor and Workshop) live in /RPGSagaEngine/Interiors/Templates.
Interior Rules (on the template, overridable per interior, else Buildings → Default Rules) decide how a visit behaves:
| Rule | Default | Meaning |
|---|---|---|
| Party Inside | Leader Only | Companions wait hidden at the door and rejoin at the exit. Whole Party takes everyone. |
| Allow Battles | off | Encounters are refused while inside. |
| Seal | on | A black shell around the room: nothing of the world shows. |
| Hide World Lighting | on | Sun, sky light, fog and clouds are hidden for the visit. |
| Interior Sunlight | off | Directional lights left in the interior map stay off. |
| Fixed Exposure / Exposure EV100 | off / 8 | A fixed exposure instead of eye adaptation. |
While the screen is black the exposure is set at once, so the eye never fades slowly from a sunny street into a lit room.
17.2.5 Generated interiors
Set Interior Data → Generation → Enabled and the interior is built under the blackout by one RSE Generated Interior actor in the generated-interior map (Buildings → Generated Interior Map). Inputs:
| Field | Meaning |
|---|---|
| Program | Which rooms on which floor (an inn: common room and kitchen downstairs, bedrooms upstairs, a cellar) |
| Theme | The personality: Common, Craftsman, Hunter, Witch, Merchant, Noble, Innkeeper, Scholar |
| Footprint, Floors, Cellar | The size and the number of floors (the analyzer measures the building) |
| Door Offset | Where the door is along the facade, so the doorway matches the outside |
| Seed | Another layout and dressing for each seed (the analyzer derives it from the building's name) |
A floor is a hub (hall, common room, landing) with rooms around it, joined by stairs that hug a wall. Floors above the one you stand on are hidden (cutaway). Programs, themes and furniture are data assets under /RPGSagaEngine/Data/Interiors. Preview Interior on the actor builds any interior in the editor.
Each Furniture asset (URSEFurnitureData) names its tags, its mesh, its Front (the mesh axis it faces) and a placement rule: Against Wall, Corner, Center, Around Anchor, On Anchor, Wall Mounted, Ceiling or Free. The generator keeps doorways, stairs and each piece's front clearance free and checks that everything stays reachable. Check Furniture on the actor flags pieces facing the wrong way, off their wall, overlapping, blocking a door or unreachable.
Furniture with an interactable becomes a world interactable: fireplaces and lanterns, wardrobes, chests, beds (rest), books and letters (read, backed by lore entries), workstations (shop counter, anvil, altar) and hidden stashes. Program roles (innkeeper, cook) become NPC Places named <Interior>.<Role>, and the interior's Inhabitants put your story NPCs there.
17.2.6 Interior kits: your own packs
The Interior Kit Wizard points the plugin at the folders of a modular environment pack and builds interiors out of that pack's own pieces. You keep your packs where they are: nothing is copied, renamed or moved, and the plugin never ships them.
- Sources: add the pack's folders and choose the language packs for the words read in names.
- Scan: every mesh is measured (size, pivot, door and window holes found with rays) and classified. Results are cached, so a second scan of an unchanged pack takes seconds.
- Kits: one card per kit shows the module (wall width), floor tile, wall height and thickness. Orange numbers mean pieces disagree: type the right value. Merge into, Split by Folder, Split Off Selected and Exclude Kit fix a wrong grouping.
- Review: a table of every mesh with its kind, confidence, front, placement, interaction and kit. The Why panel explains each decision. Bulk edit with Set Kind, Set Front, Rotate Front 90, Set Placement, Set Interaction, Set Kit, Ignore, Accept. Your corrections are remembered and survive a new scan. The wizard prefers asking to guessing: low-confidence rows and unsure fronts are marked needs review.
- Preview: a sample two-storey house built from the kit's real pieces. Click a wrong piece to fix it right there.
- Create: writes
DA_InteriorKit_<Kit>,DA_Furniture_<Kit>_<Mesh>andDA_InteriorTheme_<Kit>(with substitutions by kind). Dry Run reports without writing. Create is idempotent and keeps your hand edits unless Overwrite Manual Edits is on.
With a kit, the layout snaps to the kit's grid and the interior is built from the pieces: plain, door, window and corner walls, floor and ceiling tiles, door frames and leaves, stairs, railings, trims. A piece the kit lacks, or one that would have to stretch more than the allowed limit, becomes a box in the kit's material with a note in the log: an interior is never broken. Stairs and railings may stretch more than walls (Kind Stretch). Single-sided interior walls show their finished face to the larger room.
17.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEBattleSiteLibrary | RSEEditor | Plan, apply and check battle sites |
URSEPopulateLibrary | RSEEditor | Plan and apply Populate Zone |
URSEPopulateRules | RSEEditor | Counts, spacing and bands for Populate Zone |
URSEWorldToolsSettings | RSEEditor | Project Settings → World Tools |
URSEInteractionPlacementLibrary | RSEEditor | Populate Interactions |
URSELivingWorldToolsLibrary | RSEEditor | Populate NPCs, caravan routes, destructibles, traversal analysis |
URSEWorldBuildLibrary | RSEEditor | Editor Python helpers: landscape from raw files, layer infos, instanced scatter |
URSEBuildingAnalyzerLibrary | RSEEditor | The Building Analyzer |
ARSEBuildingEntrance | RSE | The door actor: mode, interior, exit point |
ARSEDoor, ARSEInteriorVolume, ARSEInteriorExit, ARSEInteriorSlot | RSE | Real door, camera volume, way out, slot marker |
ARSEGeneratedInterior | RSE | Builds and previews generated interiors |
URSEInteriorData, URSEInteriorTemplateData | RSECore | What a door leads to, and the room templates |
URSEInteriorKitData, URSEFurnitureData | RSECore | A pack's pieces on a grid, and one furniture piece |
URSEKitLibraryFunctions, URSELegacyKitConverter | RSEEditor | Wizard calls and the converter for older theme meshes |
URSEInteriorToolsLibrary | RSEEditor | Interior map checks |
URSEWorldStreamingSubsystem | RSE | World Partition streaming, battle cells, data layers |
URSETestRoomDefinition | RSECore | One test room and its smoke script |
URSEBattleLauncherSubsystem | RSE | The in-game battle launcher |
17.4 Settings
All in Project Settings → RPG Saga Engine. The full list is in Appendix B.
- World Tools: size presets, the walkable share a site needs, deployment tile count, generated group size, enemy spacing and area, the stage search, default Populate rules, preview colors.
- Tactics Zone: Grid Visual Mode, the projected grid's look and the bake rules.
- Buildings: default rules, blackout seconds, the generated interior map, door detection widths, exposure behavior, and Generation → Modular → Build (Build With Kit, Use Corner Pieces, Face Larger Room, Kind Stretch, Preload Timeout).
- Interior Kits: the taxonomy, output folder, scan speed, review thresholds (Review Threshold 0.6, Front Review Threshold 0.25), the kinds a complete kit should have.
- World Partition: see the next section.
17.5 World Partition
The framework works on World Partition maps. Saves, quests, locks, chests, doors, NPC places and battles survive a cell unloading and loading again, because state lives in the framework's world-state subsystem under a State Key, not in the actor.
Start on World Partition: the New RPG Project wizard has a World Partition option under Maps. For an existing map use File → Convert Level, then Fix State Keys.
Stable keys. Every object that keeps saved state (triggers, spawners, random encounter areas, traps, locks, interactables, building entrances) has a Save Key property. You do not type it: the editor assigns one when you place, paste or duplicate the object. Map Check (Build → Check for Errors) warns on a missing key and errors on a duplicate. Fix State Keys (RPG Saga Engine → Advanced tools → World, or the console commands RSE.StateKeys.Check and RSE.StateKeys.Fix) repairs the whole level, loading unloaded actors in batches. Run it after converting a map, after importing actors, and before shipping. Without a key the framework derives one from the level path and actor name, which works until you rename the actor.
Streaming and battles. Always-loaded by design: battle directors, Tactics zones, ATB scenes, zone volumes and arrival points. Put them in the persistent level. A battle keeps the cells around it loaded until it ends (Keep Battle Cells Loaded, Battle Streaming Margin, Min Battle Streaming Radius).
Data layers. Use runtime data layers for parts of the world the story changes. The effect Set Data Layer State (Unloaded, Loaded, Activated) and the condition Data Layer State drive them without code. The state is saved and applied again after a load.
Interiors. The interior level instance loads at Interior Origin, off the map. The door's cells stay loaded while the party is inside (Keep Exterior Loaded Inside, Exterior Streaming Radius). A save made inside restores the party inside. Do not make an interior map a World Partition map.
Limits. A Level Instance placed more than once shares its actors' keys. References between actors in different cells do not survive streaming; use a key, a tag or a soft reference. World Partition support covers single player and co-op hosts.
17.6 Test rooms
A test room is a small map built to exercise one area of the framework, with a smoke test: a short script that plays the room and fails when something does not happen. Rooms ship in /RPGSagaEngine/Examples/TestRooms, built from engine shapes only.
- Interactions: every interactable kind of the interaction library.
- Traversal: ladder, drop, vault, river, rope, zip-line, chasm jump and rope swing.
- Interiors: a generated two-storey house built from two kits (Timber and Station), and a shed with a real door.
RSE.Rooms.Interior kit Stationswitches the house's entrance between the kits. - ActionArena: the action-combat arena with three encounters and launcher presets.
Open a room from RPG Saga Engine → Advanced tools → World → Test Rooms (Open, or Open + Play), or while playing with RSE.Rooms.Go <RoomId> (RSE.Rooms.List lists them). Run the tests in Session Frontend → Automation: RSE.Rooms.<RoomId> per room and RSE.Rooms.Definitions for validity.
The battle launcher (F10, or RSE.Rooms.Launcher; RSE.Rooms.LauncherKey changes the key) tries battles in any room: an encounter, a mode override, a party, a rules profile, AI intelligence per mode and a seed. Start, Restart same seed, Restart new seed and Auto-play (RSE.Battle.AutoPlay) are its buttons. Console equivalents: RSE.Rooms.Launch <EncounterAssetName> [Mode] [Seed] [auto] and RSE.Rooms.Restart. These are development tools and are not available in Shipping builds.
Make your own room: build a small level, create an RSE Test Room Definition data asset named DA_Room_<Name>, fill Room Id, Map, Description and Smoke Script, then run RSE.Rooms.<Name>. Each script line is a console command or a word of the dev-script runner: wait <seconds>, waituntil <state> [timeout], assert <state>, assertnot <state>, shot <name>. States include battle, exploration, dialog, inside, outside, viewfloor:<N>, used:<label> and hassave. Write the script by playing: every console command you type in the room is a line of the script.
17.7 Blueprint usage
World tools are editor-only. Use them in editor utility Blueprints (or Python) under the category RPG Saga | World Tools: Plan Battle Site, Apply Battle Site, Make Battle Site, Write Encounter Layout, Check Tactics Zone, Plan Populate, Apply Populate, Populate Zone, Plan Populate Interactions. For a quick scripted battle site:
- Editor Utility Blueprint, Make Battle Site (Request = a filled RSE Battle Site Request: site name, center, size, encounter).
- Check the result's problems list; the result carries the plan's problems when it did not apply.
Runtime nodes you reach for:
- RPG Saga | World Partition: Set Data Layer State and Get Data Layer State on the RSE World Streaming Subsystem; Begin Battle Streaming and End Battle Streaming if you start battles yourself.
- RPG Saga | Buildings on RSE Building Entrance: Get Mode, Get Interior, Get Door, Get Exit Transform, Get Door Width, Get Door Height. On the RSE Interior Travel Subsystem: Is Inside, Are Battles Blocked.
Example, a bridge that appears after a story event: Event BeginPlay → Get RSE World Streaming Subsystem → Set Data Layer State (Data Layer = DL_Bridge, State = Activated). Better still, use the Set Data Layer State effect in a quest or dialog so the story drives it and the state saves.
17.8 C++ usage
// Walk into a building from code (host side).
if (URSEInteriorTravelSubsystem* Travel = URSEInteriorTravelSubsystem::Get(this))
{
FText Why;
if (!Travel->Enter(*Entrance, Pawn, /*bInstant=*/false, &Why))
{
UE_LOG(LogTemp, Log, TEXT("Door refused: %s"), *Why.ToString());
}
}
// React when a World Partition cell streams in.
if (URSEWorldStreamingSubsystem* Streaming = URSEWorldStreamingSubsystem::Get(this))
{
Streaming->OnLevelShown.AddUObject(this, &AMyActor::HandleLevelShown); // void(ULevel&)
}
Extension points: subclass ARSEBuildingEntrance in Blueprint for a custom prompt or sound; add new furniture, program and theme assets for new interior content; add a piece kind to an interior kit as a Gameplay Tag plus a taxonomy row. Python can run the placement tools headless (unreal.RSEInteractionPlacementLibrary.populate_interactions, unreal.RSELivingWorldToolsLibrary, unreal.RSEKitLibraryFunctions).
17.9 Advanced
- Command lines.
UnrealEditor-Cmd MyGame.uproject -run=RSEWorldTools -Map=/Game/Maps/L_Town -BattleSite -Center=X,Y,Z -Tiles=W,D -SiteName=Gate [-Save | -SaveAs=<copy> | -DryRun]runs a tool in a build script (-Populate -Zone=<zone> -Area=...for Populate). It returns 1 when a tool reports an error.-run=RSEKitScan -Paths=/Game/PackA,/Game/PackB -Out=Saved/pack.csv [-Create -Output=/Game/Interiors]scans packs and creates kit assets;-Golden=labels.csvcompares the result with your own labels. - Map generators in Python. RSE World Build Library (
unreal.RSEWorldBuildLibrary) offers Create Landscape (a heightmap of little-endian uint16 heights plus per-layer weightmaps), Find Or Create Layer Info and Add Instances (a hierarchical instanced mesh component with optional cull distances and collision), run headless with-run=pythonscript. - Converting older themes. Right-click a theme in the Content Browser → RPG Saga: Convert Legacy Kit makes a kit asset from its four meshes and measures the wall.
- Substitutions. A theme's Substitutions swap pieces by kind (every bed becomes one of this pack's beds, weighted). Programs and interaction sets keep asking for kinds; the theme decides which pack answers. Give a replacement the tag it replaces so chairs, residents and the checker still find it.
- Performance. Entering a kit-built interior preloads the kit's meshes in the background during the blackout (up to Preload Timeout). Every floor and mesh type is one instanced component. Skip Keep Exterior Loaded Inside when memory is tight; the way out then waits under the blackout until the door's cells have streamed back in (at most Exit Stream Wait Seconds).
- Networking. Interiors and World Partition streaming run on the host. See 22-networking.md.
17.10 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The grid floats, sinks or is missing on some tiles | A zone baked with an older version, or decorative meshes counted as ground | Select the zone and press Bake Grid again; tag decoration RSE.GridIgnore |
| The grid does not show in a forward or mobile renderer | Projected mode needs decals | Set Grid Visual Mode to Tiles |
| Preview reports too few walkable tiles | Area on steep or cluttered ground | Make the area larger, move it, or lower the walkable share in World Tools settings |
| No classic stage was made | No flat clear ground nearby | Clear space, raise the search radius or rings, or place a stage yourself |
| Units jump to another tile when the battle starts | The encounter was laid out for another zone, or the zone was re-baked | Run the tool again or fix the layout in the Encounter Layout mode |
| Populate places nothing in a Combat Area | That kind's combat role keeps it out | Check the kind's Avoid in combat areas role setting |
| The party arrives in a hole or the wrong spot when leaving a building | The exit point is not on walkable ground | Press Place Exit Point on the entrance; read Get Points Problem |
| A prop shows backwards in the kit preview | Its front is wrong | Click it and Rotate Front 90, or fix it in Review |
| Interior pieces are replaced by boxes | The piece would stretch too much, or the kit lacks the kind | Raise that kind's Kind Stretch, or Set Kind a mesh to fill the gap |
| A chest is closed again after streaming | Its state key changed (renamed actor, copied level instance) | Run Fix State Keys and keep the keys |
| A door entrance is not found by the analyzer | The mesh has no door shape | Name a socket "Door", or place the entrance by hand with Keep Placement |
17.11 See also
- 14-narrative.md for the effects and conditions that drive data layers and locked doors.
- 15-exploration.md for interactions, travel and save points.
- 09-battle-tactics.md and 08-battle-common.md for the zones, encounters and battle modes the sites use.
- 25-editor-tools.md for the Studio and the wizards.
- Product pages:
docs/product/world-tools.md,buildings.md,interior-kits.md,test-rooms.md,world-partition.md.
18. Character visuals and animation
In short: a character's looks are data. A look (appearance) names a body, optional modular parts, a thin Anim Blueprint and an animation set, and the battle systems play animations and effects from that data. You can bring characters in with one click from a single mesh, import a whole pack, sort thousands of clips with the Animation & FX Library, add paired finishers, and render portraits and icons, all without writing an Anim Blueprint.
18.1 Basics
18.1.1 The pieces
| Piece | What it is |
|---|---|
Look (URSECharacterAppearance) | The data asset a character points to in its Appearance field: the parts, material variants, the Anim Blueprint, the animation set, the capsule and the attachment points. |
| Body preset | A project-wide body (mesh, Anim Blueprint, animation set, feet offset, capsule, anchors) stored in Project Settings → RPG Saga Engine → Character Visuals → Body Presets. A look can name one instead of carrying its own. |
Animation set (URSECharacterAnimSet) | One slot per moment: ready, casting, guard, hits from each side, knock-outs, get-up, victory, dodge, turns, portrait pose, talk, expressions, and the real-time action slots (combos, dodge, parry, block). |
| Anim Blueprint | A thin child of URSECharacterAnimInstance. All battle logic is in C++, so the graph is only locomotion, a slot and an output. You never need to edit one. |
| Anchors | Named points on the body (Appearance.Anchor.HandRight, HandLeft, WeaponTip, Muzzle, Chest, Head, Feet, Ground) where effects and projectiles attach. The same ability presentation then works on every body. |
If a character has no look, the project falls back to Character Visuals → Fallback Appearance (capsule-and-cube placeholders tinted by team), so a battle is always playable.
18.1.2 Fastest way in: New Character from Mesh
- Import your rigged humanoid model (FBX or glTF) into the project. It must be a Skeletal Mesh.
- Right-click the mesh → RPG Saga Engine → New Character from Mesh.... (Or RPG Saga Engine → Advanced tools → New Character from Mesh..., or the Studio's New character wizard.)
- Check the Display Name (made from the file name), pick a Class and the Kind: Party Member (every battle mode), Recruitable (Tactics units) or Enemy.
- Leave Animations on Auto, and optionally set Target Height in cm.
- Press Preview to read what will happen, then Create Character.
You get, in a folder named after the character under /Game/CharacterPacks: an Anim Blueprint, an animation set, a body preset, a look, ready attack presentations, and, with a class, the character data. Running it again on the same mesh updates the same assets. Models without animations borrow the UE mannequin's, retargeted: install them once with RPG Saga Engine → Advanced tools → Install UE Mannequin Kit.
18.1.3 A whole pack: the character pack importer
For a pack of many characters or skins that share animations:
- Import the pack and leave it where it is. The importer never edits it.
- RPG Saga Engine → Advanced tools → Import Character Pack... (or right-click the folder → RPG Saga → Import Character Pack...).
- Choose the Source Folder, a Profile and the Target Folder.
- Press Dry Run and read the report: skins, triangles per LOD, grounding, animations per slot, anchors, weapons, effects.
- Press Apply. Run it again after changing the profile: names are deterministic, nothing is duplicated.
Per character it creates ABP_<Character>, DA_AnimSet_<Character>, montages with an RSEImpact notify on the hit frame, ready ability presentations, and optional character data (DA_Char_<Character>). Per skin it creates DA_Look_<Character>_<Skin> and color variants.
18.1.4 Sorting clips and effects: the Animation & FX Library
Bought three animation packs and a magic effects pack? RPG Saga Engine → Advanced tools → Animation & FX Library... reads every clip and effect, decides what each one is, lets you fix the few it got wrong, builds styles ("Sword & Shield", "Staff", "Bow") and dresses your abilities.
- Scan Folder for each pack (select the folder in the Content Browser and press From Content Browser first).
- Tick Needs review only and correct the orange-confidence rows with the bar under the grid (Set, Accept, Ignore, Back to Automatic). A rescan never changes your Manual rows.
- Type a style name, pick a weapon, press Auto-build Style.
- Select characters or classes in the Content Browser, press Assign to Selected, then Apply Styles.
- Press Dress My Abilities.
18.2 How it works
18.2.1 How a look becomes a character
URSEAppearanceComponent builds the look on an actor: the leader skeletal mesh with the Anim Blueprint, follower parts that copy the leader's pose (leader pose component, so they are cheap), rigid parts on sockets, material variants, and the visible pieces of the worn equipment. Assets load asynchronously in game. There is no tick: everything happens on events. If the owner has no look, it keeps its placeholder shapes.
Parts are FRSEAppearancePartSpec entries with a slot tag (Appearance.Slot.*), a skeletal or static mesh, an attach socket, materials, and, for weapons, a weapon presentation and hold type (see Weapons). Equipment parts replace the part with the same slot. A look is modular (ERSEModularBody: Auto, Modular, SingleMesh) when it has several skeletal parts; a single-mesh body only shows rigid equipment (weapons, shields, hats) and pieces for slots it already has, so armor never clips through it.
Variants are named material changes per slot (a palette, an outfit color). The character data picks one by name.
18.2.2 The animation flow
Battle code never plays an animation by name. It sets a battle state (ready, charging, casting, guard, down, victory) and fires reactions (hit from a direction, knock-out, dodge, blocked), and the Anim Instance picks the clip from the animation set slot. Several clips in a slot play at random (seeded, so a battle replays the same). Impact timing comes from the RSEImpact anim notify on the hit frame, or is estimated. Knock-outs are played and held on their last pose.
Locomotion is a blend space in the anim set (Locomotion), plus turn-in-place clips and optional orientation and stride warping (Character Visuals → Locomotion Warping).
18.2.3 Profiles: how the importer understands any pack
A profile (RSECharacterPackProfile, a data asset) is a list of name rules: patterns with wildcards or regular expressions. Rule groups: Characters (grouping by skeleton, prefixes to strip, target height), Animations (ordered rules pattern → slot, first match wins, extra matches become random variants), Anchors (socket names to find, then bones), Weapons, Strikes (hit frame and contact reach measured from the clip), Effects (role rules for Niagara, legacy particle systems and sounds), Colors (variants as material instances) and Character Data. A required slot that stays empty takes the fallback body's clip, retargeted when the skeleton differs. Missing anchors follow Character Visuals → Anchor Fallbacks (WeaponTip → HandRight, Muzzle → WeaponTip).
Three profiles ship in the plugin: DA_PackProfile_Generic, DA_PackProfile_LowPolyHumanoid (many characters on a shared skeleton, meshes only) and DA_PackProfile_HeroPack (several skins per skeleton, abilities named after their key). Start from a copy of the generic one and add rules until the dry run is right.
18.2.4 Styles and Dress My Abilities
A style (DA_AnimStyle_<Name>) says which clips fill which slots of an animation set and which clips abilities use. Apply Styles writes one animation set per skeleton (DA_AnimSet_<Style>_<Skeleton>) on top of the character's current one, retargets clips of other skeletons once and caches them. Dress My Abilities gives every ability or character that has no look a pose (strike, shot or cast) plus effects of the ability's element and role, and fills the battle-feel slots (weapon trail, cast, impact, projectile trail) and the status auras. The library remembers what it wrote (Provenance) and never overwrites a field you changed. Abilities from the plugin are never written: their dressed look goes to the characters instead.
What decides the effects is data. The Taxonomy (word rules for animations) and FX Taxonomy (element and role words, Dress Rules) can be duplicated and edited. After editing, press Reclassify.
18.2.5 Paired animations and finishers
Two montages that play together on two units, aligned and synced at one moment: finishers, synced counters and parries, boss grabs, boss phase moments. Pairs are presentation only; the rules already decided the result. A URSEPairedAnimationData asset holds the attacker and victim montages, the sync times, the relative position (distance, angle, victim yaw), alignment mode, motion-warp target, conditions (ability, weapon and target tags, outcome), a camera shot, slow motion and sync cues. A URSEPairedAnimationLibrary lists pairs, and Project Settings → Paired Animations registers libraries and sets frequency, chances, cooldown and side rules. The player's own choice is Options → Game → Finishers (Off / Sometimes / Always). In headless runs and with placeholder units the pair does nothing and the battle continues. Animation & FX Library → Find Paired Animations proposes pairs from clips with shared name stems (attacker/victim words), and Create Pairs builds the assets.
18.2.6 Portraits and icons
Portraits come from data, in this order: the character's Portrait Variants entry for the look variant, then Portrait, then generated art. Dialog portraits can be an image, a video clip, or a live 3D render, set on the speaker and overridable per line. The Portrait & Icon Studio renders portraits for characters and speakers from their looks, and icons for items, abilities and statuses, into textures it names T_Portrait_* and T_Icon_*. It is idempotent (a hash of its inputs decides whether to render again) and never replaces a texture you made by hand. Start it from RPG Saga → Content → Generate Portraits & Icons or right-click assets or a folder in the Content Browser; it shows a dry-run plan first.
18.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSECharacterAppearance | RSE | A look: parts, variants, Anim Blueprint, anim set, capsule, anchors, hold profile |
FRSEAppearancePartSpec | RSE | One part of a look (slot, mesh, socket, materials, weapon presentation, hold type) |
URSEAppearancePart | RSE | A visible piece of equipment that replaces the part of the same slot |
URSEAppearanceComponent | RSE | Builds a look on an actor; forwards battle state and reactions to the animation |
URSECharacterAnimSet | RSE | Animation slots of one body |
URSECharacterAnimInstance | RSE | The C++ base of every character Anim Blueprint |
URSECharacterVisualSettings | RSE | Project Settings → Character Visuals (body presets, fallback look, warping, performance) |
URSECharacterScriptLibrary | RSEEditor | NewCharacterFromMesh and ImportCharacterPack for editor scripts |
URSEAnimLibraryFunctions | RSEEditor | The Animation & FX Library nodes |
URSEPairedAnimationData, URSEPairedAnimationLibrary | RSE | Paired animations and their libraries |
URSEPairedAnimationLibraryFunctions | RSE | Runtime nodes: Find Pair, Play Paired Animation, Try Play Finisher |
ARSEPortraitCaptureRig | RSE | The rig the Portrait Studio renders |
18.4 Settings
Project Settings → RPG Saga Engine. Full list: Appendix B.
- Character Visuals: Body Presets, Anchor Fallbacks, Character Appearance Overrides (a look for characters you cannot edit, such as plugin example monsters), Fallback Appearance with team tint, Empty Slot Look, and animation values (Default Blend Time 0.2 s, Moving Speed Threshold 10 cm/s, turn-in-place rates, locomotion warping on by default, performance: update-rate optimization on, shadows on, Min LOD Bias 0).
- Character Packs: Default Profile, Target Root (
/Game/CharacterPacks), Body Preset Prefix, New Character Profile, New Character Default Class, Display Name Noise Words. - Animation & FX Library: Library Folder (
/Game/AnimLibrary), Taxonomy, FX Taxonomy. - Paired Animations: libraries, finisher frequency and chances, alignment, camera, slow motion.
- Generated Art and the Portrait Studio settings: output root (
/Game/Generatedby default), sizes, framing and light presets.
Body presets are written to DefaultGame.ini, which is shared. The importer therefore writes them only when Write Body Presets is on; by default each look carries its whole body and works in any project.
18.5 Blueprint usage
Character content is data, so most of the work is editor clicks. Nodes you reach for:
- RPG Saga | Animation Library (Editor Utility Blueprints): Scan Folders, Reclassify Library, Auto-build Style, Build Style From Selection, Assign Style, Apply Style, Dress My Abilities, Summarize Library.
- Paired animations (runtime): Find Pair, Play Paired Animation, Try Play Finisher, Compute Pair Alignment, Get Finisher Frequency, Set Finisher Frequency.
- Portraits: Get Character Portrait, Get Icon, Get Speaker Portrait.
Example: a custom boss grab from Blueprint.
- In your boss graph: Make RSE Paired Context (fill in the kind and the ability, weapon and target tags) → Find Pair (Context = the result, Roll = Random Float).
- Is Valid on the returned pair.
- Is Valid → Play Paired Animation (Pair = the result, Attacker = the boss actor, Victim = the target actor, Local Camera = true, Victim Falls = false, On Finished = a custom event that continues your logic).
Add the RSE Appearance component to your own actor, set its Appearance (and Variant), and press Rebuild in the editor to preview the look in the viewport.
Components that put the plugin's systems on your own actors (RSE Interactable, RSE Explorer, RSE NPC Talk, RSE Door, RSE Combat Role, RSE Traversal, RSE Map Marker, RSE Night Light) are listed in docs/product/components.md. Any of them can be added in the Components panel of a Blueprint-only actor.
18.6 C++ usage
// Show a look on your own actor, then drive its animation.
UCLASS()
class AMyNPC : public ACharacter
{
GENERATED_BODY()
UPROPERTY(VisibleAnywhere) TObjectPtr<URSEAppearanceComponent> Look;
public:
AMyNPC() { Look = CreateDefaultSubobject<URSEAppearanceComponent>(TEXT("Look")); }
void BeginPlay() override
{
Super::BeginPlay();
Look->SetAppearance(LookAsset, TEXT("Red")); // soft ref + variant name
Look->SetBattleState(ERSEAnimBattleState::Ready);
}
};
Extension points: subclass URSECharacterAnimInstance for custom animation logic (the shipped Anim Blueprints then keep working); resolve anchors with ResolveAnchor and GetAnchorLocation when you spawn your own effects; add new part slots and anchors as Gameplay Tags.
18.7 Advanced
- Command line.
UnrealEditor-Cmd <Project>.uproject -run=RSECharacterPack -Source=/Game/Pack [-Target=<folder>] [-Profile=<object path>] [-DryRun] [-WritePresets] [-NoVariants] [-NoPresentations] [-NoCharacterData] [-NoRetarget] [-TextureGroups] [-LowMinLOD=<n>]. Portraits:-run=RSEPortraitStudio -AllowCommandletRendering [-Paths=...] [-Output=...] [-Force] [-DryRun], or-ExecCmds="RSE.PortraitStudio.Generate,QUIT_EDITOR"when you need the editor's font renderer for template icon letters. - Meters-scaled rigs. Rigs exported with the root bone scaled by 100 are detected and corrected automatically; the report prints a Note per corrected batch.
- Grips. On bare hand bones the importer's Auto Grip computes how each weapon is held; a Grip Reference mesh gives the direction. The result is editable data on the look part.
- Handheld performance. Two optional importer switches move textures to the Character texture groups and give the Low quality level a minimum LOD; enable per-quality-level minimum LODs for skeletal meshes in the project for the latter.
- Retargeting. Borrowed clips play in place (root motion extracted) and lose the other pack's particle notifies; sounds stay. Retargeting works best between humanoid skeletons.
- Debugging pairs.
RSE.Paired.Disable 1stops every pair;RSE.Paired.ForceFinishers 1makes every kill with a fitting pair play it (2 also ignores Options Off).RSE.Studio.PairCapture <Dir> Asset=<pair>captures store-page frames.
18.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The character is invisible or a point | Rig exported in meters | Update the plugin and import again; the report names the corrected batch |
| Twisted arms or sliding feet | Retargeting a fallback onto an unusual rig | Use the pack importer with its own animations and tune the profile rules |
| Knock-outs look bent | The pack's death clips end in a ragdoll lead-in | Map a better clip or keep the fallback |
| An attack has no effects or sounds | Effects are paired by name and the names are unrelated | Add effect rules to your profile; the dry run lists unmatched effects |
| A weapon went to the wrong character | Shared folder | Add a rule with a Characters pattern, or enable Match Assets By Name |
| A clip is in the wrong category | Name or measurement misled the classifier | Select it, pick the category, press Set. It stays Manual |
| A plugin look did not change | Plugin content is a template | Copy the look into your project first |
| An ability kept its old look | The library never overwrites your edits | Clear the ability's presentation and dress again |
| The character is too big or small | Model scale | Set Target Height and create it again |
18.9 See also
- 04-characters-and-party.md for character data and classes.
- 06-abilities-and-statuses.md for ability presentations.
- 18-weapons.md for weapon holds and IK.
- 19-camera-and-presentation.md for cues, timelines and cameras.
- 12-battle-action.md for the action-battle animation slots.
- Product pages:
docs/product/character-packs.md,new-character-from-mesh.md,animation-library.md,modularity.md,components.md.
19. Weapons
In short: every attack with a weapon shows that weapon in every battle mode: guns aim and fire, bows release arrows, blades swing with a trail, staves glow. The look is a Weapon Presentation data asset, and how the weapon sits in the hand is fitted in Unreal's own Skeleton Editor with the Fit Weapon tool, with the left hand placed by IK. This chapter covers both, from the first working weapon to sockets, stances, recoil and validation.
19.1 Basics
19.1.1 What you see in battle
- Guns aim, then fire a burst. Each shot has a muzzle flash, an ejected shell, a fire sound, a small camera kick, a tracer that flies to the target and an impact on the target's surface. Each shot gets its own hit reaction.
- Bows and crossbows release an arrow that flies on an arc (straight for a crossbow) and lands with its impact.
- Blades, axes, maces, spears and fists swing with a ribbon trail and a swing sound. The blow lands with the hit effect of the target's surface. A heavy weapon adds a hit-stop.
- Staves play the cast animation and glow at the tip.
The plugin ships one presentation per weapon kind, built only from its own procedural meshes, effects and synthesized sounds, so a project with no effects pack still gets visible gunfire.
19.1.2 Your first weapon, step by step
- Make the presentation. Content Browser → Add → Miscellaneous → Data Asset → RSE Weapon Presentation. Set Weapon Kind (Sword, Axe, Dagger, Spear, Blunt, Fist, Pistol, Rifle, Shotgun, Bow, Crossbow, Staff, Thrown). The stance follows the kind unless you override it.
- Put it on a character. Open the character's look (
URSECharacterAppearance), add a part in the weapon slot with the weapon's mesh, and set the part's Weapon Presentation. Or give an equipment item its own presentation. - Fit it in the hand. Open Tools → RPG Saga Engine → Fit Weapon, pick the character and the weapon, press Fit in Skeleton Editor, and move the socket until the weapon sits right. Save the skeleton.
- Check. Press Validate in the same tab.
- Play a battle. The attack uses the presentation.
Shortcut: run Dress My Abilities in the Animation & FX Library (option Weapon Presentations). It classifies your weapon meshes, finds their muzzles, and writes DA_WeaponPresentation_<Mesh> assets from your pack's effects, sounds and gun clips. A presentation you set by hand is never replaced.
19.2 How it works
19.2.1 Which presentation an attack uses
In order:
- The weapon the unit visibly holds: the look's weapon part (Appearance → Parts → Weapon Presentation) or a worn item's mesh.
- Its equipped weapon: Equipment → Weapon Presentation, else the presentation of its equipment type (Project Settings → RPG Saga Engine → Weapon Presentation → Equipment Type Kinds and Kind Presentations).
- In action battles, its action weapon.
- Otherwise the approach default: Default Melee for melee attacks and Default Ranged for ranged ones. Spells and items show no weapon, except a staff's cast animation.
A unit with a ranged weapon shoots its basic attack from where it stands, even when the rules call that attack melee.
19.2.2 Surfaces
The surface of a hit unit comes from an actor tag named like the surface (Surface.Metal) or a Surface.* tag in the character's personal traits, else Default Unit Surface (Surface.Flesh). A presentation has one impact entry per surface (Surface.Flesh, Metal, Stone, Wood, Energy, or your own child tags) and a Default Impact for the rest. In action battles, world hits use their physical material through Physical Surfaces.
19.2.3 How a weapon is attached to the hand
All attachment goes through one path (RSEWeaponHold). A weapon part of a look, or a worn item mesh, is attached to the wielder's hand for its hold type:
| Hold type | For |
|---|---|
| Pistol | Handguns: one-handed grip, the other hand cups it |
| Rifle | Rifles, SMGs, shotguns, crossbows |
| One Hand Melee | Swords, daggers, maces, axes, thrown knives |
| Two Hand Melee | Greatswords, great axes, hammers, tools |
| Polearm | Spears, lances, polearms |
| Bow | Bows (usually held in the left hand) |
| Staff | Staves, wands, rods |
| Unarmed | Fists, claws: nothing held |
The hold type is Auto from the weapon kind unless you override it on the part or in Fit Weapon.
The right hand has one socket per hold type on the skeleton, on the hand bone: RSE_Pistol_R, RSE_Rifle_R, RSE_OneHand_R, RSE_TwoHand_R, RSE_Polearm_R, RSE_Bow_L and RSE_Staff_R (the names are in Weapon Hold → Hold Sockets). The weapon's pivot sits on the socket. The Skeleton Editor previews an attached asset exactly that way, so what you see in the editor is what battles and exploration show. When the skeleton has the socket, it wins over any hold profile or generated hold, which remain as the fallback.
A weapon whose pivot differs from its category's gets its own socket on the skeleton, RSE_W_<WeaponMesh> (the prefix is Weapon Hold → Weapon Socket Prefix), which wins over the category socket.
The weapon's own sockets (static or skeletal mesh):
| Socket | Meaning |
|---|---|
Grip | Where the right hand holds it (X = barrel or blade forward, Z = top) |
LeftHand | Where the left hand goes (two-handed holds) |
Muzzle | Where guns fire from |
Tip | The tip of a melee weapon, where trails and spell effects start |
They win over a presentation's stored grip and over the measured one. The names are settings (Weapon Hold → Weapon Sockets). Without a Muzzle or Tip socket, a presentation falls back to its own socket names and offsets, then to the weapon's measured tip: the far end of the mesh from the grip along its longest side.
If the skeleton has no sockets at all, weapons attach through a Weapon Hold Profile (URSEWeaponHoldProfile, one per skeleton) or a hold generated from the skeleton's hand (the finger bones tell the palm and finger directions). RSE.Weapons.Hold.SkeletonSockets 0 turns the sockets off, to compare.
19.2.4 The left hand
The left hand reaches the weapon's LeftHand socket with the Two Bone IK of the character's Anim Blueprint, then turns to the socket's rotation with the RSE Hand Rotation node, so the fingers wrap under the handguard. Rotate the LeftHand socket in the mesh editor and the hand turns by as much, live, also in the Skeleton Editor preview.
The hand is described in a frame that is the same on every skeleton (X along the fingers, Z out of the back of the hand), so one weapon socket works on every body. Weapon Hold → Support Hand Rotations gives, per hold type, the hand's orientation when the socket keeps the weapon's own axes; the plugin sets the rifle and the pistol. A hold type without an entry keeps the IK's own rotation, so add one for two-hand melee or staves if you need it. A hold profile can override it per skeleton and hold type (Override Support Hand Rotation).
The animation curve DisableLeftHandIK (or the profile's Disable Support Hand IK Curve) turns off position and rotation together, for reloads or bashes.
19.2.5 The weapon layers in the Anim Blueprint
Add Weapon Layers to Anim Blueprints puts this chain before the output pose of every RSE character Anim Blueprint. Every node is driven by the anim instance; nothing is set by hand:
- RSE Stance Overlay (from the first upper-body bone): the held weapon's stance over the upper body.
- Local To Component.
- Transform (Modify) Bone on the upper spine: the recoil kick of the chest.
- Transform (Modify) Bone on the weapon arm: the recoil kick of the arm.
- Two Bone IK on the left hand: the support hand on the weapon.
- RSE Hand Rotation on the left hand.
- Component To Local.
Bones come from the skeleton's hold profile, else from the name lists in Weapon Hold settings. A node whose bone the skeleton lacks is skipped by the engine. Anim Blueprints you made earlier get the nodes only after you run the tool; running it again updates the nodes it made.
19.2.6 Stance animations
Each hold of a hold profile has stance clips for its skeleton: Ready, Upper Body Overlay, Aim, Fire, Reload, Attack (variants picked deterministically per battle), Heavy Attack and Cast.
- While a weapon is held, its hold's Ready plays according to Ready Mode: Upper Body (the RSE Stance Overlay node: the legs keep the locomotion, also while walking) or Full Body (replaces the animation set's battle Ready). Profile Default follows the profile's Default Ready Mode (Upper Body unless you change it). The stance fades out while attacks, hits and knock-outs play (Stance Blend Time, 0.2 s).
- A prone, crouched or death clip never plays as a stance: clips pass the same filter as the Fit Weapon idle (Idle Reject Words: prone, crouch, death, sit, ko, lying...). A clip of another skeleton never plays.
- Presentations pick per attacker: the presentation's clip when the attacker's skeleton takes it, else the attacker's own hold profile clip for that role and hold type, else the older fallbacks.
- Suggest Stance Animations fills the empty slots from the Animation & FX Library for one skeleton, best confidence first. Slots you set by hand are never changed.
19.2.7 Guns: fire clips and recoil
A gun never plays a melee clip. Its shot plays, in order: the presentation's clip for the attacker's skeleton, the hold profile's Fire, the animation set's action Fire, the animation set's Recoil pose clip, each only when its name does not read as a melee swing (Gun Reject Clip Words: slash, swing, punch, kick, stab...). Without a fitting clip the gun uses the procedural recoil: the upper spine pitches back and the weapon arm rises, then both recover. Later shots in a burst kick again at 0.6 strength. The kick per hold type is in Weapon Hold → Recoil Defaults (Spine Pitch, Arm Pitch, Duration, Peak Time, an optional Curve), overridable per hold profile (Override Recoil). Characters without an RSE anim instance (placeholder units) keep a simple recoil slide of the whole unit.
19.2.8 Weapons that are part of the body mesh
Some characters carry the weapon inside the body mesh (a gun arm, a modelled blade). Their muzzle and tip are found on the body by name patterns: Body Muzzle Socket Patterns (*muzzle*, *barrel_end*) and Body Tip Socket Patterns (*weapon_tip*, *blade_tip*), sockets first, then bones. When the look holds no weapon part, shots leave from that muzzle and trails follow that tip. The look's own Anchors mapping still wins.
19.2.9 Ranged attacks without a gun
A character holding no gun or bow (a monster's breath, a caster's palm) fires ranged attacks from its Unarmed Shot Anchor: the look's, else Weapon Presentation → Unarmed Shot Anchor (the chest). It never fires from a melee weapon's tip.
19.3 The Fit Weapon tool
Open Tools → RPG Saga Engine → Fit Weapon. (The older Weapon Hold Workbench actor is no longer in the menus; Fit Weapon replaces it and uses the engine's own editors, with live gizmos, undo and preview.)
Pick the Character (a character, a look or a skeletal mesh) and the Weapon (a presentation, an item or a mesh; empty = the look's own weapon). The tab shows the resolved hold type (override with Hold Override), the socket and the idle it will play.
| Button | What it does |
|---|---|
| Fit in Skeleton Editor | Adds the hold socket when missing, seeded from the hold the game used so far. Sets the character's mesh as the preview mesh, attaches the weapon to the socket as a preview asset (earlier Fit Weapon attachments are replaced, others stay), plays a standing idle through the character's Anim Blueprint, and opens the Skeleton Editor with the socket selected. |
| Edit Weapon Sockets | Adds the weapon's Grip, LeftHand (two-handed holds) and Muzzle or Tip sockets when missing, seeded from its grip, and opens the mesh editor. |
| Apply to Category | Copies this skeleton's hold socket to the other skeletons of your looks (scaled by hand size) and this weapon's grip to the other weapons of the hold type, adding RSE_W_<Mesh> sockets where a pivot would sit off its category socket. It shows the full list and writes nothing until you confirm, in one undoable step. |
| Validate | Checks every weapon of the hold type on this skeleton: reversed or off-axis guns (Min Barrel Forward Dot 0.7), grips far from the palm (Max Grip Offset 10 cm) and, for two-handed holds, a left hand farther than Support Hand Tolerance (8 cm) from the LeftHand socket in the stance idle. |
| Suggest Stance Animations | Fills empty stance slots of this skeleton's hold profile from the library. |
| Add Weapon Layers to Anim Blueprints | Installs or completes the chain above in every RSE character Anim Blueprint of the project. |
The idle is the hold's stance Ready, else the animation set's Ready, else the standing sample of the locomotion blend space. Without a fitting idle the reference pose shows, never a random clip. Fit Weapon writes only project content (/Game), never the plugin's or the engine's. In the Skeleton Editor, choosing another preview animation ends the Fit session and stops the IK preview, since the IK runs only with the Anim Blueprint.
19.4 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEWeaponPresentation (asset: RSE Weapon Presentation) | RSE | One weapon's look: stance clips, sockets, flash, shots, impacts, trail, sounds, feel |
URSEWeaponPresentationBase | RSECore | The data the core references (kind, hold type) |
URSEWeaponPresentationSettings | RSE | Project Settings → Weapon Presentation |
URSEWeaponHoldProfile | RSE | Per-skeleton hold: sockets, support hand IK, stance clips, recoil |
URSEWeaponHoldSettings | RSE | Project Settings → Weapon Hold |
FAnimNode_RSEStanceOverlay, FAnimNode_RSEHandRotation | RSE | The two anim graph nodes |
URSECharacterAnimInstance | RSE | Computes stance, IK and recoil inputs; Play Weapon Recoil |
URSEWeaponFitLibrary | RSEEditor | Fit Weapon functions for Python and Editor Utility Blueprints |
URSEWeaponHoldEditorLibrary | RSEEditor | Add Weapon Layers and Suggest Stance Animations |
URSEWeaponLibraryFunctions, URSEWeaponLibrarySettings | RSEEditor | Classify meshes and make presentations from your packs |
19.5 Settings
Project Settings → RPG Saga Engine. Full list: Appendix B.
Weapon Hold:
| Setting | Default | Meaning |
|---|---|---|
| Enabled | on | Weapon holds on or off |
| Use Skeleton Sockets | on | Read the RSE_* sockets on skeletons |
| Hold Sockets | RSE_Pistol_R ... RSE_Staff_R | Socket name per hold type |
| Weapon Socket Prefix | RSE_W_ | Per-weapon skeleton socket prefix |
| Weapon Sockets | Grip, LeftHand, Muzzle, Tip | Names on the weapon mesh |
| Fallback Hold Type | One Hand Melee | When nothing else decides |
| Support Hand IK / Rotation | on / on | The left hand IK and its rotation |
| Default Ready Mode | Upper Body | Stance mode when a hold says Profile Default |
| Stance Blend Time | 0.2 s | Fade of the stance around attacks |
| Procedural Recoil, Recoil Defaults | on | The kick of guns without a fire clip |
| Body Muzzle / Tip Socket Patterns | wildcard lists | Weapons in the body mesh |
| Idle Reject Words, Gun Reject Clip Words | word lists | Filters for stance and fire clips |
| Weapon Socket Tolerance / Angle Tolerance | 1 cm / 3 deg | When Apply to Category writes RSE_W_ sockets |
Weapon Presentation: Equipment Type Kinds, Kind Presentations, Default Melee and Default Ranged, Approach Defaults, Unarmed Shot Anchor, Max Tracers Per Attack, Decal Lifetime, Physical Surfaces, Default Unit Surface, Default World Surface.
Weapon Library: the name rules that classify meshes (rifle, ak, smg → Rifle; katana, blade → Sword), Muzzle Socket Words, Shape Overrides Name, Stance Suggestions.
19.5.1 The Weapon Presentation asset
| Section | Fields |
|---|---|
| Weapon | Weapon Kind, Stance (Auto, Melee Light, Melee Heavy, Pistol, Rifle, Shotgun, Bow, Caster) |
| Animation | Stance Anims: per stance an Attack, an Aim and a Reload |
| Sockets | Muzzle Socket / Offset, Shell Eject Socket / Offset, Trail Start / Trail End Socket |
| Firing | Muzzle Flash, Shell Eject, Shot (tracer or projectile, trail, speed, line or arc), Shots Per Attack, Shot Interval, Pellets Per Shot, Pellet Spread, Aim Time, Recoil Distance |
| Impacts | Impacts per surface, Default Impact |
| Melee | Melee Trail, Trail Seconds, Swing Impact Time, Lunge Distance |
| Sounds | Fire Sound, Swing Sound, Reload Sound |
| Feel | Shake On Hit, Shot Shake, Hit Stop |
19.6 Blueprint usage
In timelines, four cues use the weapon: Weapon Attack (the whole attack: aim, burst or swing, impacts and hit reactions; fields Weapon, Stance, Heavy, Shots, Approach), Weapon Shot (tracers or projectiles from the muzzle), Weapon Hit Effects (the melee impact on each target's surface) and Weapon Animation (a stance clip on subjects whose skeleton takes it). Abilities without a presentation asset get a default timeline that already writes the weapon attack.
Editor Utility Blueprints and Python can drive Fit Weapon (category RPG Saga | Weapon Fit): Resolve Context, Ensure Hold Socket, Fit In Skeleton Editor, Edit Weapon Sockets, Plan Apply To Category, Execute Changes, Validate, Open Fit Weapon Tab, Is Writable. Category RPG Saga | Weapons has Add Support Hand IK To Anim Blueprints (the node behind Add Weapon Layers) and Suggest Stance Animations.
Example, validate every rifle on a skeleton from an Editor Utility Blueprint:
- Resolve Context (Character = the look, Weapon = the rifle presentation, Hold Override = Rifle).
- Validate (Context = the result, Whole Category = true).
- For Each Loop over the returned strings → Print String.
At runtime, Play Weapon Recoil on the RSE character anim instance kicks the procedural recoil (it needs the recoil nodes of the Anim Blueprint).
ctx = unreal.RSEWeaponFitLibrary.resolve_context(look, weapon, unreal.RSEWeaponHoldType.AUTO)
ok, report = unreal.RSEWeaponFitLibrary.fit_in_skeleton_editor(ctx)
changes, notes = unreal.RSEWeaponFitLibrary.plan_apply_to_category(ctx, False)
unreal.RSEWeaponFitLibrary.execute_changes(changes)
unreal.RSEWeaponLibraryFunctions.dress_weapons_in_folders(["/Game/MyGame/Characters"], False)
19.7 C++ usage
// Kick the recoil of a unit whose Anim Blueprint has the weapon layers.
if (URSEAppearanceComponent* Look = Unit->FindComponentByClass<URSEAppearanceComponent>())
{
if (URSECharacterAnimInstance* Anim = Look->GetAnimInstance())
{
const float Seconds = Anim->PlayWeaponRecoil(ERSEWeaponHoldType::Rifle);
// 0 = recoil off (CVar RSE.Weapons.Recoil 0) or no recoil nodes.
}
}
Extension points: author your own URSEWeaponPresentation assets; add a Weapon Hold Profile for a skeleton that needs a custom hand, stance clips or recoil; add rows to Support Hand Rotations and Recoil Defaults for hold types you tune; query the held weapon with URSEAppearanceComponent::GetHeldWeaponHold and GetHeldWeaponPresentation.
19.8 Advanced
- Classification. Handgun names (
pistol,revolver,colt,magnum...) weigh more than melee words. Tools (shovel,pickaxe,rake...) hold two-handed. A shape check (Shape Overrides Name) treats a short, flat mesh with a level top and a dropping grip as a pistol even if its pack named it..._Mace. Presentations made earlier keep their kind: set Weapon Kind or the Hold Override by hand. - Packs with a different skeleton scale. Apply to Category scales the transferred socket by the hand's size and adds per-weapon
RSE_W_sockets only where the pivot is off tolerance. - Co-op and headless. Presentations are visual only. Headless battles and simulations skip them and the result is unchanged.
- Performance. Tracers are one small mesh plus a short ribbon, capped by Max Tracers Per Attack. Shells and shot shakes are cues removed by Reduce Effects. Decals live Decal Lifetime seconds. Nothing ticks when idle. The weapon chain costs a few bone operations per animated character; the stance overlay evaluates its clip only while its weight is above zero, and the recoil nodes add zero rotation at rest.
- Debug CVars.
RSE.Weapons.Presentation 0turns presentations off;RSE.Weapons.Hold.SkeletonSockets 0,RSE.Weapons.SupportHandIK 0,RSE.Weapons.SupportHandRotation 0,RSE.Weapons.Recoil 0andRSE.Weapons.Hold.FineOffsetstoggle each part, to compare. See Appendix C. - Plugin content. Under
/RPGSagaEngine/Visual/Weapons,/RPGSagaEngine/Audio/Weaponsand/RPGSagaEngine/Data/Weapons: a tracer streak, projectile core, arrow, faceted sword, rifle and gunblade, muzzle flash, shell, sparks, hit flash, trails, impact decal, synthesized sounds, and one presentation per kind plus DefaultMelee and DefaultRanged. All are ours; replace any in the settings or per weapon.
19.9 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The weapon sits reversed, offset or in the air | The hold socket on the skeleton is missing or wrong | Fit in Skeleton Editor, move the socket, save the skeleton, run Validate |
| One weapon is off while others are fine | Its pivot differs from its category's | Give it its own RSE_W_<Mesh> socket (Apply to Category adds it) |
| The left hand does not reach the weapon | No LeftHand socket, or the Anim Blueprint lacks the chain | Edit Weapon Sockets, then Add Weapon Layers to Anim Blueprints |
| The left hand reaches but the fingers point the wrong way | No rotation entry for the hold type | Rotate the LeftHand socket, add a Support Hand Rotations entry, or a profile override |
| IK does not run in the Skeleton Editor | A different preview animation was chosen, or no Anim Blueprint | Run Fit in Skeleton Editor again |
| A gun plays a sword swing | Its stance clips are melee clips | Set Fire clips on the hold profile, or Suggest Stance Animations; guns already reject names in Gun Reject Clip Words |
| The gun does not kick | The recoil nodes are missing | Add Weapon Layers to Anim Blueprints |
| The character stands in a prone pose in Fit Weapon | The idle chosen was a prone clip | Set the hold's Ready clip; prone, crouch and death names are rejected automatically |
| A revolver is held as a mace | The pack's name said Blunt | Set Weapon Kind to Pistol on the presentation, or use the Hold Override |
| Fit Weapon does not save | The asset is plugin or engine content | Copy the look and the weapon into your project first |
| Shots leave from the chest | No gun, so the Unarmed Shot Anchor applies | Set a muzzle socket on the weapon mesh, or change the look's Unarmed Shot Anchor |
19.10 See also
- 17-characters-visuals-and-animation.md for looks, anim sets and Dress My Abilities.
- 12-battle-action.md for action weapons and the shooting controls.
- 19-camera-and-presentation.md for cues and timelines.
- 07-items-inventory-economy.md for equipment items and their meshes.
- Product page:
docs/product/weapons.md.
20. Camera and battle presentation
In short: one camera framing system keeps every camera (exploration, each battle mode, cinematic shots) out of rocks and walls, and the battle presentation system turns the results the rules already computed into a show: timelines of cues for animation, effects, sound, camera, hit-stop and text. Use this chapter to tune how cameras behave, to give an ability a look, and to understand what is data and what is automatic.
20.1 Basics
20.1.1 The cameras you get
| Where | Camera |
|---|---|
| Exploration | The party RPG camera: either Tactical (high above the party at a tactical angle, zoom, rotation, smooth follow, optional pan) or Third Person (behind the leader). Pick it in Project Settings → RPG Saga Engine → Exploration → Camera. |
| Grid Tactics | ARSETacticsCameraPawn on the same camera arm, following the active unit and the cursor. |
| Free Tactics | ARSEFreeTacticsCameraPawn, following the active unit and the cursor. |
| ATB and turn-based | A fixed stage camera, framed once when the battle starts. |
| Action | ARSEActionCameraRig, with the player's own yaw and pitch. |
| Cinematic shots | Camera Shot cues in an ability's presentation, plus an optional automatic Cinematic Battle Camera. |
You do not have to set any of this up. The defaults frame every mode, and the framing system avoids obstructions in all of them.
20.1.2 Make your cameras obstruction-proof (already on)
- Open Project Settings → RPG Saga Engine → Camera Framing. Enabled is on by default.
- Mark anything that must move the camera instead of fading with the actor tag
RSE.CameraBlocker, and anything that must never fade withRSE.NoFade. - Play a battle. If the camera sits inside geometry, switch on the debug view: console
RSE.Camera.FramingDebug 1draws the probe sphere and the candidate poses.
Small things (thin walls, props, trees) fade locally as in exploration (Camera Occlusion). What cannot fade (landscapes, terrain-tagged objects, anything tagged RSE.CameraBlocker or RSE.NoFade, anything at least Camera Occlusion → Max Fade Size wide on both horizontal axes, 1500 cm by default) moves the camera.
20.1.3 Give an ability a look
Every ability can name a presentation asset (Presentation on the ability). Without one, the plugin builds a default timeline: the body of the approach (run in, stay put or shoot) and the hit reaction on the target.
- Content Browser → Add → Miscellaneous → Data Asset → RSE Battle Presentation Data.
- Add cues to its list, in order: for example Move / Approach (To Target), Montage, VFX, Sound, Impact, Move / Approach (To Home).
- On the ability, set Presentation to the asset.
- Press Play in a battle and use the ability. Use the Ability Test and preview tools (see 06-abilities-and-statuses.md) to iterate without fighting.
20.2 How it works
20.2.1 The presentation flow
The rules (RSECore) resolve an action instantly and emit events. The presentation (RSE) plays them back. A director hands the action to the cue player component (URSEBattleCuePlayerComponent), which runs the timeline of cues; the Impact cue is the moment the director shows the already-computed results (numbers, falls, statuses) and the targets react. With no Impact cue the results appear at the end of the timeline. Because the result never depends on the show, headless simulations skip it and stay identical.
Each cue starts after its Delay. The next cue waits only if the previous one has Wait For Completion, so cues overlap freely (an effect that starts with the swing, for example). Common cue fields: Delay, Wait For Completion, Only In Modes (Battle.Mode.* tags; empty means every mode; Battle.Mode.ATB also covers turn-based), and Optional (skipped when effects are reduced). Cues act on roles, not on named units: Caster, Primary Target, All Targets or Each Target, Targets Center, Midpoint. One asset therefore works for every character in every mode.
20.2.2 The cue types
| Cue (display name) | Class | What it does |
|---|---|---|
| Move / Approach | URSECue_Move | Run to the target or back home. In Tactics this becomes a short step (units stay on their tile). |
| Pose (procedural) | URSECue_Pose | Placeholder motion (lunge, hop, spin, shake, recoil) for units without animation |
| Montage | URSECue_Montage | A montage on units with a skeletal mesh; RSEImpact notifies time the next Impact cue |
| VFX | URSECue_VFX | A Niagara (or legacy particle) system at an anchor (chest or ground) or a body anchor (hand, weapon tip, muzzle, head, feet) |
| Sound | URSECue_Sound | A sound or a catalog tag, 2D or at an anchor |
| Camera Shot | URSECue_Camera | Close-up on caster or target, over the shoulder, two-shot, orbit, return; blend, hold, distance, height, FOV |
| Camera Shake | URSECue_CameraShake | A procedural shake |
| Hit Stop | URSECue_HitStop | A brief freeze |
| Slow Motion | URSECue_SlowMotion | Time dilation with blend in and out |
| Screen Flash / Fade | URSECue_ScreenFlash | A color flash or fade |
| Text / Banner | URSECue_Banner | The ability's name or your own text, as a banner or a title |
| Wait | URSECue_Wait | A pause |
| Impact | URSECue_Impact | Show the results; several Impact cues make a multi-hit |
| Projectile | URSECue_Projectile | A projectile flight from the caster to the targets |
| Weapon Attack, Weapon Shot, Weapon Hit Effects, Weapon Animation | URSECue_Weapon* | The weapon's own show (see 18-weapons.md) |
| Paired Animation | URSECue_PairedAnimation | Two synced montages for a finisher or counter (see 17-characters-visuals-and-animation.md) |
Approach on the ability: Auto picks from the data (physical damage to enemies → Melee; row-ignoring → Ranged; everything else → In Place), or choose Melee, Ranged, In Place or Custom (only your cues).
20.2.3 Camera policy
The battle camera stays on the fixed view for ordinary actions. Camera cues run only when the policy allows it (Battle Presentation → Camera Policy):
- Classic Camera Policy (default Special Only) and Tactics Camera Policy (default All): Fixed never, Special Only only for special actions, All always.
- A special action has Presentation → Cinematic Camera on, is a super move, or is a summon. Boss and summon intros are special.
- Enemy Special Camera (default off) lets enemies trigger it for the player side; Boss Special Camera (default on) lets bosses.
- Shake In Fixed View keeps shakes even with a fixed camera.
20.2.4 Cinematic moments
| Moment | When | Default |
|---|---|---|
| Super move | Ability with Presentation → Moment = Super Move | Close-up on the caster, slow motion, flash, title, then a side or over-shoulder shot and the attack body with shake and hit-stop |
| Summon entrance | After the action that brings a summon | Flash, close-up, slow motion, the summon's title, a jump, shake, orbit |
| Boss intro | At battle start, when the encounter has a VIP enemy | Orbit around the boss, its name as a title, a tremor |
All can be replaced by assets in the settings (Super Move Prelude, Summon Entrance, Boss Intro), switched off (Summon Entrance, Boss Intro toggles), and skipped with Confirm or Cancel. The battle HUD hides while they run.
20.2.5 Speed, skip and reduced effects
Playback Speed (1 = normal) and Fast Forward Speed while a key from Fast Forward Keys is held. Cinematic moments always skip with Confirm or Cancel; ordinary actions only with Allow Skip Actions. On a skip the remaining impacts fire, so results always appear. Reduce Effects turns off shake, flash, hit-stop and optional cues for weak PCs and accessibility. The player's own options (Reduced battle effects, Battle animation speed) override the rule; the order is console variable, then player choice, then the rules.
20.2.6 How framing chooses a pose
The framer (FRSECameraFramer, in RSECameraFraming) runs on a timer (Check Interval, 0.1 s), not every frame:
- It tries poses around the desired one, cheapest first: yaw in steps (Yaw Step 20 deg × Yaw Steps 2), a steeper angle (Pitch Step 10 deg × Pitch Steps 2, up to Max Pitch 80), alternative sides (Alternate Yaws), then moving closer (down to Min Distance Share 0.6 or Min Distance 300 cm).
- Each pose is tested with a sphere (Probe Radius 24 cm) from the pivot toward the camera, against the focus heights (Focus Heights, up to Max Focus Targets).
- Hysteresis stops flicker: a blocked pose is left after Switch Delay (0.1 s); a free pose changes to a cheaper one only after the cheaper one has stayed better for Return Delay (0.8 s) and by Switch Margin.
- Offsets glide to the chosen pose at Blend Speed.
- Never inside geometry: every frame, a safety sphere (at least the near clip plane plus Near Clip Margin) is swept from the pivot to the displayed pose. It enters instantly and leaves smoothly (Release Speed).
Per mode: Exploration keeps the player's yaw (only angle and distance adapt); Grid Tactics tries small steps, a steeper angle or another side (90 or 180 deg) before moving in, so the grid stays readable; ATB frames once at battle start without changing sides; Action keeps the player's yaw and pitch and uses the framer instead of a simple probe.
20.2.7 The cinematic battle camera
Off by default; for captures and trailers. Turn it on in Camera Framing → Cinematic Battle (Enabled) or with RSE.Camera.CinematicBattle 1. Each action gets shots chosen on the spot and checked for visibility: over the shoulder of the attacker (one target), a wide shot (Wide Shot Targets or more targets, default 2), and the target's reaction at the first impact (Reaction Shot). It follows the 180-degree rule, cuts or glides depending on how far the view turns (Cut Angle, default 40 deg), and holds each shot at least Min Shot Seconds (0.6 s). Distances and field of view are in the same group (Over Shoulder Distance 420 cm, Wide Distance 1100 cm, Field Of View 50).
20.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEBattlePresentationData | RSE | The timeline of cues (an ability's presentation) |
URSEBattleCue, URSEBattleCue_Custom | RSE | Base cue; the Blueprint-extendable cue with On Cue Start, On Cue Update, On Cue Stop |
URSEBattleCuePlayerComponent | RSE | Plays timelines for the ATB and Tactics directors |
URSEBattlePresentationSettings | RSE | Project Settings → Battle Presentation |
URSECameraFramingSettings | RSE | Project Settings → Camera Framing |
URSECameraOcclusionSettings, URSECameraOcclusionSubsystem | RSE | Fade and hide of what hides the party |
URSERPGCameraArm | RSE | The party RPG camera arm |
ARSETacticsCameraPawn, ARSEActionCameraRig | RSE | Grid Tactics and Action cameras |
IRSECameraFocusInterface | RSE | Lets your camera pawn tell the occlusion system what to keep visible (Get Camera Focus) |
ARSEFreeTacticsCameraPawn | RSE | The Free Tactics camera |
URSEAudioSettings, URSESoundCatalog | RSE | Music, sound catalog and the mixer |
20.4 Settings
Project Settings → RPG Saga Engine. Full list: Appendix B.
- Camera Framing: Enabled, Camera Blocker Tag (
RSE.CameraBlocker), rules per mode (Exploration, Grid Tactics, Free Tactics, ATB, Action, Shot, Capture), Cinematic Battle, capture clearance values. - Camera Occlusion: Check Interval 0.1 s, Max Targets 4, Never Fade Tag (
RSE.NoFade), Max Fade Size 1500 cm, Hide Delay 0.15 s, Show Delay 0.4 s, ghost and hide fallbacks, Ground Tags (RSE.Ground). - Exploration → Camera: Camera Style (Tactical or Third Person) and the values of each style (zoom limits, tilt, rotation, follow smoothing for Tactical; distance, shoulder offset and so on for Third Person).
- Battle Presentation: playback and fast-forward speed, approach values and default timelines, Camera Policy, Reduce Effects, cinematic moments, floating text styles, the action banner.
- Audio: Context Music and Map Music, fades, a Sound Catalog (
URSESoundCatalog: gameplay tags to sounds), battle event sounds (critical, perfect, block) and the mixer channels.
20.5 Blueprint usage
Authoring is mostly data. For custom behavior, subclass RSE Battle Cue Custom in Blueprint:
- Content Browser → Add → Blueprint Class → search Custom (Blueprint) (class
URSEBattleCue_Custom). - In the class defaults set Duration (0 means instant: only start and stop run), Subjects (which units the events receive), Receive Update (only if you need per-frame work) and Is Impact (the results show when the cue starts).
- Override On Cue Start (Player, Subject Actors): for example For Each Loop over Subject Actors → Spawn Emitter Attached.
- Override On Cue Update (Alpha, 0 to 1 over Duration) for continuous effects and On Cue Stop (Skipped) to leave things in their final state. The events are
const: the cue is shared data, so keep state on the subject actors, not in the cue. - Add your cue to a presentation asset's cue list, with its Delay and Wait For Completion.
To tell the occlusion system what must stay visible on your own camera pawn, implement the RSE Camera Focus Interface (Class Settings → Interfaces → Add) and override Get Camera Focus, returning the feet of the characters to keep visible (most important first) and the actors never to hide. Dev commands for tuning the exploration camera while playing: RSE.Camera zoom in|out|min|max|<distance>, RSE.Camera yaw <deg>, RSE.Camera tilt up|down|reset, RSE.Camera pan <x> <y>, RSE.Camera style tactical|thirdperson, and RSE.Camera prop wall|pillar|bigtree|mesh to drop a test obstruction in front of the camera (props are tagged RSE.CameraTestProp).
20.6 C++ usage
// A new cue type: a timed pause the timeline can wait for.
UCLASS(meta = (DisplayName = "My Beat"))
class UMyCue_Beat : public URSEBattleCue
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, Category = "Beat", meta = (ClampMin = "0", Units = "s"))
float Seconds = 0.2f;
virtual void Start(URSEBattleCuePlayerComponent& Player, FRSECueState& State) const override
{
State.Duration = Seconds; // the player ends the cue when this has elapsed
}
virtual float EstimateDuration(const URSEBattleCuePlayerComponent&) const override { return Seconds; }
};
Extension points: subclass URSEBattleCue (or the Blueprint-friendly URSEBattleCue_Custom); implement IRSECameraFocusInterface on your actor to feed the framer a focus; use FRSECameraFramer with your own FRSECameraFramingRules for a camera of your own; add presentation assets per ability. A new battle mode only needs to use the cue player component and call the framer.
20.7 Advanced
- Per-mode rules. Each
FRSECameraFramingRuleshas costs (Yaw Cost, Pitch Cost, Pull Cost, Alternate Cost, Blocked Cost) that decide which pose wins. Raise Pull Cost if you hate the camera moving closer; raise Yaw Cost if you want it to rotate less. - Performance. Pose probes run on a timer, only the safety sphere runs every frame. Cue player components do not tick when idle. Soft assets (montages, Niagara, sounds) load asynchronously before the first cue, and the abilities of a battle preload at its start.
- Co-op. Time dilation (slow motion, hit-stop) is refused in co-op sessions, so one player's show never slows another's. See 22-networking.md.
- Capture tools. The framing rules include a Capture set and checks for capture points: camera in geometry, look target hidden, a wall closer than Capture Min Clear Distance (400 cm) in front of the view. Occluded points are moved to a free pose.
- Debug CVars.
RSE.Camera.Framing 0(off),RSE.Camera.FramingDebug 1,RSE.Camera.CinematicBattle 1,RSE.Battle.Presentation.Speed,RSE.Battle.Presentation.ReduceEffects(-1 = settings, 0 or 1). See Appendix C. - Limits. Returning from a cinematic shot to the battle camera uses the engine's view-target blend (both ends are clean, the path is not probed). The ATB camera frames once; the stage can call
FrameCameraagain after changes.
20.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Camera sits inside a rock | The rock is wider than Max Fade Size but not tagged | Tag it RSE.CameraBlocker; check with RSE.Camera.FramingDebug 1 |
| A small prop never fades | It carries RSE.NoFade | Remove the tag |
| The camera jumps around a pillar | Hysteresis too short | Raise Switch Delay and Return Delay in the mode's rules |
| An ability has no camera shot | The policy is Fixed, or the action is not special | Set the policy to All, or tick Cinematic Camera on the ability |
| Effects fire but results never appear | The timeline has no Impact cue and the cue was skipped mid-way | Add an Impact cue; skipping always fires the remaining impacts, so check the cue asset loaded |
| Shake and flash are missing | Reduce Effects is on (setting, option or CVar) | Check RSE.Battle.Presentation.ReduceEffects and the player's option |
| A cinematic moment cannot be skipped | Input is captured elsewhere, or a super move without camera lost its prelude | Check the policy; the HUD stays visible in that case |
| Camera cues play in ATB but not as expected | Classic Camera Policy is Special Only | Switch to All or mark the ability special |
20.9 See also
- 06-abilities-and-statuses.md for ability presentation fields and the ability preview.
- 08-battle-common.md for directors, events and modes.
- 09-battle-tactics.md, 10-battle-atb-and-turn-based.md, 11-battle-free-tactics.md, 12-battle-action.md for each mode's camera.
- 18-weapons.md for the weapon cues.
- Design notes:
docs/design/camera-framing.md,docs/design/battle-presentation.md.
21. User interface
In short: every built-in screen (menus, party menu, options, dialog, shops, HUDs) takes its look from one UI Style asset, and its arrangement from small layout classes. Ten styles ship in the plugin; change one field and the whole game changes. When you want your own design, you replace any screen with a Widget Blueprint that receives a ready-made view-model, so you never re-implement a rule. This chapter also covers Common UI hosting, accessibility, and touch and phone UI.
21.1 Basics
21.1.1 The three levels of UI work
| You want | Do this | Needs |
|---|---|---|
| A different color, font or frame | Edit or duplicate a UI Style asset | Nothing: editor clicks |
| A different arrangement (bubble dialog, side tabs, shooter-minimal HUD) | Pick a layout in the style, or write a small layout class | Editor clicks, or a little Blueprint |
| A completely different screen | Make a Widget Blueprint derived from RSE Screen Widget and put it in the screen's slot | UMG |
21.1.2 Pick a style
- Open Project Settings → RPG Saga Engine → UI Theme → UI Style.
- Set Default Style to one of the ten shipped styles (the assets are
DA_UIStyle_*in the plugin'sUI/Stylesfolder). Keep several in Selectable Styles and the player gets an Interface style row in Options → Display. - Press Play. Every menu, the dialog, the party menu and the HUDs use it.
The ten styles:
| Style | Look |
|---|---|
| Classic | Deep-blue gradient windows, thin light double frame, gold cursor |
| Parchment | Warm paper, ink-brown double line, sepia text (a light style); visual-novel dialog |
| Gothic | Near-black windows, silver double line, crimson accent, capitals; cinematic dialog |
| Holo | Translucent cyan panels, scanlines, glowing outline; shooter-minimal live HUD, grid inventory |
| Brass | Dark wood and leather, brass border with rivets, amber text |
| Minimal | Flat white surfaces, hairline borders, one blue accent (a light style) |
| Pixel16 | Stepped pixel corners, hard borders, dithered gradient, pixel fonts |
| Anime | Saturated plum, magenta and teal, thick outlines, speech-bubble dialog, radial battle menu |
| Tactical | Olive and graphite, hex-grid pattern, stencil capitals; also fits RPG shooters |
| Sylvan | Translucent moss-green panels, soft gold glow, round corners |
Each style also suggests a battle menu style, an inventory (list or grid) and a Growth board look; the player's own options always win. The Studio's foundation presets pick a matching default style (for example Dark Fantasy → Gothic, Sci-fi RPG → Holo).
21.1.3 Change the whole look with one field
- Open
DA_UIStyle_Classic(or better, press Duplicate to project in the Style Editor first; plugin content is read-only for Fab installs). - Colors → Tokens → Primary → Color: pick a green.
- Save. Every window, frame line, selected row and tab turns green; text, gold highlights and HP bars stay.
Or drag the Hue, Saturation and Lightness sliders in the Style Editor toolbar: they write Colors → Global Shift (hue-locked tokens such as Health, Positive and Negative keep their meaning).
21.2 How it works
21.2.1 Colors are tokens
A style has a few seed colors (Primary, Secondary, Accent, Neutral, Text; Positive, Negative, Warning, Info; Health, Mana, Charge, Rare). Each seed has ten derived shades, S50 (lightest) to S900, computed in the perceptual OKLCH space, and roles (Surface0–3, Border, Highlight, Selection, TextMuted, Disabled, Shadow) derived from seeds. Every color field of a style, and of the settings that use UI colors, is a UI Color (FRSEUIColor): a token, a shade, an opacity and an optional fine tune. Tick Fixed to use a plain color that ignores the style. You can add your own tokens (element colors, factions) under Tokens → Custom Tokens.
21.2.2 Frames, fonts, sounds, motion
- Frames: each panel kind (Window, Inset, Plate, Hud, Tooltip, Modal) has a fill gradient, outline, optional double line and glow, a corner shape (Round, Chamfer, Square, Stepped, Notch, Bevel), a procedural pattern (Noise, Paper, Scanlines, HexGrid, BrushedMetal, Dither) and corner ornaments (Dot, Rivet, Bracket). They are drawn by one plugin material, with no textures, in UI units that follow DPI scaling. To use your own art, set Image Override → Brush Image with its Nine Slice margins.
- Fonts: eight text roles (Display, Title, Heading, Body, Label, Caption, Numeric, KeyCap) with font, size, spacing, outline and color; Font Scale resizes all. A role whose font asset is missing is drawn in Roboto with the style's own size and color, so you can ship without the bundled fonts (delete the plugin's
Content/UI/Fontsfolder). - Sounds: Navigate, Confirm, Back, Error, Open, Close, Tab, Purchase, Text Tick. An empty slot plays the sound catalog's
Audio.UI.*sound. - Motion: Transition (Fade, Slide, Scale, Wipe, None), open seconds and curve, row-selection slide, typewriter speed.
21.2.3 Layouts
A style also decides how screens are arranged. Each screen has a few layouts, and every layout works with every style, with mouse and gamepad, from 1280×800 to 4K:
| Screen | Layouts |
|---|---|
| Dialog | Bottom Box, Bubble (speech bubble over the speaker), Cinematic (letterbox), Novel Portrait (large portrait) |
| Party menu | Top Tabs, Side Tabs |
| ATB / turn-based HUD | Bottom Window, Compact Corner |
| Grid Tactics HUD | Corners, Bottom Bar |
| Live Tactics HUD | Corners, Shooter Minimal |
Changing the style at run time rebuilds the open screens with the new layout. Sizes the layouts use (bubble width, side tab column, shooter edge inset) are in Project Settings → RPG Saga Engine → UI Layouts.
21.2.4 Battle HUDs and menus
Each battle mode has its HUD, built from a view-model: the Grid Tactics HUD (RSETacticsHUDViewModel), the classic ATB and turn-based HUD (RSEATBHUDViewModel) and the Live Tactics HUD, plus results, game over, banners and the action-command ring. ARSEBattleHUD is the framework's HUD class and hosts them.
Battle menus are data. A Battle Menu Config (URSEBattleMenuConfig) lists providers (URSEBattleMenuProvider: Movement, Command Layout, Pact, Items, Flee, Doors, End Turn, Custom) and category definitions. A Battle Menu Style (URSEBattleMenuStyle) picks the look: List, Radial or Hotbar. The default is chosen in Project Settings → Battle Menus and the player can change it in Options. A new menu look is a new presenter widget class plus a style asset; a new source of commands is a new provider. Menus never act on their own: every entry goes through the same command path, so all menu styles give the same commands.
21.2.5 The screen, the view-model and the slot
Every screen is built the same way:
- a settings slot (Project Settings → RPG Saga Engine → page → Widget Class): empty means the built-in themed screen;
- a view-model (
URSEScreenViewModeland subclasses): a Blueprint-readable object with everything the screen shows, already formatted, plus every action it can take (buy, equip, choose, continue); - a screen base (
URSEScreenWidget): the built-in screens and your Widget Blueprints derive from it and receive the view-model.
The built-in screens use exactly the same view-models and actions as yours, so a replacement cannot forget a rule (money, stock limits, formation limits, save restrictions).
21.2.6 Replace a screen
- Create a Widget Blueprint whose parent class is RSE Screen Widget (for a character card, RSE Member Card Widget).
- Design it freely in UMG.
- In its Event Graph, implement On View Model Changed: Cast To the screen's view-model class (for example
RSEShopViewModel), then copy its data to your widgets. It runs once when the screen gets its view-model and after every change. - Call the view-model's actions from buttons (On Clicked → Buy, Equip, Continue). Keyboard and gamepad already work: On Confirm, On Back, On Navigate and On Page forward to the view-model by default.
- Set your Widget Blueprint in the screen's slot.
Slots include: Tactics HUD (UI → Tactics HUD Widget Class), classic HUD (UI → ATB HUD Widget Class), party menu (UI → Party Menu Widget Class, or one page via Party Menu Page Widget Classes), dialog (Dialog UI → Dialog Widget Class), shop (Economy UI → Shop Widget Class), save and load (Save UI → Slot Widget Class), options (Options → Widget Class), battle results and game over (Battle Flow UI), world map and travel overlay (Travel UI), card table and album (Cards UI), code lock (Puzzle UI), interaction prompt (Interaction → Prompt Widget Class), quest tracker (Quest UI → Quest HUD Class), main menu (Game Flow → Main Menu Widget Class), scene overlay (Scenes), battle banners and the action command ring (Battle Presentation). The full table with the view-model of each is in docs/product/custom-ui.md. A class that cannot be used (missing, abstract, not an RSE Screen Widget) is reported in the log and the built-in screen is used instead.
You can replace part of a screen: one party-menu page, the Tactics forecast panel or deployment panel, or just the character cards. A card Widget Blueprint derived from RSE Member Card Widget fills itself if its widgets are named NameText, ClassText, LevelText, HPText, HPBar, StatusText and Portrait: no graph needed.
Four examples ship in /RPGSagaEngine/Examples/UI (WBP_Example_PartyPage, WBP_Example_MemberCard, WBP_Example_ResultsScreen, WBP_Example_DialogBox). Copy one into your project before editing it.
21.2.7 Accessibility
Accessibility is applied on top of the active style, so every style (and your screens, if they read the style) gets it. Options → Display has: Interface style, Color vision (Off, Protanopia, Deuteranopia, Tritanopia: replaces the signal colors; Health stays red), High contrast (opaque near-black surfaces, white text, strong outlines), Text size (80% to 150%, never below UI Theme → Minimum Font Size) and Reduce motion. Changes apply live. A style that cannot be read is an invalid asset: Validate (contrast) in the Style Editor checks text on surface (4.5:1), selected row (4.5:1) and caption (3:1) for normal vision, the three color-vision modes and high contrast.
21.2.8 Common UI integration
The module RSECommonUI hosts the plugin's screens on Epic's CommonUI layer stacks, so your Common Activatable Widgets and ours share one focus and back order. It is a host layer, not a migration: our screens keep their own build path, style, layouts and view-models, and the host is off by default.
Turn it on in Project Settings → RPG Saga Engine → Common UI: Route Screens (our screens go onto the layers), Party Menu Host (Fallback or Always) and Use Common Input Key Prompts (CommonInput controller icons in key prompts). The four layers are Game, Game Menu (the party menu), Menu (options, save, shops, maps) and Modal (popups). Your own primary layout: derive a Widget Blueprint from RSE Common UI Layout and name its stacks GameLayer, GameMenuLayer, MenuLayer, ModalLayer; or, if you already have a layout, call Register Layer Stack on Get RSE Common UI. Each screen is wrapped in an RSE Common Screen Host that applies the input config and routes CommonUI's back and navigation to it. Key prompt icons come from your CommonInput controller data, else generic glyphs drawn in code (the plugin ships no platform logos).
21.2.9 Touch and phone UI
Touch is a third control device next to keyboard and gamepad. Every on-screen control and gesture presses one of the input actions the game already uses (Enhanced Input injection), so exploration, all battle modes and the menus behave as with a key. Five Touch Layout data assets ship (DA_TouchLayout_Exploration, GridTactics, LiveTactics, ClassicBattle, Action) in /RPGSagaEngine/Input/Touch, picked in Project Settings → RPG Saga Engine → Touch → Layouts. Controls are placed in the safe area in millimetres, so they are the same physical size on every phone. The phone UI adds physical DPI scaling (set User Interface → DPI Scaling → Custom with RSE Physical Scaling Rule), a 9 mm minimum touch target, safe-area handling, and a Phone variant of every screen layout. Options → Controls has touch size, opacity and a left-handed mode.
Status: the touch and phone code is complete and tested headless, but mobile has not yet been tested on a real phone; treat it as pre-release until your own device tests pass (see 23-platforms-and-performance.md). To try it on PC: RSE.Input.Touch.Emulate 1 (mouse as a finger; hold Alt for a second finger), RSE.UI.Phone.Simulate 1, RSE.Input.Device Touch.
21.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEUIStyle | RSE | The style data asset: seeds, frames, fonts, sounds, motion, layouts |
URSEUIStyleSubsystem | RSE | One per local player: the active style, On Style Changed |
URSEUIStyleLibrary | RSE | Blueprint nodes for style colors, fonts, frames, accessibility |
URSEUIThemeSettings | RSE | Project Settings → UI Theme |
URSEUIStyleEditorSettings | RSEEditor | Project Settings → UI Style Editor (the Style Editor and gallery) |
URSEScreenWidget, URSEScreenViewModel | RSE | Base of every screen and of every view-model |
URSEMemberCardWidget | RSE | A self-filling character card |
URSEHUDWidgetBase | RSE | Base of the built-in screens; style helpers for C++ |
URSEDialogLayout, URSEPartyMenuLayout, URSEATBHUDLayout, URSEGridHUDLayout, URSELiveHUDLayout | RSE | Layout bases |
URSEBattleMenuConfig, URSEBattleMenuProvider | RSECore | What a battle menu offers |
URSEBattleMenuStyle (+ _List, _Radial, _Hotbar), URSEBattleMenuPresenter | RSE | How a battle menu looks |
ARSEBattleHUD | RSE | The framework HUD that hosts battle screens |
URSELocalPlayerUISubsystem | RSE | Finds the UI host of each player; opens screens |
URSECommonUISubsystem, URSECommonUISettings, URSECommonUILayout, URSECommonScreenHost | RSECommonUI | The Common UI host |
URSETouchLayout, URSETouchInputSubsystem, URSETouchControlsWidget, URSEPhoneUISettings, URSEPhysicalScalingRule | RSE | Touch and phone UI |
21.4 Settings
Project Settings → RPG Saga Engine. Full list: Appendix B.
- UI Theme: Default Style, Selectable Styles, Frame Material, Minimum Font Size, accessibility remaps and contrast rules, Player Can Choose Style.
- UI Layouts: the sizes the layouts use.
- UI: the widget class slots of the HUDs and the party menu.
- Dialog UI, Economy UI, Save UI, Options, Travel UI, Cards UI, Puzzle UI, Quest UI, Battle Flow UI, Battle Presentation, Game Flow: one Widget Class slot per screen.
- Battle Menus: the styles, the default and the default icons.
- UI Style Editor: the folder of project copies (
/Game/UI/Styles), the preview map, the gallery commands. - Common UI: Route Screens, Party Menu Host, Use Common Input Key Prompts, layers, Bind Action Bar, Silence Viewport Client Check.
- Touch and Phone UI: layouts, long-press time, emulation, target unit millimetres, minimum touch target, phone layouts, Simulate Phone.
21.5 Blueprint usage
RPG Saga | UI Style nodes (editor and runtime): Get UI Color (token, shade, opacity), Resolve UI Color, Get UI Font (text role), Get UI Frame Brush (panel kind, for a Border or an Image), Get Active UI Style, Set UI Style (by Style Id), Get Selectable UI Styles, Get Selectable UI Style Ids, Preview UI Style and End UI Style Preview, Get UI Accessibility, Set UI Accessibility, Set UI Color Vision, Set UI High Contrast, Set UI Text Scale, Set UI Reduce Motion. Widgets derived from the plugin's screen classes get the event On UI Style Changed: rebuild what shows style colors there.
Example, a style picker for your own options screen:
- Event Construct → Get Selectable UI Style Ids → For Each Loop.
- For each id, Create Widget (a button) and bind its click to Set UI Style (Style Id = the id).
- Bind On UI Style Changed to refresh your own colors with Get UI Color.
Example, a custom shop screen:
- Create a Widget Blueprint with parent RSE Screen Widget.
- Event On View Model Changed → Cast To RSEShopViewModel (Object = View Model) → read its lists into your widgets (Join Text Lines, Fill Member Cards shorten the graph).
- Button On Clicked → the view-model's Buy action.
- Set it in Economy UI → Shop Widget Class.
Other useful nodes (RPG Saga | UI): Get Theme Font, Get Panel Brush, Get Key Label, Get Action Key Label, Make Menu Prompt, Is Using Gamepad, Play UI Sound, and the screen openers Open Inventory, Open Growth and Open Party Menu (Player), which work with any HUD class. Common UI: Get RSE Common UI → Push Widget To Layer, Push Screen, Pop Screen, Register Layer Stack.
A custom layout in Blueprint: create a class from the screen's layout base (RSE Dialog Layout, RSE Party Menu Layout, RSE ATB HUD Layout, RSE Grid HUD Layout, RSE Live HUD Layout), override Arrange, and use the context nodes Place Part, Place Part Stretched, Place Part Fitted, Place Part Full Screen, Group Parts, Hide Part, Get Margin, Get Canvas Size, Has Flag. Pick it in the style under Layout → Layouts → Custom ... Layout. Layouts only place the parts a screen built and keep no state.
21.6 C++ usage
// A widget derived from URSEHUDWidgetBase: colors and fonts follow the style.
void UMyBadgeWidget::NativeOnStyleChanged()
{
Super::NativeOnStyleChanged();
const FLinearColor Border = Color(RSEUITokens::Accent);
const FSlateFontInfo Label = Font(ERSETextRole::Label);
// rebuild what shows these
}
// A layout in C++.
UCLASS()
class UMyDialogLayout : public URSEDialogLayout
{
GENERATED_BODY()
virtual void Arrange_Implementation(URSEScreenLayoutContext* Context) const override;
};
In your own settings, use FRSEUIColor instead of FLinearColor for any color that should follow the style. For a view-model of your own system, derive from URSEScreenViewModel, expose data and actions, and let OnChanged tell the widget. Layout part names are in UI/Layout/RSEScreenLayouts.h.
21.7 Advanced
- Contrast and tokens in your own content. Use tokens for anything that carries meaning; Fixed colors never follow high contrast or color-vision changes.
- Shipping without bundled fonts. Remove the plugin's
Content/UI/Fontsfolder; the automation testRSE.UI.Style.Shippedchecks that all styles still pass contrast. - Split-screen. The UI Style Subsystem is per local player, so players can use different styles.
- Growth board. Board styles follow the UI style by default (Color Mode: Follow UI Style, Follow Shift Only, Fixed).
- CommonUI and the viewport client. Our layers work without
CommonGameViewportClient; with it, CommonUI's back also reaches our screens, and a press arriving both ways counts once. The action bar lists Confirm, Back and tab switches, with CommonInput icons; you provide the Common Bound Action Bar and button widget in your layout. - Debug commands (development builds).
RSE.UI.Style.Set <StyleId>,RSE.UI.Style.Seed <Token> <R> <G> <B>,RSE.UI.Style.HueShift <deg>,RSE.UI.Style.Frame <Corner> [Pattern] [Ornament] [Glow],RSE.UI.Style.Refresh,RSE.UI.ProceduralFrames 0,RSE.UI.Layout <Screen> <Variant|Off>(for exampleRSE.UI.Layout Dialog Bubble),RSE.UIStyle.Preview <StyleId> [capture], and the phone commands above. The live copy a command edits is never saved. See Appendix C.
21.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| My Widget Blueprint is ignored | Wrong parent class or empty slot; the log says why | Derive from RSE Screen Widget and set the slot in the right settings page |
| My screen shows nothing | The view-model data is read only at construct | Read it in On View Model Changed, which also runs after every change |
| Input fires twice | Reading keys yourself while the controller forwards them | Use the default On Confirm and the other input events; do not bind the same keys again |
| A color does not follow the style | It is a plain Linear Color or marked Fixed | Use a UI Color (FRSEUIColor), or untick Fixed |
| I cannot edit a shipped style | Plugin content is read-only on Fab installs | Duplicate to project in the Style Editor |
| The frames are slow on a weak device | Procedural frames with glow and patterns | Use simpler frames, or RSE.UI.ProceduralFrames 0 to test |
| Common UI back does nothing | The viewport client is not CommonGameViewportClient | Set it in Project Settings → Engine → General Settings, and set a Default Back Action |
| Our screens appear in the viewport, not on layers | Route Screens is off | Turn it on in the Common UI settings |
| Touch controls are tiny or huge | DPI rule not set | Set the physical scaling rule (User Interface → DPI Scaling → Custom) |
| Style change does not show in my screen | It is not derived from the framework screen classes | Bind On Style Changed on the UI Style Subsystem and refresh |
21.9 See also
- 03-game-foundation-and-archetypes.md for the foundation presets that pick a default style.
- 08-battle-common.md and the per-mode battle chapters for the HUDs.
- 14-narrative.md for dialog.
- 19-camera-and-presentation.md for battle banners and presentation.
- 22-networking.md for per-player UI in co-op.
- 23-platforms-and-performance.md for Steam Deck and mobile.
- Product pages:
docs/product/ui-styles.md,custom-ui.md,common-ui.md,mobile.md.
22. Save and load
In short: the whole game state (party, inventory, story, quests, world, time and more) is saved in slots, from save points in the world, from a consumable save item that works almost anywhere, and by autosave at save points and zone changes. Saving is never allowed in battle, dialog or cutscenes. Every system saves itself as a named section, so adding your own state is one registration line.
22.1 Basics
22.1.1 What the player gets
- Save points in the world: interact, the slot screen opens, pick a slot.
- A consumable save item: use it from the party menu to save anywhere, except in battle, dialog, cutscenes and zones you mark as no-save (for example before a boss).
- Autosave at every save point and when arriving on another map, in rotating autosave slots that manual saves can never overwrite.
- Continue and Load in the main menu, with a slot screen that shows a thumbnail, zone, party with levels, play time, money and date.
- Damaged saves are recovered from a backup automatically.
There is no saving or suspending during a battle: the state of a fight is never serialized.
22.1.2 Your first save point
- In your level, place a Save Point actor (Place Actors → search "Save Point", class
ARSESavePoint). - Give it a unique Save Point Id (for example
Inn_Hearth). Move its Player Spawn where the player should stand when loading from it. - Optionally set its Mesh and Interact Radius.
- Play, walk up and interact. The save screen opens.
Save screens, Continue and Load in the main menu need nothing else: they are built in.
22.1.3 A no-save zone
- Place a No Save Volume actor (class
ARSENoSaveVolume) around the area, for example the corridor before a boss. - While the player is inside, the consumable item is blocked and the save screen says why. Save points still work (the block's scope is Consumable Item Only).
For an area name shown on the slot screen, place an Area Volume actor (class ARSEAreaVolume; the higher priority wins where volumes overlap).
22.1.4 A save item
Create the item as a Save Item data asset (URSESaveItemData, a consumable without a use ability that is never usable in battle). Give it to the player like any item. Using it opens the slot screen; the item leaves the inventory only after a successful save.
22.2 How it works
22.2.1 The principle
The save system knows no gameplay system. Each system that keeps state registers a participant and writes its own section: an id, a version and bytes. The save file is a header (Info: slot, timestamp, play time, request source, location, party summary, money, a JPEG thumbnail) plus a list of opaque sections. Only fields marked UPROPERTY(SaveGame) are saved, with tagged properties, so a field added after a save loads with its default and a removed field is ignored. References to content are written as text and stay stable between versions.
The sections the plugin saves include:
| Section | What it holds |
|---|---|
Party | members (recruitment, departures, guests), inventory with key items and documents, equipment, vitals (HP, MP and any persistent resource, KO), progression, formation |
Narrative | story flags and variables, solved puzzles, unlocked zones, seen events and scenes, one-shot interactions, discoveries |
Rules | the active rules profile id |
Quests, Cards, Dialog, Difficulty | quest status and steps, card collection, read lines and seen dialogs, adaptive intelligence per mode and recent battles |
World | encounter triggers, random areas, visible enemy spawners, locks, chests, traps, interactables, data layers, interior visits (keyed by stable State Keys) |
Audio, Tutorials, Bestiary, Time, NPCs, Seeds, PartyControl, Map | story music override, seen tutorials, met enemies, clock and weather, story changes of NPC days, random seeds, who controls whom in the field, fog of war and pins |
Intentionally not saved: a battle in progress, the dialog runner, a scene in progress, save blocks, travel in progress, zone music, the current zone banner, character looks and animation state (rebuilt from data), and the player's options (volume, language, text speed, UI style, controls), which belong to the user in GameUserSettings.ini. Session-only sections (such as session rules and stealth state) replicate in co-op but never go in files.
22.2.2 Save rules
Blocking is a registry of reasons, counted so overlapping zones stack. The built-in reasons are Battle, Dialog, Cutscene (all scope) and NoSaveZone (consumable only). Check with Can Save Now, which also returns the reasons. A save is refused with Blocked when a reason applies.
Autosave: Autosave Slot Count slots rotate (Autosave, Autosave1...): the first empty one, else the oldest (a damaged slot is replaced first). Autosave runs at every save point and on arrival at a map through travel, after Zone Autosave Delay, never in no-save zones (unless Autosave In No Save Zones) and not within Min Seconds Between Autosaves. A load never autosaves.
22.2.3 Files and recovery
With the default File backend a slot is Saved/SaveGames/<Slot>.sav: a small container (magic, version, size, CRC32) around the save bytes. Writes are atomic: the new file is written to .tmp, the current good file becomes .bak, then the temp file is renamed over the slot. A damaged file never replaces a good backup. When loading, a damaged or missing slot falls back to the complete temp file, then to the backup; the slot screen marks a slot that came from backup. A save written by a newer game version is refused before anything is applied, so a half-loaded state never exists.
22.2.4 Save backends
Project Settings → Save → Backend: File (default, with free-space check), Save Game System (the platform's ISaveGameSystem, the storage consoles implement, with our container around the bytes) or Custom (a C++ class implementing IRSESaveBackend). Saves are per platform user (FRSESaveUser). Failures report Corrupt, NoSpace, UserSignedOut or Failed through On Save Failed.
22.2.5 Loading
Load Game applies every section to its system immediately (in the game instance, so state survives the map change), then opens the saved map and places the party at the saved save point, marker or transform. Each section is read into a fresh value and assigned only if it succeeds, so a corrupt section cannot spoil the current state. New game resets every saved system (Start New Game).
22.2.6 Versions and migration
The file has a version and each participant has its own. ReadSaveSection receives the saved version so a participant can convert old data. A missing section (a system added after the save) calls OnSaveSectionMissing (default: that system's new-game state). A section with no participant (a removed system) is ignored with a warning. A section newer than its participant is refused.
References to deleted content are dropped on load with a warning per reference, instead of failing the load: the stack of a deleted item, a deleted member, a deleted equipment slot entry.
22.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSESaveSubsystem | RSECore | Game instance subsystem: slots, save, load, blocks, autosave, participants |
IRSESaveParticipant, TRSEStructSaveParticipant<T> | RSECore | A system's section writer and reader |
URSESaveGame, FRSESaveSlotInfo, FRSESaveLocation, FRSESaveRequest | RSECore | The file, its header, where the party was, why it was saved |
URSESaveSettings | RSECore | Project Settings → Save |
URSESaveInteropLibrary | RSECore | Export and import sections to your own save system |
IRSESaveBackend | RSECore | Custom storage |
URSESaveSessionPolicy | RSECore | Co-op rules for who may save and load |
URSESaveFlowSubsystem | RSE | Opens the save screen, opens the saved map and places the party, consumes the save item |
ARSESavePoint, ARSENoSaveVolume, ARSEAreaVolume | RSE | Save point, no-save zone, zone name |
URSESaveItemData | RSE | The consumable save item |
URSESaveUISettings | RSE | Project Settings → Save UI |
URSEBlueprintLibrary_Save | RSE | The Blueprint nodes for everything above |
22.4 Settings
Project Settings → RPG Saga Engine → Save. Full list: Appendix B.
| Setting | Default | Meaning |
|---|---|---|
| Slot Count | 3 | Manual slots |
| Slot Name Prefix | Slot | Slot0, Slot1... |
| Autosave Slot Name | Autosave | Empty means no autosave |
| Autosave Slot Count | 1 | Rotating autosave slots |
| Autosave On Zone Transition | on | Autosave when arriving on a map |
| Autosave In No Save Zones | off | Allow it inside no-save zones |
| Zone Autosave Delay | 0.5 s | Wait after arrival |
| Min Seconds Between Autosaves | 30 s | Rate limit |
| Backend | File | File, Save Game System or Custom |
| Suspend Flush Timeout | 2 s | How long a pause waits for pending writes |
| Keep Backup | on | Keep the previous good save |
| Min Free Disk Space MB | 1 | Refuse to save below this |
Save UI (Project Settings → Save UI) holds the slot screen: autosave at save points, thumbnail size and capture, lock after save, and the texts for corrupt, backup and unavailable slots. Game Flow holds Show Continue and the menu keys.
22.5 Blueprint usage
Category RPG Saga | Save (the RPG Saga Blueprint Library Save nodes):
- Save Game (Slot Name, Save Point Id), Load Game (Slot Name; also opens the saved map), Open Save Screen (Save Point Id), Can Save Now (Source, returns the reasons), Has Any Save, Get Continue Slot, Get Save Slots, Delete Save Slot, Start New Game, Block Saving (Reason, Scope) and Allow Saving (Reason), Get Play Time Seconds, Get Slot Name (index).
- On Get Save Subsystem: Request Save, Autosave, Save To Slot Async, Load From Slot Async, Is Busy, Get Last Save Result, events On Saved, On Loaded, On Load Failed, On Save Requested, On Save Failed.
Example, a minigame that blocks saving:
- Event: minigame starts → Block Saving (Reason =
Minigame, Scope = All). - Event: minigame ends (and in Event EndPlay) → Allow Saving (Reason =
Minigame).
Example, a custom "Continue" button:
- Button On Clicked → Get Continue Slot → Branch on the return value.
- True → Load Game (Slot Name = the slot).
- False → show a "no saves" message (or use Has Any Save to disable the button).
Keeping our state inside your own SaveGame: the RPG Saga | Save | Interop nodes read and write live state of any section without using our slots: Get Save Section Ids, Export Section To Bytes, Import Section From Bytes, Export Sections To Bytes / Import Sections From Bytes (an empty list means every section), and the JSON forms (Export Sections To JSON, Import Sections From JSON, Export Section To JSON, Import Section From JSON). In your save function call Export Sections To Bytes with an empty list and keep the array in a Byte Array variable of your SaveGame; after you load your map, call Import Sections From Bytes. Import replaces the state of those sections and does not open the map: load it yourself. A section the project does not have is skipped, not an error.
22.6 C++ usage
Register a section for your own system, in the Initialize of a subsystem whose state is a struct of SaveGame fields:
USTRUCT()
struct FMyQuestBoardState
{
GENERATED_BODY()
UPROPERTY(SaveGame) TArray<FName> CompletedBoards;
UPROPERTY(SaveGame) int32 ReputationPoints = 0;
};
void UMyBoardSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
Collection.InitializeDependency<URSESaveSubsystem>()
->RegisterStruct<FMyQuestBoardState>(TEXT("MyBoard"), /*Version=*/1, this, [this] { return &State; });
}
Rules: the section id never changes after saves exist; the participant lives as long as its owner; use the returned participant's PostLoad(SavedVersion) to convert old data, OnMissing for a system added after the save, and OnNewGame for new-game state. Load order is registration order (the party is first). Do not save things that can be rebuilt (positions of schedule-driven NPCs, animation state).
Block saving from your own code: Save->PushSaveBlock(TEXT("MyCinematic")) and Save->PopSaveBlock(TEXT("MyCinematic")) (reasons are counted; always pop in EndPlay).
State held by actors (triggers, locks, interactables) lives in the exploration state subsystem under a State Key (the Save Key property, assigned by the editor); the actor reads it in BeginPlay and writes on change. See 16-world-building.md.
22.7 Advanced
- Custom backend. Implement
IRSESaveBackendand set Backend to Custom with your class: write the bytes to your cloud or platform service. Metadata (location, party, time, thumbnail as bytes) is in the save, so it works on any backend. - Async save and load.
SaveToSlotAsynccaptures the state immediately and writes on a worker thread;LoadFromSlotAsyncreads on a worker and applies on the game thread. CheckIs Busyand listen toOn SavedandOn Loaded. - State scope. A participant's
GetStateScopeis Shared, PerPlayer or HostOnly, andIsSavedToFilefalse makes it session-only. In co-op, saves belong to the host: a guest's save and load calls returnHostOnly, with the message ofURSESaveSessionPolicy. See 22-networking.md. - Thumbnails. The slot screen captures the viewport without UI. Headless runs and servers skip it. Turn it off in Save UI settings.
- Missing content. Participants may opt out of dropping missing references with
bRemoveMissingContent. - Testing.
RSE.Save.FullRoundTripcompares the registered participants with the audit list, fills every section, writes it to a temp slot, resets, loads and checks byte for byte. A new system with a section fails it until you add it to the list. - Console commands (development).
RSE.Save.Slots,RSE.Save.To <slot index | slot name>,RSE.Save.Load [slot index | auto | slot name],RSE.Save.UseItem [item path] [give], andRSE.Save.SimulateFault NoSpace|Corrupt|SignedOut|Failed. See Appendix C.
22.8 Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The save item says it cannot be used | A block applies: battle, dialog, cutscene or no-save zone | Check Can Save Now for the reasons; a block you pushed yourself needs its pop |
| Saving is blocked forever after a minigame | A Push without a Pop | Pop in every exit path and in EndPlay; the log warns on a pop without a push |
| A manual save fails with Protected Slot | It targeted an autosave slot | Use Get Slot Name for manual slots |
| Autosave does not run on arrival | Rate limit, no-save zone or the setting is off | Check Autosave On Zone Transition, Min Seconds Between Autosaves, Autosave In No Save Zones |
| After loading, a chest is closed again | The actor's state key changed (renamed actor, copied instance) | Run Fix State Keys and keep the Save Key values |
| Load says Incompatible | The save was written by a newer version | Update the game; nothing was applied |
| My system's data is gone after loading | No participant, or no SaveGame flag on the fields | Register the section and mark fields UPROPERTY(SaveGame) |
| A load puts the party at the wrong place | The save point id is not unique | Give each save point its own Save Point Id |
| A guest cannot save | Co-op: only the host saves | Expected; see the session policy |
| Slot shows as damaged | A corrupt file with no readable backup | Delete the slot, or load another; saves rewrite damaged slots |
22.9 See also
- 02-core-concepts.md for serializable state and IDs.
- 14-narrative.md for story flags and effects that gate saving.
- 15-exploration.md for save points in zones and travel.
- 16-world-building.md for State Keys on World Partition maps.
- 22-networking.md for co-op saving.
- 20-ui.md for the slot screen and replacing it.
- Design note:
docs/design/save-system.md. Product page:docs/product/modularity.md(Save Interop).
23. Co-op and online
In short: RPG Saga Engine lets two to four players play one game together: one player hosts, friends find or are invited to the session, and everyone explores, talks and fights in the host's world. You do not write networking code. Your own systems go online by declaring their state and their actions, the same way they already do for saving.
23.1 Basics
23.1.1 The two layers
Co-op is built from two layers that you can use separately.
| Layer | Module | What it does |
|---|---|---|
| Online sessions | RSEOnline | Getting players into the same game: host, find, join, invite, leave, reconnect, clear error messages, a lobby screen. Works on a local network (LAN), on Steam and on Epic Online Services (EOS) behind one interface. |
| Co-op | RSENet | What the players share once they are in: the party, the inventory, the story, quests, the map, the clock and live battles. Every player drives a party member. |
Both are optional. They load with the plugin and switch on only when the game runs a network session. Single player never pays for them, and it never notices the co-op rules. You can turn the whole thing off with the Online and Co-op feature (Project Settings → RPG Saga Engine → Features).
23.1.2 The model in one minute
- The host is the authority. The host's machine runs the game logic: encounters, NPCs, quests, the clock. Guests show the host's state and send their actions to the host.
- Actions are commands. A player's action goes through the command bus (Submit Command). In single player the bus applies it at once. On a guest it travels to the host, which checks it, applies it and sends the result back. One code path serves every case.
- State is replicated by section. The state your systems already save (party, story, quests, world, map, time) is also what the host sends to guests. Each save section is sent, compressed, when it changes. A player who joins late receives everything once.
- Players drive party members. A joining player takes a party member from the companion AI, the character chosen in the lobby if it is free. When a player leaves, the companion AI takes the member back at once. A player who comes back gets the same slot and, if it is still free, the same member.
- World actors (explorers, companions, roaming enemies, NPCs) are ordinary replicated Unreal actors. Their logic runs on the host only.
The maximum is four players, host included. The session is a listen server: the host plays too, and no dedicated server is needed.
23.1.3 Try it on a local network in two minutes
LAN needs no account and no setup.
- Start the game twice as standalone games (Play → Standalone Game, twice), or on two PCs on the same network. Use a map with an exploration game mode. The plugin's example map works.
- In the first window open the console and type
RSE.Online.Host. The log showshost listening on ... ok. - In the second window type
RSE.Online.AutoJoin. It searches until it finds the host and joins. - The guest appears as a party member that the host's companion AI was driving. Walk around in both windows.
RSE.Online.Statuslists the session and the players.RSE.Net.Statuslists the players, their members and positions, the state sections and the traffic.RSE.Net.Stats 10measures the bandwidth for ten seconds.
For a screen instead of commands, RSE.Online.Lobby opens the built-in lobby: Host, Find, a list of sessions to join, the players and your character choice. With the default settings the main menu also offers Host Game and Join Game, and the in-game menu offers Host co-op game, Invite friends, Join a game and Leave co-op game.
23.1.4 The co-op rules you get for free
The group plays the host's story together. These rules are built in. Each has settings and a replaceable policy class, so you change a rule without touching the framework.
- Dialogs. The one who starts a dialog speaks and everyone watches it. Story choices are made by the host, by the speaker or by a vote (setting in the dialog settings, or the choice node's Decider). The dialog box shows who speaks and who decides.
- Story scenes play on every machine. Guests' input is locked, and only the host can skip (or a vote, or anyone, by the Scene Skip Rule).
- The leash. Guests may roam up to Leash Radius from the host (or from the center of the group). Past it they get a warning, and after Leash Grace Seconds they are brought back beside the group. It is off during scenes, dialogs, battles and travels. Place an RSE Co-op Map Settings actor in a map to change the leash there.
- Zone travel. The host's travel starts a short countdown on every screen and takes everyone along. A guest at an exit asks the host, who answers a question box.
- Notices. Refused actions show their reason to the player who tried them. Everyone sees "the host is saving", "Player 2 joined", "the companion AI takes over".
- Battles are live. While a session has more than one player, grid Tactics and ATB encounters are fought in Free Tactics on the map where the party stands. Each player commands the unit of the member they drive. Real-time Action encounters stay as they are. See Free Tactics (Live) and Action battles.
- Companions and equipment. Every player may order companions the AI drives, never a member another player drives. A guest changes only the equipment and Pacts of the member they play. Both are settings.
23.2 How it works
23.2.1 Sessions
A session goes through a small state machine owned by the session subsystem:
host: Idle -> Creating -> Hosting
search: Idle -> Searching -> Idle
client: Idle -> Joining -> Connected
drop: Connected -> Reconnecting -> Joining -> Connected
end: Leaving -> Idle
Only one operation runs at a time. A second one is refused with Busy rather than mixed up with the first. Every step has a timeout (Operation Timeout Seconds), and every failure has its own player-facing message: the service is unavailable, you are not signed in, the session is full, the host runs another version, the host refused new players during a battle, the connection was lost, and so on.
The online service is a provider: LAN, Steam, EOS, or a class of your own. The session flow, the version check, the reconnecting and the lobby are the same for all of them.
23.2.2 Commands
Every player action is a command: a small serializable struct, a validator and an applier.
- A widget or a Blueprint submits the command (Submit Command).
- On the host or in single player the bus calls the handler's Validate, then Apply, at once.
- On a guest the bus sends the command to the host. The host fills in the sender from the connection, never from the packet, so a client cannot pretend to be someone else. It validates, applies and returns the result.
- The system's own events fire as usual, and the state section it changed replicates.
Commands refer to content by id (tags, primary asset ids, soft references), never by pointer. Commands that need randomness take their seed from the game's command stream, not from the global random generator, so the host's result is reproducible.
23.2.3 State sections
A state section is one named block of serializable state, the same block the save system writes. The owner marks it changed when its state changes. The network layer then sends it when the revision grew and the bytes differ from what was last sent. A section has a scope:
| Scope | Sent to |
|---|---|
Shared (default) | everyone |
PerPlayer | its owner only (tutorial progress, for example) |
HostOnly | nobody (difficulty, seeds) |
A change you forget to mark is still caught by a safety net, the change detection, a little later and at some cost. Mark your changes anyway.
23.2.4 Live battles
The host's machine runs the battle. Every machine shows it with its own camera, HUD and menus. The host streams the battle's numbered events and state to each guest, and a guest that falls behind catches up at a higher playback rate. A battle's start snapshot travels in confirmed chunks. When another player's unit acts, your HUD says who is choosing, then shows the action. After Turn Timeout Seconds the host may command an unanswered unit for one turn (default), or the AI plays it. A player who leaves mid-battle is replaced by the AI at once, and a player who joins watches until the battle ends.
Real-time Action battles use their own stream for co-op: the host is authoritative for damage, the guest moves its own character with client prediction, plays its swing at once and claims its hits through the command bus. Its transport budgets are in Co-op Network → Action Battle.
23.2.5 Zone travel
The host's travel is a server travel. Guests reconnect to the new map and keep their slots, behind a short loading screen. Seamless travel is not used. A guest cannot start a travel on its own.
23.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSESessionSubsystem | RSEOnline | The one object for the session flow: host, find, join, leave, invites, lobby, state and errors. Blueprint and C++. |
URSESessionProvider | RSEOnline | Base of an online service. URSESessionProvider_OSS works with any Online Subsystem. URSESessionProvider_LAN, _Steam and _EOS derive from it. |
URSEOnlineSettings | RSEOnline | Project Settings → RPG Saga Engine → Online. |
URSELobbyWidget, URSELobbyViewModel | RSEOnline | The built-in lobby screen and the data a replacement screen reads. |
URSEOnlineMenuEntry | RSEOnline | Adds Host Game, Join Game and the in-game entries (a URSEMenuExtension). |
URSENetSettings | RSENet | Project Settings → RPG Saga Engine → Co-op Network. |
ARSENetGameMode, ARSENetGameState, ARSENetPlayerState | RSENet | The exploration game mode with the co-op components built in. Use it for maps meant for co-op. |
URSENetSubsystem, URSENetWorldSubsystem | RSENet | The transport: commands up, results and events down. URSENetWorldSubsystem::SendToPlayer, SendToGuests and RegisterEventHandler carry your own messages. |
URSENetPlayerComponent | RSENet | On each player state: the slot (GetPlayerId) and the player's own state sections. |
URSENetBattleSubsystem, URSENetActionBattleSubsystem | RSENet | The live-battle and Action-battle streams. |
URSECommandSubsystem, FRSECommand, URSECommandHandler | RSECore | The command bus and its building blocks. |
URSESaveSubsystem, RSEStateSections::MarkChanged | RSECore | The state sections (the same ones the save system writes). |
URSEPlayers, URSEPlayerProvider, URSEAuthorityPolicy | RSE | Who the players are (GetControllerFor, GetPawnFor) and when the co-op rules apply (HasAuthority, IsMultiplayerSession). |
URSECoopNoticeSubsystem | RSE | One notice path for every player. |
URSECoopRulesSettings, URSECoopFlowSettings | RSECore / RSE | The co-op rules and the flow settings (leash, travel, scene skip, texts). |
ARSECoopMapSettings | RSE | A per-map actor for the leash radius and the guests' start spacing. |
There are no data assets to create for co-op. Your first work is in settings.
23.4 Settings
23.4.1 Online
Project Settings → RPG Saga Engine → Online (URSEOnlineSettings):
| Setting | What it does | Default |
|---|---|---|
| Provider Class | The service: LAN (Null subsystem), Steam, Epic Online Services, or your own provider class. | LAN |
| Fallback To LAN | When the chosen service is not available (Steam not running, EOS not configured), use LAN instead of failing. | on |
| Game Version | Players join only hosts with the same version. Empty uses the project version. | empty |
| Max Players | Players in a session, host included (2 to 4). | 4 |
| Visibility | Public, Friends Only or Invite Only. LAN sessions are always visible on the local network. | Friends Only |
| LAN Port | The game port the host listens on. | 7777 |
| Host Map | The map the host opens when hosting. Empty stays on the current map and opens it to players (drop-in). | empty |
| Join In Progress Policy | A player who joins during a battle: spectate until it ends, join immediately, or be refused. | Spectate |
| Keep Slots For Reconnect | A player who drops keeps the slot and character until a new player needs the place. | on |
| Operation Timeout Seconds | Any step (create, search, join, travel, leave) that takes longer fails with a clear message. | 30 s |
| Auto Reconnect, Reconnect Attempts, Reconnect Delay Seconds | A client whose connection drops rejoins the same session. | on, 3, 3 s |
| Lobby Widget Class, Lobby Z Order, Lobby Panel Width | The lobby screen. | built-in |
For one run the command line -RSESessionProvider=LAN (or Steam, EOS, or a class path) overrides the provider.
23.4.2 Co-op network
Project Settings → RPG Saga Engine → Co-op Network (URSENetSettings):
| Setting | What it does | Default |
|---|---|---|
| Enable Coop | Installs the co-op layer whenever the game runs a network session. Off means your project replicates on its own. | on |
| Section Send Interval | How often the host looks for changed state sections. | 0.1 s |
| Change Detection Interval | How often the host compares every section's bytes to catch unmarked changes. 0 = never. | 0.5 s |
| Min Section Resend Interval | A section that keeps changing is sent at most this often. The latest state always goes out. | 0.2 s |
| Compress Sections, Compression Min Bytes, Compression Format | Sections above the minimum are compressed. | on, 256, Oodle |
| Max Section Bytes | A larger section is not replicated and is reported as an error. Split that state. | 256 KB |
| Max Command Bytes | Larger commands are refused. A much larger packet disconnects the sender. | 4096 |
| Max Commands Per Second | Per guest. More are refused, not applied. | 30 |
| Max Queued Commands | Commands a guest keeps while it is still connecting. | 32 |
| Broadcast Result Types | Command types whose results every player receives, for notices. | none |
| Player Provider Class, Authority Policy Class | Who the players are, and when co-op rules apply (from the second player). Replaceable. | built-in |
| Assign Member On Join | A joining player takes a party member from the companion AI. Off means you assign members yourself. | on |
| Class Relevancy | Per actor class: cull distance, update rate and priority. | built-in |
The Battle and Action Battle categories hold the stream tuning (intervals, chunk sizes, the Action mirror's byte budget, claim limits). The defaults are measured. Leave them alone until you have a reason to change them.
23.4.3 Rules and flow
| Where | Main values |
|---|---|
Co-op Rules (URSECoopRulesSettings) | Default Encounter Conversion (Free Tactics), Companion Orders (Any Player), Guest Equipment (Own Character), the policy classes |
Co-op Flow (URSECoopFlowSettings) | Leash on, Host anchor, 40 m, 4 s grace; Scene Skip Rule (Host Only); Group Travel Countdown (3 s); every notice text |
| Free Tactics (Co-op) | Companion Units (AI), Turn Timeout Seconds (45), Turn Timeout Action (Host Takes Over), Pull In Far Players (on), Reconnect Retakes Unit At Once (off) |
Per encounter, the Co-op Conversion field chooses what happens in a session: fight it live, use a Co-op Alternative made for co-op, or keep its mode for a set piece. The encounter's validation warns when something would not convert.
See Appendix B for every property.
23.5 Blueprint usage
23.5.1 Host, find and join
All session nodes live on the RSE Session Subsystem (Get Game Instance → Get Subsystem (RSE Session Subsystem)) and in three latent nodes.
Host from a menu button:
- On the button's On Clicked, call Host Session (Async). Leave Params at their defaults to use the project settings, or fill the optional fields to override max players, visibility, label or map.
- On Success: hide the menu. The game is now hosting and other players can find it.
- On Failure: pass the Error to Get Session Error Message and show the text in a message box.
Find and join:
- Call Find Sessions (Async). On Success gives the results. Each has a label, map, players, ping and whether it can be joined (Is Session Joinable tells you).
- Show them in a list. When the player picks one, call Join Session (Async) with its Result Index.
- On Success fires once the client is connected and the map has loaded.
Other nodes on the subsystem: Leave Session (also cancels a search or a reconnect), Show Invite UI, Query Friends, Invite Friend, Set Preferred Character, Open Lobby Screen, Set Battle In Progress, Is In Session, Is Host, Is Multiplayer, Get Session State, Get Last Error. Events to bind: On State Changed, On Session Error, On Sessions Found, On Lobby Changed, On Player Joined, On Player Left, On Player Admission Changed, On Friends Received, On Invite Accepted.
23.5.2 Submit a command from a widget
- Pick the command struct. New command structs are declared in C++ (see below). The framework's own commands, such as the party and quest commands, are ready to use.
- In the widget: Get Game Instance → Get Subsystem (RSE Command Subsystem).
- Make Instanced Struct with the command struct and its fields.
- Submit Command. The returned result says Applied, Rejected or Forwarded (a guest sent it to the host).
- Bind On Command Result to show the final outcome. On a guest it arrives later, after the host answered.
23.5.3 A handler in Blueprint
- Create a Blueprint class from RSE Command Handler.
- Set Command Type to the command struct. Set Permission (Any Player or Host Only) and, for host-only commands, a Denied Reason. Untick Uses Seed if the command has no randomness.
- Override Validate (return false with a reason the player can read) and Apply (change the state).
- List the class in Project Settings → RPG Saga Engine → Commands → Handler Classes.
23.5.4 Notices
Call Notify (one player) or Notify All on the RSE Co-op Notice Subsystem. Bind On Notice to draw the notice in your own widget.
23.5.5 Authority checks
Use Has Game Authority (or Has Authority from the players library) before logic that must run once (spawning, rewards, timers). It is true in single player and on the host, false on a guest. Is Multiplayer Session tells you whether the co-op rules apply.
23.6 C++ usage
23.6.1 Making your system's state replicate
If your system already saves through the save system, it is already replicated. Register the section, set its scope, and mark it when it changes:
// In your subsystem's Initialize (the same registration as for saving):
URSESaveSubsystem* Save = Collection.InitializeDependency<URSESaveSubsystem>();
auto Section = Save->RegisterStruct<FMyReputationState>(TEXT("Reputation"), 1, this, [this]() { return &State; });
Section->Scope = ERSEStateScope::Shared; // Shared, PerPlayer or HostOnly
// Whenever the state changes (on the authority):
RSEStateSections::MarkChanged(this, TEXT("Reputation"));
On a guest the section arrives and is applied through the same code as a load. Listen to URSESaveSubsystem::OnSectionChanged (Blueprint: On State Section Changed) to refresh the screen.
23.6.2 Making your system's actions commands
USTRUCT()
struct FMyCmd_Praise : public FRSECommand
{
GENERATED_BODY()
UPROPERTY() FPrimaryAssetId Town;
};
// In Initialize:
URSECommandSubsystem* Commands = Collection.InitializeDependency<URSECommandSubsystem>();
Commands->RegisterHandler<FMyCmd_Praise>(
[this](const FRSECommandContext& Context, const FMyCmd_Praise& Cmd, FText& OutReason)
{
return Cmd.Town.IsValid(); // never change state here
},
[this](const FRSECommandContext& Context, const FMyCmd_Praise& Cmd)
{
State.Add(Cmd.Town, 1); // Context.Instigator is the sender
RSEStateSections::MarkChanged(this, TEXT("Reputation"));
},
ERSECommandPermission::AnyPlayer, this);
// From a widget or gameplay code:
Commands->Submit(FMyCmd_Praise{ TownId });
Context.Instigator is the player id of the sender, set by the host's transport. For a public function that must keep its signature in single player, RSECommands::SubmitOrApply wraps the pattern: single player applies at once, a guest sends the command.
23.6.3 Messages from the host to a player
Any USTRUCT can travel from the host to one player or to all guests:
// Inside any class that has a world:
URSENetWorldSubsystem* NetWorld = GetWorld()->GetSubsystem<URSENetWorldSubsystem>();
NetWorld->RegisterEventHandler(FMyEvent_Praised::StaticStruct(), this,
[this](const FInstancedStruct& E) { ShowToast(E.Get<FMyEvent_Praised>()); });
NetWorld->SendToPlayer(Context.Instigator, FInstancedStruct::Make(FMyEvent_Praised{ /*...*/ }));
// or NetWorld->SendToGuests(...)
The framework's own screens work this way: screens opened by a player's action (shop, code lock, lockpick), puzzle results and dialog votes.
23.6.4 Your own actors
Actors in the world follow the usual Unreal rules: replicated properties and OnRep functions. Put the game logic behind URSEPlayers::HasAuthority(this) so it runs on the host only. Find a player from a command with URSEPlayers::GetControllerFor(PlayerId) and GetPawnFor(PlayerId).
Add RSENet to your module's dependencies only if you use its types directly. Systems that stay on the bus and the state sections need no dependency on it.
23.6.5 Extension points
| Subclass | To change |
|---|---|
URSESessionProvider (or URSESessionProvider_OSS) | Add another online service. Implement Host, Find, Join and Leave, answer each request with its Report... call, and pick the class in Provider Class. A Blueprint child of the OSS provider with another Subsystem Name is often enough for a new platform. |
URSEPlayerProvider, URSEAuthorityPolicy | Who the players are, and when co-op rules apply. |
URSELeashPolicy, URSEGroupTravelPolicy, URSECoopEncounterPolicy | The leash, group travel and encounter conversion rules. |
URSEMenuExtension | Your own entries in the main and in-game menus. |
URSELobbyViewModel / URSELobbyWidget | A custom lobby screen. Derive a Widget Blueprint from RSE Screen Widget, read the view model and call its actions (Host, Find, Join, Leave, Invite, Cycle Character). Set it as Lobby Widget Class. |
23.7 Advanced
23.7.1 Steam
- Enable the engine plugin Online Subsystem Steam, then restart the editor.
- Add to
Config/DefaultEngine.ini:
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemSteamIP.SteamNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
bInitServerOnClient=true
[/Script/SocketSubsystemSteamIP.SteamNetDriver]
NetConnectionClassName="/Script/SocketSubsystemSteamIP.SteamNetConnection"
- Set Online → Provider Class to Steam.
- Test with two PCs and two Steam accounts. Steam does not work inside the editor viewport: package the game or run it standalone.
App ID 480 is Valve's public test app. It is fine for development, but every developer using it sees the others' sessions (RPG Saga Engine lists sessions of other games and versions as incompatible and does not let you join them). Use your own App ID before release. If Steam is not running, the game falls back to LAN and the log says why.
23.7.2 Epic Online Services
- Create a product in the Epic Developer Portal: a product, a sandbox, a deployment, and a client policy that allows peer-to-peer and lobbies. Write down the Product, Sandbox, Deployment and Client IDs and the Client Secret.
- Enable the engine plugin Online Subsystem EOS.
- In Project Settings → Plugins → Epic Online Services add an artifact with those IDs and a 64-character hexadecimal encryption key. Tick Use EAS and/or Use EOS Connect.
- Add to
Config/DefaultEngine.ini:
[OnlineSubsystem]
DefaultPlatformService=EOS
[OnlineSubsystemEOS]
bEnabled=true
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/SocketSubsystemEOS.NetDriverEOS",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/SocketSubsystemEOS.NetDriverEOS]
bIsUsingP2PSockets=true
- Set Provider Class to Epic Online Services.
- Players must be signed in. For development, run the EOS Developer Authentication Tool and start each game with
-AUTH_TYPE=developer -AUTH_LOGIN=localhost:<port> -AUTH_PASSWORD=<credential name>. The provider signs in automatically before hosting or searching and reports Not signed in when it cannot.
23.7.3 What was tested
Be honest with your players and your testers about this. The two-process LAN test (Tools/Dev/coop_lan_smoke.ps1 in the repository) covers join, a guest command, both players moving, a state change, leaving, zone travel, dialogs and scenes, and live battles including a player leaving mid-battle. Steam and EOS have been exercised on a local network only, not between distant machines. Four-player sessions under bad network conditions and hosting on a Steam Deck are not yet tested. Competitive PvP is not part of this release.
23.7.4 Bandwidth
Measured on the example map, two players, LAN:
| What | Measured | Budget |
|---|---|---|
| Joining (every state section, once) | about 5 KB sent | 60 KB |
| Exploring, per connection | 4 to 6 KB/s average | 15 KB/s average, 40 KB/s peak |
| A guest command | about 0.3 KB | |
| A live battle, the battle stream | about 0.9 KB/s | 5 KB/s |
If your own state is large, keep sections small and split them (Max Section Bytes reports offenders in the log).
23.7.5 Test without a second machine
RSE.Net.SimulateMultiplayer 1makes the default authority policy report a multiplayer session, so the co-op time and pause rules apply.RSE.Net.ForceProxy 1makes it report no authority, as on a client: logic timers stop. Both are for debugging and tests.RSE.Net.LogTraffic 1logs every section and command.RSE.Net.Dev.Walk X Y Seconds,RSE.Net.Dev.SwitchLeader,RSE.Net.Dev.Kick Slot(host),RSE.Net.Dev.ScriptWhen guest|synced|noguest ScriptFiledrive a test without clicks.RSE.Coop.Dev.Prompt [Host|Speaker|Vote],RSE.Coop.Dev.Advance,RSE.Coop.Dev.Choose <Option>,RSE.Coop.Dev.StatusandRSE.Coop.Dev.Notify <Text>test the co-op dialog, leash and notices.- Start two processes with
-ExecCmds="RSE.Online.Host"and-ExecCmds="RSE.Online.AutoJoin 60"(add-RSESessionProvider=LAN -nosteam). A label (RSE.Online.Host [Max] [Label],RSE.Online.AutoJoin [Seconds] [Label]) keeps test sessions apart.
All console commands are listed in Appendix C.
23.7.6 Rules for network-ready systems
Whenever you add a system, follow the same rules the framework follows:
- Actions go through commands. UI and input do not change shared state directly. They submit a command.
- One owner per piece of state. Others read it and listen to its events. Do not keep private copies that can drift.
- Presentation feeds on events. A client that only receives the events must be able to show the same thing.
- Control of a character is swappable. The local player, the AI or a remote player take the same path. Never assume one local player: avoid
GetPlayerController(0)in logic. - Determinism. Use
URSESeedSource::NextSeedFor(this, Stream)or the seed in the command context, never the global random functions, for anything that affects the game. - Guard effects. Logic with effects in the game runs behind
URSEPlayers::HasAuthority(orURSEAuthoritySubsystem::HasAuthorityFor). - No RPCs in framework-style code. A system goes online through its save section and its commands. Actors of your own can use ordinary replication.
23.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The online service is not available | The provider's subsystem is not loaded: the engine plugin is not enabled, DefaultPlatformService is not set, Steam is not running, or the game was started with -nosteam. The log line RSEOnline: ... is not available (...) names the reason. With Fallback To LAN on, the game uses LAN instead. |
| LAN finds nothing | Both games must be on the same subnet. Allow the game through the firewall: UDP for the LAN beacon port (14001) and the game port (7777 by default). |
| The host is running a different version | Set the same Game Version (or project version) on both builds. |
| Steam: sessions of other games appear | App ID 480 is shared. They are listed as incompatible and cannot be joined. Use your own App ID. |
| EOS: Not signed in | Start the game with the developer authentication arguments, or sign in through your own login flow before hosting. |
| Your system works for the host but not for guests | Its state is not a state section, or the owner never calls MarkChanged. Check RSE.Net.Status for the section, and read the log for Max Section Bytes errors. |
| A guest's action does nothing | It is not a command, or the handler's Validate refused it. Turn on Commands → Log Refused Commands (or RSE.Commands.Log 1) and read the reason. |
| A guest is refused with a rate message | More than Max Commands Per Second arrived. Lower the rate of the sender, or raise the setting. |
| Timers and spawns run on guests too | The logic is not behind URSEPlayers::HasAuthority. |
| A guest keeps being pulled back | The leash. Raise Leash Radius, change the anchor, or place an RSE Co-op Map Settings actor. |
23.9 See also
- Save and load: the same sections are what is replicated.
- Free Tactics (Live) and Action battles: co-op battles.
- Extending the plugin: modules, extension points and the engineering rules.
- Platforms and performance: the Steam Deck and the save backends.
- Product pages:
docs/product/coop.md,docs/product/online-sessions.md, and the design recorddocs/design/networking.md.
24. Platforms and performance
In short: RPG Saga Engine is built and tested on Windows (Win64) and plays on the Steam Deck. It has a low-end fallback path with no Lumen, Nanite or Virtual Shadow Maps, a Steam Deck device profile, a scripted benchmark with budgets, and a platform layer (saves, users, controllers, suspend) that prepares console work. Mobile code exists but is not built or verified yet, and no console has been tried.
24.1 Basics
24.1.1 What is supported, honestly
| Platform | Status |
|---|---|
| Windows PC (Win64) | Editor and packaged game. Built and tested. |
| Steam Deck | Played and checked: 1280 x 800, gamepad prompts for the device in use, readable text, a device profile. Not yet measured on real hardware for every scene. |
| Android and iOS | Not verified. The plugin's descriptor lists Win64 only, in SupportedTargetPlatforms and in every runtime module's PlatformAllowList. The mobile code (touch controls, phone UI, rendering profiles) is in the source and passes its PC-side tests, but no Android or iOS build has been compiled or run. The first Android build is blocked on the engine's Android target component not being installed on the test machine. |
| Consoles | Not built or certified. We have no console SDKs or devkits. The framework only prepares the ground (see below). |
If you need a platform that is not Win64, you change the descriptor yourself (steps below) and take on the verification.
24.1.2 Four things every project should do
- Pick the quality level on a real low-end machine, or in the editor with
RSE.Visual.DeckPreview 1(it applies the Steam Deck profile, the Low scalability level and a 1280 x 800 window). - Run the benchmark (
RSE.Perf.Benchmark) before you ship and keep the report. - Read the content budget warnings in Validate All Data. They point at meshes without LODs and textures that are too big.
- Switch off the systems you do not use (Project Settings → RPG Saga Engine → Features). A disabled system's subsystems are not created at all, so it costs nothing at run time.
24.1.3 Scalability and the low-end path
The player picks a quality level in Options → Quality: Low, Medium, High or Epic. On top of the engine's levels the framework supports a fallback path for weak hardware:
- no Lumen, no Nanite, no Virtual Shadow Maps (classic LODs, baked or simple lighting, cheap cascaded shadows);
- a cheap anti-aliasing method with an internal resolution scale;
- fewer particles, less foliage, a shorter view distance on Low;
- the visual styles (realistic, stylized, cel-shaded, low-poly retro) all work without the heavy features.
The Low level is meant to look like the Steam Deck. In your own project that means Low sets the resolution scale, the shadow quality, the texture quality, the effects and foliage quality to the Deck's values, so what you see on a PC at Low is what the Deck draws.
One trap: a setting written in Project Settings → Rendering has a higher priority than the scalability files. If you set Shadow Map Method to Virtual Shadow Maps there, Low and Medium cannot turn them off any more (the log says "Setting the console variable ... with 'SetByScalability' was ignored"). Leave it to the scalability levels.
24.2 How it works
24.2.1 Device profiles
Unreal picks a device profile by platform name only: a Windows build running through a compatibility layer on a Steam Deck is simply Windows. The framework therefore switches profile itself at game start, in URSEDeckProfileSubsystem (a game instance subsystem that runs in the game, not in the editor):
- It detects a Steam Deck from the
SteamDeck=1environment variable (Steam sets it), the-SteamDeckcommand-line switch, or Input → Devices → Simulate Steam Deck. - If Apply Deck Profile is on and the command line has not chosen another profile, it activates the profile named in Performance → Deck Device Profile (
SteamDeck, orSteamDeck_Linuxfor a native Linux build). - The player's saved quality levels are then applied over the profile's defaults, so Options → Quality still wins.
The profile holds two kinds of values. The sg.* quality groups are defaults (priority: scalability), so the player can change them. Everything else is a hard limit of the platform (priority: device profile): Nanite off, Lumen off, Virtual Shadow Maps off, motion blur off, and so on. They stay active whatever quality the player chooses.
The plugin does not ship the Deck profile. It lives in your project's Config/DefaultDeviceProfiles.ini. A working starting point is in Troubleshooting below. Without it the log says "Device profile 'SteamDeck' not found" and nothing changes.
On a PC you can force a profile for one run with -dp=SteamDeck.
24.2.2 The Steam Deck experience
- Input device.
URSEInputDeviceSubsystemfollows the last device used. A Deck starts on the gamepad. Key prompts show only the device in use, with the right button names. Gamepad label sets (a few styles) are chosen by the player in the options, else by the project, else automatically. - Left stick in menus. While a menu has focus, the left stick moves the cursor like a D-pad (settings under Input → Menu Stick).
- Text size. The project's DPI scaling rule works from the screen's short side, so text stays readable at 800p. The built-in screens never draw text smaller than UI Theme → Minimum Font Size.
- Resolutions and aspect ratios. Panels grow with their text up to a maximum, long text is clipped or wrapped, and fixed-size windows shrink as a whole on small screens instead of overflowing.
- First start. Once, if the player has no frame-rate limit, the framework sets Deck First Run Frame Rate Limit (40, the Deck's 40 Hz mode). The player changes it in the options.
24.2.3 Preview and benchmark
RSE.Visual.DeckPreview 1 shows the look and the relative cost (draw calls, triangles, memory) on your PC. It does not show the Deck's real frame rate, because a PC GPU is several times faster. RSE.Visual.DeckPreview 0 restores your settings.
RSE.Perf.Benchmark plays a scripted run and writes a report. It needs no input and takes about three minutes with the default steps. The steps are data (Performance → Benchmark Steps): open a map, run console commands, wait, capture (with an optional camera orbit), and capture a whole battle with a time limit. It measures every frame through the engine's performance system (frame, game thread, render thread, GPU, draw calls, triangles) and takes a memory snapshot at the end of each segment. The first second of each segment (Warmup Seconds) is not counted.
RSE.Perf.Benchmark current settings
RSE.Perf.Benchmark Deck preview the Steam Deck first
RSE.Perf.Benchmark Quit quit the game when finished
RSE.Perf.Benchmark Stop stop and write what was recorded
Definitions: average FPS is frames divided by time. 1% low is 1000 divided by the mean of the slowest 1% of frame times. A hitch is a frame longer than Hitch Frame Ms (a warning, not a failure). The report goes to Saved/Perf/<timestamp>/: report.csv (one row per segment with PASS or FAIL and the reasons), frames.csv and summary.html.
24.2.4 Performance budgets
Performance → Budget (FRSEPerfBudget) holds the limits a capture is checked against. A value of 0 means not checked. The defaults are the Steam Deck budget:
| Limit | Value |
|---|---|
| Average FPS | 30 or more |
| 1% low | 25 FPS or more |
| GPU time (average) | 17 ms or less |
| Draw calls (worst frame) | 1500 or less |
| Triangles (worst frame) | 2 million or less |
| Physical memory | 6 GB or less |
| Texture memory | 2 GB or less |
RSE.Perf.Budget <Tier> checks any capture of yours against another budget (Default goes back to the Deck budget).
Content budgets work at edit time. Project Settings → RPG Saga Engine → Content Budgets (URSEContentBudgetSettings, editor only) defines categories (for example Character, Boss, Prop) by folder or name token, each with a maximum triangle count, a minimum LOD count, material slots, texture size and, optionally, material instruction counts. Validate All Data warns about meshes, textures and materials over their category's budget.
24.2.5 Saves, users and the app lifecycle
These are the pieces that differ between platforms. They all go through one layer you can configure.
Save backend. Every save and load goes through URSESaveSubsystem, which turns the game into bytes and hands them to a backend. Pick it in Project Settings → RPG Saga Engine → Save → Backend:
| Backend | Use it for |
|---|---|
| File (default) | PC and Steam Deck. Our own files under Saved/SaveGames, with a checksum, a temporary file renamed over the slot and the last good save kept as a backup. Checks free disk space first (Min Free Disk Space MB). |
| Save Game System | Consoles, and any platform whose rules require the platform save API. Uses the engine's ISaveGameSystem. The bytes keep the checksum, so damage is detected everywhere. |
| Custom | A C++ class implementing IRSESaveBackend for cloud storage or a platform API the engine does not cover. |
Slots, autosaves, thumbnails, the load screen and the Blueprint nodes work the same on every backend. The save screens handle No Space, Corrupt (shown as damaged, never as empty, never half-loaded), User Signed Out, Busy and Failed. Every failed save fires On Save Failed with the reason. RSE.Save.SimulateFault makes the backend fail with NoSpace, Corrupt, SignedOut or Failed so you can see each message on PC.
Platform users. URSEPlatformUserSubsystem follows the engine's platform users. The title screen's "press start" makes the user of the pressing device the primary user (Platform → Select User On Press Start). Saves are per user: the default user keeps Saved/SaveGames, others get Saved/SaveGames/User<N>. When the primary user signs out, saving stops and the game returns to the title screen (Return To Title On Sign Out). Feed your own login flow with Report User Login Changed.
Controllers and suspend. URSEAppLifecycleSubsystem pauses the game and opens a reconnect screen when the primary user's controller disconnects (Pause On Controller Disconnect). On PC and handhelds, Allow Continue Without Controller lets the player dismiss it with Confirm from another device. The game also pauses while the app is in the background and finishes save writes in flight first (Save → Suspend Flush Timeout). Replace the reconnect screen with your own Widget Blueprint derived from RSE Screen Widget, reading RSE Reconnect View Model, in Platform → Reconnect Widget Class. Pauses go through the framework's time control, so in co-op one player's disconnect never pauses everyone.
Simulate all of it on PC: RSE.Platform.SimulateDisconnect, SimulateReconnect, SimulateSignOut, SimulateSignIn, SimulateSuspend, SimulateResume, and RSE.Platform.Dump.
24.2.6 Static checks that keep the plugin portable
The automation test RSE.Plugin.PlatformApis scans the plugin's runtime modules and fails on Windows-only APIs and headers, process or URL launches, direct file access outside the save backend, hardcoded absolute paths and keyboard-only key handling. Run it after you change the plugin's source.
24.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEPerformanceSettings | RSE | Performance: Deck profile names, first-run frame cap, preview resolution, benchmark steps, budget. |
URSEDeckProfileSubsystem | RSE | Switches to the Deck device profile at game start. |
URSEBenchmarkSubsystem | RSE | The scripted benchmark behind RSE.Perf.Benchmark. |
FRSEPerfBudget, RSEPerfStats | RSE / RSECore | A budget, and the math for averages, 1% low, percentiles and reports (headless). |
URSEContentBudgetSettings | RSEEditor | Edit-time content budgets. |
URSEInputDeviceSubsystem | RSE | Last used device, Deck detection, prompt style. |
URSEPlatformUserSubsystem, URSEAppLifecycleSubsystem | RSECore / RSE | Platform users, sign-in, controller and suspend handling. |
IRSESaveBackend | RSECore | Pluggable save storage. |
URSEMobileSettings, URSEMobileProfileSubsystem | RSE | Mobile tiers and tier selection (unverified, see below). |
URSETouchLayout, URSETouchInputSubsystem | RSE | Touch controls (unverified on devices). |
24.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Performance | Deck Device Profile, Deck Linux Device Profile, Apply Deck Profile, Deck First Run Frame Rate Limit, Deck Preview Resolution, Benchmark Steps, Budget, Warmup Seconds, Uncap Frame Rate, Map Load Timeout Seconds, Report Folder, Write Frame Csv, Quit When Unattended |
| Project Settings → RPG Saga Engine → Platform | Pause On Controller Disconnect, Allow Continue Without Controller, Select User On Press Start, Return To Title On Sign Out, Pause On Suspend, the reconnect screen texts |
| Project Settings → RPG Saga Engine → Save | Backend, Suspend Flush Timeout, Keep Backup, Min Free Disk Space MB, slot and autosave settings |
| Project Settings → RPG Saga Engine → Content Budgets | Categories and thresholds (editor only) |
| Project Settings → RPG Saga Engine → Features | Switch whole systems off |
| Project Settings → RPG Saga Engine → Input → Devices | Prompt device, Simulate Steam Deck, gamepad label set |
See Appendix B for every property and its default.
24.5 Blueprint usage
Most of this chapter is settings and console commands. The nodes you may reach for:
- Is Feature Enabled (RPG Saga|Features): hide a button in your own UI when a framework system is switched off.
- Report User Login Changed on the platform user subsystem: tell the framework your own online login changed.
- On Return To Title Requested on the app lifecycle subsystem: show a message before the game goes back to the title screen after a sign-out.
- On App Resumed on the platform user subsystem: open your pause menu when the app comes back.
- On Save Failed on the save subsystem: show the reason when a save fails.
- Is Using Touch on the input device subsystem: switch your own prompts when the player touches the screen.
Example: show a message when saving fails.
- Event BeginPlay → Get Game Instance → Get Subsystem (RSE Save Subsystem).
- Drag from the subsystem and bind On Save Failed.
- In the bound event, use the Result to pick a text and call your own message box.
24.6 C++ usage
A custom save backend, for a platform's cloud storage, is a UObject class that implements IRSESaveBackend:
UCLASS()
class UMyCloudSaveBackend : public UObject, public IRSESaveBackend
{
GENERATED_BODY()
public:
virtual FName GetBackendName() const override { return TEXT("MyCloud"); }
virtual ERSESaveBackendStatus WriteSlot(const FRSESaveUser& User, const FString& SlotName, const TArray<uint8>& Payload) override;
virtual ERSESaveBackendStatus ReadSlot(const FRSESaveUser& User, const FString& SlotName, TArray<uint8>& OutPayload) override;
virtual bool SlotExists(const FRSESaveUser& User, const FString& SlotName) override;
virtual bool DeleteSlot(const FRSESaveUser& User, const FString& SlotName) override;
virtual void GetSlotNames(const FRSESaveUser& User, TArray<FString>& OutSlots) override;
};
Set Save → Backend to Custom and pick the class in Custom Backend Class. The synchronous calls may run on worker threads, so the implementation must be thread-safe. Override WriteSlotAsync, ReadSlotAsync and Flush when the platform has its own asynchronous path. The save subsystem adds the checksum, the metadata and the screens' messages, so a backend only moves bytes.
Branch on the platform in your own code with the engine's usual macros and the framework's device queries (URSEInputDeviceSubsystem::IsSteamDeck()), not with Windows-only calls. Keep file access inside the save backend so the static check stays green.
24.7 Advanced
24.7.1 Mobile (not verified)
The mobile work is split in three parts. All of it is untested on a phone.
- Rendering. On Android (Vulkan) and iOS (Metal) the mobile forward renderer is used, with no Lumen, Nanite, Virtual Shadow Maps, distance fields or screen-space GI.
URSEMobileSettings(Mobile Rendering) defines three tiers (Low, Mid, High), each with a device profile per platform and a budget: for example High is 30 FPS, at most 600 draw calls, 400k visible triangles, one shadowed dynamic light and 1 GB of textures. The device profiles live inPlugins/RPGSagaEngine/Config/Mobile/and derive from the engine's own tier profiles. RPG Saga Engine → Advanced tools → World → Mobile → Apply Rendering Profiles (orRSE.Mobile.ApplyProfiles [DryRun]) merges them into your project without touching your own sections.URSEMobileProfileSubsystemapplies the tier at start on a device. - Materials.
RSE.Mobile.CheckMaterials [Android | iOS]compiles every plugin material for the mobile feature level and writes a report. The shipped result for Android is 32 materials, 30 compile. The two post-process passes of the cel-shaded and retro styles fall back to off on mobile, and the other style settings still apply. - Preview.
RSE.Mobile.Preview <Example | Arena | All> [Android | iOS] [Low | Mid | High]drives the editor's mobile preview and checks a capture against the tier's budget. First measurements show the starter example map over the High triangle budget (trim it before a phone build). - Touch controls and phone UI. Touch is a third input device with data-driven layouts (
URSETouchLayout, five ship in/RPGSagaEngine/Input/Touch), gestures, millimetre-based sizes, a 9 mm minimum target, safe areas and phone variants of the main screens. Try it on PC withRSE.Input.Touch.Emulate 1(mouse as a finger) andRSE.UI.Phone.Simulate 1. See User interface.
What is missing: a compiled Android or iOS build, real frame times, thermals, memory, tier detection on real GPUs, and the feel of every touch threshold. To try it in a working copy, add "Android" (and "IOS") to SupportedTargetPlatforms and to the PlatformAllowList of the runtime modules (RSECore, RSE, RSEOnline, RSENet, RSEGAS, RSEStateTree, RSECommonUI) in RPGSagaEngine.uplugin. Editor modules stay Win64. Install the engine's Android target component first (Epic Games Launcher, the engine's Options → Target Platforms), and keep SDK paths out of the project: they are machine settings. A phone build also needs Android or iOS project settings (arm64, Vulkan, ASTC textures, mobile forward shading). Treat the first result as a starting point and expect to fix things.
24.7.2 Consoles
The framework prepares what it can without an SDK: the save backends above, platform users, controller disconnect and suspend, gamepad-only play (verified screen by screen), an action bar through the optional Common UI plugin, and a static scan for non-portable code. What it did not do: build, run or certify on any console, safe-area checks on console hardware, platform glyph sets and strings, achievements and activities.
For a console release you need the platform SDK, the engine's platform extension and a devkit. Set Save → Backend to Save Game System (or your custom backend), feed sign-in changes from your platform login if the engine's event is not enough, add your platform's button glyphs and required strings, and run the platform holder's own certification checklist. The descriptor's PlatformAllowList must also list the platform.
24.7.3 Controller-only play
Every screen and flow was checked for use with a gamepad alone: focus on open, D-pad and stick navigation, confirm and back, tab switching with the shoulder buttons, scrolling, drag-and-drop alternatives and no dead ends. Three automated checks keep it true: RSE.UI.Navigation.* (drives each screen with synthetic gamepad key events), RSE.Input.GamepadCoverage (fails when an input action or a key list has no gamepad key) and RSE.CommonUI.ActionBarBindings (screens bind their actions for the Common UI action bar). The per-screen report is docs/product/controller-report.md.
24.7.4 Performance habits
- No Tick by default. Framework actors and components start with Tick off. Events, timers or a batching subsystem drive the logic. Keep your own code the same.
- Flat data for hot paths. The grid and pathfinding use contiguous arrays, not an actor per tile. Repeated visuals use instanced meshes.
- Soft references for heavy assets (meshes, animations, sounds, UI), loaded when needed.
- Debug code stays out of Shipping. The console commands in this chapter are not in Shipping builds.
- Give heavy meshes LODs. With Nanite off on the Deck, meshes draw their fallback or classic LODs.
24.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The game does not use the Steam Deck settings | The profile is missing from your project, so the log says "Device profile 'SteamDeck' not found". Add it to Config/DefaultDeviceProfiles.ini (example below). The Deck is detected from SteamDeck=1, -SteamDeck or Simulate Steam Deck. -dp=SteamDeck forces it from the start on any PC. |
| Text is too small on the Deck | Built-in screens never go below UI Theme → Minimum Font Size. In your own widgets use the theme fonts. |
| Meshes look blocky on the Deck | Nanite is off in the Deck profile, so meshes draw fallback or classic LODs. Give them LODs. The content budget warnings point at the worst offenders. |
| Low quality still shows Virtual Shadow Maps | Project Settings → Rendering → Shadow Map Method is set to Virtual Shadow Maps. It overrides scalability. Put it back to the default. |
| The Tactics grid is missing on a forward or mobile renderer | The default Grid Visual Mode is a decal that needs the deferred renderer. Set it to Tiles in Tactics Zone settings. |
| Saving fails on a disk that is nearly full | Min Free Disk Space MB. Free space or lower it. The previous save stays. |
| A save slot shows as damaged | The checksum failed and there is no readable backup. It is shown as damaged on purpose, never as empty. Keep Keep Backup on. |
| The reconnect screen never goes away on a handheld | Allow Continue Without Controller is off, so the prompt waits for a controller (console behaviour). |
| An Android or iOS build fails | The descriptor allows Win64 only. See the mobile steps above. |
A starting Steam Deck profile for your Config/DefaultDeviceProfiles.ini:
[DeviceProfiles]
+DeviceProfileNameAndTypes=SteamDeck,Windows
[SteamDeck DeviceProfile]
DeviceType=Windows
BaseProfileName=Windows
; default quality (the player's Options still win)
+CVars=sg.ResolutionQuality=70
+CVars=sg.ShadowQuality=0
+CVars=sg.PostProcessQuality=0
+CVars=sg.EffectsQuality=0
+CVars=sg.FoliageQuality=0
; hard limits of the Deck
+CVars=r.Nanite=0
+CVars=r.Lumen.DiffuseIndirect.Allow=0
+CVars=r.Lumen.Reflections.Allow=0
+CVars=r.Shadow.Virtual.Enable=0
+CVars=r.AntiAliasingMethod=4
+CVars=r.MotionBlurQuality=0
+CVars=RSE.Dialog.LivePortraits=0
24.9 See also
- User interface: UI styles, phone UI and touch controls.
- Save and load: slots, autosaves and the save screens.
- Co-op and online: sessions and hosting.
- Extending the plugin: the engineering rules behind the performance habits.
- Appendix B and Appendix C.
- Product pages:
docs/product/platforms.md,docs/product/mobile.md,docs/product/controller-report.md.
25. Localization
In short: RPG Saga Engine ships in English only. Every text goes through Unreal's localization system, so any language can be added. The Translate with AI tool exports the texts for an AI assistant, checks what comes back, merges the good translations and compiles the language. You add as many languages as you want, and the player picks one in the options.
25.1 Basics
25.1.1 What is covered
All text that goes through the plugin is localizable:
- The plugin's own texts: screens, menus, messages, the editor tools. They live in the plugin's localization target,
RPGSagaEngine(declared inRPGSagaEngine.uplugin). - The texts of your content: dialogs, quests, items, abilities, characters, documents, tutorials, bestiary entries, shops, zones and so on. They live in your project's localization target (usually called
Game).
Texts of your own systems outside the plugin use the same engine localization. The engine's Localization Dashboard still works for them.
The vocabulary of your game ("Party", "Magic", "Lv") comes from Game Terms (Project Settings → RPG Saga Engine → Game Terms), which the foundation writes. Translate the terms like any other text. A screen text of your own that should follow the terms uses the argument {Term.<Id>} (for example {Term.Party}) instead of a fixed word.
25.1.2 The workflow in one picture
Choose target + culture -> 1. Export for AI -> (paste into an AI chat) -> 2. Import -> 3. Compile
| Step | What happens | Where the files go |
|---|---|---|
| Gather | The engine's text gatherer collects every text of source and assets into the target's manifest and .po files. Once, and again after content changes. | Config/Localization/<Target>_Gather.ini |
| Export | The texts (by default only those without a translation) are written in chunks of AI size, with a ready prompt and a glossary of your content names. | Saved/Translate/<Target>/<culture>/ |
| Translate | You paste the prompt and then one chunk at a time into any AI chat and save each answer. | .../<culture>/Translated/ |
| Import | Every entry is validated. The good ones are merged into <culture>/<Target>.po. A readable report lists the rest. | .../<culture>/Report.md |
| Compile | The engine's import and compile steps turn the .po into .archive and .locres files the game loads. | Content/Localization/<Target>/<culture>/ |
25.1.3 Your first language, step by step
Open RPG Saga Studio (or the Configurator) and go to Tools → Content Import. Scroll to Languages (Translate with AI).
- Choose the target. The list holds your project's targets and the plugin's (
RPGSagaEngine). Your own target is the default. If your project has none, press Create target. It writes the four gather configs (Config/Localization/Game_Gather.iniand its Export, Import and Compile partners). The name, the source culture and the folders it gathers assets from are in Project Settings → RPG Saga Engine → Translate with AI. - Gather texts. The button collects the target's texts. It runs in a separate editor process because it loads your assets. Skip it for the plugin's own target: its English texts are already gathered.
- Type the culture code:
ro,de,fr,es,pt-BR,ja. - 1. Export for AI, then Open pack folder. The folder holds:
PROMPT.md: the instructions for the AI;Chunk_001.json,Chunk_002.json, and so on: the texts, a few thousand characters per file. Each entry has its id, the source text, where it is used, a length limit, the placeholders and the plural categories the language needs;Glossary.csv: the names of your content, so the AI uses them consistently;Pack.json: what the import checks the answers against;Translated/: where the answers go.
- Translate. In an AI chat that handles long text:
- paste
PROMPT.mdas the first message; - paste
Chunk_001.jsonas the second message. The answer is the same JSON with thetranslationfields filled in; - save the answer as
Translated/Chunk_001.json(code fences from the chat are ignored); - repeat for each chunk. Open a new chat, or paste the prompt again, if the assistant starts to drift or shorten.
- paste
- 2. Import. Leave Answers empty to read the
Translatedfolder, or pick files. The report shows every problem with its id and text. Validate only checks without writing anything. - Fix. With problems, open
Report.md. The entries that need another pass are inRetry.json. Paste it into the same chat with the prompt and import the new answer. Importing again is safe: good entries stay. - 3. Compile. The
.locresis written, and the culture is added to Project Settings → Packaging → Localizations to Package and to the options menu. Test it in the editor with the console commandRSE.Language ro.
Do the same once for the plugin's own target (RPGSagaEngine) to translate the built-in screens and messages. It is a separate target with its own culture folder, which the tool creates.
25.1.4 How the player picks a language
The game starts in the project's default language, English unless you change Options → Default Language. The player chooses a language in Options → Game → Language, or you pass -culture=xx on the command line. The list shows every culture compiled for any target (the plugin's, your project's, yours), each by its native name ("Français"). Project Settings → RPG Saga Engine → Options → Languages is an optional allow-list: empty means all compiled cultures. Switching language changes the plugin's texts and your content's texts together. The choice is saved with the other options.
25.2 How it works
25.2.1 The prompt
PROMPT.md is generated for your project and culture. In short it tells the AI:
- translate the texts of the target from the source culture into the culture, one chunk per request, with the same glossary and tone throughout;
- answer with only the same JSON,
translationfilled in for every entry, never dropping or adding entries; - keep every placeholder exactly:
{Name},{0}, markup such as<em>..</em>,<color=Name>and</>, and the dialog directives ({p=0.5},{speed=..}..{/speed},{cue=N}). The entry'splaceholderslist is the set that must appear; - rewrite plural blocks
{N}|plural(one=card,other=cards)with the target language's plural categories, always keepingotherand keeping{N}before|plural; - respect each entry's
maxLen, use the glossary names, never translate asset ids, and keep each dialog speaker's voice (the entry'scontextsays where the text is used); - leave the do-not-translate terms alone (
HP,MP,ATBby default) and use no terms from other games.
For a language that needs more plural forms (some need one, few, other, others one, few, many, other, Arabic needs six), the prompt and each entry say which categories are required, and the import rejects a text that lacks one.
25.2.2 What the import checks
| Check | Result |
|---|---|
| Placeholders and markup: the same set as the source (order may change) | error |
| Plural blocks: same count, same argument, every category the language needs | error if missing, warning if extra |
| Ids: an id the target does not have; two different answers for one id | warning (extra), error (duplicate) |
| Ids a chunk had to return and did not | error |
| Encoding: replacement characters, byte order marks, control characters, UTF-8 read as another encoding | error |
| Length: longer than the entry's limit | warning (a setting) |
| Looks untranslated: identical to a source with real words | warning (a setting) |
| Leading or trailing spaces that differ from the source | warning (a setting) |
| A do-not-translate term that disappeared | warning |
| Empty translation | warning, and the text stays untranslated |
What happens to entries with errors is the Invalid Policy setting:
- Skip Invalid Entries (default): good entries are merged, bad ones stay untranslated and are listed in the report and in
Retry.json; - Reject Import: one error stops the whole import and nothing is written (good for a CI gate);
- Keep Invalid Entries: everything is merged and the errors are only reported.
The compile step also rejects malformed {Argument} patterns, so a broken placeholder never reaches the game. The checks guard the structure, not the quality of the prose. Review the first chunks yourself or with a native speaker.
25.2.3 Formats
- JSON (default): one object per text with context. Best for AI chats.
- CSV: columns
id, source, context, maxLen, placeholders, plural, glossary, translation. Opens in a spreadsheet, for human translators. Fill thetranslationcolumn. - PO: the engine's
.polayout for each chunk, with the limit and placeholders as comments. The import readsmsgstr.
The import reads all three whatever the export format was.
25.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSETranslateSettings | RSEEditor | Project Settings → RPG Saga Engine → Translate with AI. All the options below. |
URSETranslateLibrary | RSEEditor | Blueprint and Python functions for every step. |
URSETranslateCommandlet | RSEEditor | The -run=RSETranslate command line for CI. |
RPGSagaEngine target | plugin | The plugin's own localization target (Config/Localization/RPGSagaEngine_*.ini). |
Game target | your project | Your content's target, made by Create target. |
| Game Terms | RSECore | The vocabulary used on every screen. |
There are no data assets to create. Translations are the engine's .po, .archive and .locres files.
25.4 Settings
Project Settings → RPG Saga Engine → Translate with AI (saved in Config/DefaultEditor.ini):
- Target: Target Name (empty means your project's first), New Target Name and New Target Native Culture for a created target, and the folders it gathers assets from.
- Export: output folder, Format (JSON, CSV or PO), only untranslated texts, Max Entries Per Chunk (120) and Max Chars Per Chunk (12000), the glossary and Max Glossary Terms In Prompt, Do Not Translate (
HP,MP,ATB), and whether dialog speakers are looked up in the assets. - Length: the limit is the source length times Max Length Factor (1.5), a smaller Short Text Factor (1.3) for short labels, and a few characters always allowed.
- Validation: the severity of each warning above, Invalid Policy, and the minimum number of letters before an identical text counts as untranslated.
- Compile: Register Culture adds the compiled culture to packaging and to the options menu.
At run time, Project Settings → RPG Saga Engine → Options has Default Language (en) and the Languages allow-list. See Appendix B for every property.
25.5 Blueprint usage
The translation steps are editor-only functions in RPG Saga Engine|Translate, meant for Editor Utility Blueprints and Python: Get Targets, Get Default Target, Create Target, Gather, Export For AI, Import From AI, Compile and Get Translated Fraction. Each returns a result with success, a summary and the error and warning counts.
An Editor Utility Widget that translates a language end to end:
- Add a text box for the culture and a button.
- On the button: Get Default Target → Export For AI (Target, Culture).
- After the answers are saved (a second button): Import From AI (Target, Culture, an empty file list, Validate Only false) → check Success → Compile.
- Show Get Translated Fraction as a progress bar.
In a running game, switch language with the engine's own nodes (for example Set Current Culture), or let the player use the options menu.
25.6 C++ usage
Use LOCTEXT or NSLOCTEXT for every player-facing string, and FText::Format with named arguments, so the gatherer finds them and translators can reorder words:
#define LOCTEXT_NAMESPACE "MyGame.Reputation"
FText Msg = FText::Format(LOCTEXT("Praised", "{Town} thinks highly of you. Standing: {Points}"),
FText::FromName(TownName), FText::AsNumber(Points));
#undef LOCTEXT_NAMESPACE
Never build sentences by joining strings. Use a plural block for counts, {N}|plural(one=card,other=cards). For the game's own vocabulary, format a pattern with RSEGameTerms::Format so {Term.<Id>} arguments are filled.
The same steps from the command line, for build machines:
UnrealEditor-Cmd Project.uproject -run=RSETranslate -List
UnrealEditor-Cmd Project.uproject -run=RSETranslate -Target=Game -Gather
UnrealEditor-Cmd Project.uproject -run=RSETranslate -Target=Game -Culture=ro -Export [-Format=json|csv|po] [-All] [-Out=<dir>]
UnrealEditor-Cmd Project.uproject -run=RSETranslate -Target=Game -Culture=ro -Import [-File=<file|dir>[+...]] [-ValidateOnly] [-Policy=reject|skip|keep]
UnrealEditor-Cmd Project.uproject -run=RSETranslate -Target=Game -Culture=ro -Compile
UnrealEditor-Cmd Project.uproject -run=RSETranslate -CreateTarget=Game -Native=en
Steps run in the order Gather, Export, Import, Compile. The exit code is 0 when no step reported an error (a validation error of an import counts), so a pipeline can run -Import -Policy=reject on a pull request that brings translations.
From Python:
import unreal
lib = unreal.RSETranslateLibrary
print(lib.get_targets())
lib.gather("Game")
r = lib.export_for_ai("Game", "ro") # r.folder, r.num_entries
r = lib.import_from_ai("Game", "ro", [], False) # [] = the Translated folder; True = validate only
print(r.summary, r.report_path)
r = lib.compile("Game", "ro")
25.7 Advanced
- Translate the plugin's target once per language. It holds the built-in screens and messages. If the plugin is installed in the engine (a Fab install), copy it into your project's
Pluginsfolder first, so the translation files are written inside your project and travel with it. - Re-export after content changes. Only new and changed texts are exported. A text whose source changed counts as untranslated again.
- Keep names consistent in a long game. Fill the Translation column of
Glossary.csvonce and paste the table at the top of each chat. - Long languages. A language with many plural forms or long words (German, Russian) may need a higher length factor.
- Human translators. Export CSV, give them the sheet, and import the same file back. The checks still run.
- A different AI pack. Content Import → Export AI pack also writes a plain Translate prompt for a
.pofile. For a real translation use the Languages page, which adds the chunking, the context, the length limits and the validation. - Voice and dialog labels. Dialog nodes keep stable labels, so translations and voice recordings stay attached when the script is edited later.
- CI gate. Run
-Import -Policy=rejectin your build so a broken translation never merges.
25.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The game shows English although I chose another language | The game starts in English until the player picks a language (or you pass -culture=xx). The list offers only cultures with a compiled translation. Packaged games need the culture in Packaging → Localizations to Package. In the editor, RSE.Language <culture> switches while you play. |
| Editor or menu texts are English only | The plugin ships in English. Translate its own target, RPGSagaEngine, with Translate with AI. |
| A screen shows the wrong word for "Party", "Magic" or "Lv" | The vocabulary comes from Game Terms. A screen text typed as a fixed word does not follow the terms. Use {Term.<Id>}. |
| The import refused my file | Read Report.md: each problem has its id and text. A missing placeholder or plural category is an error. Paste Retry.json into the chat and import the new answer. |
| The compile failed | A broken {Placeholder} pattern. Run the import with Validate only and fix the listed entries. |
| Gather finds nothing for my project | Run Create target first, and check the asset folders in Translate with AI → Target. Gather loads assets in a separate editor process. |
| The translation looks cut off | The text is longer than the entry's limit. Raise Max Length Factor, or shorten the text. The warning shows the limit. |
| Special characters look broken | The answer was saved with the wrong encoding. Save it as UTF-8. The import reports replacement characters and mis-read UTF-8 as errors. |
25.9 See also
- Editor tools: the AI workflow for content, and where Content Import lives.
- Story, dialog and quests: dialog text, speakers and labels.
- Game foundation and archetypes: Game Terms.
- User interface: the options menu.
- Product page:
docs/product/localization.md.
26. Editor tools
In short: you build a game with RPG Saga Engine in the editor, not in code. RPG Saga Studio is the front door, the Configurator holds every setting, the Create New wizards and visual editors make content, Content Import reads spreadsheets, and a set of testing tools (battle simulator, Balance My Campaign, test rooms, the battle launcher) keep the game honest. This chapter is the map of all of them.
26.1 Basics
26.1.1 The menu
The RPG Saga Engine menu in the editor's menu bar is short on purpose:
| Entry | What it opens |
|---|---|
| Studio | RPG Saga Studio, also a button on the level editor toolbar |
| Configurator | Every setting, grouped and searchable |
| Validate All Data | A check of every setting and data asset. Results go to the Message Log (RPG Saga Engine Validation) |
| Help | Guides and the documentation |
| Advanced tools | Every other tool, in sections: Project Setup, Content, World, Balance, Check and Help |
Some tools appear only where they apply. The Encounter Layout toolbar button shows when a Tactics zone or an ATB stage is selected. Populate Zone Here shows when you right-click something in the viewport. Character actions show on Character assets. To see everything everywhere, tick Show advanced tools everywhere in the Studio.
First step for almost any problem: run Validate All Data and read the Message Log. It names the asset that is wrong.
26.1.2 RPG Saga Studio
The Studio is the table of contents of your game. One window shows every step, organized in four layers from the bottom up:
| Layer | What it holds | Cards |
|---|---|---|
| 1. Game foundation | The rules everything builds on: names, stats, elements, battle modes. | Configure the foundation, Set up the project, Change the preset, All settings (the Configurator) |
| 2. Archetypes | Templates you make content from. | New class, New enemy type, New NPC type, Archetype library |
| 3. Content | What players meet. | New character, New enemy, New ability, New item, New dialog, New quest |
| 4. World | Where it all happens. | New battle zone, Populate a zone, Save point, Generate the map, New battle, New action battle |
A green First steps panel at the top lists nine steps for a new project and ticks them by itself as the project shows they are done: install the mannequin, choose a foundation, choose a UI style, play the starter slice, create a character, create a battle, scan an asset pack for interiors, translate with AI, and read the Getting Started guide.
Start at any layer. The starter set already fills the layers below.
Explanations. The switch in the Studio's top right corner sets how much help you see: Beginner (the default, a "Why it matters" panel on every page), Normal (tooltips and ? buttons) or Expert (bare fields). The help texts live in a data table (Studio → Help Table), so you can rewrite them for your team or translate them.
Your first character. Content → New character is a wizard of seven steps with a live 3D preview: who it is (Hero, Recruitable unit or Enemy), what to start from (an archetype is recommended), how it looks, which class, what it can do, where it appears, and a summary. Create stays disabled until every problem is fixed, and the reason is written at the bottom of the window. At the end press Test in battle: a notification shows the win rate of a few simulated battles, with a link to the full report. No level needed.
Archetypes. Content made from an archetype follows it: every field you did not change comes from the archetype. An inherited field is greyed with from archetype X, and a field you changed has Reset to archetype. When you save an archetype that content follows, a notification offers Review changes: an update list shows each asset and what would change, with your own values marked as kept. Nothing changes by itself.
Plugin templates. Everything shipped under /RPGSagaEngine is a template. The Studio never edits it in place, because a plugin update would replace your changes. Press Create a copy in the project and the copy goes next to your asset and your asset switches to it. The Studio's wizards always create assets in your project folders.
Character sheets and asset sheets. Double-clicking a Character, Ability, Item or Archetype opens a sheet: header, buttons (Test in battle, Add to party, Make recruitable, Make enemy), tabs, Simple / Advanced, and a ? by each field. Right-click an asset for RPG Saga: Open Sheet or RPG Saga: Open Generic Editor. The generic editor is always there.
26.1.3 The Configurator
One window with every setting of the framework. It replaces navigating the Project Settings sections one by one.
- Top bar: each map in Test Maps has Open and Play buttons (Play starts a Play In Editor session without changing the edited level).
- Left tree: Settings groups every settings class by domain. Rules Profiles lists the profile assets, with their inheritance (for example Default, then Boss). Tools holds the Battle Simulator, Content Import, the Progression Designer and other tools.
- Right panel: the selected section's details. Changes are written to the config file at once, like Project Settings. Reset section to defaults and Open in Project Settings are here too.
- Bottom: validation. It runs
IsDataValidon every settings section and rules profile, and optionally on every data asset. Click a problem to jump to its row.
A rules profile is a data asset that overrides some rules (battle, grid, AI and so on) for one zone, battle or boss, or for the whole game. Create one with New profile, add overrides section by section, and set a default. A profile with a parent inherits everything it does not override.
26.1.4 Create New wizards
A wizard is a short form that makes a valid, ready-to-use data asset in your project. Open one from the Content Browser (right-click a folder, RPG Saga, then the type), from Advanced tools → Create New, or from Configurator → Tools → Create New.
| Wizard | Creates | You choose |
|---|---|---|
| Class | A character class | an existing class tag or a new one, allowed equipment |
| Character | A party character or an enemy | kind, class, starting level |
| Ability | A battle ability, from a template (melee strike, area spell, heal, buff, debuff, summon, knockback, drain, ground zone, multi-hit, chain, dash, shield, taunt, teleport, revive) | element, power, cost, range |
| Item | A consumable, equipment piece or key item | description, price, slot and type |
| Encounter | A battle | battle mode, enemies, level mode, flee |
| Quest | A quest | category, first stage and objective, success text |
| Dialog | A dialog | presentation, speaker, first line |
| Shop | A shop | greeting, stock, whether it buys |
| Pact | A Pact (summon) | description, summoned unit, summon ability |
The name is the asset's id (letters, digits, underscores). The folder is proposed from Content Import → Types, so wizards and the importer agree on where content lives. New assets can only go into your project's content, not the engine or the plugin. Create checks the asset with the same validation as saving, and if anything fails nothing is left behind.
26.1.5 New RPG Project
Advanced tools → New RPG Project... (or the Studio card Set up the project) prepares a project in one step. You choose a content root, a genre preset (JRPG with ATB, turn-based by rounds, turn-based timeline, Tactics only, or Hybrid), a UI theme and visual style, game modes and input contexts, languages, the maps to create, a starter party and optional starter content, and whether to install the mannequin kit. The right side shows the plan: every asset it will create and every setting it will change. Apply creates the starter party, a dialog, battles, a main menu map and a first map, then writes the project settings into your Config/Default*.ini files. Nothing is written into the plugin.
26.1.6 Visual dialog and quest editors
Double-click a Dialog or Quest asset.
- Dialog editor. A graph with a green Dialog Start node. Right-click to add a Line, Choice, Branch, Effect, Cue, Jump or End. Drag from a pin into empty space to add a connected node. Find searches ids, lines and speakers. Issues lists every validation problem. Auto Layout arranges the graph. Import Script / Export Script use the screenplay format of the content pipeline. Play from Here plays the dialog in Play In Editor from the selected node.
- Quest editor. Quest Start, Stage nodes with objectives, and Outcome nodes (success green, failure red). Each transition is an output pin labelled with its conditions. A stage with no transitions continues to the next stage in the list. Right-click a stage for Make Start Stage. Import JSON / Export JSON read and write the quest as a content row.
Node positions and comments are saved as editor-only data. They never change how the dialog plays and are not in cooked builds.
26.1.7 Character actions
Three one-click actions on a Character asset, from its right-click menu (RPG Saga: Character Actions), the sheet or the generic editor:
| Action | What it does |
|---|---|
| Add to Starting Party | The character joins when a new game starts. Running it twice changes nothing. |
| Make Recruitable | Creates a short "Join us?" dialog, a story flag and an NPC in front of the camera. |
| Make Enemy | Creates an encounter with a small group of the character, and places a spawner or a battle zone with its trigger. |
Undo removes what was placed in the level. A second run makes new assets with a free name and never overwrites yours.
26.2 How it works
26.2.1 Content Import: spreadsheets in, data assets out
Write content in spreadsheets (CSV) or JSON, and import it. The pipeline creates or updates the data assets, never deletes anything, and an export followed by an import changes nothing.
Open Configurator → Tools → Content Import:
- Choose the Sources: a folder, or files separated by
;. - Press Dry run. The report lists every asset that would be created or updated, field by field, and every problem with its file, line and column.
- Fix the sheets, and run the dry run again until it shows no errors.
- Press Apply and confirm.
File rules: one sheet per type, named after the type (Abilities.csv, Classes.csv); UTF-8; the separator is detected from the first row; the first row is the header and the Id column is required; lines starting with # are comments; long lists go in child sheets (Classes.Abilities.csv, Shops.Stock.csv, Encounters.Enemies.csv, Quests.Stages.csv). Dialogs are written as screenplays (<Id>.dialog.txt). Export, Write templates and Write example produce a starting point.
The same from the command line, for example in a build pipeline:
UnrealEditor-Cmd MyGame.uproject -run=RSEContentImport -Source=<folder> -DryRun
UnrealEditor-Cmd MyGame.uproject -run=RSEContentImport -Source=<folder>
UnrealEditor-Cmd MyGame.uproject -run=RSEContentImport -Export=<folder> [-Format=csv|json|bundle]
The exit code is 0 only with no errors.
26.2.2 The AI workflow
Because all content is data, an AI assistant can write it. Export AI pack writes, from your project, one folder per content type with a PROMPT.md (the task, the exact output format, every column, the valid values from your project, your balance ranges, real examples and a self-check list), an empty template CSV and a strict JSON schema. Four extra packs cover Translate, Balance, Campaign and Logic review.
- Export AI pack, then Open AI pack folder.
- Open
Abilities/PROMPT.md, write your request under Your request, paste the whole prompt into an AI chat. - Save the answer as
Abilities.csvin an empty folder. (Several sheets in one answer are separated by=== FILE: Quests.csvlines; save it as one.txtfile.) - Dry run, read the report, fix with Copy fix prompt if needed (it lists the errors and quotes the bad rows), then Apply.
Nothing reaches your project until you press Apply. New gameplay tags are allowed only under the roots in New Tag Roots (story flags, class, status and so on). Elsewhere an unknown tag stays an error, because those tags mean something to the engine. See Localization for the Translate pack.
26.2.3 Battle simulator
The battle simulator plays battles with no graphics and no level, AI against AI, in a fraction of a second. Test in battle on a sheet, the Estimated difficulty step of New battle and How hard is it? in New enemy all use it. It is also in Configurator → Tools → Battle Simulator, and from the command line: -run=RSEBattleSim -Scenario=<file.json> [-Out=<dir>] [-Runs=N].
26.2.4 Encounter Layout and the Gallery map
Select a Tactics Zone (with a baked grid) or an ATB Stage, then press the Encounter Layout toolbar button. The mode lets you add enemies from a palette, move them, paint deployment tiles and drop field objects directly in the level, with an Issues list that checks the layout after every edit. Keys: E / Q rotate, Delete removes, R moves an enemy to the other row, Esc returns to Select, Ctrl+Z / Ctrl+Y undo and redo (a whole brush stroke is one step). For Action encounters the mode draws the combat area around the encounter trigger.
Drag a Character asset into a level to get a Character Preview: its look, idle animation, and its class, stats at a preview level and abilities in Details. Convert to NPC turns it into a talkable NPC.
A Gallery map shows everything your project contains, row by row. The plugin does not ship one. Build your own with unreal.RSEGalleryBuilder.build_gallery_map("/Game/MyGame/Maps/L_Gallery") or the Build Gallery Map Editor Utility function.
26.2.5 Balance My Campaign
Checks a whole campaign's difficulty in one click. It plays every encounter of every progression zone with the simulator, flags what is off, proposes the smallest data changes that fix it, verifies each proposal, and applies the ones you tick as one undoable step.
- You need a campaign asset (
RSECampaignProgressionData, the one the Progression Designer uses): zones in order, each with its encounter pool and key encounters, target levels, and the standard party. Optional Alternative Parties test other compositions. - Advanced tools → Balance My Campaign... → pick the campaign → Run.
- Read the flags and the proposals, tick the ones you want, press Apply selected. Save the changed assets when you are happy. Edit → Undo reverts the whole apply.
What it flags: too easy or too hard (win rate outside the band of the encounter's kind: normal, elite, key, boss, ultra), too long or too short, timeouts (stalemates), one-shots, ability cliffs (an enemy class learns an ability inside a zone's level range), class outliers, and boring or grindy zones. It never touches assets with Balance Locked ticked, the party's own characters, enemies shared with encounters outside the campaign, or classes outside the standard set, unless you allow it. The same data, options and seed always give the same result. Every run writes Saved/Balance/<date-time>_<campaign>/report.md and report.json. Bands and step sizes are in Project Settings → RPG Saga Engine → Balance.
From the command line:
UnrealEditor-Cmd MyGame.uproject -run=RSEBalanceCampaign -Campaign=/Game/MyRPG/Data/Progression/DA_Campaign_Main
[-Analyze] [-NoIterate] [-Iterations=3] [-Runs=40] [-Seed=6800] [-Apply] [-FailOnFlags]
-FailOnFlags exits with code 2 while the standard party still has flags: a gate for "the campaign stays balanced".
26.2.6 Test rooms and the battle launcher
A test room is a small map that exercises one area of the framework, with a smoke test that plays it and fails when something does not happen. Rooms are data assets of type RSE Test Room Definition (DA_Room_<Name>): Room Id, Map, Description, Smoke Script, Timeout Seconds, Presets and Needs Network. The plugin ships rooms for interactions, traversal, interiors and the Action arena, under /RPGSagaEngine/Examples/TestRooms.
- Open one: Advanced tools → World → Test Rooms (Open or Open + Play), or in play
RSE.Rooms.Go <RoomId>andRSE.Rooms.List. - Run the tests: in Session Frontend → Automation, run
RSE.Rooms(one test per room) orRSE.Rooms.Definitions. - Smoke scripts: one line each. A line is a console command or
wait <seconds>,waituntil <state> [timeout],assert <state>,assertnot <state>,shot <name>. States includebattle,exploration,results,dialog,scene,ready,freebattle,playerturn,action,insideandoutside. Run a script by hand withRSE.Dev.Script <file>(no spaces in the path). - Make your own room: build a small level, create an RSE Test Room Definition named
DA_Room_<Name>, fill the fields, runRSE.Rooms.<Name>. Write the script by playing: every console command you type is a script line.
The battle launcher (F10 in a running game, or RSE.Rooms.Launcher) starts any encounter in any mode with a chosen party, rules profile, AI intelligence and seed, with Restart same seed, Restart new seed and Auto-play. It is a development tool and is not in Shipping builds. In Blueprint use Start Battle, Restart Battle and Set Auto Play on the RSE Battle Launcher Subsystem.
26.2.7 The controller report
docs/product/controller-report.md is a screen-by-screen audit of gamepad-only play: front end, menus, battle modes, exploration. Each screen is marked Pass (test), Pass (review), Fixed or By design. It is kept true by automated tests (RSE.UI.Navigation.*, RSE.Input.GamepadCoverage, RSE.CommonUI.ActionBarBindings). Use it as a checklist when you add a screen of your own: focus on open, D-pad and stick navigation, confirm, back, tab switching, scrolling, and no pointer-only actions. See Platforms and performance.
26.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEStudioSettings | RSEEditor | Studio: help table, Learn links, recent assets, template checks, test battle, role fields, preview, difficulty estimate |
URSEWizardSettings | RSEEditor | Wizards: the templates every wizard starts from, default teams and enemies, genre and theme presets |
URSEContentImportSettings | RSEEditor | Content Import: folder of each content type, new tag roots, new tag source, forbidden terms, AI pack folder |
URSECharacterActionsSettings | RSEEditor | Character Actions: starting party limit, placement, the recruit story flag, default dialog lines |
URSEGraphEditorSettings | RSEEditor | Visual Editors: layout spacing, node colors, Play from Here delay |
URSELevelToolsSettings | RSEEditor | Level Tools: Encounter Layout keys, Gallery |
URSEBalanceSettings | RSECore | Balance: bands, party levels, turn bands, step sizes, iterations |
URSEBalanceLibrary | RSEEditor | Balance Campaign, Analyze Campaign, Apply Balance Changes, Get Balance Summary, Write Balance Report |
URSETestRoomDefinition | RSECore | A test room: map plus smoke script |
URSEBattleLauncherSubsystem | RSE | The battle launcher |
URSERulesProfile | RSECore | A rules profile asset |
URSECampaignProgressionData | RSECore | A campaign: zones, encounters, target levels and the standard party |
Commandlets in RSEEditor: RSEContentImport, RSEBalanceCampaign, RSEBattleSim, RSETranslate, RSENewProject, RSEMapGenerate, RSEWorldTools, RSEPortraitStudio, RSECharacterPack, RSEKitScan, RSECinematic and the progression commandlet. End a command line with QUIT_EDITOR when using -ExecCmds.
26.4 Settings
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Studio | help table, Learn links, recent assets, plugin template checks, the test battle, enemy-only class tags, Role Fields, the Preview, the difficulty estimate, the archetype save prompt |
| Editor Preferences → Plugins → RPG Saga Studio (per user) | explanation level, open at startup, show advanced tools everywhere, sheets on double click, Simple / Advanced |
| Project Settings → RPG Saga Engine → Wizards | wizard templates, ability template list, default teams and enemies, first-stage ids of a new quest, default shop stock, genre and theme presets |
| Project Settings → RPG Saga Engine → Content Import | Types (folders), New Tag Roots, New Tag Source, Forbidden Terms, the AI pack folder |
| Project Settings → RPG Saga Engine → Character Actions | starting party limit, placement distance, Outliner folders, the story flag parent tag, recruit dialog lines |
| Project Settings → RPG Saga Engine → Visual Editors | layout, node colors, previews, validation while editing |
| Project Settings → RPG Saga Engine → Level Tools | Encounter Layout keys, Gallery content root and spacing |
| Project Settings → RPG Saga Engine → Balance | win-rate bands, party levels, turn bands, battles per scenario, seed, step sizes |
See Appendix B for every property and default.
26.5 Blueprint usage
The editor tools are also nodes, for Editor Utility Blueprints and Python. Categories under RPG Saga:
- Character Actions (RPG Saga|Character Actions): the three actions above.
- Balance (RPG Saga|Balance): Balance Campaign, Analyze Campaign, Apply Balance Changes, Get Balance Summary, Write Balance Report.
- Encounter Layout (RPG Saga|Encounter Layout): Move Enemy, Add Enemy, Paint Deployment, Validate and more.
- Translate (RPG Saga Engine|Translate): see Localization.
Example: balance every night from an Editor Utility Blueprint.
- Get Asset the campaign and make an RSE Balance Options struct (tick Iterate).
- Analyze Campaign (Campaign, Options) → keep the RSE Balance Result.
- Get Balance Summary → print it.
- Write Balance Report (Result, an empty directory uses the default folder).
The same in Python:
import unreal
campaign = unreal.load_asset('/Game/MyRPG/Data/Progression/DA_Campaign_Main')
options = unreal.RSEBalanceOptions()
options.iterate = True
result = unreal.RSEBalanceLibrary.balance_campaign(campaign, options)
print(unreal.RSEBalanceLibrary.get_balance_summary(result))
unreal.RSEBalanceLibrary.apply_balance_changes(result) # one undoable transaction
These calls block until the run ends. The window runs the same job in small time slices, so the editor stays usable.
26.6 C++ usage
Editor code lives in RSEEditor, which depends on RSECore and RSE. To add your own tool, put a module of type Editor in your project, depend on RSEEditor only if you need its helpers, and register your own menu entries with the engine's UToolMenus. A new settings class appears in the Configurator without further work:
UCLASS(Config = Game, DefaultConfig, meta = (DisplayName = "My System"))
class UMySystemSettings : public URSEDeveloperSettings
{
GENERATED_BODY()
public:
UPROPERTY(Config, EditAnywhere, meta = (ClampMin = "0")) float Radius = 500.f;
#if WITH_EDITOR
virtual EDataValidationResult IsDataValid(FDataValidationContext& Context) const override;
#endif
};
The class comment becomes the description in the Configurator. Until you put the class in a group (Project Settings → Editor → RPG Saga Engine Configurator → Groups) it sits under Other. The test RSE.Editor.Configurator.EveryClassHasGroup fails for a class with no group. See Extending the plugin.
26.7 Advanced
- Studio commands for scripts.
RSE.Studio.ExportTemplateManifestwrites the list of shipped data assets that Validate All Data compares against.RSE.Studio.Screenshot <Hub|NewCharacter|Sheet|AssetSheet|Page|PropagationDemo> <File.png> [...]renders a Studio page to a picture without a window (needs a renderer:-RenderOffscreen, not-nullrhi). The file path must not contain spaces.-NoRSEStudiokeeps the Studio closed at startup. - Quiet automation. The Studio never opens by itself when the editor runs unattended, in a commandlet or in automation.
- Commandlet rendering. Generate Map and the Portrait & Icon Studio render the level, so from the command line add
-AllowCommandletRenderingand do not use-nullrhi. - CI recipe. In a nightly build:
-run=RSEContentImport -Source=... -DryRun(content),-run=RSEBalanceCampaign ... -FailOnFlags(balance),-run=RSETranslate ... -Import -Policy=reject(translations), and the automation tests (RSE.*). - Point wizards at your own templates (Wizards) once you have a style, so every new class, ability or item starts from it.
- Use Play from Here constantly while writing dialogs. It starts the conversation at the selected node.
26.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The Studio does not open at startup | Don't show at startup is ticked, or the editor was started with -NoRSEStudio. Open it from RPG Saga Engine → Studio. |
| A tool is missing from the menu | It moved to Advanced tools or shows only in context. Tick Show advanced tools everywhere. |
| Create stays disabled | The reason is written at the bottom of the wizard: usually a missing or taken name, or a folder inside the plugin. |
| A field is read-only on a sheet | It belongs to a plugin template. Press Create a copy in the project. |
| World cards do nothing | They work on the open level. Open or create a level first. |
| "Folder is not scanned by the Asset Manager" | Tick Register folder with the Asset Manager, or add the folder in Project Settings → Asset Manager. |
| "Starting party is full" | Choose Instead of a starting hero, raise Starting Reserve Places, or remove someone from Party → Starting Members. |
| The Encounter Layout button is missing | It shows only while a Tactics Zone or ATB Stage is selected. Use the menu entry, or show advanced tools everywhere. |
| "Zone without a baked grid" | Select the Tactics Zone and press Bake Grid. |
| The dry run shows an unknown tag error | The tag is outside New Tag Roots. Add it in your foundation or Project Settings first, or use one of the listed values. |
| The AI answer has explanations around the table | Only the file content is read. Delete the extra lines, or paste Copy fix prompt back into the chat. |
| Balance proposes nothing for an enemy | It is shared with encounters outside the campaign or with the party's classes. Allow shared content, or make a separate enemy. |
| Win rates differ from playing | The rates come from AI-versus-AI battles without the player's items. Treat the bands as relative targets. |
26.9 See also
- Introduction and Installation and your first project.
- Core concepts: validation, the Configurator and settings.
- Characters and party, Abilities and statuses, Battle fundamentals: what the wizards create.
- World building: world tools and test rooms in context.
- Localization: Translate with AI.
- Extending the plugin.
- Product pages:
docs/product/studio.md,docs/product/editors-and-wizards.md,docs/product/encounter-editor.md,docs/product/balance-tool.md,docs/product/ai-workflow.md,docs/product/test-rooms.md,docs/product/controller-report.md.
27. Extending the plugin
In short: most extensions need no C++. Conditions, effects, ability effects, AI scorers, interactable objects, menu entries, screens and command handlers can all be written in Blueprint and show up in the editor's lists. When you do write C++, follow the plugin's rules: logic in a module with no presentation, content in data assets, rules in settings, state that can be saved and replicated.
27.1 Basics
27.1.1 Pick the lightest tool
Work down this list and stop at the first one that does the job.
- Data. A new ability, item, enemy, quest or dialog is a data asset, a spreadsheet row or a Studio wizard. See Editor tools.
- A setting or a rules profile. A different number or rule for one zone or boss is a setting override in a rules profile, not code.
- A Blueprint extension class. A condition, effect, scorer, reaction, interactable, menu entry, screen or command handler written as a Blueprint class. It appears in the same dropdowns as the built-in ones.
- A C++ subclass of the same extension classes, when you need speed or access the Blueprint graph cannot give.
- A new system in your own module, built the plugin way (below).
- A change to the plugin's source, only for things like a new battle mode. It is a bigger commitment, because you then own the merge with every update.
27.1.2 The Blueprint-only workflow
This is the step list for a condition. The other extension classes work the same way.
A condition: "it is night".
- In the Content Browser: Add → Blueprint Class → All Classes, search for
RSECondition_Custom(its display name is Custom (Blueprint), which every custom base shares, so search by the class name), and name itBP_Condition_IsNight. - Open it. In Class Defaults, set Label to
Is night(it shows in logs and debug tools). - In My Blueprint → Functions → Override, choose Is Condition Met. The
Contextinput is a handle to the game state. - Build the graph: Context → Is Flag Set (Context) (the flag, for example your own
Narrative.Flag.Night) → Return Node. The Context nodes live under RPG Saga|Narrative|Context. - Compile and save. The condition does not change the game: it must only read.
- In any conditions list (a dialog branch, a quest transition, a puzzle, an interaction, a shop) click +, and pick Custom (Blueprint), then your class. It now behaves like a built-in condition.
An effect: "heal the party and play a sound".
- Add → Blueprint Class → All Classes, search for
RSEWorldEffect_Custom, and name itBP_Effect_HealParty. - Add editable variables (Instance Editable) for the numbers, so designers tune them on the instance.
- Override On Execute. Use the Context nodes (for example Modify Member Resource (Context)) so the change is reported to quests and the HUD, like built-in effects.
- List it in any effects list. It runs in order with the others, and the Only If gate works.
A command handler (co-op ready). See Co-op and online: a child of RSE Command Handler, a Command Type, and the class listed in Project Settings → RPG Saga Engine → Commands → Handler Classes.
An interactable: a lever. A Blueprint child of RSE Interactable Actor with On Interact is interactable even without data. In it, flip a story flag, play a sound and refresh the door it controls.
A menu entry. A Blueprint child of RSE Menu Extension: set Id, Point, Label, Order, implement Is Visible, Is Enabled and Execute (which returns what the menu does next), and list the class in Game Flow → Menu Extensions.
A screen. A Widget Blueprint derived from RSE Screen Widget that reads the screen's view model. Set it in the settings of that screen. See User interface.
27.2 How it works
27.2.1 The module layers
The plugin separates logic from presentation with modules, and the compiler enforces it.
| Module | Type | Holds | May depend on |
|---|---|---|---|
RSECore | Runtime | Data, tags, settings, state, and the rules and simulation: battle (all modes), grid, pathfinding, abilities, items, AI, conditions and effects, narrative state, save structures. No actors, visual components, rendering, UI or input. | engine base modules, GameplayTags |
RSE | Runtime | Presentation and world: actors, pawns, camera, input, debug drawing, UI, exploration, save and load orchestration | RSECore |
RSEOnline | Runtime | Sessions and the lobby | RSECore, RSE |
RSENet | Runtime | The co-op transport | RSECore, RSE, RSEOnline |
RSEEditor | Editor | Tools, wizards, importers, visual editors, extra validation | RSECore, RSE |
RSEGAS, RSEGASEditor | Runtime, Editor | Optional bridge: Gameplay Ability System characters in battles | the above |
RSEStateTree, RSEStateTreeEditor | Runtime, Editor | Optional bridge: StateTree nodes for the utility AI | the above |
RSECommonUI | Runtime | Optional Common UI host for the screens | the above |
The rules that follow from this:
RSECorenever includes anything fromRSE,RSEOnline,RSENetorRSEEditor. It talks to presentation through events (delegates).- Any new logic goes into the logic layer by default. Only what needs the world, actors or rendering goes in the presentation layer.
- The plugin never depends on your game module or on
/Gamecontent. Your game depends on the plugin. - Battle logic can run headless, with no rendering, which is how the simulator, Balance My Campaign and the tests work. Presentation listens to events and reads state through
IRSEBattleView. It never changes a battle directly.
In your own project, add RSECore and RSE to your game module's PublicDependencyModuleNames. Add RSEEditor only for Target.bBuildEditor code, and RSENet or RSEOnline only if you use their types.
27.2.2 The extension points
| Base class | Module | Override | Where it shows up |
|---|---|---|---|
URSECondition_Custom | RSECore | Is Condition Met | every Conditions list: dialog, quests, puzzles, interactions, tutorials, shops |
URSEWorldEffect_Custom | RSECore | On Execute | every Effects list, in order with the built-in effects |
URSEEffect_Custom | RSECore | On Apply, Preview Damage | effects of abilities. Preview Damage is read by the forecast and the AI |
URSEBattleCue_Custom | RSE | On Cue Start / Update / Stop | presentation timelines |
URSEAICondition | RSECore | Is Met | rules and phases of AI profiles |
URSEAIScorer | RSECore | Score | added to the score of every ability option, weighted |
URSEAbilityReaction, URSEPassiveModifier | RSECore | Can Trigger, Is Active For | reactions and passives |
ARSEInteractableActor | RSE | On Interact, Can Interact (Custom) | custom interactions in the world |
URSECommandHandler | RSECore | Validate, Apply | the command bus |
URSEMenuExtension | RSE | Is Visible, Is Enabled, Execute | main and in-game menus |
URSEScreenWidget + URSEScreenViewModel | RSE | the screen | any framework screen |
URSESessionProvider | RSEOnline | host, find, join, leave | online services |
URSEPlayerProvider, URSEAuthorityPolicy | RSE | players, authority | who plays, and when co-op rules apply |
IRSESaveBackend | RSECore | slot read and write | where saves are stored |
URSEDeveloperSettings | RSECore | your settings class | Project Settings → RPG Saga Engine and the Configurator |
The base classes are Abstract, Blueprintable, EditInlineNew, so a Blueprint or C++ subclass appears by itself in the dropdowns of instanced objects. Effects and conditions you write are deterministic and read-only where documented: use the battle's Roll Int and Roll Percent nodes instead of random nodes, so a battle replays the same from its seed.
A policy class, such as the leash, the group travel rule or the co-op encounter conversion, is the same idea: the setting holds a class, and you replace it with your own.
27.2.3 The engineering standards
These are the rules every piece of the plugin follows. Follow them in your own systems and your project stays easy to extend, test and ship.
| Rule | In practice |
|---|---|
| No hardcoded tunables | Content goes in data assets and tables. Global rules go in a settings class (Project Settings → RPG Saga Engine). Debug switches are console variables named RSE.*. Only mathematical or logical invariants stay in code. |
| Data assets are Primary Data Assets | Derive from URSEPrimaryDataAsset. Its PrimaryAssetId is the stable id that saves and runtime state refer to. |
| Validate in the editor | Override IsDataValid (call Super), so mistakes show on save, not in play. Settings classes validate too. |
| Soft references for heavy assets | Meshes, animations, sounds and UI are TSoftObjectPtr or TSoftClassPtr, loaded when needed. |
| Ids, not pointers, in state | Runtime state refers to content by tag or FPrimaryAssetId. |
| No Tick by default | Actors and components start with Tick off. Use events, timers or a subsystem that processes a batch. |
| Flat hot data | Grids and pathfinding use contiguous arrays, not an actor per tile. Repeated visuals use instanced meshes. |
| Serializable state | Runtime state that must be saved is a plain USTRUCT with SaveGame properties, separate from actors. |
| Control from the editor | Settings are editable in Project Settings. Test actors have CallInEditor buttons and live properties. |
| Logs and CVars per domain | A log category per domain (LogRSEGrid, LogRSEBattle) and RSE.<Domain>.* CVars. |
| Rules profiles | A gameplay rule lives in a profile-able settings class and is read with RSERules::Get<T>(Profile) or URSEBattle::GetRules<T>(), never with GetDefault<T>() in rule code. |
| Tests | Automation tests named RSE.<Domain>.<Test> for logic, runnable from the Session Frontend and the command line. |
| Blueprint access | Every public API is exposed (BlueprintCallable, BlueprintPure, events, BlueprintType structs). Extension points are Blueprintable with BlueprintNativeEvent. A system is not done until it can be used and extended without C++. |
| No copyright or trademark problems | Every source file has the copyright header. Nothing names other games or companies. Every shipped asset has a licence that allows redistribution. |
27.3 Key classes and assets
| Class / asset | Module | Role |
|---|---|---|
URSEPrimaryDataAsset | RSECore | Base of all content definitions: display name, dev notes, balance lock, archetype link, validation |
URSEDeveloperSettings | RSECore | Base of every settings class. IsProfileSection() makes a class overridable by a rules profile |
URSERulesProfile | RSECore | A rules profile asset |
RSERules::Get<T>(Profile) | RSECore | Read a profile-able setting |
URSEFeatureSettings, RSEFeatures::IsEnabled, RSE_FEATURE_GATE(...) | RSECore | Feature toggles and the macro that stops a subsystem from being created while its feature is off |
URSESaveSubsystem, RegisterStruct<T> | RSECore | Register your system's state as a save section |
URSECommandSubsystem, FRSECommand, URSECommandHandler | RSECore | The command bus |
URSESeedSource | RSECore | Deterministic seeds by named stream |
RSEGameplayTags | RSECore | Native tags, for tags that C++ reads directly |
URSEBattle, IRSEBattleView | RSECore | The headless battle and the read-only view presentation uses |
ARSETacticsBattleDirector, ARSEATBBattleDirector, ARSEFreeTacticsDirector, ARSEActionBattleDirector | RSE | The actor that runs one battle in each mode (presentation, camera, input) |
27.4 Settings
The settings that matter when extending:
| Where | What |
|---|---|
| Project Settings → RPG Saga Engine → Features | Switch whole systems off. A disabled subsystem is not created. The command line -RSEDisableFeatures=Quests,Cards does it for one run |
| Project Settings → RPG Saga Engine → Commands | Handler Classes (your Blueprint handlers), Max Nested Depth, Log Refused Commands |
| Project Settings → RPG Saga Engine → Game Flow | Menu Extensions |
| Project Settings → Asset Manager | The folders scanned for your own Primary Data Asset types |
| Project Settings → Editor → RPG Saga Engine Configurator → Groups | Which group your settings class appears in |
Defaults the plugin ships live in Plugins/RPGSagaEngine/Config/Defaults/{Game,Editor}.ini and apply under your project's config, so anything you change wins and a plugin update never overwrites it. See Appendix B.
27.5 Blueprint usage
A short list of nodes that help when you extend:
- Is Feature Enabled (RPG Saga|Features): adapt your UI to the project's feature set.
- Submit Command, Submit Command As, Can Submit, Submit Command (Game), Has Game Authority (RPG Saga|Commands): the command bus and the authority check.
- Get Subsystem nodes for the framework's subsystems, each with its events (On Quest Started, On Encounter Ended, On Saved, and so on).
- The Context nodes (RPG Saga|Narrative|Context): read and change the game from a custom condition or effect, with changes reported once, like built-in effects.
- In battle code: Get Unit, Is Unit Active, Unit Has Status, Deal Damage, Heal Unit, Apply Status, Defeat Unit, Roll Int, Roll Percent.
The full list is generated: Appendix A. The Blueprint API is frozen: a node or event that ships is never removed or renamed. That is checked by the test RSE.Editor.BlueprintAPI.Manifest, and RSE.BlueprintAPI.Export regenerates the manifest after a deliberate change.
27.6 C++ usage
27.6.1 A new system, the plugin way
A system has a data asset, a settings class, a subsystem that owns the state, a save section, commands, and events. The snippets below show the shape of each piece.
The content type. Derive from URSEPrimaryDataAsset, keep references soft, validate:
UCLASS(BlueprintType)
class UMyBountyData : public URSEPrimaryDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Bounty", meta = (ClampMin = "0"))
int32 Reward = 100;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Bounty")
FGameplayTag TargetEnemyTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Bounty")
TSoftObjectPtr<UTexture2D> Poster; // soft: loaded when shown
#if WITH_EDITOR
virtual EDataValidationResult IsDataValid(FDataValidationContext& Context) const override
{
EDataValidationResult Result = Super::IsDataValid(Context);
if (!TargetEnemyTag.IsValid())
{
Context.AddError(INVTEXT("Target Enemy Tag is empty."));
Result = EDataValidationResult::Invalid;
}
return Result;
}
#endif
};
Put the folder in Project Settings → Asset Manager → Primary Asset Types to Scan, so saves and tools can find it.
The settings class. Global rules, with limits and a description:
UCLASS(Config = Game, DefaultConfig, meta = (DisplayName = "Bounties"))
class UMyBountySettings : public URSEDeveloperSettings
{
GENERATED_BODY()
public:
/** Gold multiplier for bounties on bosses. */
UPROPERTY(Config, EditAnywhere, meta = (ClampMin = "0.1", ClampMax = "10"))
float BossRewardMultiplier = 2.f;
};
If the rule should differ per zone or boss, override IsProfileSection() to return true, add EditInlineNew, and read it with RSERules::Get<UMyBountySettings>(Profile).
The subsystem and its state. The state is a plain struct, saved by id, replicated by section:
USTRUCT()
struct FMyBountyState
{
GENERATED_BODY()
UPROPERTY(SaveGame) TArray<FPrimaryAssetId> Claimed; // ids, never pointers
};
UCLASS()
class UMyBountySubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
RSE_FEATURE_GATE(ERSEFeature::Quests) // not created while the feature is off
virtual void Initialize(FSubsystemCollectionBase& Collection) override
{
Super::Initialize(Collection);
Collection.InitializeDependency<URSESaveSubsystem>()
->RegisterStruct<FMyBountyState>(TEXT("Bounties"), 1, this, [this]() { return &State; });
Collection.InitializeDependency<URSECommandSubsystem>()
->RegisterHandler<FMyCmd_ClaimBounty>(
[this](const FRSECommandContext& C, const FMyCmd_ClaimBounty& Cmd, FText& Why) { return CanClaim(Cmd.Bounty, Why); },
[this](const FRSECommandContext& C, const FMyCmd_ClaimBounty& Cmd) { Claim(Cmd.Bounty); },
ERSECommandPermission::AnyPlayer, this);
}
FSimpleMulticastDelegate OnBountyClaimed; // presentation listens to this
private:
bool CanClaim(FPrimaryAssetId Id, FText& Why) const;
void Claim(FPrimaryAssetId Id)
{
State.Claimed.Add(Id);
RSEStateSections::MarkChanged(this, TEXT("Bounties"));
OnBountyClaimed.Broadcast();
}
FMyBountyState State;
};
The picture to keep in mind: the data asset says what a bounty is, the settings say how the rules work, the subsystem owns the one copy of the state, the section makes it save and replicate, the command is the only way to change it, and the event tells the screen.
The test. Logic that lives in RSECore-style code is testable without a world:
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMyBountyClaimTest, "MyGame.Bounties.Claim",
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FMyBountyClaimTest::RunTest(const FString& Parameters)
{
// build the state, run the pure function, TestEqual(...)
return true;
}
27.6.2 Subclassing directors and other actors
A battle director is the actor that runs one battle in its mode: it owns the camera, the input and the presentation, and holds a headless battle driven by a driver. ARSEActionBattleDirector is Blueprintable, so you can make a Blueprint child to change its defaults and hook its events. The grid and ATB directors are placed in a level and configured through their properties, their zone or stage, and the encounter asset. For anything the properties do not cover, subclass in C++ and override the virtual functions the director documents, and keep your logic out of the director: put it in a policy class or a handler that the director calls.
27.6.3 Adding another battle mode (what it takes)
A new battle mode is not a data-only extension. The existing modes (grid Tactics, Free Tactics, ATB, turn-based and Action) follow one pattern, and a new one needs the same pieces:
- A simulation in the logic layer that runs headless, built on the common battle pipeline, so the simulator and the balance tool can play it.
- A driver and a director actor in
RSEfor the camera, input and presentation, which read the battle throughIRSEBattleViewand listen to its events. - A command struct derived from
FRSECommandfor every player action, with a handler on the command bus. That is what makes it co-op ready. - A native gameplay tag for the mode (
Battle.Mode.*), the encounter data to select it, and a case in the encounter starter. - A feature toggle if the mode should be switchable. The feature list is an enum in the plugin, so adding to it is a source change.
- Settings, validation, tests, and a Blueprint surface.
Before you start, check whether an existing mode with a rules profile, an AI profile and your own conditions and effects already gives you what you want. Most "new modes" turn out to be a configuration of Free Tactics, ATB or Action.
27.7 Advanced
27.7.1 Keeping changes to the plugin mergeable
If you must edit the plugin's source:
- Keep your changes small, in your own files where you can, and note each one.
- Never edit a shipped asset in place. Use Create a copy in the project.
- Run
RSE.Plugin.PlatformApis, the content tests and Validate All Data after the change. - Before you package, build the game target and the editor target with strict includes (every
.cppincludes what it uses, and editor-only APIs sit under#if WITH_EDITOR). The plugin is also compiled in the game configuration, which the editor target never covers.
27.7.2 Stable ids and tags
Name a content tag for what it is, not for where you use it. Tags the code reads directly are declared as native tags with UE_DECLARE_GAMEPLAY_TAG_EXTERN, never built from a string. Content tags live in .ini files; a new domain gets its own Config/Tags/<Prefix>_<Domain>.ini, and the plugin registers its tag folder at load. Your own tags go in your project's Config/Tags.
27.7.3 Mechanical renames
The product name and prefix are provisional. Keep them out of dynamically built names so a future rename stays mechanical: use the prefix in class names, never in strings you assemble at run time.
27.7.4 Replication readiness
Systems you add should be ready for co-op from the start, even if you never ship it. See Rules for network-ready systems in Co-op and online: actions as commands, one owner per piece of state, presentation fed by events, swappable control, deterministic seeds, authority-guarded effects, and no references to "player 0" in logic.
27.8 Troubleshooting
| Symptom | Cause and fix |
|---|---|
| My Blueprint condition or effect is not in the list | The class must derive from the Custom (Blueprint) base, be saved, and compile. Reopen the list. A class that does not derive from the base is not offered. |
| A condition changes the game | Conditions must only read. Move the change to an effect. |
| A custom effect's change is not reported to quests or the HUD | It used a plain variable node. Use the Context nodes so changes are reported and deferred like built-in effects. |
| An ability effect replays differently each time | It uses random nodes. Use Roll Int or Roll Percent, which come from the battle's seed. |
| A new settings class sits under Other in the Configurator | Add it to a group (Project Settings → Editor → RPG Saga Engine Configurator → Groups). The test RSE.Editor.Configurator.EveryClassHasGroup fails until you do. |
| My data asset type is not found by the tools | Its folder is not in the Asset Manager's scan list. Add it in Project Settings → Asset Manager. |
Link errors using RSENet or RSEEditor types | Add the module to your Build.cs. Editor modules only under Target.bBuildEditor. |
| The plugin fails to compile in the game configuration | A .cpp relied on an include from a neighbour, or an editor API sits outside #if WITH_EDITOR. Build the game target with strict includes to find it. |
| My subsystem exists although I switched the feature off | It lacks RSE_FEATURE_GATE(...) (or an equivalent ShouldCreateSubsystem). |
| A saved game from before my change fails to load | You changed a section's struct without raising its version number in RegisterStruct. Bump the version and handle the old one. |
27.9 See also
- Core concepts: data-driven content, validation, settings and CVars.
- Abilities and statuses: custom ability effects and logic.
- Enemy AI and adaptive difficulty: AI scorers and conditions, and the StateTree bridge.
- Save and load: save sections.
- Co-op and online: commands, state sections and authority.
- Editor tools: the Configurator and the importers.
- Appendix A, Appendix B, Appendix D.
- Design record:
docs/engineering-standards.md.
28. Troubleshooting and FAQ
In short: most problems show up in Validate All Data and in the Output Log. This chapter collects the common symptoms with their causes and fixes, answers the questions people ask first, and lists the logs and debug console variables that help you look inside. Each chapter also ends with its own troubleshooting table for problems specific to its system.
28.1 Basics
28.1.1 Where to look first
- RPG Saga Engine → Validate All Data. It checks every setting, rules profile and data asset. Read the Message Log (RPG Saga Engine Validation). Most content problems name the asset that is wrong.
- The Output Log (Window → Output Log). Framework messages come from categories that start with
LogRSE. Filter onRSE. - The chapter for the system you are using. Its Troubleshooting section lists what that system does wrong most often.
- Support. Use the Support link on the plugin's Fab page. Include the Output Log and the Validate All Data results.
28.1.2 Turn up the logging
The framework has a log category per domain. Set one to verbose from the console, for example Log LogRSEBattle Verbose, or in DefaultEngine.ini. Categories you will reach for: LogRSECore, LogRSESave, LogRSECommands, LogRSEExploration, LogRSEBattleStart, LogRSEBattleFlow, LogRSEAI, LogRSEDialog, LogRSEQuests, LogRSEPuzzle, LogRSEEncounter, LogRSETravel, LogRSEPerf, LogRSEPlatform, LogRSEOnline, LogRSENet, LogRSEContentImport, LogRSETranslate.
Debug console variables, all named RSE.*. The ones most worth knowing:
| Variable or command | Shows |
|---|---|
RSE.Commands.Log 1 | Every command the bus processes |
RSE.Net.LogTraffic 1 | Every state section and command sent over the network |
RSE.AI.Debug 1 | The AI's option scores |
RSE.Narrative.Trace 1 | Effects as they run |
RSE.Quests.Trace 1 | Quest evaluation |
RSE.Dialog.LogConditions 1 | Which dialog conditions held |
RSE.Dialog.ShowNodeIds 1 | Node ids in the dialog box |
RSE.Time.Trace 1 | Time of day changes |
RSE.Interaction.Debug 1 | Interaction targeting |
RSE.Encounter.Debug 1 | Roaming enemies and random battle checks |
RSE.NPC.Debug 1 | NPC schedules and behaviour |
RSE.Difficulty.Log 1, RSE.Difficulty.Override <value> | Adaptive difficulty changes, and a forced value |
RSE.Battle.AutoPlay 1 | The AI plays the party too, for watching a battle |
RSE.Battle.Presentation.Speed <n> | Battle presentation speed |
RSE.Seed.World <n> | Fix the world seed to reproduce a run |
RSE.Input.Device Gamepad|Keyboard | Force the prompts to a device without a controller |
RSE.Language <culture> | Switch language while playing |
RSE.Save.SimulateFault NoSpace|Corrupt|SignedOut|Failed | Make saving fail to see the messages |
RSE.Visual.DeckPreview 1 | Preview the Steam Deck profile |
The complete list is Appendix C. Debug commands are not in Shipping builds.
28.2 How it works
A quick map of where each kind of problem lives:
| The problem is about | Look in |
|---|---|
| A value that is wrong or a rule that behaves oddly | Settings (Project Settings → RPG Saga Engine), then a rules profile that overrides it for this zone or boss |
| A thing missing or invalid in your content | The data asset, and Validate All Data |
| Something that does not start (a battle, a dialog, a puzzle) | The conditions and effects on it, and the Output Log of its system |
| A guest in co-op sees something different | State sections and commands. See Co-op and online |
| A look or an animation | The look and body preset, the character pack importer, the Animation & FX Library |
| A tool that does nothing | The open level, the selected actor, the Output Log, or Advanced tools menu entry |
28.3 Key classes and assets
Nothing to create here. The assets named below are the ones most often at fault.
| Asset | Why it matters when something is wrong |
|---|---|
| Encounter | A battle needs its mode, its enemies and a matching zone or stage in the level |
| Tactics Zone | Needs a baked grid |
| Rules profile | Can silently override a value you thought was global |
| Character (Look, Body preset) | Missing body presets show as grey capsules |
| Foundation and Game Terms | The words and stats everything else uses |
28.4 Settings
- Project Settings → RPG Saga Engine → Features: switch a system off (or on). A disabled system's menus, pages and nodes disappear, which is a common reason for "my X is missing".
- Project Settings → RPG Saga Engine → Commands: Log Refused Commands is on by default.
- Project Settings → RPG Saga Engine → Options → Default Language and Languages.
- Editor Preferences → Plugins → RPG Saga Studio: whether the Studio opens at startup, and Show advanced tools everywhere.
28.5 Blueprint usage
Two Blueprint habits that save hours:
- Print what the framework sees. Bind to a subsystem event (for example On Quest Started or On Encounter Ended) and Print String the argument. It tells you whether the framework fired the event at all.
- Check feature and authority first. Is Feature Enabled (RPG Saga|Features) and Has Game Authority (RPG Saga|Commands) explain many "it works in the editor but not for the guest" cases.
28.6 C++ usage
Use the logging the framework uses. Define a category per domain and write to it, so your messages sort with the rest:
DECLARE_LOG_CATEGORY_EXTERN(LogMyBounties, Log, All);
UE_LOG(LogMyBounties, Warning, TEXT("Bounty %s has no target tag."), *GetNameSafe(Bounty));
Add a debug switch as a console variable named for your domain, outside Shipping builds:
static TAutoConsoleVariable<int32> CVarBountyDebug(TEXT("MyGame.Bounties.Debug"), 0, TEXT("1 = log every bounty check."));
28.7 Advanced
28.7.1 Reading a bug report
Ask for: the engine version and the plugin version; the Output Log; the Validate All Data results; whether it happens in a fresh project that has only the plugin and the starter content (if not, it is your content); whether it happens in single player and in co-op; and the exact steps. The scripted runners help you reproduce: RSE.Dev.Script <file> plays a list of console commands, and RSE.Rooms.<Name> plays a test room.
28.8 Troubleshooting
28.8.1 Installing and starting
| Symptom | Cause and fix |
|---|---|
| The plugin does not load, there is no RPG Saga Engine menu | It is not enabled: Edit → Plugins, search RPG Saga, tick it, restart. The plugin is for Unreal Engine 5.8 and the editor and game run on Windows (Win64). The Output Log (LogPluginManager, RSE) names the module that failed. |
| "Missing or built with a different engine version" or "would you like to rebuild?" | The copy has no compiled binaries for this engine (a zip, or a copy from another machine). Install it from Fab with Install to Engine (it comes compiled), or rebuild: the project must be a C++ project and you need Visual Studio 2022 with Game development with C++. |
| Two copies of the plugin | It must be installed once, in the engine or in your project's Plugins. Remove one and restart. |
| The Studio does not open at startup | Don't show at startup is ticked, or the editor started with -NoRSEStudio, or it runs unattended. Open it with the Studio toolbar button. |
| I cannot find a tool that the documentation mentions | The menu is short. Everything else is under RPG Saga Engine → Advanced tools, and some tools appear only where they apply. Tick Show advanced tools everywhere. |
| I cannot see the plugin's assets | Content Browser Settings → Show Plugin Content. They are under RPG Saga Engine Content. |
| An asset is read-only, or the Studio says Create a copy in the project | Plugin assets are templates. The Studio never edits them in place. Press Create a copy in the project. |
| Validate All Data warns that a plugin asset was "changed locally" | Undo the change (or reinstall the plugin) and make your own copy instead. |
28.8.2 Characters and art
| Symptom | Cause and fix |
|---|---|
| Characters are grey shapes or capsules | The plugin ships no Epic content, so characters name a body preset your project must define. Run RPG Saga Engine → Advanced tools → Install UE Mannequin Kit (or tick Install Mannequin Kit in the New RPG Project wizard). Files already in your project are never overwritten. |
| Missing packs, references to assets that are not there | Third-party packs are not included. Validate All Data lists the assets with missing references. Add the pack again in the same folder, or run the character pack importer and the Animation & FX Library on the packs you have. Running them again updates the same assets. |
| A character from my own model is invisible, tiny or twisted | Set Target Height, check that the mesh is a rigged skeletal mesh, and use the pack importer with a tuned profile for unusual bone names. Rigs exported in meters are corrected automatically. See Character visuals and animation. |
| No portraits or icons | The plugin ships no rendered portraits. After installing a body, run Generate Portraits & Icons once. It needs a renderer. |
| A weapon sits wrongly in the hand | Fit it with the weapon tools. See Weapons. |
28.8.3 Battles
| Symptom | Cause and fix |
|---|---|
| The Tactics grid does not show | The zone is not baked: select it and press Bake Grid (and again after you change the level under it). The default Grid Visual Mode is a decal that needs the deferred renderer: with the forward or mobile renderer set it to Tiles. The grid shows only during a battle. Tiles missing under grass or small rocks is intended. Tag an actor RSE.GridIgnore to leave it out on purpose. |
| Walking into a battle site does not start the battle | The site needs a trigger, and its director needs an encounter. A Tactics encounter needs a Tactics zone, and an ATB or turn-based one an ATB stage, in the level. Only one battle runs at a time. Save the level and play again: an unsaved new encounter asset is lost if the editor closes. |
| A unit starts on the wrong tile, or the log warns that a unit moved | The encounter was laid out for another zone, or the zone was baked again afterwards. The battle moves the unit to the nearest free walkable tile. Fix it in Encounter Layout Mode. |
| Battles are too easy or too hard | Use Test in battle, the Estimated difficulty step of New battle, and Balance My Campaign. The AI adapts its intelligence, not its stats. Set per-zone or per-encounter limits if needed. |
| A battle does not use the mode I expected | A mode override or a co-op conversion is in effect. Check the encounter, the rules profile and Co-op Conversion. See Battle fundamentals. |
| Saving is refused | Saving is blocked in battles, scenes, dialogs and inside volumes marked "no saving". Save points and the save item work everywhere else. |
28.8.4 World and maps
| Symptom | Cause and fix |
|---|---|
| Map generation fails or the map is empty | Generate Map and the Portrait & Icon Studio render the level, so they need a GPU renderer. In the editor it just works. From the command line add -AllowCommandletRendering and do not use -nullrhi, or pass -NoCapture to write only the map data. "The level cannot be rendered here" means exactly this. Save the level first. |
| The explorer falls through a bridge or floor | The mesh has no collision the character can stand on. Give it collision, or put an invisible walkable surface over it. A safety net (Exploration → Fall Recovery) puts an explorer back where it last stood on solid ground, and Blueprint can react with On Explorer Recovered. |
| Populate Zone places nothing, or everything in one corner | It needs a progression zone with enemies and a walkable area. With a navmesh only reachable places are used. If the level has none, Apply adds a Nav Mesh Bounds Volume (or press Add NavMesh Volume). Nothing is placed on or near a Tactics zone or a classic stage. |
| A door, chest or lever does nothing | Check its conditions and effects, the interaction library settings and RSE.Interaction.Debug 1. See Exploration. |
28.8.5 Text and languages
| Symptom | Cause and fix |
|---|---|
| The game shows English although I chose another language | The game starts in English until the player picks a language or you pass -culture=xx. The list offers only cultures with a compiled translation. Packaged games need the cultures in Packaging → Localizations to Package. |
| Editor or menu texts are English only | The plugin ships in English. Translate its own target with Translate with AI. See Localization. |
| A screen shows the wrong word for "Party", "Magic" or "Lv" | The vocabulary comes from Game Terms. A fixed word you typed does not follow the terms. Use {Term.<Id>}. |
| The translation import refused my file, or the compile failed | The report lists each problem with its id. A missing placeholder or plural form is an error. A broken {Placeholder} fails the compile. |
28.8.6 Performance and platforms
| Symptom | Cause and fix |
|---|---|
| The game does not use the Steam Deck settings | The Deck profile is missing from your project's Config/DefaultDeviceProfiles.ini. See Platforms and performance. -dp=SteamDeck forces it on any PC. |
| Text is too small on the Deck | Built-in screens never draw below UI Theme → Minimum Font Size. In your widgets use the theme fonts. |
| Meshes look blocky on the Deck | Nanite is off in the Deck profile. Give heavy meshes LODs. The content budget warnings point at the worst offenders. |
| Low quality still has heavy shadows | Project Settings → Rendering → Shadow Map Method is overriding scalability. Put it back to the default. |
| An Android or iOS build fails | Mobile is not verified, and the descriptor allows Win64 only. |
28.8.7 Co-op and online
| Symptom | Cause and fix |
|---|---|
| The online service is not available | The provider's subsystem is not loaded: the engine plugin is not enabled, DefaultPlatformService is not set, Steam is not running, or the game started with -nosteam. With Fallback To LAN on, the game uses LAN. |
| LAN finds nothing | Same subnet, and the firewall must allow UDP for the beacon port 14001 and the game port 7777. |
| The host is running a different version | Set the same Game Version on both builds. |
| My system works for the host but not for guests | Its state is not a state section, the owner never marks it changed, or its actions are not commands. See Co-op and online. |
28.9 FAQ
What is RPG Saga Engine? A framework for role-playing games in Unreal Engine 5.8: grid tactics, free-movement live tactics, active-time, turn-based and real-time action battles on the same characters and abilities, plus exploration, time and weather, living NPCs, dialog, quests, puzzles, items, shops, saves, maps and an adaptive enemy AI. You build your game with editor tools and data.
Do I need C++ or Blueprints? No for a complete game made from the built-in systems. Blueprints are for what the framework does not do (a custom condition, effect, AI rule, interactable or screen). C++ source is included for programmers. See Extending the plugin.
Where do I start? Installation and your first project: install, open the Studio, make a character, make a battle, play it. Leave the Studio's Explanations on Beginner.
What kind of games can I make? Classic menu battle RPGs, tactical RPGs on a grid, hybrids that use both, and free-movement turn-based tactics on the live map. The foundation presets start you in a genre (JRPG Classic, Tactics, Dark Fantasy, Sci-fi RPG, Post-apocalyptic, Steampunk, Empty).
Can one game use several battle modes? Yes. Every encounter names its own mode, and the same party, classes, abilities and items work in all of them. Each ability has rules per mode.
Is there multiplayer? Co-op, yes: two to four players for exploration, story and live battles, on LAN, Steam and Epic Online Services through one interface. Limits: Steam and EOS were tested on a local network only, four-player sessions under bad network conditions and hosting on a Steam Deck are not tested, and grid Tactics and ATB battles become live battles in co-op. Competitive PvP is not in this release. See Co-op and online.
Which platforms and engine versions? Windows (Win64) for the editor and the game, with the Steam Deck as the minimum hardware target. Unreal Engine 5.8. Mobile (touch controls, phone UI) and consoles are not supported yet. See Platforms and performance.
What content is included? A complete, balanced starter set (classes, heroes, abilities, items, enemies, zones, shops and battles in every mode), an example map and main menu, starter content for each foundation preset, archetypes and placeholder battle animations for the UE5 mannequin. No third-party art.
Can I use character packs from a store? Yes. The character pack importer, New Character from Mesh and the Animation & FX Library make them usable in a few clicks. A model with no animations borrows the mannequin's, retargeted.
Can I change the starter content? Yes, through copies: plugin assets are templates, and the Studio makes a copy in your project when you edit one.
Do I have to use the Studio? No. It is a friendly layer over ordinary data assets. Use any asset directly, the Configurator, Project Settings, spreadsheets, Blueprints or Python. Everything stays in sync because it is the same data.
Can I write content in spreadsheets, or with an AI assistant? Yes. Content Import creates and updates every kind of data from CSV or JSON, with a dry run first, and never deletes anything. The AI workflow exports prompts generated from your own project. See Editor tools.
How do I balance my game? Every battle can be simulated without graphics. Use Test in battle, the difficulty estimates in the Studio, Balance My Campaign for the whole campaign, and the Progression Designer for levels, experience and money.
How does adaptive difficulty work? There is no difficulty menu. The enemy AI's intelligence moves slowly with how the player did over several battles. Stats and rewards never change, and each zone, battle or boss can set limits.
How do saves work? Save points in the world, plus an optional consumable that saves almost anywhere (not in battles, scenes, dialogs or no-save areas). A save holds the party, inventory, story flags, quests, position, world state and the AI's difficulty value. See Save and load.
Can I replace the game's screens? Yes. Every screen has a widget class in the settings. Make a Widget Blueprint on the screen's data and set it there. See User interface.
Is the game localizable? Yes. Every text is localizable, the player chooses the language in the options, and the plugin ships in English only. Use Translate with AI to add languages. See Localization.
Will a plugin update overwrite my work? No. Your content and settings live in your project. The plugin's assets are templates you copy, and the plugin's defaults apply under your settings, so anything you changed wins.
Can I sell a game made with it? Yes, under the Fab license you bought. Your packaged game includes the framework in compiled form. The plugin and its source cannot be redistributed or resold as a tool or template.
Is any included content from other companies? No. Everything that ships in the plugin was made for it. Engine content (the mannequin, basic shapes, fonts) is referenced or copied from your own engine installation. See Docs/ThirdPartyNotices.md in the plugin.
28.10 See also
- Core concepts: validation, settings and the console variables.
- Editor tools: Validate All Data, the Studio and the Configurator.
- Co-op and online and Platforms and performance.
- Glossary.
- Appendix C.
- Product pages:
docs/product/troubleshooting.mdanddocs/product/faq.md.
29. Glossary
In short: the words used in RPG Saga Engine, its editor tools and this manual, in plain language. Terms in italics inside an explanation have their own entry. Each group ends with the chapter that explains it in depth.
29.1 Battle words
| Term | Meaning |
|---|---|
| Battle mode | How a battle is played. Every encounter names its mode, and the player does not choose it. The modes are Tactics, Free Tactics, ATB, Turn-based (by round or by timeline) and Action (real time). |
| Tactics (grid Tactics) | Turn-based battles on a square grid laid over your level. Tiles have height, units have a facing, and position matters (flanking, high ground, line of sight). Turn order follows CT, and each turn is paid with AP. |
| CT (Charge Time) | The Tactics turn counter. Every unit fills its CT at its own speed, and when it reaches the threshold the unit takes a turn. A turn that did less costs less CT, so the unit comes back sooner. |
| AP (Action Points) | The budget of one Tactics turn. Moving and acting both cost AP, in any order. |
| ATB (Active Time Battle) | Classic menu battles in which each character has a time bar that fills up. When it is full the character can act. The party and the enemies stand in rows facing each other. |
| Wait / Active | The two ATB time settings. In Wait (the default) time stops while you choose in a menu. In Active it keeps running. |
| Turn-based | Classic menu battles without time bars. Two styles: Round-based (everyone acts once per round, fastest first) and CTB (timeline) (a strip where fast units come around more often and slow abilities delay the next turn). |
| Free Tactics (Live Tactics) | Turn-based tactics without a grid: units move any distance in meters within their budget, on the live map. It is also the form every battle takes in co-op. |
| Action battle | Real-time combat on the live map, from sword fights to shooters, with a combat component, a camera rig and its own AI. |
| Classic battle | An ATB or turn-based battle (the menu-based modes). |
| Rows (front / back) | Positions in a classic battle. By default the back row deals and takes half melee physical damage, and some abilities hit a whole row. |
| Facing | The direction a Tactics unit looks. Attacks from the side or behind hit harder and more often. |
| Flank | Attacking from the side or back of a unit, or with an ally on its other side. |
| Line of sight | Whether anything blocks the view between the user and the target. Ranged abilities may need it. |
| Deployment tiles | The tiles where the player places units before a Tactics battle starts. |
| Encounter | One battle: its mode, enemies, levels, rewards and rules. A data asset. |
| Encounter pool | A list of enemies a progression zone draws random groups from, including rare elite groups. |
| Random encounter area | A volume in the level where classic battles start from time to time while the player walks. |
| Visible enemies / spawner | Enemies that roam the level. Touching one starts its battle. A spawner places and respawns them. |
| Tactics zone | The actor that marks where a Tactics battle happens on your level. Its grid is measured once (Bake Grid) and drawn during the battle. |
| Bake Grid | Measuring the level under a Tactics zone: which tiles are walkable and how high each is. |
| ATB stage | The actor that marks where a classic battle happens: the two sides' slots and the battle camera. |
| Battle director | The actor that runs one battle site (or one live or Action battle) and knows which encounter it fights. |
| Battle site | A Tactics zone with its director, trigger and optionally a classic stage next to it. |
| Mode override | A session-wide rule that fights an encounter in another mode, using a copy of the encounter. |
| Status | A lasting effect on a unit (poison, haste, protect). |
| Element | The kind of damage (fire, ice, holy). Units can be weak to, resist, be immune to or absorb it. |
| Resource | A spendable value such as HP, MP or Resonance. Your foundation decides which exist. |
| Adaptive difficulty | The enemies get smarter or make more mistakes depending on how the player did over several battles. Stats and rewards never change. |
| Intelligence | The enemy AI's skill, from 0 to 1, kept separately per battle family. Adaptive difficulty moves it within limits you set per zone or encounter. |
| Utility AI | The decision method of the enemy AI: every possible action gets a score from weighted considerations (scorers) and the best is chosen, with plausible mistakes at low intelligence. |
| Scorer | One consideration of the utility AI. A custom scorer adds a behaviour without touching the AI. |
See Battle fundamentals, Grid Tactics, ATB and turn-based, Free Tactics (Live), Action battles and Enemy AI and adaptive difficulty.
29.2 Characters and content
| Term | Meaning |
|---|---|
| Hero / party member | A main character. Plays in every battle mode. |
| Recruitable unit | A secondary character recruited during the game, who fights in Tactics battles only. |
| Enemy | A character controlled by the AI. |
| Guest | A character who joins for a while with fixed equipment the player cannot change. Not to be confused with a guest player in co-op. |
| Class | What a character is: stat growth by level, the abilities it learns and the equipment it may use. Characters keep their class for the whole game. |
| Ability | Anything a unit does in battle: attack, spell, skill, item use. One ability works in every battle mode, with rules per mode. |
| Item | Consumables, equipment, key items and readable documents. One inventory for the whole game. |
| Key item | An item used to solve puzzles or move the story on. It cannot be sold or used up by accident. |
| Pact | The summon system. A Pact gives a hero affinities, extra abilities and a summon, a temporary unit the player controls. |
| Resonance | The resource Pact summons cost. It builds up during battle. |
| Look / appearance | How a character looks: which body preset and which parts, colors and variants. |
| Body preset | A named body: skeletal mesh, animation Blueprint, anim set, scale and attachment points. Many looks share one. |
| Anim set | The list of animations a body uses: idle, walk, run, hits, knock-out, victory, attacks, casting. |
| Animation style | A group of clips for one way of fighting, built by the Animation & FX Library. |
| Presentation | How an ability looks and sounds: animation, effects, sounds, camera, projectile, impact. Separate from its rules. |
| Character pack | A set of character models and animations from a store, made usable by the importer. |
| Speaker | Who says a dialog line: a name, a color and a portrait. |
| Portrait | A character's face picture for dialogs and menus. |
| Growth Board | A board of nodes (stat boosts, passives, abilities, gates) the player opens by spending board points. One of the progression systems. |
| Equipment mastery | Won battles give mastery points to an equipped weapon or armor, which then teaches its abilities for good. |
See Characters and party, Progression, Abilities and statuses, Items, inventory and economy and Character visuals and animation.
29.3 Story and world
| Term | Meaning |
|---|---|
| Story flag | A yes/no or number value that remembers what happened. Saved with the game. |
| Condition | A question about the game state (has the item, flag has a value, character is in the party). Dialogs, quests, puzzles, abilities and encounters use the same conditions. |
| Effect | A change to the game state (set a flag, give an item, recruit a character, start a battle, start a dialog). The same effects work everywhere. |
| Conditions & Effects | The one content language shared by dialog, quests, puzzles, interactions, shops and encounters. |
| Dialog | A conversation of lines, choices, branches and effects, edited in the visual dialog editor. |
| Quest | A goal with stages and objectives, shown in the journal and the tracker. |
| Puzzle | A world mechanism (locked door, code lock, item combination) built from conditions and effects. |
| Save point | A place where the player saves. A consumable save item can also save almost anywhere except in battles, scenes, dialogs and no-save areas. |
| No-save zone | A volume where saving is blocked, for example before a boss. |
| Progression zone | A part of the world with a level range: which enemies live there, how strong they are, what loot is worth. Used by random battles, populate tools and balance tools. |
| Area map / minimap | The map of a level and the small map on the HUD, generated with Generate Map. |
| Travel / zone exit | Moving between maps. In co-op the host's travel takes everyone along. |
| Bestiary | The in-game book of enemies the player has met. |
| Card game | An optional collectible card minigame with NPC opponents. |
| Interactable | Anything in the world the player can use: doors, chests, levers, signs. |
See Story, dialog and quests, Exploration and World building.
29.4 Editor words
| Term | Meaning |
|---|---|
| RPG Saga Studio | The editor window where you make your game step by step, in four layers. |
| Layer | One of the Studio's four levels: Foundation, Archetypes, Content, World. |
| Foundation | The base rules of your game: names, stats and resources, formulas, elements, equipment slots, the battle menu, battle modes, progression and money. |
| Foundation preset | A ready foundation to start from: JRPG Classic, Tactics, Dark Fantasy, Sci-fi RPG, Post-apocalyptic, Steampunk or Empty. |
| Game Terms | The game's vocabulary on screen ("Party", "Magic", "Lv"), written by the foundation and read by every screen. A text uses {Term.<Id>} to follow it. |
| Archetype | A template you create content from. Content made from it follows it for every field you did not change. |
| Variant (child archetype) | An archetype derived from another one. |
| Template (plugin asset) | An asset that ships in the plugin. The Studio never edits it in place: it makes a copy in your project. |
| Starter set | The complete, balanced example content that ships with the plugin. |
| Configurator | One window with every setting of the framework, grouped and searchable, with validation and tools. |
| Rules profile | A data asset that overrides some rules (battle, grid, AI) for one zone, battle or boss, or the whole game. |
| Profile section | A settings class that a rules profile may override. |
| Validate All Data | A check of every setting and data asset. Results open in the Message Log. |
| Wizard | A short form that creates a valid, ready-to-use data asset. |
| Content Import | Creating and updating data from spreadsheets or JSON, with a dry run first. |
| Dry run | A pass that reports everything an import would do, field by field, without changing anything. |
| AI pack | Prompt files generated from your project so an AI assistant can write content the importer accepts. |
| Battle simulator | Plays battles without graphics, very fast, to measure win rates and battle length. |
| Balance My Campaign | The tool that simulates every encounter of a campaign, flags what is off and proposes fixes. |
| Progression Designer | The tool that plans levels, experience and money across zones. |
| Test room | A small map with a smoke test that exercises one area of the framework. |
| Smoke test / smoke script | A short script of console commands and waits that plays a room and fails when something does not happen. |
| Battle launcher | A development panel that starts any encounter in any mode with a chosen party, rules, AI and seed. |
| Headless | Running without rendering, for simulations and automation. |
| Commandlet | A command-line run of the editor (-run=RSE...) for automation and build machines. |
| Blueprint API | Every system's functions and events as Blueprint nodes under RPG Saga. It is frozen: shipped nodes are never removed or renamed. |
See Core concepts, Game foundation and archetypes and Editor tools.
29.5 Architecture words
| Term | Meaning |
|---|---|
| RSECore | The logic module: data, rules, state and simulation, with no actors, rendering, UI or input. |
| RSE | The presentation and world module: actors, camera, input, UI, exploration. |
| RSEEditor | The editor module: the Studio, wizards, importers, visual editors, validation. |
| RSEOnline, RSENet | The session module and the co-op transport module. |
| RSEGAS, RSEStateTree, RSECommonUI | Optional bridges: Gameplay Ability System characters, StateTree nodes for the AI, and a Common UI host for the screens. |
| Data-driven | Content lives in data assets and tables, not code. New content is new data. |
| Primary Data Asset | The base type of content definitions. Its PrimaryAssetId is the stable id that saves refer to. |
| Developer Settings | A settings class under Project Settings → RPG Saga Engine, saved in Config/Default*.ini. |
| CVar | A console variable. The framework's debug switches are named RSE.*. |
| Gameplay Tag | A hierarchical name (for example an element or a story flag) used to identify content without strings in code. |
| Native tag | A tag declared in C++ because code reads it directly. |
| Extension point | A base class you subclass in Blueprint or C++ to add behaviour: a custom condition, effect, scorer, reaction, interactable, menu entry or handler. |
| Custom (Blueprint) | The name of the Blueprint-friendly base of conditions, effects, ability effects and presentation cues. |
| Policy class | A setting that holds a replaceable class deciding a rule, such as the leash or the co-op encounter conversion. |
| Feature toggle | A switch in Features that stops a whole system from being created. |
| Seed stream | A named source of reproducible random numbers derived from the world seed. |
| Serializable state | Runtime state kept in plain structs that refer to content by id, so it can be saved and replicated. |
| State section | One named block of serializable state: the unit of saving and of replication. |
| Save backend | The storage behind saving: files, the platform's save system, or your own. |
See Extending the plugin and Save and load.
29.6 Online, co-op and platform words
| Term | Meaning |
|---|---|
| Session | One hosted game that players find or are invited to and join. |
| Provider | An online service behind the session interface: LAN, Steam, Epic Online Services, or your own class. |
| LAN | The local network. Hosting and joining on LAN needs no account. |
| Lobby | The screen and data where players see the session, the players and their characters before and during play. |
| Listen server | A host who plays and serves the game at once. Co-op uses it, with no dedicated server. |
| Host / guest | The host's machine runs the game logic. Guests show its state and send actions. |
| Authority | The machine that runs the game logic: the host, or the only player in single player. |
| Command | A small serializable action sent through the command bus and checked by a handler. |
| Command bus | The one path every player action takes, the same in single player, on the host and on a guest. |
| Handler | The class or function that validates and applies one kind of command. |
| Instigator | The player who sent a command, set by the host and never by the client. |
| Leash | The distance guests may roam from the host or the group before they are brought back. |
| Companion AI | The AI that drives a party member no player controls. |
| Slot | A player's place in the session: 0 is the host, 1 to 3 are guests. |
| Device profile | An engine profile of console variables for a device. The framework switches to the Steam Deck profile at start on a Deck. |
| Scalability level | The quality level the player picks: Low, Medium, High or Epic. |
| Content budget | An edit-time limit on a category of assets, such as triangles or texture size. |
| Performance budget | The limits a benchmark capture is checked against: frame rate, 1% low, GPU time, draw calls, memory. |
| 1% low | The frame rate of the slowest 1% of frames. |
| Platform user | The engine's idea of who is playing on a device, used for per-user saves and sign-out handling. |
| Tier (mobile) | Low, Mid or High: a mobile quality level with its own device profile and budget. Not verified on a device. |
| Touch layout | A data asset describing on-screen controls and gestures for one moment of play. |
See Co-op and online and Platforms and performance.
29.7 Localization words
| Term | Meaning | |
|---|---|---|
| Localization target | A set of texts the engine gathers and translates together. The plugin has one (RPGSagaEngine) and your project has its own. | |
| Culture | A language and region code such as ro, de or pt-BR. | |
| Gather | The engine step that collects every text of source and assets into a target's manifest and .po files. | |
| Translate with AI | The tool that exports texts for an AI assistant, validates the answers, merges them and compiles the language. | |
| Chunk | One file of texts, sized for one AI request. | |
| Glossary (translation) | A table of your content names, so the AI translates them the same way everywhere. | |
| Placeholder | A marker inside a text, such as {Name} or <em>, that must survive translation. | |
| Plural block | A pattern such as `{N} | plural(one=card,other=cards)` that gives a text for each plural category of a language. |
| Compile | Turning a .po into the .archive and .locres files the game loads. |
See Localization.
Appendix A. Blueprint node reference
Generated from the plugin's reflection data (RSE.Docs.ExportReference). 2247 nodes, events and overridable functions in 287 classes. Kind: function is a callable node, pure has no execution pin, event is an assignable event (Assign / Bind Event), override is a function a Blueprint subclass overrides. Parameters marked out are outputs, ref are passed by reference.
Classes by module: RSE (186); RSECommonUI (1); RSECore (90); RSEGAS (1); RSENet (4); RSEOnline (5).
ARSEATBBattleDirector
Module RSE. Runs and presents a classic battle on an ATB stage (D-023): ATB (D-022) or turn-based (D-050).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
End Battle (EndBattle) | function | RPG Saga|Battle | Removes the battle actors and returns to Idle. | ||
Get Battle (GetBattle) | pure | RPG Saga|Battle | URSEATBBattle* | The running (or last) battle, or none. | |
Get Battle Initiative (GetBattleInitiative) | pure | RPG Saga|Battle | ERSEBattleInitiative | Initiative of the running (or last) battle; before a battle, the one the next battle gets. | |
Get Battle Mode (GetBattleMode) | pure | RPG Saga|Battle | FGameplayTag | Battle.Mode.ATB or Battle.Mode.Turn: the running battle's mode; before a battle, the mode it would get. | |
Get Battle Outcome (GetBattleOutcome) | pure | RPG Saga|Battle | ERSEBattleOutcome | Outcome of the running or last battle (Ongoing without one). | |
Get Encounter (GetEncounterBP) | pure | RPG Saga|Battle | URSEEncounterData* | The encounter this director fights (the override while one is fought). | |
Get Last Rewards (GetLastRewards) | pure | RPG Saga|Battle | FRSEBattleRewards | What the last finished battle gave the party (experience, levels, items; D-030). Empty unless it was won. | |
Get Phase (GetPhase) | pure | RPG Saga|Battle | ERSEATBDirectorPhase | Idle, battle or finished. | |
Get Time Mode (GetTimeMode) | pure | RPG Saga|Battle | ERSEATBTimeMode | Wait or Active (the player's option, else the rules' default; may be switched during the battle). | |
Get Time Scale (GetTimeScale) | pure | RPG Saga|Battle | float | ATB time scale now (0 = standing still: Wait mode with a menu open; turn-based battles report 1). | |
Get Unit Actor (GetUnitActor) | pure | RPG Saga|Battle | UnitId: int32 | ARSEGridUnit* | The actor presenting a unit, or none. |
Get Unit Id (GetUnitId) | pure | RPG Saga|Battle | Actor: ARSEGridUnit* | int32 | Battle id of the unit an actor presents (-1 for none). |
Get Unit Name (GetUnitName) | pure | RPG Saga|Battle | UnitId: int32 | FText | Display name of a battle unit. |
Is Active (IsActive) | pure | RPG Saga|Battle | bool | A battle runs or has just finished on this stage (not Idle). | |
Is Command Queued (IsCommandQueued) | pure | RPG Saga|Battle | UnitId: int32 | bool | A player command waits for the action being shown to finish (D-065). |
Is Playback Idle (IsPlaybackIdle) | pure | RPG Saga|Battle | bool | True when no events are waiting to be shown and nothing is being presented. | |
On Event Presented (BP_OnEventPresented) | event | RPG Saga|Battle | Event: FRSEBattleEvent (ref) | Fired when a battle event is shown: damage numbers, custom HUDs, sounds. | |
Set Next Initiative (SetNextInitiative) | function | RPG Saga|Battle | Initiative: ERSEBattleInitiative | Initiative of the next battle started here (D-063: touching a visible enemy from behind, or being caught from behind). The battle consumes it; later battles start Normal again (a retry too). | |
Set Time Mode (SetTimeMode) | function | RPG Saga|Battle | InMode: ERSEATBTimeMode | Switches Wait / Active for the running battle (the options keep the player's stored choice). | |
Start Battle (StartBattle) | function | RPG Saga|Battle | EncounterOverride: URSEEncounterData* = None | bool | Starts the encounter with the party (first ATBPartySize characters allowed in ATB). EncounterOverride: fight this encounter instead of the director's own, for this battle only (several classic encounters sharing one stage, e.g. encounter triggers). Null = Encounter. |
ARSEATBStage
Module RSE. Where an ATB battle takes place (D-023): the party on one side, enemies on the other, each in a front and a back row, plus a fixed battle camera.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Frame Camera (FrameCamera) | function | RPG Saga|ATB | bool | D-183: puts the camera at the authored pose, then moves it to a clear one when geometry hides the formation (Camera Framing -> ATB). Runs when play begins; call it again after the level around the stage changed. Returns true when the camera moved. | |
Is Camera Reframed (IsCameraReframed) | pure | RPG Saga|ATB | bool | D-183: the camera was moved away from its authored pose by FrameCamera. |
ARSEAbilityDemoPad
Module RSE. A showcase pad (D-062, gallery maps): the player walks up, presses Interact and watches an ability's presentation (D-034 / D-055: its cue timeline, projectile, camera, reactions) played by a caster on a target dummy.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Ability (GetAbility) | pure | RPG Saga|World | URSEAbilityData* | The ability this pad shows. | |
Play Demo (PlayDemo) | function | RPG Saga|World | bool | Plays the ability's presentation now (spawns the units on first use). Returns false without an ability or while one plays. |
ARSEActionBattleDirector
Module RSE. The presenter of an action battle (D-171, package A3; the D-141 split: URSEActionSimDriver decides, this shows).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Action Battle (GetBattleBP) | pure | RPG Saga|Action Battle | URSEActionBattle* | The battle shown (the driver's on the authority, the proxy on a guest). Read only: commands go through Submit Command. | |
Get Battle Time (GetBattleTime) | pure | RPG Saga|Action Battle | float | Battle seconds now (a guest estimates the host's from the last mirror). | |
Get Encounter (GetEncounter) | pure | RPG Saga|Action Battle | URSEEncounterData* | Get Encounter | |
Get Unit Actor (GetUnitActor) | pure | RPG Saga|Action Battle | UnitId: int32 | AActor* | The world actor of a unit (null when it has none here). |
Get Unit Id Of (GetUnitIdOf) | pure | RPG Saga|Action Battle | Actor: AActor* | int32 | The unit an actor is (INDEX_NONE when it does not fight here). |
Is Battle Active (IsBattleActive) | pure | RPG Saga|Action Battle | bool | Is Battle Active | |
Is Proxy (IsProxy) | pure | RPG Saga|Action Battle | bool | This machine shows the host's battle (a guest). | |
On Battle Event (BP_OnEventPresented) | event | RPG Saga|Action Battle | Event: FRSEBattleEvent (ref) | ||
Try Finisher (TryFinisher) | override | RPG Saga|Action Battle | Attacker: AActor*Victim: AActor*Context: FRSEPairedContext (ref) | bool | A kill (or a stagger) by this machine's player: plays a finisher locally without stopping anyone (D-172). The default calls Try Play Finisher (Options -> Finishers, the paired animation libraries). Returns true when one plays. |
ARSEActionCameraRig
Module RSE. The action battle camera of one local player (D-171, package A3): a third-person view behind the character the player commands, turned by the look input, blending between the Combat, Aim (over the shoulder) and Lock On profiles of Action Battle (Presentation), kept off walls by a sphere probe, shake...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Trauma (AddTrauma) | function | RPG Saga|Action Battle | Amount: float | Adds camera shake (0..1). | |
Get Mode (GetMode) | pure | RPG Saga|Action Battle | ERSEActionCameraMode | Get Mode | |
Get Target (GetTarget) | pure | RPG Saga|Action Battle | AActor* | Get Target | |
Get Trauma (GetTrauma) | pure | RPG Saga|Action Battle | float | Get Trauma | |
Set Mode (SetMode) | function | RPG Saga|Action Battle | InMode: ERSEActionCameraMode | Set Mode | |
Set Target (SetTarget) | function | RPG Saga|Action Battle | InTarget: AActor* | Follows another character (a character switch) without a cut. |
ARSEActionProjectileActor
Module RSE. A projectile of an action battle in the world (D-171, package A3): each machine shows the battle's projectiles with one of these (the arrow, the fireball, the shell).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Owner Unit (GetOwnerUnit) | pure | RPG Saga|Action Battle | int32 | Get Owner Unit | |
Get Projectile Id (GetProjectileId) | pure | RPG Saga|Action Battle | int32 | Get Projectile Id | |
On Impact (OnImpact) | override | RPG Saga|Action Battle | Location: FVector (ref)HitActor: AActor* | It touched something (a unit or a wall): Blueprint impact effects. |
ARSEBuildingEntrance
Module RSE. The entrance of a building (D-150, docs/product/buildings.md): put it at the building's door and pick a mode.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Detect Door (DetectDoor) | function | Building Entrance | bool | D-158: finds the building's real door (a socket named "door", else a door-shaped opening or frame in its geometry), stands the entrance at it (the door's width and height, facing out) and places the exit point in front of it. Keep Placement leaves a hand placed entrance alone. Returns false when no door was found. | |
Get Door (GetDoor) | pure | RPG Saga|Buildings | ARSEDoor* | Get Door | |
Get Door Height (GetDoorHeight) | pure | RPG Saga|Buildings | float | Get Door Height | |
Get Door Width (GetDoorWidth) | pure | RPG Saga|Buildings | float | Get Door Width | |
Get Exit Transform (GetExitTransform) | pure | RPG Saga|Buildings | FTransform | Where the party stands when it comes out (the Exit Point, facing away from the building). | |
Get Interior (GetInterior) | pure | RPG Saga|Buildings | URSEInteriorData* | Get Interior | |
Get Mode (GetMode) | pure | RPG Saga|Buildings | ERSEBuildingEntranceMode | Get Mode | |
Get Points Problem (GetPointsProblem) | pure | Building Entrance | FText | D-153: Validate Exit Point and Check Interior Entry for tools and scripts: what is wrong, empty when both are usable. | |
Place Exit Point (PlaceExitPoint) | function | Building Entrance | bool | D-153: moves the Exit Point onto the spot FindExitSpot finds (the Building Analyzer calls it). Returns false: none found. |
ARSECaravan
Module RSE. A merchant caravan on the road (D-157, docs/product/living-npcs.md "Caravans"): place it, draw its route (the spline, along the roads; or use World Tools -> Place Caravan Route), mark the stops and pick a Caravan Data asset.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Merchant (GetMerchant) | pure | RPG Saga|Caravan | ARSENPC* | Get Merchant | |
Get Position (GetPosition) | pure | RPG Saga|Caravan | FRSECaravanPosition | Where it is now on its timetable. | |
Is Halted (IsHalted) | pure | RPG Saga|Caravan | bool | A player near it on the road holds it. | |
Refresh Now (RefreshNow) | function | Caravan | Rebuilds the timetable and moves everything to the clock's position at once (load, time skip, live tuning). |
ARSEChest
Module RSE. A treasure chest (D-042): items and money, opened once (the opened state is a story flag, so it is saved with the story), optionally locked by conditions or a key item.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Opened (IsOpened) | pure | RPG Saga|Economy | bool | The chest was opened already (its Opened flag is set; saved with the story). |
ARSECinematicCharacter
Module RSE. A character standing in a story scene (D-078): the spawnable that Cinematic from Screenplay puts in a Level Sequence for every speaker.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Copy Look From (CopyLookFrom) | function | RPG Saga|Scenes | Source: AActor* | bool | Takes the look of another actor's appearance (the real NPC or pawn it stands in for). Returns false when Source has none. |
Get Appearance Component (GetAppearanceComponent) | pure | RPG Saga|Scenes | URSEAppearanceComponent* | Get Appearance Component | |
Set Look (SetLook) | function | RPG Saga|Scenes | InCharacter: URSECharacterData*InAppearance: TSoftObjectPtr<URSECharacterAppearance>InVariant: FName | Shows a look: Appearance (and Variant) when set, else the Character's appearance and equipment. |
ARSECombatArea
Module RSE. A designed combat place of the map (D-093, free-tactics.md section 11): a clearing, a square, a bridge where battles are meant to happen.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Check Area (CheckArea) | pure | RPG Saga|Combat Roles | FRSECombatAreaReport | Traces the area (free tiles) and lists the objects whose role keeps them out of combat areas. | |
Contains Location (ContainsLocation) | pure | RPG Saga|Combat Roles | Location: FVector (ref) | bool | Whether a world position lies inside the area's box (height included). |
ARSECompanionAIController
Module RSE. The companion AI of a visible party member (D-097, engineering standards section 12): the controller every member has when no player controls it.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Follow (Follow) | function | RPG Saga|Party Field | Back to following the leader. | ||
Get Life State (GetLifeState) | pure | RPG Saga|Party Field | FRSEFollowerLifeState | D-129: the member's following and idle state (deterministic from its seed; the authority owns it). | |
Get Order (GetOrder) | pure | RPG Saga|Party Field | ERSECompanionOrder | Get Order | |
Stay (Stay) | function | RPG Saga|Party Field | Stops where it stands until told to follow again. |
ARSEDoor
Module RSE. A door the player opens and closes (D-110): in exploration by interacting with it, in a Free Tactics battle with the Door command (it costs the action set in Free Tactics -> Doors).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Locked (IsLocked) | pure | RPG Saga|Interiors | bool | Is Locked | |
Is Open (IsOpen) | pure | RPG Saga|Interiors | bool | Is Open | |
On Door Changed (OnDoorChanged) | event | RPG Saga|Interiors | Door: ARSEDoor*bOpen: bool | Raised when the door opens or closes. | |
Set Locked (SetLocked) | function | RPG Saga|Interiors | bInLocked: bool | Locks or unlocks it (a locked door cannot be opened, neither in exploration nor in battle). | |
Set Open (SetOpen) | function | RPG Saga|Interiors | bInOpen: boolbAnimate: bool = true | Opens or closes the door (swinging, or at once). |
ARSEEncounterSite
Module RSE. D-182: where one encounter is fought in every battle mode, so the same encounter can start in any mode (its own, or the session's Battle Mode Override) on one map: - grid Tactics: Tactics Director (its zone is the grid; the deployment tiles and the enemies' tiles fall back to the zone when the encou...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Build Mode Report (BuildModeReport) | pure, static | RPG Saga|Battle|Mode Override | WorldContext: UObject*InEncounter: URSEEncounterData*Site: ARSEEncounterSite* | FRSEEncounterModeReport | The mode report of Encounter on World (Site: its encounter site, may be none): the data report, then grid Tactics needs a director with a zone (the site's, or one that has the encounter), classic modes an ATB director with a stage. |
Find Site For (FindSiteFor) | pure, static | RPG Saga|Battle|Mode Override | WorldContext: UObject*InEncounter: URSEEncounterData* | ARSEEncounterSite* | The site of Encounter on World (its own encounter, or the asset it was copied from by a mode override), or null. |
Get Mode Report (GetModeReport) | pure | RPG Saga|Battle|Mode Override | FRSEEncounterModeReport | Which modes the encounter can run in at this site: its data report plus this map's battle sites (grid zone, classic stage, live area). | |
Start Encounter (StartEncounter) | function | RPG Saga|Battle|Mode Override | Source: AActor* = NoneReturnPoint: AActor* = None | bool | Starts the encounter in the mode it is fought in now (its own, or the session's Battle Mode Override). Returns false when it did not start. |
ARSEEncounterSpawner
Module RSE. Places visible enemy groups in the world (D-063, visible soldiers that start battles on contact; docs/design/random-encounters.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Force Contact (ForceContact) | function | RPG Saga|Encounters | Starts the battle of the first live group now, as if touched (Normal initiative). PIE testing. | ||
Get Group Count (GetGroupCount) | pure | RPG Saga|Encounters | int32 | Groups this spawner places now (Group Count x the frequency option's density x the time and weather density). | |
Get Group Reinforcements (GetGroupReinforcements) | pure | RPG Saga|Encounters | GroupIndex: int32 | URSEReinforcementData* | D-117: the reinforcements a group calls in its battles: this spawner's own, else its encounter's or pool's, else its behavior's. Null = none. |
Is Group Defeated (IsGroupDefeated) | pure | RPG Saga|Encounters | GroupIndex: int32 | bool | The group has been defeated and has not come back yet. |
Is Spawner Enabled (IsSpawnerEnabled) | pure | RPG Saga|Encounters | bool | The spawner places its groups (Enabled in the details). | |
On Encounter Contact (OnEncounterContact) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*GroupIndex: int32Initiative: ERSEBattleInitiative | A touch started the battle of GroupIndex. | |
On Enemy Alerted (OnEnemyAlerted) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*Enemy: ARSERoamingEnemy*bAlerted: bool | A leader noticed the party (bAlerted) or gave up (false). | |
On Group Defeated (OnGroupDefeated) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*GroupIndex: int32 | A group was defeated and removed. | |
On Group Spawned (OnGroupSpawned) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*GroupIndex: int32 | A group appeared (level start or respawn). | |
Reset Saved State (ResetSavedState) | function | RPG Saga|Encounters | Forgets the saved state (defeats, group seeds) and places fresh groups. PIE testing. | ||
Respawn All (RespawnAll) | function | RPG Saga|Encounters | Brings every group back now (clears the defeated state). Also a button for PIE testing. | ||
Set Spawner Enabled (SetSpawnerEnabled) | function | RPG Saga|Encounters | bInEnabled: bool | Turns the spawner on (spawns its live groups) or off (removes them; their state is kept). | |
Uses Free Tactics (UsesFreeTactics) | pure | RPG Saga|Encounters | GroupIndex: int32 | bool | The group fights Free Tactics battles (this spawner's Free Tactics, or its encounter's battle mode). |
ARSEEncounterTrigger
Module RSE. A volume on the exploration map that starts a battle when the explorer walks in (D-026).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Force Start Encounter (ForceStartEncounter) | function | Encounter | Starts the encounter now, ignoring rules (PIE testing: select the trigger in the PIE outliner). | ||
Is Condition Met (IsConditionMet) | override | RPG Saga|Battle | bool | Story condition. Extension point: Phase 7 replaces the default with the unified Conditions system (CLAUDE.md 3.4). Default: always true. May be overridden in a Blueprint subclass meanwhile. | |
Reset Trigger (ResetTrigger) | function | Encounter | Clears the saved state (consumed, counters) and re-arms. | ||
Set Trigger Enabled (SetTriggerEnabled) | function | RPG Saga|Battle | bInEnabled: bool | Turns the trigger on or off (a disabled trigger never starts its battle). | |
Try Start Encounter (TryStartEncounter) | function | RPG Saga|Battle | bool | Starts the encounter if the rules allow it. |
ARSEExplorationCharacter
Module RSE. The party leader walking the world in exploration.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Settings (ApplySettings) | function | Exploration | Re-reads URSEExplorationSettings (speeds, camera). Also a button for live tuning in PIE. | ||
Get Camera Arm (GetCameraArm) | pure | RPG Saga|Exploration|Camera | URSEExplorationCameraArm* | The exploration camera's arm (D-113): zoom, style, the view a battle hands back. | |
Get Idle Intent (GetIdleIntent) | pure | RPG Saga|Party Field | FRSEIdleIntent | The idle action shown now (inactive = none). | |
Get Party Member (GetPartyMember) | pure | RPG Saga|Exploration | URSECharacterData* | Get Party Member | |
Is Fallen (IsFallen) | pure | RPG Saga|Exploration | bool | Is Fallen | |
Is Pawn Input Blocked by Screen (IsPawnInputBlockedByScreen) | pure | RPG Saga|Exploration | bool | D-152: a menu or another modal screen of this explorer's player is open (Exploration -> Block Pawn Input Under Screens): movement, camera and action input are ignored. Per local player. | |
Is Sneaking (IsSneaking) | pure | RPG Saga|Exploration | bool | Is Sneaking | |
On Interact (OnInteract) | event | RPG Saga|Exploration | Character: ARSEExplorationCharacter* | Examine / talk. Phase 7 routes this to interactables; for now Blueprints and level scripts may listen. | |
Refresh Appearance (RefreshAppearance) | function | Exploration | Looks like AppearanceOverride, else the party leader (first ATB formation member) through its character data (D-046); without an appearance the placeholder shape stays. Call after the party changes. | ||
Set Fallen (SetFallen) | function | RPG Saga|Exploration | bFallen: bool | Fallen (D-109): lies on the ground (the knock-out pose, or the placeholder tipped over) until revived. | |
Set Party Member (SetPartyMember) | function | RPG Saga|Exploration | Member: URSECharacterData* | The party member this character is (null = the party's leader: the first of the formation). | |
Set Sneaking (SetSneaking) | function | RPG Saga|Exploration | bSneak: bool | Sneaking: a slower walk, much harder to notice (Stealth settings). |
ARSEFreeTacticsCameraPawn
Module RSE. The tactical camera of Free Tactics battles (D-097), in the style of modern party tactics games: it orbits a focus point on the ground, rotates freely (steps or held input), zooms, pans relative to its yaw and glides to the active unit and the actions.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Focus On (FocusOn) | function | RPG Saga|Free Tactics|Camera | WorldLocation: FVectorbInstant: bool = false | Glides to a world location (or cuts at once). | |
Get Tilt Offset (GetTiltOffset) | pure | RPG Saga|Free Tactics|Camera | float | Get Tilt Offset | |
Glide To (GlideTo) | function | RPG Saga|Free Tactics|Camera | WorldLocation: FVectorSeconds: float | D-115: a short glide of the focus to WorldLocation over Seconds (real time, eased in and out) at the current zoom and angle: the turn change reframe. Seconds <= 0 = FocusOn. | |
Pan (Pan) | function | RPG Saga|Free Tactics|Camera | Input: FVector2DDeltaSeconds: float | Pans the focus: Input X = right, Y = forward relative to the camera's yaw. | |
Rotate By (RotateBy) | function | RPG Saga|Free Tactics|Camera | Degrees: float | Rotates by Degrees (held input, mouse drag). | |
Rotate Step (RotateStep) | function | RPG Saga|Free Tactics|Camera | Direction: float | Rotates by Free Tactics (Presentation) -> Camera Rotate Step in the sign of Direction. | |
Set Tilt Offset (SetTiltOffset) | function | RPG Saga|Free Tactics|Camera | Degrees: float | D-129: the exploration camera's tilt, kept on this camera's angle (degrees; positive = steeper). Not inside interiors. | |
Set Yaw (SetYaw) | function | RPG Saga|Free Tactics|Camera | Yaw: floatbInstant: bool = false | Sets the yaw (degrees) and optionally cuts to it. | |
Zoom (Zoom) | function | RPG Saga|Free Tactics|Camera | Amount: float | Positive zooms in (steps of Camera Zoom Step). |
ARSEFreeTacticsDirector
Module RSE. Presents a Free Tactics battle on the live map (D-097, docs/design/free-tactics.md sections 4-6) on every machine (D-141): plays the events back (walking along UnitMoved.Points, abilities through the battle cue player, falls, joins, the turn marker), the ground overlay (movement area, path, ability...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Answer Hazard Prompt (AnswerHazardPrompt) | function | RPG Saga|Free Tactics | bContinue: bool | Answers the warning: continue (the command goes to the host, which validates it again) or pick another path. | |
Cancel (Cancel) | function | RPG Saga|Free Tactics | Cancel: leaves Target (back to Move), closes a list. | ||
Confirm (Confirm) | function | RPG Saga|Free Tactics | Confirm: walk to the hovered point (Move), use the aimed ability (Target). | ||
End Player Turn (EndPlayerTurn) | function | RPG Saga|Free Tactics | Ends the player's turn (facing where the unit looks). | ||
Get Battle (GetBattle) | pure | RPG Saga|Free Tactics | URSEFreeTacticsBattle* | The battle this machine shows: the live one on the authority (single player, the host), the proxy on a guest (changing it there changes nothing: the host's state overwrites it). Presentation code reads GetBattleView. | |
Get Contact Point (GetContactPoint) | pure | RPG Saga|Free Tactics | FVector | Where the battle ring spread from. | |
Get Hazard Prompt Selection (GetHazardPromptSelection) | pure | RPG Saga|Free Tactics | int32 | The highlighted answer: 0 = continue, 1 = pick another path. | |
Get Hazard Prompt Text (GetHazardPromptText) | pure | RPG Saga|Free Tactics | FText | The warning ("Danger: not enough movement to go around. Crossing Fire: 30% Burn, ~12 damage. Continue?"). | |
Get HUDOpacity (GetHUDOpacity) | pure | RPG Saga|Free Tactics | float | Opacity of the battle HUD's panels now (they fade in with the entry). | |
Get Input Mode (GetInputMode) | pure | RPG Saga|Free Tactics | ERSEFreeInputMode | --- Player input (the controller, the HUD, dev commands) --- | |
Get Script Runner (GetScriptRunner) | pure | RPG Saga|Free Tactics | URSEBattleScriptRunner* | The battle's reinforcements and scripted events (the authority only; null on a guest and outside a battle). | |
Get Selected Target Id (GetSelectedTargetId) | pure | RPG Saga|Free Tactics|Targeting | int32 | The unit chosen for the aimed ability (INDEX_NONE = none). | |
Get Targeting View (GetTargetingViewBP) | pure | RPG Saga|Free Tactics|Targeting | FRSEFreeTargetingView | Blueprint: the targeting view. | |
Get Unit Actor (GetUnitActor) | pure | RPG Saga|Free Tactics | UnitId: int32 | AActor* | The world actor of a unit (null when none). |
Get Unit Id Of (GetUnitIdOf) | pure | RPG Saga|Free Tactics | Actor: AActor* | int32 | The unit an actor stands for (INDEX_NONE for none). |
Get Unit Name (GetUnitName) | pure | RPG Saga|Free Tactics | UnitId: int32 | FText | Get Unit Name |
Is Awaiting Player (IsAwaitingPlayer) | pure | RPG Saga|Free Tactics | bool | The player may act (a player unit's turn, nothing playing). | |
Is Battle Active (IsBattleActive) | pure | RPG Saga|Free Tactics | bool | Is Battle Active | |
Is Entry Playing (IsEntryPlaying) | pure | RPG Saga|Free Tactics | bool | The battle's entry (the ring spreading, the enemies turning, the HUD fading in) is still playing: the first turn waits. | |
Is Hazard Prompt Open (IsHazardPromptOpen) | pure | RPG Saga|Free Tactics | bool | A walk, jump or carrying ability waits for the player's answer to the danger warning. | |
Is Picking Unit (IsPickingUnit) | pure | RPG Saga|Free Tactics|Targeting | bool | A single-target ability is being aimed (units are picked, not ground points). | |
Is Proxy (IsProxy) | pure | RPG Saga|Free Tactics | bool | D-141: this machine presents another machine's battle (a guest). | |
On Callout (BP_OnCallout) | event | RPG Saga|Free Tactics | Callout: FRSEFreeCallout (ref) | A bark or an intent to show over a unit (Blueprint HUDs). | |
On Custom Menu Command (BP_OnCustomMenuCommand) | event | RPG Saga|Free Tactics | Command: FGameplayTagUnitId: int32 | ||
On Event Presented (BP_OnEventPresented) | event | RPG Saga|Free Tactics | Event: FRSEBattleEvent (ref) | A presented battle event (Blueprint). | |
On Notice (BP_OnNotice) | event | RPG Saga|Free Tactics | Notice: FInstancedStruct (ref) | Every notice this presenter received (Blueprint: a custom notice's presentation). | |
Select Target (SelectTarget) | function | RPG Saga|Free Tactics|Targeting | UnitId: int32 | bool | Chooses a unit for the aimed single-target ability (Next / Previous, the mouse, scripts). Returns false when it is no candidate. |
Set Hazard Prompt Selection (SetHazardPromptSelection) | function | RPG Saga|Free Tactics | Index: int32 | Set Hazard Prompt Selection | |
Show Ability Preview (ShowAbilityPreview) | function | RPG Saga|Free Tactics|Targeting | Player: APlayerController*EntryId: FName | Blueprint: preview an ability of the battle menu (custom menus); NAME_None clears it. |
ARSEFrontEndPlayerController
Module RSE. Player controller of the main menu map: shows the mouse cursor, puts input in UI-only mode with the main menu focused (keyboard, gamepad and mouse) and carries out the chosen entries: - Continue: loads the most recent save, fades out and opens its map (URSESaveFlowSubsystem); - New Game: resets the...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Transition Started (OnTransitionStarted) | override | RPG Saga|Front End | Called when a fade-out towards a new map or quitting starts (hook for sounds or music fades in Blueprint). |
ARSEGeneratedInterior
Module RSE. A generated interior (D-158, docs/product/buildings.md "Generated interiors"): the one actor of Buildings -> Generated Interior Map.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Built (ClearBuilt) | function | Generated Interior | Removes everything built. | ||
Get Kit Build Stats (GetKitBuildStats) | pure | RPG Saga|Buildings | FRSEKitBuildStats | D-164 / K7: counts and time of the last kit build. | |
Set View Floor (SetViewFloor) | function | RPG Saga|Buildings | Floor: int32 | Shows the floors up to Floor and hides the ones above it (the cutaway; -1 = all shown). |
ARSEIdleSpot
Module RSE. A place the visible party uses while the leader rests (D-129): a bench to sit on, a wall to lean on (Kind = Idle.Spot.Sit / Idle.Spot.Lean: a Use Spot behaviour walks there, faces the arrow and loops its animation), or a point of interest the members look at (Kind = Idle.Spot.Interest: a statue, a v...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Point Of Interest (IsPointOfInterest) | pure | RPG Saga|Party Field | bool | A point of interest: members look here (Interest kind, or Also Point Of Interest). |
ARSEInteractableActor
Module RSE. Something the player examines or talks to in exploration (exploration.md, "Interactiuni / NPC").
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Settings (ApplySettings) | function | RPG Saga|Interaction | Re-applies the range and reach to the volume (live tuning). | ||
Can Interact (Custom) (CanInteractCustom) | override | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Extra availability rule of a Blueprint subclass (the prompt shows only while it is true). Default: true. |
Can Interact Now (CanInteractBP) | pure | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Whether a pawn may interact now (enabled, prompt conditions, Can Interact (Custom)). |
Get Interactable Component (GetInteractableComponent) | pure | RPG Saga|Interaction | URSEInteractableComponent* | D-165: the component the interaction system focuses and runs (it asks this actor). | |
Get Prompt Text (GetPromptText) | pure | RPG Saga|Interaction | FText | The action shown in the prompt. | |
Interact (Interact) | function | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Runs the interaction and/or starts the dialog, now, on this machine: what the Interact command applies on the authority (D-138). Player input goes through RequestInteract. Returns false when it could not interact. |
On Interact (ReceiveInteract) | override | RPG Saga|Interaction | InteractingPawn: APawn*bSucceeded: bool | A custom interaction action (D-052): runs after the data (interaction, dialog, puzzle) when the player interacts. A Blueprint subclass that implements it is interactable even without any data (a lever, a switch, a shrine). | |
On Interacted (OnInteracted) | event | RPG Saga|Interaction | Interactable: ARSEInteractableActor*InteractingPawn: APawn*bSucceeded: bool | Raised after every interaction (Blueprint and level scripting hook). | |
Request Interact (RequestInteract) | function | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Interacts as the player of InteractingPawn through the command bus (D-138): applied at once in single player and on the host, sent to the host from a guest. Returns true when it was applied (or sent). |
Set Interaction Enabled (SetInteractionEnabled) | function | RPG Saga|Interaction | bInEnabled: bool | Turns the interaction on or off (off: no prompt, Interact does nothing). |
ARSEInteriorVolume
Module RSE. An interior (D-110): a house, a cave, a dungeon room.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Contains Point (ContainsPoint) | pure | RPG Saga|Interiors | WorldPoint: FVector | bool | Contains Point |
Find At (FindAt) | pure, static | RPG Saga|Interiors | WorldContextObject: UObject*WorldPoint: FVector | ARSEInteriorVolume* | The highest-priority interior volume containing WorldPoint (null when none). |
Get Box (GetBox) | pure | RPG Saga|Interiors | UBoxComponent* | Get Box | |
On View Changed (OnViewChanged) | event | RPG Saga|Interiors | Volume: ARSEInteriorVolume*bInside: bool | The view (exploration or battle camera) went into or out of this interior. |
ARSELadder
Module RSE. A ladder between two floors (D-110; a traversal link since D-121): a body climbs from Bottom Point to Top Point with its kind's motion and animations (Project Settings -> Traversal -> Default Ladder Kind unless the actor has its own).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get World Ends (GetWorldEnds) | pure | RPG Saga|Interiors | OutBottom: FVector (out)OutTop: FVector (out) | Both ends in the world (centimeters, on their floors). | |
Set Ladder Points (SetLadderPoints) | function | RPG Saga|Interiors | InBottom: FVectorInTop: FVector | Sets both ends (local, centimeters) and rebuilds the placeholder: scripts, level tools, tests. |
ARSELockableActor
Module RSE, display name RSE Lockable. A locked door or chest (D-109): its Lock data (difficulty, who may pick it, keys) plus keys of its own.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Lock (GetLock) | pure | RPG Saga|Exploration RPG | URSELockData* | Get Lock | |
Is Locked (IsLocked) | pure | RPG Saga|Exploration RPG | bool | Is Locked | |
On Lock Changed (OnLockChanged) | event | RPG Saga|Exploration RPG | Lockable: ARSELockableActor*bUnlocked: bool | ||
Reset Lock (ResetLock) | function | RPG Saga|Exploration RPG | Locked again (editor button, dev tools). | ||
Try Pick (TryPick) | function | RPG Saga|Exploration RPG | Member: URSECharacterData*bOutSuccess: bool (out) | bool | Picks the lock by chance with Member (null = the best member able to): the delegated command and Auto Resolve mode. Returns false when nobody may try. |
Unlock (Unlock) | function | RPG Saga|Exploration RPG | bAnimate: bool = true | Opens the lock (story, a key, a pick): its Unlock Effects run once. |
ARSENPC
Module RSE. A talkable NPC: an interactable with a body (a capsule, plus its Appearance as an animated character (D-046) or a placeholder mesh), a speaker component (cues and barks find it), facing the player while talking, and an optional proximity bark.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Combat Character (GetCombatCharacter) | pure | RPG Saga|Exploration RPG | URSECharacterData* | The character it fights as when a battle makes it a combatant (null = it never fights). | |
Get NPCId (GetNPCId) | pure | RPG Saga|Exploration RPG | FName | Its id for saves and requests: the living NPC id (else the actor's name). | |
Get NPCName (GetNPCName) | pure | RPG Saga|Exploration RPG | FText | Its name for notifications: its Object Name, else its speaker's name, else its id. | |
Get Pickpocket (GetPickpocket) | pure | RPG Saga|Exploration RPG | URSEPickpocketData* | What it carries for thieves (null = nothing to steal). | |
Get Talk Component (GetTalkComponent) | pure | RPG Saga|NPC | URSENPCTalkComponent* | D-165: its talking behavior (lines, greeting, facing), driven with this NPC's settings. | |
Is Defeated (IsDefeated) | pure | RPG Saga|Exploration RPG | bool | Is Defeated | |
Is Present (IsPresent) | pure | RPG Saga|Exploration RPG | bool | It is here and could talk (not away, not beaten, not hidden). | |
Say Line (SayLine) | function | RPG Saga|NPC | Kind: FGameplayTag | bool | Says a line from its bark pools over its head (its own, its NPC Type's, else the project's default pools, plus the global ones), of Kind when it has such a line (an invalid Kind = any). Local presentation, never blocking. Returns false when it has nothing to say now. |
ARSENPCPlace
Module RSE, display name NPC Place. Where living NPCs do their activities (D-104): a spot, an area or a route, found by Place Id from the NPCs' schedules (any actor tagged with the id works as a spot too).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Route Points (GetRoutePoints) | pure | RPG Saga|NPC | TArray<FVector> | The stops in world space (waypoints, else the spline sampled, else the place itself). |
ARSENetGameState
Module RSENet. A game state that carries the replicated state sections from the start (D-140).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Net State (GetNetState) | pure | RPG Saga|Co-op | URSENetStateComponent* | Get Net State |
ARSENetPlayerState
Module RSENet. A player state that carries the co-op identity and command transport from the start (D-140).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Net Player (GetNetPlayer) | pure | RPG Saga|Co-op | URSENetPlayerComponent* | Get Net Player |
ARSEPuzzleDoor
Module RSE. A locked door or mechanism (D-039): open while OpenConditions pass (e.g.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Open (IsOpen) | pure | RPG Saga|Puzzles | bool | The door is open now (its Open Conditions pass). | |
Refresh (Refresh) | function | RPG Saga|Puzzles | bAnimate: bool = true | Re-checks OpenConditions (also runs on every story or party change). |
ARSERandomEncounterArea
Module RSE. Classic random ATB battles while the explorer walks inside this volume (D-022, D-026).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Force Encounter (ForceEncounter) | function | Random Encounter | Starts one of the area's battles now (PIE testing). | ||
Set Area Enabled (SetAreaEnabled) | function | RPG Saga|Battle | bInEnabled: bool | Turns random battles in this area on or off. |
ARSERoamingEnemy
Module RSE. A visible enemy in the world (D-063): the leader of a spawner's group (behavior profile, detection, chase, alert) or one of its followers (walks behind the leader).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Awareness (GetAwareness) | pure | RPG Saga|Encounters | ERSEStealthAwareness | Unaware, suspicious or alerted (its leader's for followers; alerted while it hunts the party). | |
Get Detection (GetDetection) | pure | RPG Saga|Encounters | float | Its detection meter (0..1, full = it noticed the party). Followers share the leader's. | |
Get Group Index (GetGroupIndex) | pure | RPG Saga|Encounters | int32 | Group of the spawner it belongs to. | |
Get Roaming State (GetRoamingState) | pure | RPG Saga|Encounters | ERSERoamingState | What it is doing: idle, alerted, chasing, fleeing, returning, stunned (after a fled battle) or sleeping (far away). | |
Get Spawner (GetSpawner) | pure | RPG Saga|Encounters | ARSEEncounterSpawner* | The spawner that placed it (its group, battle and respawn). | |
Investigate (Investigate) | function | RPG Saga|Encounters | Point: FVectorSeconds: float | bool | Comes to look at Point for Seconds (a distraction, D-109): the group walks there, looks around and goes back. Ignored while it hunts the party (Exploration RPG -> Alerted Ignore Distractions), in a battle, as a corpse or stunned. Returns true when it goes to look. |
Is Aware Of Party (IsAwareOfParty) | pure | RPG Saga|Encounters | bool | It has noticed the party (alerted or chasing). | |
Is Leader (IsLeader) | pure | RPG Saga|Encounters | bool | It leads its group (followers walk behind the leader and share its awareness). | |
Is Unaware (IsUnaware) | pure | RPG Saga|Encounters | bool | Attacking it now counts as attacking unseen (its meter is below Stealth -> Unseen Below). |
ARSESavePoint
Module RSE. A save point in the world (D-010).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Use (Use) | function | Save Point | Uses the save point as if the player pressed Interact in range (PIE testing: select it in the PIE outliner). |
ARSESceneTrigger
Module RSE. A volume that plays a story scene when the player's pawn walks in (D-043).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Force Play (ForcePlay) | function | Scene | Plays the scene now, ignoring seen state and conditions (PIE testing: select the trigger in the PIE outliner). | ||
Try Play (TryPlay) | function | RPG Saga|Scenes | bool | Plays the scene if it is not seen and the conditions pass. Returns true when it was queued. |
ARSESurfaceSpot
Module RSE. A surface that lies in the level before any battle (D-112): the water of a ford, a puddle of oil by the barrels, a poison marsh.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get World Corners (GetWorldCorners) | pure | RPG Saga|Free Tactics|Field | OutCorners: TArray<FVector> (out) | The four corners of the rectangle on the ground (world, centimeters), or the circle's center repeated. | |
Set Spot Enabled (SetSpotEnabled) | function | RPG Saga|Free Tactics|Field | bInEnabled: bool | Turns the spot on or off (a drained ford, an oil puddle already burnt). |
ARSESwimVolume
Module RSE. A traversal volume placed in the level (D-121, docs/design/traversal.md): deep water by default.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Contains Point 2D (ContainsPoint2D) | pure | RPG Saga|Traversal | Point: FVector (ref) | bool | Whether a world point lies inside the box (in X and Y; any height up to the surface). |
Get Kind (GetKind) | pure | RPG Saga|Traversal | URSETraversalVolumeKindData* | The kind in use: the actor's own, else Project Settings -> Traversal -> Default Swim Kind. | |
Get Surface Z (GetSurfaceZ) | pure | RPG Saga|Traversal | float | Height of the surface (world, cm): the box's top. | |
Set Kind (SetKind) | function | RPG Saga|Traversal | InKind: URSETraversalVolumeKindData* | Sets the kind (scripts, level tools, tests). Null = the settings' default. |
ARSETacticsBattleDirector
Module RSE. Runs a Tactics encounter on a zone of the live map (D-009) and presents it (D-006).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin Encounter (BeginEncounter) | function | RPG Saga|Battle | Starts the encounter: deployment (or auto-deploy), or the legacy battle without encounter data. | ||
End Encounter (EndEncounter) | function | RPG Saga|Battle | Tears the current encounter down and returns to Idle without starting a new one (back to exploration). | ||
Get Battle (GetBattle) | pure | RPG Saga|Battle | URSETacticsBattle* | The running (or last) battle, or none. | |
Get Battle Outcome (GetBattleOutcome) | pure | RPG Saga|Battle | ERSEBattleOutcome | Outcome of the running or last battle (Ongoing without one). | |
Get Encounter (GetEncounterBP) | pure | RPG Saga|Battle | URSEEncounterData* | The encounter this director fights. | |
Get Last Rewards (GetLastRewards) | pure | RPG Saga|Battle | FRSEBattleRewards | What the last finished battle gave the party (experience, levels, items; D-030). Empty unless it was won. | |
Get Phase (GetPhase) | pure | RPG Saga|Battle | ERSEDirectorPhase | Idle, deployment, battle or finished. | |
Get Unit Actor (GetUnitActor) | pure | RPG Saga|Battle | UnitId: int32 | ARSEGridUnit* | The actor presenting a unit, or none. |
Get Unit Id (GetUnitId) | pure | RPG Saga|Battle | Actor: ARSEGridUnit* | int32 | Battle id of the unit an actor presents (-1 for none). |
Get Unit Name (GetUnitName) | pure | RPG Saga|Battle | UnitId: int32 | FText | Display name of a battle unit. |
Is Awaiting Command (IsAwaitingCommand) | pure | RPG Saga|Battle | bool | True when a player-controlled unit is waiting for a command (no events playing). | |
Is Playback Idle (IsPlaybackIdle) | pure | RPG Saga|Battle | bool | True when no events are waiting to be shown and nothing is being presented. | |
On Event Presented (BP_OnEventPresented) | event | RPG Saga|Battle | Event: FRSEBattleEvent (ref) | Fired when a battle event is shown (after playback ordering): damage numbers, custom HUDs, sounds. | |
Restart Encounter (RestartEncounter) | function | RPG Saga|Battle | Tears everything down and begins the encounter again. | ||
Set Encounter (SetEncounter) | function | RPG Saga|Battle | NewEncounter: URSEEncounterData* | bool | Replaces the encounter this director fights, only while no encounter runs (Idle): one battle site of a map can host another encounter (story tools, dev commands, D-079). Its unit coordinates must fit the site's zone. Returns false during an encounter. |
Start Battle (StartBattle) | function | RPG Saga|Battle | bool | Ends deployment and starts the battle. |
ARSETacticsZone
Module RSE. A pre-placed area of the live map that turns into a tactical battlefield (decision D-009).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Bake Grid (BakeGrid) | function | Tactics Zone | Rebuilds the grid by tracing level geometry, then applies TileOverrides. | ||
Clear Highlights (ClearHighlights) | function | Tactics Zone | Clears the selection highlights (danger, move, path, target and area layers, the cursor, the ability preview's layers). | ||
Measure Surface (MeasureSurface) | function | Tactics Zone | Measures the real surface under every tile again, without changing the grid (heights, walkability, terrain). |
ARSETimeOfDayActor
Module RSE, display name Time of Day & Weather. The sky of a level (D-101, docs/design/time-weather.md): drop it into any level.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Active Profile (GetActiveProfile) | pure | RPG Saga|Time | URSETimeOfDayProfile* | The profile in use (the actor's or the default). | |
Get Displayed Hour (GetDisplayedHour) | pure | RPG Saga|Time | float | The hour the sky shows now. | |
Recapture Sky (RecaptureSky) | function | RPG Saga|Time | Recaptures the sky light now. | ||
Snap Now (SnapNow) | function | RPG Saga|Time | Applies everything now without blending (after a skip, a load). |
ARSETrapActor
Module RSE, display name RSE Trap. A trap in the world (D-109): a pressure plate, a tripwire, a gas vent, an arrow trap (its Trap data).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Trap (GetTrap) | pure | RPG Saga|Exploration RPG | URSETrapData* | Get Trap | |
Get Trigger Radius (GetTriggerRadius) | pure | RPG Saga|Exploration RPG | float | The trap's size on the ground (cm): a party member touching it sets it off. | |
Is Armed (IsArmed) | pure | RPG Saga|Exploration RPG | bool | It can still go off (not disarmed, not spent). | |
Is Disarmed (IsDisarmed) | pure | RPG Saga|Exploration RPG | bool | Is Disarmed | |
Is Revealed (IsRevealed) | pure | RPG Saga|Exploration RPG | bool | Is Revealed | |
On Trap Disarmed (OnTrapDisarmed) | event | RPG Saga|Exploration RPG | Trap: ARSETrapActor*Member: URSECharacterData* | ||
On Trap Revealed (OnTrapRevealed) | event | RPG Saga|Exploration RPG | Trap: ARSETrapActor*Member: URSECharacterData* | ||
On Trap Triggered (OnTrapTriggered) | event | RPG Saga|Exploration RPG | Trap: ARSETrapActor*Member: URSECharacterData* | ||
Reset Trap (ResetTrap) | function | RPG Saga|Exploration RPG | Back to hidden and armed (editor button, dev tools). | ||
Reveal (Reveal) | function | RPG Saga|Exploration RPG | Member: URSECharacterData* | A member spotted it (Member null = found another way): the marker shows. | |
Set Off (SetOff) | function | RPG Saga|Exploration RPG | Victim: AActor* | Sets it off on Victim (a party pawn; null = the leader). | |
Try Disarm (TryDisarm) | function | RPG Saga|Exploration RPG | Member: URSECharacterData*bOutSuccess: bool (out) | bool | Tries to disarm it with Member (null = the best member able to). A failure may set it off (the trap's Failure Triggers). Returns false when nobody may try (then bOutSuccess is false too). |
ARSETraversalActor
Module RSE. A placed traversal link (D-121, docs/design/traversal.md): a ladder, a rope, a jump across a gap, a vault, a drop, a zip-line.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Direction From (GetDirectionFrom) | pure | RPG Saga|Traversal | Location: FVector (ref) | ERSETraversalDirection | The direction a body at Location would take: from the end nearer to it. |
Get Kind (GetKind) | pure | RPG Saga|Traversal | URSETraversalLinkKindData* | The kind in use: the actor's own, else the settings' default for its shape (GetDefaultKind). | |
Get World Path (GetWorldPath) | pure | RPG Saga|Traversal | Direction: ERSETraversalDirectionOutPoints: TArray<FVector> (out) | The link's points in the world (centimeters, feet positions), in the order a body takes them going Direction. | |
Is Bidirectional (IsBidirectional) | pure | RPG Saga|Traversal | bool | The link may be taken from the end point back to the start. | |
Set Kind (SetKind) | function | RPG Saga|Traversal | InKind: URSETraversalLinkKindData* | Sets the kind (scripts, level tools, tests). Null = the settings' default. | |
Set Ways (SetWays) | function | RPG Saga|Traversal | InWays: ERSETraversalWays | Sets which ways it may be taken. |
ARSETraversalLink
Module RSE. A generic placed link (D-121): Start Point, End Point and optional points in between, edited with the viewport widgets.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Set Link Points (SetLinkPoints) | function | RPG Saga|Traversal | InStart: FVectorInEnd: FVectorInVia: TArray<FVector> (ref) | Sets the points (local, centimeters): scripts, level tools, tests. |
ARSEWorldInteractable
Module RSE. A ready-made world object of the interaction library (D-150, docs/product/interaction-library.md): pick an Interactable Data asset (a chest, a campfire, a lantern, a signpost, a danger warning, an examine spot, a shrine, a gathering node, a viewpoint, an obstacle, a class-action object) and place it...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Danger Level (GetDangerLevel) | pure | RPG Saga|Interactables | float | How dangerous this place is (Danger Override, else the area's progression zone, else the settings' default). | |
Get Data (GetData) | pure | RPG Saga|Interactables | URSEInteractableData* | Get Data | |
Get State (GetState) | pure | RPG Saga|Interactables | FRSEInteractableSaveState | The saved state now. | |
Get Visual (GetVisual) | pure | RPG Saga|Interactables | ERSEInteractableVisual | The look now (Default, Active, Depleted). | |
On Reacted (OnReacted) | event | RPG Saga|Interactables | Interactable: ARSEWorldInteractable*Rule: FName | D-157: raised when an ability used on the world changed it (the rule's name). | |
On Used (OnUsed) | event | RPG Saga|Interactables | Interactable: ARSEWorldInteractable*Outcome: FRSEInteractableOutcome (ref) | Raised after every use on the authority (Blueprint and level scripting). | |
Refresh Now (RefreshNow) | function | Interactable | Re-reads the state and the clock and applies the look (live tuning). | ||
Set Data (SetData) | function | RPG Saga|Interactables | InData: URSEInteractableData* | Sets the kind (tools, Blueprint) and refreshes the look. |
ARSEZoneExit
Module RSE. A way to another map (D-044, docs/design/zones-travel.md): a road or a door with a destination map and arrival point.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Try Exit (TryExit) | function | RPG Saga|Travel | InteractingPawn: APawn* | ERSEZoneExitResult | Tries the exit for InteractingPawn's player through the Take Zone Exit command (D-138): on the authority, travel (after the question, if any; in co-op the group travel rule decides) or the blocked lines. On a guest the request goes to the host and the local evaluation is returned. |
URSEAIBattleBrain
Module RSECore. The AI state of one battle (D-056): per-unit boss phases and last stands, the team blackboards and the debugger's decision records.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Focus Target (GetFocusTarget) | pure | RPG Saga|AI | Team: FGameplayTag | int32 | The team's shared focus target, INDEX_NONE if none. |
Get Last Decision Record (GetLastDecisionRecord) | pure | RPG Saga|AI | OutRecord: FRSEAIDecisionRecord (out) | bool | The last AI decision of a unit with its scored options (debugger). |
Get Own Turns (GetOwnTurns) | pure | RPG Saga|AI | UnitId: int32 | int32 | Own turns a unit has started in this battle. |
Get Phase (GetPhase) | pure | RPG Saga|AI | UnitId: int32 | int32 | Boss phase of a unit: 0 = its base behaviour, N = the Nth phase entered. |
Get Support Threat (GetSupportThreat) | pure | RPG Saga|AI | Team: FGameplayTagEnemyId: int32 | float | Remembered threat of EnemyId to Team's Support units (tenths of their max HP). |
Get Team Value (GetTeamValue) | pure | RPG Saga|AI | Team: FGameplayTagKey: FNameDefault: float = 0.000000 | float | A value on a team's AI blackboard (custom AI rules share information through it). |
Set Team Value (SetTeamValue) | function | RPG Saga|AI | Team: FGameplayTagKey: FNameValue: float | Free blackboard values (custom Blueprint scorers can share state through them). |
URSEAIBlueprintLibrary
Module RSECore. Battle reads for Blueprint AI conditions and scorers (D-052, D-056): subclass URSEAICondition / URSEAIScorer in Blueprint, override IsMet / Score and query the battle through these nodes.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Are Enemies (AreEnemies) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitA: int32UnitB: int32 | bool | Whether two units are on different teams. |
Count Units (CountUnits) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)bAllies: boolMaxDistance: int32 = -1 | int32 | Active units on a side of the deciding unit within MaxDistance (negative = anywhere). Allies include the unit itself. |
Evaluate Scalar (EvaluateScalar) | pure, static | RPG Saga|AI | Scalar: FRSEAIScalar (ref)Intelligence: float | float | A profile's value of an AI scalar at an intelligence (configurator previews, custom scorers). |
Get Attribute (GetAttribute) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32Attribute: FGameplayTag | float | Final value of a unit's attribute (Stat.Attack, a derived or custom attribute). |
Get Context Battle (GetContextBattle) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref) | URSEBattle* | The battle of the context. |
Get Deciding Unit Id (GetDecidingUnitId) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref) | int32 | The unit deciding (the AI unit whose option is scored). |
Get Distance (GetDistance) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitA: int32UnitB: int32 | int32 | Distance between two units (tiles in Tactics, 0 in the classic modes). |
Get HPPercent (GetHPPercent) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32 | float | HP of a unit in percent of its maximum (0 if missing). |
Get Resource (GetResource) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32Resource: FGameplayTagOutPercent: float (out) | float | A resource of a unit (any configured resource: HP, MP, Resonance, Rage...): its value, and its percentage of the maximum. |
Get Target Id (GetTargetId) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref) | int32 | The option's primary target (-1 for team-level checks and phase triggers). |
Get Team Focus Target (GetTeamFocusTarget) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref) | int32 | The deciding unit's team focus target (INDEX_NONE if none). |
Get Unit (GetUnit) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32OutUnit: FRSEBattleUnit (out) | bool | A unit of the context's battle. False if it does not exist. |
Get Unit Ids (GetUnitIds) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)bAllies: bool | TArray<int32> | Active unit ids on a side of the deciding unit (allies include the unit itself). |
Has Status (HasStatus) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32Status: FGameplayTag | bool | Whether a unit has a status matching the tag. |
Is Weak To (IsWeakTo) | pure, static | RPG Saga|AI | Context: FRSEAIContext (ref)UnitId: int32Element: FGameplayTag | bool | Whether a unit is weak to an element. |
URSEAICondition
Module RSECore. A condition of an AI rule, a boss phase trigger or a composite (D-056).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Describe (Describe) | override | RPG Saga|AI | FString | Short text for the debugger and logs ("HP < 30% (Target)"). | |
Get Requirement Text (GetRequirementText) | override | RPG Saga|AI | FText | What the player reads when this condition keeps an ability disabled (D-082 Use Conditions): "Only below 30% HP", "Requires a Sword". Empty = no text of its own (the menu then shows a generic reason). | |
Is Met (IsMet) | override | RPG Saga|AI | Context: FRSEAIContext (ref) | bool | Whether the condition holds for the context (the unit deciding, the option's target). |
URSEAIDebugViewModel
Module RSE. In-game AI debugger (D-056): the last AI decision of the running battle (unit, profile, phase, intelligence, the best options with their score terms) and rank labels on the Tactics tiles.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Debugged Battle (GetDebuggedBattle) | pure | RPG Saga|UI|AIDebug | URSEBattle* | Get Debugged Battle | |
Toggle Debugger (ToggleDebugger) | function | RPG Saga|UI|AIDebug | Turns RSE.AI.Debug on or off. |
URSEAIDecisionPolicy
Module RSECore, display name Custom Decision Policy (Blueprint). D-168: the last word on a unit's decisions, for special enemies scripted without changing the AI.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Override Decision (OverrideDecision) | override | RPG Saga|AI | Context: FRSEAIContext (ref)Options: TArray<FRSEAIOptionView> (ref)ChosenIndex: int32OutIndex: int32 (out) | bool | Final choice. Options are best first; ChosenIndex is the utility's pick. Return true and set OutIndex to choose another option (an invalid index keeps the pick). Context: the unit deciding, the intelligence, the brain (TargetId empty). |
Override Target (OverrideTarget) | override | RPG Saga|AI | Context: FRSEAIContext (ref)Candidates: TArray<int32> (ref)OutTargetId: int32 (out) | bool | Target of the chosen ability. Candidates: every unit the same ability (or item) was scored on, from the same place, best first; Context.TargetId is the current target and Context.Ability the ability. Return true and set OutTargetId to aim it at another candidate (not a candidate = kept). |
URSEAIInterop
Module RSE. Our AI for the buyer's AI (D-175, docs/product/ai-interop.md): what the Behavior Tree tasks, decorators and services, and the StateTree companion's tasks call.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Actor Has Status (ActorHasStatus) | pure, static | RPG Saga|AI Interop | Actor: AActor*Status: FGameplayTag | bool | Actor's battle unit has a status that matches Status (parents match children). False outside a battle. |
Claim Battle Side (ClaimBattleSide) | function, static | RPG Saga|AI Interop | Controller: AAIController*Team: FGameplayTag | The AI controller becomes the brain of one side of the battle (Team): its tree plays that side's units, one at a time (Grid Tactics: the active unit; ATB: a ready unit), and the framework's AI leaves them alone. | |
Execute Decision (ExecuteDecision) | function, static | RPG Saga|AI Interop | Actor: AActor*Decision: FRSEAIInteropDecision (ref) | bool | Runs a decision picked for Actor on its battle (the authority). Returns true when the battle took it. |
Get Actor Battle Mode (GetActorBattleMode) | pure, static | RPG Saga|AI Interop | Actor: AActor*OutMode: ERSEAIInteropMode (out) | bool | The battle mode Actor's unit fights in. Returns false outside a battle. |
Is Actor in Battle (IsActorInBattle) | pure, static | RPG Saga|AI Interop | Actor: AActor* | bool | Actor is a unit of a running battle (a live Free Tactics battle, or one a project registered). |
Is Actors Turn (IsActorsTurn) | pure, static | RPG Saga|AI Interop | Actor: AActor* | bool | It is Actor's unit's turn in its battle. |
Pick Best Action For (PickBestActionFor) | function, static | RPG Saga|AI Interop | Actor: AActor*Intelligence: floatOutDecision: FRSEAIInteropDecision (out) | bool | What our AI would do with Actor's turn now. Intelligence negative = the battle's own (false when the battle states none: pass a value 0-1). Read it, then call Execute Decision, or act on it yourself. |
Release Battle Side (ReleaseBattleSide) | function, static | RPG Saga|AI Interop | Controller: AAIController* | The side goes back to the framework's AI. |
URSEAIScorer
Module RSECore. A custom consideration added to the score of every ability option (D-056): Weight x Score(context).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Score (Score) | override | RPG Saga|AI | Context: FRSEAIContext (ref) | float | Raw value of the option in Context (the option's target and ability are set). |
URSEAIStyleLibrary
Module RSECore. D-168: building AI styles without code (the AI Style wizard, scripts and tests use the same functions).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Sliders (ApplySliders) | function, static | RPG Saga|AI | Profile: URSEAIProfile*Sliders: FRSEAIStyleSliders (ref) | Turns the sliders into Profile's weights. Profile must hold the base style's values (a copy of it): the sliders scale them, so applying twice compounds. Stores Sliders in Profile->StyleSliders. | |
Make Boss Phase (MakeBossPhase) | pure, static | RPG Saga|AI | Step: FRSEAIBossStep (ref) | FRSEAIPhase | The boss phase a simple step stands for. |
Make Boss Step (MakeBossStep) | pure, static | RPG Saga|AI | Phase: FRSEAIPhase (ref) | FRSEAIBossStep | A phase as a simple step (its first trigger and first summon; what a step cannot express is left out). |
Set Boss Steps (SetBossSteps) | function, static | RPG Saga|AI | Profile: URSEAIProfile*Steps: TArray<FRSEAIBossStep> (ref) | Replaces Profile's phases with Steps (in order) and marks it a boss style. Empty Steps keeps no phases. |
URSEATBHUDViewModel
Module RSE. The classic battle HUD (ATB and turn-based, D-021 / D-022 / D-050, D-052): party rows with resources and gauges, enemy chips, command menu, target preview and marker, time mode or round, turn order strip, log, banner, key prompts.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Choose Command (ChooseCommand) | function | RPG Saga|UI|Battle HUD | Index: int32 | Choose Command | |
Choose Target (ChooseTarget) | function | RPG Saga|UI|Battle HUD | UnitId: int32 | While a target is chosen: aims at UnitId and confirms (click on its chip). | |
Choose Target Entry (ChooseTargetEntry) | function | RPG Saga|UI|Battle HUD | Index: int32 | While a target is chosen: picks target list entry Index and confirms (click on the row). | |
Hover Command (HoverCommand) | function | RPG Saga|UI|Battle HUD | Index: int32 | Hover Command | |
Hover Target (HoverTarget) | function | RPG Saga|UI|Battle HUD | UnitId: int32 | While a target is chosen: aims at UnitId (mouse over its chip). | |
Hover Target Entry (HoverTargetEntry) | function | RPG Saga|UI|Battle HUD | Index: int32 | While a target is chosen: puts the cursor on target list entry Index (mouse over the row). | |
Toggle Time Mode (ToggleTimeMode) | function | RPG Saga|UI|Battle HUD | Switches Wait / Active (the hint's key does the same). |
URSEAbilityReaction
Module RSECore, display name Reaction. An automatic response of a unit (D-055): counterattack, overwatch, on-hit / on-death triggers.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Trigger (CanTrigger) | override | RPG Saga|Abilities|Reactions | Battle: URSEBattle*ReactorId: int32TriggerUnitId: int32 | bool | Custom rule on top of the fields above (Blueprint subclasses). Default: true. |
URSEAbilityTestLibrary
Module RSECore. Test ability (D-167): runs an ability headless in mini battles and measures it.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Ability Test Report to Text (AbilityTestReportToText) | pure, static | RPG Saga|Abilities|Test | Report: FRSEAbilityTestReport (ref) | FString | The report as plain text (logs, Python, copy to clipboard). |
Get Ability Test Presets (GetAbilityTestPresets) | pure, static | RPG Saga|Abilities|Test | TArray<FRSEAbilityTestPreset> | The target presets of Ability Test settings. | |
Make Ability Test Request (MakeAbilityTestRequest) | pure, static | RPG Saga|Abilities|Test | Ability: URSEAbilityData*Mode: FGameplayTag | FRSEAbilityTestRequest | A request for Ability with the settings' defaults (caster, default preset, Tactics, default level and runs). |
Resolve Test Character (ResolveTestCharacter) | pure, static | RPG Saga|Abilities|Test | Source: URSEPrimaryDataAsset* | URSECharacterData* | The character a test unit source stands for: the character itself, or an archetype's template character. |
Run Ability Test (RunAbilityTest) | function, static | RPG Saga|Abilities|Test | Request: FRSEAbilityTestRequest (ref) | FRSEAbilityTestReport | Uses Request.Ability Runs times, each in a fresh mini battle of the chosen mode (seed Seed + run), from the caster on its targets, and measures it: hits, damage and healing ranges, statuses with the chance that landed, costs, the area, and a step-by-step trace of the first run. Headless and deterministic: the same request always gives the same report. |
URSEActionAIController
Module RSECore. The real-time AI of action battles (A2, D-171; docs/design/action-battle.md): the shared utility AI (profiles, roles, scorers, gates, intelligence curves, rules, boss phases, the Decision Policy hook) adapted to real time.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Party Order (ApplyPartyOrderBP) | function | RPG Saga|Action AI | Command: FRSEActionPartyOrderCommand (ref)OutReason: FText (out) | bool | Blueprint form of ApplyPartyOrder. |
Get Battle (GetBattle) | pure | RPG Saga|Action AI | URSEActionBattle* | Get Battle | |
Get Intelligence (GetIntelligence) | pure | RPG Saga|Action AI | UnitId: int32 | float | The intelligence a unit decides with: its team's, else the party's (Action AI -> Party Intelligence) or Default Intelligence. |
Get Intent (GetIntent) | pure | RPG Saga|Action AI | UnitId: int32OutIntent: FRSEActionAIIntent (out) | bool | The unit's current decision. Returns false when there is none. |
Get Leader (GetLeader) | pure | RPG Saga|Action AI | UnitId: int32 | int32 | The unit a member's order refers to (the issuing player's unit), INDEX_NONE if none. |
Get Party Order (GetPartyOrder) | pure | RPG Saga|Action AI | UnitId: int32 | ERSEActionPartyOrder | A member's order (Action AI -> Default Party Order until one is given). |
Get Unit Memory (GetMemoryBP) | pure | RPG Saga|Action AI | UnitId: int32OutMemory: FRSEActionAIUnitMemory (out) | bool | Memory of a unit. Returns false if the controller never saw it. |
Initialize (Initialize) | function | RPG Saga|Action AI | InBattle: URSEActionBattle*SeedSalt: int32 = 0 | Starts driving Battle. SeedSalt: mixed into the battle's seed (two controllers on one battle decide independently). | |
Is Driving (IsDriving) | pure | RPG Saga|Action AI | UnitId: int32 | bool | Whether the AI drove the unit on the last step. |
Request Decision (RequestDecision) | function | RPG Saga|Action AI | UnitId: int32 | Makes the unit decide again on the next Think (a script moved it, its target changed). | |
Run (Run) | function | RPG Saga|Action AI | MaxSeconds: float | bool | Runs the battle (Think, then one step) until it ends or MaxSeconds of battle time pass. Returns true when it ended. |
Set Party Order (SetPartyOrder) | function | RPG Saga|Action AI | UnitId: int32Order: ERSEActionPartyOrderIssuer: FRSEPlayerId | bool | Orders one party member (host side; guests go through FRSEActionPartyOrderCommand). Returns false for an invalid unit. |
Set Team Intelligence (SetTeamIntelligence) | function | RPG Saga|Action AI | Team: FGameplayTagIntelligence: float | Intelligence (0-1, D-007) of a team's units (the adaptive value of the side it plays). | |
Set Team Party Order (SetTeamPartyOrder) | function | RPG Saga|Action AI | Team: FGameplayTagOrder: ERSEActionPartyOrderIssuer: FRSEPlayerId | int32 | Orders every member of Team. Returns how many were ordered. |
Think (Think) | function | RPG Saga|Action AI | Decides, executes and reacts for every driven unit (call before every battle step; host only). |
URSEActionAgent
Module RSE. RSE Action Agent
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Accept Action Order (CanAcceptActionOrder) | override | RPG Saga|Action Agent | bool | The pawn can take an order now (alive, not stunned, not locked in an animation). The AI waits when it cannot. | |
Get Action Battle Control (GetActionBattleControl) | override | RPG Saga|Action Agent | ERSEActionAgentControl | Who plays this pawn's unit in an action battle: the framework's AI (default), or the pawn's own brain. Read when the unit joins. | |
Is Busy with Order (IsBusyWithOrder) | override | RPG Saga|Action Agent | bool | An order is still being carried out (a walk in progress, an ability playing). | |
On Action Battle Joined (OnActionBattleJoined) | override | RPG Saga|Action Agent | UnitId: int32 | The pawn's unit joined an action battle (UnitId is its id there; the nodes find it from the pawn, this is for Blueprint brains). | |
On Action Battle Left (OnActionBattleLeft) | override | RPG Saga|Action Agent | The action battle ended (or the unit left it). | ||
Order Move To (OrderMoveTo) | override | RPG Saga|Action Agent | WorldLocation: FVector (ref)AcceptanceRadius: float | bool | Walk (or run) to WorldLocation and stop within AcceptanceRadius (cm). Returns true when the pawn took the order. |
Order Stop (OrderStop) | override | RPG Saga|Action Agent | Cancels the order in progress (movement and a started ability that can still be cancelled). | ||
Order Use Ability (OrderUseAbility) | override | RPG Saga|Action Agent | Ability: URSEAbilityData*TargetActor: AActor*TargetLocation: FVector (ref) | bool | Use Ability on TargetActor (null: at TargetLocation, a point in the world). The pawn plays it with its own animation and combat code. Returns true when the pawn took the order. |
URSEActionAgents
Module RSE. The action agent of an actor: the actor itself when it implements IRSEActionAgent, else its component that does.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Agent Use Ability (AgentUseAbility) | function, static | RPG Saga|Action Agent | Actor: AActor*Ability: URSEAbilityData*TargetActor: AActor*TargetLocation: FVector | bool | Orders Actor's agent to use an ability. Returns false when Actor is not an agent or it did not take the order. |
Can Agent Accept Order (CanAgentAcceptOrder) | pure, static | RPG Saga|Action Agent | Actor: AActor* | bool | The agent can take an order now (false for a non-agent). |
Find Action Agent (FindActionAgent) | pure, static | RPG Saga|Action Agent | Actor: AActor* | UObject* | The object that answers IRSEActionAgent for Actor (the actor, or its component), or null. |
Get Battle Control (GetBattleControl) | pure, static | RPG Saga|Action Agent | Actor: AActor* | ERSEActionAgentControl | Who plays Actor's unit in action battles (Framework for a non-agent). |
Is Action Agent (IsActionAgent) | pure, static | RPG Saga|Action Agent | Actor: AActor* | bool | Actor implements the interface itself or through a component. |
Is Agent Busy (IsAgentBusy) | pure, static | RPG Saga|Action Agent | Actor: AActor* | bool | The agent is still carrying out an order (false for a non-agent). |
Move Agent To (MoveAgentTo) | function, static | RPG Saga|Action Agent | Actor: AActor*WorldLocation: FVectorAcceptanceRadius: float = 50.000000 | bool | Orders Actor's agent to move. Returns false when Actor is not an agent or it did not take the order. |
Stop Agent (StopAgent) | function, static | RPG Saga|Action Agent | Actor: AActor* | Stops Actor's agent. |
URSEActionBattle
Module RSECore. Headless real-time action battle (D-171, docs/design/action-battle.md): the sixth battle mode, from sword fights to RPG shooters, on the same party, abilities, items, damage pipeline, statuses (control statuses included, D-167) and objectives as the other modes (URSEBattle).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Advance (Advance) | function | RPG Saga|Action Battle | DeltaSeconds: float | Advances simulated time in fixed steps (the remainder is kept for the next call). | |
Assign Controller (AssignController) | function | RPG Saga|Action Battle | UnitId: int32Player: FRSEPlayerId | Gives Player command of a unit (the driver at the start; None = the AI). No event. | |
Can Use Ability (CanUseAbility) | pure | RPG Saga|Action Battle | UnitId: int32Ability: URSEAbilityData* | ERSEActionCommandResult | Whether UnitId could use Ability now (ignoring targets): busy, statuses, cooldown or gauge, stamina, costs, requirements. |
Execute Command (ExecuteCommand) | function | RPG Saga|Action Battle | Command: FRSEActionCommand (ref) | ERSEActionCommandResult | Validates and applies one decision (the only way a controller changes the battle). Ok / Queued = accepted. |
Get Action State (GetActionStateBP) | pure | RPG Saga|Action Battle | UnitId: int32OutState: FRSEActionUnitState (out) | bool | The real-time state of a unit. Returns false for an unknown unit. |
Get Attack Reach (GetAttackReach) | pure | RPG Saga|Action Battle | UnitId: int32 | float | How far a unit's plain attack reaches (combo step hitbox, fire mode range or the basic attack's reach), for AI and HUDs. |
Get Claim Count (GetClaimCount) | pure | RPG Saga|Action Battle | Result: ERSEActionClaimResult | int32 | How many hit claims ended with Result so far (accepted ones as Accepted; anti-abuse statistics). |
Get Controlled Unit (GetControlledUnit) | pure | RPG Saga|Action Battle | Player: FRSEPlayerId | int32 | The unit Player commands (INDEX_NONE if none). |
Get Cooldown Remaining (GetCooldownRemaining) | pure | RPG Saga|Action Battle | UnitId: int32Ability: URSEAbilityData* | float | Seconds until Ability is ready for UnitId again (0 = ready, or not on cooldown pacing). |
Get Elapsed Time (GetElapsedTime) | pure | RPG Saga|Action Battle | float | Battle seconds simulated so far. | |
Get Last Claim Check (GetLastClaimCheck) | pure | RPG Saga|Action Battle | FRSEActionClaimCheck | What the last hit claim the battle applied or refused found (tests, logs, the HUD's "miss"). | |
Get Obstacles (GetObstacles) | pure | RPG Saga|Action Battle | TArray<FRSEActionObstacle> | The obstacles of the headless space (see SetObstacles). | |
Get Projectiles (GetProjectiles) | pure | RPG Saga|Action Battle | TArray<FRSEActionProjectile> | Projectiles in flight. | |
Get Resolved Rules (GetResolvedRules) | pure | RPG Saga|Action Battle | Ability: URSEAbilityData* | FRSEAbilityActionRules | The action rules Ability uses in this battle (its own, or derived from its other rules). |
Get Unit Controller (GetUnitController) | pure | RPG Saga|Action Battle | UnitId: int32 | FRSEPlayerId | The player commanding a unit (None = the AI). |
Get Unit Gap (GetUnitGap) | pure | RPG Saga|Action Battle | UnitA: int32UnitB: int32 | float | Edge-to-edge distance between two units on the ground plane (meters; a large value when one is missing). |
Get Unit Move Speed (GetUnitMoveSpeed) | pure | RPG Saga|Action Battle | UnitId: int32 | float | Walking speed of a unit when the battle moves it itself (meters per second; 0 for an unknown unit). |
Get Unit Place At (GetUnitPlaceAt) | pure | RPG Saga|Action Battle | UnitId: int32Time: floatOutLocation: FVector (out)OutYaw: float (out) | bool | A unit's place at a battle time from the host's position history (A6). Returns false without history for the unit. |
Is Open Flow (IsOpenFlow) | pure | RPG Saga|Action Battle | bool | No results screen in this framing (Open): the presentation shows loot toasts instead. | |
Set Auto Resolve Hits (SetAutoResolveHits) | function | RPG Saga|Action Battle | bAuto: bool | On (default): the battle tests its own hit shapes. Off: hits come only from hit claims (the presentation's traces). | |
Set Battle Area (SetBattleArea) | function | RPG Saga|Action Battle | Center: FVector (ref)Radius: float = 0.000000 | The combat area of a Bounded battle (center; radius 0 = the rules' Bounded Area Radius). | |
Set Obstacles (SetObstacles) | function | RPG Saga|Action Battle | InObstacles: TArray<FRSEActionObstacle> (ref) | Round obstacles of the headless space (A2): units walk around them, shots and projectiles stop at the ones that block shots, the AI uses them as cover. Only read while the battle moves units / resolves hits itself; the presentation's world has its own geometry and leaves this empty. | |
Set Simulate Movement (SetSimulateMovement) | function | RPG Saga|Action Battle | bSimulate: bool | On (default): the battle moves units from their move input and dodges (headless). Off: the presentation reports places. | |
Set Unit Transform (SetUnitTransform) | function | RPG Saga|Action Battle | UnitId: int32Location: FVector (ref)Yaw: float | The presentation reports where a unit's pawn stands (authority only; ignored on a proxy). Call it every frame or step while Simulate Movement is off. | |
Set Unit Weapon (SetUnitWeapon) | function | RPG Saga|Action Battle | UnitId: int32Weapon: URSEActionWeaponData* | Gives a unit an action weapon for this battle (null = back to its equipment / the default). |
URSEActionBattleSubsystem
Module RSE. Action battles on the live map (D-171, package A3): starts them where the party stands (an Action encounter from exploration: a trigger, a story effect, a dev command), gathers who takes part (the leader, the party members nearby, the encounter's enemies in the world or in front of the party), owns...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Active Director (GetActiveDirector) | pure | RPG Saga|Action Battle | ARSEActionBattleDirector* | The director of the running battle (authority or guest), or null. | |
Is Battle Active (IsBattleActive) | pure | RPG Saga|Action Battle | bool | Is Battle Active | |
Start Encounter Battle (StartEncounterBattle) | function | RPG Saga|Action Battle | Encounter: URSEEncounterData*EnemyActors: TArray<AActor*> (ref)Source: AActor* = NoneReturnPoint: AActor* = None | bool | Starts an action battle with Encounter's enemies where the party stands. EnemyActors stand for its enemies in order; missing ones appear in front of the party. Source gets the exploration's callback; ReturnPoint (optional) is where the explorer stands afterwards. Returns false when a battle cannot start now. |
URSEActionCombatComponent
Module RSE, display name RSE Action Combat. "RSE Action Combat" (D-171, package A3; docs/product/components.md): what a character does in real-time action battles, on any pawn (our characters, a project's own Blueprint characters through IRSEExplorerPawn).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Action Combat (FindActionCombat) | pure, static | RPG Saga|Action Battle | Actor: AActor* | URSEActionCombatComponent* | The action combat component of Actor, or null. |
Get Character Mesh (GetCharacterMesh) | pure | RPG Saga|Action Battle | USkeletalMeshComponent* | The character's main skeletal mesh (the character's mesh, else its first skeletal mesh). | |
Get Director (GetDirector) | pure | RPG Saga|Action Battle | ARSEActionBattleDirector* | Get Director | |
Get Muzzle Location (GetMuzzleLocation) | pure | RPG Saga|Action Battle | FVector | Where this character's shots start now (world). | |
Get Unit Id (GetUnitId) | pure | RPG Saga|Action Battle | int32 | The unit this character is in the running action battle (INDEX_NONE outside one). | |
Is Hit Window Open (IsHitWindowOpen) | pure | RPG Saga|Action Battle | bool | An attack of this character can land now (its hit window is open). | |
Is in Action Battle (IsInActionBattle) | pure | RPG Saga|Action Battle | bool | Is in Action Battle | |
On Action Event (OnActionEvent) | event | RPG Saga|Action Battle | Event: FRSEBattleEvent (ref) | Every battle event about this character (it acts, it is hit, it guards...), after the component reacted. | |
On Hit Claimed (OnHitClaimed) | event | RPG Saga|Action Battle | Victim: AActor*Location: FVector | This machine claimed a hit of this character's attack (the host decides whether it lands). |
URSEActionControlsComponent
Module RSE, display name RSE Action Controls. "RSE Action Controls" (D-171, package A3): one local player's controls in an action battle, on their player controller.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Look (AddLook) | function | RPG Saga|Action Battle | YawDegrees: floatPitchDegrees: float | Turns the view (degrees). | |
Cycle Party Order (CyclePartyOrder) | function | RPG Saga|Action Battle | bool | Gives the party the next order of Party Order Cycle (after the last one this player gave). | |
Find Action Controls (FindActionControls) | pure, static | RPG Saga|Action Battle | Controller: APlayerController* | URSEActionControlsComponent* | The controls of Controller (null when it has none). |
Get Camera Rig (GetCameraRig) | pure | RPG Saga|Action Battle | ARSEActionCameraRig* | Get Camera Rig | |
Get Controlled Unit (GetControlledUnit) | pure | RPG Saga|Action Battle | int32 | The unit this player commands now (INDEX_NONE without one). | |
Get Last Party Order (GetLastPartyOrder) | pure | RPG Saga|Action Battle | ERSEActionPartyOrder | The last party order this player gave (the rules' Default Party Order before any). | |
Get Lock Target (GetLockTarget) | pure | RPG Saga|Action Battle | int32 | The hard-locked unit (INDEX_NONE = none). | |
Get Mapping Context (GetMappingContext) | pure | RPG Saga|Action Battle | UInputMappingContext* | The mapping context the controls use (built from the settings' keys unless one is set there). | |
Get Selectable Abilities (GetSelectableAbilities) | pure | RPG Saga|Action Battle | TArray<URSEAbilityData*> | The abilities the selection cycles through (the controlled unit's, without its basic attack). | |
Get Selected Ability (GetSelectedAbility) | pure | RPG Saga|Action Battle | URSEAbilityData* | Get Selected Ability | |
Get Soft Target (GetSoftTarget) | pure | RPG Saga|Action Battle | int32 | The enemy an attack would turn to now without a hard lock (INDEX_NONE = none). | |
Is Action Input Active (IsActionInputActive) | pure | RPG Saga|Action Battle | bool | The action mapping context is active for this player. | |
Is Aiming (IsAiming) | pure | RPG Saga|Action Battle | bool | Is Aiming | |
Is Guarding (IsGuarding) | pure | RPG Saga|Action Battle | bool | Is Guarding | |
Issue Party Order (IssuePartyOrder) | function | RPG Saga|Action Battle | Order: ERSEActionPartyOrderUnitId: int32 = -1 | bool | Gives a party order (A2) as this player: UnitId INDEX_NONE = every member the AI drives on the player's side. Goes through the command bus (a guest's to the host); Co-op Rules -> Companion Orders decides who may order whom. Returns true when applied (or forwarded by a guest). |
Lock on Unit (LockOnUnit) | function | RPG Saga|Action Battle | TargetUnitId: int32 | bool | Hard lock on a unit (INDEX_NONE releases). Returns whether the battle accepted it. |
On Action Input (OnActionInput) | event | RPG Saga|Action Battle | Input: ERSEActionInputbPressed: bool | Every input of this player (Blueprint reactions, tutorials). | |
On Party Order Issued (OnPartyOrderIssued) | event | RPG Saga|Action Battle | Order: ERSEActionPartyOrderbAccepted: bool | A party order this player gave (HUD feedback, tutorials). | |
Press Input (PressInput) | function | RPG Saga|Action Battle | Input: ERSEActionInputbPressed: bool = true | Presses (or releases) an input as if its key did. | |
Switch Character (SwitchCharacter) | function | RPG Saga|Action Battle | Direction: int32 = 1 | bool | Takes command of the next party member (Direction > 0) or the previous. |
Switch Target (SwitchTarget) | function | RPG Saga|Action Battle | Direction: int32 | bool | The next target to the right (Direction > 0) or left. |
Toggle Lock On (ToggleLockOn) | function | RPG Saga|Action Battle | bool | Locks on the best target (or releases the lock). Returns true when locked now. |
URSEActionInterop
Module RSE. AI interop for action battles (D-175 / D-171, package B2): what the Behavior Tree nodes, the StateTree nodes and Blueprints call to play a unit of a real-time battle with the project's own brain: attacks, abilities, dodge / block / parry, walking to and keeping a range, and the questions those decis...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Action Attack (ActionAttack) | function, static | RPG Saga|Action Interop | Actor: AActor*Target: AActor*bHeavy: bool = false | bool | The actor's unit starts the weapon's attack on Target (lock-on, facing, combo step or shot). Returns true when the battle took it. |
Action Block (ActionBlock) | function, static | RPG Saga|Action Interop | Actor: AActor*bRaise: bool | bool | The actor's unit raises or lowers its guard. |
Action Dodge (ActionDodge) | function, static | RPG Saga|Action Interop | Actor: AActor*WorldDirection: FVector | bool | The actor's unit dodges toward a world direction (zero = away from the incoming attack). |
Action Has Incoming Threat (ActionHasIncomingThreat) | pure, static | RPG Saga|Action Interop | Actor: AActor*MaxSecondsToHit: float = 0.000000 | bool | An attack is on its way to the actor's unit that it has not answered yet. |
Action Is Target in Reach (ActionIsTargetInReach) | pure, static | RPG Saga|Action Interop | Actor: AActor*Target: AActor*Ability: URSEAbilityData*MarginCm: float = 0.000000 | bool | The actor's weapon (or the ability) reaches Target from where they stand. |
Action Parry (ActionParry) | function, static | RPG Saga|Action Interop | Actor: AActor* | bool | The actor's unit opens a parry window. |
Action Set Own AI (ActionSetOwnAI) | function, static | RPG Saga|Action Interop | Actor: AActor*bOwnAI: bool | bool | The actor's unit is played by the project's own brain (true) or by the framework's action AI (false). |
Action Use Ability (ActionUseAbility) | function, static | RPG Saga|Action Interop | Actor: AActor*Ability: URSEAbilityData*Target: AActor*Location: FVector | bool | The actor's unit uses an ability on Target (or at Location). Returns true when the battle took it. |
URSEActionRules
Module RSECore, display name Action Battle. Real-time action battles (D-171, docs/design/action-battle.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Preset (ApplyPreset) | function | RPG Saga|Action Battle | Preset: ERSEActionPreset | Sets every rule to a shipped starting point (Melee, Shooter, Hybrid). The weapon is left as it is. |
URSEActionSimDriver
Module RSE. The server side of an action battle (D-171, package A3; the D-141 split of the live battles): owns the headless battle (URSEActionBattle) and runs it on the authority only (single player, the host).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get AI (GetAI) | pure | RPG Saga|Action Battle | URSEActionAIController* | The real-time AI of this battle (null before BeginBattle and after EndBattle). | |
Get Battle (GetBattle) | pure | RPG Saga|Action Battle | URSEActionBattle* | Get Battle |
URSEAppLifecycleSubsystem
Module RSE. The game's reaction to platform events (D-170), in each game world: listens to URSEPlatformUserSubsystem (RSECore) and - controller disconnect of the primary user: pauses the world (through URSETimeControlSubsystem, so co-op never pauses for everyone) and opens the reconnect screen (Platform ->...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Reconnect View Model (GetReconnectViewModel) | pure | RPG Saga|Platform | URSEReconnectViewModel* | The reconnect screen's view-model while it is open (null otherwise). | |
Hide Reconnect Prompt (HideReconnectPrompt) | function | RPG Saga|Platform | Closes the reconnect screen and releases its pause. | ||
Is Paused for Platform (IsPausedForPlatform) | pure | RPG Saga|Platform | bool | This subsystem holds a world pause request now (disconnect or suspend). | |
Is Reconnect Prompt Open (IsReconnectPromptOpen) | pure | RPG Saga|Platform | bool | The reconnect screen is open. | |
On Reconnect Prompt Changed (OnReconnectPromptChanged) | event | RPG Saga|Platform | bOpen: bool | The reconnect screen opened or closed. | |
On Return to Title Requested (OnReturnToTitleRequested) | event | RPG Saga|Platform | The primary user signed out (Platform -> Return To Title On Sign Out): bind it to show a message first. | ||
Show Reconnect Prompt (ShowReconnectPrompt) | function | RPG Saga|Platform | bool | Opens the reconnect screen and pauses (also for a buyer's own flows). Returns true when it is open. |
URSEAppearanceComponent
Module RSE. Builds a modular character on its actor from a URSECharacterAppearance (D-046): the leader skeletal mesh with the Anim Blueprint, follower skeletal parts copying its pose (leader pose), static parts on sockets, material variants, and the visible parts of the equipment worn.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Rebuild (Rebuild) | function | Appearance | Loads (if needed) and builds again. Editor preview too. |
URSEArchetype
Module RSECore. A template content is made from (D-095, docs/design/studio.md section 6): "Knight", "Goblin", "Merchant", "Healing spell".
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Ensure Template (EnsureTemplate) | function | RPG Saga|Archetypes | Creates the Template (of Content Class, else the base class) when it is missing or of the wrong class. | ||
Get Parent Archetype (GetParentArchetype) | pure | RPG Saga|Archetypes | URSEArchetype* | The parent archetype (loaded), or null. | |
Has Parent Cycle (HasParentCycle) | pure | RPG Saga|Archetypes | bool | The parent chain loops back (A -> B -> A). |
URSEArchetypeLibrary
Module RSECore. Archetype inheritance (D-095, docs/design/studio.md section 6 and section 16): creating content from an archetype, per-field overrides, propagation that asks first (a report with per-asset changes, applied only to the assets the designer checks, overridden fields never touched), "Reset to archetype"...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Propagation (ApplyPropagation) | function, static | RPG Saga|Archetypes | Archetype: URSEArchetype*Selected: TArray<UObject*> (ref) | FRSEArchetypeApplyResult | Propagates Archetype to the Selected assets only (the checked rows): copies the archetype's value of every inherited field that differs. Overridden fields are never written. The differences are recomputed, so a stale report cannot overwrite anything. Modified assets are marked dirty; child archetypes that changed are listed for propagating next. |
Compute Propagation (ComputePropagation) | function, static | RPG Saga|Archetypes | Archetype: URSEArchetype*Candidates: TArray<UObject*> (ref) | FRSEArchetypePropagationReport | What propagating Archetype would do to Candidates (content assets and child archetypes; others are ignored): per asset, the inherited fields that would change and the overridden fields that differ but are kept. Changes nothing. |
Detach from Archetype (DetachFromArchetype) | function, static | RPG Saga|Archetypes | Asset: UObject* | bool | Removes the archetype link; the asset keeps its current values and stops following the archetype. |
Get Archetype (GetArchetype) | pure, static | RPG Saga|Archetypes | Asset: UObject* | URSEArchetype* | The archetype Asset inherits from (content: its archetype; archetype: its parent), loaded; null when none. |
Get Archetype Link (GetArchetypeLink) | pure, static | RPG Saga|Archetypes | Asset: UObject* | FRSEArchetypeLink | The link of Asset (empty when it has none, or in cooked builds). |
Get Field Value Text (GetFieldValueText) | pure, static | RPG Saga|Archetypes | Asset: UObject*Field: FName | FString | Short text of a field's value on Asset (a content asset or an archetype's Template), for lists and reports. |
Get Inheritable Fields (GetInheritableFields) | pure, static | RPG Saga|Archetypes | Asset: UObject* | TArray<FName> | Fields Asset can inherit from its archetype (empty without an archetype). |
Get Out Of Date Fields (GetOutOfDateFields) | pure, static | RPG Saga|Archetypes | Asset: UObject* | TArray<FName> | Inherited fields whose value differs from the archetype's (the archetype changed and was not propagated yet). |
Initialize from Archetype (InitializeFromArchetype) | function, static | RPG Saga|Archetypes | Content: UObject*Archetype: URSEArchetype* | bool | Makes Content inherit from Archetype: links it, clears its overrides and copies every archetype field (identity fields listed in Non Inherited Fields are copied once, and only when Content has not set them). Content must be of the archetype's content class (or a subclass). False (and a warning) when it is not, or when Content is itself an archetype (use Set Parent Archetype). |
Is Field Inherited (IsFieldInherited) | pure, static | RPG Saga|Archetypes | Asset: UObject*Field: FName | bool | The field comes from the archetype (Asset has one, the field is inheritable and not overridden): shown greyed. |
Is Field Overridden (IsFieldOverridden) | pure, static | RPG Saga|Archetypes | Asset: UObject*Field: FName | bool | The author changed this field on Asset (propagation keeps it). |
Keep Differences as Overrides (KeepDifferencesAsOverrides) | function, static | RPG Saga|Archetypes | Asset: UObject* | TArray<FName> | Marks every inherited field that differs from the archetype as overridden ("keep my edits"). Returns the fields. |
Reset All Fields to Archetype (ResetAllFieldsToArchetype) | function, static | RPG Saga|Archetypes | Asset: UObject* | bool | Resets every inheritable field (all overrides dropped). |
Reset Field to Archetype (ResetFieldToArchetype) | function, static | RPG Saga|Archetypes | Asset: UObject*Field: FName | bool | "Reset to archetype": copies the archetype's value of Field and makes the field inherited again. |
Set Field Overridden (SetFieldOverridden) | function, static | RPG Saga|Archetypes | Asset: UObject*Field: FNamebOverridden: bool | bool | Marks a field overridden (kept by propagation) or inherited again (the value stays until the next propagation). |
Set Parent Archetype (SetParentArchetype) | function, static | RPG Saga|Archetypes | Child: URSEArchetype*Parent: URSEArchetype* | bool | Makes Child derive from Parent (its Template inherits Parent's Template), or detaches it when Parent is null. Refused when the classes do not fit or the chain would loop. |
Set Template from Content (SetTemplateFromContent) | function, static | RPG Saga|Archetypes | Archetype: URSEArchetype*Source: URSEPrimaryDataAsset* | bool | Copies Source (content of the archetype's kind) into Archetype's Template: "make an archetype from this". |
Validate Archetype Link (ValidateArchetypeLink) | function, static | RPG Saga|Archetypes | Asset: UObject*OutErrors: TArray<FText> (out)OutWarnings: TArray<FText> (out) | bool | Problems of Asset's archetype link: missing archetype, wrong class, unknown overridden fields, parent loops. |
URSEAreaMapViewModel
Module RSE. The full area map screen (D-089, D-092): pan, zoom, legend with category filters, region names, the player, quest objectives and player pins placed with the pin wheel.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate Marker (ActivateMarker) | function | RPG Saga|Map | Marker: FRSEMapMarkerView (ref) | bool | A marker was clicked: an objective opens its quest in the journal (settings). Returns true when it did something. |
Aim Pin Wheel (AimPinWheel) | function | RPG Saga|Map | Offset: FVector2D | Picks the slice an offset points at (wheel radii, screen axes), e.g. the stick or the mouse from the wheel's center. | |
Cancel Pin Wheel (CancelPinWheel) | function | RPG Saga|Map | Cancel Pin Wheel | ||
Center On (CenterOn) | function | RPG Saga|Map | UV: FVector2D | Moves the view so that UV is at the center. | |
Center on Player (CenterOnPlayer) | function | RPG Saga|Map | Center on Player | ||
Confirm Pin Wheel (ConfirmPinWheel) | function | RPG Saga|Map | bool | Applies the selected slice (a new pin, a new type or remove) and closes the wheel. Returns true when applied. | |
Find Pin At (FindPinAt) | pure | RPG Saga|Map | UV: FVector2D | int32 | The pin under UV (within the pick radius at the current zoom), or 0. |
Focus Quest (FocusQuest) | function | RPG Saga|Map | Quest: URSEQuestData* | bool | Centers the view on a quest's objective (journal "Show on map"). Returns false when it has none on this level. |
Get View Span (GetViewSpan) | pure | RPG Saga|Map | float | Visible map span in map units (across the view's shorter side). | |
Is Category Shown (IsCategoryShown) | pure | RPG Saga|Map | Category: FGameplayTag | bool | Is Category Shown |
Open Pin Wheel (OpenPinWheel) | function | RPG Saga|Map | UV: FVector2D | bool | Opens the pin wheel at UV (map coordinates): the pin types, plus Remove when a pin is there. |
Pan (Pan) | function | RPG Saga|Map | Delta: FVector2D | Moves the view by Delta (in view widths: 1 = one whole view). | |
Place Pin (PlacePin) | function | RPG Saga|Map | UV: FVector2DType: FGameplayTagPinId: int32 = 0 | bool | Places a pin of Type at UV, or changes the type of PinId (non-zero). Replaces the oldest pin when full (settings). |
Select Pin Wheel (SelectPinWheel) | function | RPG Saga|Map | Index: int32 | Select Pin Wheel | |
Set Legend Focused (SetLegendFocused) | function | RPG Saga|Map | bFocused: bool | Moves the keyboard / gamepad focus into the legend or back to the map. | |
Toggle Category (ToggleCategory) | function | RPG Saga|Map | Category: FGameplayTag | Shows / hides a category's markers (legend filter). | |
Toggle Pin At (TogglePinAt) | function | RPG Saga|Map | UV: FVector2D | bool | Removes the pin near UV (map coordinates), or places a pin of the first type there. Returns true when something changed. |
Zoom By (ZoomBy) | function | RPG Saga|Map | Steps: floatAnchor: FVector2D | Zooms by Steps zoom steps (negative = out), keeping Anchor (map coordinates) where it is on screen. |
URSEAttributeRegistry
Module RSECore. The attributes and resources of a project (D-054, docs/design/attributes.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Attribute Definition (FindAttributeDefinition) | pure | RPG Saga|Attributes | Tag: FGameplayTagOutDefinition: FRSEAttributeDefinition (out) | bool | The definition of an attribute (name, bounds, formula). False when the registry does not define it. |
Find Resource Definition (FindResourceDefinition) | pure | RPG Saga|Attributes | Tag: FGameplayTagOutDefinition: FRSEResourceDefinition (out) | bool | The definition of a resource (maximum, start, regeneration, gains). False when the registry does not define it. |
Get Display Name (GetDisplayName) | pure | RPG Saga|Attributes | Tag: FGameplayTag | FText | Player-facing name of an attribute or resource (its definition, else the last part of the tag). |
Get HUDResources (GetHUDResources) | pure | RPG Saga|Attributes | bBattleHUD: boolbPartyMenu: bool | TArray<FGameplayTag> | Resources, in HUD order; bBattleHUD / bPartyMenu filter by where they are shown. |
Get Short Label (GetShortLabel) | pure | RPG Saga|Attributes | Tag: FGameplayTag | FText | Short label of an attribute or resource ("HP", "ATK"). |
Get Visible Attributes (GetVisibleAttributes) | pure | RPG Saga|Attributes | TArray<FGameplayTag> | Attributes shown in menus, in UI order. | |
Reset to Built in Defaults (ResetToBuiltInDefaults) | function | Attributes | Fills Attributes and Resources with the framework's built-in definitions (the class defaults). |
URSEAudioSubsystem
Module RSE. The game's audio (D-036, docs/design/audio.md): music, sound effects and the mixer.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Music Now (ApplyMusicNow) | function | RPG Saga|Audio | Applies pending music changes now instead of next frame. | ||
Clear Layer (ClearLayer) | function | RPG Saga|Audio | Layer: ERSEMusicLayer | Clears a layer of the music stack: the layer below plays again. | |
Play Story Music (PlayStoryMusic) | function | RPG Saga|Audio | Track: FRSEMusicTrack (ref)Context: ERSEMusicContext = Story | Story override (Play Music effect, console): covers area music until RestoreMusic. | |
Restore Music (RestoreMusic) | function | RPG Saga|Audio | Ends the story override: the music below comes back. | ||
Set Area Music (SetAreaMusic) | function | RPG Saga|Audio | Track: FRSEMusicTrack (ref) | Area / map music of the current world (URSEAudioWorldSubsystem). Ignored while the base was set explicitly. | |
Set Base Context (SetBaseContext) | function | RPG Saga|Audio | Context: ERSEMusicContext | Sets the base music to a context explicitly (the front end: MainMenu); area music then leaves the base alone until the next map. | |
Set Context Layer (SetContextLayer) | function | RPG Saga|Audio | Layer: ERSEMusicLayerContext: ERSEMusicContext | Sets a layer to a context's settings track (a context without a track clears the layer). | |
Set Dialog Active (SetDialogActive) | function | RPG Saga|Audio | bActive: bool | Dialog music on / off (only when a Dialog context track is set). | |
Set Layer (SetLayer) | function | RPG Saga|Audio | Layer: ERSEMusicLayerContext: ERSEMusicContextTrack: FRSEMusicTrack (ref) | Sets a layer of the music stack to a track (the highest set layer plays). | |
Stop Story Music (StopStoryMusic) | function | RPG Saga|Audio | FadeOut: float = -1.000000 | Silence requested by the story (Stop Music effect) until RestoreMusic. FadeOut < 0 = default. |
URSEAuthorityPolicy
Module RSE. Who runs the game logic (D-134, docs/design/networking.md §3.5).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Has Authority (HasAuthority) | override | RPG Saga|Players | World: UWorld* | bool | This machine applies the game logic in World (single-player: always). |
Is Multiplayer Session (IsMultiplayerSession) | override | RPG Saga|Players | World: UWorld* | bool | More than one player shares World (a network session, or several local players): the co-op rules apply. |
URSEAuthoritySubsystem
Module RSECore. The authority mode and the local player's id for this game instance (D-133).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Authority Mode (GetAuthorityMode) | pure | RPG Saga|Commands | ERSEAuthorityMode | Standalone (single player), Authority (session host) or Proxy (session guest). | |
Get Local Player Id (GetLocalPlayerId) | pure | RPG Saga|Commands | FRSEPlayerId | The player of this machine (the host in single player and on the host). | |
Get Session Players (GetSessionPlayers) | pure | RPG Saga|Commands | TArray<FRSEPlayerId> | The players of the session (D-138): the host first, then the guests. Single player: only the host. The network layer keeps it up to date (joins, leaves); group decisions (dialog votes) count these players. | |
Has Authority (HasAuthority) | pure | RPG Saga|Commands | bool | This machine may change game state: single player or the host of a session. | |
Is Networked (IsNetworked) | pure | RPG Saga|Commands | bool | A network session is running (host or guest). | |
On Authority Mode Changed (BP_OnModeChanged) | event | RPG Saga|Commands | OldMode: ERSEAuthorityModeNewMode: ERSEAuthorityMode | The mode changed (a session started or ended). | |
Set Authority Mode (SetAuthorityMode) | function | RPG Saga|Commands | NewMode: ERSEAuthorityModeNewLocalPlayer: FRSEPlayerId | Sets the mode and this machine's player. Called by the network layer when a session starts or ends (and by tests); Standalone always uses the host id. | |
Set Session Players (SetSessionPlayers) | function | RPG Saga|Commands | Players: TArray<FRSEPlayerId> (ref) | Sets the session's players (RSENet on join / leave, tests). The host is always included. |
URSEBattle
Module RSECore. Rules shared by both battle modes: units, resources, damage and healing, defeat, end of battle and the event stream (D-006).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Status (ApplyStatus) | function | RPG Saga|Battle | SourceId: int32TargetId: int32Status: URSEStatusData*Chance: float | Tries to apply a status (Chance in percent); immunity and stacking follow the status data. | |
Are Units Enemies (AreUnitsEnemies) | pure | RPG Saga|Battle | UnitA: int32UnitB: int32 | bool | Whether two units are on different teams. |
Change Resource (ChangeResource) | function | RPG Saga|Battle | SourceId: int32TargetId: int32Resource: FGameplayTag (ref)Delta: float | float | Changes a unit's resource with a battle event: HP losses go through shields and reactions, HP gains heal. Returns the change applied. |
Deal Damage (DealDamageBP) | function | RPG Saga|Battle | SourceId: int32TargetId: int32Amount: floatElement: FGameplayTag | int32 | Deals HP damage decided by a rule (no stats, no rolls): Amount before the target's affinity to Element (if any); shields, reactions and defeat follow. SourceId may be -1 (the environment). Returns HP lost. |
Defeat Unit (DefeatUnit) | function | RPG Saga|Battle | UnitId: int32 | Marks a unit defeated and checks for the end of battle. | |
Get Battle Mode Tag (GetBattleModeTag) | pure | RPG Saga|Battle | FGameplayTag | The battle mode this battle runs (Battle.Mode.Tactics / ATB / Turn / FreeTactics). Each mode class reports its own tag, so systems that care about the mode (AI records, adaptive difficulty, use conditions, statistics) never need a chain of class checks. Empty for the abstract base. | |
Get Controlling Status (GetControllingStatus) | pure | RPG Saga|Battle|Status | UnitId: int32 | URSEStatusData* | The status that controls the unit now (the first with a control behavior), or null. |
Get Environment Tags (GetEnvironmentTags) | pure | RPG Saga|Battle | FGameplayTagContainer | Get Environment Tags | |
Get Outcome (GetOutcome) | pure | RPG Saga|Battle | ERSEBattleOutcome | Result of the battle from the player team's side (Ongoing while it runs). | |
Get Player Team (GetPlayerTeam) | pure | RPG Saga|Battle | FGameplayTag | The player's team tag in this battle. | |
Get Seed (GetSeed) | pure | RPG Saga|Battle | int32 | Seed the battle started with (deterministic rolls after the battle, e.g. loot, D-042). | |
Get Turns Taken (GetTurnsTaken) | pure | RPG Saga|Battle | Team: FGameplayTag (ref) | int32 | Turns taken so far by units of a team. |
Get Unit (GetUnitBP) | pure | RPG Saga|Battle | UnitId: int32OutUnit: FRSEBattleUnit (out) | bool | A unit of this battle by id. Returns false when there is none. |
Get Unit Attribute (GetUnitAttribute) | pure | RPG Saga|Battle|Attributes | UnitId: int32Attribute: FGameplayTag | float | Final attribute value of a unit (0 for an unknown unit). |
Get Unit Ids (GetUnitIds) | pure | RPG Saga|Battle | Team: FGameplayTagbActiveOnly: bool = true | TArray<int32> | Ids of the units of a team (empty = every team); bActiveOnly skips fallen and withdrawn ones. |
Get Unit Own Team (GetUnitOwnTeam) | pure | RPG Saga|Battle|Status | UnitId: int32 | FGameplayTag | The team a unit belongs to, whatever a status (Charm) makes it fight for now. |
Get Unit Resource (GetUnitResource) | pure | RPG Saga|Battle|Attributes | UnitId: int32Resource: FGameplayTag | float | Current value of a unit's resource. |
Get Unit Resource Max (GetUnitResourceMax) | pure | RPG Saga|Battle|Attributes | UnitId: int32Resource: FGameplayTag | float | Maximum of a unit's resource (0 when it lacks it). |
Get Winning Team (GetWinningTeam) | pure | RPG Saga|Battle | FGameplayTag | The team that won (empty while the battle runs). | |
Heal Unit (HealUnitBP) | function | RPG Saga|Battle | SourceId: int32TargetId: int32Amount: float | float | Restores HP to a unit (a heal event). Returns HP restored. |
Is Battle Over (IsBattleOver) | pure | RPG Saga|Battle | bool | The battle has ended (victory, defeat or escape). | |
Is Unit Active (IsUnitActive) | pure | RPG Saga|Battle | UnitId: int32 | bool | The unit stands on the field (not defeated, not withdrawn). |
Is Unit Controlled by Status (IsUnitControlledByStatus) | pure | RPG Saga|Battle|Status | UnitId: int32 | bool | Whether a status takes the player's command of the unit away (the AI acts for it). |
Modify Unit Resource (ModifyUnitResource) | function | RPG Saga|Battle|Attributes | UnitId: int32Resource: FGameplayTagDelta: float | Adds to a unit's resource (negative removes), within its bounds; HP at 0 defeats the unit. For custom rules and cues. | |
On Battle Event (OnBattleEvent) | event | RPG Saga|Battle | Event: FRSEBattleEvent (ref) | Every battle event, in order (damage, heals, statuses, turns, defeats, the end). | |
On Resource Changed (OnResourceChanged) | event | RPG Saga|Battle|Attributes | UnitId: int32Resource: FGameplayTagOldValue: floatNewValue: float | Fired whenever a unit's resource value changes (damage, costs, gains, regeneration). | |
Remove Statuses (RemoveStatuses) | function | RPG Saga|Battle | SourceId: int32TargetId: int32StatusTags: FGameplayTagContainer (ref) | Removes every status on TargetId whose tag matches any of StatusTags. | |
Roll Int (RollInt) | function | RPG Saga|Battle | Max: int32 | int32 | A deterministic random integer in [0, Max) from the battle's stream (use it instead of Random nodes so replays and the simulator stay exact). |
Roll Percent (RollPercent) | function | RPG Saga|Battle | float | A deterministic random value in [0, 100) from the battle's stream. | |
Scan Unit (ScanUnit) | function | RPG Saga|Battle | SourceId: int32TargetId: int32 | Emits UnitScanned (the bestiary reveals the target's entry). | |
Set Unit Base Stat (SetUnitBaseStat) | function | RPG Saga|Battle|Attributes | UnitId: int32Stat: FGameplayTagValue: float | bool | Replaces the base value of one stat of a unit while the battle runs (D-169, G2): an outside system (the GAS bridge) reports a changed stat. Equipment, Pact and statuses still apply on top; resources above their new maximum are clamped (HP at 0 does not defeat: only damage does). Refused on a proxy or finished battle. Authority code only: other machines get the result through the usual state mirror. Returns true when the value changed. |
Shift Turn (ShiftTurn) | function | RPG Saga|Battle | SourceId: int32TargetId: int32TurnFraction: float | Moves the unit's next turn by TurnFraction of a turn: positive = sooner (haste-like), negative = later (delay). Tactics: CT; ATB: the gauge; turn-based: the timeline (CTB) or the place in the round (Round). | |
Unit Has Status (UnitHasStatus) | pure | RPG Saga|Battle | UnitId: int32Status: FGameplayTag | bool | Whether a unit has a status matching the tag. |
URSEBattleBannerViewModel
Module RSE. Text banners of battle presentations (D-034): the ability name plate and the large cinematic titles.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Banner Started (OnBannerStarted) | event | RPG Saga|UI|Banner | Raised when a style starts showing a new text (widgets play their intro). |
URSEBattleCuePlayerComponent
Module RSE. Plays battle presentation timelines (D-034) and times interactive action commands.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Camera Shake (AddCameraShake) | function | RPG Saga|Battle Presentation | Amplitude: floatRotationAmplitude: floatFrequency: floatDuration: float | Shakes the battle camera (location amplitude in cm, rotation in degrees, frequency in Hz, seconds). | |
Flash (Flash) | function | RPG Saga|Battle Presentation | Color: FLinearColor (ref)Alpha: floatFadeIn: floatHold: floatFadeOut: float | Flashes the screen with a color (fade in, hold, fade out in seconds). | |
Get Caster (GetCaster) | pure | RPG Saga|Battle Presentation | AActor* | The actor of the unit using the action. | |
Get Impact Point (GetImpactPoint) | pure | RPG Saga|Battle Presentation | bOnGround: bool | FVector | The aimed tile / area center (D-055): ground level, or chest height above it. Falls back to the targets' center. |
Get Primary Target (GetPrimaryTarget) | pure | RPG Saga|Battle Presentation | AActor* | The actor of the action's primary target (none for an empty tile). | |
Get Subject Point (GetSubjectPoint) | pure | RPG Saga|Battle Presentation | Actor: AActor* | FVector | Chest height location of a unit (what shots look at). Transient pose offsets (shake, lunge, hop, hit reactions) are left out: shots frame the unit's resting place, so a shaking unit never shakes the camera. |
Get Subjects (GetSubjects) | pure | RPG Saga|Battle Presentation | Subject: ERSECueSubjectOutActors: TArray<AActor*> (out) | The actors of a cue subject: the caster, the primary target or every affected unit. | |
Play Hit Reaction (PlayHitReaction) | function | RPG Saga|Battle Presentation | Target: AActor*From: FVector (ref)Scale: floatbDodge: bool = falsebHeavy: bool = false | Target recoil away from From (hit) or a sidestep (dodge). bHeavy: a critical (the anim set's HitHeavy from the front). |
URSEBattleCue_Custom
Module RSE, display name Custom (Blueprint). A presentation step written in Blueprint (D-052): create a Blueprint class from it and override On Cue Start (and optionally On Cue Update / On Cue Stop) to spawn effects, move actors, play sounds or animations on the cue's subjects.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Cue Start (OnCueStart) | override | RPG Saga|Battle Presentation | Player: URSEBattleCuePlayerComponent*SubjectActors: TArray<AActor*> (ref) | The cue starts: Player gives the caster, the impact point, camera shakes, flashes. | |
On Cue Stop (OnCueStop) | override | RPG Saga|Battle Presentation | Player: URSEBattleCuePlayerComponent*SubjectActors: TArray<AActor*> (ref)bSkipped: bool | The cue ended (time up, skipped or stopped): leave things in their final state. | |
On Cue Update (OnCueUpdate) | override | RPG Saga|Battle Presentation | Player: URSEBattleCuePlayerComponent*SubjectActors: TArray<AActor*> (ref)Alpha: float | Every frame while it runs (bReceiveUpdate): Alpha goes from 0 to 1 over Duration. |
URSEBattleHUDViewModel
Module RSE. Common base of the battle HUD view-models (D-052): the battle log, the result banner, the key prompts and the battle events for floating numbers.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Battle Event (OnBattleEvent) | event | Battle HUD | Event: FRSEBattleEvent (ref)WorldLocation: FVector | A battle event presented on a unit (damage, heal, miss, status...): floating numbers. | |
Refresh Now (RefreshNow) | function | RPG Saga|UI|Battle HUD | Rebuilds the view now (tests; the HUD refreshes every frame on its own). | ||
Set Preview Info (SetPreviewInfo) | function | RPG Saga|UI|Battle HUD | Info: FText (ref) | Sets (or clears, with empty text) the preview summary line. |
URSEBattleLauncherSubsystem
Module RSE. The C++ behind the battle launcher (P55, D-179): starts, restarts and auto-plays a battle of any mode from one FRSEBattleLaunchPreset, on the map the player explores.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Last Launch (GetLastLaunch) | pure | RPG Saga|Dev|Launcher | OutPreset: FRSEBattleLaunchPreset (out)OutSeed: int32 (out) | bool | The preset of the last start (valid after one), with the seed it ran on. |
Is Auto Play (IsAutoPlay) | pure | RPG Saga|Dev|Launcher | bool | Is Auto Play | |
Is Launcher Visible (IsLauncherVisible) | pure | RPG Saga|Dev|Launcher | bool | Is Launcher Visible | |
Restart Battle (RestartBattle) | function | RPG Saga|Dev|Launcher | bNewSeed: boolOutMessage: FString (out) | bool | Fights the last started battle again. While it runs (or has just ended) it is restarted from its beginning with the party as before it; once exploration has control again it starts anew. New seed: a new seed for the rolls; else the same seed (the same battle again, as far as the player's input is the same, e.g. with auto-play). |
Set Auto Play (SetAutoPlay) | function | RPG Saga|Dev|Launcher | bEnabled: bool | The AI plays the party's units too (RSE.Battle.AutoPlay). | |
Set Launcher Visible (SetLauncherVisible) | function | RPG Saga|Dev|Launcher | bVisible: bool | Shows or hides the launcher panel (and gives it the mouse); the F10 key and RSE.Rooms.Launcher call it. | |
Start Battle (StartBattle) | function | RPG Saga|Dev|Launcher | Preset: FRSEBattleLaunchPreset (ref)OutMessage: FString (out) | bool | Starts the preset's battle. A running battle makes this fail (use Restart). OutMessage why it did not start, or what started. |
URSEBattleMenuLibrary
Module RSECore. Blueprint access to the battle menu model (custom providers, custom presenters; D-122).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Menu Entry (AddMenuEntry) | function, static | RPG Saga|Battle Menu | Model: FRSEBattleMenuModel (ref)Entry: FRSEBattleMenuEntry (ref)CategoryLabel: FText (ref)Shape: ERSEBattleMenuCategoryShape = Group | Adds an entry to the menu (its category is made with Category Label / Shape when missing). | |
Find Menu Entry (FindMenuEntry) | pure, static | RPG Saga|Battle Menu | Model: FRSEBattleMenuModel (ref)EntryId: FNameOutEntry: FRSEBattleMenuEntry (out) | bool | The entry with this id, if any. |
Get Menu Unit Character (GetMenuUnitCharacter) | pure, static | RPG Saga|Battle Menu | Context: FRSEBattleMenuContext (ref) | URSECharacterData* | The unit the menu is for (its battle unit id) and its character. |
Make Ability Menu Entry (MakeAbilityMenuEntry) | pure, static | RPG Saga|Battle Menu | Context: FRSEBattleMenuContext (ref)Ability: URSEAbilityData*CategoryId: FName | FRSEBattleMenuEntry | An entry for an ability of the unit (cost, resource, uses left, reasons), for a custom provider. |
Menu Has Ability (MenuHasAbility) | pure, static | RPG Saga|Battle Menu | Model: FRSEBattleMenuModel (ref)Ability: URSEAbilityData* | bool | The menu already has this ability (an earlier provider added it). |
URSEBattleMenuProvider
Module RSECore, display name Battle Menu Provider. A source of battle menu entries (D-122, docs/design/battle-menus.md): the config's providers fill the active unit's menu in order (movement, the command layout's abilities and items, Pacts, the turn commands, custom ones).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Gather (Gather) | override | RPG Saga|Battle Menu | Context: FRSEBattleMenuContext (ref)Model: FRSEBattleMenuModel (ref) | Adds this provider's entries to Model (Context: the battle and the unit). |
URSEBattleMenuViewModel
Module RSE. One local player's battle menu (D-122, docs/design/battle-menus.md): the host's model and list as this player sees them, plus the menu's own navigation (open category, page, highlight, ring open).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate Entry (ActivateEntry) | function | RPG Saga|Battle Menu | EntryId: FName | bool | Activates an entry: the host aims it or issues its command. Disabled entries tell why (the message line). |
Activate List Row (ActivateListRow) | function | RPG Saga|Battle Menu | Row: int32 | The list's rows (list-shaped presenters). | |
Cancel Aim (CancelAim) | function | RPG Saga|Battle Menu | Back out of the aim. | ||
Close Category (CloseCategory) | function | RPG Saga|Battle Menu | bool | Back to the categories. Returns false when already there. | |
Get Highlighted Node Id (GetHighlightedNodeId) | pure | RPG Saga|Battle Menu | FName | The highlighted node's id on the current level (a category on the first ring), or none. | |
Get Hotbar Slots (GetHotbarSlots) | pure | RPG Saga|Battle Menu | MinSlots: int32PageSize: int32OutSlots: TArray<FName> (out) | The hotbar's slots for the active unit's character: its saved order, new entries in free slots (RSEBattleMenu::ResolveHotbar). | |
Get Nodes (GetNodes) | pure | RPG Saga|Battle Menu | OutNodes: TArray<FRSEBattleMenuNode> (out) | What the current level shows (RSEBattleMenu::GetNodes): categories, groups, families, entries. | |
Get Owning Player (GetOwningPlayer) | pure | RPG Saga|Battle Menu | APlayerController* | Get Owning Player | |
Get Path (GetPath) | pure | RPG Saga|Battle Menu | FRSEBattleMenuPath | Where the menu is: the open category, group and family. | |
Highlight Category (HighlightCategory) | function | RPG Saga|Battle Menu | CategoryId: FName | Highlight Category | |
Highlight Entry (HighlightEntry) | function | RPG Saga|Battle Menu | EntryId: FName | Highlight Entry | |
Highlight List Row (HighlightListRow) | function | RPG Saga|Battle Menu | Row: int32 | Highlight List Row | |
Highlight Node (HighlightNode) | function | RPG Saga|Battle Menu | NodeId: FName | Highlights a node of the current level (the host may preview its entry). | |
Move Hotbar Slot (MoveHotbarSlot) | function | RPG Saga|Battle Menu | From: int32To: int32MinSlots: int32PageSize: int32 | bool | Moves a slot onto another (they swap) and saves the order for the character. Returns false when nothing changed. |
On Changed (OnChanged) | event | RPG Saga|Battle Menu | |||
Open Category by Id (OpenCategoryById) | function | RPG Saga|Battle Menu | CategoryId: FName | Open Category by Id | |
Open Family by Id (OpenFamilyById) | function | RPG Saga|Battle Menu | CategoryId: FNameFamilyId: FName | Opens a tier family of a category directly (a hotbar slot): its tiers become the level. | |
Pick Category (PickCategory) | function | RPG Saga|Battle Menu | CategoryId: FName | bool | Picks a category: Direct or single-entry ones act at once, the others open. Returns true when it acted. |
Pick Node (PickNode) | function | RPG Saga|Battle Menu | NodeId: FName | bool | Picks a node of the current level: an entry (or a category / family that acts) is used, the others open. Returns true when it acted. |
Set Expanded (SetExpanded) | function | RPG Saga|Battle Menu | bInExpanded: bool | Set Expanded | |
Set Page (SetPage) | function | RPG Saga|Battle Menu | InPage: int32 | Set Page |
URSEBattleModeOverrideLibrary
Module RSECore. D-182: the battle mode override's data side: reports, resolution and the per-mode copy of an encounter.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Encounter Run in Mode (CanEncounterRunInMode) | pure, static | RPG Saga|Battle|Mode Override | Encounter: URSEEncounterData*Mode: FGameplayTagOutWhyNot: FText (out) | bool | Whether Encounter's data can run in Mode (OutWhyNot: the first problem). |
Get Battle Mode Short Name (GetBattleModeShortName) | pure, static | RPG Saga|Battle|Mode Override | Mode: FGameplayTag | FString | The short name of a mode (Tactics, Live, ATB, Turn, Action), for logs, commands and file names. |
Get Encounter Mode Report (GetEncounterModeReport) | pure, static | RPG Saga|Battle|Mode Override | Encounter: URSEEncounterData* | FRSEEncounterModeReport | Which modes Encounter's data can run in (one entry per overridable mode): its Mode Override switches, the features switched on, an enemy list to bring into another mode, and the automatic fallbacks each mode uses. The map's battle sites (a grid zone, a classic stage) are checked by the world report (RSE Encounter Site -> Build Mode Report). |
Make Encounter for Mode (MakeEncounterForMode) | function, static | RPG Saga|Battle|Mode Override | Outer: UObject*Encounter: URSEEncounterData*Mode: FGameplayTag | URSEEncounterData* | A transient copy of Encounter to fight in Mode: the mode set, the mode's rules profile (Mode Rules Profiles) applied, and the data-only fallbacks (classic rows). The copy keeps the encounter's name, so its asset id (quests, bestiary) is the same. Grid fallbacks need the zone: ApplyGridFallbacks. |
Parse Battle Mode (ParseBattleMode) | pure, static | RPG Saga|Battle|Mode Override | Name: FString | FGameplayTag | Battle.Mode.* from a short name: Tactics / Grid, FreeTactics / Live, ATB, Turn, Action (or a full tag name). Empty when unknown. |
Resolve Battle Mode (ResolveBattleMode) | pure, static | RPG Saga|Battle|Mode Override | Encounter: URSEEncounterData*OverrideMode: FGameplayTag | FRSEBattleModeResolution | The mode Encounter is fought in with OverrideMode active (empty = no override). |
URSEBattleModeOverrideSubsystem
Module RSECore. D-182: the session's battle mode override.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Battle Mode Override (ClearBattleModeOverride) | function | RPG Saga|Battle|Mode Override | Encounters start in their own mode again. | ||
Get Battle Mode Override (GetBattleModeOverride) | pure | RPG Saga|Battle|Mode Override | FGameplayTag | The override's mode (empty: none). | |
Has Battle Mode Override (HasBattleModeOverride) | pure | RPG Saga|Battle|Mode Override | bool | Has Battle Mode Override | |
On Battle Mode Override Changed (OnBattleModeOverrideChanged) | event | RPG Saga|Battle|Mode Override | Mode: FGameplayTag | The override changed (empty tag: cleared). | |
Resolve Battle Mode (ResolveBattleMode) | pure | RPG Saga|Battle|Mode Override | Encounter: URSEEncounterData* | FRSEBattleModeResolution | The mode Encounter is fought in now (the override when the encounter allows it and can run in it). |
Set Battle Mode Override (SetBattleModeOverride) | function | RPG Saga|Battle|Mode Override | Mode: FGameplayTag | bool | Fights every encounter that allows it in Mode (Battle.Mode.*). An empty tag clears the override. Returns false for a mode that is not overridable. |
URSEBattleScriptEffect
Module RSECore, display name Battle Script Effect. What a scripted battle event changes (D-117).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply (Apply) | override | RPG Saga|Battle Script | Context: FRSEBattleScriptContext (ref) | Applies the effect. | |
Describe (Describe) | override | RPG Saga|Battle Script | FText | One line for the editor and logs. |
URSEBattleScriptRunner
Module RSECore. Runs a battle's reinforcements and scripted events (D-117, docs/product/reinforcements.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Queue Wave (CanQueueWave) | pure | RPG Saga|Reinforcements | CallId: int32 | bool | Whether a called wave may be handed to the battle now (its Delay Rounds passed). |
Fire Event (FireEvent) | function | RPG Saga|Battle Script | Id: FName | bool | Fires a scripted event now, whatever its trigger (once-only events that already fired are refused). Returns true when it fired. |
Get Call (GetCall) | pure | RPG Saga|Reinforcements | CallId: int32OutCall: FRSEReinforcementCallView (out) | bool | Get Call |
Get Calls (GetCalls) | pure | RPG Saga|Reinforcements | TArray<FRSEReinforcementCallView> | Every call so far (calling, incoming, arrived, cancelled). | |
Get Incoming Count (GetIncomingCount) | pure | RPG Saga|Reinforcements | Team: FGameplayTag | int32 | Units on their way for Team (called, not joined yet). |
Get Round (GetRound) | pure | RPG Saga|Reinforcements | int32 | The current round as the triggers count it (the battle's own rounds, else counted in turns). | |
Get Times Fired (GetTimesFired) | pure | RPG Saga|Battle Script | Id: FName | int32 | Times a scripted event fired in this battle. |
Is Calling (IsCalling) | pure | RPG Saga|Reinforcements | UnitId: int32 | bool | The unit is calling for help now. |
On Call Cancelled (BP_OnCallCancelled) | event | RPG Saga|Reinforcements | Call: FRSEReinforcementCallView (ref) | A call was stopped before it completed (Blueprint). | |
On Call Started (BP_OnCallStarted) | event | RPG Saga|Reinforcements | Call: FRSEReinforcementCallView (ref) | A unit started calling for help (Blueprint). | |
On Script Event (BP_OnScriptEvent) | event | RPG Saga|Battle Script | Event: FRSEBattleScriptEventView (ref) | A scripted battle event fired (Blueprint). | |
On Wave Arrived (BP_OnWaveArrived) | event | RPG Saga|Reinforcements | Call: FRSEReinforcementCallView (ref) | Every unit of a wave joined the battle (Blueprint). | |
On Wave Called (BP_OnWaveCalled) | event | RPG Saga|Reinforcements | Call: FRSEReinforcementCallView (ref) | A wave is on its way (Blueprint). | |
Process Pending (ProcessPending) | function | RPG Saga|Reinforcements | bool | The safe point: evaluates the triggers, completes or cancels calls, fires scripted events (their effects) and brings in auto-joined waves. Never call it from inside a battle event. Returns true when something happened. | |
Set Auto Join (SetAutoJoin) | function | RPG Saga|Reinforcements | bInAutoJoin: bool | Headless joining: called waves enter by themselves at their round (Free Tactics: hidden points of the snapshot). | |
Start Reinforcements (StartReinforcements) | function | RPG Saga|Reinforcements | Data: URSEReinforcementData*CallerId: int32bSkipCallTime: bool | int32 | A group calls now (a scripted event, Blueprint): its waves with a Battle Start, When Alerted or Manual trigger are due; the rest follow their triggers. CallerId calls (INDEX_NONE = by the data's Caller rule). bSkipCallTime: no channel. Returns the new group's index. |
URSEBattleStartGate
Module RSE. The one rule every battle start goes through (D-120): no battle starts over a story scene, a blocking dialog or a custom block.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Block (AddBlock) | function | RPG Saga|Battle | Reason: FName | Keeps battles from starting until the matching RemoveBlock (counted per reason): a custom cinematic, a tutorial screen, a network hand-off. | |
Can Start Now (CanStartNow) | pure | RPG Saga|Battle | bool | A battle may start now (nothing blocks and no start is waiting). | |
Cancel Pending Start (CancelPendingStart) | function | RPG Saga|Battle | Drops the waiting start without running it. | ||
Get Block Reason (GetBlockReason) | pure | RPG Saga|Battle | FName | Why no battle can start now: Scene, Dialog or a custom block reason. None = a battle may start. | |
Has Pending Start (HasPendingStart) | pure | RPG Saga|Battle | bool | A start is waiting for the block to lift. | |
On Deferred Start (OnDeferredStart) | event | RPG Saga|Battle | Label: FStringbStarted: bool | A waiting start ran (bStarted: the battle started). | |
Remove Block (RemoveBlock) | function | RPG Saga|Battle | Reason: FName | Remove Block |
URSEBattleTransitionSubsystem
Module RSE. Plays the screen transitions between exploration and battles (D-083).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Playing (IsPlaying) | pure | RPG Saga|Battle | bool | A transition plays. |
URSEBestiarySubsystem
Module RSECore. The bestiary (D-047): every enemy type met and defeated, saved as section "Bestiary".
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Entry (FindEntryBP) | pure | RPG Saga|Bestiary | Character: URSECharacterData*OutEntry: FRSEBestiaryEntry (out) | bool | The saved counts of Character. Returns false when it has no entry. |
Get Bestiary Characters (GetCharactersBP) | pure | RPG Saga|Bestiary | TArray<URSECharacterData*> | Enemies with an entry, sorted by category then name. | |
Get Knowledge (GetKnowledgeBP) | pure | RPG Saga|Bestiary | Character: URSECharacterData* | FRSEBestiaryKnowledge | What the entry of Character reveals now (name, description, stats, affinities, drops). |
On Bestiary Changed (BP_OnChanged) | event | RPG Saga|Bestiary | Fired after any change (menus refresh). | ||
Record Defeat (RecordDefeatBP) | function | RPG Saga|Bestiary | Character: URSECharacterData* | Counts one defeat of Character. | |
Record Encounter (RecordEncounterBP) | function | RPG Saga|Bestiary | Character: URSECharacterData*Level: int32 | Counts one enemy of Character met at Level (a custom encounter, a scripted fight). |
URSEBlueprintLibrary_Art
Module RSECore, display name RSEBlueprint Library Art. Portraits and icons for UMG screens (D-075): the same lookups the built-in screens use.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Character Portrait (GetCharacterPortrait) | pure, static | RPG Saga|Art | Character: URSECharacterData*Variant: FName = None | TSoftObjectPtr<UTexture2D> | The portrait of a character (its Portrait, a variant's, or the generated art library's). Null = none: show an initial. |
Get Icon (GetIcon) | pure, static | RPG Saga|Art | Asset: UObject* | TSoftObjectPtr<UTexture2D> | The icon of an item, ability or status (its Icon, or the generated art library's). Null = none. |
Get Quest Image (GetQuestImage) | pure, static | RPG Saga|Art | Quest: URSEQuestData* | TSoftObjectPtr<UTexture2D> | D-155: a quest's journal picture (its Header Image, or the generated art library's). Null = none. |
Get Speaker Portrait (GetSpeakerPortrait) | pure, static | RPG Saga|Art | Speaker: URSESpeakerData*Expression: FGameplayTag | TSoftObjectPtr<UTexture2D> | A speaker's dialog portrait for an expression (its Portraits, neutral, its character's portrait, the library's). |
URSEBlueprintLibrary_Audio
Module RSE, display name RSEBlueprint Library Audio. Music, sounds and volumes from Blueprint (D-052).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Audio Subsystem (GetAudioSubsystem) | pure, static | RPG Saga|Audio | WorldContextObject: UObject* | URSEAudioSubsystem* | The game's audio: the music stack, the sound catalog and the mixer. |
Get Volume (GetVolume) | pure, static | RPG Saga|Audio|Volume | Channel: ERSEAudioChannel | float | The player's volume of a channel (0-1). |
Play Music (PlayMusic) | function, static | RPG Saga|Audio | WorldContextObject: UObject*Track: FRSEMusicTrack (ref) | Plays a track as story music (covers the area music) until Restore Music. | |
Play Music Context (PlayMusicContext) | function, static | RPG Saga|Audio | WorldContextObject: UObject*Context: ERSEMusicContext | Plays the Audio settings' track of a context (Boss, Victory, a custom mood...) as story music, until Restore Music. | |
Play Sound 2D (PlaySound2D) | function, static | RPG Saga|Audio | WorldContextObject: UObject*Sound: FGameplayTagVolumeMultiplier: float = 1.000000PitchMultiplier: float = 1.000000 | bool | Plays the catalog sound of a tag, not placed in the world (UI, stingers). Returns whether the tag has a sound. |
Play Sound at Location (PlaySoundAtLocation) | function, static | RPG Saga|Audio | WorldContextObject: UObject*Sound: FGameplayTagLocation: FVectorVolumeMultiplier: float = 1.000000PitchMultiplier: float = 1.000000 | bool | Plays the catalog sound of a tag at a location. Returns whether the tag has a sound. |
Reset Volumes (ResetVolumes) | function, static | RPG Saga|Audio|Volume | Every channel back to the Audio settings' default volume. | ||
Restore Music (RestoreMusic) | function, static | RPG Saga|Audio | WorldContextObject: UObject* | Ends the story music: the area music comes back. | |
Set Volume (SetVolume) | function, static | RPG Saga|Audio|Volume | Channel: ERSEAudioChannelVolume: floatbSave: bool = true | Sets and applies a channel volume (0-1); bSave stores it in the player's options. | |
Stop Music (StopMusic) | function, static | RPG Saga|Audio | WorldContextObject: UObject*FadeOut: float = -1.000000 | Story silence until Restore Music. FadeOut < 0 = the default fade. |
URSEBlueprintLibrary_Battle
Module RSE, display name RSEBlueprint Library Battle. Battles from Blueprint (D-052): start an encounter from its data asset, find the running battle and its outcome, reach the directors.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find ATBDirector (FindATBDirector) | pure, static | RPG Saga|Battle | WorldContextObject: UObject*Encounter: URSEEncounterData* = None | ARSEATBBattleDirector* | The map's ATB director (battle stage) for an encounter (none = the first one). |
Find Tactics Director (FindTacticsDirector) | pure, static | RPG Saga|Battle | WorldContextObject: UObject*Encounter: URSEEncounterData* = None | ARSETacticsBattleDirector* | The map's Tactics director for an encounter (none = the first one). |
Get Current Battle (GetCurrentBattle) | pure, static | RPG Saga|Battle | WorldContextObject: UObject* | URSEBattle* | The running battle (units, resources, events), or none. |
Get Current Battle Outcome (GetCurrentBattleOutcome) | pure, static | RPG Saga|Battle | WorldContextObject: UObject* | ERSEBattleOutcome | Outcome of the running battle from the player's side (Ongoing while it runs or without a battle). |
Get Current Encounter (GetCurrentEncounter) | pure, static | RPG Saga|Battle | WorldContextObject: UObject* | URSEEncounterData* | The encounter being fought, or none. |
Get Exploration Subsystem (GetExplorationSubsystem) | pure, static | RPG Saga|Battle | WorldContextObject: UObject* | URSEExplorationSubsystem* | Hands control from exploration to battles and back (Start Encounter, encounter events). |
Get Unit Display Name (GetUnitDisplayName) | pure, static | RPG Saga|Battle | Unit: FRSEBattleUnit (ref) | FText | Display name of a battle unit (its character's name). |
Is in Battle (IsInBattle) | pure, static | RPG Saga|Battle | WorldContextObject: UObject* | bool | A battle is running on this map (started from exploration or directly on a director). |
Start Encounter (StartEncounter) | function, static | RPG Saga|Battle | WorldContextObject: UObject*Encounter: URSEEncounterData*Source: AActor* = None | bool | Starts a battle from an encounter asset: a Tactics encounter on the map's Tactics director that has it, a classic (ATB / turn-based) one on the map's battle stage. Source: the actor asking (it receives the encounter events). |
URSEBlueprintLibrary_CombatRoles
Module RSECore, display name RSEBlueprint Library Combat Roles. Combat roles for Blueprints and scripts (D-093): definitions, asset roles, suggestions.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Combat Role Definition (GetCombatRoleDefinition) | pure, static | RPG Saga|Combat Roles | Role: FGameplayTagOutDefinition: FRSECombatRoleDefinition (out) | bool | The definition of a role. Returns false when the project defines no such role. |
Get Combat Roles (GetCombatRoles) | pure, static | RPG Saga|Combat Roles | TArray<FRSECombatRoleDefinition> | Every combat role of the project (Project Settings -> Combat Roles). | |
Resolve Combat Role (ResolveCombatRole) | pure, static | RPG Saga|Combat Roles | Query: FRSECombatRoleQuery (ref) | FRSECombatRoleResolution | The role looked up from a query (per-instance overrides and assets), with the project's registries. |
Suggest Combat Role (SuggestCombatRole) | pure, static | RPG Saga|Combat Roles | Shape: FRSECombatRoleShape (ref) | FRSECombatRoleSuggestion | The suggested role for a measured shape, with the project's thresholds. |
URSEBlueprintLibrary_Commands
Module RSECore, display name RSEBlueprint Library Commands. Blueprint access to the command bus, the players, the authority mode and the seeds (D-133).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Equal (Player Id) (EqualEqual_PlayerId) | pure, static | RPG Saga|Commands | A: FRSEPlayerIdB: FRSEPlayerId | bool | Both ids are the same player. |
Get Authority Mode (GetAuthorityMode) | pure, static | RPG Saga|Commands | WorldContextObject: UObject* | ERSEAuthorityMode | Standalone (single player), Authority (session host) or Proxy (session guest). |
Get Host Player Id (GetHostPlayerId) | pure, static | RPG Saga|Commands | FRSEPlayerId | The host's id (slot 0). | |
Get Local Player Id (GetLocalPlayerId) | pure, static | RPG Saga|Commands | WorldContextObject: UObject* | FRSEPlayerId | This machine's player (the host in single player). |
Get State Section Revision (GetStateSectionRevision) | pure, static | RPG Saga|Save | WorldContextObject: UObject*SectionId: FName | int32 | How many times a state section changed (its revision; 0 = never). |
Has Game Authority (HasGameAuthority) | pure, static | RPG Saga|Commands | WorldContextObject: UObject* | bool | This machine may change game state (single player or the session host). |
Is Host Player (IsHostPlayer) | pure, static | RPG Saga|Commands | Player: FRSEPlayerId | bool | The player is the host. |
Is Valid Player (IsValidPlayer) | pure, static | RPG Saga|Commands | Player: FRSEPlayerId | bool | A real player (not the game itself). |
Make Player Id (MakePlayerId) | pure, static | RPG Saga|Commands | Slot: int32 | FRSEPlayerId | The id of a session slot (0 = host, 1.. = guests). |
Next Game Seed (NextGameSeed) | function, static | RPG Saga|Seeds | WorldContextObject: UObject*Stream: FName | int32 | The next seed of a named stream of the world seed (use it for any random roll that matters to the game). |
Submit Command (Game) (SubmitGameCommand) | function, static | RPG Saga|Commands | WorldContextObject: UObject*Command: FInstancedStruct (ref) | FRSECommandResult | Sends a command as this machine's player (validated and applied by its handler, or sent to the host on a guest). |
Was Command Applied (WasCommandApplied) | pure, static | RPG Saga|Commands | Result: FRSECommandResult (ref) | bool | The command was validated and applied. |
URSEBlueprintLibrary_ExploreRPG
Module RSECore, display name RSEBlueprint Library Explore RPG. Exploration RPG rules for Blueprints (D-109).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Revive Option (FindReviveOption) | function, static | RPG Saga|Exploration RPG | WorldContextObject: UObject*Fallen: URSECharacterData* | FRSEReviveOption | The best way to revive a fallen member now (an item, a spell, help up). |
Get Attempt Chance (GetAttemptChance) | pure, static | RPG Saga|Exploration RPG | WorldContextObject: UObject*Score: floatDifficulty: float | float | Chance (0..1) of an attempt with Score against Difficulty. |
Get Member Skill (GetMemberSkill) | function, static | RPG Saga|Exploration RPG | WorldContextObject: UObject*Member: URSECharacterData*Skill: ERSEExploreSkill | float | A party member's score in an exploration skill now (Project Settings -> Exploration RPG -> Skills). |
Revive Fallen Member (ReviveFallenMember) | function, static | RPG Saga|Exploration RPG | WorldContextObject: UObject*Fallen: URSECharacterData* | bool | Revives a fallen member the best way available. Returns true when it got up. |
URSEBlueprintLibrary_FollowerLife
Module RSECore, display name RSEBlueprint Library Follower Life. Follower rules for Blueprints (D-129).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Follower Drift (GetFollowerDrift) | pure, static | RPG Saga|Party Field | Seed: int32Time: floatRadius: floatPeriod: float | FVector2D | A member's smooth drift around its formation slot at Time (cm), deterministic from Seed. |
Get Formation Spread (GetFormationSpread) | pure, static | RPG Saga|Party Field | Profile: URSEFollowerProfile*FreeWidth: float | float | The formation's width for a free width around the leader (cm), from a profile. |
URSEBlueprintLibrary_Game
Module RSECore, display name RSEBlueprint Library Game. Game-wide systems from Blueprint (D-052): rules profiles, adaptive difficulty, tutorials, the bestiary and the card collection.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Challenge Card Opponent (CanChallengeCardOpponent) | pure, static | RPG Saga|Cards | WorldContextObject: UObject*Opponent: URSECardOpponentData* | ERSECardChallengeResult | Whether the player can challenge an opponent now (conditions, rematch rule, deck). |
Challenge Card Opponent (ChallengeCardOpponent) | function, static | RPG Saga|Cards | WorldContextObject: UObject*Opponent: URSECardOpponentData* | Opens the card table against an opponent (checks and table screen), like the Start Card Match effect. | |
Get Active Rules Profile (GetActiveRulesProfile) | pure, static | RPG Saga|Rules | WorldContextObject: UObject* | URSERulesProfile* | The rules profile in use (none = the global Project Settings). |
Get Bestiary Knowledge (GetBestiaryKnowledge) | pure, static | RPG Saga|Bestiary | WorldContextObject: UObject*Enemy: URSECharacterData* | FRSEBestiaryKnowledge | What the bestiary reveals about an enemy now. |
Get Bestiary Subsystem (GetBestiarySubsystem) | pure, static | RPG Saga|Bestiary | WorldContextObject: UObject* | URSEBestiarySubsystem* | The bestiary: enemies met and defeated, what their entries reveal, and its change event. |
Get Card Count (GetCardCount) | pure, static | RPG Saga|Cards | WorldContextObject: UObject*Card: URSECardData* | int32 | Copies of a card the player owns. |
Get Card Subsystem (GetCardSubsystem) | pure, static | RPG Saga|Cards | WorldContextObject: UObject* | URSECardSubsystem* | The card game: collection, deck, matches and their events. |
Get Defeat Count (GetDefeatCount) | pure, static | RPG Saga|Bestiary | WorldContextObject: UObject*Enemy: URSECharacterData* | int32 | Times an enemy type was defeated. |
Get Difficulty Subsystem (GetDifficultySubsystem) | pure, static | RPG Saga|Difficulty | WorldContextObject: UObject* | URSEDifficultySubsystem* | Adaptive enemy intelligence of the game (per battle mode). |
Get Enemy Intelligence (GetEnemyIntelligence) | pure, static | RPG Saga|Difficulty | WorldContextObject: UObject*Mode: FGameplayTag | float | Current adaptive enemy intelligence (0-1) of a battle mode (Battle.Mode.*). |
Get Rules Subsystem (GetRulesSubsystem) | pure, static | RPG Saga|Rules | WorldContextObject: UObject* | URSERulesSubsystem* | The game's rules profile (switchable by the story; battles copy it when they start). |
Get Tutorial Subsystem (GetTutorialSubsystem) | pure, static | RPG Saga|Tutorials | WorldContextObject: UObject* | URSETutorialSubsystem* | Contextual tutorials: triggers, seen state and the tutorial event. |
Give Card (GiveCard) | function, static | RPG Saga|Cards | WorldContextObject: UObject*Card: URSECardData*Count: int32 = 1 | int32 | Gives copies of a card (capped by the copies limit). Returns copies added. |
Is Tutorial Seen (IsTutorialSeen) | pure, static | RPG Saga|Tutorials | WorldContextObject: UObject*Tutorial: URSETutorialData* | bool | The tutorial was shown already. |
Notify Tutorial Trigger (NotifyTutorialTrigger) | function, static | RPG Saga|Tutorials | WorldContextObject: UObject*Trigger: FGameplayTag | URSETutorialData* | Reports a game event (Tutorial.Trigger.*): the first unseen tutorial with that trigger shows. Any new tag works as a custom trigger. Returns the tutorial shown, or none. |
Set Active Rules Profile (SetActiveRulesProfile) | function, static | RPG Saga|Rules | WorldContextObject: UObject*Profile: URSERulesProfile* | Switches the game's rules profile (none = the default profile). Running battles keep theirs. | |
Set Enemy Intelligence (SetEnemyIntelligence) | function, static | RPG Saga|Difficulty | WorldContextObject: UObject*Mode: FGameplayTagIntelligence: float | Sets the adaptive enemy intelligence (0-1) of a battle mode; adaptation continues from there. | |
Show Tutorial (ShowTutorial) | function, static | RPG Saga|Tutorials | WorldContextObject: UObject*Tutorial: URSETutorialData*bEvenIfSeen: bool = false | bool | Shows a tutorial now (marks it seen). bEvenIfSeen: again, even when already seen. |
URSEBlueprintLibrary_Growth
Module RSECore, display name RSEBlueprint Library Growth. Progression systems from Blueprint (D-144): the game's system, points, allocations, the board, teachers, mastery and use growth.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Allocate Attribute Points (AllocateAttributePoints) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Stat: FGameplayTagCount: int32 = 1 | ERSEGrowthResult | --- Changing (party commands) --- |
Auto Allocate Growth (AutoAllocateGrowth) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData* | ERSEGrowthResult | Spends the character's points with the allocation policy. |
Award Growth Points (AwardGrowthPoints) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Currency: FGameplayTagAmount: int32 = 1 | ERSEGrowthResult | Gives (or takes) points; Character empty = every member. Host only. |
Buy Growth Ability (BuyGrowthAbility) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Ability: URSEAbilityData* | ERSEGrowthResult | Buy Growth Ability |
Can Learn from Teacher (CanLearnFromTeacher) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Teacher: URSETeacherData*Ability: URSEAbilityData* | ERSEGrowthResult | Whether the character may learn the teacher's offer for Ability now. |
Describe Growth Result (DescribeGrowthResult) | pure, static | RPG Saga|Progression | Result: ERSEGrowthResult | FText | Text of a result ("Not enough points."). |
Estimate Class Growth Board Fill Level (EstimateClassGrowthBoardFillLevel) | function, static | RPG Saga|Progression|Generator | Class: URSEClassData*Profile: URSERulesProfile*MaxLevel: int32 = 99 | int32 | D-154: Estimate Growth Board Fill Level for a hero of Class (its plan's board), e.g. while generating content. |
Estimate Growth Board Fill Level (EstimateGrowthBoardFillLevel) | function, static | RPG Saga|Progression|Generator | Character: URSECharacterData*Profile: URSERulesProfile*MaxLevel: int32 = 99StartLevel: int32 = 1 | int32 | D-154: the level at which Character's growth board is full when every point goes to it and battles give a typical playthrough's points (Profile's Battle Points, Simulated Victories Per Level and Enemies Per Victory; empty = the project's settings), counted from Start Level. -1 = not full by Max Level (or no board). Generated boards fill near their Target Level. |
Generate Growth Board (GenerateGrowthBoard) | function, static | RPG Saga|Progression|Generator | Class: URSEClassData*Params: FRSEGrowthGeneratorParams (ref)Board: URSEGrowthBoard*Plan: URSEGrowthPlan* = None | Fills Board from Class (deterministic; replaces its nodes and edges) and gives Plan (optional) its board points. | |
Generate Growth Point Tables (GenerateGrowthPointTables) | function, static | RPG Saga|Progression|Generator | Class: URSEClassData*Params: FRSEGrowthGeneratorParams (ref)Plan: URSEGrowthPlan* | Fills Plan's point grants, key attributes and ability catalog from Class (deterministic; replaces them). | |
Get Ability Rank (GetAbilityRank) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Ability: URSEAbilityData* | FRSEAbilityRankModifier | Use growth rank (1 = base) and multipliers of an ability for the character. |
Get Allocated Attribute Points (GetAllocatedAttributePoints) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Stat: FGameplayTag | int32 | Points put into an attribute (Classic + Points). |
Get Available Growth Points (GetAvailableGrowthPoints) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Currency: FGameplayTag | int32 | Points of Currency the character may spend now. |
Get Growth Board (GetGrowthBoard) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData* | URSEGrowthBoard* | Get Growth Board |
Get Growth Board Problems (GetGrowthBoardProblems) | function, static | RPG Saga|Progression|Generator | Board: URSEGrowthBoard*Errors: TArray<FText> (out)Warnings: TArray<FText> (out) | Structural problems of a board (errors block a valid board; warnings are advice). | |
Get Growth Currencies (GetGrowthCurrencies) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData* | TArray<FGameplayTag> | The currencies the character spends in the current system. |
Get Growth Generator Defaults (GetGrowthGeneratorDefaults) | pure, static | RPG Saga|Progression|Generator | FRSEGrowthGeneratorParams | The generator inputs of Project Settings -> Progression Systems -> Generator. | |
Get Growth Node Cost (GetGrowthNodeCost) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*NodeId: FName | int32 | What unlocking the node would cost now (-1 = not reachable yet). |
Get Growth Options (GetGrowthOptions) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData* | TArray<FRSEGrowthOption> | What the character could take now, scored (what Auto would pick from). |
Get Growth Plan (GetGrowthPlan) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData* | URSEGrowthPlan* | The character's Growth Plan and board (may be empty). |
Get Mastery Points (GetMasteryPoints) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Item: URSEItemData*Ability: URSEAbilityData*bMastered: bool (out) | int32 | Mastery points of an item's ability for the character, and whether it is mastered. |
Get Progression System (GetProgressionSystem) | pure, static | RPG Saga|Progression | WorldContextObject: UObject* | ERSEProgressionSystem | The progression system the game uses now. |
Is Growth Node Unlocked (IsGrowthNodeUnlocked) | pure, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*NodeId: FName | bool | The node is open for the character (Classic + Growth Board). |
Learn from Teacher (LearnFromTeacher) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Teacher: URSETeacherData*Ability: URSEAbilityData* | ERSEGrowthResult | Learn from Teacher |
Respec Character (RespecCharacter) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*Teacher: URSETeacherData* = None | ERSEGrowthResult | Resets the character's spent points (Teacher: the NPC offering it, for NPC mode). |
Set Progression System (SetProgressionSystem) | function, static | RPG Saga|Progression | WorldContextObject: UObject*System: ERSEProgressionSystemChoicebForce: bool = false | ERSEGrowthResult | The system the game uses from now on (New Game choice; Force skips the settings' check). Host only. |
Unlock Growth Node (UnlockGrowthNode) | function, static | RPG Saga|Progression | WorldContextObject: UObject*Character: URSECharacterData*NodeId: FName | ERSEGrowthResult | Unlock Growth Node |
URSEBlueprintLibrary_Items
Module RSECore, display name RSEBlueprint Library Items. Items and money from Blueprint (D-052): the shared inventory, money, shop prices and purchases, inns.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Money (AddMoney) | function, static | RPG Saga|Economy | WorldContextObject: UObject*Amount: int32 | int32 | Adds money (capped by the Economy Max Money). Returns the money actually added. |
Buy (Buy) | function, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData*EntryIndex: int32Count: int32 = 1 | ERSEShopResult | Pays and adds Count of the entry's item. |
Can Buy (CanBuy) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData*EntryIndex: int32Count: int32 = 1 | ERSEShopResult | Whether the party could buy Count of a shop entry now, or why not (money, stock, availability, room). |
Can Sell (CanSell) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Item: URSEItemData*Count: int32 = 1Shop: URSEShopData* = None | ERSEShopResult | Whether the party could sell Count of an item now, or why not (key items, not enough, the shop does not buy). |
Get Buy Price (GetBuyPrice) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData*EntryIndex: int32 | int32 | Price of a shop entry (its override, else the item's price). |
Get Inn Cost (GetInnCost) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*CostOverride: int32 = -1 | int32 | Price of a night (CostOverride >= 0, else the Economy default). |
Get Inventory Items (GetInventoryItems) | function, static | RPG Saga|Items | WorldContextObject: UObject*Kind: ERSEItemKindOutItems: TArray<URSEItemData*> (out)OutCounts: TArray<int32> (out) | Held items of a kind in acquisition order, with their counts (same index). | |
Get Inventory Stacks (GetInventoryStacks) | pure, static | RPG Saga|Items | WorldContextObject: UObject* | TArray<FRSEItemStack> | Every stack of the inventory (item and count). |
Get Item Count (GetItemCount) | pure, static | RPG Saga|Items | WorldContextObject: UObject*Item: URSEItemData* | int32 | How many of an item the party holds. |
Get Item Kind (GetItemKind) | pure, static | RPG Saga|Items | Item: URSEItemData* | ERSEItemKind | Consumable, equipment, key item or document. |
Get Max Buy Count (GetMaxBuyCount) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData*EntryIndex: int32 | int32 | Most of an entry the party could buy now (money, stock, stack room). |
Get Money (GetMoney) | pure, static | RPG Saga|Economy | WorldContextObject: UObject* | int32 | The party's money. |
Get Offered Shop Entries (GetOfferedShopEntries) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData* | TArray<int32> | Entries of a shop offered now (availability passes), including sold-out ones. |
Get Sell Price (GetSellPrice) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Item: URSEItemData*Shop: URSEShopData* = None | int32 | What a shop pays for one item (Shop empty = the Economy settings' sell ratio). |
Get Stock Left (GetStockLeft) | pure, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData*EntryIndex: int32 | int32 | Stock left of a shop entry (-1 = unlimited). |
Give Item (GiveItem) | function, static | RPG Saga|Items | WorldContextObject: UObject*Item: URSEItemData*Count: int32 = 1 | int32 | Gives items to the party (capped by the item's stack limit). Returns how many were added. |
Has Item (HasItem) | pure, static | RPG Saga|Items | WorldContextObject: UObject*Item: URSEItemData*Count: int32 = 1 | bool | The party holds at least Count of an item. |
Rest at Inn (RestAtInn) | function, static | RPG Saga|Economy | WorldContextObject: UObject*CostOverride: int32 = -1 | ERSEInnResult | Pays and restores every member, then the rest fade plays (like the Rest At Inn effect). |
Sell (Sell) | function, static | RPG Saga|Economy | WorldContextObject: UObject*Item: URSEItemData*Count: int32 = 1Shop: URSEShopData* = None | ERSEShopResult | Removes Count of Item and pays their sell price. |
Spend Money (SpendMoney) | function, static | RPG Saga|Economy | WorldContextObject: UObject*Amount: int32 | bool | Pays Amount if the party has it. Returns false (and pays nothing) otherwise. |
Take Item (TakeItem) | function, static | RPG Saga|Items | WorldContextObject: UObject*Item: URSEItemData*Count: int32 = 1 | int32 | Takes up to Count items from the party. Returns how many were taken. |
URSEBlueprintLibrary_Narrative
Module RSECore, display name RSEBlueprint Library Narrative. Story state from Blueprint (D-052): flags, variables, puzzles, areas and events, conditions and effects, interactions, dialogs and quests.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Abort Dialog (AbortDialog) | function, static | RPG Saga|Dialog | WorldContextObject: UObject* | Stops the running blocking dialog now (effects already applied stay applied). | |
Add Member (Context) (EffectAddMember) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Character: URSECharacterData* | bool | Recruits a character. Returns false if already a member. |
Add Money (Context) (EffectAddMoney) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Amount: int32 | int32 | Adds money (negative: takes up to what the party has). Returns the change applied. |
Add to Variable (AddToVariable) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Variable: FGameplayTagDelta: int32 = 1 | int32 | Adds to a story variable (negative subtracts). Returns the new value. |
Can Run Interaction (CanRunInteraction) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Interaction: URSEInteractionData* | bool | Whether an Interaction asset would run now. |
Check Conditions (CheckConditions) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Conditions: FRSEConditionSet (ref) | bool | Whether a list of conditions passes now (an empty list passes). |
Check Conditions (Context) (ContextCheckConditions) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Conditions: FRSEConditionSet (ref) | bool | Evaluates a list of conditions in this context (composite Blueprint conditions). |
Complete Quest Objective (CompleteQuestObjective) | function, static | RPG Saga|Quests | WorldContextObject: UObject*Quest: URSEQuestData*Objective: FName | bool | Completes an objective of an active quest's current stage. |
Get Dialog Subsystem (GetDialogSubsystem) | pure, static | RPG Saga|Dialog | WorldContextObject: UObject* | URSEDialogSubsystem* | Dialogs of the game: the running dialog, barks, history and events. |
Get Item Count (Context) (ContextGetItemCount) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Item: URSEItemData* | int32 | How many of an item the party holds in this context. |
Get Level (Context) (ContextGetLevel) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Character: URSECharacterData* | int32 | Level of a character in this context. |
Get Money (Context) (ContextGetMoney) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref) | int32 | The party's money in this context. |
Get Narrative Subsystem (GetNarrativeSubsystem) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject* | URSENarrativeSubsystem* | The story state of the game (flags, variables, puzzles, areas, events) and its events. |
Get Party Members (Context) (ContextGetPartyMembers) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref) | TArray<URSECharacterData*> | Characters in the party in this context, in menu order. |
Get Quest Status (GetQuestStatus) | pure, static | RPG Saga|Quests | WorldContextObject: UObject*Quest: URSEQuestData* | ERSEQuestStatus | Status of a quest (not started, active, completed, failed...). |
Get Quest Subsystem (GetQuestSubsystem) | pure, static | RPG Saga|Quests | WorldContextObject: UObject* | URSEQuestSubsystem* | Quests and endings of the game, with their events. |
Get Variable (GetVariable) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Variable: FGameplayTag | int32 | A story variable (Narrative.Var.*); 0 when never set. |
Get Variable (Context) (ContextGetVariable) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Variable: FGameplayTag | int32 | A story variable in this context (0 when never set). |
Get World (Context) (ContextGetWorldContext) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref) | UObject* | The game world of a context (null in headless tests). World nodes inside Blueprint effects work without it too. |
Give Item (Context) (EffectGiveItem) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Item: URSEItemData*Count: int32 = 1 | int32 | Gives items to the party (capped by the stack limit). Returns how many were added. |
Is Area Unlocked (IsAreaUnlocked) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Area: FGameplayTag | bool | Whether a story area (Narrative.Area.*) is unlocked. |
Is Area Unlocked (Context) (ContextIsAreaUnlocked) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Area: FGameplayTag | bool | Whether a story area is unlocked in this context. |
Is Dialog Active (IsDialogActive) | pure, static | RPG Saga|Dialog | WorldContextObject: UObject* | bool | A blocking dialog is running (saving, travel and random encounters wait for it). |
Is Event Seen (IsEventSeen) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Event: FGameplayTag | bool | Whether a scene or event (Narrative.Event.*) was seen. |
Is Event Seen (Context) (ContextIsEventSeen) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Event: FGameplayTag | bool | Whether a scene or event was seen in this context. |
Is Flag Set (IsFlagSet) | pure, static | RPG Saga|Narrative | WorldContextObject: UObject*Flag: FGameplayTag | bool | Whether a story flag (Narrative.Flag.*) is set. |
Is Flag Set (Context) (ContextIsFlagSet) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Flag: FGameplayTag | bool | Whether a flag is set in this context. |
Is Party Member (Context) (ContextIsPartyMember) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Character: URSECharacterData* | bool | Whether a character is in the party in this context. |
Is Puzzle Solved (IsPuzzleSolved) | pure, static | RPG Saga|Puzzles | WorldContextObject: UObject*Puzzle: FGameplayTag | bool | Whether a puzzle (Narrative.Puzzle.*) is solved. |
Is Puzzle Solved (Context) (ContextIsPuzzleSolved) | pure, static | RPG Saga|Narrative|Context | Context: FRSEConditionContext (ref)Puzzle: FGameplayTag | bool | Whether a puzzle is solved in this context. |
Is Quest Active (IsQuestActive) | pure, static | RPG Saga|Quests | WorldContextObject: UObject*Quest: URSEQuestData* | bool | The quest is active. |
Modify Member Resource (Context) (EffectModifyMemberResource) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Character: URSECharacterData*Resource: FGameplayTagDelta: float | Changes a party member's resource (HP, MP, custom) by Delta, within its bounds. | |
Modify Variable (Context) (EffectModifyVariable) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Variable: FGameplayTagOp: ERSEVariableOpValue: int32 | Sets (Op Set) or adds to (Op Add) a story variable. | |
Remove Member (Context) (EffectRemoveMember) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Character: URSECharacterData*Departure: ERSEDepartureKind = Permanent | bool | A character leaves (permanently: its equipment returns to the inventory). |
Request Battle (RequestBattle) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Encounter: TSoftObjectPtr<URSEEncounterData> | Asks the game to start a battle (the encounter decides its mode), exactly like the Start Battle effect. | |
Request Battle (Context) (EffectRequestBattle) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Encounter: TSoftObjectPtr<URSEEncounterData> | Requests a battle (performed after a running dialog, like the Start Battle effect). | |
Request Dialog (Context) (EffectRequestDialog) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Dialog: TSoftObjectPtr<UObject> | Requests a dialog (after a running dialog, like the Start Dialog effect). | |
Request Scene (RequestScene) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Scene: TSoftObjectPtr<UObject>Event: FGameplayTagbMarkSeen: bool = true | Asks the game to play a scene (Scene Data or a dialog), exactly like the Play Scene effect. | |
Request Screen (RequestScreen) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Screen: TSoftObjectPtr<UObject> | Asks the game to open the screen of a data asset (a shop, a code lock, a card opponent, a tutorial), like the effects that open them. | |
Request Screen (Context) (EffectRequestScreen) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Screen: TSoftObjectPtr<UObject> | Requests the screen of a data asset (shop, code lock, card opponent, tutorial). | |
Restore Party (Context) (EffectRestoreParty) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Character: URSECharacterData* = None | Full HP / MP, no KO, no lasting statuses. Character empty = every member. | |
Run Effects (RunEffects) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Effects: FRSEEffectList (ref) | int32 | Runs a list of effects now, in order (each one's Only If gate is checked). Returns how many ran. |
Run Effects (Context) (EffectRunEffects) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Effects: FRSEEffectList (ref) | int32 | Runs a list of effects in this context. Returns how many ran. |
Run Interaction (RunInteraction) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Interaction: URSEInteractionData* | ERSEInteractionResult | Runs an Interaction asset (conditions, then effects; one-shot ones only once). |
Set Area Unlocked (SetAreaUnlocked) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Area: FGameplayTagbUnlocked: bool = true | Unlocks (or locks again) a story area. | |
Set Area Unlocked (Context) (EffectSetAreaUnlocked) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Area: FGameplayTagbUnlocked: bool = true | Unlocks or locks a story area. | |
Set Event Seen (SetEventSeen) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Event: FGameplayTagbSeen: bool = true | Marks a scene or event seen (or unseen). | |
Set Event Seen (Context) (EffectSetEventSeen) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Event: FGameplayTagbSeen: bool = true | Marks a scene or event seen or unseen. | |
Set Flag (SetFlag) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Flag: FGameplayTagbValue: bool = true | Sets or clears a story flag. Quests, doors and conditions react at once. | |
Set Flag (Context) (EffectSetFlag) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Flag: FGameplayTagbValue: bool = true | Sets or clears a story flag (reported like the Set Flag effect). | |
Set Puzzle Solved (SetPuzzleSolved) | function, static | RPG Saga|Puzzles | WorldContextObject: UObject*Puzzle: FGameplayTagbSolved: bool = true | Marks a puzzle solved (or unsolved again). | |
Set Puzzle Solved (Context) (EffectSetPuzzleSolved) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Puzzle: FGameplayTagbSolved: bool = true | Marks a puzzle solved or unsolved. | |
Set Variable (SetVariable) | function, static | RPG Saga|Narrative | WorldContextObject: UObject*Variable: FGameplayTagValue: int32 | Sets a story variable. | |
Start Dialog (StartDialog) | function, static | RPG Saga|Dialog | WorldContextObject: UObject*Dialog: URSEDialogData*Initiator: FGameplayTagStartNode: FName = None | bool | Starts a dialog (a blocking one waits for the running one; barks start at once). Returns true when it started or was queued. |
Start Quest (StartQuest) | function, static | RPG Saga|Quests | WorldContextObject: UObject*Quest: URSEQuestData*bIgnoreAvailability: bool = false | bool | Starts a quest (checks its availability unless bIgnoreAvailability). |
Take Item (Context) (EffectTakeItem) | function, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref)Item: URSEItemData*Count: int32 = 1 | int32 | Takes up to Count items from the party. Returns how many were taken. |
To Condition Context (EffectToConditionContext) | pure, static | RPG Saga|Narrative|Context | Context: FRSEEffectContext (ref) | FRSEConditionContext | The read-only view of an effect context (to call the condition Context nodes from an effect). |
URSEBlueprintLibrary_Party
Module RSECore, display name RSEBlueprint Library Party. The party from Blueprint (D-052): members and recruitment, the ATB formation, levels and experience, attributes and resources, equipment, field use of abilities and items, and Pacts.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Experience (AddExperience) | function, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Character: URSECharacterData*Amount: int32 | FRSELevelUpResult | Gives experience to a character: levels, stats, HP / MP and class abilities follow. Returns the levels gained and what they unlocked. |
Add Experience to Party (AddExperienceToParty) | function, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Amount: int32bOnlyStanding: bool = true | int32 | Gives the same experience to every member (bOnlyStanding: members that are not KO). Returns total levels gained. |
Add Party Member (AddPartyMember) | function, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* | bool | Recruits a character (main, secondary or guest). Returns false if already a member. |
Award Pact Points (AwardPactPoints) | function, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData*Points: int32 | Gives points to a Pact (spent on its abilities). | |
Bind Pact (BindPact) | function, static | RPG Saga|Pacts | WorldContextObject: UObject*Character: URSECharacterData*Pact: URSEPactData* | ERSEPactBindResult | Binds a Pact to a main character (replacing the one it held). Only outside battle. |
Can Bind Pact (CanBindPact) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Character: URSECharacterData*Pact: URSEPactData* | ERSEPactBindResult | Whether a character may take a Pact now. |
Can Equip (CanEquip) | pure, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*Item: URSEEquipmentData*SlotId: FName | ERSEEquipResult | Whether a character could wear Item in SlotId (class, slot kind, locked guest gear; ignores the inventory). |
Can Learn Pact Ability (CanLearnPactAbility) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData*Ability: URSEAbilityData* | ERSEPactLearnResult | Whether a Pact ability can be learned now, or why not (points, prerequisites). |
Cast Ability on Members (CastAbilityOnMembers) | function, static | RPG Saga|Party|Field | WorldContextObject: UObject*User: URSECharacterData*Ability: URSEAbilityData*Targets: TArray<URSECharacterData*> (ref) | ERSEFieldUseResult | A member casts an ability outside battle (healing, cures) on members; its costs are paid. |
Equip (Equip) | function, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*Item: URSEEquipmentData*SlotId: FName | ERSEEquipResult | Takes Item from the inventory and puts it in SlotId; what it replaces goes back to the inventory. |
Forget Ability (ForgetAbility) | function, static | RPG Saga|Party|Abilities | WorldContextObject: UObject*Character: URSECharacterData*Ability: URSEAbilityData* | ERSEAbilityLearnResult | A character forgets an ability: a learned one is removed, a class ability is hidden until learned again. No Change = it does not have it. |
Get ATB Formation (GetATBFormation) | pure, static | RPG Saga|Party|Formation | WorldContextObject: UObject* | TArray<URSECharacterData*> | Members that fight in ATB / turn-based battles now, in order. |
Get ATB Party Size (GetATBPartySize) | pure, static | RPG Saga|Party|Formation | WorldContextObject: UObject* | int32 | Size of the ATB party (Battle settings of the game's rules profile). |
Get ATB Row (GetATBRow) | pure, static | RPG Saga|Party|Formation | WorldContextObject: UObject*Character: URSECharacterData* | ERSEATBRow | The ATB row (front / back) a member fights in. |
Get Bound Pact (GetBoundPact) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Character: URSECharacterData* | URSEPactData* | A character's Pact, or none. |
Get Equip Candidates (GetEquipCandidates) | pure, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*SlotId: FName | TArray<URSEEquipmentData*> | Inventory equipment the character could wear in SlotId. |
Get Equipment (GetEquipment) | pure, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData* | FRSECharacterEquipment | What a character wears (slot id -> item). |
Get Equipped Item (GetEquippedItem) | pure, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*SlotId: FName | URSEEquipmentData* | The item a character wears in a slot, or none. |
Get Experience (GetExperience) | pure, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Character: URSECharacterData* | int32 | Experience total of a character. |
Get Experience to Next Level (GetExperienceToNextLevel) | pure, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Character: URSECharacterData* | int32 | Experience still missing for the next level (0 at the maximum level). |
Get Learned Abilities (GetLearnedAbilities) | pure, static | RPG Saga|Party|Abilities | WorldContextObject: UObject*Character: URSECharacterData* | TArray<URSEAbilityData*> | Abilities a character learned through Learn Ability, in learning order. |
Get Learned Pact Abilities (GetLearnedPactAbilities) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData* | TArray<URSEAbilityData*> | Abilities learned with a Pact, in learning order. |
Get Level (GetLevel) | pure, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Character: URSECharacterData* | int32 | Current level of a character. |
Get Member Abilities (GetMemberAbilities) | pure, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* | TArray<URSEAbilityData*> | Abilities a member has now: its class's for its level, plus those of its equipment and Pact, then the learned ones. |
Get Member Attribute (GetMemberAttribute) | pure, static | RPG Saga|Party|Attributes | WorldContextObject: UObject*Character: URSECharacterData*Attribute: FGameplayTag | float | Final attribute of a member (level, equipment, derived formulas). |
Get Member Attributes (GetMemberAttributes) | pure, static | RPG Saga|Party|Attributes | WorldContextObject: UObject*Character: URSECharacterData* | FRSEAttributeSet | Every attribute of a member now (level and equipment). |
Get Member Resource (GetMemberResource) | pure, static | RPG Saga|Party|Attributes | WorldContextObject: UObject*Character: URSECharacterData*Resource: FGameplayTag | float | Current value of a member's resource (HP, MP, custom ones kept after battle). |
Get Member Resource Max (GetMemberResourceMax) | pure, static | RPG Saga|Party|Attributes | WorldContextObject: UObject*Character: URSECharacterData*Resource: FGameplayTag | float | Maximum of a member's resource now (level, equipment). |
Get Member Vitals (GetMemberVitals) | pure, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* | FRSECharacterVitals | Current resources, KO and lasting statuses of a member. |
Get Owned Pacts (GetOwnedPacts) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject* | TArray<URSEPactData*> | Pacts the party has obtained, in the order obtained. |
Get Pact Holder (GetPactHolder) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData* | URSECharacterData* | Who holds a Pact, or none. |
Get Pact Points (GetPactPoints) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData* | int32 | Unspent points of a Pact. |
Get Party Members (GetPartyMembers) | pure, static | RPG Saga|Party | WorldContextObject: UObject* | TArray<URSECharacterData*> | Characters in the party, in menu order. |
Get Party State (GetPartyState) | pure, static | RPG Saga|Party | WorldContextObject: UObject* | FRSEPartyState | The whole party state (members, inventory, money, equipment, formation, Pacts, levels), read-only. |
Get Party Subsystem (GetPartySubsystem) | pure, static | RPG Saga|Party | WorldContextObject: UObject* | URSEPartySubsystem* | The party of the game (state, attributes and resources, and their events). |
Get Tactics Roster (GetTacticsRoster) | pure, static | RPG Saga|Party|Formation | WorldContextObject: UObject* | TArray<URSECharacterData*> | Members that can be deployed in Tactics battles (main and secondary characters). |
Give Pact (GivePact) | function, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData* | bool | The party obtains a Pact. Returns false if already owned. |
Has Learned Ability (HasLearnedAbility) | pure, static | RPG Saga|Party|Abilities | WorldContextObject: UObject*Character: URSECharacterData*Ability: URSEAbilityData* | bool | Whether a character learned an ability through Learn Ability (class, equipment and Pact abilities do not count). |
Has Pact (HasPact) | pure, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData* | bool | The party owns a Pact. |
Is In ATB Formation (IsInATBFormation) | pure, static | RPG Saga|Party|Formation | WorldContextObject: UObject*Character: URSECharacterData* | bool | The member fights in ATB / turn-based battles now. |
Is Member KO (IsMemberKO) | pure, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* | bool | The member is knocked out (HP 0). |
Is Party Member (IsPartyMember) | pure, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* | bool | The character is in the party now. |
Learn Ability (LearnAbility) | function, static | RPG Saga|Party|Abilities | WorldContextObject: UObject*Character: URSECharacterData*Ability: URSEAbilityData* | ERSEAbilityLearnResult | A character learns an ability for good (like the Learn Ability effect; the game shows a notice). No Change = it already has it. |
Learn Pact Ability (LearnPactAbility) | function, static | RPG Saga|Pacts | WorldContextObject: UObject*Pact: URSEPactData*Ability: URSEAbilityData* | ERSEPactLearnResult | Spends Pact points on one of its abilities. Only outside battle. |
Modify Member Resource (ModifyMemberResource) | function, static | RPG Saga|Party|Attributes | WorldContextObject: UObject*Character: URSECharacterData*Resource: FGameplayTagDelta: float | Adds Delta (negative removes) to a member's resource, within its bounds; HP 0 = KO. | |
Notify Party Changed (NotifyPartyChanged) | function, static | RPG Saga|Party | WorldContextObject: UObject* | Reports a party change made outside story effects (quests re-evaluate, menus refresh). The nodes above do it themselves. | |
Preview Equip (PreviewEquip) | function, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*Item: URSEEquipmentData*OutCurrent: FRSEAttributeSet (out)OutAfter: FRSEAttributeSet (out) | bool | Attributes now and with Item worn instead (equipment comparison). Returns false when the character cannot wear it. |
Remove Party Member (RemovePartyMember) | function, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData*Departure: ERSEDepartureKind = Permanent | bool | A character leaves: Permanent returns its equipment to the inventory; Parallel Scenario keeps it on the character. |
Restore Party (RestoreParty) | function, static | RPG Saga|Party | WorldContextObject: UObject*Character: URSECharacterData* = None | Full HP / MP, no KO, no lasting statuses (rest points, story heals). Character empty = every member. | |
Set ATB Row (SetATBRow) | function, static | RPG Saga|Party|Formation | WorldContextObject: UObject*Character: URSECharacterData*Row: ERSEATBRow | ERSEFormationResult | Moves a member to the front or back ATB row. |
Set In ATB Formation (SetInATBFormation) | function, static | RPG Saga|Party|Formation | WorldContextObject: UObject*Character: URSECharacterData*bActive: bool | ERSEFormationResult | Moves a member into (bActive) or out of the ATB party. |
Set Level (SetLevel) | function, static | RPG Saga|Party|Progression | WorldContextObject: UObject*Character: URSECharacterData*Level: int32 | FRSELevelUpResult | Sets a character's level (experience moves to the level's threshold). |
Unbind Pact (UnbindPact) | function, static | RPG Saga|Pacts | WorldContextObject: UObject*Character: URSECharacterData* | ERSEPactBindResult | Takes a character's Pact away. Only outside battle. |
Unequip (Unequip) | function, static | RPG Saga|Party|Equipment | WorldContextObject: UObject*Character: URSECharacterData*SlotId: FName | bool | Returns the item in SlotId to the inventory. |
Use Item on Members (UseItemOnMembers) | function, static | RPG Saga|Party|Field | WorldContextObject: UObject*Item: URSEConsumableData*Targets: TArray<URSECharacterData*> (ref) | ERSEFieldUseResult | Uses one consumable on members (a single target, or several when the item hits the whole party). |
URSEBlueprintLibrary_PartyField
Module RSECore, display name RSEBlueprint Library Party Field. Party field rules for Blueprints (D-097).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Compute Formation Slots (ComputeFormationSlots) | pure, static | RPG Saga|Party Field | LeaderLocation: FVectorLeaderYaw: floatCount: int32 | TArray<FVector> | World places of Count followers behind a leader (Project Settings -> Party Field -> Formation Slots). |
Decide Follow Action (DecideFollowAction) | pure, static | RPG Saga|Party Field | DistanceToSlot: floatDistanceToLeader: float | ERSEFollowAction | What a follower does next, from its distance to its place and to the leader. |
Get Command Success Chance (GetCommandSuccessChance) | pure, static | RPG Saga|Party Field | Command: URSEPartyCommandData*Member: URSECharacterData* | float | Chance (0..1) that Member's attempt at Command works. |
URSEBlueprintLibrary_Save
Module RSE, display name RSEBlueprint Library Save. Saving and loading from Blueprint (D-052).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Allow Saving (AllowSaving) | function, static | RPG Saga|Save | WorldContextObject: UObject*Reason: FName | Lifts a save block set with Block Saving (same reason). | |
Block Saving (BlockSaving) | function, static | RPG Saga|Save | WorldContextObject: UObject*Reason: FNameScope: ERSESaveBlockScope = All | Blocks saving for a reason until Allow Saving with the same reason (a custom no-save area, a minigame). Scope Consumable Item Only still allows save points. Reasons are counted. | |
Can Save Now (CanSaveNow) | function, static | RPG Saga|Save | WorldContextObject: UObject*Source: ERSESaveRequestSourceReasons: TArray<FName> (out) | bool | Whether a save is allowed now; Reasons lists what blocks it (Battle, Dialog, Cutscene, NoSaveZone...). |
Delete Save Slot (DeleteSaveSlot) | function, static | RPG Saga|Save | WorldContextObject: UObject*SlotName: FString | bool | Deletes a save slot (its file and backup). |
Get Continue Slot (GetContinueSlot) | function, static | RPG Saga|Save | WorldContextObject: UObject*SlotName: FString (out) | bool | The most recent loadable slot (Continue). Returns false when there is none. |
Get Play Time Seconds (GetPlayTimeSeconds) | pure, static | RPG Saga|Save | WorldContextObject: UObject* | float | Play time of this game in seconds. |
Get Save Flow Subsystem (GetSaveFlowSubsystem) | pure, static | RPG Saga|Save | WorldContextObject: UObject* | URSESaveFlowSubsystem* | The save flow in the world: save points, the save item, the save screen, load and travel. |
Get Save Slots (GetSaveSlots) | function, static | RPG Saga|Save | WorldContextObject: UObject* | TArray<FRSESaveSlotInfo> | Every slot's summary (autosaves first, then manual slots; empty ones included). |
Get Save Subsystem (GetSaveSubsystem) | pure, static | RPG Saga|Save | WorldContextObject: UObject* | URSESaveSubsystem* | Save files, slots, save rules, play time and the save events. |
Get Slot Name (GetSlotName) | pure, static | RPG Saga|Save | WorldContextObject: UObject*SlotIndex: int32 | FString | Name of manual slot N (0-based). |
Has Any Save (HasAnySave) | pure, static | RPG Saga|Save | WorldContextObject: UObject* | bool | At least one loadable save exists (Continue / Load in a main menu). |
Load Game (LoadGame) | function, static | RPG Saga|Save | WorldContextObject: UObject*SlotName: FString | ERSESaveResult | Loads a slot and opens its map (the player appears where the save was made). |
Open Save Screen (OpenSaveScreen) | function, static | RPG Saga|Save | WorldContextObject: UObject*SavePointId: FName | bool | Opens the save screen (slot list), like a save point does. |
Save Game (SaveGame) | function, static | RPG Saga|Save | WorldContextObject: UObject*SlotName: FStringSavePointId: FName | ERSESaveResult | Saves the game now in a slot, with the player's place (SavePointId: the save point used, if any). Manual saves cannot overwrite the autosave slots. |
Start New Game (StartNewGame) | function, static | RPG Saga|Save | WorldContextObject: UObject* | A new game for every saved system (party, story, quests, cards...), play time back to zero. |
URSEBlueprintLibrary_Stealth
Module RSECore, display name RSEBlueprint Library Stealth. Stealth rules for Blueprints (D-097).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Advance Detection Meter (AdvanceDetectionMeter) | function, static | RPG Saga|Stealth | Meter: FRSEDetectionMeter (ref)Rate: floatDeltaSeconds: float | bool | Advances a detection meter (fills at Rate, drains after the decay delay). Returns true the moment it becomes full. |
Compute Detection Fill Rate (ComputeDetectionFillRate) | pure, static | RPG Saga|Stealth | Input: FRSEDetectionInput (ref)Behavior: URSERoamingBehaviorData* | float | How fast an enemy with Behavior fills its detection meter for what it perceives (meter share per second; 0 = nothing). |
Get Detection Awareness (GetDetectionAwareness) | pure, static | RPG Saga|Stealth | Meter: FRSEDetectionMeter (ref) | ERSEStealthAwareness | D-151: unaware, suspicious or alerted, from a meter. |
URSEBlueprintLibrary_UI
Module RSE, display name RSEBlueprint Library UI. Screens, input prompts, visual styles and player options from Blueprint (D-052).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Close Modal Screen (CloseModalScreen) | function, static | RPG Saga|UI | WorldContextObject: UObject*Screen: UObject* | Unregisters a custom screen (the HUD comes back; world input waits a moment so the closing press does not reach it). | |
Get Active Visual Style (GetActiveVisualStyle) | pure, static | RPG Saga|Visual Style | WorldContextObject: UObject* | URSEVisualStyle* | The style applied now, or none. |
Get Dialog Text Speed (GetDialogTextSpeed) | pure, static | RPG Saga|Dialog | WorldContextObject: UObject* | int32 | Index into the Dialog settings' text speed steps (the player's option). |
Get Gamepad Label Style (GetGamepadLabelStyle) | pure, static | RPG Saga|Input | ERSEGamepadLabelStyle | The gamepad label set in use (the player's choice, else the project's). | |
Get Input Device (GetInputDevice) | pure, static | RPG Saga|Input | ERSEInputDevice | The device the key prompts show (the forced one, else the one used last). | |
Get Key Label (GetKeyLabel) | pure, static | RPG Saga|Input | Key: FKey | FText | Short label of a key for prompts (theme, active gamepad label set: Xbox, PlayStation, Steam Deck). |
Get Keys Label (GetKeysLabel) | pure, static | RPG Saga|Input | Keys: TArray<FKey> (ref) | FText | The label of the first key of Keys for the device in use (empty when the device has none). |
Get Player Option Bool (GetPlayerOptionBool) | pure, static | RPG Saga|Options | Key: FStringbDefault: bool = false | bool | A stored bool player option (Default when never set). |
Get Player Option Float (GetPlayerOptionFloat) | pure, static | RPG Saga|Options | Key: FStringDefault: float = 0.000000 | float | A stored float player option (Default when never set). |
Get Player Option Int (GetPlayerOptionInt) | pure, static | RPG Saga|Options | Key: FStringDefault: int32 = 0 | int32 | A stored player option (Default when never set). Keys are shared with the built-in options screen. |
Get Player Option String (GetPlayerOptionString) | pure, static | RPG Saga|Options | Key: FStringDefault: FString | FString | A stored text player option (Default when never set). |
Get Visual Style Subsystem (GetVisualStyleSubsystem) | pure, static | RPG Saga|Visual Style | WorldContextObject: UObject* | URSEVisualStyleSubsystem* | The visual style layer of the current world (area -> player -> default). |
Get Visual Styles (GetVisualStyles) | function, static | RPG Saga|Visual Style | TArray<URSEVisualStyle*> | The styles the player can pick from, in order. | |
Is Any Modal Screen Open (IsAnyModalScreenOpen) | pure, static | RPG Saga|UI | WorldContextObject: UObject* | bool | Any modal screen is open (menus, dialogs, shops, the card table...). |
Is Dialog Auto Advance (IsDialogAutoAdvance) | pure, static | RPG Saga|Dialog | WorldContextObject: UObject* | bool | Dialog lines advance by themselves (the player's option). |
Is Game Input Blocked (IsGameInputBlocked) | pure, static | RPG Saga|UI | WorldContextObject: UObject* | bool | World actions (Interact, the menu key) must wait: a screen is open or has just closed. |
Open Modal Screen (OpenModalScreen) | function, static | RPG Saga|UI | WorldContextObject: UObject*Screen: UObject*Options: FRSEModalScreenOptions | Registers a custom screen as open: the exploration / battle HUD hides and world input waits until Close Modal Screen. | |
Set Dialog Auto Advance (SetDialogAutoAdvance) | function, static | RPG Saga|Dialog | WorldContextObject: UObject*bEnabled: bool | Turns dialog auto-advance on or off (stored in the player's options). | |
Set Dialog Text Speed (SetDialogTextSpeed) | function, static | RPG Saga|Dialog | WorldContextObject: UObject*Step: int32 | Sets the text speed step (index into the Dialog settings' steps; stored in the player's options). | |
Set Gamepad Label Style (SetGamepadLabelStyle) | function, static | RPG Saga|Input | Style: ERSEGamepadLabelStyle | The player's gamepad label set (Auto = automatic). Stored in the player's options. | |
Set Player Option Bool (SetPlayerOptionBool) | function, static | RPG Saga|Options | Key: FStringbValue: bool | Stores a bool player option (GameUserSettings.ini). | |
Set Player Option Float (SetPlayerOptionFloat) | function, static | RPG Saga|Options | Key: FStringValue: float | Stores a float player option (GameUserSettings.ini). | |
Set Player Option Int (SetPlayerOptionInt) | function, static | RPG Saga|Options | Key: FStringValue: int32 | Stores an integer player option (GameUserSettings.ini). | |
Set Player Option String (SetPlayerOptionString) | function, static | RPG Saga|Options | Key: FStringValue: FString | Stores a text player option (GameUserSettings.ini). | |
Set Quest Tracker Hidden (SetQuestTrackerHidden) | function, static | RPG Saga|Quests | WorldContextObject: UObject*Reason: FNamebHidden: bool | Hides the quest tracker while any reason is set (a custom screen, a cutscene). Battles hide it on their own. | |
Set Visual Style (SetVisualStyle) | function, static | RPG Saga|Visual Style | WorldContextObject: UObject*Style: URSEVisualStyle*bSave: bool = true | The player's style (none = the default); applied at once, saved per user when bSave. | |
Show Notification (ShowNotification) | function, static | RPG Saga|Quests | WorldContextObject: UObject*Header: FTextBody: FTextColor: FLinearColor | Shows a notification through the quest HUD (header, body, accent color). | |
Show Tutorial Screen (ShowTutorialScreen) | function, static | RPG Saga|Tutorials | WorldContextObject: UObject*Tutorial: URSETutorialData* | Shows a tutorial screen again without changing its seen state (a Help page). |
URSEBlueprintLibrary_World
Module RSE, display name RSEBlueprint Library World. The world from Blueprint (D-052): travel between maps and fast travel, areas, interaction, puzzles, story scenes, shops and the card table.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Encounter Rate Effect (AddEncounterRateEffect) | function, static | RPG Saga|Encounters | WorldContextObject: UObject*SourceId: FNameMultiplier: floatSteps: int32Seconds: float | bool | Changes the random encounter rate for a while (Repel / Lure from a Blueprint): Multiplier 0 = no random battles, 2 = twice as many; Steps and Seconds (0 = not limited) count down while exploring. SourceId: the same id refreshes or ends it. |
Discover Place (DiscoverPlace) | function, static | RPG Saga|Travel | WorldContextObject: UObject*Place: URSETravelDestinationData* | Discovers a fast-travel place (it appears on the world map). | |
Fast Travel To (FastTravelTo) | function, static | RPG Saga|Travel | WorldContextObject: UObject*Destination: URSETravelDestinationData* | bool | Fast travel to a world map place (it must be available). |
Get Current Area (GetCurrentArea) | pure, static | RPG Saga|Travel | WorldContextObject: UObject* | URSEAreaData* | The area the player is in now (area volume, else the map's area), or none. |
Get Encounter Rate Multiplier (GetEncounterRateMultiplier) | pure, static | RPG Saga|Encounters | WorldContextObject: UObject* | float | The random battle chance multiplier now: rate effects x equipment traits x the player's frequency option. |
Get Encounter Subsystem (GetEncounterSubsystem) | pure, static | RPG Saga|Encounters | WorldContextObject: UObject* | URSEEncounterSubsystem* | The world's random encounter system: rate, rate effects, generated groups, visible enemy events. |
Get Fast Travel Block (GetFastTravelBlock) | pure, static | RPG Saga|Travel | WorldContextObject: UObject* | ERSEFastTravelBlock | Whether fast travel works now, and why not (battle, dialog, story lock...). |
Get Focused Interactable (GetFocusedInteractable) | pure, static | RPG Saga|Interaction | WorldContextObject: UObject* | ARSEInteractableActor* | The interactable the prompt shows now, or none. |
Get Travel Subsystem (GetTravelSubsystem) | pure, static | RPG Saga|Travel | WorldContextObject: UObject* | URSETravelSubsystem* | Zone navigation and fast travel (TravelTo, the world map, the area catalog). |
Interact with Focused (InteractWithFocused) | function, static | RPG Saga|Interaction | WorldContextObject: UObject* | bool | Interacts with the focused interactable, like pressing Interact. |
Is Area Discovered (IsAreaDiscovered) | pure, static | RPG Saga|Travel | WorldContextObject: UObject*Area: URSEAreaData* | bool | The player has been to an area. |
Is Code Lock Solved (IsCodeLockSolved) | pure, static | RPG Saga|Puzzles | WorldContextObject: UObject*Lock: URSECodeLockData* | bool | The code lock was solved. |
Is Exploration Active (IsExplorationActive) | pure, static | RPG Saga|Exploration | WorldContextObject: UObject* | bool | The explorer has control (no battle, menu, dialog). |
Is Place Discovered (IsPlaceDiscovered) | pure, static | RPG Saga|Travel | WorldContextObject: UObject*Place: URSETravelDestinationData* | bool | A fast-travel place was discovered. |
Is Scene Playing (IsScenePlaying) | pure, static | RPG Saga|Scenes | WorldContextObject: UObject* | bool | A story scene is on screen. |
Is Traveling (IsTraveling) | pure, static | RPG Saga|Travel | WorldContextObject: UObject* | bool | A travel is queued, fading out or loading. |
Open Card Album (OpenCardAlbum) | function, static | RPG Saga|Cards | WorldContextObject: UObject* | bool | Opens the card album / deck editor. |
Open Code Lock (OpenCodeLock) | function, static | RPG Saga|Puzzles | WorldContextObject: UObject*Lock: URSECodeLockData* | Opens a code lock screen (unless it is solved), like the Open Code Lock effect. | |
Open Shop (OpenShop) | function, static | RPG Saga|Economy | WorldContextObject: UObject*Shop: URSEShopData* | Opens a shop screen, like the Open Shop effect. | |
Open World Map (OpenWorldMap) | function, static | RPG Saga|Travel | WorldContextObject: UObject*Reason: FText (out) | bool | Opens the world map (after a running dialog). Returns false when fast travel is blocked; Reason says why. |
Play Narration (PlayNarration) | function, static | RPG Saga|Puzzles | WorldContextObject: UObject*Lines: TArray<FText> (ref)Effects: TArray<URSEWorldEffect*> (ref) | bool | Narrator lines in the dialog box (examine texts, hints), then optional effects. |
Play Rest Fade (PlayRestFade) | function, static | RPG Saga|Economy | WorldContextObject: UObject* | Plays the inn's fade to black and back (the party is not changed; see Rest At Inn). | |
Play Scene (PlayScene) | function, static | RPG Saga|Scenes | WorldContextObject: UObject*Scene: URSESceneData*bReplay: bool = false | bool | Plays a story scene (queued behind a running one). bReplay: no end effects (theater). |
Skip Scene (SkipScene) | function, static | RPG Saga|Scenes | WorldContextObject: UObject* | Skips the running scene now (its end effects still run). | |
Start Card Match (StartCardMatch) | function, static | RPG Saga|Cards | WorldContextObject: UObject*Opponent: URSECardOpponentData* | bool | Starts a card match now (no dialog wait; a notice explains a refusal). |
Travel to Map (TravelToMap) | function, static | RPG Saga|Travel | WorldContextObject: UObject*Map: TSoftObjectPtr<UWorld>ArrivalPoint: FNameArea: TSoftObjectPtr<URSEAreaData> | bool | Travels to a map: fade out with the destination's name, open the map, place the player at the arrival point (ArrivalPoint None = the point for the map left, else the default one). Waits for a running dialog. |
URSECameraFocusInterface
Module RSE. RSECamera Focus Interface
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Camera Focus (GetCameraFocus) | override | RPG Saga|Camera | OutFeet: TArray<FVector> (out)OutIgnoredActors: TArray<AActor*> (out) | Feet of the characters to keep visible (world, most important first) and the actors never hidden. |
URSECameraHandOffLibrary
Module RSE. D-127: hand-overs of the player's view without a visible jump.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Freeze View (FreezeView) | function, static | RPG Saga|Camera | Controller: APlayerController*LifeSeconds: float = 2.000000 | ACameraActor* | Spawns a transient camera exactly at the controller's current view (location, rotation, field of view, post process) and makes it the view target at once: possessing another pawn no longer moves the picture, and the next Set View Target with Blend blends from this frozen view. The camera destroys itself after Life Seconds (game time; keep it longer than the blend); 0 = the caller destroys it. Returns the camera, or null without a camera manager. |
URSECameraOcclusionSubsystem
Module RSE. The camera occlusion of the RPG cameras (D-113, D-116, Camera Occlusion settings).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Circle Strength (GetCircleStrength) | pure | RPG Saga|Camera | Slot: int32 | float | D-116: how far the see-through circle is open (0..1) around the focus character Slot (0 = the leader / active unit). |
Get Fading Count (GetFadingCount) | pure | RPG Saga|Camera | int32 | Objects in the way at the last check that fade instead of hiding (opted-in materials). | |
Get Ghost Count (GetGhostCount) | pure | RPG Saga|Camera | int32 | D-116: objects (or instances) wearing the ghost material now, opening or closing. | |
Get Hidden Count (GetHiddenCount) | pure | RPG Saga|Camera | int32 | Objects hidden now (the fallback, the forced parts and the single instances). | |
Get Hidden Instance Count (GetHiddenInstanceCount) | pure | RPG Saga|Camera | int32 | Single instances of instanced meshes hidden now (D-112: trees of an instanced forest). | |
Restore All (RestoreAll) | function | RPG Saga|Camera | Shows everything the occlusion hid (a cut, the end of a battle). The next check hides what is still in the way. | ||
Update Now (UpdateNow) | function | RPG Saga|Camera | Runs a check now (tests, scripts; the timer does it on its own). |
URSECardAlbumViewModel
Module RSE. Card album and deck editor (D-028): owned cards by rarity, the deck (max size by the card rules), add / remove, auto-build and the validation message.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate (Activate) | function | RPG Saga|UI|Album | Adds the selected collection card / removes the selected deck card. | ||
Activate Row (ActivateRow) | function | RPG Saga|UI|Album | InColumn: int32Index: int32 | Selects a row and activates it (a click). | |
Auto Build (AutoBuild) | function | RPG Saga|UI|Album | Auto Build | ||
Leave (Leave) | function | RPG Saga|UI|Album | Closes the album (the last valid deck stays). | ||
Move Selection (MoveSelection) | function | RPG Saga|UI|Album | Delta: int32 | Move Selection | |
Select (Select) | function | RPG Saga|UI|Album | InColumn: int32Index: int32 | Select | |
Set Column (SetColumn) | function | RPG Saga|UI|Album | InColumn: int32 | Set Column |
URSECardChallengerComponent
Module RSE. Makes any actor (an NPC, a sign, a table) a card opponent (D-028).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Challenge (CanChallenge) | pure | RPG Saga|Cards | ERSECardChallengeResult | Whether the player can challenge now (conditions, rematch rule, deck). | |
Challenge (Challenge) | function | RPG Saga|Cards | Asks for a match (the card presentation checks CanChallenge again and explains a refusal). |
URSECardPresentationSubsystem
Module RSE. Card game director in the world (D-028).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Card Screen Open (IsBusy) | pure | RPG Saga|Cards | bool | A card screen (table or album) is open. | |
On Challenge Refused (BP_OnChallengeRefused) | event | RPG Saga|Cards | Opponent: URSECardOpponentData*Reason: ERSECardChallengeResult | A challenge was refused (conditions, rematch rule, deck; Blueprint). | |
On Match Presented (BP_OnMatchPresented) | event | RPG Saga|Cards | Result: FRSECardMatchResult (ref) | The table closed after a match (Blueprint). | |
Open Album (OpenAlbum) | function | RPG Saga|Cards | bool | Opens the album / deck editor. Returns false when busy. | |
Start Challenge (StartChallenge) | function | RPG Saga|Cards | Opponent: URSECardOpponentData* | bool | Starts a match against Opponent now. Returns false when refused (a notice explains why). |
URSECardSubsystem
Module RSECore. Owns the player's card collection for the session and runs matches (D-028).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Auto Build Deck (AutoBuildDeck) | function | RPG Saga|Cards | Replaces the deck with the strongest one from the owned cards (RSECardDeck::BuildBest). | ||
Can Challenge (CanChallenge) | pure | RPG Saga|Cards | Opponent: URSECardOpponentData* | ERSECardChallengeResult | Whether the player can challenge Opponent now (conditions, rematch rule, deck). |
Get Card Collection (GetCollectionBP) | pure | RPG Saga|Cards | FRSECardCollection | Owned cards and counts, the deck and the record against each opponent (read-only). | |
Get Card Count (GetCardCount) | pure | RPG Saga|Cards | Card: URSECardData* | int32 | Copies of a card the player owns. |
Get Deck (GetDeckBP) | pure | RPG Saga|Cards | TArray<URSECardData*> | The player's deck, in order. | |
Get Wins (GetWins) | pure | RPG Saga|Cards | Opponent: URSECardOpponentData* | int32 | Matches won against an opponent. |
Give Card (GiveCard) | function | RPG Saga|Cards | Card: URSECardData*Count: int32 = 1 | int32 | Adds copies (capped by MaxCopiesPerCard). Returns copies added. |
On Card Collection Changed (OnCardCollectionChanged) | event | RPG Saga|Cards | Owned cards or the deck changed. | ||
On Card Match Finished (OnCardMatchFinished) | event | RPG Saga|Cards | Result: FRSECardMatchResult (ref) | A match was played and applied (the table replays it). | |
On Card Match Requested (OnCardMatchRequested) | event | RPG Saga|Cards | Opponent: TSoftObjectPtr<URSECardOpponentData> (ref) | A Start Card Match effect or Request Match asked for a match. | |
Play Match (Instant) (PlayMatchBP) | function | RPG Saga|Cards | Opponent: URSECardOpponentData*Seed: int32OutResult: FRSECardMatchResult (out) | bool | Plays and applies a whole match at once, without the table screen (record, stake, rewards). Seed 0 = the next seed of the game's Cards stream (world seed). |
Request Match (RequestMatchBP) | function | RPG Saga|Cards | Opponent: URSECardOpponentData* | Asks the presentation to start a match (checks come there), like the Start Card Match effect. | |
Set Deck (SetDeck) | function | RPG Saga|Cards | Deck: TArray<URSECardData*> (ref) | ERSEDeckValidation | Replaces the deck if it is valid. |
Simulate Match (SimulateMatchBP) | pure | RPG Saga|Cards | Opponent: URSECardOpponentData*Seed: int32OutResult: FRSECardMatchResult (out) | bool | The same match without changing anything (previews). |
Take Card (TakeCard) | function | RPG Saga|Cards | Card: URSECardData*Count: int32 = 1 | int32 | Removes up to Count copies; the deck loses copies no longer owned. Returns copies removed. |
Validate Deck (ValidateDeck) | pure | RPG Saga|Cards | Deck: TArray<URSECardData*> (ref) | ERSEDeckValidation | Whether a deck is valid (size, owned copies), or why not. |
URSECardTableViewModel
Module RSE. The War card table (D-028): replays a finished match (RSECardTimeline) step by step, then shows the result.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Continue (Continue) | function | RPG Saga|UI|Cards | Leaves the result (only once it is shown). | ||
Cycle Speed (CycleSpeed) | function | RPG Saga|UI|Cards | Next replay speed (Cards UI -> SpeedOptions). | ||
Get Match Card (GetMatchCard) | pure | RPG Saga|UI|Cards | MatchCard: int32 | URSECardData* | The card of a match card index (steps refer to cards by index). |
On Step (OnStep) | event | RPG Saga|UI|Cards | Step: FRSECardAnimStep (ref) | Every replay step as it starts (animate it). | |
Skip to Result (SkipToResult) | function | RPG Saga|UI|Cards | Jumps to the end of the replay and shows the result. |
URSECharacterAnimInstance
Module RSE. Animation logic of every character (D-046, CLAUDE.md 3.5), in C++ so Anim Blueprints stay thin: - locomotion values for the blend space (Speed, Direction, bIsMoving), measured from the movement component or, for actors moved directly (grid units, battle cue moves), from their motion; plus the inputs...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Battle State (GetBattleState) | pure | RPG Saga|Animation | ERSEAnimBattleState | The battle pose state the animation shows (idle, ready, hit, KO...). | |
Get Last Hit Direction (GetLastHitDirection) | pure | RPG Saga|Animation | ERSEHitDirection | Side the last hit came from (Front before any hit). | |
Get Stance Overlay Alpha (GetStanceOverlayAlpha) | pure | RPG Saga|Animation | float | D-185 addendum 2: the weight of the upper body stance now (0..1). | |
Get Stance Overlay Sequence (GetStanceOverlaySequence) | pure | RPG Saga|Animation | UAnimSequenceBase* | D-185 addendum 2: the stance clip playing over the upper body (null when none). | |
Play Approach (PlayApproach) | function | RPG Saga|Animation | float | The anim set's dash toward a target (battle cue Move, To Target). Returns seconds (0 = none: locomotion shows the move). | |
Play Reaction (PlayReaction) | function | RPG Saga|Animation | Reaction: ERSEAnimReaction | float | Plays a one-shot reaction over the current state (not while Down), as if from the front. Returns seconds it lasts (0 = none). |
Play Reaction From (PlayReactionFrom) | function | RPG Saga|Animation | Reaction: ERSEAnimReactionFromLocation: FVector (ref)bHeavy: bool = false | float | Plays a one-shot reaction to a hit coming from a world location: the anim set's animation for that side (and HitHeavy for a heavy hit from the front). A knock-out soon after falls the same way. Returns seconds (0 = none). |
Play Weapon Recoil (PlayWeaponRecoil) | function | RPG Saga|Animation | HoldType: ERSEWeaponHoldType = AutoScale: float = 1.000000 | float | D-185 addendum 2: kicks the procedural recoil (the spine and the weapon arm pitch, then recover): guns without a fire clip. The held weapon's kick (its hold profile, else the Weapon Hold settings' Recoil Defaults); HoldType picks the settings' kick when nothing is held. Needs the recoil nodes of the Anim Blueprint (Add Weapon Layers). Returns seconds it lasts (0 = off). |
Set Battle State (SetBattleState) | function | RPG Saga|Animation | NewState: ERSEAnimBattleState | Enters a battle state: its animation loops (Down and a non-looping Victory hold their last pose). | |
Set Variant Seed (SetVariantSeed) | function | RPG Saga|Animation | Seed: int32 | Seed of the random animation variants (RSECharacterAnim::MakeSeed: battle seed + unit id). Resets the play counts, so the same battle events pick the same variants. |
URSEClockHUDSubsystem
Module RSE. Shows the HUD clock while exploring in levels that have a Time of Day actor (D-101).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Set Clock Hidden (SetClockHidden) | function | RPG Saga|Time | bHidden: bool | Hides the clock (a cinematic, a screenshot) until shown again. |
URSECodeLockViewModel
Module RSE. A code lock (D-039): digit, symbol or clock-hand wheels.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Leave (Leave) | function | RPG Saga|UI|CodeLock | Leave | ||
Select Wheel (SelectWheel) | function | RPG Saga|UI|CodeLock | Wheel: int32 | Select Wheel | |
Step Selected Wheel (StepSelectedWheel) | function | RPG Saga|UI|CodeLock | Direction: int32 | Moves the wheel selection (-1 left, +1 right, wrapping). | |
Submit (Submit) | function | RPG Saga|UI|CodeLock | Enters the code (D-138: the Submit Code command, checked on the authority): opens (and closes the screen), shows the wrong text, or locks out, when the outcome arrives. | ||
Turn Wheel (TurnWheel) | function | RPG Saga|UI|CodeLock | Delta: int32 | Turns the selected wheel by Delta positions. | |
Turn Wheel At (TurnWheelAt) | function | RPG Saga|UI|CodeLock | Wheel: int32Delta: int32 | Selects Wheel and turns it (the arrows above / below each wheel). |
URSECombatRoleLibrary
Module RSE. Combat roles of placed objects (D-093): the role of a component, an actor or an asset, the cover information of a hit (for line of sight, cover and movement queries such as Free Tactics' cover query), and whether a place is inside a Combat Area.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Place At (CanPlaceAt) | pure, static | RPG Saga|Combat Roles | WorldContext: UObject*Asset: UObject*Location: FVector | bool | Whether placement tools may put Asset (a mesh, Blueprint or class) at Location: false when its role keeps it out of Combat Areas and Location is inside one. |
Can Place in Combat Area (CanPlaceInCombatArea) | pure, static | RPG Saga|Combat Roles | Asset: UObject* | bool | Whether Asset (a mesh, Blueprint or class) may be placed inside Combat Areas (false when its role keeps it out). |
Get Actor Role (GetActorRole) | pure, static | RPG Saga|Combat Roles | Actor: AActor* | FRSECombatRoleResolution | The role of a placed actor (its Combat Role component or tag, else its root mesh's or class's role). |
Get Asset Role (GetAssetRole) | pure, static | RPG Saga|Combat Roles | Asset: UObject* | FRSECombatRoleResolution | The role stored for an asset: a static mesh, a Blueprint or an actor class (parents' roles are inherited). |
Get Component Role (GetComponentRole) | pure, static | RPG Saga|Combat Roles | Component: UPrimitiveComponent* | FRSECombatRoleResolution | The role of a placed component (all instances of an instanced mesh share it). |
Get Cover Info (GetCoverInfo) | pure, static | RPG Saga|Combat Roles | Component: UPrimitiveComponent*InstanceIndex: int32 = -1 | FRSECombatRoleCover | Cover and blocking information of a placed component (a line trace's Hit Component and Item): the role's flags and the blocking volume in world space (the mesh's simple collision bounds, per instance for instanced meshes). |
Is in Combat Area (IsInCombatArea) | pure, static | RPG Saga|Combat Roles | WorldContext: UObject*Location: FVector | bool | Whether a world position lies inside an enabled Combat Area of the level. |
URSECommandHandler
Module RSECore. Validates and applies one command type (D-133).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply (Apply) | override | RPG Saga|Commands | Context: FRSECommandContext (ref)Command: FInstancedStruct (ref) | Changes the state (only after Validate passed). Fire the system's own events as usual. | |
Get Command Type (GetCommandType) | override | RPG Saga|Commands | UScriptStruct* | The command struct this handler applies (derived from RSE Command). Default: Command Type. | |
Validate (Validate) | override | RPG Saga|Commands | Context: FRSECommandContext (ref)Command: FInstancedStruct (ref)OutReason: FText (out) | bool | Whether the command may run now (the sender, the state, the arguments). Must not change state. Return false with a Reason the player can read. Default: true. |
URSECommandSubsystem
Module RSECore. The command bus (D-124 §3.3, D-133): the one path by which player actions change game state, in every mode.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Submit (CanSubmit) | pure | RPG Saga|Commands | Command: FInstancedStruct (ref) | FRSECommandResult | Whether a command would be accepted now (handler found, permission, Validate), without applying it. On a guest: local check only. |
Get Current Instigator (GetCurrentInstigator) | pure | RPG Saga|Commands | FRSEPlayerId | Sender of the command being applied right now, else this machine's player. | |
Get Permission (GetPermission) | pure | RPG Saga|Commands | CommandType: UScriptStruct* | ERSECommandPermission | Who may send CommandType now: the project's permission rule, else its handler's permission (AnyPlayer without a handler). |
Has Handler (HasHandler) | pure | RPG Saga|Commands | CommandType: UScriptStruct* | bool | A handler is registered for CommandType or one of its base structs. |
Is Allowed For (IsAllowedFor) | pure | RPG Saga|Commands | CommandType: UScriptStruct*Player: FRSEPlayerId | bool | Whether Player may send CommandType by permission alone (no state check): the UI greys out what a guest may not do. The game itself (None) and the host always may. |
Is Applying Command (IsApplyingCommand) | pure | RPG Saga|Commands | bool | A command is being applied right now (handlers, effects). | |
On Command Result (OnCommandResult) | event | RPG Saga|Commands | Result: FRSECommandResult (ref) | A command sent from this machine or applied on it has a result (Applied, Rejected...). | |
Register Handler Class (RegisterHandlerClass) | function | RPG Saga|Commands | HandlerClass: TSubclassOf<URSECommandHandler> | URSECommandHandler* | Creates a handler of HandlerClass and registers it. Returns the handler, or null. |
Register Handler Object (RegisterHandlerObject) | function | RPG Saga|Commands | Handler: URSECommandHandler* | Adds a handler object for its command type; one already registered for that type is replaced (with a warning). | |
Set Command Outcome (SetCommandOutcome) | pure | RPG Saga|Commands | Outcome: FInstancedStruct (ref) | Attaches what the command being validated or applied did, in its system's terms (any USTRUCT): it is returned in the command's result (FRSECommandResult::Outcome) and sent back to a guest. Call it from a handler's Validate or Apply; the last call wins. Outside a handler it does nothing. | |
Submit Command (Submit) | function | RPG Saga|Commands | Command: FInstancedStruct (ref) | FRSECommandResult | Sends a command as this machine's player. Command: any struct derived from RSE Command (Make Instanced Struct). |
Submit Command As (SubmitAs) | function | RPG Saga|Commands | Command: FInstancedStruct (ref)Instigator: FRSEPlayerId | FRSECommandResult | Sends a command for another player or for the game itself (FRSEPlayerId::None): AI, scripted sequences, tools, tests. Only where this machine has authority; a guest gets Not Allowed. |
Unregister Handler (UnregisterHandler) | function | RPG Saga|Commands | CommandType: UScriptStruct* | Removes the handler of CommandType (exactly that type). |
URSECommonUISubsystem
Module RSECommonUI. One local player's CommonUI host layer (D-176, docs/product/common-ui.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Screen Host (FindScreenHost) | pure | RPG Saga|UI|Common UI | Screen: URSEScreenWidget* | URSECommonScreenHost* | The host of Screen while it is on a layer, else null. |
Get Layer Stack (GetLayerStack) | function | RPG Saga|UI|Common UI | Layer: ERSECommonUILayer | UCommonActivatableWidgetContainerBase* | The stack of Layer (made with the layout when needed). Null without a local player controller or Slate. |
Get Layout (GetLayout) | pure | RPG Saga|UI|Common UI | URSECommonUILayout* | The layout made for this player (null when the project registered its own stacks or none was needed yet). | |
Get RSE Common UI (GetFor) | pure, static | RPG Saga|UI|Common UI | Player: UObject* | URSECommonUISubsystem* | The CommonUI host layer of the local player behind Player (a controller, pawn, widget or local player), or null. |
Pop Screen (PopScreen) | function | RPG Saga|UI|Common UI | Screen: URSEScreenWidget* | Pops Screen's host from its stack (the screen itself stays alive; its owner removes it). | |
Push Screen (PushScreen) | function | RPG Saga|UI|Common UI | Screen: URSEScreenWidget*Layer: ERSECommonUILayer | URSECommonScreenHost* | Pushes an RPG Saga screen onto Layer in a screen host. Returns the host (null when the layer has no stack). |
Push Widget to Layer (PushWidgetToLayer) | function | RPG Saga|UI|Common UI | Layer: ERSECommonUILayerWidgetClass: TSubclassOf<UCommonActivatableWidget> | UCommonActivatableWidget* | Pushes one of the project's activatable widgets onto Layer (above our screens there). |
Register Layer Stack (RegisterLayerStack) | function | RPG Saga|UI|Common UI | Layer: ERSECommonUILayerStack: UCommonActivatableWidgetContainerBase* | Uses Stack for Layer (a stack of the project's own primary layout). While any stack is registered no layout is made; layers without a stack then fall back to the nearest registered one below (else above). |
URSECompanionOrderPolicy
Module RSECore. Who may order which companion in co-op (D-142).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Order (CanOrder) | override | RPG Saga|Co-op | Issuer: FRSEPlayerIdMember: FPrimaryAssetIdMemberController: FRSEPlayerIdbMultiplayer: bool | bool | Whether Issuer may order Member (invalid = "the best member", chosen later among the free ones), which MemberController drives now (invalid = the companion AI). bMultiplayer: several players share the world. |
URSECompassView
Module RSE. The compass bar (D-092): cardinal points and ticks turning with the camera, markers at their bearing with the distance in meters and an up / down arrow, faded by distance.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Show View Model (ShowViewModel) | function | RPG Saga|Map | ViewModel: URSECompassViewModel* | Shows a compass view-model's places. |
URSECondition_Custom
Module RSECore, display name Custom (Blueprint). A condition written in Blueprint: create a Blueprint class from it, override Is Condition Met and read the game through the "Context" nodes (RPG Saga\|Narrative\|Context) or any other node.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Condition Met (IsConditionMet) | override | RPG Saga|Conditions | Context: FRSEConditionContext (ref) | bool | Whether the condition holds now. |
URSECoopEncounterPolicy
Module RSECore. Turns an encounter request into the battle to fight now (D-142).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Resolve (Resolve) | override | RPG Saga|Co-op | Encounter: URSEEncounterData*SessionPlayers: int32 | FRSECoopEncounterResolution | The battle Encounter becomes with SessionPlayers players in the session (0 or 1 = single player). |
URSECoopNoticeSubsystem
Module RSE. One path for the co-op notices (D-142, docs/design/networking.md §9): any system calls Notify (one player) or NotifyAll; the presentation router delivers it to the player's machine (RSENet for a remote one), where it shows through the HUD's notification (the quest HUD's notice) and On Notice (for a...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Notify (Notify) | function | RPG Saga|Co-op | Player: FRSEPlayerIdTitle: FText (ref)Detail: FText (ref)Kind: ERSECoopNoticeKind = Info | bool | Shows a notice to Player (their machine). Returns whether it was shown or sent. |
Notify All (NotifyAll) | function | RPG Saga|Co-op | Title: FText (ref)Detail: FText (ref)Kind: ERSECoopNoticeKind = Info | int32 | Shows a notice to every player (the authority's players; elsewhere the local ones). Returns players reached. |
On Notice (OnNotice) | event | RPG Saga|Co-op | Player: APlayerController*Notice: FRSEPresentation_Notice (ref) | Every notice shown on this machine (after the repeat filter). |
URSECoverProvider
Module RSECore, display name Cover Provider. The pluggable answer to "what cover does this blocker give?" for Free Tactics line of sight and cover (D-091).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Blocker Cover (GetBlockerCover) | override | RPG Saga|Free Tactics | Blocker: FRSENavBlocker (ref) | ERSECoverLevel | Cover the blocker gives. Full blocks sight and projectiles; Partial protects a target standing close behind it; None lets everything through (never return Auto). |
URSEDetectionMeterComponent
Module RSE. The detection meter over a visible enemy (D-097): a screen-space bar that fills while the enemy sees or hears the party and turns into "!" when it notices it.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Shown Value (GetShownValue) | pure | RPG Saga|Stealth | float | The value shown now. | |
Set Detection (SetDetection) | function | RPG Saga|Stealth | Value: floatbAlerted: bool | Shows Value (0..1; hidden at or below Stealth -> Show Meter Above unless bAlerted). | |
Set Prompt (SetPrompt) | function | RPG Saga|Stealth | Prompt: FText (ref) | D-151: a prompt under the meter (shown even while the meter is empty); empty text = none. |
URSEDialogControlPolicy
Module RSECore. Who controls a dialog in co-op (D-094, D-138): "the one who started it speaks, the others watch; story choices by the host, the speaker or a vote".
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Control Flow (CanControlFlow) | override | RPG Saga|Dialog|Co-op | Player: FRSEPlayerIdSpeaker: FRSEPlayerId | bool | Whether Player may advance lines, skip and finish waits of Speaker's dialog. Default: the speaker, and the host by setting. |
Get Choice Decider (GetChoiceDecider) | override | RPG Saga|Dialog|Co-op | Dialog: URSEDialogData*NodeId: FNameNodeDecider: ERSEDialogChoiceDecider | ERSEDialogChoiceDecider | Who picks the option of a choice. NodeDecider is the choice node's own setting (Default = the rules decide). Default: the node's setting, else Story Choice Decider for dialog assets and System Choice Decider for prompts made at run time (puzzles, travel questions). |
Get Voters (GetVoters) | override | RPG Saga|Dialog|Co-op | WorldContext: UObject*OutVoters: TArray<FRSEPlayerId> (out) | Who votes on a vote choice. Default: the session's players (URSEAuthoritySubsystem::GetSessionPlayers). | |
Resolve Vote (ResolveVote) | override | RPG Saga|Dialog|Co-op | Votes: TArray<FRSEDialogVote> (ref)Options: TArray<FName> (ref)Speaker: FRSEPlayerId | FName | The winning option of a vote. Options = the choice's available options in display order. Default: the majority; a tie goes to the speaker's vote, then the host's, then the first of the tied options. None = no votes (nothing is picked). |
URSEDialogLayout
Module RSE. How the dialog screen is arranged (P61).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Box Width Fraction (GetBoxWidthFraction) | pure, static | RPG Saga|UI Layout | bCinematic: bool | float | The width share of the classic box (Dialog UI -> Box Width Fraction, or the cinematic one). |
Get Column Width (GetColumnWidth) | override | RPG Saga|UI Layout | float | The column's fixed width the screen builds (0 = none: the layout's anchors give the width). | |
Update Anchor (UpdateAnchor) | override | RPG Saga|UI Layout | Context: URSEScreenLayoutContext*ScreenPosition: FVector2DbOnScreen: bool | World-anchored layouts: moves the column to the speaker. ScreenPosition is over the speaker's head (layout units); bOnScreen false = no speaker actor or off screen (show the line somewhere readable). Called every frame while a line shows, so it must only move slots (no new widgets). |
URSEDialogSubsystem
Module RSECore. Owns the dialogs of the game session (dialog-proposal.md 5.2): - one blocking dialog at a time (IsDialogActive: read by input, saving and random encounters) plus barks; - starts dialogs requested by the StartDialog effect (URSENarrativeSubsystem::GetEvents().OnDialogRequested); - defers requests mad...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Player Choose (CanPlayerChoose) | pure | RPG Saga|Dialog | Player: FRSEPlayerId | bool | Whether Player may answer the active dialog's choice now (always true for a vote's voters). |
Can Player Control Flow (CanPlayerControlFlow) | pure | RPG Saga|Dialog | Player: FRSEPlayerId | bool | Whether Player may advance, skip or finish waits of the active dialog. |
Get Active Choice Decider (GetActiveChoiceDecider) | pure | RPG Saga|Dialog | ERSEDialogChoiceDecider | Who picks the option of the choice on screen (Speaker, Host or Vote; Default resolved by the policy). | |
Get Active Run Id (GetActiveRunId) | pure | RPG Saga|Dialog | int32 | The running blocking dialog's run number (0 = none). Commands name it, so they never touch another dialog. | |
Get Active Speaker (GetActiveSpeaker) | pure | RPG Saga|Dialog | FRSEPlayerId | The player who started the running blocking dialog: they speak, the others watch. | |
Get Deferred Request Count (GetDeferredRequestCount) | pure | RPG Saga|Dialog | int32 | Number of dialog requests (battles, scenes, screens) waiting for the running dialog to end. | |
Get Vote Seconds Left (GetVoteSecondsLeft) | pure | RPG Saga|Dialog | float | Seconds the running vote has left (0 = no vote, or no timeout). | |
Get Votes (GetVotes) | pure | RPG Saga|Dialog | TArray<FRSEDialogVote> | Votes cast on the choice on screen (vote choices only). | |
Is Dialog Active (IsDialogActive) | pure | RPG Saga|Dialog | bool | A blocking dialog is running. | |
Is Mirroring Dialog (IsMirroringDialog) | pure | RPG Saga|Dialog | bool | The active dialog is the authority's, shown here (a guest). | |
On Bark Started (BP_OnBarkStarted) | event | RPG Saga|Dialog | Dialog: URSEDialogData* | A bark (ambient line over an NPC) started. | |
On Dialog Ended (BP_OnDialogEnded) | event | RPG Saga|Dialog | Outcome: FGameplayTagbCompleted: bool | A blocking dialog ended: its outcome tag and whether it reached its end (false when aborted). | |
On Dialog Started (BP_OnDialogStarted) | event | RPG Saga|Dialog | Dialog: URSEDialogData* | A blocking dialog started (Blueprint). | |
On Dialog Votes Changed (BP_OnVotesChanged) | event | RPG Saga|Dialog | NodeId: FNameVotes: TArray<FRSEDialogVote> (ref) | ||
Set Control Policy (SetControlPolicy) | function | RPG Saga|Dialog | Policy: URSEDialogControlPolicy* | Replaces the policy at run time (a session rule, a mode); null = back to the settings' class. |
URSEDialogViewModel
Module RSE. The dialog (dialog-proposal.md 6.2-6.5): blocking dialog box with speaker, portraits, typewriter text, choices, backlog, auto-advance, fast-forward and skip; plus barks and emote balloons.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Advance (Advance) | function | RPG Saga|UI|Dialog | Line: reveals the rest, or goes to the next line. Title card: skips it. | ||
Cancel Choice (CancelChoice) | function | RPG Saga|UI|Dialog | Picks the choice's cancel option (when it has one). | ||
Choose Option (ChooseOption) | function | RPG Saga|UI|Dialog | Index: int32 | Highlights an option and confirms it (a click). | |
Confirm Choice (ConfirmChoice) | function | RPG Saga|UI|Dialog | Confirms the highlighted option (locked ones do nothing). | ||
Finish Title Card (FinishTitleCard) | function | RPG Saga|UI|Dialog | Finish Title Card | ||
Get Choices Text (GetChoicesText) | pure | RPG Saga|UI|Dialog | FText | The choices as one text, one per line, the selected one marked (simple dialog screens). | |
Handle Click (HandleClick) | function | RPG Saga|UI|Dialog | Advance on a mouse click (Dialog UI -> bClickToAdvance). | ||
Handle Dialog Key (HandleDialogKey) | function | RPG Saga|UI|Dialog | Key: FKeybPressed: boolbRepeat: bool | bool | Every dialog key of the Dialog UI settings (advance, up / down, cancel, backlog, auto, fast-forward, skip), as the built-in box reads them. bPressed false = key up (fast-forward release). Returns true when the key is a dialog key. |
Move Choice (MoveChoice) | function | RPG Saga|UI|Dialog | Delta: int32 | Move Choice | |
On Screen Fx (OnScreenFx) | event | RPG Saga|UI|Dialog | Style: FRSEDialogScreenFxStyle (ref)Seconds: float | A cue asked for a screen effect (fade, flash, shake). | |
Select Choice (SelectChoice) | function | RPG Saga|UI|Dialog | Index: int32 | Select Choice | |
Set Fast Forward (SetFastForward) | function | RPG Saga|UI|Dialog | bHeld: bool | Fast-forward held (read lines type at once and advance quickly). | |
Skip Scene (SkipScene) | function | RPG Saga|UI|Dialog | Skips the scene (skippable dialogs; a Level Sequence scene is skipped as a whole). | ||
Toggle Auto Advance (ToggleAutoAdvance) | function | RPG Saga|UI|Dialog | Toggle Auto Advance | ||
Toggle Backlog (ToggleBacklog) | function | RPG Saga|UI|Dialog | Toggle Backlog |
URSEDifficultySubsystem
Module RSECore. Adaptive difficulty controller (CLAUDE.md 2.8, D-007): one per game session, one value per battle mode.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Difficulty State (GetStateBP) | pure | RPG Saga|Difficulty | FRSEDifficultyState | The whole adaptive state (per mode: intelligence, recent battles), read-only. | |
Get Intelligence For Encounter (GetIntelligenceForEncounterBP) | pure | RPG Saga|Difficulty | Encounter: URSEEncounterData* | float | Enemy intelligence a battle of Encounter would use now (its mode, its bounds, the override). |
Get Mode Intelligence (GetModeIntelligence) | pure | RPG Saga|Difficulty | Mode: FGameplayTag (ref) | float | Current adaptive enemy intelligence (0-1) of a battle mode, before encounter bounds and overrides. |
Set Mode Intelligence (SetModeIntelligence) | function | RPG Saga|Difficulty | Mode: FGameplayTagIntelligence: float | Sets the adaptive enemy intelligence (0-1) of a battle mode, e.g. a chapter that starts harder. The adaptation continues from there (the Difficulty settings' limits still apply to battles). Saved. |
URSEDoorComponent
Module RSE, display name RSE Door. Door behavior for any actor (D-165, docs/product/components.md): add it with an RSE Interactable component to your own door actor; Interact opens and closes it (a locked one says Interiors -> Locked Door Text), the prompt follows ("Open" / "Close"), and the swinging part (Swing Component: your leaf...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Prompt Text (GetPromptText) | pure | RPG Saga|Interiors | FText | The prompt now: Open Text / Close Text, else Interiors -> Open / Close Door Text. | |
Is Locked (IsLocked) | pure | RPG Saga|Interiors | bool | Is Locked | |
Is Open (IsOpen) | pure | RPG Saga|Interiors | bool | Is Open | |
On Door Changed (OnDoorChanged) | event | RPG Saga|Interiors | Door: URSEDoorComponent*bOpen: bool | Raised when the door opens or closes. | |
Set Locked (SetLocked) | function | RPG Saga|Interiors | bInLocked: bool | Locks or unlocks it (a locked door does not open). | |
Set Open (SetOpen) | function | RPG Saga|Interiors | bInOpen: boolbAnimate: bool = true | Opens or closes the door (swinging, or at once). | |
Use Door (UseDoor) | function | RPG Saga|Interiors | What Interact does: says the locked line, or opens / closes it. |
URSEDoorDetectorLibrary
Module RSE. Door detection for Blueprint and Python (D-158).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Building Door (FindBuildingDoor) | function, static | RPG Saga|Buildings | Building: AActor* | FRSEDoorFinding | Finds the door of a building whose door is modelled into its mesh (sockets, then its geometry). |
URSEEffect_Custom
Module RSECore, display name Custom (Blueprint). A custom effect written in Blueprint (D-052): subclass it, override On Apply and use the battle's Blueprint API (resources, attributes, statuses through other effects).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Apply (OnApply) | override | RPG Saga|Abilities | Battle: URSEBattle*SourceId: int32TargetId: int32TargetTile: FRSEGridCoordPowerMultiplier: float | Applies the effect. Change the battle through its nodes (Deal Damage, Heal Unit, Change Resource, Apply Status, Shift Turn...) and draw random numbers with Roll Int / Roll Percent so replays and the simulator stay deterministic. | |
Preview Damage (PreviewDamage) | override | RPG Saga|Abilities | Battle: URSEBattle*SourceId: int32TargetId: int32PowerMultiplier: float | float | Expected HP damage on the target (negative = healing), without rolling and without changing the battle: the damage forecast and the AI read it. Default 0 (the AI then sees no value in the effect). The source may be hypothetical. |
URSEEncounterSubsystem
Module RSE. Random encounters v2 in the world (D-063, docs/design/random-encounters.md): - counts world steps while the explorer walks (rate effect durations, step respawns of visible groups; saved in the World section); - the encounter rate multiplier: party rate effects x equipment traits x the player's frequ...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Rate Effect (AddRateEffect) | function | RPG Saga|Encounters | Effect: FRSEEncounterRateEffect (ref) | bool | Adds a rate effect (the Encounters settings' stacking rules apply). Returns true if the state changed. |
Compose Encounter (ComposeEncounter) | function | RPG Saga|Encounters | Pool: URSEEncounterPoolData*Seed: int32 = 0 | URSEEncounterData* | A new group from Pool for the current party and progression zone (the pool's zone, else the current area's). Seed 0 = a random one. The encounter is transient and kept alive while it may be fought. Null when the pool has no usable entry. |
Get Active Rate Effects (GetActiveRateEffects) | pure | RPG Saga|Encounters | TArray<FRSEEncounterRateEffect> | The party's active rate effects (steps and seconds left). | |
Get Detection Scale (GetDetectionScale) | pure | RPG Saga|Encounters | float | Visible enemies' detection radius scale from the rate (Encounters settings: Rate Scales Enemy Detection). | |
Get Encounter Rate Multiplier (GetEncounterRateMultiplier) | pure | RPG Saga|Encounters | float | Multiplier of the random battle chance now: rate effects x equipment traits x the frequency option x the time and weather rules (Encounter Rate, D-101 / D-104), capped by the Encounters settings' Max Rate Multiplier (0 = none). | |
Get Frequency Index (GetFrequencyIndex) | pure | RPG Saga|Encounters | int32 | The player's battle frequency choice (index into GetFrequencyNames). | |
Get Frequency Names (GetFrequencyNames) | pure | RPG Saga|Encounters | TArray<FText> | Names of the player's battle frequency choices (Encounters settings), in menu order. | |
Get Party Level (GetPartyLevel) | pure | RPG Saga|Encounters | int32 | Party level used for generated groups (the ATB formation, Progression "Party Level Source"). | |
Get Rate Effects Multiplier (GetRateEffectsMultiplier) | pure | RPG Saga|Encounters | float | Only the active rate effects (items, abilities, story effects), without traits and the option. | |
Get World Steps (GetWorldSteps) | pure | RPG Saga|Encounters | int64 | World steps walked over the whole game (saved). | |
Is Contact Allowed (IsContactAllowed) | pure | RPG Saga|Encounters | bool | Visible enemies may start a battle now (no battle running, the post-battle grace is over, exploration has control). | |
On Encounter Contact (BP_OnEncounterContact) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*Encounter: URSEEncounterData*Initiative: ERSEBattleInitiative | ||
On Encounter Rate Changed (BP_OnRateChanged) | event | RPG Saga|Encounters | Multiplier: float | --- Events --- | |
On Enemy Alerted (BP_OnEnemyAlerted) | event | RPG Saga|Encounters | Spawner: ARSEEncounterSpawner*Enemy: ARSERoamingEnemy*bAlerted: bool | ||
Remove Rate Effect (RemoveRateEffect) | function | RPG Saga|Encounters | SourceId: FName | bool | Ends the rate effect of SourceId (None = every effect). Returns true if one ended. |
Set Frequency Index (SetFrequencyIndex) | function | RPG Saga|Encounters | Index: int32 | Stores the player's battle frequency choice (GameUserSettings.ini, with the other options). | |
Start Classic Encounter (StartClassicEncounter) | function | RPG Saga|Encounters | Encounter: URSEEncounterData*Initiative: ERSEBattleInitiativeDirector: ARSEATBBattleDirector* = NoneSource: AActor* = None | bool | Starts a classic battle (ATB / turn-based) with Encounter on Director (null = the map's classic battle director), with an initiative. Source receives the exploration's encounter-ended callback. Returns true if it started. |
URSEEquipmentSlotSet
Module RSECore. A preset of character equipment slots (D-126): the classic JRPG set (weapon, off-hand, head, body, two accessories) or the ARPG set (helmet, body armor, hands, legs, feet, main hand, off-hand, two accessories).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Matches Project Settings (MatchesProjectSettings) | pure | RPG Saga|Items | bool | The preset is what Project Settings -> Items uses now (same slot ids, types and off-hand). |
URSEExplorationCameraArm
Module RSE. The exploration camera's arm (D-113).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Tilt Input (AddTiltInput) | function | RPG Saga|Exploration|Camera | LookUpDegrees: float | D-129: tilts the view (degrees; positive = up, toward the horizon), within the tactical camera's tilt limits. The player's Invert Camera Tilt option applies. Ignored inside interiors (the profile frames the view) and with tilting off. | |
Get Current Distance (GetCurrentDistance) | pure | RPG Saga|Exploration|Camera | float | The zoom now (cm from the party) and where it glides. | |
Get Current Pitch (GetCurrentPitch) | pure | RPG Saga|Exploration|Camera | float | The view's angle below the horizon now (degrees; the interior profile's inside a volume). | |
Get Current Tilt (GetCurrentTilt) | pure | RPG Saga|Exploration|Camera | float | D-129: the tilt now (it glides toward the target). | |
Get Target Distance (GetTargetDistance) | pure | RPG Saga|Exploration|Camera | float | Get Target Distance | |
Get Target Tilt (GetTargetTilt) | pure | RPG Saga|Exploration|Camera | float | D-129: the tilt the view aims at (degrees added to the zoom's angle; positive = steeper). | |
Is Tactical (IsTactical) | pure | RPG Saga|Exploration|Camera | bool | Is Tactical | |
Match View (MatchView) | function | RPG Saga|Exploration|Camera | Yaw: floatDistance: float | Takes over a view (a battle camera handing back): the yaw goes to the controller, the zoom to Distance (clamped), the pan is cleared and the follow lag forgotten, so the view does not glide from where it was before. | |
Reset Tilt (ResetTilt) | function | RPG Saga|Exploration|Camera | bInstant: bool = false | D-129: puts the tilt back to the zoom's angle (bInstant cuts instead of gliding). | |
Set Target Distance (SetTargetDistance) | function | RPG Saga|Exploration|Camera | Distance: floatbInstant: bool = false | Zooms to Distance (clamped); bInstant cuts. | |
Set Target Tilt (SetTargetTilt) | function | RPG Saga|Exploration|Camera | Tilt: floatbInstant: bool = false | D-129: sets the tilt (degrees, clamped; positive = steeper); bInstant cuts. |
URSEExplorationCameraSubsystem
Module RSE. The exploration camera's shared state (D-113): the style in use (project settings, the level's RSE Exploration Camera actor, or a runtime choice such as an options menu), the tactical camera's values, and the zoom the party leaders share (switching the leader or coming back from a battle keeps the v...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Camera Style (ClearCameraStyle) | function | RPG Saga|Exploration|Camera | Back to the level's or the project's style. | ||
Get Camera Style (GetCameraStyle) | pure | RPG Saga|Exploration|Camera | ERSEExplorationCameraStyle | The style the exploration camera uses here: a runtime choice, else the level's, else Project Settings -> Exploration. | |
Get Tilt (GetTilt) | pure | RPG Saga|Exploration|Camera | float | D-129: the tilt the party's leaders share (degrees added to the zoom's angle; positive = steeper), clamped. | |
Get Zoom Distance (GetZoomDistance) | pure | RPG Saga|Exploration|Camera | float | The zoom the tactical camera aims at (cm from the party). | |
Set Camera Style (SetCameraStyle) | function | RPG Saga|Exploration|Camera | Style: ERSEExplorationCameraStyle | Switches the exploration camera's style now (an options menu, a story segment); every explorer re-reads it. | |
Set Zoom Distance (SetZoomDistance) | function | RPG Saga|Exploration|Camera | Distance: floatbInstant: bool = false | Zooms the tactical camera (cm, clamped to its limits); bInstant cuts instead of gliding. |
URSEExplorationSubsystem
Module RSE. Hands control from third-person exploration to a battle and back (D-026).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Battle Mode For (GetBattleModeFor) | pure | RPG Saga|Battle|Mode Override | Encounter: URSEEncounterData* | FGameplayTag | D-182: the mode Encounter would be fought in now (its own, or the session's Battle Mode Override when the encounter allows it). |
Get Current Battle (GetCurrentBattleBP) | pure | RPG Saga|Battle | URSEBattle* | The battle of the running encounter, or none. | |
Get Current Encounter (GetCurrentEncounterBP) | pure | RPG Saga|Battle | URSEEncounterData* | The encounter being fought, or none. | |
Get Encounter Kind (GetEncounterKind) | pure | RPG Saga|Battle | ERSEExplorationBattleKind | The system of the running encounter (None outside battle). | |
Is Exploration Active (IsExplorationActive) | pure | RPG Saga|Exploration | bool | True while the explorer has control (no battle, party menu closed). | |
Is in Encounter (IsInEncounter) | pure | RPG Saga|Battle | bool | A battle started from exploration is running (until control is back in exploration). | |
On Encounter Ended (BP_OnEncounterEnded) | event | RPG Saga|Battle | Source: AActor*Kind: ERSEExplorationBattleKindOutcome: ERSEBattleOutcome | Control is back in exploration after a battle (Blueprint). | |
On Encounter Started (BP_OnEncounterStarted) | event | RPG Saga|Battle | Source: AActor*Kind: ERSEExplorationBattleKind | A battle started from exploration (Blueprint). | |
Start ATBEncounter (StartATBEncounter) | function | RPG Saga|Battle | Director: ARSEATBBattleDirector*Source: AActor* = NoneReturnPoint: AActor* = NoneEncounterOverride: URSEEncounterData* = None | bool | Starts a classic encounter (ATB or turn-based) on the director's stage; EncounterOverride replaces the director's encounter for this battle. |
Start Encounter (StartEncounter) | function | RPG Saga|Battle | Encounter: URSEEncounterData*Source: AActor* = NoneReturnPoint: AActor* = None | bool | Starts a battle from an encounter asset (D-052): Tactics encounters on the map's Tactics director that has this encounter; classic ones (ATB, turn-based) on the map's ATB director (one with this encounter first, else any). The Start Battle story effect comes here too. Returns false when no director fits or an encounter is running. |
Start Tactics Encounter (StartTacticsEncounter) | function | RPG Saga|Battle | Director: ARSETacticsBattleDirector*Source: AActor* = NoneReturnPoint: AActor* = None | bool | Starts a Tactics encounter on the director's zone. ReturnPoint (optional) is where the explorer stands afterwards. |
URSEExploreRPGSubsystem
Module RSE. The exploration RPG actions in the world (D-109, docs/design/exploration.md "Explorare RPG"): passive perception of traps by the visible party, "Search here", traps going off on the party and in Free Tactics battles, the lockpick screen, stealing from NPCs, distractions (aim, throw, the enemies come...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin Aim (BeginAim) | function | RPG Saga|Exploration RPG | bool | Starts aiming (shows the landing marker). | |
Check Perception (CheckPerception) | function | RPG Saga|Exploration RPG | int32 | Runs the passive perception check now (it also runs on a timer). Returns traps spotted. | |
End Aim (EndAim) | function | RPG Saga|Exploration RPG | bThrow: bool | bool | Stops aiming; bThrow throws at the aim point. |
Get Aim Point (GetAimPoint) | pure | RPG Saga|Exploration RPG | FVector | Where a throw would land now (valid while aiming). | |
Get Lockpick (GetLockpick) | pure | RPG Saga|Exploration RPG | URSELockpickViewModel* | The open lockpick screen's view model (null when closed). | |
Get Member Score (GetMemberScore) | pure | RPG Saga|Exploration RPG | Member: URSECharacterData*Skill: ERSEExploreSkill | float | Member's score in Skill now. |
Is Aiming (IsAiming) | pure | RPG Saga|Exploration RPG | bool | Is Aiming | |
Make Noise (MakeNoise) | function | RPG Saga|Exploration RPG | Point: FVectorRadius: floatbInvestigateOnly: bool | int32 | A noise at Point: visible enemies within Radius come to look (bInvestigateOnly) or notice the party. Returns enemies reached. |
On Distraction Landed (OnDistractionLanded) | event | RPG Saga|Exploration RPG | Location: FVector | ||
On Steal Attempted (OnStealAttempted) | event | RPG Saga|Exploration RPG | NPC: ARSENPC*Result: ERSEStealResultThief: URSECharacterData* | ||
Refresh Fallen (RefreshFallen) | function | RPG Saga|Exploration RPG | Applies the fallen rules to the visible party now (after a battle, a load): get up, lie down, or be carried. | ||
Revive Member (ReviveMember) | function | RPG Saga|Exploration RPG | Member: URSECharacterData* | bool | Revives a fallen member the best way available (item, spell, help up). |
Search At (SearchAt) | function | RPG Saga|Exploration RPG | Point: FVectorSearcher: URSECharacterData* | int32 | "Search here" (D-097 command): Searcher's perception gets the search bonus around Point for a while; checks at once. |
Throw At (ThrowAt) | function | RPG Saga|Exploration RPG | Point: FVector | bool | Throws a distraction at Point as this machine's player (D-138: the Throw Distraction command; the authority throws from their pawn): an item is used if the rules say so; the enemies near it come to look. Returns true when applied (or sent). |
URSEExplorerComponent
Module RSE, display name RSE Explorer. Makes any pawn an explorer (D-165, docs/product/components.md): add it to your own character (a Blueprint character keeps its parent class) and the interaction prompt, the Interact key, encounters, stealth and the party systems treat it as the player's explorer.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Pawn (GetPawn) | pure | RPG Saga|Explorer | APawn* | The pawn this component explores with (its owner). | |
Interact (Interact) | function | RPG Saga|Explorer | The Interact input: runs what the pawn's prompt shows (the interaction system listens) and raises On Interact. | ||
On Explorer State Changed (OnExplorerStateChanged) | event | RPG Saga|Explorer | Explorer: URSEExplorerComponent* | Party member, sneaking, in battle or fallen changed. | |
On Interact (OnInteract) | event | RPG Saga|Explorer | Pawn: APawn* | The Interact input reached the pawn (Blueprint and level scripting hook). |
URSEExplorerPawn
Module RSE. RSE Explorer Pawn
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Explorer Party Member (GetExplorerPartyMember) | override | RPG Saga|Explorer | URSECharacterData* | The party member this pawn is (null = the party's leader: the first of the formation). | |
Is Explorer Fallen (IsExplorerFallen) | override | RPG Saga|Explorer | bool | Fallen (D-109): lies on the ground until revived. | |
Is Explorer in Battle (IsExplorerInBattle) | override | RPG Saga|Explorer | bool | A Free Tactics battle moves this pawn (its own movement and input wait). | |
Is Explorer Input Blocked (IsExplorerInputBlocked) | override | RPG Saga|Explorer | bool | A menu or another modal screen of this pawn's player is open: its world actions wait (D-152). | |
Is Explorer Sneaking (IsExplorerSneaking) | override | RPG Saga|Explorer | bool | Sneaking (D-097): much harder to notice; sneak attacks and placing members need it. | |
Set Explorer Fallen (SetExplorerFallen) | override | RPG Saga|Explorer | bFallen: bool | Set Explorer Fallen | |
Set Explorer in Battle (SetExplorerInBattle) | override | RPG Saga|Explorer | bInBattle: bool | Set Explorer in Battle | |
Set Explorer Party Member (SetExplorerPartyMember) | override | RPG Saga|Explorer | Member: URSECharacterData* | Set Explorer Party Member | |
Set Explorer Sneaking (SetExplorerSneaking) | override | RPG Saga|Explorer | bSneaking: bool | Set Explorer Sneaking |
URSEExplorers
Module RSE. The explorer of an actor (D-165): the actor itself when it implements IRSEExplorerPawn, else its component that does (URSEExplorerComponent).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Explorer Interact (ExplorerInteract) | function, static | RPG Saga|Explorer | Pawn: APawn* | bool | Interacts with what Pawn's prompt shows (the Interact input of a pawn that implements IRSEExplorerPawn itself; the explorer component and ARSEExplorationCharacter do it on their own). Returns true when it interacted. |
Find Explorer (FindExplorer) | pure, static | RPG Saga|Explorer | Actor: AActor* | UObject* | The object that answers IRSEExplorerPawn for Actor (the actor, or its explorer component), or null. |
Get Camera Arm (GetCameraArm) | pure, static | RPG Saga|Explorer | Actor: AActor* | URSEExplorationCameraArm* | The exploration camera arm of Actor (D-113), or null. |
Get Explorer Party Member (GetPartyMember) | pure, static | RPG Saga|Explorer | Actor: AActor* | URSECharacterData* | The party member the explorer is (null when it is not an explorer, or is the leader without a member set). |
Is Explorer (IsExplorer) | pure, static | RPG Saga|Explorer | Actor: AActor* | bool | Actor is an explorer (implements the interface or carries an explorer component). |
Is Explorer Fallen (IsFallen) | pure, static | RPG Saga|Explorer | Actor: AActor* | bool | Is Explorer Fallen |
Is Explorer In Battle (IsInBattle) | pure, static | RPG Saga|Explorer | Actor: AActor* | bool | Is Explorer In Battle |
Is Explorer Input Blocked (IsInputBlocked) | pure, static | RPG Saga|Explorer | Actor: AActor* | bool | Is Explorer Input Blocked |
Is Explorer Sneaking (IsSneaking) | pure, static | RPG Saga|Explorer | Actor: AActor* | bool | Is Explorer Sneaking |
Set Explorer Fallen (SetFallen) | function, static | RPG Saga|Explorer | Actor: AActor*bFallen: bool | Set Explorer Fallen | |
Set Explorer In Battle (SetInBattle) | function, static | RPG Saga|Explorer | Actor: AActor*bInBattle: bool | Set Explorer In Battle | |
Set Explorer Party Member (SetPartyMember) | function, static | RPG Saga|Explorer | Actor: AActor*Member: URSECharacterData* | Set Explorer Party Member | |
Set Explorer Sneaking (SetSneaking) | function, static | RPG Saga|Explorer | Actor: AActor*bSneaking: bool | Set Explorer Sneaking |
URSEFallRecoverySubsystem
Module RSE. The safety net against gaps in a level's collision (D-112, Exploration settings -> Fall Recovery): on a timer it remembers where each explorer (the leader and the visible party; D-165: any character with IRSEExplorerPawn or an RSE Explorer component) last stood on solid ground, and puts back one tha...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Character Recovered (OnCharacterRecovered) | event | RPG Saga|Exploration | Explorer: ACharacter*From: FVector | D-165: any explorer character was put back (also the ones On Explorer Recovered does not name). | |
On Explorer Recovered (OnExplorerRecovered) | event | RPG Saga|Exploration | Explorer: ARSEExplorationCharacter*From: FVector | An explorer was put back (From: where it was lost). | |
Recover Explorer (RecoverExplorer) | function | RPG Saga|Exploration | Explorer: ACharacter* | bool | Puts an explorer back on the spot it last stood on safely. Returns false when no safe spot is known. |
URSEFeatureLibrary
Module RSECore. Blueprint access to the feature toggles, so project code can adapt (hide a button when a system is off).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Feature Enabled (IsFeatureEnabled) | pure, static | RPG Saga|Features | Feature: ERSEFeature | bool | Whether a framework system is switched on (Project Settings -> RPG Saga Engine -> Features). |
URSEFitText
Module RSE. UMG wrapper of SRSEFitText: a single line label that ends with "..." instead of being cut (D-106).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Text (GetText) | pure | RPG Saga|UI | FText | The whole text (not the shortened one on screen). | |
Set Color and Opacity (SetColorAndOpacity) | function | RPG Saga|UI | InColor: FSlateColor | Color of the text (the shadow keeps its own). | |
Set Text (SetText) | function | RPG Saga|UI | InText: FText (ref) | The text; it is shortened with an ellipsis only on screen, when its space is too narrow. |
URSEFormulaTesterLibrary
Module RSECore. The formula tester (D-166): pick a character, class or archetype, a level and equipment, then see every attribute and derived stat computed step by step (base, formula result, add, percent, multiply, override, clamp, final), with the formula text and the problems highlighted (unknown variable, cycle...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Format Formula Test Report (FormatFormulaTestReport) | pure, static | RPG Saga|Attributes|Formula Tester | Result: FRSEFormulaTestResult (ref) | FString | The result as readable text, one line per stat and one per problem (logs, Python, bug reports). |
Format Stat Trace (FormatStatTrace) | pure, static | RPG Saga|Attributes|Formula Tester | Trace: FRSEStatTrace (ref) | FString | One stat as a line: "Max HP = 120 (base 100 -> +10 -> x1.2 ...)". |
Run Formula Test (RunFormulaTest) | function, static | RPG Saga|Attributes|Formula Tester | Input: FRSEFormulaTestInput (ref) | FRSEFormulaTestResult | Run Formula Test |
URSEFoundationLibrary
Module RSECore. The Game Foundation API (D-095, docs/design/studio.md section 5 and section 16) for the Studio's foundation wizard and tools.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Analyze Impact (AnalyzeImpact) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation*Content: TArray<UObject*> (ref) | FRSEFoundationImpactReport | Every reference in Content (and, per settings, in framework settings) to a tag under a managed root (Stat, Resource, Element, Equip.Slot, Equip.Type, Ability.Type, Item.Category) that Foundation does not define, plus one proposed replacement per tag (the preset's suggestion, else a defined tag with the same name, else removal). |
Apply Foundation (ApplyFoundation) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation*Target: FRSEFoundationApplyTarget (ref)Options: FRSEFoundationApplyOptions (ref) | FRSEFoundationApplyReport | Writes Foundation into Target: validation first (errors: nothing written), then the breaking-change check on Options.Content (breaking and not allowed: nothing written, the report holds the impact and proposed mapping). |
Apply Replacement Mapping (ApplyReplacementMapping) | function, static | RPG Saga|Foundation | Content: TArray<UObject*> (ref)Mapping: TArray<FRSEFoundationReplacement> (ref) | TArray<UObject*> | Rewrites the tags of Mapping in Content (empty To = the reference is removed). Instanced sub-objects included. Returns the modified assets (marked dirty). Settings objects are never changed here. |
Capture Current Setup (CaptureCurrentSetup) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation*Profile: URSERulesProfile* | Fills Foundation from the setup that applies under Profile (null = the global settings): registry, formulas, affinities, slots, command menu, modes, progression, economy, terms. Element, equipment kind, item and ability category lists are filled from the tags the setup uses. "Start from my current setup". | |
Get Foundation Presets (GetFoundationPresets) | function, static | RPG Saga|Foundation | TArray<URSEGameFoundation*> | Foundations found in the library folders (Game Foundation settings), presets first by Sort Order. | |
Get Game Term (GetGameTerm) | pure, static | RPG Saga|Foundation | Id: FNameFallback: FText | FText | The game's word for Id (Party, Class, Magic, Money...; HP / MP: also the attribute registry), or Fallback when the game does not define it. |
Get Known Game Terms (GetKnownGameTerms) | function, static | RPG Saga|Foundation | TArray<FRSEGameTermInfo> | Every word screens ask for (Party, Lv, EXP, HP...), with its default and current text (D-100). | |
Get Missing Tags (GetMissingTags) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation* | TArray<FName> | Gameplay tags Foundation needs that the project does not have (the editor can add them before applying). |
Get Tag Display Name (GetTagDisplayName) | pure, static | RPG Saga|Foundation | Tag: FGameplayTag | FText | The player-facing name of a tag (Game Terms, else the last part of the tag). |
Is Foundation Valid (IsFoundationValid) | pure, static | RPG Saga|Foundation | Foundation: URSEGameFoundation* | bool | True when ValidateFoundation has no errors. |
Resolve Game Terms (ResolveGameTerms) | pure, static | RPG Saga|Foundation | Text: FText | FText | Text with its {Term.<Id>} arguments filled with the game's words; other arguments stay for a later Format Text. |
Run Foundation Test Battle (RunFoundationTestBattle) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation* | TArray<FRSEFoundationTestBattle> | A quick simulated battle with generated units (Game Foundation settings -> Test Battle) in every mode the foundation enables, applied to a transient sandbox: shows the setup is consistent and playable. Nothing in the project changes. |
Run Starter Content Battles (RunStarterContentBattles) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation*Runs: int32 | TArray<FRSEFoundationStarterBattleResult> | Plays the foundation's starter content in the simulator (D-100): the starter party, at each battle's party level, against each starter encounter in its own mode, on a sandbox with the foundation applied (Game Foundation -> Starter Balance: runs, intelligence, target band). Runs = 0: the settings' value. Nothing in the project changes. |
Validate Foundation (ValidateFoundation) | function, static | RPG Saga|Foundation | Foundation: URSEGameFoundation* | TArray<FRSEFoundationIssue> | Every problem of Foundation (missing required stats, formulas that do not compile, unknown tags, empty menus...). |
URSEFreeTacticsBattle
Module RSECore. Headless Free Tactics battle (D-091, docs/design/free-tactics.md): the Tactics rules in free space.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Move Trigger (AddMoveTrigger) | function | RPG Saga|Free Tactics | Trigger: FRSEFreeMoveTrigger (ref) | int32 | Adds a trap on the ground (D-109). Returns its id (the FieldId of its ZoneTriggered event). |
Apply Surprise (ApplySurprise) | function | RPG Saga|Free Tactics | OpenerTeam: FGameplayTagSurprisedUnitIds: TArray<int32> (ref) | A surprise round (call after StartBattle, before the first turn): SurprisedUnitIds lose their first turn (a TurnEnded with Battle.Turn.Surprised); OpenerTeam acts first (individual order: full Charge Time; team order: it opens round 1). Ignored when Free Tactics -> Surprise Rounds is off. | |
Can Act At (CanActAt) | pure | RPG Saga|Free Tactics|Traversal | Point: FVector | bool | Whether a unit standing at Point may use abilities and items (false inside a volume whose kind forbids it: swimming). |
Can Flee Battle (CanFleeBattle) | pure | RPG Saga|Free Tactics | bool | The party may run away from this battle (the encounter allows it and Free Tactics -> Fleeing is on). | |
Check Door (CheckDoor) | pure | RPG Saga|Free Tactics | UnitId: int32DoorIndex: int32 | ERSEFreeDoorCheck | Whether UnitId (the active unit) may open or close the door now: in reach on its floor, unlocked, nobody in the way, the budget. |
Check Flee (CheckFlee) | pure | RPG Saga|Free Tactics | UnitId: int32Point: FVector | ERSEFreeFleeCheck | Whether UnitId (the active unit, on the player's team) could flee from Point now: fleeing allowed, Point within its movement (its own spot = no walk), and no enemy there within Escape Radius that sees it (Escape Hidden Radius when it does not). The enemies are taken where they stand now. |
Check Jump (CheckJumpBP) | pure | RPG Saga|Free Tactics|Field | UnitId: int32Point: FVectorOutPlan: FRSEFreeJumpPlan (out) | ERSEFreeJumpCheck | Blueprint: CheckJump. |
Create Surface Circle (CreateSurfaceCircle) | function | RPG Saga|Free Tactics|Field | CreatorId: int32Data: URSETileZoneData*Center: FVectorRadius: floatDurationOverride: int32 = -1 | int32 | A round surface (Blueprint, dev commands). |
Damage Object (DamageObject) | function | RPG Saga|Free Tactics|Field | SourceId: int32ObjectId: int32Amount: float | Damages an object; at 0 HP it breaks (its blocker leaves the snapshot: paths, sight and cover change), and may explode. | |
End Battle as Escape (EndBattleAsEscape) | function | RPG Saga|Free Tactics | Ends the battle as an escape (Fled): a flee ability, a story exit. | ||
Execute Command (ExecuteCommand) | function | RPG Saga|Free Tactics | Command: FRSEFreeTacticsCommand (ref) | ERSEFreeCommandResult | The single entry point of decisions: validates Command (the active unit's, affordable, reachable, a valid target) and applies it. Nothing changes when it is refused. |
Get Controller (GetController) | pure | RPG Saga|Free Tactics | UnitId: int32 | URSEFreeTacticsController* | Who decides for a unit: its own controller, else its team's; null = nobody (the caller drives it). |
Get Door Count (GetDoorCount) | pure | RPG Saga|Free Tactics | int32 | Doors of the battle area (the snapshot's). | |
Get Escape Progress (GetEscapeProgress) | pure | RPG Saga|Free Tactics | UnitId: int32 | int32 | Rounds the escaping unit has spent out of reach so far (INDEX_NONE when it is not escaping). |
Get Escaped Count (GetEscapedCount) | pure | RPG Saga|Free Tactics | int32 | Units of the player's team that got away. | |
Get Joined Unit Id (GetJoinedUnitId) | pure | RPG Saga|Free Tactics | Ticket: int32 | int32 | Unit id of a queued unit once it joined (INDEX_NONE while it waits, or for an unknown ticket). |
Get Objects (GetObjectsBP) | pure | RPG Saga|Free Tactics|Field | TArray<FRSEFreeObject> | Get Objects | |
Get Overwatches (GetOverwatchesBP) | pure | RPG Saga|Free Tactics | TArray<FRSEFreeOverwatch> | Blueprint: the units on watch now. | |
Get Queued Join Count (GetQueuedJoinCount) | pure | RPG Saga|Free Tactics | int32 | Units waiting to join. | |
Get Round (GetRound) | pure | RPG Saga|Free Tactics | int32 | Rounds started (1 = the first). Team-based order: every team had its phase. Individual order: a round lasts as many turns as there were units standing when it began (D-097), so joining, fleeing and surprise work the same in both orders. | |
Get Route Hazards (GetActiveUnitRouteHazards) | pure | RPG Saga|Free Tactics|Field | Goal: FVector | FRSEFreeRouteHazardReport | Blueprint: what the active unit's walk to Goal goes through (empty when unreachable). |
Get Surfaces (GetSurfacesBP) | pure | RPG Saga|Free Tactics|Field | TArray<FRSEFreeSurface> | Blueprint: every surface on the field. | |
Has Escaped (HasEscaped) | pure | RPG Saga|Free Tactics | UnitId: int32 | bool | The unit ran away and is out of the battle (not defeated: it keeps its HP and is written back to the party). |
Insert Turn (InsertTurn) | function | RPG Saga|Free Tactics | UnitId: int32 | D-117: UnitId acts next: an extra turn inserted before the next regular one (a scripted battle event's "acts now"). Its CT and round bookkeeping are not touched; several insertions keep their order. Ignored for a unit that is not standing. | |
Is Door Open (IsDoorOpen) | pure | RPG Saga|Free Tactics | DoorIndex: int32 | bool | Is Door Open |
Is Escaping (IsEscaping) | pure | RPG Saga|Free Tactics | UnitId: int32 | bool | The unit fled and waits out Escape Rounds before it leaves. |
Is Overwatch Ability (IsOverwatchAbility) | pure | RPG Saga|Free Tactics | Ability: URSEAbilityData* | bool | Whether Ability is an Overwatch stance here (its Free Tactics Rules -> Overwatch). |
Is Surprised (IsSurprised) | pure | RPG Saga|Free Tactics | UnitId: int32 | bool | The unit will lose its next turn to a surprise. |
Preview From Destination (PreviewFromDestinationBP) | pure | RPG Saga|Free Tactics|Field | UnitId: int32Destination: FVector | TArray<FRSEFreeDestinationPreview> | Blueprint: PreviewFromDestination. |
Queue Join (QueueJoin) | function | RPG Saga|Free Tactics | Spawn: FRSEBattleUnitSpawn (ref) | int32 | A unit that noticed the battle joins it (an enemy walking over, a party member arriving): at the start of the next round (Free Tactics -> Join At Next Round), else before the next turn. Place it with Spawn.Location (bHasLocation). Returns a ticket to move it while it waits (UpdateQueuedJoin) and to find its unit id afterwards (GetJoinedUnitId). |
Remove Surface (RemoveSurface) | function | RPG Saga|Free Tactics|Field | SurfaceId: int32 | Remove Surface | |
Set Can Flee (SetCanFlee) | function | RPG Saga|Free Tactics | bInCanFlee: bool | Whether this battle may be fled at all (the encounter's Can Flee). Free Tactics -> Fleeing must be on as well. | |
Set Cover Provider (SetCoverProvider) | function | RPG Saga|Free Tactics | Provider: URSECoverProvider* | Replaces the cover provider for this battle (asset combat roles, tests). Null = back to the settings' provider. | |
Set Team Controller (SetTeamController) | function | RPG Saga|Free Tactics | Team: FGameplayTagController: URSEFreeTacticsController* | The controller of every unit of Team without its own (null clears it). | |
Set Unit Controller (SetUnitController) | function | RPG Saga|Free Tactics | UnitId: int32Controller: URSEFreeTacticsController* | The controller of one unit (a guest, a charmed unit; null clears it). | |
Spawn Object (SpawnObject) | function | RPG Saga|Free Tactics|Field | CreatorId: int32Data: URSEFieldObjectData*Point: FVector | int32 | Places an object of Data at Point (Spawn Object in Free Tactics): a blocker with HP. Returns its id or INDEX_NONE. |
Toggle Door (ToggleDoor) | function | RPG Saga|Free Tactics | DoorIndex: int32 | bool | Opens or closes a door with the active unit (a Door command). Returns false when refused (nothing changes). |
Update Queued Join (UpdateQueuedJoin) | function | RPG Saga|Free Tactics | Ticket: int32Location: FVectorYaw: float | bool | Where a queued unit stands now (battle space, meters): it enters the battle there. Returns false for an unknown or joined ticket. |
URSEFreeTacticsController
Module RSECore, display name Free Tactics Controller. Who decides for a unit in Free Tactics (D-091): the local player, the AI, later a remote player.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Command Rejected (OnCommandRejected) | override | RPG Saga|Free Tactics | Battle: URSEFreeTacticsBattle*Command: FRSEFreeTacticsCommand (ref)Result: ERSEFreeCommandResult | The battle refused a command this controller provided (it will be asked again, or the turn is ended for it). | |
Provide Command (ProvideCommand) | override | RPG Saga|Free Tactics | Battle: URSEFreeTacticsBattle*UnitId: int32OutCommand: FRSEFreeTacticsCommand (out) | bool | The next command for UnitId (the active unit), or false to wait (a player who has not decided yet). Must not change the battle: the battle validates and applies the command. |
Uses AIRoutes (UsesAIRoutes) | override | RPG Saga|Free Tactics | bool | D-121: the units it decides for route like the AI (links whose kind keeps them from the AI are closed to them). |
URSEFreeTacticsHUDViewModel
Module RSE. The data and the actions of the Free Tactics battle HUD (D-097, D-052): turn order, the active unit, the command menu (the command menu layout of D-065), the target preview with hit chances and position factors, the path cost, messages and hints.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate Entry (ActivateEntry) | function | RPG Saga|Free Tactics|HUD | Index: int32 | Activates a command menu entry (a click). | |
Answer Hazard (AnswerHazard) | function | RPG Saga|Free Tactics|HUD | bContinue: bool | D-156: answers the danger warning (a click on its buttons). | |
End Turn (EndTurn) | function | RPG Saga|Free Tactics|HUD | End Turn | ||
Get Battle Menu (GetBattleMenu) | pure | RPG Saga|Free Tactics|HUD | URSEBattleMenuViewModel* | D-122: this player's battle menu (every menu style shows it; Widget Blueprints may too). | |
Get Director (GetDirector) | pure | RPG Saga|Free Tactics|HUD | ARSEFreeTacticsDirector* | Get Director | |
Highlight Entry (HighlightEntry) | function | RPG Saga|Free Tactics|HUD | Index: int32 | Highlights a command menu entry (mouse over). | |
Highlight Hazard Answer (HighlightHazardAnswer) | function | RPG Saga|Free Tactics|HUD | Index: int32 | D-156: highlights one of the warning's answers (mouse over: 0 = continue, 1 = pick another path). |
URSEFreeTacticsQueuedController
Module RSECore, display name Free Tactics Queued Controller. A controller fed from outside (D-097): the local player's input (the Free Tactics director queues what the player chose), later a remote player's messages.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Queue (ClearQueue) | function | RPG Saga|Free Tactics | Forgets the commands not taken yet. | ||
Clear Rejection (ClearRejection) | function | RPG Saga|Free Tactics | Clear Rejection | ||
Get Last Rejection (GetLastRejection) | pure | RPG Saga|Free Tactics | ERSEFreeCommandResult | Why the last refused command was refused (Ok when none was refused since the last ClearRejection). | |
Get Queued Count (GetQueuedCount) | pure | RPG Saga|Free Tactics | int32 | Commands waiting to be taken. | |
Queue Command (QueueCommand) | function | RPG Saga|Free Tactics | Command: FRSEFreeTacticsCommand (ref) | Adds a command; the battle takes it the next time it asks this controller (RunControllers). |
URSEFreeTacticsSimDriver
Module RSE. The server side of a Free Tactics battle (D-141, docs/design/networking.md §3.6): owns the headless battle (URSEFreeTacticsBattle) and runs it on the authority only (single player, the host): the controllers (one queued controller per player, the AI for the enemies and for the units no player plays)...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Battle (GetBattle) | pure | RPG Saga|Free Tactics | URSEFreeTacticsBattle* | Get Battle |
URSEFreeTacticsSubsystem
Module RSE. Free Tactics on the live map (D-097): starts battles where the party stands (a visible group that noticed the party or was attacked, an encounter, a dev command), gathers who takes part (the group, the enemies called for help, the party members nearby), owns the world's battle director and relays th...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Active Director (GetActiveDirector) | pure | RPG Saga|Free Tactics | ARSEFreeTacticsDirector* | The director of the running battle, or null. | |
Is Battle Active (IsBattleActive) | pure | RPG Saga|Free Tactics | bool | Is Battle Active | |
Start Encounter Battle (StartEncounterBattle) | function | RPG Saga|Free Tactics | Encounter: URSEEncounterData*Opening: ERSEFreeOpeningEnemyActors: TArray<AActor*> (ref)Source: AActor* = None | bool | Starts a Free Tactics battle with Encounter's enemies (story battles, triggers, dev commands). EnemyActors stand for its enemies in order; missing ones appear near the first (or in front of the party). Source gets the exploration's callback. |
Start Group Battle (StartGroupBattle) | function | RPG Saga|Free Tactics | Spawner: ARSEEncounterSpawner*GroupIndex: int32Opening: ERSEFreeOpening | bool | Starts the battle of a visible group of Spawner (it noticed the party, or the party touched it). Enemies of other groups within Free Tactics -> Call For Help Radius join from the start; party members within Party Join Radius of the leader fight from where they stand. Returns false when a battle cannot start now. |
URSEFreeTargetingLibrary
Module RSECore. D-146: the targeting rules for Blueprints (custom HUDs, tutorials).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Gather Targets (GatherTargets) | function, static | RPG Saga|Free Tactics|Targeting | Battle: URSEFreeTacticsBattle*UnitId: int32Origin: FVectorAbility: URSEAbilityData*bItem: boolViewYaw: float | TArray<FRSEFreeTargetCandidate> | Every unit the ability's side holds, with whether UnitId at Origin can aim it there and why not (sorted by distance). |
Get Target Side (GetTargetSide) | pure, static | RPG Saga|Free Tactics|Targeting | Ability: URSEAbilityData* | ERSEFreeTargetSide | Whom an ability is for. |
Make Target Cycle (MakeTargetCycle) | pure, static | RPG Saga|Free Tactics|Targeting | Candidates: TArray<FRSEFreeTargetCandidate> (ref)Order: ERSEFreeTargetCycleOrder | TArray<int32> | The valid targets in the order Next / Previous target walks. |
Pick Default Target (PickDefaultTarget) | pure, static | RPG Saga|Free Tactics|Targeting | Candidates: TArray<FRSEFreeTargetCandidate> (ref)Side: ERSEFreeTargetSideHostilePick: ERSEFreeHostileAutoPickSupportPick: ERSEFreeSupportAutoPick | int32 | The target highlighted first. |
URSEGASBridgeComponent
Module RSEGAS, display name RSE GAS Bridge. Puts a Gameplay Ability System character into RPG Saga Engine battles (D-169).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate Bridge (ActivateBridge) | function | RPG Saga|GAS | Starts answering for the character (called at Begin Play; call it yourself for an actor that never begins play). | ||
Bind to Battle Unit (BindToBattleUnit) | function | RPG Saga|GAS | Battle: URSEBattle*UnitId: int32 | bool | Mirrors a battle unit (done by itself when the battle builds the unit through the stat source). |
Deactivate Bridge (DeactivateBridge) | function | RPG Saga|GAS | Stops answering and unbinds from any battle (called at End Play). | ||
Get Ability System (GetAbilitySystem) | pure | RPG Saga|GAS | UAbilitySystemComponent* | The ASC used: the one set with Set Ability System, else the owner's. | |
Get Battle (GetBattle) | pure | RPG Saga|GAS | URSEBattle* | Get Battle | |
Get Mapped Value (GetMappedValue) | pure | RPG Saga|GAS | RSETag: FGameplayTagbFound: bool (out) | float | The current value of the GAS attribute mapped to an RSE stat or resource, in RSE units (UI). |
Get Unit Id (GetUnitId) | pure | RPG Saga|GAS | int32 | Get Unit Id | |
Is Bound (IsBound) | pure | RPG Saga|GAS | bool | Is Bound | |
On Battle Event Forwarded (OnBattleEventForwarded) | event | RPG Saga|GAS | Event: FRSEBattleEvent (ref)EventTag: FGameplayTag | An RSE battle event of the bound unit was sent to the ASC (EventTag empty when only the ability map sent one). | |
On Bound (OnBound) | event | RPG Saga|GAS | Battle: URSEBattle*UnitId: int32 | --- Events (GAS -> RSE side) --- | |
On Gameplay Cue Triggered (OnGameplayCueTriggered) | event | RPG Saga|GAS | CueTag: FGameplayTagCueEvent: ERSEGASCueEvent | A Gameplay Cue was triggered on this actor by an RSE presentation cue (Gameplay Cue cue, G2). | |
On GASAttribute Changed (OnGASAttributeChanged) | event | RPG Saga|GAS | RSETag: FGameplayTagOldValue: floatNewValue: float | A mapped GAS attribute changed by something other than the bridge (values in RSE units). | |
On GASTag Changed (OnGASTagChanged) | event | RPG Saga|GAS | Tag: FGameplayTagbPresent: bool | A status tag of the status map was added or removed by something other than the bridge. | |
On Unbound (OnUnbound) | event | RPG Saga|GAS | |||
Read Stats (ReadStats) | pure | RPG Saga|GAS | OutStats: FRSEExternalUnitStats (out)Battle: URSEBattle* = None | bool | What the ASC supplies for a battle unit now (In rows; resources vs stats per the battle's attribute registry, or the global one). Returns false without an ASC or an attribute map. |
Set Ability System (SetAbilitySystem) | function | RPG Saga|GAS | AbilitySystem: UAbilitySystemComponent* | Uses this ASC instead of the owner's (e.g. one kept on the Player State). | |
Unbind (Unbind) | function | RPG Saga|GAS | Stops mirroring the battle unit (done by itself when the battle ends). |
URSEGameOverViewModel
Module RSE. Game over (D-031): Retry battle / Load last save / Return to main menu, with the cursor.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Choose (Choose) | function | RPG Saga|UI|GameOver | Index: int32 | Chooses an option (disabled ones do nothing). | |
Move Selection (MoveSelection) | function | RPG Saga|UI|GameOver | Direction: int32 | Moves the cursor to the next enabled option (+1 down, -1 up). | |
Select (Select) | function | RPG Saga|UI|GameOver | Index: int32 | Puts the cursor on an option (mouse hover). |
URSEGroupTravelPolicy
Module RSE. Who leads the group out of a zone in co-op (D-124 §6.6, D-138).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Decide (Decide) | override | RPG Saga|Travel|Co-op | Request: FRSETravelRequest (ref)Instigator: FRSEPlayerIdbMultiplayer: bool | ERSEGroupTravelDecision | What Request (made by Instigator; None = the game itself) does now. bMultiplayer: several players share the world. |
URSEGroupTravelPresenter
Module RSE. The co-op screens of group travel (D-138 rule, D-142 screens): the host's countdown shows on every player's screen (the destination and the seconds, with how to stay on the host's), its cancel closes them with a notice; a guest who walks into an exit asks the host, who answers a question box ("Playe...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Seconds Left (GetSecondsLeft) | pure | RPG Saga|Travel|Co-op | float | Seconds left on this machine's countdown screen. | |
Is Countdown Shown (IsCountdownShown) | pure | RPG Saga|Travel|Co-op | bool | The countdown shows on this machine now. | |
On Group Travel Shown (OnGroupTravelShown) | event | RPG Saga|Travel|Co-op | Travel: FRSEPresentation_GroupTravel (ref) | Every countdown screen this machine shows or closes (a project's own widget). |
URSEGrowthAllocationPolicy
Module RSECore. Spends a character's points when nobody builds it by hand (D-144): AI-controlled members, autoplay, the battle simulator, Balance My Campaign and the Progression Designer, so balance stays valid under every progression system.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Choose Option (ChooseOption) | override | RPG Saga|Progression | Character: URSECharacterData*Level: int32Options: TArray<FRSEGrowthOption> (ref) | int32 | Which option to take next (index into Options), or -1 to stop spending. Default: the best Score per point of cost, the earliest listed on ties. |
Should Stop (ShouldStop) | override | RPG Saga|Progression | Character: URSECharacterData*Level: int32StepsTaken: int32 | bool | Whether the policy keeps points for later (e.g. saving for an expensive node). Default: never. |
URSEGrowthViewModel
Module RSE. The Growth page (D-144): the selected member's points and the points page (Classic + Points) or the board (Classic + Growth Board), plus mastery and ranks.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cancel Pending (CancelPending) | function | RPG Saga|UI|Growth | No. | ||
Choose Node Menu Option (ChooseNodeMenuOption) | function | RPG Saga|UI|Growth | Index: int32 | bool | Runs an entry of the node menu (Unlock sends the command at once: the free undo takes it back). |
Close Node Menu (CloseNodeMenu) | function | RPG Saga|UI|Growth | Close Node Menu | ||
Confirm Pending (ConfirmPending) | function | RPG Saga|UI|Growth | bool | Yes: sends the waiting action's command. | |
End Session (EndSession) | function | RPG Saga|UI|Growth | The page closed (D-149): the undo steps of the members changed here become final (a Clear Growth Undo command each) and the node menu closes. The page calls it when it leaves the screen. | ||
Get Content Count (GetContentCount) | pure | RPG Saga|UI|Growth | int32 | Number of rows of the points page (attributes + catalog). | |
Get Currency Name (GetCurrencyName) | pure | RPG Saga|UI|Growth | Currency: FGameplayTag | FText | Get Currency Name |
Get Member Column Count (GetMemberColumnCount) | pure | RPG Saga|UI|Growth | int32 | Number of rows of the member column (members + Auto + Undo + Respec). | |
Get Selected Character (GetSelectedCharacter) | pure | RPG Saga|UI|Growth | URSECharacterData* | Get Selected Character | |
Open Node Menu (OpenNodeMenu) | function | RPG Saga|UI|Growth | NodeIndex: int32 | bool | Opens the node menu next to a board node (D-149): Unlock (with its cost), Details, Cancel. |
Refresh (Refresh) | function | RPG Saga|UI|Growth | Reads the party state again (keeps the selection). | ||
Request Auto (RequestAuto) | function | RPG Saga|UI|Growth | bool | Request Auto | |
Request Buy (RequestBuy) | function | RPG Saga|UI|Growth | Ability: URSEAbilityData* | bool | Request Buy |
Request Raise (RequestRaise) | function | RPG Saga|UI|Growth | Stat: FGameplayTag | bool | Request Raise |
Request Respec (RequestRespec) | function | RPG Saga|UI|Growth | bool | Request Respec | |
Request Selected Action (RequestSelectedAction) | function | RPG Saga|UI|Growth | bool | Asks to raise / buy / unlock the selected row or node (a Yes / No follows). | |
Request Undo (RequestUndo) | function | RPG Saga|UI|Growth | bool | Takes the selected member's newest step back for free (D-149). | |
Request Unlock (RequestUnlock) | function | RPG Saga|UI|Growth | NodeId: FName | bool | Request Unlock |
Select Content (SelectContent) | function | RPG Saga|UI|Growth | Index: int32 | Puts the cursor on a content row (points page) or a node (board, by index). | |
Select Member (SelectMember) | function | RPG Saga|UI|Growth | Index: int32 | Select Member | |
Select Node by Id (SelectNodeById) | function | RPG Saga|UI|Growth | NodeId: FName | bool | Select Node by Id |
Set Details Open (SetDetailsOpen) | function | RPG Saga|UI|Growth | bOpen: bool | Shows or hides the board's details panel. | |
Set Legend Open (SetLegendOpen) | function | RPG Saga|UI|Growth | bOpen: bool | Shows or hides the legend of node kinds over the board (D-154: the strip's Help button). |
URSEHUDLayoutSubsystem
Module RSE. P32d: the screen areas the HUD elements of one local player take (the quest tracker, a minimap a game adds...), so that transient UI (the reward feed's toasts) places itself around them instead of on top of them.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Occupied (ClearOccupied) | function | RPG Saga|HUD | Id: FName | Clear Occupied | |
Set Occupied HUD Area (SetOccupiedArea) | function | RPG Saga|HUD | Id: FNameAbsoluteTopLeft: FVector2DAbsoluteBottomRight: FVector2D | Blueprint form: a widget's area this frame (absolute Slate coordinates, e.g. from its cached geometry). Call while it shows. |
URSEIdleBehavior
Module RSECore. One idle behaviour (D-129): how likely (Weight), how often (Cooldown) and what it does.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Run (CanRun) | override | RPG Saga|Party Field | Context: FRSEIdleContext (ref) | bool | Whether it can run in this context (an animation the look has, a free spot, another member nearby). |
Make Intent (MakeIntent) | override | RPG Saga|Party Field | Context: FRSEIdleContext (ref)Seed: int32OutIntent: FRSEIdleIntent (out) | Fills the intent (kind, animations, target, duration). Seed: the deterministic random choice of this pick. |
URSEInputDeviceSubsystem
Module RSE. Tracks the device in use (keyboard / mouse or gamepad) through a Slate input pre-processor, so key prompts show the labels of that device only (RSEKeyPrompts, D-038 / D-040).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Input Device (GetLastDevice) | pure, static | RPG Saga|Input | ERSEInputDevice | The device the prompts show: the forced one, else the one used last. | |
Is Menu Focused (IsMenuFocused) | pure, static | RPG Saga|Input | bool | Whether any registered menu has focus (the left stick navigates it). | |
Is Steam Deck (IsSteamDeck) | pure, static | RPG Saga|Input | bool | Running on a Steam Deck (SteamDeck=1 environment variable, -SteamDeck, or URSEInputSettings::bSimulateSteamDeck). | |
Is Using Gamepad (IsUsingGamepad) | pure, static | RPG Saga|Input | bool | The prompts show gamepad buttons now. | |
Is Using Touch (IsUsingTouch) | pure, static | RPG Saga|Input | bool | D-180: the player uses a touch screen now (touch hints, on-screen controls). | |
Notify Prompts Changed (NotifyPromptsChanged) | function, static | RPG Saga|Input | Re-reads the forced device and label set and broadcasts OnDeviceChanged (options, CVars). | ||
On Input Device Changed (BP_OnDeviceChanged) | event | RPG Saga|Input | Device: ERSEInputDevice | The prompt device changed (keyboard / mouse or gamepad; Blueprint). |
URSEInteractableComponent
Module RSE, display name RSE Interactable. Makes any actor interactable (D-165, docs/product/components.md): add it to your own actor (no parent class needed) and the player's prompt focuses it ("[E] Examine") and the Interact key runs it, exactly as an RSE interactable actor: - a Library Kind (D-150: a chest, a campfire, a lantern, a shrine...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Settings (ApplySettings) | function | RPG Saga|Interaction | Re-applies the range and reach to the volume (live tuning). | ||
Can Interact (Custom) (CanInteractCustom) | override | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Extra availability rule of a Blueprint subclass (the prompt shows only while it is true). Default: true. |
Can Interact Now (CanInteractNow) | pure | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Whether a pawn may interact now. |
Get Kind (GetKind) | pure | RPG Saga|Interaction | URSEInteractableData* | The library kind (null = none). | |
Get Kind State (GetKindState) | pure | RPG Saga|Interaction | FRSEInteractableSaveState | The kind's saved state now. | |
Get Prompt Text (GetPromptText) | pure | RPG Saga|Interaction | FText | The action shown in the prompt ("Open", "Talk"); the kind's prompt when it has one. | |
Get Visual (GetVisual) | pure | RPG Saga|Interaction | ERSEInteractableVisual | The kind's look now (Default, Active, Depleted). | |
Interact (Interact) | function | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Runs it now, on this machine (what the Interact command applies on the authority). Returns false when it could not. |
Is Interaction Enabled (IsInteractionEnabled) | pure | RPG Saga|Interaction | bool | Is Interaction Enabled | |
On Focus Changed (OnFocusChanged) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*Pawn: APawn*bFocused: bool | A player's prompt moved onto (bFocused) or off this object: highlight it, play a sound. | |
On Interact (ReceiveInteract) | override | RPG Saga|Interaction | InteractingPawn: APawn*bSucceeded: bool | A custom action of a Blueprint subclass of the component: runs after the data. | |
On Interacted (OnInteracted) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*InteractingPawn: APawn*bSucceeded: bool | Raised after every interaction (on an RSE interactable actor's own component: after the actor's, bSucceeded = it ran). | |
On Interaction Dialog Ended (OnInteractionDialogEnded) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent* | The blocking dialog this interaction started has ended. | |
On Interaction Started (OnInteractionStarted) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*InteractingPawn: APawn* | Before the interaction runs (turn toward the player, stop walking). | |
On Kind Used (OnKindUsed) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*InteractingPawn: APawn*Outcome: FRSEInteractableOutcome (ref) | The library kind was used on the authority (its outcome: lines, items, the look). | |
On No Response (OnNoResponse) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*InteractingPawn: APawn* | The interaction ran and nothing answered the player (no dialog, the conditions failed): say a line here. | |
On Visual Changed (OnVisualChanged) | event | RPG Saga|Interaction | Interactable: URSEInteractableComponent*Visual: ERSEInteractableVisual | The kind's look changed (a lantern lit, a chest emptied): show it on your own meshes. | |
Request Interact (RequestInteract) | function | RPG Saga|Interaction | InteractingPawn: APawn* | bool | Interacts as the player of InteractingPawn through the command bus (D-138). Returns true when applied (or sent). |
Set Interaction Enabled (SetInteractionEnabled) | function | RPG Saga|Interaction | bInEnabled: bool | Turns the interaction on or off (off: no prompt, Interact does nothing). | |
Set Kind (SetKind) | function | RPG Saga|Interaction | InKind: URSEInteractableData* | Sets the library kind (tools, Blueprint) and starts its state over. |
URSEInteractionPromptViewModel
Module RSE. The interaction prompt (D-060): key cap + action ("[E] Talk") above the focused interactable (its prompt point) or at a screen point.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Compute Screen Position (ComputeScreenPosition) | pure | RPG Saga|UI|Interaction | PromptSize: FVector2DOutPosition: FVector2D (out) | bool | Where the prompt's bottom-center goes now, in viewport units, for a prompt of PromptSize. Returns true when it follows the object; false = the settings' screen anchor (OutPosition is that point). |
URSEInteractionSubsystem
Module RSE. Routes the explorer's Interact to the interactable in focus and shows the prompt ("[E] Talk").
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Focused (GetFocused) | pure | RPG Saga|Interaction | ARSEInteractableActor* | The RSE interactable actor the prompt of this machine's primary player shows now, or none (see GetFocusedComponent). | |
Get Focused Actor For (GetFocusedActorFor) | pure | RPG Saga|Interaction | Pawn: APawn* | AActor* | The actor Pawn's prompt shows now (whatever its class), or none. |
Get Focused Component (GetFocusedComponent) | pure | RPG Saga|Interaction | URSEInteractableComponent* | The interactable (any actor's RSE Interactable component) the primary player's prompt shows now, or none. | |
Get Focused Component For (GetFocusedComponentFor) | pure | RPG Saga|Interaction | Pawn: APawn* | URSEInteractableComponent* | The interactable (any actor's RSE Interactable component) Pawn's prompt shows now, or none. |
Get Focused For (GetFocusedFor) | pure | RPG Saga|Interaction | Pawn: APawn* | ARSEInteractableActor* | The RSE interactable actor Pawn's prompt shows now, or none (see GetFocusedComponentFor). |
Interact with Focused (InteractWithFocused) | function | RPG Saga|Interaction | bool | Interacts with the primary player's focused interactable (the explorer's Interact calls the pawn's own). Returns true when it did. | |
Interact with Focused For (InteractWithFocusedFor) | function | RPG Saga|Interaction | Pawn: APawn* | bool | Interacts with the object Pawn's prompt shows (its focus), without re-picking at the press: what the player read is what runs. Only when that object is gone or cannot be used any more is the focus re-evaluated first. Returns true when it was applied (or sent). |
Is Interaction Allowed (IsInteractionAllowed) | pure | RPG Saga|Interaction | bool | Interaction is possible now for the primary player (exploration active, no dialog or scene, no modal screen open or just closed). |
URSEInteriorCameraSubsystem
Module RSE. The exploration camera inside interiors (D-110): when the local player's explorer enters an Interior Volume, its spring arm, look limits, field of view and (with a fixed angle) the view direction blend to the volume's profile; leaving every volume blends back to what the camera was outside.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Active Volume (GetActiveVolume) | pure | RPG Saga|Interiors | ARSEInteriorVolume* | The interior whose profile the explorer camera uses now (null outside). | |
Is Blending (IsBlending) | pure | RPG Saga|Interiors | bool | The camera is still blending between two profiles. |
URSEInteriorKitData
Module RSECore. A modular interior kit (D-164): pieces of one pack that fit together on a module grid.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Coverage (GetCoverage) | pure | RPG Saga|Interiors | FGameplayTagContainer | Which piece kinds the kit has (exact kinds). | |
Get Kind for Slot (GetKindForSlot) | pure | RPG Saga|Interiors | Slot: FGameplayTag | FGameplayTag | The first piece kind of a plan slot this kit has (its Slot Kinds, else the built-in table); invalid when none. |
Get Kit Id (GetKitId) | pure | RPG Saga|Interiors | FName | KitId, else the asset's name. | |
Has Kind (HasKind) | pure | RPG Saga|Interiors | Kind: FGameplayTag | bool | Whether the kit has a piece of exactly Kind. |
Pick Kit Piece (PickPieceBP) | pure | RPG Saga|Interiors | Kind: FGameplayTagSpan: floatSeed: int32OutPiece: FRSEKitPiece (out) | bool | PickPiece for Blueprint: Returns false when nothing fits. |
URSEInteriorTravelSubsystem
Module RSE. Separate interiors (D-150): the trip from a building entrance of mode Separate Interior into its interior and back.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Are Battles Blocked (AreBattlesBlocked) | pure | RPG Saga|Buildings | bool | D-153: battles are refused now: the party is in a separate interior whose rules forbid them. | |
Is Busy (IsBusy) | pure | RPG Saga|Buildings | bool | A blackout is running (the trip is half way). | |
Is Inside (IsInside) | pure | RPG Saga|Buildings | bool | Is Inside |
URSEInventoryPermissionPolicy
Module RSECore. Who may change what (co-op, D-094 / D-124): the host can let guests manage the shared stash and their own characters, or more.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Change Equipment (CanChangeEquipment) | override | RPG Saga|Items|Permissions | Issuer: FRSEInventoryIssuer (ref)Character: URSECharacterData* | bool | Whether Issuer may change Character's equipment. Default: yes (guests' fixed equipment stays locked by its data, D-011). |
Can Issue (CanIssue) | override | RPG Saga|Items|Permissions | Issuer: FRSEInventoryIssuer (ref)Command: FRSEInventoryCommand (ref) | bool | Whether Issuer may send Command at all. Default: yes. |
Can Issue Party Command (CanIssuePartyCommand) | override | RPG Saga|Items|Permissions | Issuer: FRSEInventoryIssuer (ref)Command: FInstancedStruct (ref) | bool | Whether Issuer may send a party command (D-137): Command is the payload (Equip Item, Bind Pact, Buy Item, Set Formation...; inventory commands also pass Can Issue). The bus' own permission (host-only story commands) is checked first. Default: yes. |
Can Use Container (CanUseContainer) | override | RPG Saga|Items|Permissions | Issuer: FRSEInventoryIssuer (ref)Container: FRSEContainerRef (ref)bTakeOut: bool | bool | D-143: whether Issuer may take items out of (bTakeOut) or put items into Container (a member's bag, the stash, the pending loot): moves, transfers, Give to..., use and discard. Co-op: a host may keep guests out of the members other players lead. Default: yes. |
URSEInventorySubsystem
Module RSECore. Inventory commands (D-123) on the command bus (D-137): every move, equip, unequip, use, sort or discard from an inventory screen is a FRSEInventoryCommand, a party command.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Change Equipment (CanChangeEquipment) | pure | RPG Saga|Items|Commands | Issuer: FRSEInventoryIssuer (ref)Character: URSECharacterData* | bool | Whether Issuer may change Character's equipment (permission policy and the character's own lock). |
Is Allowed (IsAllowed) | pure | RPG Saga|Items|Commands | Command: FRSEInventoryCommand (ref)Issuer: FRSEInventoryIssuer (ref) | bool | Whether Issuer may send Command (permission policy only; the command may still fail its own rules). |
On Command Applied (OnCommandApplied) | event | RPG Saga|Items|Commands | Command: FRSEInventoryCommand (ref)Outcome: FRSEInventoryCommandOutcome (ref) | A command was applied successfully (on the host or in single player), or refused when sent from this subsystem. | |
Set Policy (SetPolicy) | function | RPG Saga|Items|Commands | InPolicy: URSEInventoryPermissionPolicy* | Replaces the policy at run time (D-137): the host's session rules (co-op: what guests may change), tests. Null = back to Items -> Permission Policy Class. Only the authority's policy decides (commands are validated there). | |
Submit Command (SubmitCommand) | function | RPG Saga|Items|Commands | Command: FRSEInventoryCommand (ref)Issuer: FRSEInventoryIssuer (ref) | FRSEInventoryCommandOutcome | Sends Command through the command bus (D-137) and returns its outcome. Issuer: this machine's player, or (with authority: the host, tools, tests) another player whose command it is; the bus decides who the sender really is. On a guest the outcome is Pending and OnCommandApplied follows on the host. |
URSEInventoryViewModel
Module RSE. The grid inventory presenter (D-123): data and commands of an inventory screen, for any screen style (our grid page, a Widget Blueprint, later a chest or a shop).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate Item (ActivateItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Double-click / right-click: equip equipment, use consumables, read documents, use key items on the object in front. |
Auto Distribute (AutoDistribute) | function | RPG Saga|UI|Inventory | bool | Deals every bag again by the Smart rule (and the open stash's upgrades): one command. | |
Can Equip in Slot (CanEquipInSlot) | pure | RPG Saga|UI|Inventory | Item: URSEItemData*SlotId: FName | bool | Whether the selected character can wear Item in SlotId now (drop highlights). |
Can Give To (CanGiveTo) | pure | RPG Saga|UI|Inventory | Item: URSEItemData*MemberIndex: int32 | bool | Whether member Index's bag can take Item now (drop highlights on the party strip). |
Can Place At (CanPlaceAt) | pure | RPG Saga|UI|Inventory | Item: URSEItemData*Cell: FIntPoint | bool | Whether Item (of the current tab) fits at Cell, ignoring its own place (drop highlights). Items not on the grid count as new. |
Combine Items (CombineItems) | function | RPG Saga|UI|Inventory | First: URSEItemData*Second: URSEItemData* | bool | Combines two key items (through the party menu, D-039). |
Discard Item (DiscardItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Throws one Item away (Items -> Allow Discard). |
Equip Item (EquipItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData*SlotId: FNameReturnCell: FIntPoint | bool | The selected character equips Item in SlotId (None = automatic); what comes off lands at ReturnCell when free. |
Get Actions (GetActions) | pure | RPG Saga|UI|Inventory | Item: URSEItemData*FromSlot: FName | TArray<FRSEMenuEntryView> | Actions for a piece of the grid (FromSlot None) or a worn item (FromSlot set): Equip, Use, Read, Use on..., Combine, Move, Unequip, Discard, Cancel. |
Get Current Container (GetCurrentContainer) | pure | RPG Saga|UI|Inventory | FRSEContainerRef | The container of the current tab. | |
Get Issuer (GetIssuer) | pure | RPG Saga|UI|Inventory | FRSEInventoryIssuer | Who this screen acts for (its local player; host in single player). | |
Get Selected Character (GetSelectedCharacter) | pure | RPG Saga|UI|Inventory | URSECharacterData* | Get Selected Character | |
Get Selected Equipment (GetSelectedEquipment) | pure | RPG Saga|UI|Inventory | FRSECharacterEquipment | What the selected character wears now (the paperdoll's live preview shows it, D-126). | |
Get Stat Preview (GetStatPreview) | pure | RPG Saga|UI|Inventory | Item: URSEItemData*SlotId: FName | TArray<FRSEStatChangeView> | The selected character's stats with Item in SlotId (None = its automatic slot); Item null = SlotId emptied. |
Get Tooltip (GetTooltip) | pure | RPG Saga|UI|Inventory | Item: URSEItemData* | FRSEItemTooltipView | Tooltip of Item, compared with the selected character's equipment. |
Give Item To (GiveItemTo) | function | RPG Saga|UI|Inventory | Item: URSEItemData*MemberIndex: int32 | bool | Gives Item (the whole stack) from the current container to member Index's bag (Give to..., a drop on a portrait). |
Move Item (MoveItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData*Cell: FIntPoint | bool | Moves Item to Cell of the current tab (swaps with a single piece in the way). |
Refresh (Refresh) | function | RPG Saga|UI|Inventory | Rebuilds every list from the game. | ||
Select Member (SelectMember) | function | RPG Saga|UI|Inventory | Index: int32 | Select Member | |
Select Tab (SelectTab) | function | RPG Saga|UI|Inventory | Index: int32 | Select Tab | |
Send to Stash (SendToStash) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Moves Item (the whole stack) from the current bag into the stash (only where the stash opens). |
Set Message (SetMessage) | function | RPG Saga|UI|Inventory | InMessage: FText (ref) | Sets Message (and the host menu's message). | |
Sort Tab (SortTab) | function | RPG Saga|UI|Inventory | bool | Re-packs the current tab. | |
Submit (Submit) | function | RPG Saga|UI|Inventory | Command: FRSEInventoryCommand (ref) | FRSEInventoryCommandOutcome | The single dispatch point: sends Command for this view-model's player and refreshes. |
Take Item (TakeItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Takes Item (the whole stack) from the stash or the pending loot into the selected member's bag. |
Unequip Slot (UnequipSlot) | function | RPG Saga|UI|Inventory | SlotId: FNameCell: FIntPoint | bool | The selected character's SlotId goes back to the inventory, at Cell when free ((-1, -1) = anywhere). |
Use Item (UseItem) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Uses a consumable on the selected character (or the whole party when the item allows only that). Save items open the save screen. |
Use Key Item on Target (UseKeyItemOnTarget) | function | RPG Saga|UI|Inventory | Item: URSEItemData* | bool | Uses a key item on the object the player stands at (through the party menu, D-039). |
URSEKeyPromptProvider
Module RSE. RSE Key Prompt Provider
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Key Prompt Icon (GetKeyPromptIcon) | override | RPG Saga|Input|Prompts | Keys: TArray<FKey> (ref)Device: ERSEInputDeviceOutIcon: FRSEKeyPromptIcon (out) | bool | An icon for Keys (one key, or a set shown as one prompt: the D-pad's up / down) on Device. Returns false to show the text key cap. Default: no icon. |
Get Key Prompt Label (GetKeyPromptLabel) | override | RPG Saga|Input|Prompts | Key: FKey (ref)LabelStyle: ERSEGamepadLabelStyle | FText | Short label of Key in the gamepad label set LabelStyle (Xbox, PlayStation, Steam Deck). Default: UI Theme -> Key Prompts. |
URSELeashPolicy
Module RSE. The co-op leash rules (D-094, D-142): who is leashed, to what, how far, and when it applies.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Applies Now (AppliesNow) | override | RPG Saga|Co-op|Leash | WorldContext: UObject* | bool | Whether the leash applies now in WorldContext's world. Default: not during scenes, dialogs, battles, travels. |
Get Anchor (GetAnchor) | override | RPG Saga|Co-op|Leash | Anchor: ERSELeashAnchorHostLocation: FVectorbHasHost: boolPlayerLocations: TArray<FVector> (ref) | FVector | The anchor point. HostLocation: the host's explorer (when it has one); PlayerLocations: every player's explorer. |
Is Leashed (IsLeashed) | override | RPG Saga|Co-op|Leash | Player: FRSEPlayerIdAnchor: ERSELeashAnchor | bool | Whether Player is tied to the anchor. Default: the guests (Host anchor), everyone (Group Center). |
URSELeashSubsystem
Module RSE. Keeps the co-op group together (D-094 leash, D-142): on the authority, every Leash Check Interval it measures each leashed player's explorer against the anchor; past the radius the player gets a warning notice (on their machine), and after the grace seconds is brought back beside the anchor.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Effective Radius (GetEffectiveRadius) | pure | RPG Saga|Co-op|Leash | float | The radius on this map (its Co-op Map Settings, else Co-op Flow), or 0 when the leash is off here. |
URSELobbyViewModel
Module RSEOnline. The lobby screen's data and actions (D-135): host / find / join / leave / invite, the found sessions, the players and the local character choice.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cycle Character (CycleCharacter) | function | RPG Saga|Online|Lobby | Direction: int32 | Picks the previous (-1) or next (+1) selectable character. | |
Find (Find) | function | RPG Saga|Online|Lobby | Searches for sessions. | ||
Host (Host) | function | RPG Saga|Online|Lobby | Hosts a session with the project's online settings. | ||
Invite (Invite) | function | RPG Saga|Online|Lobby | Opens the online service's invite overlay. | ||
Join (Join) | function | RPG Saga|Online|Lobby | ResultIndex: int32 | Joins the session of a row (its Result Index). | |
Leave (Leave) | function | RPG Saga|Online|Lobby | Leaves or ends the session. | ||
Select Session (SelectSession) | function | RPG Saga|Online|Lobby | RowIndex: int32 | Highlights a session row (mouse hover). |
URSELocalPlayerUISubsystem
Module RSE. One local player's UI context (D-134, docs/design/networking.md §3.8): its modal screen stack, whether its world actions are blocked, its HUD groups and the focus of its screens.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Close Party Menu (ClosePartyMenu) | function | RPG Saga|UI|Host | Closes the party menu when it is open. | ||
Close Screen (CloseScreen) | function | RPG Saga|UI|Screens | Screen: UObject* | Close Screen | |
Focus Top Screen (FocusTopScreen) | pure | RPG Saga|UI|Screens | bool | Gives the focus back to this player's top screen. Returns false when there is none. | |
Get Fallback UIHost (GetFallbackUIHost) | pure | RPG Saga|UI|Host | UObject* | The host set with Set Fallback UI Host, or null. | |
Get Local Player UI (GetFor) | pure, static | RPG Saga|UI|Screens | Player: UObject* | URSELocalPlayerUISubsystem* | The UI context of the local player behind Player (a controller, pawn, widget or local player), or null. |
Get Party Menu (GetPartyMenu) | function | RPG Saga|UI|Host | bCreate: bool = true | URSEPartyMenuViewModel* | This player's party menu (made by a standalone host when the player has no UI host and bCreate). |
Get Player Controller (GetPlayerController) | pure | RPG Saga|UI|Screens | APlayerController* | This player's controller in the current world. | |
Get Screen Presenter (GetScreenPresenter) | pure | RPG Saga|UI|Host | UObject* | Get Screen Presenter | |
Get Top Focusable Screen (GetTopFocusableScreen) | pure | RPG Saga|UI|Screens | UUserWidget* | This player's top focusable screen, or null. | |
Get UIHost (GetUIHost) | function | RPG Saga|UI|Host | bCreate: bool = true | UObject* | This player's UI host: the one set with Set UI Host, else the player's HUD when it implements IRSEUIHost, else (bCreate) a standalone host made now. Null without a player controller (or without one and !bCreate). |
Is Any Screen Open (IsAnyScreenOpen) | pure | RPG Saga|UI|Screens | bool | This player has a screen open (its own or a shared one). | |
Is Game Input Blocked (IsGameInputBlocked) | pure | RPG Saga|UI|Screens | bool | This player's world actions must be ignored now (a screen is open or has just closed). | |
Is HUDGroup Hidden (IsHUDGroupHidden) | pure | RPG Saga|UI|Screens | Group: ERSEHUDGroup | bool | One of this player's screens hides Group. |
On Screens Changed (OnScreensChanged) | event | RPG Saga|UI|Screens | bAnyScreenOpen: bool | One of this player's screens opened or closed (bAnyScreenOpen: for this player). | |
Open Growth (OpenGrowth) | function, static | RPG Saga|UI|Host | Player: APlayerController* | bool | Opens Player's progression (the party menu's Growth page), with any HUD class. |
Open Inventory (OpenInventory) | function, static | RPG Saga|UI|Host | Player: APlayerController* | bool | Opens Player's inventory (the party menu's Items page), with any HUD class. |
Open Party Menu (Player) (OpenPartyMenu) | function, static | RPG Saga|UI|Host | Player: APlayerController*Page: ERSEPartyMenuPage | bool | Opens Player's party menu on Page, with any HUD class. |
Open Party Menu Page (OpenPartyMenuPage) | function | RPG Saga|UI|Host | Page: ERSEPartyMenuPage | bool | Opens the party menu on Page (or moves it there). Returns false when it cannot open or the page is not offered. |
Open Screen (OpenScreen) | function | RPG Saga|UI|Screens | Screen: UObject*Options: FRSEModalScreenOptions (ref) | Opens Screen on this player's stack (see URSEModalScreenSubsystem::OpenScreenFor). | |
Set Fallback UIHost (SetFallbackUIHost) | function | RPG Saga|UI|Host | Host: UObject* | D-176: the host used when the player has no explicit host and its HUD is not one (before the standalone host), e.g. the Common UI host (RSECommonUI module). An object implementing IRSEUIHost; null = none. | |
Set Screen Presenter (SetScreenPresenter) | function | RPG Saga|UI|Host | Presenter: UObject* | D-176: what puts this player's screens on screen (an object implementing IRSEScreenPresenter, e.g. the Common UI host's layer stacks in the RSECommonUI module). Null = the viewport (the screens add themselves). | |
Set UIHost (SetUIHost) | function | RPG Saga|UI|Host | Host: UObject* | Uses Host (an object implementing IRSEUIHost: a HUD, a controller, a manager) for this player's screens. Null = automatic. |
URSELockpickViewModel
Module RSE. The lockpick screen's data and actions (D-109, D-052): a Widget Blueprint may replace the built-in screen.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Marker (GetMarker) | pure | RPG Saga|Exploration RPG | float | The marker's place on the bar (0..1). | |
Give Up (GiveUp) | function | RPG Saga|Exploration RPG | Gives up (Back): counts as a failure without breaking anything. | ||
Press (Press) | function | RPG Saga|Exploration RPG | ERSELockpickStep | The press (Confirm, a click): sets the pin or counts a miss. |
URSELootDistributionRule
Module RSECore. Who receives an item the party gained in the Per Character mode (D-143): chests, battle rewards (boss loot included), quest rewards, shop purchases, pick-ups, the Auto-distribute button.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Rank Targets (RankTargets) | override | RPG Saga|Items|Loot | State: FRSEPartyState (ref)Query: FRSELootQuery (ref)OutTargets: TArray<FRSELootTarget> (out) | Ranks where Query's items should go, best first. Default: the members in party order. |
URSEMainMenuViewModel
Module RSE. The title screen and main menu (D-026): the game title, an optional "press any key" state and the [Continue] / New Game / Load / Options / Quit entries (Continue and Load depend on the saves, D-010).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Back to Title (BackToTitle) | function | RPG Saga|UI|MainMenu | Back to the title state (when the settings show one). | ||
Choose (Choose) | function | RPG Saga|UI|MainMenu | Chooses the selected entry. | ||
Choose Entry (ChooseEntry) | function | RPG Saga|UI|MainMenu | Index: int32 | Selects an entry and chooses it (a click). | |
Move Selection (MoveSelection) | function | RPG Saga|UI|MainMenu | Direction: int32 | Move Selection | |
On Fade Changed (OnFadeChanged) | event | RPG Saga|UI|MainMenu | Opacity: float | The fade overlay's opacity changed (every frame while a fade runs). | |
Press Any Key (PressAnyKey) | function | RPG Saga|UI|MainMenu | Leaves the title state. | ||
Press Any Key From (PressAnyKeyFrom) | function | RPG Saga|UI|MainMenu | Device: FInputDeviceId | D-170, "press start": leaves the title state and makes the user of Device the primary user (whose saves are used; Platform -> Select User On Press Start). An invalid device keeps the current user. | |
Refresh Entries (RefreshEntries) | function | RPG Saga|UI|MainMenu | Rebuilds the entries from the saves (Continue, Load), keeping the cursor on the same action. | ||
Select (Select) | function | RPG Saga|UI|MainMenu | Index: int32 | Select | |
Set Message (SetMessage) | function | RPG Saga|UI|MainMenu | InMessage: FText (ref) | Set Message |
URSEMapBadge
Module RSE. One marker badge (shape, color, glyph) as the maps draw it (D-092): the legend's rows use it.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Set Badge (SetBadge) | function | RPG Saga|Map | InShape: ERSEMapMarkerShapeInColor: FLinearColorInGlyph: FText (ref)InOpacity: float = 1.000000 | Sets what the badge shows. |
URSEMapData
Module RSECore. The area map of one level (D-089): the top-down picture Generate Map made, where it lies in the world, and what the designers added by hand (name, regions, markers, hidden categories).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Map Id (GetMapId) | pure | RPG Saga|Map | FName | The id saves use for this map's fog and pins. |
URSEMapMarkerComponent
Module RSE, display name RSE Map Marker. Puts its actor on the area map and the minimap (D-089).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Set Category (SetCategory) | function | RPG Saga|Map | InCategory: FGameplayTag | Set Category | |
Set Show Marker (SetShowMarker) | function | RPG Saga|Map | bShow: bool | Set Show Marker |
URSEMapMarkerSource
Module RSE. RSEMap Marker Source
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Should Show Map Marker (ShouldShowMapMarker) | override | RPG Saga|Map | bool | Whether this actor's marker shows now. |
URSEMapStyle
Module RSECore. The look of a generated area map (D-089): what Generate Map does to the top-down picture of the level.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Preset (ApplyPreset) | function | Preset | Sets every look parameter below to the values of Preset (materials and pictures are kept). |
URSEMapSubsystem
Module RSECore. The saved state of the area maps (D-089): explored areas (fog of war) and player pins, by map id.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Pin (AddPin) | function | RPG Saga|Map | MapId: FNameWorldLocation: FVector2DMaxPins: int32 = 0Type: FGameplayTag = ()bReplaceOldest: bool = false | int32 | Adds a pin of Type at a world X / Y. MaxPins 0 = no limit. When the map has MaxPins pins already, bReplaceOldest removes the oldest one to make room, else the pin is refused. Returns the pin id (0 = refused, or sent to the host by a co-op guest: the pin then arrives with the Map section). The sender is the pin's owner. |
Get Explored Fraction (GetExploredFraction) | pure | RPG Saga|Map | MapId: FName | float | Share of the map explored (0..1). |
Get Pins (GetPins) | pure | RPG Saga|Map | MapId: FName | TArray<FRSEMapPin> | The pins of a map. |
Is Revealed (IsRevealed) | pure | RPG Saga|Map | MapId: FNameUV: FVector2D | bool | The point of the map was explored (false while the map has no fog mask yet). |
Move Pin (MovePin) | function | RPG Saga|Map | PinId: int32WorldLocation: FVector2D | bool | Moves a pin to a world X / Y. |
On Changed (OnChanged) | event | RPG Saga|Map | MapId: FName | Fires after the fog or the pins of a map changed. | |
Remove Pin (RemovePin) | function | RPG Saga|Map | PinId: int32 | bool | Remove Pin |
Reset Fog (ResetFog) | function | RPG Saga|Map | MapId: FName | Forgets what was explored on a map (a command: host only in co-op). | |
Reveal At (RevealAt) | function | RPG Saga|Map | MapId: FNameUV: FVector2DRadiusUV: floatFogSize: int32 | bool | Reveals the map around UV (map coordinates 0..1) within RadiusUV; the mask is made at FogSize cells per side on first use. Returns true when new cells were revealed (OnChanged fires). |
Set Pin Type (SetPinType) | function | RPG Saga|Map | PinId: int32Type: FGameplayTag | bool | Changes a pin's type. Returns false when there is no such pin. |
URSEMapView
Module RSE. Draws an area map (D-089): the map picture, fog of war, region names, markers and the player arrow, for any view (center, zoom, rotation), round or square.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Local to Map (LocalToMap) | pure | RPG Saga|Map | Local: FVector2D | FVector2D | Map coordinates under a point of this widget (local pixels). |
Show View Model (ShowViewModel) | function | RPG Saga|Map | ViewModel: URSEMapViewModel* | Shows a minimap view-model (its zoom, shape and rotation) or an area map view-model (its view). |
URSEMapViewModel
Module RSE. What the map screens show (D-089): the map picture and fog, the player, the markers and the tracked objective.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Has Map (HasMap) | pure | RPG Saga|Map | bool | A map is loaded for this level. |
URSEMapWorldSubsystem
Module RSE. The area map and minimap of a game world (D-089).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Open Area Map (CanOpenAreaMap) | pure | RPG Saga|Map | bool | D-148: the level has a map and the area map may open now (no battle, no scene hiding the maps). | |
Can Show Quest on Map (CanShowQuestOnMap) | pure | RPG Saga|Map | Quest: URSEQuestData* | bool | The quest has an objective with a place this level can show (on it, or the exit toward it). |
Close Area Map (CloseAreaMap) | function | RPG Saga|Map | Closes the area map (the screen, or the party menu shown on its Map tab). | ||
Cycle Minimap Zoom (CycleMinimapZoom) | function | RPG Saga|Map | Next minimap zoom level. | ||
Get Map Data (GetMapData) | pure | RPG Saga|Map | URSEMapData* | The level's map (null while loading or when the level has none). | |
Get Markers (GetMarkers) | pure | RPG Saga|Map | TArray<FRSEMapMarkerView> | Every marker of the world now (filters of the map data and fog applied, player filters not). | |
Get Objective Location (GetObjectiveLocation) | pure | RPG Saga|Map | OutText: FText (out)OutLocation: FVector (out) | bool | The tracked quest's current objective with a map target: its text and world location (or the exit toward its level). |
Is Area Map Open (IsAreaMapOpen) | pure | RPG Saga|Map | bool | The area map shows now (its screen, or the party menu on the Map tab). | |
Is Fog Enabled (IsFogEnabled) | pure | RPG Saga|Map | bool | Fog of war is on for the current map. | |
Is Minimap Shown (IsMinimapShown) | pure | RPG Saga|Map | bool | The minimap is on screen now (the level has a map, no battle, cutscene or option hides it). | |
Open Area Map (OpenAreaMap) | function | RPG Saga|Map | Controller: APlayerController* | bool | Opens the area map for Controller. D-148: on the party menu's Map tab (Map & Minimap -> Area Map In Party Menu); the area map screen alone when that is off or the player has no built-in party menu. Returns false when there is no map or it cannot open now. |
Open Area Map at Quest (OpenAreaMapAtQuest) | function | RPG Saga|Map | Controller: APlayerController*Quest: URSEQuestData* | bool | Opens the area map centered on a quest's objective (journal "Show on map"). |
Open Journal At (OpenJournalAt) | function | RPG Saga|Map | Controller: APlayerController*Quest: URSEQuestData* | bool | Closes the area map and opens the party menu's journal on Quest. |
Set Map (SetMap) | function | RPG Saga|Map | Map: URSEMapData* | Uses Map for this world (normally found by level); the texture is loaded if needed. Tests pass a map without a picture. | |
Set Minimap Info (SetMinimapInfo) | function | RPG Saga|Map | Source: FNameText: FText | Extension point of the minimap (D-104): a line shown under it, by source (the clock uses "Clock"; a quest timer, a region's danger level...). Lines show in source name order; an empty Text removes the source's line. | |
Set Minimap Suppressed (SetMinimapSuppressed) | function | RPG Saga|Map | Reason: FNamebSuppressed: bool | Hides the minimap while any reason is set (cutscenes use "Scene"). Battles and modal screens are handled automatically. |
URSEMenuExtension
Module RSE. One entry a module or a project adds to the framework's menus without touching them (D-142; RSEOnline adds Host Game, Join Game and Invite this way).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Execute (Execute) | override | RPG Saga|UI|Menu Extension | Player: APlayerController* | ERSEMenuFollowUp | The entry was chosen. Returns what the menu does next. |
Is Enabled (IsEnabled) | override | RPG Saga|UI|Menu Extension | Player: APlayerController*OutReason: FText (out) | bool | Whether the entry can be chosen now (OutReason: shown beside a disabled entry). Default: yes. |
Is Visible (IsVisible) | override | RPG Saga|UI|Menu Extension | Player: APlayerController* | bool | Whether the entry shows now for Player (null on a title screen without a player). Default: yes. |
URSEMenuExtensionSubsystem
Module RSE. The menus' extension entries (D-142, an extension point of RSE's front end and in-game menu).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Register (Register) | function | RPG Saga|UI|Menu Extension | Extension: URSEMenuExtension* | Adds Extension (replaces one with the same Id). | |
Unregister (Unregister) | function | RPG Saga|UI|Menu Extension | Id: FName | Unregister |
URSEMinimapViewModel
Module RSE. The HUD minimap (D-089): zoom levels, shape and rotation from Map & Minimap settings.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cycle Zoom (CycleZoom) | function | RPG Saga|Map | Next zoom level (wraps). | ||
Get View Rotation (GetViewRotation) | pure | RPG Saga|Map | float | Map angle drawn up: the player's heading, the camera's, or 0 = north (Rotation Mode). | |
Get View Span (GetViewSpan) | pure | RPG Saga|Map | float | Visible map width in map units (1 = the whole map). |
URSEModalScreenSubsystem
Module RSE. Knows which modal screens (menus, dialogs, shops, card table, results...) are open, so the always-on HUD never shows through them (docs/design/ui-theme.md, "Ecrane modale").
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Close Screen (CloseScreen) | function | RPG Saga|UI|Screens | Screen: UObject* | Close Screen | |
Is Any Screen Open (IsAnyScreenOpen) | pure | RPG Saga|UI|Screens | bool | Any player has a screen open. | |
Is Any Screen Open For (IsAnyScreenOpenFor) | pure | RPG Saga|UI|Screens | Player: UObject* | bool | Player (a controller, local player, pawn or widget) has a screen open (its own or a shared one). |
Is Game Input Blocked (IsGameInputBlocked) | pure | RPG Saga|UI|Screens | bool | World actions (Interact, the menu key) must be ignored now: a screen is open or has just closed (any player). | |
Is Game Input Blocked For (IsGameInputBlockedFor) | pure | RPG Saga|UI|Screens | Player: UObject* | bool | Player's world actions must be ignored now: one of its screens (or a shared one) is open or has just closed. |
Is HUDGroup Hidden (IsHUDGroupHidden) | pure | RPG Saga|UI|Screens | Group: ERSEHUDGroup | bool | An open screen hides Group (for any player). |
Is HUDGroup Hidden For (IsHUDGroupHiddenFor) | pure | RPG Saga|UI|Screens | Group: ERSEHUDGroupPlayer: UObject* | bool | An open screen of Player hides Group. |
Is Input Guarded (IsInputGuarded) | pure | RPG Saga|UI|Screens | bool | A screen closed moments ago (URSEUISettings::ScreenCloseInputGuard), for any player. | |
Is Input Guarded For (IsInputGuardedFor) | pure | RPG Saga|UI|Screens | Player: UObject* | bool | Is Input Guarded For |
Is Quest Tracker Hidden (IsQuestTrackerHidden) | pure | RPG Saga|UI|Screens | bool | Is Quest Tracker Hidden | |
Is Quest Tracker Hidden For (IsQuestTrackerHiddenFor) | pure | RPG Saga|UI|Screens | Player: UObject* | bool | Is Quest Tracker Hidden For |
Is Screen Open (IsScreenOpen) | pure | RPG Saga|UI|Screens | Screen: UObject* | bool | Is Screen Open |
On Screens Changed (OnScreensChanged) | event | RPG Saga|UI|Screens | bAnyScreenOpen: bool | A screen opened or closed (closing is reported on the next tick, so a screen that opens another does not flicker the HUD). | |
Open Screen (OpenScreen) | function | RPG Saga|UI|Screens | Screen: UObject*Options: FRSEModalScreenOptions (ref) | Registers Screen as open (again: updates its options) on its owning player's stack. | |
Open Screen For (OpenScreenFor) | function | RPG Saga|UI|Screens | Screen: UObject*Options: FRSEModalScreenOptions (ref)Player: UObject* | Registers Screen as open on Player's stack (a controller, local player, pawn or widget of that player); a Player that resolves to no local player puts it on the shared stack (it blocks every player). | |
Validate Screens (ValidateScreens) | function | RPG Saga|UI|Screens | int32 | D-152, the safety net: forgets the registered screens that are not on screen any more (GetLiveness), e.g. a screen widget embedded in a menu that was hidden, or removed from the viewport without closing. Runs by itself when a screen opens or closes and before the first query of each frame; a forgotten screen logs a warning and the HUD comes back. Returns how many screens were forgotten. |
URSENPCActivityBehavior
Module RSECore, display name NPC Activity Behavior. A scripted activity (D-173, docs/product/living-npcs.md "Activity behaviours"): what a living NPC does while it stays at its place, beyond an animation.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin (Begin) | override | RPG Saga|NPC | NPC: AActor*Activity: FRSENPCActivity (ref) | The NPC starts the activity (it arrived at its place). NPC is its actor; get its Living NPC component for walking and animations. | |
Can Interrupt (CanInterrupt) | override | RPG Saga|NPC | NPC: AActor*Reason: ERSENPCInterruptReason | bool | May the NPC stop now? False = it finishes first (the schedule's change waits; the player's talk waits). Danger is never refused. |
End (End) | override | RPG Saga|NPC | NPC: AActor*bInterrupted: bool | The activity ends (a new one starts, a conversation, danger, the NPC sleeps). bInterrupted: it was cut short. Clean up here. | |
Get Activity (GetActivity) | pure | RPG Saga|NPC | FRSENPCActivity | The activity it runs for (valid between Begin and End). | |
Get NPC (GetNPC) | pure | RPG Saga|NPC | AActor* | The NPC doing it (valid between Begin and End). | |
Get Run Seconds (GetRunSeconds) | pure | RPG Saga|NPC | float | Seconds this activity has run (since Begin). | |
Tick (Tick) | override | RPG Saga|NPC | NPC: AActor*DeltaSeconds: float | Every Tick Interval while the NPC does the activity. DeltaSeconds: since the last call. |
URSENPCBehaviorComponent
Module RSE, display name Living NPC. A living NPC (D-104, docs/product/living-npcs.md): put it on an RSE NPC (it has one already) or on any actor or pawn.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin Talk (BeginTalk) | function | RPG Saga|NPC | Pawn: APawn* | Starts a conversation: stops walking and its activity, faces Pawn. | |
Clear Danger (ClearDanger) | function | RPG Saga|NPC | The danger is over: a reacting NPC returns to its schedule after its Return Delay. | ||
End Chat (EndChat) | function | RPG Saga|NPC | Ends the talk with its partner (both go back to what they did). | ||
End Talk (EndTalk) | function | RPG Saga|NPC | DelayOverride: float = -1.000000 | The conversation ended: it goes on after the settings' Resume Delay (DelayOverride >= 0: after that many seconds). | |
Face Location (FaceLocation) | function | RPG Saga|NPC | Location: FVectorbInstant: bool = false | Turns toward a point of the world. | |
Face Yaw (FaceYaw) | function | RPG Saga|NPC | Yaw: floatbInstant: bool = false | Turns toward a yaw (degrees); bInstant skips the turn. | |
Get Activity Behavior (GetActivityBehavior) | pure | RPG Saga|NPC | URSENPCActivityBehavior* | The scripted activity running now (null = none). | |
Get Activity Location (GetActivityLocation) | pure | RPG Saga|NPC | OutLocation: FVector (out)OutRotation: FRotator (out) | bool | Where its current activity happens. |
Get Battle Response (GetBattleResponse) | pure | RPG Saga|NPC | ERSENPCBattleResponse | The response it chose for the running battle (Ignore when it does not react). | |
Get Behavior State (GetBehaviorState) | pure | RPG Saga|NPC | ERSENPCBehaviorState | Get Behavior State | |
Get Chat Partner (GetChatPartner) | pure | RPG Saga|NPC | URSENPCBehaviorComponent* | Get Chat Partner | |
Get Crime Phase (GetCrimePhase) | pure | RPG Saga|NPC | ERSENPCCrimePhase | The phase of its crime response (None when it answers nothing). | |
Get Current Activity (GetCurrentActivity) | pure | RPG Saga|NPC | FRSENPCActivity | What it does now (its schedule's activity; it may still be walking there). | |
Get NPCId (GetNPCId) | pure | RPG Saga|NPC | FName | The id the story knows it by. | |
Get Place Location (GetPlaceLocation) | pure | RPG Saga|NPC | PlaceId: FNameOutLocation: FVector (out)OutRotation: FRotator (out) | bool | Where a place is (an NPC Place actor with this id, or any actor tagged with it). Returns false when the level has none. |
Is Available (IsAvailable) | pure | RPG Saga|NPC | bool | It is in the level and may be talked to (not away, its activity is interactable). | |
Is in Idle Action (IsInIdleAction) | pure | RPG Saga|NPC | bool | It does an idle action of its idle life now (a gesture, a stroll, a seat on a bench). | |
Is Reacting (IsReacting) | pure | RPG Saga|NPC | bool | It reacts to a battle now (fleeing, watching, cowering, helping) or waits to. | |
Is Walking (IsWalking) | pure | RPG Saga|NPC | bool | It is walking now. | |
Notify Danger (NotifyDanger) | function | RPG Saga|NPC | Location: FVectorRadius: float = 0.000000 | A battle began at Location, Radius wide (the area it needs): the NPC decides by its reaction (distance, response) and reacts after its delay. The NPC world subsystem calls it for every NPC when an encounter starts on the live map (and when an NPC wakes during one); levels and Blueprints may call it for their own dangers. Authority only. | |
On Activity Changed (OnActivityChanged) | event | RPG Saga|NPC | Component: URSENPCBehaviorComponent*Activity: FGameplayTag | The activity changed (the hour, the weather, the story); it may still be walking there. | |
On Chat (OnChat) | event | RPG Saga|NPC | Component: URSENPCBehaviorComponent*Partner: URSENPCBehaviorComponent*bStarted: bool | It started or ended a talk with another NPC. | |
On Crime Response (OnCrimeResponse) | event | RPG Saga|NPC | Component: URSENPCBehaviorComponent*Crime: FGameplayTagPhase: ERSENPCCrimePhase | A guard's answer to a crime changed phase (warning, chasing, caught, over). | |
On Idle Custom (OnIdleCustom) | event | RPG Saga|NPC | Component: URSENPCBehaviorComponent*CustomTag: FGameplayTag | An idle behaviour of kind Custom was chosen: play it (Blueprint). | |
On Reaction (OnReaction) | event | RPG Saga|NPC | Component: URSENPCBehaviorComponent*Response: ERSENPCBattleResponsebStarted: bool | It began reacting to a battle (Started), or went back to its day. | |
Play Activity Anim (PlayActivityAnim) | function | RPG Saga|NPC | AnimActivity: FGameplayTag (ref) | Plays the animation of an activity tag (Project Settings -> Living NPCs -> Activity Animations / Idle Slots) while it stands. | |
Refresh Schedule (RefreshSchedule) | function | RPG Saga|NPC | bSnap: bool = false | Looks at the schedule again (the clock or the story changed). bSnap: appear at the new place at once (skips, loads). | |
Report Crime (ReportCrime) | function | RPG Saga|NPC | Crime: FRSENPCCrime (ref) | bool | A crime happened: a guard (its reaction has Crime rules) that sees or hears it answers: warns, chases, runs the rule's effects. Returns true when it noticed the crime and answers. Authority only. |
Stop Activity Anim (StopActivityAnim) | function | RPG Saga|NPC | Stop Activity Anim | ||
Try Start Chat (TryStartChat) | function | RPG Saga|NPC | SearchRadius: float = 450.000000Seconds: float = 12.000000 | bool | Starts a talk with the nearest free living NPC within SearchRadius: they face each other and trade lines (Bark.Kind.Chat) for Seconds. Returns true when a partner was found. |
Wander Step (WanderStep) | function | RPG Saga|NPC | Walks to a new random point around its place (a wander step), whatever its Movement is. |
URSENPCSubsystem
Module RSECore. The living NPCs' story state (D-104, docs/design/exploration.md "NPC-uri vii"): headless, saved (section "NPCs").
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear NPCOverride (ClearNPCOverride) | function | RPG Saga|NPC | NPCId: FName | The NPC follows its own schedule again. | |
Get NPCActivity (GetNPCActivity) | pure | RPG Saga|NPC | NPCId: FName | FGameplayTag | The activity tag of an NPC now (from its schedule and override; empty when unknown). |
Get NPCOverride (GetNPCOverride) | pure | RPG Saga|NPC | NPCId: FNameOutOverride: FRSENPCOverride (out) | bool | The NPC's override (false = none). |
Is NPCAt Activity (IsNPCAtActivity) | pure | RPG Saga|NPC | NPCId: FNameActivities: FGameplayTagContainer | bool | The NPC does one of Activities now (empty = it is present at all, not away). By schedule, not by where the actor walks. |
On NPCOverride Changed (OnNPCOverrideChanged) | event | RPG Saga|NPC | NPCId: FName | An NPC's override changed (set, cleared, loaded: NPCId None = all). | |
Set NPCOverride (SetNPCOverride) | function | RPG Saga|NPC | NPCId: FNameOverride: FRSENPCOverride (ref) | Changes an NPC's day (story): another schedule, or a forced activity. Saved. |
URSENPCTalkComponent
Module RSE, display name RSE NPC Talk. Talking NPC behavior for any actor (D-165, docs/product/components.md): add it next to an RSE Interactable component (with a Dialog, an Interaction, or nothing at all) on your own character or actor.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Last Line (GetLastLine) | pure | RPG Saga|NPC | FText | The last line it said. | |
Has Lines (HasLines) | pure | RPG Saga|NPC | bool | It has lines to say. | |
On Line Said (OnLineSaid) | event | RPG Saga|NPC | Talker: URSENPCTalkComponent*Line: FText (ref) | A line was said (Blueprint and level scripting hook). | |
Request Automatic Line (RequestAutomaticLine) | function | RPG Saga|NPC | Kind: FGameplayTag | Asks the bark director (budget, cooldown, silence under dialogs and screens) to let it say an automatic line. | |
Say Line (SayLine) | function | RPG Saga|NPC | Kind: FGameplayTag | bool | Says a line of Kind from its pools. Returns false when it has nothing to say now. |
Try Bark (TryBark) | function | RPG Saga|NPC | bool | Starts the proximity greeting now (bark dialog, else a line), within its cooldown. Returns true when one was asked for. |
URSENPCWorldSubsystem
Module RSE. The living NPCs of a level (D-104): one place that listens to the clock, the weather and the story overrides and tells every NPC to look at its schedule again (hour, phase, weather: walk there; time skip, load: appear there), and one batch timer that puts NPCs far from the player (or long off screen...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Raised Danger (ClearRaisedDanger) | function | RPG Saga|NPC | The danger raised by RaiseDanger is over: the NPCs go back to their day. | ||
Raise Danger (RaiseDanger) | function | RPG Saga|NPC | Location: FVectorRadius: float = 0.000000 | A danger at Location (a brawl, a monster in the street, a scripted scare): every NPC within its reaction's Trigger Distance reacts (flee, watch, cower, help). The running battle on the live map raises one by itself. Authority only. | |
Refresh All (RefreshAll) | function | RPG Saga|NPC | bSnap: bool | Every living NPC of the level looks at its schedule again. | |
Report Crime (ReportCrime) | function | RPG Saga|NPC | Crime: FRSENPCCrime (ref) | int32 | A crime happened: the guards (NPCs whose reaction has Crime rules) that see or hear it answer. During a battle on the map the crime waits for its end (the guards come after the fight). The theft of a pickpocket, an attack on an NPC and the Report Crime effect arrive here by themselves; levels and Blueprints may report their own. Returns how many guards noticed it now. |
URSENarrativeSubsystem
Module RSECore. Owns the global narrative state for the game session (survives level changes) and the narrative events the presentation listens to.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Run Interaction (CanRunInteraction) | pure | RPG Saga|Narrative | Interaction: URSEInteractionData* | bool | Whether an Interaction asset would run now (conditions, one-shot state). |
Get Flag (GetFlag) | pure | RPG Saga|Narrative | Flag: FGameplayTag | bool | Read access for light level scripting (the Narrative library also writes: Set Flag, Set Variable...). |
Get Narrative State (GetStateBP) | pure | RPG Saga|Narrative | FRSENarrativeState | The whole story state (flags, variables, puzzles, areas, events, discovered places), read-only. | |
Get Variable (GetVariable) | pure | RPG Saga|Narrative | Variable: FGameplayTag | int32 | A story variable (0 when never set). |
Is Area Unlocked (IsAreaUnlocked) | pure | RPG Saga|Narrative | Area: FGameplayTag | bool | Whether a story area is unlocked. |
Is Event Seen (IsEventSeen) | pure | RPG Saga|Narrative | Event: FGameplayTag | bool | Whether a scene or event was seen. |
Is Puzzle Solved (IsPuzzleSolved) | pure | RPG Saga|Narrative | Puzzle: FGameplayTag | bool | Whether a puzzle is solved. |
On Battle Requested (OnBattleRequested) | event | RPG Saga|Narrative | Encounter: TSoftObjectPtr<URSEEncounterData> (ref) | A Start Battle effect asked for a battle. | |
On Dialog Requested (OnDialogRequested) | event | RPG Saga|Narrative | Asset: TSoftObjectPtr<UObject> (ref) | A Start Dialog effect asked for a dialog. | |
On Narrative Changed (OnNarrativeChanged) | event | RPG Saga|Narrative | Key: FGameplayTag | A flag, variable, puzzle, area or event changed value (Key is its tag). | |
On Party Changed (OnPartyChanged) | event | RPG Saga|Narrative | Members, equipment, inventory, money or vitals were changed by an effect. | ||
On Rest Requested (OnRestRequested) | event | RPG Saga|Narrative | The party rested at an inn (the state is already restored). | ||
On Scene Requested (OnSceneRequested) | event | RPG Saga|Narrative | Scene: TSoftObjectPtr<UObject> (ref)Event: FGameplayTag | A Play Scene effect asked for a scene. | |
On Screen Requested (OnScreenRequested) | event | RPG Saga|Narrative | Asset: TSoftObjectPtr<UObject> (ref) | An effect asked for the screen of a data asset (shop, code lock, card opponent, tutorial). | |
On World Requested (OnWorldRequested) | event | RPG Saga|Narrative | Request: FRSEWorldRequest (ref) | A battle with context (opening, scene combatants) or an alarm (D-109: Start Battle with an opening, Alert Enemies). | |
Run Interaction (RunInteraction) | function | RPG Saga|Narrative | Interaction: URSEInteractionData* | ERSEInteractionResult | Runs an interaction against this game instance's state. Null = ConditionsFailed. |
URSENavSnapshotCapture
Module RSE. Reads a battle area of the world into a navigation snapshot for Free Tactics (D-091, docs/design/free-tactics.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Battle to World (BattleToWorld) | pure, static | RPG Saga|Free Tactics | Snapshot: FRSENavSnapshot (ref)BattlePoint: FVector (ref) | FVector | World position (centimeters) of a battle space point of Snapshot. |
Capture Area (CaptureArea) | function, static | RPG Saga|Free Tactics | WorldContextObject: UObject*AreaTransform: FTransform (ref)SizeMeters: FVector2DIgnoredActors: TArray<AActor*> (ref) | FRSENavSnapshot | Captures the area whose corner is at AreaTransform's origin (its yaw orients it) and whose size is SizeMeters (X, Y), with cells of Free Tactics -> Snapshot Cell Size. Battle space = meters from that corner; the snapshot's WorldTransform maps back. IgnoredActors (the battle's units, for example) are not captured. |
World to Battle (WorldToBattle) | pure, static | RPG Saga|Free Tactics | Snapshot: FRSENavSnapshot (ref)WorldPoint: FVector (ref) | FVector | Battle space point (meters) of a world position of Snapshot's area. |
URSENetPlayerComponent
Module RSENet. One player of a co-op session (D-124 §3.7, D-140), on the player's APlayerState: its session slot (FRSEPlayerId, 0 = the host), the party member it plays and its admission (play, or watch until the battle ends).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Admission (GetAdmission) | pure | RPG Saga|Co-op | ERSEJoinAdmission | Get Admission | |
Get Character (GetCharacter) | pure | RPG Saga|Co-op | FPrimaryAssetId | The party member the player plays (the lobby's choice, then what the host gave). | |
Get Player Id (GetPlayerId) | pure | RPG Saga|Co-op | FRSEPlayerId | The player's session slot (None until the host set it). |
URSENetSubsystem
Module RSENet. The co-op layer of one game instance (D-140, docs/design/networking.md §3, docs/product/coop.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Net Role (GetNetRole) | pure | RPG Saga|Co-op | ERSEAuthorityMode | Standalone, Authority (host) or Proxy (guest), as set on the RSECore authority subsystem. | |
Get Stats (GetStats) | pure | RPG Saga|Co-op | FRSENetTrafficStats | What the co-op layer sent and received since the session started. | |
Has Initial State (HasInitialState) | pure | RPG Saga|Co-op | bool | Guest: the first complete state from the host has been applied. Host and single player: always true. | |
Is Coop Active (IsCoopActive) | pure | RPG Saga|Co-op | bool | A co-op session runs on this machine (host or guest). | |
On Peer Command Result (OnPeerCommandResult) | event | RPG Saga|Co-op | Result: FRSECommandResult (ref) | Another player's command result (Broadcast Result Types), on every machine. |
URSENightLightComponent
Module RSE, display name Night Light. Turns the lights of its actor on at dusk and off at dawn (D-101): lamps, torches, windows.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Forced (ClearForced) | function | RPG Saga|Time | Clear Forced | ||
Force State (ForceState) | function | RPG Saga|Time | bOn: bool | Forces the light on or off for the story (clears with ClearForced). | |
Get Level (GetLevel) | pure | RPG Saga|Time | float | On now (after fade), as last computed. |
URSEOptionsViewModel
Module RSE. The options screen (D-038): tabs Game / Audio / Display / Controls.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Activate (Activate) | function | RPG Saga|UI|Options | Runs the selected row: an action, or the next value of a choice; Keep / Revert during the video question. | ||
Change Row Value (ChangeRowValue) | function | RPG Saga|UI|Options | Index: int32Direction: int32 | Changes a row's value by Direction (arrows next to a row). | |
Change Value (ChangeValue) | function | RPG Saga|UI|Options | Direction: int32 | Changes the selected row's value by Direction (-1 / +1). | |
Confirm Video (ConfirmVideo) | function | RPG Saga|UI|Options | bKeep: bool | Answers the video question. | |
Leave (Leave) | function | RPG Saga|UI|Options | Leaves the screen (display choices not applied are dropped). | ||
Move Selection (MoveSelection) | function | RPG Saga|UI|Options | Direction: int32 | Move Selection | |
Select (Select) | function | RPG Saga|UI|Options | Index: int32 | Puts the cursor on a row (mouse hover); the video question's options when it is open. | |
Set Choice (SetChoice) | function | RPG Saga|UI|Options | Index: int32Choice: int32 | Sets a choice row directly. | |
Set Page (SetPage) | function | RPG Saga|UI|Options | NewPage: ERSEOptionsPage | Set Page | |
Set Slider Value (SetSliderValue) | function | RPG Saga|UI|Options | Index: int32Value: floatbFinal: bool = true | Sets a slider row's value (snapped to its step). bFinal: the drag ended (sound, full refresh). | |
Switch Page (SwitchPage) | function | RPG Saga|UI|Options | Direction: int32 | Switch Page |
URSEPairedAnimationLibrary
Module RSE. The pairs a project can pick from (D-172): finishers, counters, parries, grabs and phase moments, chosen by their conditions and weights.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Select Pair (SelectPair) | pure | RPG Saga|Paired Animations | Context: FRSEPairedContext (ref)Roll: float | URSEPairedAnimationData* | A pair that fits Context, weighted; Roll in [0, 1) picks it (deterministic for a given roll). Null when none fits. |
URSEPairedAnimationLibraryFunctions
Module RSE. Paired animation nodes (D-172).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Compute Pair Alignment (ComputePairAlignment) | pure, static | RPG Saga|Paired Animations | Attacker: FTransform (ref)Victim: FTransform (ref)Relative: FRSEPairedRelativeTransform (ref)Mode: ERSEPairedAlignMode | FRSEPairedAlignment | Alignment of a pair for two transforms (where both stand when the montages start). |
Find Pair (FindPair) | function, static | RPG Saga|Paired Animations | Context: FRSEPairedContext (ref)Roll: float = 0.000000 | URSEPairedAnimationData* | Finds a pair for Context in the project's libraries (Project Settings -> Paired Animations), weighted by Roll (0..1). Null when none fits. |
Get Finisher Frequency (GetFinisherFrequency) | pure, static | RPG Saga|Paired Animations | ERSEFinisherFrequency | The player's finisher setting (Options -> Finishers): Off, Sometimes or Always. | |
Play Paired Animation (PlayPairedAnimation) | function, static | RPG Saga|Paired Animations | WorldContext: UObject*Pair: URSEPairedAnimationData*Attacker: AActor*Victim: AActor*bLocalCamera: boolbVictimFalls: boolOnFinished: FRSEOnPairedFinished | bool | Plays a pair on two actors now (action battles, cutscene moments, boss phase hooks). Call it on the machine that should see it: the killer's, in co-op. bLocalCamera: the cinematic camera and slow motion for this machine's player. On Finished fires when both montages end (at once when nothing could play). |
Set Finisher Frequency (SetFinisherFrequency) | function, static | RPG Saga|Paired Animations | Frequency: ERSEFinisherFrequency | Sets the player's finisher setting (saved in GameUserSettings). | |
Try Play Finisher (TryPlayFinisher) | function, static | RPG Saga|Paired Animations | WorldContext: UObject*Attacker: AActor*Victim: AActor*Context: FRSEPairedContext (ref)Roll: floatOnFinished: FRSEOnPairedFinished | bool | A finisher for an action battle kill (or stagger): checks Options -> Finishers and the chance, finds a pair and plays it locally. Call it only for the kills of this machine's player. Returns true when a finisher plays. |
URSEPaperdollPreview
Module RSE. The picture in the middle of the inventory paperdoll (D-126): the selected party member, live, wearing its equipment.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin (Begin) | override | RPG Saga|UI|Inventory | Player: APlayerController* | The screen opened for Player (the world the preview may live in). | |
End (End) | override | RPG Saga|UI|Inventory | The screen closed: release everything. | ||
Get Picture (GetPicture) | override | RPG Saga|UI|Inventory | UTexture* | The picture to draw now, or null while there is none (loading, no look): the board falls back to the portrait. | |
Get Yaw (GetYaw) | pure | RPG Saga|UI|Inventory | float | Get Yaw | |
Get Zoom (GetZoom) | pure | RPG Saga|UI|Inventory | float | Get Zoom | |
Notify Shown (NotifyShown) | override | RPG Saga|UI|Inventory | PixelSize: FVector2D | The picture is on screen this frame, drawn at PixelSize (providers capture only while shown). | |
Project Body Part (ProjectBodyPart) | override | RPG Saga|UI|Inventory | BodyPart: FGameplayTagOutUV: FVector2D (out) | bool | Where a body part (Inventory UI -> Body Anchors, its bones) is in the picture now, 0..1; false = unknown (the anchor's fixed point is used). |
Set Yaw (SetYaw) | override | RPG Saga|UI|Inventory | InYaw: float | Turns the character (degrees around its vertical axis, 0 = the framing's view). | |
Set Zoom (SetZoom) | override | RPG Saga|UI|Inventory | InZoom: float | Zoom (1 = the whole figure; clamped to Inventory UI -> Preview Zoom Range). | |
Show Character (ShowCharacter) | override | RPG Saga|UI|Inventory | Character: URSECharacterData*Equipment: FRSECharacterEquipment (ref) | Shows Character wearing Equipment (called after every change; same values = nothing to do). Null = none. |
URSEPartyCommandMenuViewModel
Module RSE. The radial menu's data and actions (D-097, D-052): Widget Blueprints may replace the built-in radial widget.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Choose (Choose) | function | RPG Saga|Party Field | Index: int32 | Carries out an entry (a click, Confirm). |
URSEPartyControlSubsystem
Module RSECore. Owner of who controls each party member in the field (D-097, D-124 §3.7, D-133): the host, a guest, or the companion AI.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Control State (GetControlState) | pure | RPG Saga|Party|Control | FRSEPartyControlState | Who controls each member. | |
Get Controlling Player (GetControllingPlayer) | pure | RPG Saga|Party|Control | Member: FPrimaryAssetId | FRSEPlayerId | The player who controls Member; None for the companion AI. |
Get Leader (GetLeader) | pure | RPG Saga|Party|Control | Player: FRSEPlayerId | FPrimaryAssetId | The member Player leads; invalid when none. |
On Party Control Changed (BP_OnControlChanged) | event | RPG Saga|Party|Control | The control changed (a command applied, a sync, a load). |
URSEPartyFieldSubsystem
Module RSE. The visible party in exploration (D-097, docs/design/coop-pvp.md section 2): spawns the party members behind the leader (Project Settings -> Party Field), keeps who controls whom (FRSEPartyControlState: the local player leads, the others have a companion AI), switches the leader, and performs delega...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cycle Leader (CycleLeader) | function | RPG Saga|Party Field | Step: int32 = 1 | bool | Makes the next (Step 1) or previous (-1) member the leader: the local player takes its pawn. |
Force Idle Now (ForceIdleNow) | function | RPG Saga|Party Field | D-129 (dev, tests): every follower starts its idle life at its next think. | ||
Get Leader Pawn (GetLeaderPawn) | pure | RPG Saga|Party Field | ARSEExplorationCharacter* | The pawn the local player controls. | |
Is Command Menu Open (IsCommandMenuOpen) | pure | RPG Saga|Party Field | bool | Is Command Menu Open | |
On Follower Idle (OnFollowerIdle) | event | RPG Saga|Party Field | Member: ARSEExplorationCharacter*Intent: FRSEIdleIntent (ref) | A resting member started an idle action (Custom behaviours: the game carries them out). | |
Refresh Followers (RefreshFollowers) | function | RPG Saga|Party Field | Spawns or removes the followers to match the party (Party Field settings, the formation). Call after the party changed. | ||
Set Leader (SetLeader) | function | RPG Saga|Party Field | Member: URSECharacterData* | bool | Makes Member's pawn the leader. |
Toggle Command Menu (ToggleCommandMenu) | function | RPG Saga|Party Field | Opens or closes the radial menu. |
URSEPartyMenuViewModel
Module RSE. The party menu (D-024 / D-025, D-039, D-013, D-027 / D-029, D-047, D-038): data of every page and every action that changes the game (use items and abilities, equip, formation, Pacts, quests, key items, help, options, world map).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Abandon Quest (AbandonQuest) | function | RPG Saga|UI|PartyMenu | Quest: URSEQuestData*bConfirmed: bool | bool | Abandons a side quest (bConfirmed false = only asks, when the settings want a confirmation). Returns true when abandoned. |
Can Cast Ability (CanCastAbility) | function | RPG Saga|UI|PartyMenu | Caster: URSECharacterData*Ability: URSEAbilityData* | bool | Can Cast Ability |
Can Change Equipment (CanChangeEquipment) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | bool | Member's equipment can be changed (guests' cannot). |
Can Fight Classic Battles Here (CanFightClassicBattlesHere) | pure | RPG Saga|UI|PartyMenu | bool | Classic (ATB / turn-based) battles can start in this level (it has an ATB battle director). | |
Can Open (CanOpen) | pure | RPG Saga|UI|PartyMenu | bool | The menu may open now (not blocked by a battle). | |
Can Show Quest on Map (CanShowQuestOnMap) | pure | RPG Saga|UI|PartyMenu | Quest: URSEQuestData* | bool | Quest has an objective the area map of this level can show. |
Can Target Whole Party (CanTargetWholeParty) | pure, static | RPG Saga|UI|PartyMenu | Ability: URSEAbilityData* | bool | Ability (for items: the item's use ability) can also target the whole party at once (Target null in UseItem / CastAbility). |
Can Use Item (CanUseItem) | function | RPG Saga|UI|PartyMenu | Item: URSEConsumableData* | bool | Whether Item can be used from the menu now (message when not). Save items open the save screen. |
Cast Ability (CastAbility) | function | RPG Saga|UI|PartyMenu | Caster: URSECharacterData*Ability: URSEAbilityData*Target: URSECharacterData* | bool | Casts Ability from Caster on Target (null = the whole party when allowed). Returns true when cast. |
Cast Ability on World (CastAbilityOnWorld) | function | RPG Saga|UI|PartyMenu | Caster: URSECharacterData*Ability: URSEAbilityData* | bool | D-157: casts Ability from Caster on the surroundings (the Cast On World command). Returns true when it was sent. |
Close Menu (CloseMenu) | function | RPG Saga|UI|PartyMenu | Closes the menu (the options screen too). | ||
Combine Items (CombineItems) | function | RPG Saga|UI|PartyMenu | First: URSEItemData*Second: URSEItemData* | URSEItemData* | Tries a combination of two key items (D-039). Returns the new item, or null. |
Equip (Equip) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData*SlotId: FNameItem: URSEEquipmentData* | bool | Equip |
Get Abilities (GetAbilities) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | TArray<FRSEPartyAbilityView> | Get Abilities |
Get Battle Access (GetBattleAccess) | pure | RPG Saga|UI|PartyMenu | ERSEPartyMenuBattleAccess | What this player's menu may do now (D-128): outside battles Allowed; in a battle UI -> Party Menu In Battle. Per menu (each local player owns one), so co-op screens decide for themselves. | |
Get Equip Candidates (GetEquipCandidates) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData*SlotId: FName | TArray<FRSEItemView> | Inventory items that fit SlotId for Member. |
Get Equip Preview (GetEquipPreview) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData*SlotId: FNameItem: URSEEquipmentData* | TArray<FRSEStatChangeView> | Member's menu stats now and with Item in SlotId (Item null = the slot emptied; OutCanEquip false when it does not fit). |
Get Equipment (GetEquipment) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | TArray<FRSEEquipSlotView> | Get Equipment |
Get Formation Page Kind (GetFormationPageKind) | pure | RPG Saga|UI|PartyMenu | ERSEFormationPageKind | What the Formation tab is now (UI -> Formation Page; Auto: classic battles where the player is). | |
Get Items Of Kind (GetItemsOfKind) | pure | RPG Saga|UI|PartyMenu | Kind: ERSEItemKind | TArray<FRSEItemView> | Items of one kind (Items page tabs). |
Get Map Page (GetMapPage) | pure | RPG Saga|UI|PartyMenu | URSEAreaMapViewModel* | The area map shown by the Map tab (made by the level's map subsystem; null without a map). | |
Get Member Status (GetMemberStatus) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | FRSEMemberStatusView | One member as the Status page shows it. |
Get Page Label (GetPageLabel) | pure, static | RPG Saga|UI|PartyMenu | Page: ERSEPartyMenuPage | FText | D-148: the page's tab label. |
Get Party Order (GetPartyOrder) | pure | RPG Saga|UI|PartyMenu | TArray<FRSEPartyOrderView> | The Party page's rows: leader, followers in order with their places, those out of the formation. | |
Get Quest Map Preview (GetQuestMapPreview) | pure | RPG Saga|UI|PartyMenu | Quest: URSEQuestData*OutMap: UTexture2D* (out)OutObjectiveUV: FVector2D (out)OutPlayerUV: FVector2D (out)bOutHasPlayer: bool (out) | bool | The mini-map of a quest's current objective: this level's map picture, the objective's map coordinates and the player's. Returns false when the level's map cannot show the quest. |
Get Row Effects (GetRowEffects) | pure, static | RPG Saga|UI|PartyMenu | FRSERowEffectsView | What the front and back rows do to melee damage (the battle rules of the game's profile). | |
Get Selected Member (GetSelectedMember) | pure | RPG Saga|UI|PartyMenu | URSECharacterData* | The selected member (the first when none was chosen). | |
Get Selected Member Index (GetSelectedMemberIndex) | pure | RPG Saga|UI|PartyMenu | int32 | The selected member's row in Members (the first when none was chosen; INDEX_NONE without members). | |
Get Start Page (GetStartPage) | pure | RPG Saga|UI|PartyMenu | ERSEPartyMenuPage | D-148: the page Tab / Esc open on (UI -> Party Menu Start Page, else the first tab shown). | |
Get Stats (GetStats) | pure | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | TArray<FRSEStatChangeView> | Member's menu stats now (Current = After). |
Get Tab Label (GetTabLabel) | pure | RPG Saga|UI|PartyMenu | Page: ERSEPartyMenuPage | FText | D-155: a tab's label as shown now (the Formation tab is "Party" in live-only games). |
Get Tab Order (GetTabOrder) | pure | RPG Saga|UI|PartyMenu | TArray<ERSEPartyMenuPage> | D-148: the tabs shown now, in order. | |
Get Targets (GetTargets) | pure | RPG Saga|UI|PartyMenu | Caster: URSECharacterData*Ability: URSEAbilityData* | TArray<FRSEMemberView> | Members an item or ability can be used on now (Caster null for items). |
Handle Page Key (HandlePageKey) | function | RPG Saga|UI|PartyMenu | Page: ERSEPartyMenuPage | ERSEPartyMenuKeyResult | D-148: a page key was pressed (I, J, M, K..., UI -> Party Menu Page Actions): opens the menu on Page, moves to it, or closes the menu when it is already there (Game Flow -> Screen Keys Toggle). |
Is in Battle (IsInBattle) | pure | RPG Saga|UI|PartyMenu | bool | This player's party is in a battle now (Free Tactics, Tactics or ATB; D-128). | |
Is Page Available (IsPageAvailable) | pure | RPG Saga|UI|PartyMenu | Page: ERSEPartyMenuPage | bool | D-148: the page can be shown now: in the tab order (UI -> Party Menu Tab Order), Growth with a progression system beyond Classic, Map when the level has a map, Equipment unless the grid inventory holds it. |
Is Read Only (IsReadOnly) | pure | RPG Saga|UI|PartyMenu | bool | Look only: every change is refused (UI -> Party Menu In Battle = View Only during a battle). | |
Is Sub Screen Open (IsSubScreenOpen) | pure | RPG Saga|UI|PartyMenu | bool | The options screen or a tutorial is open over the menu (the menu waits). | |
Learn Pact Ability (LearnPactAbility) | function | RPG Saga|UI|PartyMenu | Pact: URSEPactData*Ability: URSEAbilityData* | bool | Learn Pact Ability |
Make Leader (MakeLeader) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | bool | Makes Member the leader (the explorer the player controls; co-op: asks the host). |
Move in Formation (MoveInFormation) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData*Offset: int32 | bool | Moves Member Offset places in the formation's order (negative = earlier): battle party and follower order. |
Open (Open) | function | RPG Saga|UI|PartyMenu | Opens the menu (remembers the object the player stands at, for "Use on ..."). During a battle only when UI -> Party Menu In Battle allows it (D-128; blocked: Message says why and the menu stays closed). | ||
Open Growth For (OpenGrowthFor) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | bool | Moves to the Growth page with Member selected (the Status page's growth button). |
Open Journal (OpenJournal) | function | RPG Saga|UI|PartyMenu | Quest: URSEQuestData* | Opens the menu on the journal with Quest selected (the area map's objectives, D-092). | |
Open on Page (OpenOnPage) | function | RPG Saga|UI|PartyMenu | Page: ERSEPartyMenuPage | bool | D-148: opens the menu on Page, or moves the open menu to it. Returns false when the menu cannot open or the page is not offered. |
Open Options (OpenOptions) | function | RPG Saga|UI|PartyMenu | bool | Opens the options screen over the menu. | |
Open World Map (OpenWorldMap) | function | RPG Saga|UI|PartyMenu | bool | Opens the world map (needs the map item when the settings set one). | |
Read Tutorial (ReadTutorial) | function | RPG Saga|UI|PartyMenu | Tutorial: URSETutorialData* | bool | Reads a seen tutorial again (over the menu). |
Refresh (Refresh) | function | RPG Saga|UI|PartyMenu | Rebuilds every list from the game. | ||
Run Menu Extension (RunMenuExtension) | function | RPG Saga|UI|PartyMenu | Id: FName | bool | Runs the menu extension row Id of the Options page (D-142: Host Game, Invite, a project's own entries). Returns false when there is no such enabled entry. |
Select Member (SelectMember) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | Selects Member on every page with a member list (null = the first member). | |
Set Message (SetMessage) | function | RPG Saga|UI|PartyMenu | InMessage: FText (ref) | Set Message | |
Set Page (SetPage) | function | RPG Saga|UI|PartyMenu | NewPage: ERSEPartyMenuPage | Set Page | |
Should Cast on World (ShouldCastOnWorld) | pure | RPG Saga|UI|PartyMenu | Caster: URSECharacterData*Ability: URSEAbilityData* | bool | D-157: choosing Ability casts it on the surroundings instead of a member: it is usable on the world and either has no party use or something around the leader reacts to it (a torch to light, fog to clear). |
Show Blocked Notice (ShowBlockedNotice) | function | RPG Saga|UI|PartyMenu | Tells this player the menu cannot open now (D-128: a toast on their reward feed, and Message). | ||
Show Quest on Map (ShowQuestOnMap) | function | RPG Saga|UI|PartyMenu | Quest: URSEQuestData* | bool | Closes the menu and opens the area map on Quest's objective (journal "Show on map", D-092). |
Toggle Battle Party (ToggleBattleParty) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | bool | Moves Member into / out of the ATB party. |
Toggle Pact Binding (TogglePactBinding) | function | RPG Saga|UI|PartyMenu | Pact: URSEPactData*Member: URSECharacterData* | bool | Binds Pact to Member, or unbinds it when Member holds it already. |
Toggle Row (ToggleRow) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData* | bool | Front row <-> back row. |
Track Quest (TrackQuest) | function | RPG Saga|UI|PartyMenu | Quest: URSEQuestData* | bool | Tracks Quest (null = stop tracking). |
Unequip (Unequip) | function | RPG Saga|UI|PartyMenu | Member: URSECharacterData*SlotId: FName | bool | Unequip |
Use Item (UseItem) | function | RPG Saga|UI|PartyMenu | Item: URSEConsumableData*Target: URSECharacterData*FromBag: URSECharacterData* = None | bool | Uses a consumable on Target (null = the whole party when the item allows it). Returns true when used. |
Use Key Item on Target (UseKeyItemOnTarget) | function | RPG Saga|UI|PartyMenu | Item: URSEItemData* | bool | Uses a key item on the object the player stands at (the menu closes; the object answers). |
Use Save Item (UseSaveItem) | function | RPG Saga|UI|PartyMenu | Item: URSEConsumableData* | bool | Uses a save-anywhere item (D-010): opens the save screen. Returns true when the screen opened. |
Use Status Action (UseStatusAction) | function | RPG Saga|UI|PartyMenu | Action: FRSEStatusActionView (ref)Target: URSECharacterData* | bool | Uses a Status page action on Target (an ability through its caster, an item from the party). Returns true when sent. |
Zoom Map (ZoomMap) | function | RPG Saga|UI|PartyMenu | Steps: float | bool | Zooms the Map tab's map by Steps (the camera zoom input: wheel, triggers). Returns true when the Map tab is shown. |
URSEPartySubsystem
Module RSECore. Owns the player's party state for the whole game session (survives level changes).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Attribute Registry (GetAttributeRegistry) | pure | RPG Saga|Party|Attributes | URSEAttributeRegistry* | Attribute and resource definitions of the game's rules profile. | |
Get Member Attribute (GetMemberAttribute) | pure | RPG Saga|Party|Attributes | Character: URSECharacterData*Attribute: FGameplayTag | float | Final attribute of Character at its current level with its current equipment (derived attributes included). |
Get Member Resource (GetMemberResource) | pure | RPG Saga|Party|Attributes | Character: URSECharacterData*Resource: FGameplayTag | float | Current value of a persistent resource (HP, MP, custom ones marked Persists After Battle). |
Get Member Resource Max (GetMemberResourceMax) | pure | RPG Saga|Party|Attributes | Character: URSECharacterData*Resource: FGameplayTag | float | Maximum of a member's resource at its level with its equipment. |
Modify Member Resource (ModifyMemberResource) | function | RPG Saga|Party|Attributes | Character: URSECharacterData*Resource: FGameplayTagDelta: float | Adds Delta to a resource (see SetMemberResource). | |
On Ability Learned (OnAbilityLearned) | event | RPG Saga|Party | Character: URSECharacterData*Ability: URSEAbilityData*bLearned: bool | A character of this party learned or forgot an ability for good (Learn Ability / Forget Ability, scrolls; D-082). | |
On Member Resource Changed (OnMemberResourceChanged) | event | RPG Saga|Party|Attributes | Character: URSECharacterData*Resource: FGameplayTagOldValue: floatNewValue: float | A member's resource changed through SetMemberResource / ModifyMemberResource (battles report theirs on URSEBattle::OnResourceChanged). | |
Set Member Resource (SetMemberResource) | function | RPG Saga|Party|Attributes | Character: URSECharacterData*Resource: FGameplayTagValue: float | Sets a resource (clamped to [0, max]); HP 0 marks the member KO, HP above 0 clears KO. Fires OnMemberResourceChanged. Sends the Set Member Resource command (D-137; host only). |
URSEPassiveModifier
Module RSECore, display name Passive Modifier. A conditional passive bonus (D-055): while every condition holds (the AI condition classes, e.g.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Active For (IsActiveFor) | override | RPG Saga|Abilities|Passives | Battle: URSEBattle*UnitId: int32 | bool | Custom rule on top of the conditions (Blueprint subclasses). Default: true. |
URSEPlatformUserSubsystem
Module RSECore. The platform user layer (D-170, docs/product/platforms.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Connected Input Devices (GetConnectedInputDevices) | pure | RPG Saga|Platform | User: FPlatformUserIdOutDevices: TArray<FInputDeviceId> (out) | Input devices of User that are connected now (the platform's mapping). | |
Get Primary User (GetPrimaryUser) | pure | RPG Saga|Platform | FPlatformUserId | The user that plays (and owns the saves). | |
Get Primary User Index (GetPrimaryUserIndex) | pure | RPG Saga|Platform | int32 | The primary user's local user index (index-based platform APIs). | |
Has Selected Primary User (HasSelectedPrimaryUser) | pure | RPG Saga|Platform | bool | The primary user was picked by a "press start" (false until then, and again after Reset Primary User Selection). | |
Is App Suspended (IsAppSuspended) | pure | RPG Saga|Platform | bool | The app is suspended (between Report App Suspended and Report App Resumed). | |
Is Primary User Signed In (IsPrimaryUserSignedIn) | pure | RPG Saga|Platform | bool | Is Primary User Signed In | |
Is User Signed In (IsUserSignedIn) | pure | RPG Saga|Platform | User: FPlatformUserId | bool | User is signed in (users are signed in unless the platform reported a sign-out). |
On App Resumed (BP_OnAppResumed) | event | RPG Saga|Platform | |||
On App Suspended (BP_OnAppSuspended) | event | RPG Saga|Platform | |||
On Controller Connection Changed (BP_OnControllerConnectionChanged) | event | RPG Saga|Platform | User: FPlatformUserIdDevice: FInputDeviceIdbConnected: boolbPrimaryUser: bool | ||
On Primary User Changed (BP_OnPrimaryUserChanged) | event | RPG Saga|Platform | NewUser: FPlatformUserId | ||
On User Login Changed (BP_OnUserLoginChanged) | event | RPG Saga|Platform | User: FPlatformUserIdbSignedIn: boolbPrimaryUser: bool | ||
Report App Resumed (ReportAppResumed) | function | RPG Saga|Platform | The app is back in the foreground. | ||
Report App Suspended (ReportAppSuspended) | function | RPG Saga|Platform | The app goes to the background (suspend): save writes in flight are flushed (Save -> Suspend Flush Timeout). | ||
Report Controller Connection Changed (ReportControllerConnectionChanged) | function | RPG Saga|Platform | User: FPlatformUserIdDevice: FInputDeviceIdbConnected: bool | An input device of User connected or disconnected (IPlatformInputDeviceMapper). | |
Report User Login Changed (ReportUserLoginChanged) | function | RPG Saga|Platform | User: FPlatformUserIdbSignedIn: bool | A user signed in or out (FCoreDelegates::OnUserLoginChangedEvent, or the buyer's online login flow). | |
Reset Primary User Selection (ResetPrimaryUserSelection) | function | RPG Saga|Platform | Back to the title screen: the next "press start" picks the user again (the current one stays until then). | ||
Select Primary User (SelectPrimaryUser) | function | RPG Saga|Platform | User: FPlatformUserId | bool | Makes User the primary user (selected). Returns false for an invalid user. |
Select Primary User from Input Device (SelectPrimaryUserFromInputDevice) | function | RPG Saga|Platform | Device: FInputDeviceId | bool | "Press start": the user of Device (the platform's device-to-user mapping) becomes the primary user. An invalid device keeps the current user but still counts as the selection. Returns true when the primary user is now set. |
URSEPlayerProvider
Module RSE. Lists the players of a world for URSEPlayers (D-134).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Host Controller (GetHostController) | override | RPG Saga|Players | World: UWorld* | APlayerController* | The host's controller (slot 0): the player who owns the party leader, counts the random-encounter steps and leads zone travel (D-124 §6). Null on a network client (the host's controller lives on the server). |
Get Player Controllers (GetPlayerControllers) | override | RPG Saga|Players | World: UWorld*OutControllers: TArray<APlayerController*> (out) | Every player controller of World this machine knows, host first. | |
Get Player Slot (GetPlayerSlot) | override | RPG Saga|Players | World: UWorld*Controller: APlayerController* | int32 | The player's slot (0 = host), or -1 when the controller is not a known player. |
URSEPlayers
Module RSE. The players registry (D-134, docs/design/networking.md §3.8): the one place RSE asks "who are the players".
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Controller For (GetControllerFor) | pure, static | RPG Saga|Players | WorldContext: UObject*PlayerId: FRSEPlayerId | APlayerController* | The controller of a player id (the instigator of a command), or null. |
Get Controller for Slot (GetControllerForSlot) | pure, static | RPG Saga|Players | WorldContext: UObject*Slot: int32 | APlayerController* | The controller of a player slot, or null. |
Get Host Controller (GetHostController) | pure, static | RPG Saga|Players | WorldContext: UObject* | APlayerController* | The host's controller (slot 0, owns the party leader). Null on a network client. |
Get Host Pawn (GetHostPawn) | pure, static | RPG Saga|Players | WorldContext: UObject* | APawn* | The host's pawn (the party leader in exploration), or null. |
Get Local Player Controllers (GetLocalPlayerControllers) | function, static | RPG Saga|Players | WorldContext: UObject*OutControllers: TArray<APlayerController*> (out) | The players of this machine (local controllers), in local player order. | |
Get Nearest Player Pawn (GetNearestPlayerPawn) | function, static | RPG Saga|Players | WorldContext: UObject*Location: FVectorOutDistance: float (out) | APawn* | The player pawn closest to Location (null without players); OutDistance in cm (-1 without players). |
Get Pawn For (GetPawnFor) | pure, static | RPG Saga|Players | WorldContext: UObject*PlayerId: FRSEPlayerId | APawn* | The pawn of a player id, or null. |
Get Player Controllers (GetPlayerControllers) | function, static | RPG Saga|Players | WorldContext: UObject*OutControllers: TArray<APlayerController*> (out) | Every player controller this machine knows (server: all players; client: its own), host first. | |
Get Player Id (GetPlayerId) | pure, static | RPG Saga|Players | Controller: APlayerController* | FRSEPlayerId | The player id (D-133) of a controller: its slot; None for a controller that is not a player. |
Get Player Pawns (GetPlayerPawns) | function, static | RPG Saga|Players | WorldContext: UObject*OutPawns: TArray<APawn*> (out) | The pawns of every player (players without a pawn are skipped). | |
Get Player Slot (GetPlayerSlot) | pure, static | RPG Saga|Players | Controller: APlayerController* | int32 | The player's slot (0 = host), -1 for a controller that is not a player. |
Get Primary Local Controller (GetPrimaryLocalController) | pure, static | RPG Saga|Players | WorldContext: UObject* | APlayerController* | This machine's first local player: for presentation that has no better owner (screens, camera, sounds). |
Has Authority (HasAuthority) | pure, static | RPG Saga|Players | WorldContext: UObject* | bool | This machine runs the game logic (single-player: always). Logic timers and world-state changes check it. |
Is Any Player Within (IsAnyPlayerWithin) | pure, static | RPG Saga|Players | WorldContext: UObject*Location: FVectorRadius: float | bool | Some player's pawn stands within Radius cm of Location. |
Is Multiplayer Session (IsMultiplayerSession) | pure, static | RPG Saga|Players | WorldContext: UObject* | bool | Several players share the world: the co-op rules apply (no world pause, no world time dilation, no tutorials). |
Is Player Pawn (IsPlayerPawn) | pure, static | RPG Saga|Players | Pawn: APawn* | bool | Pawn is controlled by a player (any player, local or remote). |
Resolve Player Controller (ResolvePlayerController) | pure, static | RPG Saga|Players | WorldContext: UObject*Instigator: UObject*bFallbackToLocal: bool = true | APlayerController* | The player behind Instigator: a controller itself, a pawn's controller, a widget's owning player, a local player's controller, an actor's instigator or owner, a component's owner. Falls back to the primary local controller when bFallbackToLocal is set and nothing resolves (presentation that must show somewhere). |
URSEPuzzleSubsystem
Module RSECore. The puzzle actions on the authority (D-039, D-138): code attempts and item combinations arrive as commands from any player and are applied here, headless.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Code Lock Outcome (BP_OnCodeLockOutcome) | event | RPG Saga|Puzzles | Outcome: FRSECodeLockOutcome (ref) | ||
On Combine Outcome (BP_OnCombineOutcome) | event | RPG Saga|Puzzles | Outcome: FRSECombineOutcome (ref) |
URSEQuestPresentationSubsystem
Module RSE. Presents the quest system in game worlds (docs/design/quests.md): creates the quest HUD (tracker + toasts) for the first local player and feeds it from FRSEQuestEvents.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Battle Active (IsBattleActive) | pure | RSE|Quests | bool | A Tactics or ATB battle is running (deployment included). | |
Set Tracker Suppressed (SetTrackerSuppressed) | function | RSE|Quests | Reason: FNamebSuppressed: bool | Hides the tracker while any reason is set (e.g. "Dialog", "Cutscene"). Battles are handled automatically. |
URSEQuestSubsystem
Module RSECore. Runs quests (D-027, docs/design/quests.md) on top of the narrative state and the shared conditions/effects.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Abandon Quest (AbandonQuest) | function | RPG Saga|Quests | Quest: URSEQuestData* | bool | Abandons an active quest that allows it (CanAbandonQuest). |
Can Abandon Quest (CanAbandonQuest) | pure | RPG Saga|Quests | Quest: URSEQuestData* | bool | Active, bCanAbandon and a side quest (D-029: only side quests can be abandoned). |
Can Local Player Abandon Quest (CanLocalPlayerAbandonQuest) | pure | RPG Saga|Quests | Quest: URSEQuestData* | bool | CanAbandonQuest, and this machine's player may send Abandon Quest (co-op: host only by default, D-139). For the UI. |
Complete Objective (CompleteObjective) | function | RPG Saga|Quests | Quest: URSEQuestData*Objective: FName | bool | Completes an objective of the current stage of an active quest. |
Complete Quest (CompleteQuest) | function | RPG Saga|Quests | Quest: URSEQuestData*Outcome: FName = None | bool | Finishes an active quest with an outcome (None = default success). A failure outcome fails it. |
Confirm Point Of No Return (ConfirmPointOfNoReturn) | function | RPG Saga|Quests | bool | Sets the point-of-no-return flag: at-risk quests fail and the ending locks (if the set says so). | |
Evaluate Ending (EvaluateEnding) | pure | RPG Saga|Quests | FGameplayTag | The ending the story leads to now (the locked one after the point of no return, when the set locks it). | |
Fail Quest (FailQuest) | function | RPG Saga|Quests | Quest: URSEQuestData*Outcome: FName = None | bool | Fails an active quest (Outcome None = default failure; must be a failure outcome otherwise). |
Get Available Quests (GetAvailableQuests) | pure | RPG Saga|Quests | OutQuests: TArray<URSEQuestData*> (out) | Known quests that could be started now. | |
Get Current Stage (GetCurrentStage) | pure | RPG Saga|Quests | Quest: URSEQuestData* | FName | The stage an active quest is at (its last stage once finished). |
Get Ending Score (GetEndingScore) | pure | RPG Saga|Quests | int32 | Hidden score variable plus key choices made. | |
Get Journal (GetJournal) | pure | RPG Saga|Quests | Quest: URSEQuestData*OutEntries: TArray<FRSEQuestJournalEntry> (out) | bool | Journal entries of the stages entered, then the outcome's. |
Get Known Quests (GetKnownQuestsBP) | pure | RPG Saga|Quests | TArray<URSEQuestData*> | Every quest the system knows (registered or started), in evaluation order. | |
Get Objective Views (GetObjectiveViews) | pure | RPG Saga|Quests | Quest: URSEQuestData*OutObjectives: TArray<FRSEQuestObjectiveView> (out) | bool | Objectives of the current (or last) stage the player may see: active ones and completed ones; hidden ones once completed. |
Get Outcome (GetOutcome) | pure | RPG Saga|Quests | Quest: URSEQuestData* | FName | The outcome a finished quest ended with (None while it runs). |
Get Quest Status (GetQuestStatus) | pure | RPG Saga|Quests | Quest: URSEQuestData* | ERSEQuestStatus | Status of a quest: not started, active, completed, failed, missed or abandoned. |
Get Quests (GetQuests) | pure | RPG Saga|Quests | Status: ERSEQuestStatusOutQuests: TArray<URSEQuestData*> (out) | Quests with Status, in start order (finish order for Completed / Failed / Missed). NotStarted = known quests never started. | |
Get Quests Failing At Point Of No Return (GetQuestsFailingAtPointOfNoReturnBP) | pure | RPG Saga|Quests | OutQuests: TArray<URSEQuestData*> (out) | Active quests that fail at the point of no return (for a custom warning screen). | |
Get Tracked Quest (GetTrackedQuest) | pure | RPG Saga|Quests | URSEQuestData* | The quest on the HUD tracker, or none. | |
Is Objective Complete (IsObjectiveComplete) | pure | RPG Saga|Quests | Quest: URSEQuestData*Objective: FName | bool | Whether an objective of a quest is complete. |
Is Point Of No Return Passed (IsPointOfNoReturnPassed) | pure | RPG Saga|Quests | bool | The story passed its point of no return (the ending may be locked). | |
Is Quest Available (IsQuestAvailable) | pure | RPG Saga|Quests | Quest: URSEQuestData* | bool | Not active or finished and AvailableWhen passes (e.g. show a marker over the giver). |
On Ending Changed (OnEndingChanged) | event | RPG Saga|Quests | OldEnding: FGameplayTagNewEnding: FGameplayTag | The ending the story leads to changed (hidden from the player; story tools). | |
On Objective Updated (OnObjectiveUpdated) | event | RPG Saga|Quests | Quest: URSEQuestData*Objective: FName | An objective completed, or its counter changed. | |
On Point Of No Return Passed (OnPointOfNoReturnPassed) | event | RPG Saga|Quests | The point of no return was confirmed: at-risk quests failed, the ending locked. | ||
On Point Of No Return Requested (OnPointOfNoReturnRequested) | event | RPG Saga|Quests | Warning: FText (ref)QuestsThatWillFail: TArray<URSEQuestData*> (ref) | Show Warning (and the quests that will fail); call Confirm Point Of No Return on "yes". | |
On Quest Finished (OnQuestFinished) | event | RPG Saga|Quests | Quest: URSEQuestData*Status: ERSEQuestStatusOutcome: FName | Completed, Failed, Missed or Abandoned (Outcome None when abandoned or without an outcome). | |
On Quest Started (OnQuestStarted) | event | RPG Saga|Quests | Quest: URSEQuestData* | A quest started. | |
On Stage Changed (OnStageChanged) | event | RPG Saga|Quests | Quest: URSEQuestData*OldStage: FNameNewStage: FName | An active quest moved to another stage. | |
On Tracked Quest Changed (OnTrackedQuestChanged) | event | RPG Saga|Quests | Quest: URSEQuestData* | The HUD tracker's quest changed (Quest may be none). | |
Refresh Quests (RefreshQuests) | function | RPG Saga|Quests | Re-evaluates every quest now (objectives, transitions, failures, auto-start, ending). | ||
Request Point Of No Return (RequestPointOfNoReturn) | function | RPG Saga|Quests | bool | Asks the presentation to confirm the point of no return (OnPointOfNoReturnRequested). False if already passed or not configured. | |
Set Stage (SetStage) | function | RPG Saga|Quests | Quest: URSEQuestData*Stage: FName | bool | Moves an active quest to a stage (scripted advance). |
Set Tracked Quest (SetTrackedQuest) | function | RPG Saga|Quests | Quest: URSEQuestData* | bool | Quest on the HUD tracker (null = none). Only active quests can be tracked. |
Start Quest (StartQuest) | function | RPG Saga|Quests | Quest: URSEQuestData*bIgnoreAvailability: bool = false | bool | Starts a NotStarted or Abandoned quest. Checks AvailableWhen unless bIgnoreAvailability. |
URSERPGCameraArm
Module RSE. The spring arm of the RPG cameras (D-113): the tactical exploration camera and the Free Tactics camera.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Terrain Lift (GetTerrainLift) | pure | RPG Saga|Camera | float | How far the camera is lifted over the terrain now (cm; debugging, tests). | |
Reset Smoothing (ResetSmoothing) | function | RPG Saga|Camera | Forgets the follow lag and the terrain lift (after a cut or a hand-off: no glide from a stale place). |
URSEReconnectViewModel
Module RSE. The reconnect screen (D-170): shown while the primary user's controller is disconnected.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Continue (Continue) | function | RPG Saga|Platform | bool | Dismisses the screen when allowed (the lifecycle subsystem resumes the game). Returns true when it closed. |
URSEResultsViewModel
Module RSE. Victory results (D-030): rewards, member cards and battle statistics.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Continue (Continue) | function | RPG Saga|UI|Results | Ends the screen (the battle continues to the world). |
URSERewardFeedSubsystem
Module RSE. Presents rewards without a blocking screen (D-128, docs/design/battle-rewards.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Playing (IsPlaying) | pure | RPG Saga|Rewards | bool | A feed still shows something. | |
Present Battle Rewards (PresentBattleRewards) | function | RPG Saga|Rewards | Rewards: FRSEBattleRewards (ref) | Shows a battle's rewards as the feed (floating texts and toasts) on every local player's screen. | |
Push Floater (PushFloater) | function | RPG Saga|Rewards | Floater: FRSERewardFloater (ref)Over: AActor*Delay: float = 0.000000 | Floating texts (experience, level up) over Over, for every local player. | |
Push Toast (PushToast) | function | RPG Saga|Rewards | Toast: FRSERewardToast (ref)Player: APlayerController* = None | Adds a toast to Player's feed (null = every local player). | |
Skip (Skip) | function | RPG Saga|Rewards | Hurries every feed off the screen. |
URSERewardToastProvider
Module RSE. Makes toasts from a battle's rewards (D-128).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Gather Toasts (GatherToasts) | override | RPG Saga|Rewards | Context: FRSERewardFeedContext (ref)OutToasts: TArray<FRSERewardToast> (out) | Adds this provider's toasts for Context. |
URSERulesProfile
Module RSECore. A set of gameplay-rule overrides (D-035, docs/design/rules-profiles.md): e.g.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Add Section (AddSection) | function | RPG Saga|Rules | Class: TSubclassOf<URSEDeveloperSettings> | URSEDeveloperSettings* | Adds an override section of Class, initialised from the global settings (or returns the existing one). Null if Class is not a profile section class. Marks the asset dirty; the caller saves it. |
Get Own Section (GetOwnSection) | pure | RPG Saga|Rules | Class: TSubclassOf<URSEDeveloperSettings> | URSEDeveloperSettings* | This profile's own section of Class, for editing (null if none). |
Remove Section (RemoveSection) | function | RPG Saga|Rules | Class: TSubclassOf<URSEDeveloperSettings> | bool | Removes the section of Class. Returns false if there was none. Marks the asset dirty. |
URSERulesSubsystem
Module RSECore. The game-level rules resolver (D-035): holds the game's active profile (runtime-switchable, saved by id in the "Rules" section) and resolves the profile of a battle (encounter override -> active profile -> global).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Active Profile (GetActiveProfile) | pure | RPG Saga|Rules | URSERulesProfile* | The game's rules profile: the one set by the story, else the default from the settings. None = the global rules. | |
Get Active Profile Id (GetActiveProfileId) | pure | RPG Saga|Rules | FPrimaryAssetId | Id of the profile set by the story (invalid = the default is used). | |
On Rules Profile Changed (BP_OnProfileChanged) | event | RPG Saga|Rules | NewProfile: URSERulesProfile* | The game's rules profile changed (story, load, new game). | |
Resolve for Encounter (ResolveForEncounter) | pure | RPG Saga|Rules | Encounter: URSEEncounterData* | URSERulesProfile* | The profile a battle of Encounter uses (encounter override -> active profile -> global). Encounter may be none. |
Set Active Profile (SetActiveProfile) | function | RPG Saga|Rules | Profile: URSERulesProfile* | Switches the game's rules profile (none = back to the default profile). Running battles keep theirs. Saved. A player's choice (D-139): sends Set Rules Profile, host only in co-op. Game logic (the Set Rules Profile effect, a new game) uses ApplyActiveProfile. |
URSESaveFlowSubsystem
Module RSE. The save/load user flow in the world (D-010), on top of RSECore's URSESaveSubsystem: - fills GatherLocation (map, save point id or pawn transform, area name); - load: LoadGame applies the save, then opens its map; the exploration game mode calls ApplyPendingLocation when the player spawns there, whi...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Save Now (CanSaveNowBP) | pure | RPG Saga|Save | Source: ERSESaveRequestSourceOutReasons: TArray<FName> (out) | bool | Whether a save from Source is allowed now (save blocks, plus no battle running); OutReasons lists why not. |
Close Save Screen (CloseSaveScreen) | function | RPG Saga|Save | Closes the save screen. | ||
Decode Thumbnail (DecodeThumbnail) | function, static | RPG Saga|Save | Bytes: TArray<uint8> (ref) | UTexture2D* | A texture from a save's thumbnail bytes, or null. |
Find Continue Slot (FindContinueSlot) | pure | RPG Saga|Save | OutSlotName: FString (out) | bool | Most recent loadable slot (Continue). Returns false when there is none. |
Get Result Text (GetResultText) | pure, static | RPG Saga|Save | Result: ERSESaveResultbLoading: bool | FText | Player-facing text for a save / load result (empty for Ok). |
Has Any Save (HasAnySave) | pure | RPG Saga|Save | bool | At least one loadable save exists (main menu Load / Continue). | |
Is Save Item (IsSaveItem) | pure, static | RPG Saga|Save | Item: URSEItemData* | bool | Item is the save item (the party menu routes it to UseSaveItem instead of a use ability). |
Is Save Screen Open (IsSaveScreenOpen) | pure | RPG Saga|Save | bool | The save screen is open. | |
Load Game (LoadGame) | function | RPG Saga|Save | SlotName: FStringbDeferTravel: bool = false | ERSESaveResult | Loads SlotName (state applied at once, in the game instance) and opens its map. With bDeferTravel the map opens only on TravelToLoadedGame (the main menu fades out first). Loads started elsewhere (URSESaveSubsystem::LoadFromSlot) travel immediately. |
Open Save Screen (OpenSaveScreen) | function | RPG Saga|Save | Request: FRSESaveRequest (ref) | bool | Opens the save screen for Request over the current world. |
Save to Slot (SaveToSlot) | function | RPG Saga|Save | SlotName: FStringRequest: FRSESaveRequest (ref) | ERSESaveResult | Saves the current game with the flow's location info. Used by the save screen and dev commands. |
Travel to Loaded Game (TravelToLoadedGame) | function | RPG Saga|Save | bool | Opens the map of the last loaded save. Returns false if nothing is pending. | |
Use Save Item (UseSaveItem) | function | RPG Saga|Save | Item: URSEItemData* | ERSESaveResult | The save item was chosen (party menu hook, dev command). Blocked in battles, dialogs, cutscenes and no-save zones; otherwise opens the save screen. The item is removed only after a successful save. |
Use Save Point (UseSavePoint) | function | RPG Saga|Save | SavePointId: FName | ERSESaveResult | A save point was used: restores the party (setting), autosaves (setting) and requests a save, which opens the save screen. |
URSESaveInteropLibrary
Module RSECore. Save interop (D-165): the state of any RPG Saga Engine save section (narrative flags, dialog, quests, inventory, party, map, time...) as bytes or JSON, so a project that has its own SaveGame can keep our state inside it, and put it back when its game loads.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Export Section To Bytes (ExportSectionToBytes) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*SectionId: FNameOutBytes: TArray<uint8> (out)OutVersion: int32 (out) | bool | One section's current state in its own save format, with its format version. Returns false when no system owns that section. |
Export Section To JSON (ExportSectionToJson) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*SectionId: FNameOutJson: FString (out) | bool | One section as JSON (the same text format, one entry). |
Export Sections To Bytes (ExportSectionsToBytes) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*SectionIds: TArray<FName> (ref)OutBytes: TArray<uint8> (out) | int32 | Several sections in one byte array. SectionIds empty = every section. Returns how many sections were written. |
Export Sections To JSON (ExportSectionsToJson) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*SectionIds: TArray<FName> (ref)OutJson: FString (out) | int32 | Several sections as a JSON text (data in Base64), for a text based SaveGame, a cloud save or a log. SectionIds empty = every section. |
Get Save Section Ids (GetSectionIds) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*OutSectionIds: TArray<FName> (out) | Ids of the save sections the running game has, in load order (Party, Narrative, Quests...). Session-only sections are left out. | |
Import Section From Bytes (ImportSectionFromBytes) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*SectionId: FNameBytes: TArray<uint8> (ref)Version: int32 | bool | Replaces one section's state with bytes written by Export Section To Bytes. Returns false when the section is unknown or the data cannot be read. |
Import Section From JSON (ImportSectionFromJson) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*Json: FString | bool | Applies a JSON text that holds a single section. Returns false unless exactly that text applied. |
Import Sections From Bytes (ImportSectionsFromBytes) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*Bytes: TArray<uint8> (ref)OutImported: TArray<FName> (out) | int32 | Applies a byte array written by Export Sections To Bytes. Returns how many sections were applied; OutImported lists them. |
Import Sections From JSON (ImportSectionsFromJson) | function, static | RPG Saga|Save|Interop | WorldContextObject: UObject*Json: FStringOutImported: TArray<FName> (out) | int32 | Applies a text written by Export Sections To JSON. Returns how many sections were applied; OutImported lists them. |
URSESaveSessionPolicy
Module RSECore. Who may save and load during a co-op session (D-124 §4, D-139), and what a refused player reads.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Load (CanLoad) | override | RPG Saga|Save | Query: FRSESaveSessionQuery (ref)OutReason: FText (out) | bool | Whether this load may happen; false with a reason. Default: not on a guest; the host only with bAllowLoadInSession. |
Can Save (CanSave) | override | RPG Saga|Save | Query: FRSESaveSessionQuery (ref)OutReason: FText (out) | bool | Whether this save may happen; false with a reason the player reads. Default: not on a guest. |
On Loaded in Session (OnLoadedInSession) | override | RPG Saga|Save | SlotName: FString | A save was loaded on the host while a session runs (after every system applied it). Default: nothing; RSENet also listens to URSESaveSubsystem::OnLoadedInSession to re-send the state and move everyone to the loaded map. |
URSESaveSlotsViewModel
Module RSE. The save / load slot screen (D-010, D-045): one row per slot, autosave first, with thumbnail, area, party, play time, money and date.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Answer Overwrite (AnswerOverwrite) | function | RPG Saga|UI|Save | bYes: bool | Answers the overwrite question. | |
Choose (Choose) | function | RPG Saga|UI|Save | Chooses the selected slot (asks first when saving over a save; answers the question when it is open). | ||
Choose Slot (ChooseSlot) | function | RPG Saga|UI|Save | Index: int32 | Selects a slot and chooses it (a click). | |
Leave (Leave) | function | RPG Saga|UI|Save | Leaves the screen (or the overwrite question). | ||
Move Selection (MoveSelection) | function | RPG Saga|UI|Save | Direction: int32 | Move Selection | |
Refresh Slots (RefreshSlots) | function | RPG Saga|UI|Save | Re-reads the slots, keeping the selected one. | ||
Select (Select) | function | RPG Saga|UI|Save | Index: int32 | Select |
URSESaveSubsystem
Module RSECore. Saves and loads the whole game (D-010).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Autosave (Autosave) | function | RPG Saga|Save | SavePointId: FName | ERSESaveResult | Writes to the next autosave slot (called by save points before the slot menu; SavePointId may be None). |
Can Save Now (CanSaveNowBP) | pure | RPG Saga|Save | Source: ERSESaveRequestSourceOutReasons: TArray<FName> (out) | bool | Whether a save from Source is allowed now; OutReasons lists the blocks that apply (battle, dialog, no-save zone...). |
Delete Slot (DeleteSlot) | function | RPG Saga|Save | SlotName: FString | bool | Deletes a save slot (its file and backup). |
Does Slot Exist (DoesSlotExist) | pure | RPG Saga|Save | SlotName: FString | bool | A save exists in the slot. |
Flush Pending Writes (FlushPendingWrites) | function | RPG Saga|Save|Platform | TimeoutSeconds: float | bool | Waits at most TimeoutSeconds for writes in flight (app suspend). Returns true when nothing is left. |
Get Autosave Slot Name (GetAutosaveSlotName) | pure | RPG Saga|Save | FString | Name of the (first) autosave slot. | |
Get Autosave Slot Names (GetAutosaveSlotNames) | pure | RPG Saga|Save | OutSlots: TArray<FString> (out) | Every autosave slot in rotation order (empty without autosave). | |
Get Backend Type (GetBackendType) | pure | RPG Saga|Save|Platform | ERSESaveBackendType | Which backend the project uses. | |
Get Last Save Result (GetLastSaveResult) | pure | RPG Saga|Save | ERSESaveResult | Result of the last save that finished (async saves: once they complete). | |
Get Play Time Seconds (GetPlayTimeSeconds) | pure | RPG Saga|Save | double | Play time of this game in seconds. | |
Get Save User (GetSaveUser) | pure | RPG Saga|Save|Platform | FRSESaveUser | Whose saves are read and written: the primary platform user (URSEPlatformUserSubsystem keeps it current). | |
Get Seconds Since Last Autosave (GetSecondsSinceLastAutosave) | pure | RPG Saga|Save | double | Seconds since the last successful autosave in this session (a large value when none). | |
Get Slot Info (GetSlotInfo) | pure | RPG Saga|Save | SlotName: FStringOutInfo: FRSESaveSlotInfo (out) | bool | Metadata of one slot. Returns false if the slot is empty or unreadable (a damaged slot without a readable backup reports bExists and bCorrupt; one read from its backup reports bFromBackup). |
Get Slot Infos (GetSlotInfos) | pure | RPG Saga|Save | OutInfos: TArray<FRSESaveSlotInfo> (out) | Metadata of every manual slot (and the autosave slot first, when enabled), empty slots included. | |
Get Slot Name (GetSlotName) | pure | RPG Saga|Save | SlotIndex: int32 | FString | Name of manual save slot N (0-based). |
Get State Section Revision (GetSectionRevision) | pure | RPG Saga|Save | SectionId: FName | int32 | How many times SectionId changed this session (0 = never). |
Get Stored Slot Names (GetStoredSlotNames) | pure | RPG Saga|Save|Platform | OutSlots: TArray<FString> (out) | Every slot the backend stores for the current user (also slots outside the configured slot names). | |
Is Autosave Slot (IsAutosaveSlot) | pure | RPG Saga|Save | SlotName: FString | bool | SlotName is one of the autosave slots (protected from manual saves). |
Is Busy (IsBusy) | pure | RPG Saga|Save | bool | An asynchronous save or load is running. | |
Is Play Time Running (IsPlayTimeRunning) | pure | RPG Saga|Save | bool | The play time clock runs (paused in menus). | |
Load from Slot (LoadFromSlot) | function | RPG Saga|Save | SlotName: FString | ERSESaveResult | Reads and applies a save to every system. In the game prefer Load Game (Save library), which also opens the saved map. |
Load from Slot Async (LoadFromSlotAsync) | function | RPG Saga|Save | SlotName: FString | ERSESaveResult | Same as LoadFromSlot with the file read on a worker thread; OnLoaded or OnLoadFailed report the outcome. |
Mark State Section Changed (MarkSectionChanged) | function | RPG Saga|Save | SectionId: FName | SectionId's state changed: its revision grows now; OnSectionChanged follows once per frame (coalesced). | |
On Load Failed (BP_OnLoadFailed) | event | RPG Saga|Save | SlotName: FStringResult: ERSESaveResult | A load failed (the slot and why). | |
On Loaded (BP_OnLoaded) | event | RPG Saga|Save | SlotName: FString | A save was applied to every system (the saved map opens next). | |
On Save Failed (BP_OnSaveFailed) | event | RPG Saga|Save | SlotName: FStringResult: ERSESaveResult | A save failed: the slot and why (No Space, User Signed Out, Failed). Async saves report when they complete. | |
On Save Requested (BP_OnSaveRequested) | event | RPG Saga|Save | Request: FRSESaveRequest (ref) | A save was requested and is allowed now (the save screen opens). | |
On Saved (BP_OnSaved) | event | RPG Saga|Save | SlotName: FStringbSuccess: bool | A save finished (async saves report later). | |
On State Section Changed (BP_OnSectionChanged) | event | RPG Saga|Save | SectionId: FNameRevision: int32 | A state section changed (once per frame per section). | |
Pick Autosave Slot (PickAutosaveSlot) | pure | RPG Saga|Save | FString | Where the next autosave goes: the first empty autosave slot, else the oldest one. | |
Pop Save Block (PopSaveBlock) | function | RPG Saga|Save | Reason: FName | Lifts one save block pushed with the same reason. | |
Push Save Block (PushSaveBlock) | function | RPG Saga|Save | Reason: FNameScope: ERSESaveBlockScope = All | Blocks saving until the matching Pop. Reasons are counted, so overlapping zones stack. | |
Request Save (RequestSave) | function | RPG Saga|Save | Request: FRSESaveRequest (ref) | ERSESaveResult | Validates a request (blocks) and broadcasts OnSaveRequested so the RSE module can show the slot menu. |
Reset All for New Game (ResetAllForNewGame) | function | RPG Saga|Save | New game for everything that is saved: every participant resets (IRSESaveParticipant::ResetForNewGame, in registration order) and play time restarts. The single entry point of New Game (D-045). | ||
Save to Slot (SaveToSlot) | function | RPG Saga|Save | SlotName: FStringRequest: FRSESaveRequest (ref) | ERSESaveResult | Builds and writes a save now, without the save screen. In the game world prefer Save Game (Save library), which also records the location. |
Save to Slot Async (SaveToSlotAsync) | function | RPG Saga|Save | SlotName: FStringRequest: FRSESaveRequest (ref) | ERSESaveResult | Same as SaveToSlot, but the file is written on a worker thread. The state is captured immediately. |
Set Play Time Running (SetPlayTimeRunning) | function | RPG Saga|Save | bRunning: bool | Pauses the clock (main menu, pause menu). | |
Set Save User (SetSaveUser) | function | RPG Saga|Save|Platform | User: FRSESaveUser (ref) | Switches whose saves are used (the platform user layer calls it on user changes and sign-in / sign-out). |
URSESceneOverlayViewModel
Module RSE. The overlay of a story scene (D-043): letterbox bars, the skip key hint and the skip confirmation.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Answer Skip (AnswerSkip) | function | RPG Saga|UI|Scene | bSkip: bool | Answers the question. | |
Request Skip (RequestSkip) | function | RPG Saga|UI|Scene | Asks to skip (the skip key outside the question). | ||
Select Answer (SelectAnswer) | function | RPG Saga|UI|Scene | Index: int32 | Moves the cursor of the question. |
URSEScenePlayerSubsystem
Module RSE. Plays story scenes (D-043, docs/design/scenes.md): URSESceneData assets requested by the Play Scene effect (FRSENarrativeEvents::OnSceneRequested) or directly (PlayScene, the scene trigger, the theater later).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Local Player Skip (CanLocalPlayerSkip) | pure | RPG Saga|Scenes | bool | Whether this machine's player may ask to skip the scene on screen (the host, a voter, anyone, by the rule). | |
Get Current Scene (GetCurrentScene) | pure | RPG Saga|Scenes | URSESceneData* | The scene on screen, or none. | |
Get Num Pending (GetNumPending) | pure | RPG Saga|Scenes | int32 | Scenes waiting behind the current one. | |
Is Scene Playing (IsScenePlaying) | pure | RPG Saga|Scenes | bool | A scene is on screen (from its start to the end of the camera return). | |
On Scene Playing Changed (BP_OnScenePlayingChanged) | event | RPG Saga|Scenes | bPlaying: bool | A scene started (true) or ended, camera back (false). Blueprint. | |
Play Scene (PlayScene) | function | RPG Saga|Scenes | Scene: URSESceneData*bReplay: bool = false | bool | Queues Scene (plays at once when nothing else runs). Replays run no end effects. Returns false if refused (duplicate, no sequence). |
Request Skip (RequestSkip) | function | RPG Saga|Scenes | bool | Skip key: opens the confirmation (or skips at once, see URSESceneSettings::bConfirmSkip). Returns true if handled. | |
Skip Now (SkipNow) | function | RPG Saga|Scenes | Skips now: drops the dialogs, jumps to the end, returns the camera. | ||
Submit Skip (SubmitSkip) | function | RPG Saga|Scenes | bool | Asks to skip the scene on screen through the command bus (Skip Scene): the authority's skip policy decides (the host, a vote, anyone) and the skip reaches every machine. Single player: skips at once. Returns whether it was sent or applied. |
URSESceneSkipPolicy
Module RSE. Who may skip a story scene in co-op (D-094: the host, or a vote).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Decide (Decide) | override | RPG Saga|Scenes|Co-op | Player: FRSEPlayerIdScene: URSESceneData*bMultiplayer: bool | ERSESceneSkipDecision | What Player's request to skip Scene does. bMultiplayer: several players share the world. |
Get Votes Needed (GetVotesNeeded) | override | RPG Saga|Scenes|Co-op | Players: int32 | int32 | Votes needed to skip with Players players in the session. Default: Co-op Flow -> Scene Skip Vote Share of them (at least 1). |
URSEScreenLayout
Module RSE. Base of the screen layouts (D-162 P61, docs/product/ui-styles.md "Layouts"): one class per arrangement of a screen.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Arrange (Arrange) | override | RPG Saga|UI Layout | Context: URSEScreenLayoutContext* | Places the screen's parts (Context: the parts and the helpers). | |
Get Layout Name (GetLayoutName) | pure | RPG Saga|UI Layout | FText | The name in menus (Display Name, else the class name). |
URSEScreenLayoutContext
Module RSE. What a screen hands its layout (D-162 P61): the canvas, the screen's parts by name (built by the screen with the active UI style) and a few helpers to place or group them.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Canvas (GetCanvas) | pure | RPG Saga|UI Layout | UCanvasPanel* | Get Canvas | |
Get Canvas Size (GetCanvasSize) | pure | RPG Saga|UI Layout | FVector2D | The canvas size in layout units (the last drawn size; 1920 x 1080 before the first frame). | |
Get Margin (GetMargin) | pure | RPG Saga|UI Layout | float | The screen margin (UI -> Screen Margin), in layout units (1080p reference). | |
Get Part (GetPart) | pure | RPG Saga|UI Layout | Part: FName | UWidget* | The part with this name (null when the screen has none, e.g. a part only some variants use). |
Get Part Names (GetPartNames) | pure | RPG Saga|UI Layout | TArray<FName> | Every part name, in stacking order. | |
Get Safe Insets (GetSafeInsets) | pure | RPG Saga|UI Layout | FMargin | D-180: the safe-area insets every Place helper keeps parts inside (notch, rounded corners, home indicator; zero on PC), in layout units. Full-screen parts ignore them. | |
Get Screen (GetScreen) | pure | RPG Saga|UI Layout | URSEHUDWidgetBase* | The screen widget being arranged. | |
Group Parts (GroupParts) | function | RPG Saga|UI Layout | GroupName: FNameParts: TArray<FName> (ref)bHorizontal: boolSpacing: floatHAlign: TEnumAsByte<EHorizontalAlignment>VAlign: TEnumAsByte<EVerticalAlignment>bFramed: bool = falseFrameKind: ERSEPanelKind = HudFillPart: FName = None | UWidget* | Puts parts side by side (or one under the other) in a new part GroupName, Spacing apart, optionally in the style's frame of FrameKind. Missing parts are skipped. FillPart (optional) takes the room left in the group (a bar stretched across the screen: the parts after it end at the far edge). Returns the group (place it like any part). |
Has Flag (HasFlag) | pure | RPG Saga|UI Layout | Flag: FName | bool | Has Flag |
Has Part (HasPart) | pure | RPG Saga|UI Layout | Part: FName | bool | Has Part |
Hide Part (HidePart) | function | RPG Saga|UI Layout | Part: FName | Keeps a part off screen (the screen still updates it). | |
Place Part (PlacePart) | function | RPG Saga|UI Layout | Part: FNameAnchor: FVector2DAlignment: FVector2DOffset: FVector2D | UCanvasPanelSlot* | Places a part at a normalized point of the screen (Anchor 0..1), its own point Alignment there, moved by Offset; it keeps its own size. Placing a part again moves it (it keeps its stacking order). |
Place Part Fitted (PlacePartFitted) | function | RPG Saga|UI Layout | Part: FName | UCanvasPanelSlot* | Centers a part at its own size; on a screen too small for it, it shrinks as a whole (menus of a fixed size). |
Place Part Full Screen (PlacePartFullScreen) | function | RPG Saga|UI Layout | Part: FName | UCanvasPanelSlot* | A full-screen part (backdrops, dims). |
Place Part Stretched (PlacePartStretched) | function | RPG Saga|UI Layout | Part: FNameAnchors: FAnchorsOffsets: FMarginAlignment: FVector2DbAutoSize: bool = false | UCanvasPanelSlot* | Places a part with anchors that may stretch (Anchors min != max: Offsets are margins from the anchors). |
URSEScreenLibrary
Module RSE. Theme, palette, key prompts and UI sounds for Widget Blueprints (D-052).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Text Role (ApplyTextRole) | function, static | RPG Saga|UI|Theme | Text: UTextBlock*Role: ERSETextRole | Applies a text role (font, shadow, the role's color) to Text. | |
Apply Text Role Color (ApplyTextRoleColor) | function, static | RPG Saga|UI|Theme | Text: UTextBlock*Role: ERSETextRoleColor: FLinearColor | Applies a text role with a palette color. | |
Fill Member Cards (FillMemberCards) | function, static | RPG Saga|UI|Lists | Panel: UPanelWidget*CardClass: TSubclassOf<URSEMemberCardWidget>Members: TArray<FRSEMemberView> (ref) | Fills Panel with one CardClass card per member (cards already there are reused, extra ones removed). The card Widget Blueprint derives from RSEMemberCardWidget and names its widgets NameText, HPBar... (see there). | |
Get Action Key Label (GetActionKeyLabel) | pure, static | RPG Saga|UI|Prompts | Player: APlayerController*Action: UInputAction* | FText | Label of the key mapped to an Enhanced Input action for the device in use. Player may be null. |
Get Generic Action Text (GetGenericActionText) | pure, static | RPG Saga|UI|Prompts | MenuKey: ERSEMenuKey | FText | Generic action names of the theme (Confirm, Back, Select, Page, Close). |
Get Key Label (GetKeyLabel) | pure, static | RPG Saga|UI|Prompts | Key: FKey | FText | Label of a key ("Enter", "A", "✕" in the PlayStation label set). |
Get Key Prompt Icon (GetKeyPromptIcon) | function, static | RPG Saga|UI|Prompts | Key: FKeyIcon: FRSEKeyPromptIcon (out) | bool | D-176: the key prompt provider's icon for Key on the device in use (Common UI controller data with the companion plugin). Returns false: show the text label (Get Key Label). |
Get Keys Label (GetKeysLabel) | pure, static | RPG Saga|UI|Prompts | Keys: TArray<FKey> (ref) | FText | Label of the primary key of Keys for the device in use (empty when it has none). |
Get Menu Key Label (GetMenuKeyLabel) | pure, static | RPG Saga|UI|Prompts | MenuKey: ERSEMenuKey | FText | Label of a generic menu key for the device in use. |
Get Panel Brush (GetPanelBrush) | pure, static | RPG Saga|UI|Theme | Kind: ERSEPanelKind | FSlateBrush | The brush of a panel kind (rounded gradient box with the theme's outline). |
Get Panel Style (GetPanelStyle) | pure, static | RPG Saga|UI|Theme | Kind: ERSEPanelKind | FRSEUIPanelStyle | The style of a panel kind (colors, padding, corner radius). |
Get Row Style (GetRowStyle) | pure, static | RPG Saga|UI|Theme | FRSEUIRowStyle | The list row style (selected / active / hover fills, cursor). | |
Get Spacing (GetSpacing) | pure, static | RPG Saga|UI|Theme | Step: ERSEUISpacing | float | A spacing step of the theme. |
Get Tag Label (GetTagLabel) | pure, static | RPG Saga|UI|Theme | Tag: FGameplayTag | FText | Name of a stat or resource tag for menus (UI -> TagLabels, else the attribute registry's display name). |
Get Theme Font (GetThemeFont) | pure, static | RPG Saga|UI|Theme | Role: ERSETextRoleSizeOverride: int32 = 0 | FSlateFontInfo | Font of a text role (UI Theme -> Fonts). SizeOverride > 0 replaces the role's size. |
Get Theme Text Color (GetThemeTextColor) | pure, static | RPG Saga|UI|Theme | Role: ERSETextRole | FLinearColor | Default color of a text role. |
Get UIColor (GetUIColor) | pure, static | RPG Saga|UI|Theme | Color: ERSEUIColor | FLinearColor | A palette color. |
Is Using Gamepad (IsUsingGamepad) | pure, static | RPG Saga|UI|Prompts | bool | The player uses a gamepad now (prompts show gamepad buttons). | |
Join Menu Entries (JoinMenuEntries) | pure, static | RPG Saga|UI|Lists | Entries: TArray<FRSEMenuEntryView> (ref) | FText | Menu entries as one text, one per line, the selected one marked with the theme's cursor glyph. |
Join Text Lines (JoinTextLines) | pure, static | RPG Saga|UI|Lists | Lines: TArray<FRSETextLineView> (ref) | FText | Lines as one text, one per line ("Text Detail"). |
Join Texts (JoinTexts) | pure, static | RPG Saga|UI|Lists | Texts: TArray<FText> (ref)Separator: FText (ref) | FText | Texts joined with Separator (a line break when empty). |
Make Menu Prompt (MakeMenuPrompt) | pure, static | RPG Saga|UI|Prompts | MenuKey: ERSEMenuKeyAction: FText | FRSEKeyPromptView | A prompt for a menu key (skip it when Key is empty). |
Play UISound (PlayUISound) | function, static | RPG Saga|UI|Sound | WorldContextObject: UObject*Sound: ERSEUISound | Plays a UI sound (Audio.UI.* in the sound catalog). |
URSEScreenPresenter
Module RSE. RSE Screen Presenter
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Dismiss Screen (DismissScreen) | override | RPG Saga|UI|Host | Screen: URSEScreenWidget* | Screen presented by this presenter is closing (it leaves its parent right after). | |
Present Screen (PresentScreen) | override | RPG Saga|UI|Host | Screen: URSEScreenWidget*Player: APlayerController*ZOrder: int32 | bool | Shows Screen for Player (ZOrder: the screen's viewport order, a hint). Returns false to let the screen add itself to the viewport. |
URSEScreenViewModel
Module RSE. The data and the actions of one screen, for the screen's widget (D-052, docs/design/umg-screens.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Back (Back) | override | RPG Saga|UI|ViewModel | bool | Back / cancel (Esc, gamepad B). Returns true when the view-model used it. | |
Close (Close) | function | RPG Saga|UI|ViewModel | Closes the screen: OnClosed fires once, the host removes the widget. | ||
Confirm (Confirm) | override | RPG Saga|UI|ViewModel | bool | Confirm / accept (Enter, gamepad A). Returns true when the view-model used it. | |
Get Owning Player (GetOwningPlayer) | pure | RPG Saga|UI|ViewModel | APlayerController* | Get Owning Player | |
Get Revision (GetRevision) | pure | RPG Saga|UI|ViewModel | int32 | Change counter: grows on every NotifyChanged (widgets can skip rebuilds when it did not move). | |
Is Closed (IsClosed) | pure | RPG Saga|UI|ViewModel | bool | The screen was closed (Close ran). Actions do nothing after it. | |
Navigate (Navigate) | override | RPG Saga|UI|ViewModel | Direction: FIntPoint | bool | Cursor movement: X = right, Y = down (one step per press). Returns true when used. |
On Changed (OnChanged) | event | RPG Saga|UI|ViewModel | The data changed: widgets rebuild what they show. | ||
On Closed (OnClosed) | event | RPG Saga|UI|ViewModel | The screen is done (the host removes the widget). Fired once. | ||
Page (Page) | override | RPG Saga|UI|ViewModel | Direction: int32 | bool | Previous (-1) / next (+1) page, tab or category. Returns true when used. |
Play UISound (PlayUISound) | function | RPG Saga|UI|ViewModel | Sound: ERSEUISound | Plays a UI sound in the owner's world. Actions play their own feedback (Confirm, Error...), so every screen of the view-model sounds the same; bSilent view-models (tests, previews) play nothing. |
URSESeedSource
Module RSECore. The game's source of seeds (D-124 §3.6, D-133): every random roll with an effect on the game draws its seed here instead of FMath::Rand, so a game is reproducible from its world seed (tests, replays) and the host is the only one deciding (co-op).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Draw Count (GetDrawCount) | pure | RPG Saga|Seeds | Stream: FName | int32 | How many seeds Stream has drawn. |
Get World Seed (GetWorldSeed) | pure | RPG Saga|Seeds | int32 | The game's root seed. | |
Next Seed (NextSeed) | function | RPG Saga|Seeds | Stream: FName | int32 | The next seed of Stream (never 0). Use one per random event: a battle, an encounter roll, a match. |
Set World Seed (SetWorldSeed) | function | RPG Saga|Seeds | Seed: int32 | Starts every stream again from Seed (replays, tests). 0 = a new random world seed. |
URSESessionAsyncAction
Module RSEOnline. Latent Blueprint nodes for the session flow (D-135): Host Session, Find Sessions and Join Session with success and failure pins.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Find Sessions (Async) (FindSessionsAsync) | function, static | RPG Saga|Online | WorldContextObject: UObject* | URSESessionAsyncAction* | Searches for sessions. Succeeds with the results (possibly none). |
Host Session (Async) (HostSessionAsync) | function, static | RPG Saga|Online | WorldContextObject: UObject*Params: FRSEHostSessionParams | URSESessionAsyncAction* | Hosts a session (Project Settings -> RPG Saga Engine -> Online; Params override some). Succeeds when hosting. |
Join Session (Async) (JoinSessionAsync) | function, static | RPG Saga|Online | WorldContextObject: UObject*ResultIndex: int32 | URSESessionAsyncAction* | Joins a search result and travels to the host. Succeeds when connected (after the map loaded). |
On Failure (OnFailure) | event | RPG Saga|Online | Results: TArray<FRSESessionSearchResult> (ref)Error: FRSESessionErrorInfo (ref) | The operation failed or was refused; Error says why (its Message is for the player). | |
On Success (OnSuccess) | event | RPG Saga|Online | Results: TArray<FRSESessionSearchResult> (ref)Error: FRSESessionErrorInfo (ref) | Hosting, connected, or the search finished. Results: the sessions found (Find only). |
URSESessionLibrary
Module RSEOnline. Helpers for session screens.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Session Error Message (GetSessionErrorMessage) | pure, static | RPG Saga|Online | Error: ERSESessionError | FText | The player-facing (localized) message of a session error. |
Get Session State Text (GetSessionStateText) | pure, static | RPG Saga|Online | State: ERSESessionState | FText | A session state in words ("Hosting", "Searching for sessions..."). |
Is Session Joinable (IsSessionJoinable) | pure, static | RPG Saga|Online | Result: FRSESessionSearchResult (ref) | bool | The result can be joined now (same game version, a free place). |
URSESessionProvider
Module RSEOnline. The one interface between the session flow and an online service (D-135).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cancel Find Sessions (CancelFindSessions) | override | RPG Saga|Online|Provider | Stop a running search (no answer needed; a late ReportFindComplete is ignored). | ||
Find Sessions (FindSessions) | override | RPG Saga|Online|Provider | Request: FRSEProviderFindRequest (ref) | Search for sessions. Answer: ReportFindComplete. | |
Get Display Name (GetDisplayName) | override | RPG Saga|Online|Provider | FText | Short name for logs and the lobby screen ("LAN", "Steam"). | |
Get Local Player Name (GetLocalPlayerName) | override | RPG Saga|Online|Provider | FString | The local player's name on the service (empty = unknown). | |
Get Local Player Net Id (GetLocalPlayerNetId) | override | RPG Saga|Online|Provider | FString | The local player's id on the service (string form; empty when unknown). | |
Host Session (HostSession) | override | RPG Saga|Online|Provider | Request: FRSEProviderHostRequest (ref) | Create and advertise a session. Answer: ReportHostComplete. | |
Invite Friend (InviteFriend) | override | RPG Saga|Online|Provider | FriendNetId: FString | bool | Invite one friend to the current session. Returns false when the invitation could not be sent. |
Is Available (IsAvailable) | override | RPG Saga|Online|Provider | OutReason: FString (out) | bool | The service can host and find sessions now. OutReason explains why not (logs). |
Join Session (JoinSession) | override | RPG Saga|Online|Provider | ResultIndex: int32 | Join the search result ResultIndex (or the accepted invitation's index). Answer: ReportJoinComplete. | |
Leave Session (LeaveSession) | override | RPG Saga|Online|Provider | Leave (client) or end (host) the session. Answer: ReportLeaveComplete. | ||
Query Friends (QueryFriends) | override | RPG Saga|Online|Provider | Read the friends list. Answer: ReportFriends. | ||
Register Player (RegisterPlayer) | override | RPG Saga|Online|Provider | PlayerNetId: FStringbJoined: bool | Host: a player joined (bJoined) or left the game; services that track members register them. No answer. | |
Report Connection Lost (ReportConnectionLost) | function | RPG Saga|Online|Provider | Error: ERSESessionErrorDetail: FString | The service lost the session (not the game connection; the engine reports that one). | |
Report Find Complete (ReportFindComplete) | function | RPG Saga|Online|Provider | bSuccess: boolResults: TArray<FRSESessionSearchResult> (ref)Error: ERSESessionErrorDetail: FString | Report Find Complete | |
Report Friends (ReportFriends) | function | RPG Saga|Online|Provider | Friends: TArray<FRSEFriendInfo> (ref) | Report Friends | |
Report Host Complete (ReportHostComplete) | function | RPG Saga|Online|Provider | bSuccess: boolError: ERSESessionErrorDetail: FString | --- Answers to the manager --- | |
Report Invite Accepted (ReportInviteAccepted) | function | RPG Saga|Online|Provider | Result: FRSESessionSearchResult (ref) | The player accepted an invitation (overlay or launch command line); Result is joinable with JoinSession(Result.ResultIndex). | |
Report Join Complete (ReportJoinComplete) | function | RPG Saga|Online|Provider | bSuccess: boolConnectAddress: FStringError: ERSESessionErrorDetail: FString | ConnectAddress: what the client travels to (an IP:port, or the service's own address form). | |
Report Leave Complete (ReportLeaveComplete) | function | RPG Saga|Online|Provider | Report Leave Complete | ||
Show Invite UI (ShowInviteUI) | override | RPG Saga|Online|Provider | bool | Open the service's own invite overlay. Returns false when it has none. | |
Supports Invites (SupportsInvites) | override | RPG Saga|Online|Provider | bool | The service has friends and invitations. | |
Update Lobby (UpdateLobby) | override | RPG Saga|Online|Provider | Lobby: FRSELobbyData (ref) | Host: advertise the changed lobby (slots, characters, battle flag). No answer. |
URSESessionRulesSubsystem
Module RSECore. Owner of the session's rules of play (D-139).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Change Rules (CanChangeRules) | pure | RPG Saga|Rules | bool | Whether this machine's player may change the session rules now (single player and the host: yes). | |
Get Rule Value (GetRuleValue) | pure | RPG Saga|Rules | OptionId: FNameOutValue: int32 (out) | bool | The session's value of a rule; false when none was published yet (then the machine's own setting holds). |
Is Session Rule (IsSessionRule) | pure, static | RPG Saga|Rules | OptionId: FName | bool | OptionId is a session rule (Rules Profiles -> Co-op -> Session Rule Options). |
On Session Rule Changed (BP_OnRuleChanged) | event | RPG Saga|Rules | OptionId: FNameValue: int32 |
URSESessionSubsystem
Module RSEOnline. Online sessions for Blueprints and the game (D-135, docs/product/online-sessions.md): Host / Find / Join / Leave, invitations, the lobby (slots, characters, join-in-progress admission) and reconnecting, with the provider chosen in Project Settings -> RPG Saga Engine -> Online.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can Invite (CanInvite) | pure | RPG Saga|Online | bool | Invitations are possible now (the service has them and a session is running). | |
Close Lobby Screen (CloseLobbyScreen) | function | RPG Saga|Online | Closes the lobby screen when it is open. | ||
Find Sessions (FindSessions) | function | RPG Saga|Online | bool | Searches for sessions. OnSessionsFound brings the results (also when there are none). | |
Get Last Error (GetLastError) | pure | RPG Saga|Online | FRSESessionErrorInfo | Get Last Error | |
Get Lobby (GetLobby) | pure | RPG Saga|Online | FRSELobbyData | Host: the live lobby. Client: the lobby the host advertised when it was joined. | |
Get Local Admission (GetLocalAdmission) | pure | RPG Saga|Online | ERSEJoinAdmission | Get Local Admission | |
Get Preferred Character (GetPreferredCharacter) | pure | RPG Saga|Online | FPrimaryAssetId | Get Preferred Character | |
Get Provider Name (GetProviderName) | pure | RPG Saga|Online | FText | The provider's name ("LAN", "Steam"). | |
Get Search Results (GetSearchResults) | pure | RPG Saga|Online | TArray<FRSESessionSearchResult> | Get Search Results | |
Get Selectable Characters (GetSelectableCharacters) | pure | RPG Saga|Online | TArray<FPrimaryAssetId> | The characters players can choose (main party members). | |
Get Session Role (GetSessionRole) | pure | RPG Saga|Online | ERSESessionRole | Get Session Role | |
Get Session State (GetSessionState) | pure | RPG Saga|Online | ERSESessionState | --- State --- | |
Host Session (HostSession) | function | RPG Saga|Online | Params: FRSEHostSessionParams (ref) | bool | Hosts a session with the settings of Project Settings -> RPG Saga Engine -> Online (Params override some). On success the host listens on the current map (or opens Host Map) and OnStateChanged reports Hosting. Returns false when refused at once (busy, already in a session, service unavailable); OnSessionError tells why. |
Invite Friend (InviteFriend) | function | RPG Saga|Online | FriendNetId: FString | bool | Invites one friend (its Net Id from the friends list) to the current session. |
Is Host (IsHost) | pure | RPG Saga|Online | bool | This machine hosts the session. | |
Is in Session (IsInSession) | pure | RPG Saga|Online | bool | Hosting, connected, or reconnecting to a session. | |
Is Multiplayer (IsMultiplayer) | pure | RPG Saga|Online | bool | The session has more than one connected player (co-op rules apply: no tutorials, encounters in live battles). | |
Is Using Fallback Provider (IsUsingFallbackProvider) | pure | RPG Saga|Online | bool | The chosen provider was unavailable and LAN is used instead (Online -> Fallback To LAN). | |
Join Session (JoinSession) | function | RPG Saga|Online | ResultIndex: int32 | bool | Joins a search result (its Result Index) and travels to the host. OnStateChanged reports Connected on arrival. |
Leave Session (LeaveSession) | function | RPG Saga|Online | bool | Leaves (client) or ends (host) the session; also cancels a search or a reconnect. | |
On Friends Received (OnFriendsReceived) | event | RPG Saga|Online | Friends: TArray<FRSEFriendInfo> (ref) | ||
On Invite Accepted (OnInviteAccepted) | event | RPG Saga|Online | Invite: FRSESessionSearchResult (ref) | The player accepted an invitation; the subsystem joins it (leaving the current session first). | |
On Lobby Changed (OnLobbyChanged) | event | RPG Saga|Online | Lobby: FRSELobbyData (ref) | ||
On Local Admission Changed (OnLocalAdmissionChanged) | event | RPG Saga|Online | Admission: ERSEJoinAdmission | Client: the host's admission for this player changed (SetLocalAdmission). | |
On Player Admission Changed (OnPlayerAdmissionChanged) | event | RPG Saga|Online | Slot: FRSELobbySlot (ref)Admission: ERSEJoinAdmission | Host: a spectating player may play now (the battle ended). The co-op rules give them their character here. | |
On Player Joined (OnPlayerJoined) | event | RPG Saga|Online | Slot: FRSELobbySlot (ref)Admission: ERSEJoinAdmission | Host: a player entered, with their slot and what they may do (play, or spectate until the battle ends). | |
On Player Left (OnPlayerLeft) | event | RPG Saga|Online | Slot: FRSELobbySlot (ref) | Host: a player left (their slot is kept for a reconnect when Online -> Keep Slots For Reconnect is on). | |
On Session Error (OnSessionError) | event | RPG Saga|Online | Error: FRSESessionErrorInfo (ref) | ||
On Sessions Found (OnSessionsFound) | event | RPG Saga|Online | Results: TArray<FRSESessionSearchResult> (ref) | ||
On State Changed (OnStateChanged) | event | RPG Saga|Online | NewState: ERSESessionStateOldState: ERSESessionState | --- Events --- | |
Open Lobby Screen (OpenLobbyScreen) | function | RPG Saga|Online | Player: APlayerController* | URSELobbyViewModel* | Opens the lobby screen (Online -> Lobby Widget Class, else the built-in screen) for Player. |
Query Friends (QueryFriends) | function | RPG Saga|Online | bool | Reads the friends list. OnFriendsReceived brings it. | |
Set Battle in Progress (SetBattleInProgress) | function | RPG Saga|Online | bInProgress: bool | Host: a battle started or ended. Joiners during a battle follow Online -> Join In Progress Policy; when the battle ends, spectating players get OnPlayerAdmissionChanged (Play). Once called, the game owns the flag; until then it follows the party's battle flag at each join. | |
Set Host on Next Map (SetHostOnNextMap) | function | RPG Saga|Online | bHost: bool | The next game map this machine opens hosts a session on arrival (the main menu's Host Game, D-142). | |
Set Local Admission (SetLocalAdmission) | function | RPG Saga|Online | Admission: ERSEJoinAdmission | Client: what the host allows this player now (the co-op transport sets it from the host's answer). | |
Set Preferred Character (SetPreferredCharacter) | function | RPG Saga|Online | Character: FPrimaryAssetId | bool | The party character the local player wants to play. The host's slot takes it at once (when free); a client sends it when joining and the host gives it when free (else another free character). |
Set Slot Character (SetSlotCharacter) | function | RPG Saga|Online | SlotIndex: int32Character: FPrimaryAssetId | bool | Host: gives a lobby slot another character. Returns false when taken or not selectable. |
Show Invite UI (ShowInviteUI) | function | RPG Saga|Online | bool | Opens the online service's invite overlay (Steam, EOS). | |
Will Host on Next Map (WillHostOnNextMap) | pure | RPG Saga|Online | bool | Will Host on Next Map |
URSEShopViewModel
Module RSE. The shop (D-042): buy / sell tabs, item categories, the list with prices and stock, the quantity step, the party's money and an equipment comparison per member.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin Quantity (BeginQuantity) | function | RPG Saga|UI|Shop | Opens the quantity step for the selected row (or says why it cannot be bought / sold). | ||
Buy (Buy) | function | RPG Saga|UI|Shop | RowIndex: int32Count: int32 | bool | Buys Count of a row of the Buy tab directly. Returns true when bought. |
Cancel Quantity (CancelQuantity) | function | RPG Saga|UI|Shop | Cancel Quantity | ||
Confirm Quantity (ConfirmQuantity) | function | RPG Saga|UI|Shop | Buys / sells Quantity of the selected row. | ||
Get Selected Row (GetSelectedRow) | pure | RPG Saga|UI|Shop | OutRow: FRSEShopRowView (out) | bool | Get Selected Row |
Leave (Leave) | function | RPG Saga|UI|Shop | Leaves the shop. | ||
Move Selection (MoveSelection) | function | RPG Saga|UI|Shop | Direction: int32 | Move Selection | |
Refresh (Refresh) | function | RPG Saga|UI|Shop | Rebuilds the data from the party and the shop (after outside changes). | ||
Select (Select) | function | RPG Saga|UI|Shop | Index: int32 | Puts the cursor on a row (closes the quantity step). | |
Sell (Sell) | function | RPG Saga|UI|Shop | RowIndex: int32Count: int32 | bool | Sells Count of a row of the Sell tab directly. Returns true when sold. |
Set Category (SetCategory) | function | RPG Saga|UI|Shop | Index: int32 | Set Category | |
Set Mode (SetMode) | function | RPG Saga|UI|Shop | InMode: ERSEShopMode | --- Actions --- | |
Set Quantity (SetQuantity) | function | RPG Saga|UI|Shop | InQuantity: int32 | Set Quantity | |
Step Category (StepCategory) | function | RPG Saga|UI|Shop | Direction: int32 | Step Category | |
Step Quantity (StepQuantity) | function | RPG Saga|UI|Shop | Delta: int32 | Changes the quantity: single steps wrap (1 <-> max), big steps clamp. | |
Switch Mode (SwitchMode) | function | RPG Saga|UI|Shop | Switch Mode |
URSESpeakerComponent
Module RSE. Binds an actor to a dialog speaker (dialog-proposal.md 6.6): camera cues frame it, emotes play on it, barks float above it.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Speaker Tag (GetSpeakerTag) | pure | RPG Saga|Dialog | FGameplayTag | SpeakerTag, or the Speaker asset's tag. |
URSEStatSourceLibrary
Module RSECore. The registered stat sources (D-169).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Gather Stats (GatherStats) | function, static | RPG Saga|Characters|Stat Source | Spawn: FRSEBattleUnitSpawn (ref)Battle: URSEBattle*UnitId: int32OutStats: FRSEExternalUnitStats (out) | URSEUnitStatSource* | The stats the registered sources supply for Spawn (the first source, by Priority, that applies). Used by the battle when it builds a unit; Blueprint may call it to preview. Returns the source used, or null when none applies. |
Get Stat Sources (GetStatSources) | pure, static | RPG Saga|Characters|Stat Source | TArray<URSEUnitStatSource*> | The registered stat sources still alive, highest Priority first. | |
Has Stat Sources (HasStatSources) | pure, static | RPG Saga|Characters|Stat Source | bool | Whether any stat source is registered (battles skip the lookup otherwise). | |
Register Stat Source (RegisterStatSource) | function, static | RPG Saga|Characters|Stat Source | Source: URSEUnitStatSource* | Adds a stat source for every battle built from now on (until unregistered or destroyed). Registering twice does nothing. | |
Unregister Stat Source (UnregisterStatSource) | function, static | RPG Saga|Characters|Stat Source | Source: URSEUnitStatSource* | bool | Removes a stat source. Returns true when it was registered. |
URSEStatusBehavior
Module RSECore. What a status does to how its bearer acts (D-167): control effects such as Confuse, Charm and Berserk.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Allows Ability (AllowsAbility) | override | RPG Saga|Status Behavior | Ability: URSEAbilityData* | bool | Whether the unit may still use Ability (abilities and consumables alike; a consumable passes its Use Ability). Default: yes. |
Can Target Self (CanTargetSelf) | override | RPG Saga|Status Behavior | bool | Whether Redirect Target may send the action back at its own user. | |
Get Control Team (GetControlTeam) | override | RPG Saga|Status Behavior | Battle: URSEBattle*UnitId: int32SourceId: int32 | FGameplayTag | The team the unit fights for while the status lasts (Team.*). Empty = its own. SourceId = the unit that applied the status (INDEX_NONE if none). |
On Turn Started (OnTurnStarted) | override | RPG Saga|Status Behavior | Battle: URSEBattle*UnitId: int32 | The bearer's turn starts (after its status ticks): custom behaviors may act on the battle here. | |
Redirect Target (RedirectTarget) | override | RPG Saga|Status Behavior | Battle: URSEBattle*UnitId: int32Ability: URSEAbilityData*TargetId: int32Candidates: TArray<int32> (ref) | int32 | Where a single-target action of the unit really goes. Candidates = the units the action could reach in this battle mode (any side, the user excluded unless Self Allowed). Return TargetId to keep it. Use the battle's Roll Int / Roll Percent. |
Redirects Targets (RedirectsTargets) | override | RPG Saga|Status Behavior | bool | Whether this behavior ever redirects targets (the battle skips building candidates otherwise). |
URSEStealthAmbushSubsystem
Module RSE. Stealth ambushes on the live map (D-151): the detection shapes on the ground (ARSEStealthOverlay, local), the takedown and ambush prompts, the Strike and Place keys, the takedowns, placing the members before an ambush, the alarm during the ambush battle and the return to stealth after a silent one.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Is Placed (IsPlaced) | pure | RPG Saga|Stealth | Pawn: APawn* | bool | Whether Pawn holds a spot for an ambush. |
Request Place (RequestPlace) | function | RPG Saga|Stealth | Pawn: APawn* | bool | The player's Place (input, scripts): sneaking = hold this spot and take the next member; else regroup. |
Request Strike (RequestStrike) | function | RPG Saga|Stealth | Pawn: APawn* | bool | The player's Strike (input, scripts): sends the Stealth Strike command for Pawn. Returns true when sent or applied. |
Was Last Battle Silent (WasLastBattleSilent) | pure | RPG Saga|Stealth | bool | The last battle ended silently (the party went back to sneaking). |
URSEStealthRules
Module RSECore. D-151: the stealth rules a game may change (Stealth -> Rules Class): takedowns, the noise of battle actions, who answers an alarm, the return to stealth.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Answers Alarm (AnswersAlarm) | override | RPG Saga|Stealth | Source: FVector (ref)Radius: floatListener: FRSEAlarmListener (ref) | bool | Whether Listener answers an alarm from Source reaching Radius. Default: inside the radius and able to answer. |
Evaluate Takedown (EvaluateTakedown) | override | RPG Saga|Stealth | Input: FRSETakedownInput (ref) | FRSETakedownResult | How a takedown goes. Default: RSETakedown::Evaluate. |
Get Action Noise Radius (GetActionNoiseRadius) | override | RPG Saga|Stealth | Ability: URSEAbilityData*bUserIsSilent: bool | float | How far an action is heard in an ambush battle (cm; 0 = silent). Default: RSEAmbush::GetActionNoiseRadius. |
Should Return to Stealth (ShouldReturnToStealth) | override | RPG Saga|Stealth | Tracker: FRSEAmbushTracker (ref)Outcome: ERSEBattleOutcomebAnyOutsideAware: bool | bool | Whether the party goes back to sneaking after the battle. Default: RSEAmbush::ShouldReturnToStealth. |
URSETacticsHUDViewModel
Module RSE. The Tactics battle HUD (D-021, D-052): turn order and objective, active unit panel, command menu, attack forecast (D-033), path cost label, deployment panel and start confirmation (D-018), log, banner, key prompts.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Answer Start Confirm (AnswerStartConfirm) | function | RPG Saga|UI|Battle HUD | bStart: bool | Answers the start confirmation (true = start now). | |
Choose Command (ChooseCommand) | function | RPG Saga|UI|Battle HUD | Index: int32 | Runs command Index (like pressing Confirm on it). | |
Hover Command (HoverCommand) | function | RPG Saga|UI|Battle HUD | Index: int32 | Moves the command cursor (mouse hover). | |
Hover Start Confirm (HoverStartConfirm) | function | RPG Saga|UI|Battle HUD | Choice: int32 | Hover Start Confirm | |
Run Deploy Action (RunDeployAction) | function | RPG Saga|UI|Battle HUD | Action: ERSEDeployAction | Run Deploy Action | |
Select Roster Entry (SelectRosterEntry) | function | RPG Saga|UI|Battle HUD | Index: int32 | Select Roster Entry |
URSETacticsInputHost
Module RSE. RSE Tactics Input Host
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Host ATBCommands (GetHostATBCommands) | override | RPG Saga|Battle | URSEATBCommandComponent* | The classic (ATB) battle commands of this controller (null = none). | |
Get Host Target Preview (GetHostTargetPreview) | override | RPG Saga|Battle | ARSETargetPreview* | The target preview actor (rings and areas under the units), or null. | |
Get Tactics Director (GetTacticsDirector) | override | RPG Saga|Battle | ARSETacticsBattleDirector* | The Tactics battle this controller plays now (null = none). | |
Is Host Party Menu Open (IsHostPartyMenuOpen) | override | RPG Saga|Battle | bool | The party menu is open and reads this controller's (forwarded) input. | |
Reset Host for New Encounter (ResetHostForNewEncounter) | override | RPG Saga|Battle | A retried battle starts over: drop the selection, the previews and the menus. | ||
Set Tactics Director (SetTacticsDirector) | override | RPG Saga|Battle | Director: ARSETacticsBattleDirector* | bool | Switches to Director's Tactics battle. Returns false while another battle of this controller still runs. |
URSETeacherViewModel
Module RSE. The teacher screen (D-144): the lessons (price, requirements), who may learn the selected one, a respec row when the teacher offers it, a Yes / No before paying.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cancel Pending (CancelPending) | function | RPG Saga|UI|Growth | Cancel Pending | ||
Confirm Pending (ConfirmPending) | function | RPG Saga|UI|Growth | bool | Confirm Pending | |
Get Row Count (GetRowCount) | pure | RPG Saga|UI|Growth | int32 | Get Row Count | |
Get Teacher (GetTeacher) | pure | RPG Saga|UI|Growth | URSETeacherData* | Get Teacher | |
Is Respec Row (IsRespecRow) | pure | RPG Saga|UI|Growth | bool | The respec row is under the cursor. | |
Refresh (Refresh) | function | RPG Saga|UI|Growth | Refresh | ||
Request Learn (RequestLearn) | function | RPG Saga|UI|Growth | bool | Asks Yes / No for the selected lesson (or respec) for the selected learner. | |
Select Learner (SelectLearner) | function | RPG Saga|UI|Growth | Index: int32 | Select Learner | |
Select Row (SelectRow) | function | RPG Saga|UI|Growth | Row: int32 | Select Row |
URSETimeControlSubsystem
Module RSE. The only place that pauses the world or changes its time dilation (D-134).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Are Tutorials Allowed (AreTutorialsAllowed) | pure | RPG Saga|Players|Time | bool | Tutorial screens may show now (the policy). | |
Get Requested Time Dilation (GetRequestedTimeDilation) | pure | RPG Saga|Players|Time | float | The dilation the requests ask for now (1 without requests). | |
Is Dilation Held By (IsDilationHeldBy) | pure | RPG Saga|Players|Time | Requester: UObject* | bool | Is Dilation Held By |
Is Pause Held By (IsPauseHeldBy) | pure | RPG Saga|Players|Time | Requester: UObject* | bool | Is Pause Held By |
Release Pause (ReleasePause) | function | RPG Saga|Players|Time | Requester: UObject* | Drops Requester's pause; the world unpauses when no holder is left. | |
Release Time Dilation (ReleaseTimeDilation) | function | RPG Saga|Players|Time | Requester: UObject* | Drops Requester's dilation request. | |
Request Pause (RequestPause) | function | RPG Saga|Players|Time | Requester: UObject*ForPlayer: APlayerController* = None | bool | Pauses the world for Requester (ForPlayer: whose screen asks, for the policy). Returns true when Requester now holds the pause; false when the policy refuses or the world was already paused by someone else (then nothing to release). |
Request Time Dilation (RequestTimeDilation) | function | RPG Saga|Players|Time | Requester: UObject*Dilation: float | bool | Sets Requester's world time dilation (clamped to 0.0001..1; the smallest request wins). Returns false when the policy refuses (nothing changes: dilate your own actors with CustomTimeDilation instead, or skip the effect). |
URSETimePolicy
Module RSE. Decides who may stop or slow the whole world (D-134, docs/design/networking.md §3.9).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply World Pause (ApplyWorldPause) | override | RPG Saga|Players|Time | World: UWorld*bPaused: bool | bool | Pauses or unpauses the world once the request is allowed (default: the engine's game pause). Returns true on success. |
Are Tutorials Allowed (AreTutorialsAllowed) | override | RPG Saga|Players|Time | World: UWorld* | bool | May tutorial screens show at all? |
Can Dilate World (CanDilateWorld) | override | RPG Saga|Players|Time | World: UWorld*Requester: UObject* | bool | May Requester (hit-stop, block slow motion, the live battle's entry slow motion) change the world's time dilation? |
Can Pause World (CanPauseWorld) | override | RPG Saga|Players|Time | World: UWorld*Requester: UObject*ForPlayer: APlayerController* | bool | May Requester (a tutorial screen, a pause menu) pause the whole world for ForPlayer? |
Is World Paused (IsWorldPaused) | override | RPG Saga|Players|Time | World: UWorld* | bool | The world is paused now (default: the engine's game pause). |
URSETimeSubsystem
Module RSECore. The game clock and the weather (D-101, docs/design/time-weather.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Advance Time (AdvanceTime) | function | RPG Saga|Time | Hours: float | Moves the clock forward by Hours at once (a wait, a journey). | |
Get Behavior Modifiers (GetBehaviorModifiers) | pure | RPG Saga|Time | EnemyTags: FGameplayTagContainer (ref) | FRSETimeBehaviorModifiers | Multipliers for a roaming enemy now (Time & Weather Rules of the game's rules profile): every rule whose phases, weather and target tags match multiplies in. EnemyTags: the enemy's tags (character / behavior), for rules that target some enemies only. The roaming code multiplies its detection, chase and density by these. |
Get Clock Pause Reasons (GetClockPauseReasons) | pure | RPG Saga|Time | TArray<FName> | Why the clock is not moving (empty = it is): Stopped, Disabled, Battle, Dialog, Cutscene, PlayTime, Level, or pushed reasons. | |
Get Day (GetDay) | pure | RPG Saga|Time | int32 | --- Clock: queries --- | |
Get Day Text (GetDayText) | pure | RPG Saga|Time | FText | "Day 3" in the settings' format. | |
Get Environment Tags (GetEnvironmentTags) | pure | RPG Saga|Time | FGameplayTagContainer | Phase of day + weather, as tags (battles take these as their environment). | |
Get Game Hours Per Real Second (GetGameHoursPerRealSecond) | pure | RPG Saga|Time | float | Game hours per real second at the current speed. | |
Get Game Time (GetGameTime) | pure | RPG Saga|Time | FRSEGameTime | Get Game Time | |
Get Hour (GetHour) | pure | RPG Saga|Time | float | Hour of the day with fractions (13.5 = 13:30). | |
Get Hour and Minute (GetHourAndMinute) | pure | RPG Saga|Time | Hour: int32 (out)Minute: int32 (out) | The whole hour (0..23) and the minute (0..59). | |
Get Phase (GetPhase) | pure | RPG Saga|Time | FGameplayTag | The phase of the day now (Time.Phase.Dawn / Day / Dusk / Night, or the project's own). | |
Get Phase Display Name (GetPhaseDisplayName) | pure | RPG Saga|Time | FText | The phase's name from the settings. | |
Get Previous Weather (GetPreviousWeather) | pure | RPG Saga|Weather | FGameplayTag | The weather fading out during a transition (empty when settled). | |
Get Season (GetSeason) | pure | RPG Saga|Time | FGameplayTag | The season now (empty without seasons). | |
Get Time Scale (GetTimeScale) | pure | RPG Saga|Time | float | The story's clock speed (1 = normal). | |
Get Time Text (GetTimeText) | pure | RPG Saga|Time | FText | "14:05" (or "2:05 PM") in the settings' format. | |
Get Weather (GetWeather) | pure | RPG Saga|Weather | FGameplayTag | The weather now (during a transition, the incoming one). | |
Get Weather Blend (GetWeatherBlend) | pure | RPG Saga|Weather | float | Transition progress: 0 = all the previous weather, 1 = settled. | |
Get Weather Display Name (GetWeatherDisplayName) | pure | RPG Saga|Weather | FText | The weather's name (its type's Display Name). | |
Get Weather Table (GetWeatherTable) | pure | RPG Saga|Weather | URSEWeatherTableData* | Get Weather Table | |
Get Weather Type (GetWeatherType) | pure | RPG Saga|Weather | Weather: FGameplayTag | URSEWeatherTypeData* | The type data of a weather tag (null = not listed in the Weather settings). |
Is Clock Running (IsClockRunning) | pure | RPG Saga|Time | bool | The clock is moving now (enabled, not stopped by the story, not paused by a battle, dialog, scene, menu or level). | |
Is Phase (IsPhase) | pure | RPG Saga|Time | Phase: FGameplayTag | bool | The phase is Phase (or a child of it). |
Is Weather (IsWeather) | pure | RPG Saga|Weather | Weather: FGameplayTag | bool | The weather is Weather or a kind of it (Weather.Rain holds in a storm). |
Is Weather Locked (IsWeatherLocked) | pure | RPG Saga|Weather | bool | Is Weather Locked | |
Lock Weather (LockWeather) | function | RPG Saga|Weather | Weather: FGameplayTagTransitionSeconds: float = -1.000000 | Forces the weather: no rolls until Unlock (saved). Weather empty = keep the current one. | |
On Day Changed (OnDayChanged) | event | RPG Saga|Time | Day: int32 | ||
On Hour Changed (OnHourChanged) | event | RPG Saga|Time | Day: int32Hour: int32 | --- Events --- | |
On Phase Changed (OnPhaseChanged) | event | RPG Saga|Time | OldPhase: FGameplayTagNewPhase: FGameplayTag | ||
On Time Skipped (OnTimeSkipped) | event | RPG Saga|Time | From: FRSEGameTimeTo: FRSEGameTime | ||
On Time State Changed (OnTimeStateChanged) | event | RPG Saga|Time | Loaded, new game, pause / speed / lock changed. | ||
On Weather Changed (OnWeatherChanged) | event | RPG Saga|Weather | OldWeather: FGameplayTagNewWeather: FGameplayTagTransitionSeconds: float | ||
Pop Clock Pause (PopClockPause) | function | RPG Saga|Time | Reason: FName | Pop Clock Pause | |
Push Clock Pause (PushClockPause) | function | RPG Saga|Time | Reason: FName | Pauses the clock for Reason until the matching Pop (reasons are counted; not saved). | |
Query Schedule (QuerySchedule) | pure | RPG Saga|Time | Schedule: FRSETimeSchedule (ref)Activity: FGameplayTag (out)Location: FName (out)EntryIndex: int32 (out) | bool | What an NPC does now: the first schedule entry that holds (hours or phase, weather, story conditions). Returns false when none does (use the schedule's defaults, filled in Activity / Location). |
Resolve Encounter Pool (ResolveEncounterPool) | pure | RPG Saga|Time | Pool: URSEEncounterPoolData* | URSEEncounterPoolData* | The encounter pool to use instead of Pool now (night creatures...): Pool when no swap applies. |
Roll Weather (RollWeather) | function | RPG Saga|Weather | bInstant: bool = false | Rolls the next weather from the table now (unless locked). | |
Set Clock Stopped (SetClockStopped) | function | RPG Saga|Time | bStopped: bool | Stops or starts the clock for the story (saved: stays stopped until started). | |
Set Day (SetDay) | function | RPG Saga|Time | Day: int32 | Sets the day number (the hour stays). | |
Set Time (SetTime) | function | RPG Saga|Time | Hour: floatMode: ERSESetTimeMode = NextOccurrence | Moves the clock to Hour (NextOccurrence: forward to the next time it shows Hour; SameDay: that hour today). | |
Set Time Scale (SetTimeScale) | function | RPG Saga|Time | Scale: float | The story's clock speed (0.5 = half speed, 2 = double). Saved. | |
Set Weather (SetWeather) | function | RPG Saga|Weather | Weather: FGameplayTagTransitionSeconds: float = -1.000000DurationHours: float = 0.000000 | bool | Changes the weather. TransitionSeconds < 0 = the weather type's; DurationHours 0 = rolled from the type / table. Returns false when the weather is not a listed type. |
Set Weather Table (SetWeatherTable) | function | RPG Saga|Weather | Table: URSEWeatherTableData* | The weather table of the current level / zone (null = the settings' default). Levels and weather volumes set it. | |
Unlock Weather (UnlockWeather) | function | RPG Saga|Weather | Unlock Weather |
URSETouchActionResolver
Module RSE, display name Custom (Blueprint). Optional custom resolution of a touch action (Blueprint or C++): replaces the source of an action reference.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Resolve Action (ResolveAction) | override | RPG Saga|Touch | Controller: APlayerController* | UInputAction* | The input action for Controller now (null: the control does nothing). |
URSETouchInputSubsystem
Module RSE. "RSE Touch Input" (D-180, docs/product/mobile.md): one local player's touch controls.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Clear Context Override (ClearContextOverride) | function | RPG Saga|Touch | Goes back to the context the game is in (Set Touch Context Override undone). | ||
Get Active Context (GetActiveContext) | pure | RPG Saga|Touch | ERSETouchContext | The moment of play the controls are for now. | |
Get Active Layout (GetActiveLayout) | pure | RPG Saga|Touch | URSETouchLayout* | The layout in use now (null: no controls, no gestures). | |
Get Control Opacity (GetControlOpacity) | pure, static | RPG Saga|Touch | float | The player's Touch Controls Opacity (multiplies the rest opacity of the controls; Touch -> Control Opacity Range). | |
Get Control Scale (GetControlScale) | pure, static | RPG Saga|Touch | float | The player's Touch Controls Size (multiplies control sizes; Touch -> Control Scale Range). | |
Get Controls Widget (GetControlsWidget) | pure | RPG Saga|Touch | URSETouchControlsWidget* | The widget drawing the controls (null until the first touch layout shows). | |
Get Touch Input (GetFor) | pure, static | RPG Saga|Touch | Controller: APlayerController* | URSETouchInputSubsystem* | The touch subsystem of Controller's local player (null for remote controllers). |
Inject Action (InjectAction) | function | RPG Saga|Touch | Action: UInputAction*Value: FVector | bool | Presses Action once with Value (converted to the action's value type). Returns false without an Enhanced Input subsystem. |
Is Emulating Touch (IsEmulatingTouch) | pure, static | RPG Saga|Touch | bool | The mouse acts as a finger now (Set Emulate Touch, RSE.Input.Touch.Emulate). | |
Is Left Handed (IsLeftHanded) | pure, static | RPG Saga|Touch | bool | The controls are mirrored for left-handed players (anchors, offsets and gesture regions flip left / right). | |
Is Moving to Tap (IsMovingToTap) | pure | RPG Saga|Touch | bool | Tap-to-move is walking the explorer now. | |
Is Touch Available (IsTouchAvailable) | pure, static | RPG Saga|Touch | bool | Touch is a device here: a phone, the touch device in use, emulation or the phone simulation (the options show the touch rows). | |
On Context Changed (OnContextChanged) | event | RPG Saga|Touch | Context: ERSETouchContext | The context changed (Blueprint reactions, tutorials). | |
Press Control (PressControl) | function | RPG Saga|Touch | ControlId: FNamebPressed: bool | bool | Presses (or releases) a control of the active layout as a finger would. Returns false when the layout has no such control. |
Refresh Context (RefreshContext) | function | RPG Saga|Touch | Reads the context again and applies it (layout, widget, hints). | ||
Resolve Context (ResolveContext) | pure | RPG Saga|Touch | ERSETouchContext | The context the game is in now (what the poll finds): an open screen, the battle kind, exploration. | |
Select Radial Item (SelectRadialItem) | function | RPG Saga|Touch | ControlId: FNameItem: int32 | bool | Picks an item of a radial control (presses its action once). |
Set Context Override (SetContextOverride) | function | RPG Saga|Touch | Context: ERSETouchContext | Forces a context (a scripted scene, a minigame of your own); Clear Touch Context Override goes back to the game's. | |
Set Control Axis (SetControlAxis) | function | RPG Saga|Touch | ControlId: FNameAxis: FVector2D | bool | Moves a joystick control (X right, Y up, -1..1; zero releases it). Cancels tap-to-move. |
Set Emulate Touch (SetEmulateTouch) | function, static | RPG Saga|Touch | bEmulate: bool | Mouse as a finger on PC (Slate's fake touch events). | |
Set Layout Override (SetLayoutOverride) | function | RPG Saga|Touch | Context: ERSETouchContextLayout: URSETouchLayout* | Uses Layout for Context instead of the project's (null clears). | |
Should Show Controls (ShouldShowControls) | pure | RPG Saga|Touch | bool | The on-screen controls should show now (Touch -> Show Controls and the device in use). | |
Start Move To (StartMoveTo) | function | RPG Saga|Touch | WorldPoint: FVector | Walks the explorer to WorldPoint through the Move action (what a Move To tap does). | |
Stop Move To (StopMoveTo) | function | RPG Saga|Touch | Stops tap-to-move (the Move action is released). |
URSETravelSubsystem
Module RSE. Zone navigation and fast travel in the world (D-044, docs/design/zones-travel.md).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cancel Group Travel (CancelGroupTravel) | function | RPG Saga|Travel | Stops the group travel countdown (the host changed their mind, a battle started). | ||
Close World Map (CloseWorldMap) | function | RPG Saga|Travel | Closes the world map screen. | ||
Get Areas (GetAreasBP) | function | RPG Saga|Travel | TArray<URSEAreaData*> | Every area the game knows (Asset Manager). | |
Get Block Text (GetBlockText) | pure, static | RPG Saga|Travel | Block: ERSEFastTravelBlock | FText | Player-facing text of a block (empty for None). |
Get Current Area (GetCurrentArea) | pure | RPG Saga|Travel | URSEAreaData* | Area the player is in now (URSETravelWorldSubsystem of the game world), or null. | |
Get Fast Travel Block (GetFastTravelBlock) | pure | RPG Saga|Travel | ERSEFastTravelBlock | Whether the world map can be used now, and why not. | |
Get Group Travel Seconds Left (GetGroupTravelSecondsLeft) | pure | RPG Saga|Travel | float | Seconds left of the group travel countdown (0 when none). | |
Get Travel Destinations (GetDestinationsBP) | function | RPG Saga|Travel | TArray<URSETravelDestinationData*> | Every fast-travel place the game knows (Asset Manager). | |
Is Group Travel Counting Down (IsGroupTravelCountingDown) | pure | RPG Saga|Travel | bool | The host's group travel is counting down. | |
Is Traveling (IsTraveling) | pure | RPG Saga|Travel | bool | A travel is queued, counting down (co-op), fading out or loading. | |
Is World Map Open (IsWorldMapOpen) | pure | RPG Saga|Travel | bool | The world map screen is open. | |
On Group Travel Countdown (BP_OnGroupTravelCountdown) | event | RPG Saga|Travel | Request: FRSETravelRequest (ref)Seconds: float | ||
On Group Travel Requested (BP_OnGroupTravelRequested) | event | RPG Saga|Travel | Request: FRSETravelRequest (ref)Guest: FRSEPlayerId | ||
Open World Map (OpenWorldMapBP) | function | RPG Saga|Travel | OutReason: FText (out) | bool | Opens the world map screen (after a running dialog). Returns false when blocked; OutReason says why. |
Set Group Travel Policy (SetGroupTravelPolicy) | function | RPG Saga|Travel | Policy: URSEGroupTravelPolicy* | Replaces the rule at run time; null = the settings' class. | |
Travel To (TravelTo) | function | RPG Saga|Travel | Request: FRSETravelRequest (ref) | bool | Starts a travel. Waits for a running dialog to close first (an exit that asks, a story effect). Refused while another travel runs or without a map. Returns true when the travel was started or queued. |
Travel to Destination (TravelToDestination) | function | RPG Saga|Travel | Destination: URSETravelDestinationData* | bool | Fast travel to a world map place (must be Available). |
URSETravelWorldSubsystem
Module RSE. The area side of a game map (D-044): which area the player is in (an ARSEAreaVolume with an Area, else the map's area), its discovery (narrative state), its no-save restriction (a NoSaveZone block, like ARSENoSaveVolume), and the arrival presentation: the fade-in after a travel and the area banner.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Current Area (GetCurrentArea) | pure | RPG Saga|Travel | URSEAreaData* | Area the player is in (null = the map has none). | |
Get Map Area (GetMapArea) | pure | RPG Saga|Travel | URSEAreaData* | The map-level area. | |
Show Banner (ShowBanner) | function | RPG Saga|Travel | Area: URSEAreaData* | Shows Area's banner now (dev command, scripted moments). |
URSETraversalComponent
Module RSE. Plays a body's traversal (D-121, docs/design/traversal.md): holds its FRSETraversalState (small, serializable; a replicated property later, D-124) and derives the position and the animation from it, never from input.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get State (GetState) | pure | RPG Saga|Traversal | FRSETraversalState | The current state (None when not traversing). | |
Is on Link (IsOnLink) | pure | RPG Saga|Traversal | bool | Whether the body is on a link now. | |
Is Swimming (IsSwimming) | pure | RPG Saga|Traversal | bool | Whether the body swims now. |
URSETraversalKindData
Module RSECore. A kind of traversal (D-121, docs/design/traversal.md): what every ladder, rope, swim area or jump of that kind shares.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Can be Used By (CanBeUsedBy) | override | RPG Saga|Traversal | Tags: FGameplayTagContainer (ref) | bool | Whether a unit or character with these tags may use it (Required / Blocked Tags by default). |
Get Prompt (GetPrompt) | pure | RPG Saga|Traversal | Direction: ERSETraversalDirection | FText | The prompt for a direction. |
URSETraversalLinkKindData
Module RSECore, display name Traversal Link Kind. A link between two standable points (D-121): ladders, ropes, jumps across gaps, vaults over low ledges, controlled drops, zip-lines, rope swings, rope bridges.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Anims (GetAnims) | pure | RPG Saga|Traversal | Direction: ERSETraversalDirection | FRSETraversalLinkAnims | The animation slots for a direction (backward falls back slot by slot to forward). |
Get Battle Cost (GetBattleCost) | override | RPG Saga|Traversal | A: FVector (ref)B: FVector (ref)CostMultiplierOverride: float | float | Movement (meters) a battle unit pays to go from A to B (battle space). Default: 3D length x multiplier + extra, never below the ground distance. |
Get Motion Seconds (GetMotionSeconds) | pure | RPG Saga|Traversal | MotionLengthMeters: float | float | Seconds the motion takes over a path of MotionLength meters (mount and dismount not included). |
URSETraversalMotion
Module RSECore, display name Traversal Motion. How a body moves along a traversal link (D-121, docs/design/traversal.md): pure math on the link's path (its points, from start to end), no world.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Evaluate Location (EvaluateLocation) | override | RPG Saga|Traversal | Path: TArray<FVector> (ref)Alpha: floatUnitsPerMeter: float | FVector | Where the body is at Alpha (0 = the first point, 1 = the last). Path has at least two points. |
Get Length (GetLength) | override | RPG Saga|Traversal | Path: TArray<FVector> (ref)UnitsPerMeter: float | float | Length of the motion along Path (in the path's units): the time a traversal takes is this over the kind's speed. |
Sample (Sample) | pure | RPG Saga|Traversal | Path: TArray<FVector> (ref)Count: int32UnitsPerMeter: floatOutPoints: TArray<FVector> (out) | Samples the motion: Count + 1 points from Alpha 0 to 1 (path previews). |
URSETraversalMotion_Arc
Module RSECore, display name Arc. A parabola from the first point to the last (the points in between are ignored): jumps, vaults, drops, swings.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Arc Height Meters (GetArcHeightMeters) | pure | RPG Saga|Traversal | HorizontalMeters: float | float | Arc height in meters for a horizontal length in meters. |
URSETraversalSubsystem
Module RSE. Traversal in the world (D-121, docs/design/traversal.md): the single place that validates and applies traversal commands (who takes which link, who starts or stops swimming).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Check Command (CheckCommand) | pure | RPG Saga|Traversal | Command: FRSETraversalCommand (ref) | ERSETraversalCheck | Validates a command without applying it. |
Complete All (CompleteAll) | function | RPG Saga|Traversal | Ends every traversal at once (the bodies land where they were going; swimmers stop swimming). A battle starting calls it. | ||
Get State (GetState) | pure | RPG Saga|Traversal | Pawn: APawn* | FRSETraversalState | The traversal state of a body (None when it is not traversing). |
Is Blocking Save (IsBlockingSave) | pure | RPG Saga|Traversal | bool | Whether the subsystem holds the save block now (someone is on a kind that forbids saving). | |
Is on Link (IsOnLink) | pure | RPG Saga|Traversal | Pawn: APawn* | bool | Whether a body is on a link (a ladder, a jump) right now. |
On Swim Changed (OnSwimChanged) | event | RPG Saga|Traversal | Pawn: APawn*bSwimming: bool | ||
On Traversal Finished (OnTraversalFinished) | event | RPG Saga|Traversal | Pawn: APawn*Link: ARSETraversalActor* | ||
On Traversal Started (OnTraversalStarted) | event | RPG Saga|Traversal | Pawn: APawn*Link: ARSETraversalActor*Direction: ERSETraversalDirection | ||
Submit Command (SubmitCommand) | function | RPG Saga|Traversal | Command: FRSETraversalCommand (ref) | ERSETraversalCheck | Validates and applies a command. Returns Ok when applied (nothing changes otherwise). |
URSETutorialSubsystem
Module RSECore. Contextual tutorials (D-047).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Are Tutorials Available (AreTutorialsAvailable) | pure | RPG Saga|Tutorials | bool | Whether tutorials may be requested and marked seen now: the bound query (RSE: the time policy, which hides tutorials in multiplayer sessions), else only outside a network session (authority mode Standalone). | |
Get Seen Tutorials (GetSeenTutorialsBP) | pure | RPG Saga|Tutorials | TArray<URSETutorialData*> | Seen tutorials in Help order. | |
Is Seen (IsSeen) | pure | RPG Saga|Tutorials | Tutorial: URSETutorialData* | bool | The tutorial was shown already. |
Mark Tutorial Seen (MarkSeenBP) | function | RPG Saga|Tutorials | Tutorial: URSETutorialData* | bool | Marks a tutorial seen without showing it. Returns true when it was not seen before. |
Notify Tutorial Trigger (NotifyTriggerBP) | function | RPG Saga|Tutorials | Trigger: FGameplayTag | URSETutorialData* | A game event happened (Tutorial.Trigger.*): shows the first unseen tutorial with that trigger whose conditions pass. Custom triggers are just new tags fired from Blueprint. Returns the tutorial shown, or none. |
On Tutorial Requested (BP_OnTutorialRequested) | event | RPG Saga|Tutorials | Tutorial: URSETutorialData* | A tutorial is requested: the presentation shows it (seen state already updated). | |
Request Tutorial (RequestTutorialBP) | function | RPG Saga|Tutorials | Tutorial: URSETutorialData*bEvenIfSeen: bool = falsebIgnoreOption: bool = false | bool | Shows a tutorial now and marks it seen (bEvenIfSeen shows a seen one again; bIgnoreOption shows it with tutorials off). |
URSETutorialViewModel
Module RSE. A tutorial (D-047): its pages (title, optional picture, text with dialog markup, key prompts of the page's actions).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Advance (Advance) | function | RPG Saga|UI|Tutorial | Next page, or close on the last one. | ||
Dismiss (Dismiss) | function | RPG Saga|UI|Tutorial | Closes the tutorial (Close with its sound). | ||
Refresh (Refresh) | function | RPG Saga|UI|Tutorial | Rebuilds the key hints (the player switched devices). | ||
Turn Page (TurnPage) | function | RPG Saga|UI|Tutorial | Direction: int32 | Turn Page |
URSEUIHost
Module RSE. RSE UI Host
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Host ATBHUD (GetHostATBHUD) | override | RPG Saga|UI|Host | URSEATBHUDViewModel* | The classic battle HUD's view-model (null = none). | |
Get Host Party Menu (GetHostPartyMenu) | override | RPG Saga|UI|Host | URSEPartyMenuViewModel* | The party menu's view-model (open / close, pages, actions). | |
Get Host Party Menu Screen (GetHostPartyMenuScreen) | override | RPG Saga|UI|Host | URSEScreenWidget* | The party menu's screen (ours or a Widget Blueprint). | |
Get Host Tactics HUD (GetHostTacticsHUD) | override | RPG Saga|UI|Host | URSETacticsHUDViewModel* | The Tactics battle HUD's view-model (null = none). |
URSEUIStyle
Module RSE. A UI style (D-162, docs/product/ui-styles.md): the colors, fonts, frames, rows, controls, gauges, key caps, icons, sounds and motion of every screen built on URSEHUDWidgetBase.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Style Name (GetStyleName) | pure | RPG Saga|UI Style | FText | The name in menus (Display Name, else the id). |
URSEUIStyleLibrary
Module RSE. UI styles in Blueprint (D-162): read colors, fonts and frame brushes of the active style in your own UMG screens, switch styles at runtime.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
End UIStyle Preview (EndUIStylePreview) | function, static | RPG Saga|UI Style | Context: UObject* | End UIStyle Preview | |
Fill UIStyle from Legacy Theme (FillUIStyleFromLegacyTheme) | function, static | RPG Saga|UI Style | Target: URSEUIStyle* | Fills Target from the legacy theme settings (the look from before UI styles), as DA_UIStyle_Classic was made. For tools and editor scripts. | |
Get Active UIStyle (GetActiveUIStyle) | pure, static | RPG Saga|UI Style | Context: UObject* | URSEUIStyle* | The active UI style of Context's local player (the project's default without one). Null = made from the legacy theme. |
Get Selectable UIStyle Ids (GetSelectableUIStyleIds) | pure, static | RPG Saga|UI Style | TArray<FName> | The ids of the styles players can pick (for Set UI Style and the style picker of your own options screen). | |
Get Selectable UIStyles (GetSelectableUIStyles) | pure, static | RPG Saga|UI Style | TArray<URSEUIStyle*> | The styles players can pick (UI Theme -> Selectable Styles). | |
Get UIAccessibility (GetUIAccessibility) | pure, static | RPG Saga|UI Style | Context: UObject* | FRSEUIAccessibility | Context's accessibility options: color vision, high contrast, text scale, reduce motion (the player's saved ones without a local player). |
Get UIColor (GetUIColor) | pure, static | RPG Saga|UI Style | Context: UObject*Token: FNameShade: ERSEUIShade = BaseAlpha: float = 1.000000 | FLinearColor | A token color of the active style (Primary, Accent, Surface0, TextMuted, a custom token...). |
Get UIFont (GetUIFont) | pure, static | RPG Saga|UI Style | Context: UObject*Role: ERSETextRoleSize: int32 = 0 | FSlateFontInfo | The font of a text role in the active style (Size > 0: that size, scaled like the role). |
Get UIFrame Brush (GetUIFrameBrush) | pure, static | RPG Saga|UI Style | Context: UObject*Kind: ERSEPanelKind | FSlateBrush | The brush of a panel kind in the active style (for a Border or Image of your own screen). |
Preview UIStyle (PreviewUIStyle) | function, static | RPG Saga|UI Style | Context: UObject*Style: URSEUIStyle* | Shows Style on Context's local player without saving it (a preview in a style picker). End UI Style Preview goes back to the player's choice. | |
Resolve UIColor (ResolveUIColor) | pure, static | RPG Saga|UI Style | Context: UObject*Color: FRSEUIColor (ref) | FLinearColor | A UI color (token or fixed) against the active style. |
Set UIAccessibility (SetUIAccessibility) | function, static | RPG Saga|UI Style | Context: UObject*Accessibility: FRSEUIAccessibility (ref) | Sets all the accessibility options at once, applies them to every open screen of Context's local player and saves them. | |
Set UIColor Vision (SetUIColorVision) | function, static | RPG Saga|UI Style | Context: UObject*ColorVision: ERSEColorVision | Changes one accessibility option and keeps the others. | |
Set UIHigh Contrast (SetUIHighContrast) | function, static | RPG Saga|UI Style | Context: UObject*bHighContrast: bool | Set UIHigh Contrast | |
Set UIReduce Motion (SetUIReduceMotion) | function, static | RPG Saga|UI Style | Context: UObject*bReduceMotion: bool | Set UIReduce Motion | |
Set UIStyle (SetUIStyle) | function, static | RPG Saga|UI Style | Context: UObject*StyleId: FName | bool | Switches Context's local player to the style with this id (saved as the player's choice). Returns false when unknown. |
Set UIText Scale (SetUITextScale) | function, static | RPG Saga|UI Style | Context: UObject*TextScale: float | Text Scale 0.8..1.5 (1 = the style's own sizes; texts never go below the theme's minimum size). |
URSEUIStyleSubsystem
Module RSE. The UI style of one local player (D-162): which style is active, its accessibility options and the resolved style every widget of that player reads.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
End Preview (EndPreview) | function | RPG Saga|UI Style | End Preview | ||
Get Accessibility (GetAccessibility) | pure | RPG Saga|UI Style | FRSEUIAccessibility | Get Accessibility | |
Get Active Style (GetActiveStyle) | pure | RPG Saga|UI Style | URSEUIStyle* | The active style asset (null = the legacy theme settings). | |
Get Active Style Id (GetActiveStyleId) | pure | RPG Saga|UI Style | FName | Get Active Style Id | |
Get UI Style Subsystem (GetFor) | pure, static | RPG Saga|UI Style | Player: UObject* | URSEUIStyleSubsystem* | The style subsystem of the local player behind Player (a controller, pawn, widget or local player), or null. |
On Style Changed (OnStyleChanged) | event | RPG Saga|UI Style | The active style changed (another style, its asset edited, accessibility). Rebuild what caches colors, fonts or brushes. | ||
Preview Style (PreviewStyle) | function | RPG Saga|UI Style | Style: URSEUIStyle* | Shows Style without saving it (a preview in a style picker). EndPreview goes back to the player's choice. | |
Set Accessibility (SetAccessibility) | function | RPG Saga|UI Style | InAccessibility: FRSEUIAccessibility (ref)bSaveChoice: bool = true | Applies the accessibility options (color vision, high contrast, text scale, reduce motion) to every open screen of this player; saved as the player's choice. | |
Set Style (SetStyle) | function | RPG Saga|UI Style | StyleId: FNamebSaveChoice: bool = true | bool | Switches to the style with this id (Default Style, Selectable Styles, or any style asset with that id). Returns false when unknown. |
Set Style Asset (SetStyleAsset) | function | RPG Saga|UI Style | Style: URSEUIStyle* | Switches to a style asset directly (previews, the style editor). Null = the project's default. |
URSEUnitBubbleComponent
Module RSE. A screen-space speech bubble over a unit (D-117): the "calling for help" icon and bark, the lines of scripted battle events.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Hide (Hide) | function | RPG Saga|Battle | Hide | ||
Is Shown (IsShown) | pure | RPG Saga|Battle | bool | Is Shown | |
Show (Show) | function | RPG Saga|Battle | Icon: FText (ref)Line: FText (ref)IconColor: FLinearColor (ref)Seconds: float | Shows Icon (may be empty) and Line for Seconds of real time (0 = until Hide). |
URSEUnitStatSource
Module RSECore, display name Unit Stat Source. A system outside the framework that supplies a battle unit's stats (D-169): a GAS character's attribute set (the RPGSagaEngineGAS companion plugin), a buyer's own stat component, a save from another game...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Applies To (AppliesTo) | override | RPG Saga|Characters|Stat Source | Spawn: FRSEBattleUnitSpawn (ref)Battle: URSEBattle*UnitId: int32 | bool | Whether this source supplies the stats of Spawn in Battle. UnitId is the unit's id in that battle, or -1 when the battle only builds a hypothetical unit (summon damage estimates): answer the same way, but do not bind to it. Default: false (override it). |
On Unit Built (OnUnitBuilt) | override | RPG Saga|Characters|Stat Source | Battle: URSEBattle*UnitId: int32 | The battle finished building the unit (UnitId >= 0 only): a presenter may now bind to Battle's events for that unit, for example to mirror its damage back. Default: nothing. | |
Provide Stats (ProvideStats) | override | RPG Saga|Characters|Stat Source | Spawn: FRSEBattleUnitSpawn (ref)Battle: URSEBattle*UnitId: int32OutStats: FRSEExternalUnitStats (out) | Fills OutStats for the unit (see Applies To for UnitId). Leave a part empty to keep the framework's value. |
URSEVisualStyleSubsystem
Module RSE. Chooses and applies the visual style of a game world (D-037, docs/design/visual-style.md): area override (the highest-priority ARSEAreaVolume with a VisualStyle containing the player) -> the player's choice (GameUserSettings.ini, by PrimaryAssetId; dev hotkey / console / options) -> URSEVisualStyleS...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Cycle User Style (CycleUserStyle) | function | RPG Saga|Visual Style | Direction: int32 | Moves the player's choice through the preset list (Direction +1 / -1) and shows the toast. | |
Find Style (FindStyle) | function, static | RPG Saga|Visual Style | Name: FString | URSEVisualStyle* | A preset whose asset name or display name matches Name (exact first, then partial; case-insensitive). |
Get Active Style (GetActiveStyle) | pure | RPG Saga|Visual Style | URSEVisualStyle* | The style applied now (null = none). | |
Get Area Style (GetAreaStyle) | pure | RPG Saga|Visual Style | URSEVisualStyle* | The style the player's area forces (none = no area override). | |
Get Cycle Styles (GetCycleStyles) | function, static | RPG Saga|Visual Style | OutStyles: TArray<URSEVisualStyle*> (out) | The presets in cycle order (settings list, else every RSEVisualStyle asset by name), loaded. | |
Get Default Style (GetDefaultStyle) | pure | RPG Saga|Visual Style | URSEVisualStyle* | The project's default style (Visual Style settings). | |
Get User Style (GetUserStyle) | pure | RPG Saga|Visual Style | URSEVisualStyle* | The player's chosen style (none = the default). | |
On Visual Style Changed (BP_OnStyleChanged) | event | RPG Saga|Visual Style | NewStyle: URSEVisualStyle* | The applied style changed (area, player choice, default; Blueprint). | |
Set Area Style (SetAreaStyle) | function | RPG Saga|Visual Style | Style: URSEVisualStyle* | Area override (null = none). Set by the area check; scripts and tests may set it directly. | |
Set User Style (SetUserStyle) | function | RPG Saga|Visual Style | Style: URSEVisualStyle*bSave: bool = true | The player's choice (null = the default). Saved per user when bSave. Ignored while the settings disallow it. |
URSEWeaponPresentation
Module RSE. How attacks with a weapon look (D-184), in every battle mode (grid, live, ATB, turn-based through the cue timelines; action battles through the combat presentation): the stance's swing or fire animations, the muzzle flash and shell ejection, tracers or projectiles, impacts per surface with decals, t...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Effective Stance (GetEffectiveStance) | pure | RPG Saga|Weapons | ERSEWeaponStance | The stance used when it is Auto: from the kind. | |
Is Ranged (IsRanged) | pure | RPG Saga|Weapons | bool | Fires (tracers or projectiles) rather than swings. |
URSEWeatherPresenterComponent
Module RSE, display name Weather Presenter. The weather's presentation (D-101): precipitation around the camera (Niagara, the Low systems on Low effects quality), the global material parameters (Wetness, SnowCover, Wind, RainAmount...), weather sounds (SFX channel), lightning and thunder, roofs and no-weather volumes.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Get Presentation (GetPresentation) | pure | RPG Saga|Weather | FRSEWeatherPresentation | Get Presentation | |
On Lightning Strike (OnLightningStrike) | event | RPG Saga|Weather | ThunderDelaySeconds: float | A lightning strike (the sky flashes now; thunder follows after the delay). | |
Strike Lightning (StrikeLightning) | function | RPG Saga|Weather | Strikes lightning now (dev command, story). |
URSEWorldEffect_Custom
Module RSECore, display name Custom (Blueprint). An effect written in Blueprint: create a Blueprint class from it, override On Execute and change the game through the "Context" nodes (RPG Saga\|Narrative\|Context: flags, items, party...) or any other node (sounds, actors: the class reports the game's world).
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
On Execute (OnExecute) | override | RPG Saga|Effects | Context: FRSEEffectContext (ref) | Applies the effect. Use the Context nodes so the change is reported (quests, HUD) and deferred like the built-in effects. |
URSEWorldMapViewModel
Module RSE. The world map (D-044): discovered places as markers on a map picture and as a list.
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Choose (Choose) | function | RPG Saga|UI|WorldMap | Travels to the selected place (or says why not). | ||
Click Place (ClickPlace) | function | RPG Saga|UI|WorldMap | Index: int32 | A click on a place: selects it, a second click travels. | |
Leave (Leave) | function | RPG Saga|UI|WorldMap | Leave | ||
Move Selection (MoveSelection) | function | RPG Saga|UI|WorldMap | Delta: int32 | Move Selection | |
Select (Select) | function | RPG Saga|UI|WorldMap | Index: int32 | Select |
URSEWorldReactionSubsystem
Module RSE. Abilities on the world (D-157): the registry of reactive objects in this world and the one place that applies the World Reactions rules to them: from the party menu (the Cast On World command: checked, paid only when something reacts), from a Free Tactics ability that lands among them (the director...
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Apply Ability At (ApplyAbilityAt) | function | RPG Saga|World Reactions | Ability: URSEAbilityData*Center: FVectorRadius: floatInstigator: AActor* | int32 | Applies Ability's tags (element, type, roles, World Tags) around Center. Returns the objects that reacted. |
Cast on World (CastOnWorld) | function | RPG Saga|World Reactions | Pawn: APawn*Member: URSECharacterData*Ability: URSEAbilityData*OutReason: FText (out) | bool | Casts Ability on the surroundings as the player of Pawn, by Member, through the command bus: applied at once in single player and on the host. OutReason says why not. Returns true when it was applied (or sent). |
Would React (WouldReact) | pure | RPG Saga|World Reactions | Ability: URSEAbilityData*Pawn: APawn* | bool | Whether anything around Pawn would react to Ability now (the party menu offers "on the surroundings" only then). |
URSEWorldStreamingSubsystem
Module RSE. World Partition and level streaming support (D-174, docs/design/save-system.md "World Partition").
| Node | Kind | Category | Parameters | Returns | Description |
|---|---|---|---|---|---|
Begin Battle Streaming (BeginBattleStreaming) | function | RPG Saga|World Partition | Center: FVectorAreaRadius: float | Keeps the cells within AreaRadius (+ the settings' margin, at least their minimum radius) of Center loaded until End Battle Streaming. Replaces a running one. Does nothing outside a partitioned world or with the setting off. | |
End Battle Streaming (EndBattleStreaming) | function | RPG Saga|World Partition | Lets the battle's cells unload again (when no player is near). | ||
Get Data Layer State (GetDataLayerState) | pure | RPG Saga|World Partition | DataLayer: UDataLayerAsset* | ERSEDataLayerState | The layer's state now: the engine's effective state in a partitioned world that has it, else the state the story recorded, else Unloaded. |
Is Battle Area Streamed (IsBattleAreaStreamed) | pure | RPG Saga|World Partition | bool | The battle's cells finished loading (true outside a partitioned world and when no battle keeps cells). | |
Is Battle Streaming Active (IsBattleStreamingActive) | pure | RPG Saga|World Partition | bool | A battle keeps cells loaded now. | |
Set Data Layer State (SetDataLayerState) | function | RPG Saga|World Partition | DataLayer: UDataLayerAsset*State: ERSEDataLayerState | bool | Sets a data layer's runtime state for the story (a bridge built, ruins after the attack) and records it in the World section, so it is applied again after a load. Returns false when the layer is not in this world (the state is recorded anyway). |
Appendix B. Settings reference
Generated from the plugin's developer settings classes. 151 settings classes with 4465 properties. Open Project Settings, then the category and section shown in each heading. Defaults are the values the class holds when the export ran. Restart marks a setting that needs an editor restart.
Editor: RPG Saga Engine Configurator
Class URSEConfiguratorSettings (module RSEEditor), Project Settings, Project, Editor. Options of the RSE Configurator editor window (D-035).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Test Maps (TestMaps) | TArray<FRSEConfiguratorTestMap> | (3 entries) | Test | Maps listed in the Test bar, each with Open and Play buttons. | |
Groups (Groups) | TArray<FRSEConfiguratorGroup> | (46 entries) | Tree | Domain groups of the tree, in display order. Settings classes not listed in any group go to "Other". Empty groups are hidden. | |
Validate Data Assets by Default (bValidateDataAssetsByDefault) | bool | False | Validation | The validation panel also loads and validates every RSE data asset (URSEPrimaryDataAsset) by default. Slower on big projects. | |
Validate on Open (bValidateOnOpen) | bool | True | Validation | Run the validation when the configurator opens. |
Plugins: RPG Saga Studio
Class URSEStudioUserSettings (module RSEEditor), Project Settings, Editor, Plugins. Per-user Studio preferences (Editor Preferences -> RPG Saga Studio, saved per project for this user): the explanation level, opening the Studio at startup, the full menus, the character sheet on double click and the recent assets.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Character Sheet Advanced (bCharacterSheetAdvanced) | bool | False | Character Sheet | The character sheet opens in Advanced mode (every field). | |
Open Character Sheet on Double Click (bOpenCharacterSheetOnDoubleClick) | bool | True | Character Sheet | Double-clicking a Character asset opens its character sheet (off = the generic asset editor). | |
Open Sheets on Double Click (bOpenSheetsOnDoubleClick) | bool | True | Character Sheet | Double-clicking an ability, item or archetype opens its sheet (off = the generic asset editor). | |
First Steps Hidden (bFirstStepsHidden) | bool | False | First Steps | First steps: hidden from the Studio's start page ("Hide this list"). | |
First Steps Seen (bFirstStepsSeen) | bool | False | First Steps | First steps (D-177): the checklist opened by itself at the first startup in this project (so it opens once per project and user). | |
First Steps Done (FirstStepsDone) | TArray<FName> | (0 entries) | First Steps | First steps that leave nothing in the project to detect (Play the slice, Read Getting Started), remembered here. | |
Show Advanced Tools Everywhere (bShowAdvancedToolsEverywhere) | bool | False | Menus | Show every RPG Saga Engine tool everywhere, as before the Studio: the full main menu, the toolbar buttons and the context tools even when nothing they apply to is selected. Off = a short menu (Studio, Configurator, Validation, Help, Advanced tools) and tools that appear where they apply. | |
Open Studio at Startup (bOpenStudioAtStartup) | bool | True | Studio | Open the Studio when the editor starts (the Studio's "Don't show at startup" box turns it off). | |
Detail Level (DetailLevel) | ERSEStudioDetailLevel | Beginner | Studio | How much the Studio explains: Beginner (explanations always visible), Normal (tooltips) or Expert (nothing). | |
Recent Assets (RecentAssets) | TArray<FSoftObjectPath> | (0 entries) | Studio | Recently created or edited RPG Saga assets, newest first ("Continue where you left off"). | |
Startup Bring to Front Delays (StartupBringToFrontDelays) | TArray<float> | (2 entries) | Studio | After opening at startup, the Studio's window is brought to the front again at these times (seconds), so windows the editor restores later (the Plugins window after Restart Now) do not hide it (D-136). Empty = never. |
RPG Saga Engine: AI
Class URSEAISettings (module RSECore), Project Settings, Project, RPG Saga Engine. Global utility AI tuning.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Charge Interrupt Weight (ChargeInterruptWeight) | float | 15.000000 | ATB | ATB: value for hitting a unit that is charging an ability, at intelligence 1 (interrupt its big move). | |
Charge Time Penalty Per Second (ChargeTimePenaltyPerSecond) | float | 3.000000 | ATB | ATB: value lost per second of an ability's charge time (slow moves risk being wasted). | |
Debug History (DebugHistory) | int32 | 20 | Debug | Decisions remembered per battle for the debugger. | |
Debug Top Options (DebugTopOptions) | int32 | 5 | Debug | Options kept per decision for the debugger and the log dump. | |
End Turn Bias (EndTurnBias) | float | 1.000000 | Decision | Small value added to ending the turn, so the AI does not wander for negligible gains. | |
Revive Value (ReviveValue) | float | 80.000000 | Decision | Value of bringing a fallen ally back (before the profile's HealWeight), on top of the HP it returns with. | |
Danger Awareness at Min Intelligence (DangerAwarenessAtMinIntelligence) | float | 0.300000 | Intelligence | Share of danger awareness at intelligence 0 (it scales linearly to 1 at intelligence 1). | |
Enemy VIPMultiplier (EnemyVIPMultiplier) | float | 1.500000 | Intelligence | Damage value multiplier against the enemy team's VIP at intelligence 1. | |
Focus Fire Weight (FocusFireWeight) | float | 10.000000 | Intelligence | Value for focusing already-hurt targets at intelligence 1 (coordination / focus fire). | |
Noise Top Options (NoiseTopOptions) | int32 | 3 | Intelligence | At low intelligence the AI picks among this many best options (plausible mistakes, not random ones). | |
Temperature at Max Intelligence (TemperatureAtMaxIntelligence) | float | 0.000000 | Intelligence | ||
Temperature at Min Intelligence (TemperatureAtMinIntelligence) | float | 12.000000 | Intelligence | Softmax temperature (in score points) at intelligence 0 and 1. Higher = more varied choices. | |
Item Use Penalty (ItemUsePenalty) | float | 4.000000 | Items | Value lost for using up a consumable (items are a limited resource; abilities are preferred when equal). | |
Last Item Penalty (LastItemPenalty) | float | 6.000000 | Items | Extra value lost for the team's last one of an item, at intelligence 1 (resource management). | |
Full Resonance Target Multiplier (FullResonanceTargetMultiplier) | float | 1.500000 | Pacts | Damage value multiplier against a unit with a full Resonance bar, at intelligence 1 (stop the summon). | |
Summon Damage Weight (SummonDamageWeight) | float | 0.600000 | Pacts | Extra value per point of damage the summon is expected to deal over its stay (times the profile's DamageWeight). Without it a strong attack always beats the flat SummonValue and the AI never summons. | |
Summon Target Multiplier (SummonTargetMultiplier) | float | 1.500000 | Pacts | Damage value multiplier against a summon, at intelligence 1 (defeating it early causes backlash). | |
Summon Value (SummonValue) | float | 60.000000 | Pacts | Value of calling a Pact summon onto the field (D-013). | |
Max Move Candidates (MaxMoveCandidates) | int32 | 40 | Performance | Most movement tiles evaluated per decision (closest to the action first). Bounds AI cost per turn. | |
Kill Threat Weight (KillThreatWeight) | float | 0.000000 | Statuses | Value per point of damage a defeated enemy would have dealt over the threat horizon, times the chance to defeat it. A defeat is worth the larger of this and the profile's flat Kill Bonus: finishing a dangerous enemy stays ahead of buffs at any level, while low-level battles keep the bonus. 0 (default) = off: the flat Kill Bonus only (the shipped content is balanced on it); raise it for an AI that hunts the most dangerous units. | |
Measured Status Stats (MeasuredStatusStats) | TArray<FGameplayTag> | (0 entries) | Statuses | Stats whose status modifiers the AI measures through the damage estimate. Modifiers on other stats (Speed, Action Points, custom stats), granted tags and affinities get the profile's flat Status Weight instead. Empty = the combat formulas' offense and defense stats, plus Stat.Accuracy and Stat.Evasion. | |
Protection Urgency Floor (ProtectionUrgencyFloor) | float | 1.000000 | Statuses | Share of the value of HP saved on an ally (damage prevented, regeneration, shields) when it is in no danger. It rises to 1 as the damage the ally expects over the threat horizon reaches its current HP: buffing a unit nobody can hurt is worth little. 1 (default) = off: the measured relevance and the shields' cap already follow the threat; lower it for an AI that saves its protection for the units in danger. | |
Status Full Value HPShare (StatusFullValueHPShare) | float | 0.200000 | Statuses | A status earns the profile's full Status Weight when what it changes over the threat horizon (damage prevented or added, HP restored or lost) reaches this share of its bearer's max HP; less earns proportionally less, and nothing (already there, nobody in reach, the wrong damage kind) earns nothing. A status never earns more than one Status Weight, so measured statuses keep the scale the profiles were tuned on. | |
Threat Horizon Rounds (ThreatHorizonRounds) | int32 | 3 | Statuses | Own turns the AI looks ahead when it measures threats: a status or a shield (the damage it would prevent or add against the units that can reach the bearer in that time) and a defeat (the damage the fallen unit will not deal). A status re-applied while it still covers these turns adds nothing. | |
Threat Round Discount (ThreatRoundDiscount) | float | 0.700000 | Statuses | Weight of each later turn of the threat horizon, relative to the turn before (later turns are less certain). | |
Combos (Combos) | TArray<FRSEAICombo> | (1 entries) | Team | Combos every AI team knows (setup status, then payoff element). Content tags: set them in the project's config. | |
Support Threat Decay (SupportThreatDecay) | float | 0.500000 | Team | How much of the remembered threat to a Support-role unit is kept at each own turn of that unit's team (0 = forget at once, 1 = never forget). The threat (per 10% of the Support's max HP lost) feeds the profiles' PunishThreatBonus. |
RPG Saga Engine: AI Debugger
Class URSEAIDebuggerSettings (module RSE), Project Settings, Project, RPG Saga Engine. The in-game AI debugger (D-056): for the unit that just decided, its best options with their score breakdown (a panel in every mode, labels on the grid tiles in Tactics).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Chosen Color (ChosenColor) | FLinearColor | (R=1.000000,G=0.850000,B=0.250000,A=1.000000) | Colors | ||
Forced Color (ForcedColor) | FLinearColor | (R=1.000000,G=0.450000,B=0.350000,A=1.000000) | Colors | ||
Option Color (OptionColor) | FLinearColor | (R=0.850000,G=0.900000,B=1.000000,A=1.000000) | Colors | ||
Term Color (TermColor) | FLinearColor | (R=0.600000,G=0.680000,B=0.800000,A=1.000000) | Colors | ||
Enabled (bEnabled) | bool | True | Debugger | Creates the debugger in game worlds (Development and Debug builds only). | |
Show Toggle Button (bShowToggleButton) | bool | True | Debugger | Shows the small "AI" toggle button during battles (otherwise only RSE.AI.Debug turns it on). | |
Widget Class (WidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Debugger | AI debugger panel (D-052). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEAIDebugViewModel (docs/product/custom-ui.md). | |
Panel Anchor (PanelAnchor) | FVector2D | (X=1.000000,Y=0.360000) | Layout | Where the options panel sits (normalized screen point). | |
Panel Width (PanelWidth) | float | 470.000000 | Layout | ||
Terms Per Option (TermsPerOption) | int32 | 4 | Layout | Score terms shown per option in the panel (largest first). | |
Toggle Anchor (ToggleAnchor) | FVector2D | (X=1.000000,Y=0.300000) | Layout | Where the toggle button sits (normalized screen point, its alignment follows). | |
ZOrder (ZOrder) | int32 | 15 | Layout | Viewport Z order (above the battle HUDs). | |
Tile Labels (bTileLabels) | bool | True | Tactics | Tactics: labels on the tiles of the shown options. | |
Tile Label Height (TileLabelHeight) | float | 40.000000 | Tactics | Tactics: label height above the tile. |
RPG Saga Engine: Ability Info
Class URSEAbilityInfoSettings (module RSECore), Project Settings, Project, RPG Saga Engine. How abilities are described and grouped in menus (D-147, docs/design/battle-menus.md): the role rules and their labels, and the groups the battle menus use when their config has none.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Collapse Tier Families (bCollapseTierFamilies) | bool | True | Menu Groups | Tier families show as one entry that opens its tiers. Off: every tier is an entry of its own. | |
Default Groupings (DefaultGroupings) | TArray<FRSEBattleMenuGrouping> | (2 entries) | Menu Groups | Groups of the battle menus whose config has none (spells by element, skills by role). | |
Add Derived to Own Roles (bAddDerivedToOwnRoles) | bool | False | Roles | Derived roles also join the ability's own role tags (off: own tags replace them). | |
Derive Roles (bDeriveRoles) | bool | True | Roles | Abilities without role tags of their own get the roles of the rules below (from their effects). | |
Max Shown Roles (MaxShownRoles) | int32 | 2 | Roles | Most role tags a tooltip lists. | |
Role Labels (RoleLabels) | TMap<FGameplayTag,FText> | (14 entries) | Roles | The short text of each role tag in menus ("Single-target damage"). A tag without a label shows its last part. | |
Role Rules (RoleRules) | TArray<FRSEAbilityRoleRule> | (18 entries) | Roles | Trait rules, in order: each matching rule adds its role. |
RPG Saga Engine: Ability Test
Class URSEAbilityTestSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Ability Test settings (D-167): who the Test ability button uses by default and the target presets it offers.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Caster Team (CasterTeam) | FGameplayTag | (TagName="Team.Player") | Ability Test | Teams of the caster's side and the other side in the mini battles. | |
Default Caster (DefaultCaster) | TSoftObjectPtr<URSEPrimaryDataAsset> | /RPGSagaEngine/Data/Characters/DA_Char_Kaela.DA_Char_Kaela | Ability Test | Who uses the ability when the test names nobody (a character or an archetype). | |
Default Level (DefaultLevel) | int32 | 10 | Ability Test | ||
Default Preset (DefaultPreset) | FName | OneEnemy | Ability Test | The preset used when the test names none (its Id). Empty = the first. | |
Default Runs (DefaultRuns) | int32 | 50 | Ability Test | ||
Grid Size (GridSize) | int32 | 13 | Ability Test | Size of the flat grid of the grid and live tests (tiles per side). | |
Max Runs (MaxRuns) | int32 | 1000 | Ability Test | Upper bound on runs per test (keeps the editor responsive). | |
Other Team (OtherTeam) | FGameplayTag | (TagName="Team.Enemy") | Ability Test | ||
Presets (Presets) | TArray<FRSEAbilityTestPreset> | (5 entries) | Ability Test | Target sets the test offers, in order. |
RPG Saga Engine: Ability Toolkit
Class URSEAbilityToolkitSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Rules of the Ability Toolkit v2 (D-055, docs/design/abilities-v2.md): reactions, taunts, leaps, zones, objects, captures.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Max Bonus Action Points (MaxBonusActionPoints) | int32 | 4 | Action Points | Most Action Points an effect can raise a unit to, above its turn-start amount. | |
AIAction Point Value (AIActionPointValue) | float | 4.000000 | AI | Value per Action Point given to an ally or taken from an enemy. | |
AICapture Value (AICaptureValue) | float | 30.000000 | AI | Value of capturing an enemy (times the chance). | |
AICounter Risk Weight (AICounterRiskWeight) | float | 1.000000 | AI | Weight of the counterattack an attack would provoke (times the profile's danger awareness). | |
AIDispel Value (AIDispelValue) | float | 8.000000 | AI | Value per buff removed from an enemy, or debuff removed from an ally. | |
AIDisplacement Value (AIDisplacementValue) | float | 1.000000 | AI | Value per tile an enemy is moved (knockback, pull, swap) besides the damage it causes. | |
AIResource Value (AIResourceValue) | float | 0.500000 | AI | Value per point of a resource other than HP taken from an enemy or given to an ally (MP, Rage...). | |
AIShield Weight (AIShieldWeight) | float | 0.800000 | AI | Value per point of shield given to an ally (times the profile's Heal weight). | |
AISteal Value (AIStealValue) | float | 8.000000 | AI | Value of stealing from an enemy (times the chance). | |
AITaunt Value (AITauntValue) | float | 10.000000 | AI | Value of taunting an enemy (times the chance). | |
AITurn Shift Value (AITurnShiftValue) | float | 20.000000 | AI | Value of a whole turn gained by an ally or taken from an enemy (turn manipulation). | |
AIZone Turns (AIZoneTurns) | float | 2.000000 | AI | Turns a unit is expected to stay in a zone (zone damage or healing per turn is multiplied by this). | |
Capture Needs Victory (bCaptureNeedsVictory) | bool | True | Capture | Captured units join only when the player's side wins (off: also after fleeing). | |
Can Target Objects (bCanTargetObjects) | bool | True | Field | Abilities aimed at enemies may target a tile holding a destructible object (barrels, walls). | |
One Zone Per Tile (bOneZonePerTile) | bool | True | Field | A new zone replaces older zones on the tiles it covers (off: zones stack and all trigger). | |
Max Chain Explosions (MaxChainExplosions) | int32 | 32 | Field | Guard against endless chain reactions: most objects that can explode from one hit. | |
Enemies Pay Item Costs (bEnemiesPayItemCosts) | bool | False | Item Costs | Units of teams other than the player's pay the Item Costs of their abilities (ammunition) from their team's items. Off (default): enemies use such abilities freely, since encounters rarely give them a pouch. | |
Max Leap Chain (MaxLeapChain) | int32 | 8 | Movement Effects | Upper bound on the hops of any leap chain (content asks for fewer). | |
Max Slide Tiles (MaxSlideTiles) | int32 | 3 | Movement Effects | A knocked-back unit that lands on a slippery tile keeps sliding up to this many extra tiles (per slippery tile entered). | |
Reactions in Classic Modes (bReactionsInClassicModes) | bool | True | Reactions | Reactions also work in ATB and turn-based battles (overwatch never does: nobody moves there). | |
Max Reaction Depth (MaxReactionDepth) | int32 | 1 | Reactions | How deep reactions may chain: 1 = a reaction never triggers another one (a counter is not countered). 0 = no reactions at all. | |
Taunt Forces Target (bTauntForcesTarget) | bool | False | Taunt | AI units under a taunt must aim at the taunter whenever one of their actions can reach it (off: they strongly prefer it). | |
Taunt Target Multiplier (TauntTargetMultiplier) | float | 3.000000 | Taunt | Score multiplier of AI options that hit the taunter (when the taunt does not force). |
RPG Saga Engine: Action AI
Class URSEActionAIRules (module RSECore), Project Settings, Project, RPG Saga Engine. Real-time AI of action battles (A2, D-171; docs/design/action-battle.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Stamina Reserve (StaminaReserve) | float | 25.000000 | Options | Stamina a unit keeps for dodging and guarding (scaled by the profile's Resource Management): attacks that dig into it score less. | |
Stamina Reserve Penalty (StaminaReservePenalty) | float | 10.000000 | Options | Score lost by an option that would dig into the stamina reserve (scaled by Resource Management). | |
Tank Intercept Weight (TankInterceptWeight) | float | 4.000000 | Options | Tank role: bonus (x the profile's Tank Interpose weight) for attacking an enemy whose attack is aimed at a fragile ally. | |
Travel Penalty Per Second (TravelPenaltyPerSecond) | float | 4.000000 | Options | Score lost per second of walking an option needs before it reaches its target. | |
Windup Penalty Per Second (WindupPenaltyPerSecond) | float | 3.000000 | Options | Score lost per second of windup (slow moves can be dodged, interrupted or wasted). | |
Default Party Order (DefaultPartyOrder) | ERSEActionPartyOrder | Free | Party | The order of party members the AI drives until a player orders otherwise (Options can change it per player). | |
Defend Radius (DefendRadius) | float | 4.000000 | Party | Defend Me: distance kept from the leader. | |
Follow Distance (FollowDistance) | float | 3.000000 | Party | Follow: distance kept from the leader. | |
Follow Engage Radius (FollowEngageRadius) | float | 8.000000 | Party | Follow: only enemies this close to the leader are fought. | |
Free Leash Distance (FreeLeashDistance) | float | 20.000000 | Party | Free: party members never wander farther than this from the leader (meters; 0 = no leash). | |
Hold Radius (HoldRadius) | float | 1.000000 | Party | Hold Position: how far from its spot the member may step. | |
Order Distance Weight (OrderDistanceWeight) | float | 8.000000 | Party | Score lost per meter a spot is beyond where the order wants the member (leader distance, hold spot). | |
Order Target Bonus (OrderTargetBonus) | float | 40.000000 | Party | Attack My Target / Defend Me: bonus for the target the order names (others lose half of it). | |
Party Intelligence (PartyIntelligence) | float | 0.700000 | Party | Intelligence of party members the AI drives when the driver gives none (0-1). | |
Approach Scale (ApproachScale) | float | 0.100000 | Positioning | Ranged units with an Approach weight close in: their wanted distance is divided by 1 + Approach Scale x the profile's Approach weight. | |
Area Margin (AreaMargin) | float | 2.000000 | Positioning | Bounded battles: spots closer than this to the edge of the combat area start losing score. | |
Area Penalty (AreaPenalty) | float | 20.000000 | Positioning | Score lost per meter inside the margin or outside the area. | |
Cover Weight (CoverWeight) | float | 3.000000 | Positioning | Cover-lite: bonus (x awareness) per ranged enemy whose line to the spot an obstacle blocks. | |
Crowding Weight (CrowdingWeight) | float | 3.000000 | Positioning | Score lost per meter of an ally inside the personal space. | |
Danger Scale (DangerScale) | float | 0.150000 | Positioning | Danger of a spot: score lost per point of the damage the enemies that reach it could deal (x the profile's Danger weight and awareness). | |
Flank Scale (FlankScale) | float | 0.500000 | Positioning | Flanking: bonus (x the profile's Flank weight and awareness) for a melee spot behind the target (full value straight behind). | |
Interpose Scale (InterposeScale) | float | 3.000000 | Positioning | Tank role: bonus (x the profile's Tank Interpose weight) for a spot on the line between a fragile ally and the enemy nearest it (fades out two tiles off the line). | |
Kite Tolerance (KiteTolerance) | float | 1.500000 | Positioning | Ranged units closer than their wanted distance minus this walk away first, and shoot once there (or cornered). | |
Melee Range Fraction (MeleeRangeFraction) | float | 0.750000 | Positioning | Melee units want to stand at this fraction of their reach. | |
Move Cost Weight (MoveCostWeight) | float | 0.400000 | Positioning | Score lost per meter walked (keeps units from dancing around between equal spots). | |
No Line Of Sight Penalty (NoLineOfSightPenalty) | float | 15.000000 | Positioning | A ranged unit loses this much at a spot with no line of sight to its target. | |
Personal Space (PersonalSpace) | float | 1.000000 | Positioning | Room allies want between each other (meters, edge to edge). | |
Position Directions (PositionDirections) | int32 | 12 | Positioning | Directions sampled around the unit when it picks where to stand (on each ring). | |
Position Rings (PositionRings) | int32 | 2 | Positioning | Rings of samples (at Reposition Distance divided evenly). | |
Ranged Range Fraction (RangedRangeFraction) | float | 0.600000 | Positioning | Ranged units (reach above Ranged Reach) want to stand at this fraction of their reach, unless the profile prefers a distance. | |
Ranged Reach (RangedReach) | float | 4.000000 | Positioning | An attack reaching farther than this is ranged (meters). | |
Range Weight (RangeWeight) | float | 3.000000 | Positioning | Score lost per meter between a spot's distance to the target and the distance the unit wants to fight at. | |
Reach Margin (ReachMargin) | float | 0.150000 | Positioning | Safety margin taken off every reach (meters): "in reach" then means inside the hitbox, not on its edge. | |
Reposition Before Attack (RepositionBeforeAttack) | float | 1.000000 | Positioning | Melee units already in reach still walk to their spot first (a flank, the Tank's line) when it is farther than this and keeps them in reach. | |
Reposition Distance (RepositionDistance) | float | 4.000000 | Positioning | Farthest sampled spot from the unit (meters). | |
Retreat Scale (RetreatScale) | float | 0.500000 | Positioning | Retreating (HP under the profile's Retreat HP Percent): bonus per meter from the nearest enemy (x the profile's Retreat weight). | |
Stop Distance (StopDistance) | float | 0.400000 | Positioning | The unit stops walking within this distance of the spot it picked. | |
Walk First Max Seconds (WalkFirstMaxSeconds) | float | 1.000000 | Positioning | Seconds a unit in reach may spend walking to a better spot (backing off, flanking) before it attacks from where it is. | |
Guard Hold Seconds (GuardHoldSeconds) | float | 0.150000 | Reactions | A guard raised against a telegraph is held this long after the attack's active time. | |
Parry Min Intelligence (ParryMinIntelligence) | float | 0.600000 | Reactions | Parries are tried only from this intelligence up (melee attacks, when the rules and the weapon allow it). | |
Parry Preference (ParryPreference) | float | 0.500000 | Reactions | Chance (x intelligence) to answer a parryable attack with a parry instead of a dodge or a block. | |
Projectile Horizon (ProjectileHorizon) | float | 1.000000 | Reactions | Projectiles arriving within this many seconds are answered. | |
React Chance at Max Intelligence (ReactChanceAtMaxIntelligence) | float | 0.900000 | Reactions | Chance to answer a telegraph at awareness 1. | |
React Chance at Min Intelligence (ReactChanceAtMinIntelligence) | float | 0.050000 | Reactions | Chance to answer a telegraph aimed at the unit at awareness 0 (the profile's Danger Awareness, which follows intelligence). | |
Reaction Jitter (ReactionJitter) | float | 0.080000 | Reactions | Random extra reaction time (up to this many seconds). | |
Reaction Time at Max Intelligence (ReactionTimeAtMaxIntelligence) | float | 0.100000 | Reactions | Seconds from seeing a telegraph to being able to answer it, at intelligence 1. | |
Reaction Time at Min Intelligence (ReactionTimeAtMinIntelligence) | float | 0.550000 | Reactions | Seconds from seeing a telegraph to being able to answer it, at intelligence 0. | |
Threat Slack (ThreatSlack) | float | 1.000000 | Reactions | Telegraphs this far beyond the attack's reach are still answered (meters; the attacker may step in). | |
Timing Error at Max Intelligence (TimingErrorAtMaxIntelligence) | float | 0.030000 | Reactions | Largest timing mistake at intelligence 1. | |
Timing Error at Min Intelligence (TimingErrorAtMinIntelligence) | float | 0.300000 | Reactions | Largest timing mistake of a dodge or parry at intelligence 0 (seconds early or late). | |
Safe Reload Distance (SafeReloadDistance) | float | 6.000000 | Resources | ||
Tactical Reload Below (TacticalReloadBelow) | float | 0.300000 | Resources | Reload when the magazine is below this fraction and no enemy is within Safe Reload Distance (smart units only: Resource Management above one half). | |
Consider Range (ConsiderRange) | float | 40.000000 | Thinking | Units farther than this are not considered as targets (meters, edge to edge). | |
Think Interval at Max Intelligence (ThinkIntervalAtMaxIntelligence) | float | 0.250000 | Thinking | Seconds between two decisions of a unit at intelligence 1. | |
Think Interval at Min Intelligence (ThinkIntervalAtMinIntelligence) | float | 0.600000 | Thinking | Seconds between two decisions of a unit at intelligence 0 (the slowest). Decisions are staggered across units. | |
Think Stagger Slots (ThinkStaggerSlots) | int32 | 5 | Thinking | Units are spread over this many offsets of the think interval, so a crowd never thinks on the same step. |
RPG Saga Engine: Action Battle
Class URSEActionRules (module RSECore), Project Settings, Project, RPG Saga Engine. Real-time action battles (D-171, docs/design/action-battle.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Weapon (DefaultWeapon) | TSoftObjectPtr<URSEActionWeaponData> | None | Combo | The weapon of units without one with action data (empty = the unit's basic attack with derived rules). | |
Input Buffer Seconds (InputBufferSeconds) | float | 0.150000 | Combo | An attack pressed this long before a combo window opens is kept and runs when it opens. | |
Active Time (ActiveTime) | float | 0.150000 | Derived Ability Rules | ||
Attack Stamina Cost (AttackStaminaCost) | float | 8.000000 | Derived Ability Rules | Stamina of a basic attack (Ability.Type.Attack). | |
Charge Time to Windup (ChargeTimeToWindup) | float | 0.500000 | Derived Ability Rules | Extra windup per second of the ability's ATB charge time. | |
Cooldown Base (CooldownBase) | float | 3.000000 | Derived Ability Rules | ||
Cooldown Per Cost (CooldownPerCost) | float | 0.150000 | Derived Ability Rules | Extra cooldown per point of resource cost (MP...). | |
Melee Arc Angle (MeleeArcAngle) | float | 120.000000 | Derived Ability Rules | ||
Melee Max Tiles (MeleeMaxTiles) | int32 | 1 | Derived Ability Rules | Hostile abilities with a Tactics range up to this many tiles are melee. | |
Melee Range (MeleeRange) | float | 2.200000 | Derived Ability Rules | ||
Poise Damage (PoiseDamage) | float | 20.000000 | Derived Ability Rules | ||
Projectile Speed (ProjectileSpeed) | float | 22.000000 | Derived Ability Rules | ||
Recovery (Recovery) | float | 0.450000 | Derived Ability Rules | ||
Tile Meters (TileMeters) | float | 1.500000 | Derived Ability Rules | Meters per Tactics tile when converting ranges and areas. | |
Windup (Windup) | float | 0.350000 | Derived Ability Rules | ||
Dodge Distance (DodgeDistance) | float | 4.000000 | Dodge | Distance covered by a dodge when the battle moves the units itself (headless; the presentation uses root motion). | |
Dodge Duration (DodgeDuration) | float | 0.500000 | Dodge | Length of the dodge (roll, dash, step). | |
Dodge Invulnerable Start (DodgeInvulnerableStart) | float | 0.030000 | Dodge | Seconds into the dodge when invulnerability (i-frames) starts. | |
Dodge Invulnerable Time (DodgeInvulnerableTime) | float | 0.300000 | Dodge | Seconds of invulnerability: hits in this window are dodged. | |
Dodge Stamina Cost (DodgeStaminaCost) | float | 25.000000 | Dodge | --- Dodge --- | |
Bounded Area Radius (BoundedAreaRadius) | float | 25.000000 | Framing | Bounded: radius of the combat area around its center (0 = no area). | |
Disengage Distance (DisengageDistance) | float | 30.000000 | Framing | Open: the party is this far from every enemy... | |
Disengage Seconds (DisengageSeconds) | float | 5.000000 | Framing | Open: ...for this long: the fight ends (fled). | |
Framing (Framing) | ERSEActionFraming | Bounded | Framing | Bounded (area, banner, results) or Open (no results screen; the fight fades out when the party gets away). | |
Leave Area Seconds (LeaveAreaSeconds) | float | 3.000000 | Framing | Bounded: seconds every party member must stay out of the area before it counts as fleeing (when fleeing is allowed). | |
Guard Enabled (bGuardEnabled) | bool | True | Guard | Units may block (hold guard). Weapons may also forbid it. | |
Block Angle (BlockAngle) | float | 140.000000 | Guard | Full angle in front of the unit that its guard covers (hits from behind go through). | |
Block Damage Multiplier (BlockDamageMultiplier) | float | 0.250000 | Guard | Damage taken through a block (multiplier; poise damage too). | |
Block Move Multiplier (BlockMoveMultiplier) | float | 0.500000 | Guard | Movement speed while guarding (multiplier). | |
Block Regen Multiplier (BlockRegenMultiplier) | float | 0.300000 | Guard | Stamina regeneration while guarding (multiplier). | |
Block Stamina Per Hit (BlockStaminaPerHit) | float | 10.000000 | Guard | Stamina each blocked hit drains. | |
Block Stamina Per Poise (BlockStaminaPerPoise) | float | 0.500000 | Guard | Extra stamina drained per point of the hit's poise damage. | |
Guard Break Stagger Seconds (GuardBreakStaggerSeconds) | float | 1.200000 | Guard | Stagger when a block runs out of stamina (the hit then lands in full). | |
Item Cooldown (ItemCooldown) | float | 1.000000 | Items | Seconds before the same unit can use another item. | |
Item Use Recovery (ItemUseRecovery) | float | 0.300000 | Items | ||
Item Use Windup (ItemUseWindup) | float | 0.600000 | Items | --- Items and party --- | |
Switch Character Cooldown (SwitchControlCooldown) | float | 1.000000 | Items | Seconds before the same player can switch character again. | |
Body Collision (bBodyCollision) | bool | True | Movement | Bodies do not overlap when the battle moves units itself (headless runs, the simulator): they push each other apart. | |
Default Unit Radius (DefaultUnitRadius) | float | 0.400000 | Movement | Radius of a unit without one (meters). | |
Move Speed (MoveSpeed) | float | 5.000000 | Movement | Walking speed when the battle moves units itself (headless runs, the simulator); the presentation moves pawns itself. | |
Move Speed Per Speed (MoveSpeedPerSpeed) | float | 0.000000 | Movement | Extra meters per second per point of Speed above Move Speed Reference Speed (0 = everyone walks alike). | |
Move Speed Reference Speed (MoveSpeedReferenceSpeed) | float | 10.000000 | Movement | ||
Claim Burst (ClaimBurst) | float | 16.000000 | Network | Anti-abuse (A6): claims a unit may make at once above the rate (a shotgun blast, a sweep through a crowd). | |
Hit Claim Angle Tolerance (HitClaimAngleTolerance) | float | 20.000000 | Network | A melee claim may be this many degrees outside the swing's arc (A6; boxes: Hit Claim Range Tolerance on the width). | |
Hit Claim Range Tolerance (HitClaimRangeTolerance) | float | 1.000000 | Network | A hit claim may be this much farther than the attack reaches. | |
Hit Claim Time Tolerance (HitClaimTimeTolerance) | float | 0.250000 | Network | A hit claim may be this many seconds outside the attack's active time (latency). | |
Impossible Reach Margin (ImpossibleReachMargin) | float | 4.000000 | Network | Anti-abuse (A6): a claim farther than the reach + Hit Claim Range Tolerance + this, at every rewound place, is impossible, not a latency miss; it is refused as Impossible Reach and logged. | |
Max Claims Per Second (MaxClaimsPerSecond) | float | 30.000000 | Network | Anti-abuse (A6): hit claims each unit may make per second (a token bucket; shotgun pellets count one each). | |
Max Rewind Seconds (MaxRewindSeconds) | float | 0.400000 | Network | A claim is checked against the places at its time, at most this far back (A6): an older claim is checked at Now minus this (high latency gets less help, never a free hit from long ago). Also limited by Position History Seconds. | |
Mirror Rate Hz (MirrorRateHz) | float | 15.000000 | Network | How often the host sends the battle's mirror (A6: a delta from the last state each guest acknowledged). | |
Position History Seconds (PositionHistorySeconds) | float | 0.500000 | Network | Seconds of position history the host keeps to check claims (lag compensation, A6): every unit's place at every step. | |
Predicted Dodge Confirm Seconds (PredictedDodgeConfirmSeconds) | float | 1.000000 | Network | Predicted dodge (A6): a guest's dodge the host has neither started nor refused after this long is undone. | |
Predicted Dodge Distance Tolerance (PredictedDodgeDistanceTolerance) | float | 0.750000 | Network | Predicted dodge (A6): how much farther than Dodge Distance (plus walking) a guest's dodge may go before the host corrects it. | |
Predicted Dodge Grace Seconds (PredictedDodgeGraceSeconds) | float | 0.250000 | Network | Predicted dodge (A6): the host takes the guest's own movement for the dodge's duration plus this much (latency), then checks how far it went (Dodge Distance + Predicted Dodge Distance Tolerance + walking). | |
Rewind Time Tolerance (RewindTimeTolerance) | float | 0.100000 | Network | The victim's places this much before and after the claim's time are tried too (interpolation delay and jitter, A6). | |
Ability Pacing (AbilityPacing) | ERSEActionAbilityPacing | Cooldown | Pacing | What pays for abilities: their cooldowns, a gauge filled by hits, or only their resource costs. | |
Gauge Max (GaugeMax) | float | 100.000000 | Pacing | ||
Gauge Per Hit Dealt (GaugePerHitDealt) | float | 8.000000 | Pacing | ||
Gauge Per Hit Taken (GaugePerHitTaken) | float | 4.000000 | Pacing | ||
Gauge Per Parry (GaugePerParry) | float | 15.000000 | Pacing | ||
Gauge Segments (GaugeSegments) | int32 | 4 | Pacing | Segments of the gauge (an ability's Gauge Cost counts segments). | |
Parry Enabled (bParryEnabled) | bool | True | Parry | Units may parry (a timed guard that staggers a melee attacker). Weapons may also forbid it. | |
Parry Angle (ParryAngle) | float | 120.000000 | Parry | Full angle in front of the unit that a parry covers. | |
Parry Recovery (ParryRecovery) | float | 0.400000 | Parry | Seconds after the window during which the unit cannot act (a missed parry is punishable). | |
Parry Stagger Seconds (ParryStaggerSeconds) | float | 1.500000 | Parry | Stagger of an attacker whose melee hit was parried. | |
Parry Stamina Cost (ParryStaminaCost) | float | 10.000000 | Parry | ||
Parry Window (ParryWindow) | float | 0.200000 | Parry | Seconds the parry window stays open. | |
Poise Max (PoiseMax) | float | 100.000000 | Poise | Poise of every unit: hits remove their poise damage; at 0 the unit staggers. | |
Poise Regen Delay (PoiseRegenDelay) | float | 1.500000 | Poise | Seconds after a hit before poise refills. | |
Poise Regen Per Second (PoiseRegenPerSecond) | float | 25.000000 | Poise | ||
Stagger Seconds (StaggerSeconds) | float | 1.000000 | Poise | Length of a poise-break stagger (poise refills at its end). | |
Sim Arena Radius (SimArenaRadius) | float | 18.000000 | Simulator | Radius of the simulated arena around the middle of the two lines (a Bounded combat area: the AI stays inside it, so nobody kites forever). 0 = the Bounded Area Radius. | |
Sim Cover Count (SimCoverCount) | int32 | 0 | Simulator | Round obstacles scattered between the two lines of a simulated battle (cover for shooters; 0 = an open field). | |
Sim Cover Radius (SimCoverRadius) | float | 0.800000 | Simulator | Radius of each simulated obstacle. | |
Sim Start Separation (SimStartSeparation) | float | 10.000000 | Simulator | Distance between the two sides at the start of a simulated battle. | |
Sim Unit Spacing (SimUnitSpacing) | float | 2.000000 | Simulator | Distance between units of the same side at the start. | |
Stamina Max (StaminaMax) | float | 100.000000 | Stamina | --- Stamina --- | |
Stamina Regen Delay (StaminaRegenDelay) | float | 0.800000 | Stamina | Seconds after spending stamina before it refills. | |
Stamina Regen Per Second (StaminaRegenPerSecond) | float | 35.000000 | Stamina | ||
Aim Assist Angle (AimAssistAngle) | float | 10.000000 | Targeting | Presentation: aim assist cone (full angle). | |
Aim Assist Strength (AimAssistStrength) | float | 0.300000 | Targeting | Presentation: how strongly the aim is pulled toward targets (0 = none, 1 = snaps). | |
Friendly Fire (bFriendlyFire) | bool | False | Targeting | Hostile hits also hurt the user's allies (never the user). | |
Lock on Range (LockOnRange) | float | 20.000000 | Targeting | Farthest a lock-on target may be. | |
Seconds Per Turn (SecondsPerTurn) | float | 5.000000 | Time | One "turn" of a unit in seconds: status durations, periodic damage, summon durations and per-turn regeneration count on this clock. | |
Step Seconds (StepSeconds) | float | 0.033333 | Time | Fixed simulation step: the battle always advances in steps of this length, so a seed replays exactly. |
RPG Saga Engine: Action Battle (Presentation)
Class URSEActionPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. The presentation of real-time action battles (D-171, package A3; docs/design/action-battle.md "Presentation"): how an encounter starts in place from exploration, the camera, the controls, the hits from animations, traces and projectile actors, the combat feel (hit-stop, shake, afterimages), the HUD....
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Aim Camera (AimCamera) | FRSEActionCameraProfile | (Distance=250.000000,PivotOffset=(X=0.000000,Y=0.000000,Z=160.000000),ShoulderOffset=75.000000,FieldOfView=70.000000,LagSpeed=25.000000) | Camera | Over the shoulder while aiming. | |
Action Camera (bActionCamera) | bool | True | Camera | The action camera follows the controlled character (off: the pawn's own camera stays, e.g. a project's own rig). | |
Camera Blend Seconds (CameraBlendSeconds) | float | 0.450000 | Camera | Seconds of the blend into the action camera and back. | |
Collision Radius (CollisionRadius) | float | 14.000000 | Camera | The camera stays this far from walls (sphere probe radius, cm). | |
Combat Camera (CombatCamera) | FRSEActionCameraProfile | (Distance=420.000000,PivotOffset=(X=0.000000,Y=0.000000,Z=150.000000),FieldOfView=85.000000,LagSpeed=12.000000) | Camera | ||
Gamepad Look Speed (GamepadLookSpeed) | float | 200.000000 | Camera | Gamepad look at full stick (degrees per second). | |
Lock on Camera (LockOnCamera) | FRSEActionCameraProfile | (Distance=470.000000,PivotOffset=(X=0.000000,Y=0.000000,Z=165.000000),ShoulderOffset=35.000000,FieldOfView=80.000000,LagSpeed=10.000000) | Camera | While locked on a target. | |
Lock on Turn Speed (LockOnTurnSpeed) | float | 7.000000 | Camera | How fast the view turns to a hard-locked target. | |
Mouse Look Speed (MouseLookSpeed) | float | 0.180000 | Camera | Mouse look (degrees per mouse unit). | |
Pitch Max (PitchMax) | float | 40.000000 | Camera | ||
Pitch Min (PitchMin) | float | -60.000000 | Camera | ||
Profile Blend Speed (ProfileBlendSpeed) | float | 9.000000 | Camera | How fast a profile change blends (per second). | |
Start Pitch (StartPitch) | float | -15.000000 | Camera | Starting pitch of the action camera (negative = looking down). | |
Afterimage Count (AfterimageCount) | int32 | 3 | Feel | ||
Afterimage Fade Seconds (AfterimageFadeSeconds) | float | 0.300000 | Feel | ||
Afterimage Interval (AfterimageInterval) | float | 0.060000 | Feel | ||
Afterimage Material (AfterimageMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Feel/M_RSE_FXGlow.M_RSE_FXGlow | Feel | Translucent material of the afterimages (empty = none). | |
Dodge Afterimages (bDodgeAfterimages) | bool | True | Feel | Afterimages behind a dodging character (needs Afterimage Material). | |
Finishers (bFinishers) | bool | True | Feel | A finisher may play on a kill by this machine's player (Paired Animations, Options -> Finishers; D-172). | |
Block Burst (BlockBurst) | TSoftObjectPtr<UNiagaraSystem> | None | Feel | ||
Dodge Reconcile Max Error (DodgeReconcileMaxError) | float | 150.000000 | Feel | Co-op (A6): corrections larger than this snap at once (cm; a teleport is not smoothed). | |
Dodge Reconcile Min Error (DodgeReconcileMinError) | float | 8.000000 | Feel | Co-op (A6): corrections smaller than this are ordinary movement noise (cm). | |
Dodge Reconcile Seconds (DodgeReconcileSeconds) | float | 0.150000 | Feel | Co-op (A6): after a guest's predicted dodge, a correction of its character's place by the host is hidden: the mesh keeps its place and slides to the corrected one over this many seconds (0 = snap). | |
Dodge Reconcile Watch Seconds (DodgeReconcileWatchSeconds) | float | 0.600000 | Feel | Co-op (A6): how long after a predicted dodge ends corrections are still smoothed (seconds). | |
Heavy Hit Poise (HeavyHitPoise) | float | 30.000000 | Feel | A hit that removes at least this much poise counts as heavy (longer hit-stop, stronger shake). | |
Heavy Hit Stop Seconds (HeavyHitStopSeconds) | float | 0.120000 | Feel | Hit-stop of a heavy hit (a heavy combo step, a stagger, a parry). | |
Hit Burst (HitBurst) | TSoftObjectPtr<UNiagaraSystem> | None | Feel | Bursts at the hit location (optional, tinted by "User.Color"). | |
Hit Camera Shake (HitCameraShake) | TSoftClassPtr<UCameraShakeBase> | None | Feel | A camera shake asset played with the procedural one (optional; scaled by the trauma). | |
Hit Stop Dilation (HitStopDilation) | float | 0.030000 | Feel | How slow the two actors run during the hit-stop (their time dilation). | |
Hit Stop Seconds (HitStopSeconds) | float | 0.060000 | Feel | Hit-stop: both actors of a landed hit freeze briefly (their own time only, never the world's: co-op safe, D-134). | |
Muzzle Flash (MuzzleFlash) | TSoftObjectPtr<UNiagaraSystem> | /RPGSagaEngine/Visual/Weapons/NS_RSE_MuzzleFlash.NS_RSE_MuzzleFlash | Feel | Muzzle flash of shooters whose weapon presentation has none (D-184). | |
Parry Burst (ParryBurst) | TSoftObjectPtr<UNiagaraSystem> | None | Feel | ||
Shake Amplitude (ShakeAmplitude) | float | 7.000000 | Feel | Largest shake offset at full trauma (cm). | |
Shake Decay (ShakeDecay) | float | 1.800000 | Feel | Trauma lost per second. | |
Shake Frequency (ShakeFrequency) | float | 22.000000 | Feel | ||
Shake on Heavy (ShakeOnHeavy) | float | 0.600000 | Feel | ...on a heavy hit, a stagger or a guard break near the local player. | |
Shake on Hit Dealt (ShakeOnHitDealt) | float | 0.220000 | Feel | Camera shake (0..1 trauma) when the local player's hit lands. | |
Shake on Hit Taken (ShakeOnHitTaken) | float | 0.450000 | Feel | ...when the local player's character is hit. | |
Shake Rotation (ShakeRotation) | float | 1.400000 | Feel | Largest shake rotation at full trauma (degrees). | |
Shot Color (ShotColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.054299,Chroma=0.801492,Hue=12.070757,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Feel | Color of tracers, projectiles and flashes without their own. | |
Area Ring Spread Seconds (AreaRingSpreadSeconds) | float | 0.700000 | Flow | Seconds the ring takes to spread to the area's edge. | |
Banner Seconds (BannerSeconds) | float | 1.600000 | Flow | ||
Banner Text (BannerText) | FText | NSLOCTEXT("RSEActionPresentationSettings", "Banner", "{Name}") | Flow | The banner when a Bounded battle starts ({Name} = the encounter's name; empty = no banner). | |
Bounded Results Screen (bBoundedResultsScreen) | bool | True | Flow | Bounded battles end on the results screen (off: the reward feed, as Open battles). | |
Open Loot Toasts (bOpenLootToasts) | bool | True | Flow | Open battles: the spoils as toasts of the reward feed (D-128). | |
Show Area Ring (bShowAreaRing) | bool | True | Flow | Bounded battles: the combat area's ring on the ground. | |
Director Class (DirectorClass) | TSoftClassPtr<ARSEActionBattleDirector> | None | Flow | The presenter spawned for each battle (a Blueprint child may add its own reactions). Empty = ARSEActionBattleDirector. | |
Enemy Spawn Distance (EnemySpawnDistance) | float | 900.000000 | Flow | Enemies without a world actor appear this far in front of the leader (cm). | |
Enemy Spawn Spread (EnemySpawnSpread) | float | 250.000000 | Flow | ...spread around that point (cm). | |
Entry Sound (EntrySound) | TSoftObjectPtr<USoundBase> | None | Flow | ||
Escape Text (EscapeText) | FText | NSLOCTEXT("RSEActionPresentationSettings", "Escape", "You got away.") | Flow | Shown when the party got away (empty = nothing). | |
Party Join Radius (PartyJoinRadius) | float | 2000.000000 | Flow | Party members within this distance of the leader fight from where they stand (cm). | |
Aim Height (AimHeight) | float | 100.000000 | Hits | The AI aims at this height above its target's feet (cm). | |
Melee Height Reach (MeleeHeightReach) | float | 220.000000 | Hits | Melee: units within this height of the attacker's feet can be hit (cm). | |
Projectile Class (ProjectileClass) | TSoftClassPtr<ARSEActionProjectileActor> | None | Hits | The projectile actor (a Blueprint child may add its own mesh, trail and impact). Empty = ARSEActionProjectileActor. | |
Projectile Material (ProjectileMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Feel/M_RSE_FXGlow.M_RSE_FXGlow | Hits | ||
Projectile Mesh (ProjectileMesh) | TSoftObjectPtr<UStaticMesh> | /RPGSagaEngine/Visual/Weapons/SM_RSE_ProjectileCore.SM_RSE_ProjectileCore | Hits | ||
Projectile Visual Size (ProjectileVisualSize) | float | 24.000000 | Hits | Size of the default projectile's ball (cm, diameter; the collision is the ability's radius). | |
Shot Height (ShotHeight) | float | 130.000000 | Hits | Shots of characters without a muzzle socket start this high above their feet (cm). | |
Weapon Visuals (WeaponVisuals) | TArray<FRSEActionWeaponVisual> | (3 entries) | Hits | How weapons look in the hand (each action weapon may have one). | |
World Trace Channel (WorldTraceChannel) | TEnumAsByte<ECollisionChannel> | ECC_Visibility | Hits | Channel of the hitscan and projectile traces that stop on the world (walls, props). | |
Crosshair Only While Aiming (bCrosshairOnlyWhileAiming) | bool | False | HUD | The crosshair shows only while aiming (off: always for weapons that shoot). | |
Damage Numbers (bDamageNumbers) | bool | True | HUD | Floating damage numbers over the units. | |
Crosshair Color (CrosshairColor) | FRSEUIColor | (Token="Text",Alpha=0.900000,Lightness=0.006294,Chroma=0.000012,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | HUD | ||
Crosshair Size (CrosshairSize) | float | 30.000000 | HUD | Size of the crosshair (layout units). | |
Gauge Color (GaugeColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=-0.075148,Chroma=1.599149,Hue=95.683128,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | HUD | ||
Gauge Width (GaugeWidth) | float | 300.000000 | HUD | Width of the main gauges of the controlled character (layout units). | |
HUDClass (HUDClass) | TSoftClassPtr<URSEActionHUDWidget> | None | HUD | The action HUD (a C++ or Blueprint child of RSE Action HUD Widget). Empty = URSEActionHUDWidget. | |
Layout (Layout) | ERSEActionHUDLayoutChoice | Auto | HUD | ||
Lock Marker Color (LockMarkerColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.020204,Chroma=1.123482,Hue=0.300643,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | HUD | ||
Lock Marker Size (LockMarkerSize) | float | 44.000000 | HUD | Size of the lock-on marker (layout units). | |
Poise Color (PoiseColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.035043,Chroma=0.961372,Hue=10.526348,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | HUD | ||
Stamina Color (StaminaColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Lightness=-0.033025,Chroma=0.865333,Hue=-11.323245,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | HUD | ||
Ability Keys (AbilityKeys) | TArray<FKey> | (2 entries) | Input | Use the selected ability. | |
Aim Keys (AimKeys) | TArray<FKey> | (2 entries) | Input | Hold: over the shoulder (weapons that shoot), guard (melee weapons). | |
Dodge Keys (DodgeKeys) | TArray<FKey> | (2 entries) | Input | ||
Fire Mode Keys (FireModeKeys) | TArray<FKey> | (2 entries) | Input | Next fire mode. | |
Guard Keys (GuardKeys) | TArray<FKey> | (2 entries) | Input | Hold to guard. | |
Heavy Attack Keys (HeavyAttackKeys) | TArray<FKey> | (2 entries) | Input | ||
Input Priority (InputPriority) | int32 | 6 | Input | Priority of the action context: above exploration, so its keys win for the battle (the exploration context stays for walking and its other keys wait). | |
Item Keys (ItemKeys) | TArray<FKey> | (2 entries) | Input | Use the first healing item the party carries. | |
Light Attack Keys (LightAttackKeys) | TArray<FKey> | (2 entries) | Input | ||
Lock on Keys (LockOnKeys) | TArray<FKey> | (2 entries) | Input | Hard lock on / off. | |
Look Keys (LookKeys) | TArray<FKey> | (2 entries) | Input | The view (2D axis keys: the mouse, the right stick). | |
Mapping Context (MappingContext) | TSoftObjectPtr<UInputMappingContext> | None | Input | A mapping context asset of your own (its actions are named in the fields below by the keys' order); empty = built from the keys. | |
Next Ability Keys (NextAbilityKeys) | TArray<FKey> | (2 entries) | Input | Select the next ability. | |
Next Target Keys (NextTargetKeys) | TArray<FKey> | (2 entries) | Input | Next target (an axis key's sign picks the side: the mouse wheel). | |
Parry Keys (ParryKeys) | TArray<FKey> | (2 entries) | Input | ||
Previous Target Keys (PreviousTargetKeys) | TArray<FKey> | (2 entries) | Input | ||
Reload Keys (ReloadKeys) | TArray<FKey> | (2 entries) | Input | ||
Stick Deadzone (StickDeadzone) | float | 0.200000 | Input | Gamepad stick deadzone of the look and target switch. | |
Switch Character Keys (SwitchCharacterKeys) | TArray<FKey> | (2 entries) | Input | Take command of the next party member. | |
Party Order Bindings (PartyOrderBindings) | TArray<FRSEActionPartyOrderBinding> | (5 entries) | Input|Party Orders | Direct party orders: each binding's keys give the whole party its order (one input action per binding, listed in the Controls page). | |
Party Order Cycle (PartyOrderCycle) | TArray<ERSEActionPartyOrder> | (5 entries) | Input|Party Orders | The orders Party Order Keys cycles through, in this order (empty = every order). | |
Party Order Keys (PartyOrderKeys) | TArray<FKey> | (2 entries) | Input|Party Orders | Party orders (A2): gives the whole party the next order of Party Order Cycle (the members the AI drives). | |
Aim Trace Range (AimTraceRange) | float | 8000.000000 | Targeting | Farthest an aimed shot looks for what it hits (cm). | |
Aim Turn Speed (AimTurnSpeed) | float | 900.000000 | Targeting | The character turns to the view while aiming (degrees per second). | |
Soft Lock Angle (SoftLockAngle) | float | 55.000000 | Targeting | Soft lock: attacks without a hard lock turn toward the enemy nearest the view within this angle. | |
Soft Lock Range (SoftLockRange) | float | 0.000000 | Targeting | Soft lock reach (cm; 0 = the rules' Lock On Range). | |
Switch Target Cooldown (SwitchTargetCooldown) | float | 0.250000 | Targeting | Seconds between two target switches. |
RPG Saga Engine: Action Commands
Class URSEActionCommandSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Global rules of action commands.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Defense Enabled (bDefenseEnabled) | bool | True | Defense | Player units may block instant enemy attacks with a timed press (damage reduction). | |
Block Good Damage Multiplier (BlockGoodDamageMultiplier) | float | 0.750000 | Defense | ||
Block Miss Damage Multiplier (BlockMissDamageMultiplier) | float | 1.000000 | Defense | Damage taken multiplier per block grade. | |
Block Perfect Damage Multiplier (BlockPerfectDamageMultiplier) | float | 0.500000 | Defense | ||
Block Required Tag (BlockRequiredTag) | FGameplayTag | (TagName="Equip.Type.Shield") | Defense | Only units with this granted tag can block (prompt and damage reduction). Worn equipment grants its Equip.Type tag, so the default Equip.Type.Shield means "a shield is equipped"; a trait tag works too. Empty = anyone. | |
Block Window Max Seconds (BlockWindowMaxSeconds) | float | 1.000000 | Defense | The block window never lasts longer than this (real seconds, from the prompt to the end of its Good tolerance). The battle does not stop meanwhile: the attack plays on in slow motion (Battle Presentation). | |
Default Defense Grade (DefaultDefenseGrade) | ERSEExecutionQuality | Unset | Defense | Grade used when nobody blocks (AI defenders, headless). Unset = no block. | |
Defense Input (DefenseInput) | ERSEActionCommandInput | Block | Defense | The input that blocks (D-066: Block, a key and button of its own, so Enter / A never go to a block prompt while the player is in the command menu). Confirm / Cancel / Any share the menu's keys (the old behavior). | |
Defense Window (DefenseWindow) | FRSEActionCommandWindow | (Time=0.550000,GoodTolerance=0.120000,PerfectTolerance=0.040000) | Defense | ||
Enabled (bEnabled) | bool | True | Offense | Off: no prompts are shown; every command uses DefaultGrade (accessibility option). | |
Default Grade (DefaultGrade) | ERSEExecutionQuality | Good | Offense | Grade used without a player's press: AI, auto-play, headless simulations, commands turned off. | |
Default Window (DefaultWindow) | FRSEActionCommandWindow | (Time=0.600000,GoodTolerance=0.120000,PerfectTolerance=0.040000) | Offense | Window of abilities with a command but no windows of their own. | |
Good Bonus (GoodBonus) | FRSEExecutionBonus | (DamageMultiplier=1.000000,HealMultiplier=1.000000) | Offense | ||
Miss Bonus (MissBonus) | FRSEExecutionBonus | (DamageMultiplier=0.750000,HealMultiplier=0.750000) | Offense | ||
Perfect Bonus (PerfectBonus) | FRSEExecutionBonus | (DamageMultiplier=1.300000,HealMultiplier=1.250000) | Offense | ||
Default Player Mode (DefaultPlayerMode) | ERSEActionCommandPlayerMode | All | Player Option | Player option used until the player picks one (Options menu / RSE.ActionCommand.PlayerMode). |
RPG Saga Engine: Animation & FX Library
Class URSEAnimLibrarySettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Animation & FX Library settings (D-087): Project Settings -> RPG Saga Engine -> Animation & FX Library.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Impact Fraction (DefaultImpactFraction) | float | 0.450000 | Dress My Abilities | ||
Impact Notifies (ImpactNotifies) | TArray<FRSEPackNamePattern> | (1 entries) | Dress My Abilities | Montages built for dressed abilities: notifies that mark the hit frame (else Default Impact Fraction). | |
Max Attack Combo (MaxAttackCombo) | int32 | 3 | Dress My Abilities | Clips of a style's attack combo given to a character's Attack Presentations. | |
Library Asset Name (LibraryAssetName) | FString | DA_AnimLibrary | Output | Name of the library asset in the Library Folder. | |
Library Folder (LibraryFolder) | FDirectoryPath | (set per project) | Output | Project folder of the library asset, the styles, the retargeted clips and the dressed looks. Project content only. | |
Borrowed Clips in Place (bBorrowedClipsInPlace) | bool | True | Retargeting | Retargeted clips play in place (root locked): battle presentations do the travelling. | |
Strip Borrowed Effect Notifies (bStripBorrowedEffectNotifies) | bool | True | Retargeting | Retargeted clips lose their particle and trail notifies (effects of another pack's look). Sounds stay. | |
FXTaxonomy (FXTaxonomy) | TSoftObjectPtr<URSEFXTaxonomy> | /RPGSagaEngine/Data/AnimLibrary/DA_FXTaxonomy_Default.DA_FXTaxonomy_Default | Taxonomy | How effects and sounds are classified, and the Dress My Abilities rules. | |
Taxonomy (Taxonomy) | TSoftObjectPtr<URSEAnimTaxonomy> | /RPGSagaEngine/Data/AnimLibrary/DA_AnimTaxonomy_Default.DA_AnimTaxonomy_Default | Taxonomy | How animations are classified (categories, words, slots). The plugin's generic taxonomy fits most packs. | |
Thumbnail Pool Size (ThumbnailPoolSize) | int32 | 128 | Window | Rows of the library window loaded with thumbnails at once (0 = no thumbnails). | |
Thumbnail Size (ThumbnailSize) | int32 | 48 | Window | Thumbnail size in the library window (pixels). |
RPG Saga Engine: Attributes
Class URSEAttributeSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Which attribute registry a game uses (D-054, docs/design/attributes.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Registry (Registry) | TSoftObjectPtr<URSEAttributeRegistry> | None | Attributes | Attribute and resource definitions. Empty = the framework's built-in definitions (HP, MP, Resonance and the standard stats), which reproduce the default rules exactly. |
RPG Saga Engine: Audio
Class URSEAudioSettings (module RSE), Project Settings, Project, RPG Saga Engine. Audio (D-036, docs/design/audio.md): music per context and map, the sound catalog and the mixer.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Channels (Channels) | TMap<ERSEAudioChannel,FRSEAudioChannelSetup> | (5 entries) | Mixer | Engine route and default volume of each channel. Channels without a route get their volume as a gain on the sounds RSE plays. | |
Volume Change Fade Time (VolumeChangeFadeTime) | float | 0.100000 | Mixer | Fade of sound class volume changes. | |
Volume Mix (VolumeMix) | TSoftObjectPtr<USoundMix> | None | Mixer | Sound mix pushed at startup; the channels' sound classes get their volumes through it. Needed only for sound class routes. | |
Area Music Check Interval (AreaMusicCheckInterval) | float | 0.500000 | Music | How often the explorer's area is checked for area-volume music (only on maps that have such volumes). | |
Music Plays when Paused (bMusicPlaysWhenPaused) | bool | True | Music | Music keeps playing while the game is paused (menus). | |
Resume Covered Music (bResumeCoveredMusic) | bool | True | Music | A track that comes back after being covered (area music after a battle) continues where it was, if its length is known. | |
Context Music (ContextMusic) | TMap<ERSEMusicContext,FRSEMusicTrack> | (5 entries) | Music | Default track of each context. A context without a track plays silence (Dialog: dialogs keep the current music). | |
Default Fade In (DefaultFadeIn) | float | 1.000000 | Music | Fade-in of tracks that do not set their own. | |
Default Fade Out (DefaultFadeOut) | float | 1.000000 | Music | Fade-out of the replaced music when the incoming track does not set its own. | |
Map Music (MapMusic) | TMap<TSoftObjectPtr<UWorld> ,FRSEMusicTrack> | (0 entries) | Music | Exploration music of a map, used outside area volumes with music. Maps not listed use ContextMusic[Exploration]. | |
Preload Catalog (bPreloadCatalog) | bool | True | Sound Effects | Loads every catalog sound when the game starts (no delay on the first play). Off: each sound loads on first use. | |
Min Retrigger Time (MinRetriggerTime) | float | 0.040000 | Sound Effects | The same tag does not play again within this time (a menu rebuilt twice in a frame, a hit on many targets). | |
Sound Catalog (SoundCatalog) | TSoftObjectPtr<URSESoundCatalog> | None | Sound Effects | The sound library: GameplayTag -> sound (Audio.UI., Audio.Battle., Audio.World.*). Empty = silent. | |
Battle Event Sounds (BattleEventSounds) | TMap<ERSEBattleEventType,FGameplayTag> | (6 entries) | Sound Effects|Battle | Sound of each presented battle event type. | |
Battle Event Sounds (bBattleEventSounds) | bool | True | Sound Effects|Battle | Presented battle events play catalog sounds (hit, miss, heal, KO, summon). Off when presentation assets play their own. | |
Block Sound (BlockSound) | FGameplayTag | (TagName="Audio.Battle.Block") | Sound Effects|Battle | A defensive command that was not a Miss. | |
Critical Hit Sound (CriticalHitSound) | FGameplayTag | (TagName="Audio.Battle.Crit") | Sound Effects|Battle | Played instead of the DamageDealt sound for critical hits. | |
Perfect Sound (PerfectSound) | FGameplayTag | (TagName="Audio.Battle.Perfect") | Sound Effects|Battle | A Perfect action command grade. |
RPG Saga Engine: Balance
Class URSEBalanceSettings (module RSECore), Project Settings, Project, RPG Saga Engine. "Balance My Campaign" (D-077, docs/product/balance-tool.md): the target bands per kind of battle, the party levels the scenarios use, the knobs the proposals may turn and how long the search runs.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Check Ability Cliffs (bCheckAbilityCliffs) | bool | True | Bands | Flag enemy abilities that unlock strictly inside a zone's level range (a difficulty cliff, D-068). | |
Check One Shots (bCheckOneShots) | bool | True | Bands | Check the D-066 rule: no enemy takes a full-HP party member down with one normal hit. | |
Boss Win Rate (%) (BossWinRate) | FRSEProgressionBand | (Min=30.000000,Max=60.000000) | Bands | ||
Use Campaign Turn Bands (bUseCampaignTurnBands) | bool | False | Bands | Party turns per battle from the campaign's targets (TurnsPerBattle for normal / elite, KeyBattleTurns for the others). Off by default: those are zone medians over every mode, and a Tactics battle counts many more unit turns than an ATB one. | |
Class Swing Threshold (ClassSwingThreshold) | float | 20.000000 | Bands | A class is an outlier when parties with it win this many points more or less than parties without it. | |
Elite Win Rate (%) (EliteWinRate) | FRSEProgressionBand | (Min=55.000000,Max=80.000000) | Bands | ||
Key Turns (KeyTurns) | FRSEProgressionBand | (Min=8.000000,Max=96.000000) | Bands | Party turns of key, boss and ultra battles (~24 rounds of a party of four). | |
Key Battle Win Rate (%) (KeyWinRate) | FRSEProgressionBand | (Min=60.000000,Max=85.000000) | Bands | ||
Max Timeout Rate (MaxTimeoutRate) | float | 5.000000 | Bands | Highest acceptable share of battles stopped by the simulator's guard (percent). | |
Normal Win Rate (%) (NormalWinRate) | FRSEProgressionBand | (Min=75.000000,Max=95.000000) | Bands | --- Win-rate bands (percent of battles won by the standard party) --- | |
Regular Turns (RegularTurns) | FRSEProgressionBand | (Min=4.000000,Max=48.000000) | Bands | Party turns (every party unit's turns together) of normal and elite battles. The default allows ~12 rounds of a party of four. | |
Ultra Boss Win Rate (%) (UltraWinRate) | FRSEProgressionBand | (Min=30.000000,Max=60.000000) | Bands | ||
Tune Enemy Count (bTuneEnemyCount) | bool | True | Knobs | Try one enemy more or less. | |
Class Growth Steps (ClassGrowthSteps) | TArray<float> | (3 entries) | Knobs | Class growth steps (percent on the PerLevel of the Progression Designer's vitality and power stats). | |
Class Probe Scenarios (ClassProbeScenarios) | int32 | 6 | Knobs | Alternative-party scenarios a class candidate is measured on. | |
Enemy Count Cost (EnemyCountCost) | float | 3.000000 | Knobs | ||
Enemy Stat Cost (EnemyStatCost) | float | 2.000000 | Knobs | ||
Enemy Stat Steps (EnemyStatSteps) | TArray<float> | (3 entries) | Knobs | Enemy family steps (percent on the enemy's HP and offense), when no encounter knob lands in the band. | |
Intelligence Cost (IntelligenceCost) | float | 1.500000 | Knobs | ||
Intelligence Steps (IntelligenceSteps) | TArray<float> | (2 entries) | Knobs | Intelligence floors (harder) / caps (easier) tried, as steps from the encounter's current bounds. | |
Level Cost (LevelCost) | float | 1.000000 | Knobs | Cost of a change when choosing between candidates that land in the band (per level, per step, per enemy, per 10%). | |
Max Level Step (MaxLevelStep) | int32 | 3 | Knobs | Largest level step tried on an encounter (offset or fixed level). | |
Min Improvement (MinImprovement) | float | 0.400000 | Knobs | A candidate that does not land in the band is kept only if it removes at least this share of the score. | |
One Shot Steps (OneShotSteps) | TArray<float> | (4 entries) | Knobs | Offense steps (percent) tried against a one-shot. | |
Turn Weight (TurnWeight) | float | 2.000000 | Knobs | Score points per party turn outside the turn band (win-rate points count 1 each). | |
Alternative Party Kinds (AlternativePartyKinds) | TArray<ERSEEncounterBalanceRole> | (1 entries) | Party Levels | Alternative parties play these kinds of battle (their other flags would repeat the standard party's). | |
Boss Level (BossLevel) | FRSEBalanceLevelRule | (Fraction=1.000000) | Party Levels | Bosses: the zone's exit level. | |
Elite Level (EliteLevel) | FRSEBalanceLevelRule | (Fraction=0.500000) | Party Levels | ||
Key Level (KeyLevel) | FRSEBalanceLevelRule | (Fraction=0.500000,Rounding=Up) | Party Levels | Key battles: halfway through the zone, rounded up. | |
Normal Level (NormalLevel) | FRSEBalanceLevelRule | (Fraction=0.500000) | Party Levels | Normal battles: halfway through the zone's target levels, rounded down (the D-068 scenarios). | |
Ultra Level (UltraLevel) | FRSEBalanceLevelRule | (Source=OptionalTarget,Fraction=1.000000) | Party Levels | Ultra bosses: the recommended level of the campaign's optional content. | |
Report Folder (ReportFolder) | FString | Balance | Report | Reports go to <Project>/Saved/<ReportFolder>/<timestamp>_<campaign>/ (report.md, report.json). | |
Max Iterations (MaxIterations) | int32 | 3 | Simulation | ||
Runs (Runs) | int32 | 40 | Simulation | Battles per scenario (seeds Seed .. Seed + Runs - 1). | |
Runs Per Slice (RunsPerSlice) | int32 | 5 | Simulation | Battles per time slice (the editor window stays responsive between slices). | |
Search Runs (SearchRuns) | int32 | 20 | Simulation | Battles per candidate while searching (the first seeds of the scenario); accepted changes are re-measured with Runs. | |
Slice Milliseconds (SliceMilliseconds) | float | 40.000000 | Simulation | Time the editor window gives the job per frame. | |
Time Budget Seconds (TimeBudgetSeconds) | float | 900.000000 | Simulation |
RPG Saga Engine: Barks
Class URSEBarkSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Project Settings -> RPG Saga Engine -> Barks (D-157): the pools every NPC falls back on and how often NPCs talk.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Decision Window Seconds (DecisionWindowSeconds) | float | 0.250000 | Budget | Requests made within this time are decided together: the speaker with the highest priority, then the nearest to the player (the most relevant) wins. 0 = decided at once, first come first served. | |
Global Cooldown Seconds (GlobalCooldownSeconds) | float | 2.500000 | Budget | Least time between two automatic lines starting anywhere (a crowd never talks in chorus). | |
Max Concurrent Lines (MaxConcurrentLines) | int32 | 1 | Budget | Most lines said at once over NPCs' heads (automatic ones: greetings, small talk, proximity barks). 0 = no automatic lines. | |
Quiet After Screen Seconds (QuietAfterScreenSeconds) | float | 2.000000 | Budget | No automatic lines while a dialog, a document or any modal screen is open, and this long after it closed. | |
Approach Kind (ApproachKind) | FGameplayTag | (TagName="Bark.Kind.Greeting") | Choice | The kind asked for when the party comes near (Bark.Kind.Greeting); lines of other kinds are used when it has none. | |
Talk Falls Back to Lines (bTalkFallsBackToLines) | bool | True | Choice | Talking to an NPC with no dialog and no interaction gets one of its lines (off: no prompt for it). | |
Fallback Lines (FallbackLines) | TArray<FText> | (3 entries) | Choice | What an NPC says when it is talked to and none of its lines passes now (all conditional, none fits the hour or the weather) or its interaction / dialog had nothing to run: Talk is never silent. One is picked at random. | |
Repeat Memory (RepeatMemory) | int32 | 3 | Choice | How many of an NPC's last lines it avoids repeating while it has others to say. | |
Default Pools (DefaultPools) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | (1 entries) | Pools | Used by NPCs without pools of their own or of their NPC Type: nobody is mute. | |
Global Pools (GlobalPools) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | (3 entries) | Pools | Shared by every NPC on top of its own (weather talk, the region's rumours). | |
Ambient Interval (AmbientInterval) | FVector2D | (X=12.000000,Y=24.000000) | Timing | Seconds between an NPC's small talk while the party stays near (random between the two; 0 = only on approach). | |
Max Seconds (MaxSeconds) | float | 6.000000 | Timing | ||
Min Seconds (MinSeconds) | float | 2.500000 | Timing | ||
Seconds Per Character (SecondsPerCharacter) | float | 0.060000 | Timing | How long a line stays over the speaker (seconds per character, with a minimum and a maximum). |
RPG Saga Engine: Battle
Class URSEBattleSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Global battle rules.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
ATBBack Row Physical Multiplier (ATBBackRowPhysicalMultiplier) | float | 0.500000 | ATB | Physical damage multiplier when the attacker or the target stands in the back row (each applies). | |
ATBFill Per Speed (ATBFillPerSpeed) | float | 2.000000 | ATB | Gauge filled per second per point of Speed. | |
ATBGauge Max (ATBGaugeMax) | float | 100.000000 | ATB | A unit gets a command when its gauge reaches this value. | |
ATBInitial Gauge Per Speed (ATBInitialGaugePerSpeed) | float | 3.000000 | ATB | Gauge at battle start per point of Speed (never a full gauge). | |
ATBParty Size (ATBPartySize) | int32 | 4 | ATB | Characters in an ATB party. | |
ATBStep Seconds (ATBStepSeconds) | float | 0.033333 | ATB | Fixed simulation step, in seconds. Smaller = finer timing, more work. | |
Default ATBTime Mode (DefaultATBTimeMode) | ERSEATBTimeMode | Wait | ATB | Default time mode, used until the player picks one in the options (D-022, D-038). | |
Busy Commands (BusyCommands) | ERSEATBBusyCommands | Queue | ATB|Commands | A command given while an action is still being shown: queued (runs right after it) or refused. | |
Flee Base Chance (FleeBaseChance) | float | 40.000000 | ATB|Flee | Flee chance in percent: base, plus per point of (party average Speed - enemy average Speed). | |
Flee Chance Per Speed (FleeChancePerSpeed) | float | 3.000000 | ATB|Flee | ||
Flee Max Chance (FleeMaxChance) | float | 95.000000 | ATB|Flee | ||
Flee Min Chance (FleeMinChance) | float | 5.000000 | ATB|Flee | ||
Active Menu Time Scale (ActiveMenuTimeScale) | float | 1.000000 | ATB|Time | Active mode: time scale while the player is in a sub-list or picks a target (1 = full speed, the classic Active; 0.5 = half speed while choosing). The first command list always runs at full speed. | |
Wait Pauses Enemies (bWaitPausesEnemies) | bool | True | ATB|Time | Wait mode: while time stands still, ready enemies wait too (no new enemy action starts; the one being shown finishes). | |
Wait Pause (WaitPause) | ERSEATBWaitPause | AnyMenu | ATB|Time | Wait mode: which open command menus stop ATB time (D-065). | |
Base Critical Chance (BaseCriticalChance) | float | 5.000000 | Damage | Base critical chance in percent. | |
Critical Multiplier (CriticalMultiplier) | float | 1.500000 | Damage | ||
Defense Constant (DefenseConstant) | float | 100.000000 | Damage | Defense reduces damage by DefenseConstant / (DefenseConstant + Defense): diminishing returns, never immune. | |
Max Hit Chance (MaxHitChance) | float | 100.000000 | Damage | ||
Min Damage (MinDamage) | int32 | 1 | Damage | Smallest damage of a hit that is not nullified by affinity. | |
Min Hit Chance (MinHitChance) | float | 5.000000 | Damage | Hit chance bounds in percent, after Accuracy - Evasion and positional bonuses. | |
Variance Max (VarianceMax) | float | 1.100000 | Damage | ||
Variance Min (VarianceMin) | float | 0.900000 | Damage | Random damage spread: each hit is multiplied by a value in [VarianceMin, VarianceMax]. | |
Affinity Multipliers (AffinityMultipliers) | TMap<ERSEElementAffinity,float> | (5 entries) | Elements | Damage multiplier per affinity. Negative values heal (absorb). | |
Default Encounter Mode (DefaultEncounterMode) | FGameplayTag | () | Encounters | The mode new battles start with when the wizards and the Studio make an encounter (Battle.Mode.Tactics, ATB, Turn, Action; D-171 A7). Empty = Project Settings -> Wizards -> Default Battle Mode. A game that is mostly real-time sets Action; each encounter still decides its own mode. | |
Jump Down Bonus (JumpDownBonus) | int32 | 1 | Tactics|Movement | Height steps a unit may drop beyond its Jump stat. | |
Back Damage Multiplier (BackDamageMultiplier) | float | 1.500000 | Tactics|Positioning | ||
Back Hit Bonus (BackHitBonus) | float | 25.000000 | Tactics|Positioning | ||
Height Damage Max (HeightDamageMax) | float | 1.500000 | Tactics|Positioning | ||
Height Damage Min (HeightDamageMin) | float | 0.700000 | Tactics|Positioning | ||
Height Damage Per Step (HeightDamagePerStep) | float | 0.100000 | Tactics|Positioning | Damage change per height step the attacker stands above (or below) the target. | |
Line Of Sight Eye Height (LineOfSightEyeHeight) | float | 2.000000 | Tactics|Positioning | Eye height above a tile surface for line of sight, in height steps. | |
Side Damage Multiplier (SideDamageMultiplier) | float | 1.250000 | Tactics|Positioning | Damage multiplier when hitting a target from the side / from behind. | |
Side Hit Bonus (SideHitBonus) | float | 10.000000 | Tactics|Positioning | Extra hit chance (percent points) when attacking from the side / from behind. | |
CTThreshold (CTThreshold) | int32 | 100 | Tactics|Turn Order | A unit takes its turn when its CT reaches this value. | |
KOCountdown Turns (KOCountdownTurns) | int32 | 3 | Tactics|Turn Order | Tactics: own turns a fallen unit can wait to be revived before it leaves the battle. 0 = no countdown. | |
Turn CTCost Full (TurnCTCostFull) | int32 | 100 | Tactics|Turn Order | CT spent by a turn in which all Action Points were used. Partial use interpolates. | |
Turn CTCost Idle (TurnCTCostIdle) | int32 | 60 | Tactics|Turn Order | CT spent by a turn in which no Action Points were used. |
RPG Saga Engine: Battle Feel
Class URSEBattleFeelSettings (module RSE), Project Settings, Project, RPG Saga Engine. The feel of battles (D-115, docs/product/free-tactics.md "Battle feel"): how a live battle starts (a ring spreading from the contact point, the enemies turning with a bark, the HUD fading in), the pace of every action (wind-up or cast, hit-stop, the target's reaction, recovery), the juice (element-c...
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Alert Bark Chance (AlertBarkChance) | float | 0.600000 | Entry | Chance of each enemy after the first to bark (the first always does). | |
Alert Barks (AlertBarks) | TArray<FText> | (4 entries) | Entry | Lines the enemies shout as they turn ("!", "There!"). A character's Battle Barks -> Alert replaces them. | |
Alert Bark Stagger (AlertBarkStagger) | float | 0.180000 | Entry | Seconds between two barks (they come one after another). | |
Bark Seconds (BarkSeconds) | float | 1.400000 | Entry | Seconds a bark stays over the unit. | |
Enemies Face Party (bEnemiesFaceParty) | bool | True | Entry | Enemies that noticed the party turn toward it at the start (not when the party surprised them). Their facing is the battle's. | |
Entry Sequence (bEntrySequence) | bool | True | Entry | A live battle starts with its entry sequence: the ring, the enemies turning, the barks, the HUD fading in. Off: at once. | |
Entry Min Seconds (EntryMinSeconds) | float | 1.000000 | Entry | The first turn waits until the entry has played this long (real seconds; at least the ring's spread). | |
Entry Turn Seconds (EntryTurnSeconds) | float | 0.400000 | Entry | Real seconds the enemies take to turn (and a unit nudged to a free spot takes to slide there). | |
HUDFade Delay (HUDFadeDelay) | float | 0.350000 | Entry | The battle HUD fades in after this many real seconds, over HUD Fade Seconds. | |
HUDFade Seconds (HUDFadeSeconds) | float | 0.500000 | Entry | ||
Max Alert Barks (MaxAlertBarks) | int32 | 3 | Entry | At most this many enemies bark at the start. | |
Ring Color (RingColor) | FLinearColor | (R=1.000000,G=0.620000,B=0.250000,A=0.900000) | Entry | ||
Ring Fade Seconds (RingFadeSeconds) | float | 0.600000 | Entry | ||
Ring Hold Seconds (RingHoldSeconds) | float | 0.300000 | Entry | The ring stays this long at its radius, then fades over Ring Fade Seconds. | |
Ring Material (RingMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Battle/M_RSE_BattleRing.M_RSE_BattleRing | Entry | Deferred decal of the ring, the magic circles and the telegraphs (M_RSE_BattleRing: Color, Ring, Fill, Runes, Opacity). | |
Ring Radius (RingRadius) | float | 10.000000 | Entry | Radius the ring spreads to (meters). 0 = half the captured battle area. | |
Ring Spread Seconds (RingSpreadSeconds) | float | 0.800000 | Entry | Seconds (real time) the battle ring takes to spread from the contact point to its radius. | |
Ring Width (RingWidth) | float | 40.000000 | Entry | Width of the ring's line on the ground (cm). | |
Show Intent (bShowIntent) | bool | True | Intent | On an enemy's turn, its intent shows over it briefly (icon and bark) before it acts. | |
Callout Height (CalloutHeight) | float | 230.000000 | Intent | Height of barks and intents above a unit's feet (cm). | |
Intent Bark Chance (IntentBarkChance) | float | 0.500000 | Intent | Chance that the enemy also shouts a line with its intent. | |
Intent Display Seconds (IntentDisplaySeconds) | float | 1.500000 | Intent | Seconds the intent stays on screen. | |
Intent Icon Material (IntentIconMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/UI/M_RSE_IntentIcon.M_RSE_IntentIcon | Intent | UI material of the built-in icons (M_RSE_IntentIcon: Shape, Color). | |
Intent Icon Size (IntentIconSize) | float | 36.000000 | Intent | Icon size on screen (pixels at 1080p). | |
Intent Lookahead (IntentLookahead) | int32 | 4 | Intent | An enemy that walks first decides the rest of its turn this many steps ahead (spread over frames), so its intent shows what the walk is for (walk up and strike = Attack). 0 = a walk shows Move. | |
Intents (Intents) | TMap<ERSEBattleIntent,FRSEIntentLook> | (9 entries) | Intent | Each intent's icon, color and lines. | |
Intent Seconds (IntentSeconds) | float | 0.750000 | Intent | Seconds the enemy waits with its intent shown before acting (game seconds, follows the battle speed). | |
Cast Circle (bCastCircle) | bool | True | Juice | Spells and supports draw a magic circle under the caster while they charge. | |
Impact Flash (bImpactFlash) | bool | True | Juice | Element-colored flash at each hit target at the impact. | |
Impact Shake (bImpactShake) | bool | False | Juice | A small camera shake at impacts (stronger on criticals). Off by default (D-113: the live camera never jolts); Free Tactics (Presentation) -> Action Camera Shake also turns it on. | |
Projectiles (bProjectiles) | bool | True | Juice | Spells at a distance fly to their target (a glowing core with the element's trail) instead of landing at once. | |
Telegraph (bTelegraph) | bool | True | Juice | Where a spell will land is marked on the ground while it charges (its area, or the target's footprint). | |
Weapon Trails (bWeaponTrails) | bool | True | Juice | Melee strikes leave a ribbon trail on the weapon during the swing (a presentation may turn it on or off). | |
Cast Circle Radius (CastCircleRadius) | float | 120.000000 | Juice | ||
Critical Scale (CriticalScale) | float | 1.600000 | Juice | Criticals: larger flash, stronger shake, bigger number. | |
Elements (Elements) | TMap<FGameplayTag,FRSEElementLook> | (8 entries) | Juice | Per element (Element.*): color and default effects. Abilities without an element use Neutral Look. | |
Glow Material (GlowMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Feel/M_RSE_FXGlow.M_RSE_FXGlow | Juice | ||
Glow Mesh (GlowMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Sphere.Sphere | Juice | Mesh and additive material of flashes and projectile cores (a sphere, M_RSE_FXGlow: Color, Intensity, Opacity). | |
Impact Flash Intensity (ImpactFlashIntensity) | float | 5.000000 | Juice | ||
Impact Flash Seconds (ImpactFlashSeconds) | float | 0.240000 | Juice | ||
Impact Flash Size (ImpactFlashSize) | float | 90.000000 | Juice | Size of the impact flash (cm, its widest). Criticals are Critical Scale larger. | |
Impact Shake Amplitude (ImpactShakeAmplitude) | float | 4.000000 | Juice | ||
Impact Shake Seconds (ImpactShakeSeconds) | float | 0.160000 | Juice | ||
Neutral Look (NeutralLook) | FRSEElementLook | (Color=(R=1.000000,G=0.930000,B=0.800000,A=1.000000),CastEffect="/RPGSagaEngine/Visual/Feel/NS_RSE_Cast_Neutral.NS_RSE_Cast_Neutral",ImpactEffect="/RPGSagaEngin... | Juice | ||
Projectile Arc (ProjectileArc) | float | 60.000000 | Juice | Height of the projectile's arc at its middle (cm). | |
Projectile Min Distance (ProjectileMinDistance) | float | 250.000000 | Juice | Targets closer than this (cm) get no projectile. | |
Projectile Size (ProjectileSize) | float | 30.000000 | Juice | ||
Support Look (SupportLook) | FRSEElementLook | (Color=(R=0.450000,G=1.000000,B=0.600000,A=1.000000),CastEffect="/RPGSagaEngine/Visual/Feel/NS_RSE_Cast_Support.NS_RSE_Cast_Support",ImpactEffect="/RPGSagaEngin... | Juice | Color of heals and buffs (flashes, circles, telegraphs of support actions). | |
Telegraph Fill (TelegraphFill) | float | 0.100000 | Juice | Opacity of the telegraph's fill (its outline is opaque). | |
Telegraph Min Radius (TelegraphMinRadius) | float | 75.000000 | Juice | Smallest telegraph radius (cm): a single target's mark. | |
Trail Anchor (TrailAnchor) | FGameplayTag | (TagName="Appearance.Anchor.WeaponTip") | Juice | Where the trail is attached (Appearance.Anchor.*: the weapon tip, else the hand). | |
Trail Linger (TrailLinger) | float | 0.120000 | Juice | The trail keeps emitting this long after the impact. | |
Weapon Trail (WeaponTrail) | TSoftObjectPtr<UNiagaraSystem> | /RPGSagaEngine/Visual/Feel/NS_RSE_WeaponTrail.NS_RSE_WeaponTrail | Juice | The trail (a ribbon Niagara system that follows its emitter, NS_RSE_WeaponTrail). | |
Free Tactics Pacing (FreeTacticsPacing) | FRSEActionPacingDefaults | (bEnabled=True,Melee=(bOverride=True,WindUp=0.280000,ImpactHold=0.090000,HitStopDilation=0.030000,HitSlide=22.000000,Recovery=0.400000,ProjectileSpeed=1600.0000... | Pacing | The pace of each kind of action in Free Tactics and the floors no override goes under (D-115). | |
Turn Reframe Dead Zone (TurnReframeDeadZone) | float | 3.000000 | Pacing | At a new turn the camera glides to the active unit when it is farther than this from the view's center (meters). | |
Turn Reframe Seconds (TurnReframeSeconds) | float | 0.550000 | Pacing | Real seconds of that glide (eased in and out, at the current zoom: no close-ups). 0 = the camera's own interpolation. | |
Wind Up Draw Back (WindUpDrawBack) | float | 14.000000 | Pacing | Melee and ranged wind-up: the actor draws back this far (cm) before the strike. | |
Status Effects (bStatusEffects) | bool | True | Statuses | Status effects on units while statuses last (their Loop Effect, else the visual for their tag below). | |
Max Status Effects Per Unit (MaxStatusEffectsPerUnit) | int32 | 2 | Statuses | At most this many status effects on one unit at a time (the newest win). | |
Status Visuals (StatusVisuals) | TMap<FGameplayTag,FRSEStatusVisual> | (21 entries) | Statuses | Fallback looks by status tag (Status.*; a parent tag covers its children). |
RPG Saga Engine: Battle Flow UI
Class URSEBattleFlowUISettings (module RSE), Project Settings, Project, RPG Saga Engine. What happens on screen after a battle (D-030, D-031): the victory results screen and the game over screen.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Game Over Delay (GameOverDelay) | float | 1.500000 | Flow | Pause after the defeat banner before the game over screen opens. | |
Results Delay (ResultsDelay) | float | 1.200000 | Flow | Pause after the victory banner before the results screen opens. | |
Results Presentation (ResultsPresentation) | ERSEResultsPresentation | Screen | Flow | D-128: how a won Tactics or ATB battle shows its rewards: the classic results screen (default), or the reward feed (floating texts and toasts over the world, Project Settings -> Reward Feed). Free Tactics battles choose with Free Tactics -> Results Mode. | |
Screen ZOrder (ScreenZOrder) | int32 | 20 | Flow | Viewport Z order of both screens (above the battle HUDs). | |
Game Over Background Color (GameOverBackgroundColor) | FRSEUIColor | (Token="Black",Alpha=0.750000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout | Covers the screen behind the game over menu. | |
Game Over Menu Width (GameOverMenuWidth) | float | 380.000000 | Layout | ||
Results Width (ResultsWidth) | float | 520.000000 | Layout | Width of the rewards column of the results screen. | |
Statistics Number Column Width (StatisticsNumberColumnWidth) | float | 76.000000 | Layout | Width of each number column of the statistics table (dealt, taken, KOs). | |
Statistics Width (StatisticsWidth) | float | 420.000000 | Layout | Width of the battle statistics column of the results screen (0 = no statistics column). | |
Experience Bar Color (ExperienceBarColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=-0.035760,Chroma=1.293677,Hue=13.383118,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout|Results | Experience bar: the part the member had before the battle. | |
Experience Bar Height (ExperienceBarHeight) | float | 7.000000 | Layout|Results | ||
Experience Gain Color (ExperienceGainColor) | FRSEUIColor | (Token="Rare",Alpha=1.000000,Lightness=-0.007420,Chroma=0.969650,Hue=-2.652298,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout|Results | Experience bar: the part gained in this battle (the whole bar after a level up). | |
Item Columns (ItemColumns) | int32 | 2 | Layout|Results | Items gained are laid out in this many columns. | |
Member Card Width (MemberCardWidth) | float | 230.000000 | Layout|Results | Width of one member card (name, level, experience bar, level up, new abilities). | |
Portrait Size (PortraitSize) | float | 52.000000 | Layout|Results | Portrait slot of a member card (the speaker portrait of the character; the initial when it has none). 0 = no portrait. | |
Rare Item Color (RareItemColor) | FRSEUIColor | (Token="Rare",Alpha=1.000000,Lightness=-0.061545,Chroma=0.675865,Hue=-151.382233,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout|Results | ||
Rare Item Min Buy Price (RareItemMinBuyPrice) | int32 | 300 | Layout|Results | An item worth at least this much (buy price) is a rare drop: highlighted with RareItemColor and RareBadge. 0 = none. | |
Game Over Widget Class (GameOverWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Game over screen (D-052). Empty = built-in. A Widget Blueprint derived from RSEScreenWidget receives a RSEGameOverViewModel. | |
Results Widget Class (ResultsWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Results screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEResultsViewModel (docs/product/custom-ui.md). | |
Game Over Hint (GameOverHint) | FText | NSLOCTEXT("RSEBattleFlowUI", "GameOverHint", "Up / Down: select Select: choose") | Texts|Game Over | ||
Game Over Title (GameOverTitle) | FText | NSLOCTEXT("RSEBattleFlowUI", "GameOverTitle", "Game Over") | Texts|Game Over | --- Game over texts --- | |
Load Label (LoadLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "Load", "Load last save") | Texts|Game Over | ||
Load Unavailable Detail (LoadUnavailableDetail) | FText | NSLOCTEXT("RSEBattleFlowUI", "LoadUnavailable", "No saved games") | Texts|Game Over | Detail next to Load when there is no save. | |
Main Menu Label (MainMenuLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "MainMenu", "Return to main menu") | Texts|Game Over | ||
Retry Label (RetryLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "Retry", "Retry battle") | Texts|Game Over | ||
Unavailable Detail (UnavailableDetail) | FText | NSLOCTEXT("RSEBattleFlowUI", "Unavailable", "Not available") | Texts|Game Over | Detail next to an option that cannot be used for another reason (no main menu map, nothing to retry). | |
Card Level Format (CardLevelFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "CardLevel", "{Term.LevelShort} {Level}") | Texts|Results | Level on a card ({Level}). | |
Card Level Up Format (CardLevelUpFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "CardLevelUp", "{Term.LevelShort} {OldLevel} → {Level}") | Texts|Results | Level on the card of a member that levelled up ({OldLevel}, {Level}). | |
Continue Label (ContinueLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "Continue", "Continue") | Texts|Results | ||
Experience Gained Format (ExperienceGainedFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "ExperienceGained", "+{Amount} {Term.ExperienceShort}") | Texts|Results | Experience gained on a card ({Amount}). | |
Experience Label (ExperienceLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "ExperienceLabel", "{Term.Experience}") | Texts|Results | ||
Item Count Format (ItemCountFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "ItemCount", "×{Count}") | Texts|Results | Count of an item gained ({Count}). | |
Item Format (ItemFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "Item", "{Item} x{Count}") | Texts|Results | One item: {Item}, {Count}. | |
Items Header (ItemsHeader) | FText | NSLOCTEXT("RSEBattleFlowUI", "ItemsHeader", "{Term.Items} obtained") | Texts|Results | ||
KOBadge (KOBadge) | FText | NSLOCTEXT("RSEBattleFlowUI", "KOBadge", "KO") | Texts|Results | Badge of a member that ended the battle KO. | |
Level Up Badge (LevelUpBadge) | FText | NSLOCTEXT("RSEBattleFlowUI", "LevelUpBadge", "LEVEL UP!") | Texts|Results | Badge of a member that levelled up. | |
Level Up Format (LevelUpFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "LevelUp", "{Name} reached level {Level}!") | Texts|Results | A level up: {Name}, {Level}. | |
Max Level Text (MaxLevelText) | FText | NSLOCTEXT("RSEBattleFlowUI", "MaxLevel", "Maximum level") | Texts|Results | ||
Member Format (MemberFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "Member", "{Name} {Term.LevelShort} {Level} +{Amount} {Term.ExperienceShort}") | Texts|Results | One member: {Name}, {Level}, {Amount} (experience gained). | |
Member KOText (MemberKOText) | FText | NSLOCTEXT("RSEBattleFlowUI", "MemberKO", "{Name} {Term.LevelShort} {Level} KO: no experience") | Texts|Results | Detail of a fallen member (gets no experience). | |
Money Label (MoneyLabel) | FText | NSLOCTEXT("RSEBattleFlowUI", "MoneyLabel", "{Term.Money}") | Texts|Results | ||
Money Value Format (MoneyValueFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "MoneyValue", "+{Money}") | Texts|Results | Money value in the spoils ({Money}, already formatted by the Economy settings). | |
New Ability Format (NewAbilityFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "NewAbility", "{Name} learned {Ability}.") | Texts|Results | An ability learned: {Name}, {Ability}. | |
No Items Text (NoItemsText) | FText | NSLOCTEXT("RSEBattleFlowUI", "NothingFound", "Nothing found") | Texts|Results | ||
Pact Points Format (PactPointsFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "PactPoints", "{Pact}: +{Amount} Pact points") | Texts|Results | Pact points: {Pact}, {Amount}. | |
Pact Points Label Format (PactPointsLabelFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "PactPointsLabel", "{Pact} (Pact points)") | Texts|Results | Pact points row of the spoils: label ({Pact}) and value ({Amount}). | |
Pact Points Value Format (PactPointsValueFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "PactPointsValue", "+{Amount}") | Texts|Results | ||
Rare Badge (RareBadge) | FText | NSLOCTEXT("RSEBattleFlowUI", "RareBadge", "RARE") | Texts|Results | Badge of a rare drop. | |
Recruited Format (RecruitedFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "Recruited", "{Name}") | Texts|Results | A character captured in the battle joined the party: label ({Name}); the value is RecruitedValue. | |
Recruited Value (RecruitedValue) | FText | NSLOCTEXT("RSEBattleFlowUI", "RecruitedValue", "joined the party") | Texts|Results | ||
Results Hint (ResultsHint) | FText | NSLOCTEXT("RSEBattleFlowUI", "ResultsHint", "Select: continue") | Texts|Results | ||
Results Title (ResultsTitle) | FText | NSLOCTEXT("RSEBattleFlowUI", "ResultsTitle", "Victory") | Texts|Results | --- Results texts ({Name}, {Amount}, {Level}, {Ability}, {Item}, {Count}, {Pact} are filled in) --- | |
Spoils Header (SpoilsHeader) | FText | NSLOCTEXT("RSEBattleFlowUI", "SpoilsHeader", "Spoils") | Texts|Results | Title of the spoils section (experience, money, Pact points, items). | |
To Next Format (ToNextFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "ToNext", "Next level: {Amount}") | Texts|Results | Experience still needed for the next level ({Amount}). | |
Total Experience Format (TotalExperienceFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "TotalExperience", "{Term.Experience} earned: {Amount}") | Texts|Results | Line with the total experience. | |
Biggest Hit Critical Format (BiggestHitCriticalFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "BiggestHitCritical", "Biggest hit: {Amount}, critical ({Name}, {Ability})") | Texts|Statistics | The biggest hit was a critical hit. | |
Biggest Hit Format (BiggestHitFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "BiggestHit", "Biggest hit: {Amount} ({Name}, {Ability})") | Texts|Statistics | {Amount}, {Name} (who hit), {Ability} (ability or item). | |
Biggest Hit No Ability Format (BiggestHitNoAbilityFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "BiggestHitNoAbility", "Biggest hit: {Amount} ({Name})") | Texts|Statistics | The biggest hit has no known ability ({Amount}, {Name}). | |
Dealt Column (DealtColumn) | FText | NSLOCTEXT("RSEBattleFlowUI", "DealtColumn", "Dealt") | Texts|Statistics | ||
Duration Format (DurationFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "Duration", "Duration: {Time}") | Texts|Statistics | Real-time battles: {Time} (m:ss). | |
Enemies Defeated Format (EnemiesDefeatedFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "EnemiesDefeated", "{Term.Enemies} defeated: {Count}") | Texts|Statistics | ||
Items Used Format (ItemsUsedFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "ItemsUsed", "{Term.Items} used: {Count}") | Texts|Statistics | ||
KOs Column (KOsColumn) | FText | NSLOCTEXT("RSEBattleFlowUI", "KOsColumn", "KOs") | Texts|Statistics | ||
Member Column (MemberColumn) | FText | NSLOCTEXT("RSEBattleFlowUI", "MemberColumn", "Member") | Texts|Statistics | Column headers of the member table. | |
Member Fell Format (MemberFellFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "MemberFell", "{Name} (fell)") | Texts|Statistics | After the name of a member that fell during the battle ({Name}). | |
Statistics Header (StatisticsHeader) | FText | NSLOCTEXT("RSEBattleFlowUI", "StatisticsHeader", "Battle statistics") | Texts|Statistics | --- Battle statistics ({Count}, {Time}, {Amount}, {Name}, {Ability}) --- | |
Taken Column (TakenColumn) | FText | NSLOCTEXT("RSEBattleFlowUI", "TakenColumn", "Taken") | Texts|Statistics | ||
Turns Format (TurnsFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "Turns", "Turns: {Count}") | Texts|Statistics | Turn-based battles: {Count} turns of the party. | |
Units Lost Format (UnitsLostFormat) | FText | NSLOCTEXT("RSEBattleFlowUI", "UnitsLost", "Units lost: {Count}") | Texts|Statistics |
RPG Saga Engine: Battle Menus
Class URSEBattleMenuSettings (module RSE), Project Settings, Project, RPG Saga Engine. Battle menus (D-122): the menu styles the game offers, the one Free Tactics uses and what its menu holds.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Icons (DefaultIcons) | TMap<FName,TSoftObjectPtr<UTexture2D> > | (14 entries) | Content | D-132: icons by id for categories and turn commands the menu data leaves without one (a category: the menu config's icon wins; an entry: its own icon wins, ids like "Door.2" use the part before the dot). Keys are category and entry ids: Move, Jump, Attack, Skills, Magic, Items, Field, Flee, Door, EndTurn, Pact... The plugin's defaults use its own glyphs. | |
Element Colors (ElementColors) | TMap<FGameplayTag,FLinearColor> | (8 entries) | Content | D-147: the color of each element in tooltips (Element.*); elements without one use the text color. | |
Free Tactics Menu (FreeTacticsMenu) | TSoftObjectPtr<URSEBattleMenuConfig> | None | Content | What the Free Tactics menu holds (providers and categories). Empty = the built-in providers (Move, the class's commands, Flee, doors, End Turn). | |
Target Badges (TargetBadges) | TMap<ERSEAbilityTargetKind,TSoftObjectPtr<UTexture2D> > | (7 entries) | Content | D-147: the badge glyph of each targeting kind (one target, area, line, cone, self, ally, allies in an area). The plugin's: /RPGSagaEngine/UI/Badges. | |
Player Can Choose (bPlayerCanChoose) | bool | True | Styles | The options menu lets the player pick the style. | |
Free Tactics Style (FreeTacticsStyle) | FName | Radial | Styles | The style Free Tactics battles use unless the player picks another (by Style Id). | |
Styles (Styles) | TArray<TSoftObjectPtr<URSEBattleMenuStyle> > | (0 entries) | Styles | Style assets the game offers (empty = the built-in List, Radial and Hotbar with their default look). |
RPG Saga Engine: Battle Mode Override
Class URSEBattleModeOverrideSettings (module RSECore), Project Settings, Project, RPG Saga Engine. D-182: the battle mode override.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Auto Deployment Rows (AutoDeploymentRows) | int32 | 2 | Fallbacks | Grid fallback: rows of deployment tiles made along the zone's near edge (row 0) when the encounter has none. | |
Auto Deployment Tiles Per Unit (AutoDeploymentTilesPerUnit) | int32 | 2 | Fallbacks | Grid fallback: deployment tiles made per deployable unit (more tiles give the player a choice). | |
Auto Enemy Edge Margin (AutoEnemyEdgeMargin) | int32 | 1 | Fallbacks | Grid fallback: rows kept free between the far edge and the enemies laid out automatically. | |
Auto Front Row Size (AutoFrontRowSize) | int32 | 3 | Fallbacks | Classic fallback: with every enemy in the front row, the enemies after this many go to the back row (an encounter made for another mode). | |
Fall Back to Own Mode (bFallBackToOwnMode) | bool | True | Modes | When the encounter cannot be fought in the override's mode (it does not allow it, its data cannot, no battle site on the map): on = it is fought in its own mode (a warning in the log); off = it does not start. | |
Overridable Modes (OverridableModes) | TArray<FGameplayTag> | (5 entries) | Modes | The modes an override may choose, in this order (demo menus and the mode report list them so). |
RPG Saga Engine: Battle Presentation
Class URSEBattlePresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How battles are shown (D-034): playback speed, approach movement, default timelines, camera shots, effects and cinematic moments.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Block Prompt Text (BlockPromptText) | FText | NSLOCTEXT("RSEBattlePresentation", "BlockPrompt", "Block!") | Action Command UI | ||
Good Color (GoodColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=0.017993,Chroma=0.926205,Hue=-5.896690,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Action Command UI | ||
Good Text (GoodText) | FText | NSLOCTEXT("RSEBattlePresentation", "Good", "GOOD") | Action Command UI | ||
Grade Height (GradeHeight) | float | 215.000000 | Action Command UI | Height above the anchor unit where the grade (Perfect / Good / Miss) shows (D-083): above the head, apart from the combat numbers at the hit point (UI -> Floating Hit Height). | |
Grade Pop Scale (GradePopScale) | float | 1.350000 | Action Command UI | The grade starts this much larger and settles (pop). | |
Grade Rise (GradeRise) | float | 22.000000 | Action Command UI | Rise of the grade over its display time, in screen units. | |
Grade Scale (GradeScale) | float | 0.800000 | Action Command UI | Size of the grade as a share of the Title text style (smaller than the damage numbers). | |
Miss Color (MissColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.053433,Chroma=0.794947,Hue=-7.461658,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Action Command UI | ||
Miss Text (MissText) | FText | NSLOCTEXT("RSEBattlePresentation", "Miss", "MISS") | Action Command UI | ||
Perfect Color (PerfectColor) | FRSEUIColor | (Token="Rare",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Action Command UI | ||
Perfect Text (PerfectText) | FText | NSLOCTEXT("RSEBattlePresentation", "Perfect", "PERFECT!") | Action Command UI | ||
Prompt Height (PromptHeight) | float | 120.000000 | Action Command UI | Height above the anchor unit where the prompt appears. | |
Prompt Text (PromptText) | FText | NSLOCTEXT("RSEBattlePresentation", "Prompt", "Timing!") | Action Command UI | ||
Result Seconds (ResultSeconds) | float | 0.700000 | Action Command UI | How long the grade stays on screen. | |
Ring Radius (RingRadius) | float | 44.000000 | Action Command UI | Radius of the target ring of the timing prompt. | |
Ring Segments (RingSegments) | int32 | 48 | Action Command UI | ||
Ring Start Scale (RingStartScale) | float | 3.000000 | Action Command UI | The closing ring starts this many times larger. | |
Ring Thickness (RingThickness) | float | 4.000000 | Action Command UI | ||
Default Body Radius (DefaultBodyRadius) | float | 35.000000 | Approach | Body radius of a target whose look gives none (placeholders), for Move cues with a Reach. | |
Max Move Time (MaxMoveTime) | float | 0.800000 | Approach | ||
Melee Contact Depth (MeleeContactDepth) | float | 10.000000 | Approach | Move cues with a Reach (D-079: the attack's measured contact reach): the attacker stops where its blow lands on the target's body: the target's body radius (its look's body preset) plus the reach, minus this depth. | |
Melee Stop Distance (MeleeStopDistance) | float | 110.000000 | Approach | Melee attackers stop this far from their target (Move cues without a Reach). | |
Min Move Time (MinMoveTime) | float | 0.150000 | Approach | ||
Return Speed (ReturnSpeed) | float | 1300.000000 | Approach | ||
Run Speed (RunSpeed) | float | 1100.000000 | Approach | --- Approach (ATB; Tactics limits it to a step) --- | |
Tactics Max Contact Step (TacticsMaxContactStep) | float | 180.000000 | Approach | Tactics, Move cues with a Reach (D-079): the step goes as far as the blow needs to land, up to this distance (then the unit goes back to its tile). 0 = the Max Step Distance above. | |
Tactics Max Step Distance (TacticsMaxStepDistance) | float | 30.000000 | Approach | Tactics: units stay on their tiles, so Move cues toward the target become a short step of at most this distance (then the strike's lunge). 0 = no step. Grid movement itself is the battle's (UnitMoved). | |
Block Min Lead Seconds (BlockMinLeadSeconds) | float | 0.300000 | Block Window | Shortest time (real seconds) from the prompt to the ideal press. When the attack connects sooner, the impact waits for the grade (a short pause) rather than asking for an impossible press. | |
Block Slow Motion Dilation (BlockSlowMotionDilation) | float | 0.250000 | Block Window | While a block window is open the enemy's attack keeps playing, slowed to this time dilation (the battle never freezes; Bogdan 2026-09-26). The ring closes when the attack connects. Reduced effects without slow motion: 1. | |
Block Slow Motion Ease In (BlockSlowMotionEaseIn) | float | 0.120000 | Block Window | Real seconds to blend into the slow motion when the window opens. | |
Block Slow Motion Ease Out (BlockSlowMotionEaseOut) | float | 0.200000 | Block Window | Real seconds to blend back to normal speed once the block is graded. | |
Avoid Camera Obstacles (bAvoidCameraObstacles) | bool | True | Camera | Camera shots never go into walls (D-079): each shot is probed from the subject it frames to the camera; a blocked view pulls the camera in, else tries other angles (turned sideways, the other side, higher), else the shot is skipped and the camera stays where it is. Subjects hidden behind an obstacle count as blocked too. | |
Camera Alternate Yaw (CameraAlternateYaw) | float | 40.000000 | Camera | Other angles tried: the shot turned by this much around its subject (then twice as much, the other side, higher). | |
Camera Probe Channel (CameraProbeChannel) | TEnumAsByte<ECollisionChannel> | ECC_Camera | Camera | Collision channel of the probes (units are ignored). | |
Camera Probe Radius (CameraProbeRadius) | float | 15.000000 | Camera | Radius of the camera probe (cm): the camera keeps this far from walls. | |
Camera Raise Share (CameraRaiseShare) | float | 0.700000 | Camera | Higher angles: the camera goes up by this share of its distance to the subject. | |
Close Up Distance (CloseUpDistance) | float | 280.000000 | Camera | ||
Close Up Height (CloseUpHeight) | float | 20.000000 | Camera | ||
Close Up Side Offset (CloseUpSideOffset) | float | 80.000000 | Camera | ||
Min Shot Distance (MinShotDistance) | float | 140.000000 | Camera | A shot pulled in closer than this to its subject is not used (another angle is tried). | |
Orbit Degrees Per Second (OrbitDegreesPerSecond) | float | 30.000000 | Camera | ||
Orbit Height (OrbitHeight) | float | 280.000000 | Camera | ||
Orbit Radius (OrbitRadius) | float | 560.000000 | Camera | ||
Over Shoulder Distance (OverShoulderDistance) | float | 260.000000 | Camera | ||
Over Shoulder Height (OverShoulderHeight) | float | 150.000000 | Camera | ||
Over Shoulder Side Offset (OverShoulderSideOffset) | float | 110.000000 | Camera | ||
Return Blend Time (ReturnBlendTime) | float | 0.400000 | Camera | Blend back to the battle camera when a timeline ends. | |
Shot Blend Time (ShotBlendTime) | float | 0.350000 | Camera | ||
Shot FOV (ShotFOV) | float | 55.000000 | Camera | Field of view of cinematic shots (0 = keep the battle camera's). | |
Subject Height (SubjectHeight) | float | 90.000000 | Camera | Height of a unit's chest above its origin: what shots look at. | |
Boss Special Camera (bBossSpecialCamera) | bool | True | Camera Policy | Special Only: bosses (VIP enemies) keep their cinematic camera (intro, special moves) even with enemies off. | |
Enemy Special Camera (bEnemySpecialCamera) | bool | False | Camera Policy | Special Only: enemies' special actions may move the camera too. Off: only the player's side (bosses: below). | |
Shake in Fixed View (bShakeInFixedView) | bool | True | Camera Policy | Camera shakes still play in the fixed view (they do not change the perspective). | |
Classic Camera Policy (ClassicCameraPolicy) | ERSEBattleCameraPolicy | SpecialOnly | Camera Policy | Classic battles (ATB, turn-based): which actions may move the camera away from the stage's fixed view. Default Special Only: attacks, skills, spells and items (the enemies' too) play in the fixed view; flagged abilities, super moves and summons may use their camera shots. | |
Tactics Camera Policy (TacticsCameraPolicy) | ERSEBattleCameraPolicy | All | Camera Policy | Tactics battles: the same choice. Default All (the Ability Toolkit's shots follow leaps, dashes and fireballs, D-055). | |
Boss Intro (bBossIntro) | bool | True | Cinematics | Battles with a boss (a VIP enemy) open on it. | |
Hide HUDDuring Cinematics (bHideHUDDuringCinematics) | bool | True | Cinematics | The battle HUD hides while a cinematic moment plays. | |
Boss Intro (BossIntro) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Cinematics | ||
Boss Title Format (BossTitleFormat) | FText | NSLOCTEXT("RSEBattlePresentation", "BossTitle", "{Name}") | Cinematics | Banner title of boss intros ({Name} = the boss). | |
Summon Entrance (bSummonEntrance) | bool | True | Cinematics | Summons enter with a short cinematic (camera, slow motion, banner). | |
Cinematic Hold Seconds (CinematicHoldSeconds) | float | 1.400000 | Cinematics | How long cinematic shots hold. | |
Slow Motion Dilation (SlowMotionDilation) | float | 0.350000 | Cinematics | ||
Slow Motion Seconds (SlowMotionSeconds) | float | 0.900000 | Cinematics | ||
Summon Entrance (SummonEntrance) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Cinematics | Replaces the built-in summon entrance. | |
Summon Title Format (SummonTitleFormat) | FText | NSLOCTEXT("RSEBattlePresentation", "SummonTitle", "{Name}") | Cinematics | Banner title of summon entrances ({Name} = the summon). | |
Super Move Prelude (SuperMovePrelude) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Cinematics | Replaces the built-in super move prelude (abilities with Moment = Super Move and no asset). | |
Action Banner Format (ActionBannerFormat) | FText | NSLOCTEXT("RSEBattlePresentation", "ActionBanner", "{Caster} — {Ability}") | Default Timelines | Text of the default action banner, for every unit (D-065). Arguments: {Caster}, {Ability}. Empty = the ability's name only. | |
Banner Seconds (BannerSeconds) | float | 1.100000 | Default Timelines | ||
Show Ability Banner (bShowAbilityBanner) | bool | True | Default Timelines | Shows the ability's name in a banner (abilities may turn it off). | |
Cast Hop Height (CastHopHeight) | float | 30.000000 | Default Timelines | ||
Cast Time (CastTime) | float | 0.450000 | Default Timelines | Casting pose before the impact of in-place abilities. | |
Flee Action Name (FleeActionName) | FText | NSLOCTEXT("RSEBattlePresentation", "FleeAction", "Flee") | Default Timelines | Name of the Flee command in its action banner ("Aldren — Flee", D-083). Empty = no banner for fleeing. | |
In Place Default (InPlaceDefault) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Default Timelines | ||
Melee Default (MeleeDefault) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Default Timelines | Optional assets replacing the built-in default timeline of each approach. | |
Post Impact Wait (PostImpactWait) | float | 0.300000 | Default Timelines | Pause after the impact before the caster returns / the next action. | |
Ranged Default (RangedDefault) | TSoftObjectPtr<URSEAbilityPresentationBase> | None | Default Timelines | ||
Shoot Recoil Distance (ShootRecoilDistance) | float | 20.000000 | Default Timelines | ||
Shoot Time (ShootTime) | float | 0.250000 | Default Timelines | ||
Strike Lunge Distance (StrikeLungeDistance) | float | 45.000000 | Default Timelines | ||
Strike Time (StrikeTime) | float | 0.200000 | Default Timelines | ||
Support Cast Anchor (SupportCastAnchor) | FGameplayTag | (TagName="Appearance.Anchor.WeaponTip") | Default Timelines|Support | Where on the caster (Appearance.Anchor.*: the weapon tip falls back to the hand, D-081). | |
Support Cast Effect (SupportCastEffect) | TSoftObjectPtr<UObject> | None | Default Timelines|Support | Effect at the caster while a support action is cast (a Niagara or legacy particle system). Empty = none. | |
Support Receive Effect (SupportReceiveEffect) | TSoftObjectPtr<UObject> | None | Default Timelines|Support | Effect on each target when it receives the action (a heal burst, a buff aura). Empty = none. | |
Support Receive Lift (SupportReceiveLift) | float | 10.000000 | Default Timelines|Support | The targets rise this much for a moment when they receive it (a small lift, not a hit reaction). 0 = no reaction. | |
Support Receive Time (SupportReceiveTime) | float | 0.400000 | Default Timelines|Support | ||
Reduce Camera Shake (bReduceCameraShake) | bool | True | Effects | ||
Reduce Effects (bReduceEffects) | bool | False | Effects | Low-end PCs / accessibility: turns off the effects selected below. | |
Reduce Hit Stop (bReduceHitStop) | bool | True | Effects | ||
Reduce Optional Cues (bReduceOptionalCues) | bool | True | Effects | Cues marked optional (extra VFX) are skipped. | |
Reduce Screen Flash (bReduceScreenFlash) | bool | True | Effects | ||
Reduce Slow Motion (bReduceSlowMotion) | bool | False | Effects | ||
Effect Max Lifetime (EffectMaxLifetime) | float | 2.500000 | Effects | Longest an effect of a VFX or Projectile cue lives when the cue gives no Duration (D-079). Looping systems (auras, fires, many pack effects) would otherwise run forever; they are deactivated (their particles finish) after this. One-shot systems end sooner on their own. Every effect still running stops when the battle's presentations stop. | |
Flash Alpha (FlashAlpha) | float | 0.600000 | Effects | ||
Flash Color (FlashColor) | FRSEUIColor | (Token="White",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Effects | ||
Hit Stop Dilation (HitStopDilation) | float | 0.030000 | Effects | Time dilation during a hit-stop. | |
Hit Stop Seconds (HitStopSeconds) | float | 0.080000 | Effects | ||
Shake Amplitude (ShakeAmplitude) | float | 10.000000 | Effects | ||
Shake Frequency (ShakeFrequency) | float | 18.000000 | Effects | ||
Shake Rotation Amplitude (ShakeRotationAmplitude) | float | 0.800000 | Effects | ||
Shake Seconds (ShakeSeconds) | float | 0.300000 | Effects | ||
Battle End Pause (BattleEndPause) | float | 1.000000 | End of Battle | Pause after the last action of a battle has fully played (its timeline, the KO falls) before the battle's end is shown (banner, results / game over timers, music). Lets the killing blow's damage numbers finish. | |
Defeat Fall Seconds (DefeatFallSeconds) | float | 0.450000 | End of Battle | Placeholder units: time a fallen unit takes to tip over (0 = at once). | |
Return to Slot (bReturnToSlot) | bool | True | Formation | Classic battles: units always go back to their stage slot (knocked-out ones too) once nothing animates them: after an action, a hit reaction, or a row change (Knockback / Pull / Swap), whose slot is in the new row. Tactics: units go back to their tile's center. Off = they stay wherever the presentation left them. | |
Slot Return Max Time (SlotReturnMaxTime) | float | 0.800000 | Formation | ||
Slot Return Min Time (SlotReturnMinTime) | float | 0.200000 | Formation | ||
Slot Return Speed (SlotReturnSpeed) | float | 400.000000 | Formation | Speed of the walk back to the slot. | |
Slot Tolerance (SlotTolerance) | float | 2.000000 | Formation | A unit farther than this from its slot goes back. | |
Slot Yaw Tolerance (SlotYawTolerance) | float | 3.000000 | Formation | A unit turned farther than this from its slot's facing turns back (classic battles). | |
Dodge Distance (DodgeDistance) | float | 50.000000 | Hit Reaction | Sidestep of a target that dodges (a miss). | |
Hit Reaction Distance (HitReactionDistance) | float | 35.000000 | Hit Reaction | --- Hit reactions --- | |
Hit Reaction Time (HitReactionTime) | float | 0.280000 | Hit Reaction | ||
Allow Skip Actions (bAllowSkipActions) | bool | False | Playback | Confirm / Cancel also skip ordinary actions (cinematic moments are always skippable). | |
Restore Caster on Finish (bRestoreCasterOnFinish) | bool | True | Playback | When a timeline ends, the caster is put back where it started (row position and facing). | |
Fast Forward Keys (FastForwardKeys) | TArray<FKey> | (2 entries) | Playback | Held: fast-forwards battle presentations. | |
Fast Forward Speed (FastForwardSpeed) | float | 3.000000 | Playback | Speed while a fast-forward key is held. | |
Playback Speed (PlaybackSpeed) | float | 1.000000 | Playback | Speed of every battle presentation (1 = normal). | |
Action Command Widget Class (ActionCommandWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widgets | Action command ring (D-052). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEActionCommandViewModel (docs/product/custom-ui.md). | |
Banner Widget Class (BannerWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widgets | Banner screen: ability names, cinematic titles (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEBattleBannerViewModel (docs/product/custom-ui.md). |
RPG Saga Engine: Battle Simulator
Class URSEBattleSimSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Headless battle simulator (D-041, docs/design/battle-simulator.md): defaults for scenarios that leave a value out, guards against endless battles and where reports go.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Enemy Team (DefaultEnemyTeam) | FGameplayTag | (TagName="Team.Enemy") | Defaults | ||
Default Player Intelligence (DefaultPlayerIntelligence) | float | 0.800000 | Defaults | Intelligence (0-1) of the AI playing the party. A competent player, by default. | |
Default Player Team (DefaultPlayerTeam) | FGameplayTag | (TagName="Team.Player") | Defaults | Teams of inline scenarios (no encounter asset). Encounters bring their own teams. | |
Default Runs (DefaultRuns) | int32 | 50 | Defaults | Battles per batch (per sweep value) when the scenario gives no Runs. | |
Default Seed (DefaultSeed) | int32 | 1 | Defaults | First seed of a batch when the scenario gives no Seed. Run i uses Seed + i, so sweep values share their seeds. | |
ATBSim Delta Seconds (ATBSimDeltaSeconds) | float | 0.500000 | Guards | ATB: simulated time advanced between AI checks. The battle itself steps in URSEBattleSettings::ATBStepSeconds and stops early when a unit becomes ready, so this only trades loop overhead against nothing: results do not depend on it. | |
Max ATBSeconds (MaxATBSeconds) | float | 1200.000000 | Guards | ATB: a battle still running after this much simulated time ends as a Timeout. | |
Max Tactics Turns (MaxTacticsTurns) | int32 | 400 | Guards | Tactics and turn-based: a battle still running after this many unit turns (both sides) ends as a Timeout. | |
Histogram Bins (HistogramBins) | int32 | 10 | Reports | Bars of the turns / duration histograms in summary.html. | |
Output Folder (OutputFolder) | FString | BattleSim | Reports | Reports go to Saved/<OutputFolder>/<timestamp>_<scenario>/. | |
Scenario Folder (ScenarioFolder) | FString | Config/BattleSim | Reports | Scenario files (*.json) the RSE Configurator offers as one-click runs, relative to the project directory. | |
Generated Grid Depth (GeneratedGridDepth) | int32 | 12 | Tactics Grid | ||
Generated Grid Width (GeneratedGridWidth) | int32 | 12 | Tactics Grid | Generated grid (no zone found, or the scenario asks for one): size in tiles. Grown to fit every unit's tile. | |
Generated Height Noise (GeneratedHeightNoise) | int32 | 0 | Tactics Grid | Generated grid: highest random height in steps (0 = flat). Heights are smoothed so hills, not spikes. | |
Grid Search Maps (GridSearchMaps) | TArray<FSoftObjectPath> | (1 entries) | Tactics Grid | Maps searched for the zone grid of an encounter when a scenario names no map: the first Tactics battle director whose encounter matches gives its zone's baked grid. Loading a map costs a second or two, once per batch. |
RPG Saga Engine: Battle Transition
Class URSEBattleTransitionSettings (module RSE), Project Settings, Project, RPG Saga Engine. The screen transition between exploration and battles (D-083), like the classic JRPGs: the last frame of exploration breaks, whirls or rushes away with a flash, the screen goes black, then fades into the battle with an intro banner ("Battle!", "Preemptive!").
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Exit Fade in Seconds (ExitFadeInSeconds) | float | 0.500000 | Exit | Fade from black into exploration. | |
Exit Fade Out Seconds (ExitFadeOutSeconds) | float | 0.350000 | Exit | Fade to black when a battle ends, before the camera goes back to exploration. | |
Flash Alpha (FlashAlpha) | float | 0.850000 | Flash | Strength of the flash at its peak (0 = none). | |
Flash Color (FlashColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=0.013515,Chroma=3.687879,Hue=161.669617,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Flash | --- Flash --- | |
Flash in Seconds (FlashInSeconds) | float | 0.060000 | Flash | The flash rises in this long... | |
Flash Out Seconds (FlashOutSeconds) | float | 0.300000 | Flash | ...and fades out in this long. | |
Back Attack Color (BackAttackColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.017781,Chroma=0.901999,Hue=4.368494,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Intro Banner | ||
Back Attack Text (BackAttackText) | FText | NSLOCTEXT("RSEBattleTransition", "BackAttack", "Back Attack!") | Intro Banner | The enemies caught the party from behind (D-063). | |
Battle Text (BattleText) | FText | NSLOCTEXT("RSEBattleTransition", "Battle", "Battle!") | Intro Banner | ||
Show Intro Banner (bShowIntroBanner) | bool | True | Intro Banner | A banner as the battle fades in. | |
Use Encounter Name (bUseEncounterName) | bool | False | Intro Banner | The banner shows the encounter's name when it has one (and no intro text of its own), instead of Battle Text. | |
Intro Color (IntroColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.023505,Chroma=0.866576,Hue=4.106044,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Intro Banner | ||
Intro Screen Height (IntroScreenHeight) | float | 0.360000 | Intro Banner | Height of the banner on the screen (0 = top, 1 = bottom). | |
Intro Seconds (IntroSeconds) | float | 1.300000 | Intro Banner | Seconds the banner stays after the fade (it fades out over the last quarter). | |
Preemptive Color (PreemptiveColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=0.017993,Chroma=0.926205,Hue=-5.896690,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Intro Banner | ||
Preemptive Text (PreemptiveText) | FText | NSLOCTEXT("RSEBattleTransition", "Preemptive", "Preemptive!") | Intro Banner | The party struck first (D-063). | |
Exit Sound (ExitSound) | TSoftObjectPtr<USoundBase> | None | Sound | Plays as the screen goes back to exploration. Empty = none. | |
Start Sound (StartSound) | TSoftObjectPtr<USoundBase> | None | Sound | Plays as the transition into a battle starts (the classic encounter swoosh). Empty = none. | |
Grid Reveal Seconds (GridRevealSeconds) | float | 0.700000 | Style Details | Flash Grid (Tactics): seconds for the grid to spread from the center to the edge of the zone. | |
Grid Reveal Step (GridRevealStep) | float | 0.033000 | Style Details | Flash Grid: the grid grows in steps this far apart (a timer, not a tick). | |
Shatter Columns (ShatterColumns) | int32 | 9 | Style Details | Shatter: shards across and down (each cell breaks into two triangles). | |
Shatter Fall (ShatterFall) | float | 1.400000 | Style Details | Shatter: how far the shards fly, as a share of the screen height (gravity pulls them down). | |
Shatter Rows (ShatterRows) | int32 | 6 | Style Details | ||
Shatter Spin (ShatterSpin) | float | 0.600000 | Style Details | Shatter: most turns a shard makes while it falls. | |
Swirl Resolution (SwirlResolution) | int32 | 24 | Style Details | Swirl: mesh resolution (cells across; more = smoother whirl). | |
Swirl Turns (SwirlTurns) | float | 1.600000 | Style Details | Swirl: turns of the center by the end (the edges turn less). | |
Wipe Segments (WipeSegments) | int32 | 72 | Style Details | Radial Wipe: segments of the sweeping darkness (smoothness). | |
Zoom Copies (ZoomCopies) | int32 | 7 | Style Details | Zoom Blur: copies of the frame drawn for the blur trail. | |
Zoom Scale (ZoomScale) | float | 1.800000 | Style Details | Zoom Blur: how much larger the frame grows by the end. | |
Enabled (bEnabled) | bool | True | Styles | Plays transitions at all (off: the camera goes straight to the battle, as before D-083). | |
Classic Style (ClassicStyle) | ERSEBattleTransitionStyle | Shatter | Styles | Into classic battles (ATB, turn-based). An encounter's own Transition Style wins. | |
Reduced Style (ReducedStyle) | ERSEBattleTransitionStyle | Fade | Styles | Played instead of the image styles (Shatter, Swirl, Zoom Blur, Radial Wipe) when battle effects are reduced (options menu, Battle Presentation -> Reduce Effects, RSE.Battle.Presentation.ReduceEffects): no flash either. | |
Tactics Style (TacticsStyle) | ERSEBattleTransitionStyle | FlashGrid | Styles | Into Tactics battles on the live map. An encounter's own Transition Style wins. | |
Black Hold Seconds (BlackHoldSeconds) | float | 0.200000 | Timing | Black between the effect and the battle: the battle starts and its camera takes over here, unseen. | |
Capture Max Width (CaptureMaxWidth) | int32 | 1280 | Timing | Width of the captured frame (smaller = cheaper on handhelds; the effect moves too fast to show it). 0 = full size. | |
Capture Timeout (CaptureTimeout) | float | 0.350000 | Timing | The frame of exploration is taken before the effect; without one after this long, Fade plays instead. | |
Effect Seconds (EffectSeconds) | float | 0.850000 | Timing | The effect itself (shards falling, the whirl, the rush, the wipe, the fade to black). | |
Fade in Seconds (FadeInSeconds) | float | 0.450000 | Timing | Fade from black into the battle. | |
Widget Class (WidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widget | The transition screen (D-052). Empty = the built-in one (drawn in C++). A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEBattleTransitionViewModel (the captured frame, the style, the phase and its progress, the darkness, the flash, the intro text). | |
ZOrder (ZOrder) | int32 | 500 | Widget | Z-order of the transition screen: above every HUD and screen. |
RPG Saga Engine: Bestiary
Class URSEBestiarySettings (module RSECore), Project Settings, Project, RPG Saga Engine. Bestiary rules (D-047, Project Settings -> RPG Saga Engine -> Bestiary): which enemies get an entry and how much each entry reveals.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Player Can Always Show Enemy Health (bPlayerCanAlwaysShowEnemyHealth) | bool | True | Battle HUD | The players' option to always show enemy HP is offered (accessibility). | |
Enemy Health Reveal (EnemyHealthReveal) | ERSEEnemyHealthReveal | WhenScanned | Battle HUD | D-147: when the battle HUDs (turn order bar, target preview) show an enemy's HP. Hidden HP shows as "?". A Scan ability or item reveals the type for good (bestiary). Players may choose to always see it (Options -> Game). | |
Listed Stats (ListedStats) | TArray<FGameplayTag> | (7 entries) | Display | Stats listed on an entry, in order (names from UI -> TagLabels). | |
Enemy Roster Only (bEnemyRosterOnly) | bool | True | Recording | Only characters whose roster is Enemy get entries (off: every non-player unit, e.g. neutral guests). | |
Record Summons (bRecordSummons) | bool | False | Recording | Summoned (temporary) enemy units are recorded too. | |
Description on Encounter (bDescriptionOnEncounter) | bool | True | Reveal | The description shows from the first encounter (off: after DefeatsToRevealStats defeats). | |
Defeats to Reveal Affinities (DefeatsToRevealAffinities) | int32 | 1 | Reveal | Defeats needed before the elemental weaknesses and resistances show. | |
Defeats to Reveal Drops (DefeatsToRevealDrops) | int32 | 1 | Reveal | Defeats needed before the drops (loot table, D-042) show. | |
Defeats to Reveal Stats (DefeatsToRevealStats) | int32 | 1 | Reveal | Defeats needed before the stats show. 0 = from the first encounter. |
RPG Saga Engine: Bestiary UI
Class URSEBestiaryUISettings (module RSE), Project Settings, Project, RPG Saga Engine. The party menu's Bestiary page (D-047).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Resist Color (ResistColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.028463,Chroma=0.871971,Hue=6.030436,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Weak Color (WeakColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.032983,Chroma=0.852280,Hue=15.421614,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Colour of weaknesses (and of absorbed / resisted elements). | |
Details Width (DetailsWidth) | float | 460.000000 | Layout | Width of the details panel. | |
Affinities Header (AffinitiesHeader) | FText | NSLOCTEXT("RSEBestiaryUI", "AffinitiesHeader", "Elements") | Texts | ||
Affinity Format (AffinityFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "AffinityFormat", "{Element}: {Affinity}") | Texts | {Element}: {Affinity}. | |
Affinity Names (AffinityNames) | TMap<ERSEElementAffinity,FText> | (4 entries) | Texts | Affinity names (Normal is never listed). | |
Category Labels (CategoryLabels) | TArray<FRSEBestiaryCategoryLabel> | (3 entries) | Texts | Category names (content tags, in DefaultGame.ini). A category without a label shows its last tag part. | |
Count Format (CountFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "CountFormat", "{Count} {Count}|plural(one=entry,other=entries)") | Texts | {Count} entries. | |
Defeated Format (DefeatedFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "Defeated", "Defeated: {Count}") | Texts | {Count} = units defeated. | |
Drop Format (DropFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "DropFormat", "{Item} ×{Count} ({Chance}%)") | Texts | {Item}, {Chance} (percent), {Count} ("1" or "1-2"). | |
Drops Header (DropsHeader) | FText | NSLOCTEXT("RSEBestiaryUI", "DropsHeader", "Drops") | Texts | ||
Empty Text (EmptyText) | FText | NSLOCTEXT("RSEBestiaryUI", "Empty", "No enemies met yet.") | Texts | ||
Encountered Format (EncounteredFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "Encountered", "Met: {Count}") | Texts | {Count} = units met. | |
Level Format (LevelFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "Level", "{Term.LevelShort} {Level}") | Texts | {Level}. | |
List Column Text (ListColumnText) | FText | NSLOCTEXT("RSEBestiaryUI", "ListColumn", "{Term.Enemies}") | Texts | --- Texts --- | |
Locked Text (LockedText) | FText | NSLOCTEXT("RSEBestiaryUI", "Locked", "??? Defeat one to learn more.") | Texts | Instead of a hidden section: defeat one to learn more. | |
Money Drop Format (MoneyDropFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "MoneyDrop", "{Min} - {Max}") | Texts | {Min} - {Max}: money dropped (formatted with the currency). | |
No Affinities Text (NoAffinitiesText) | FText | NSLOCTEXT("RSEBestiaryUI", "NoAffinities", "No weaknesses or resistances.") | Texts | ||
No Drops Text (NoDropsText) | FText | NSLOCTEXT("RSEBestiaryUI", "NoDrops", "Nothing.") | Texts | ||
Row Defeated Format (RowDefeatedFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "RowDefeated", "×{Count}") | Texts | Row detail: {Count} defeated. | |
Stat Format (StatFormat) | FText | NSLOCTEXT("RSEBestiaryUI", "StatFormat", "{Stat} {Value}") | Texts | Stat line: {Stat} {Value}. | |
Stats Header (StatsHeader) | FText | NSLOCTEXT("RSEBestiaryUI", "StatsHeader", "Stats") | Texts | ||
Uncategorized Text (UncategorizedText) | FText | NSLOCTEXT("RSEBestiaryUI", "Uncategorized", "Other") | Texts | Category heading of enemies without a category. |
RPG Saga Engine: Buildings
Class URSEBuildingSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Building entrances and interiors (D-150): Project Settings -> RPG Saga Engine -> Buildings.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Building Size (BuildingSize) | FVector2D | (X=300.000000,Y=6000.000000) | Analyzer | Smallest and largest footprint of a building (cm, the bounds' longer side). | |
Building Words (BuildingWords) | TArray<FString> | (22 entries) | Analyzer | The building analyzer's words (lower case, matched in actor labels, names and mesh names). | |
Default Template (DefaultTemplate) | TSoftObjectPtr<URSEInteriorTemplateData> | /RPGSagaEngine/Data/Interiors/DA_InteriorTemplate_House.DA_InteriorTemplate_House | Analyzer | ||
Door Reach (DoorReach) | float | 150.000000 | Analyzer | A door belongs to a building when it is this close to the building's bounds (cm). | |
Door Words (DoorWords) | TArray<FString> | (4 entries) | Analyzer | ||
Navigable Share (NavigableShare) | float | 0.500000 | Analyzer | The interior counts as navigable when this share of its floor probe points is free and walkable. | |
Stair Words (StairWords) | TArray<FString> | (3 entries) | Analyzer | ||
Templates (Templates) | TArray<TSoftObjectPtr<URSEInteriorTemplateData> > | (9 entries) | Analyzer | The templates the analyzer picks from (by keyword), and the one used when no keyword matches. | |
Default Door Height (DefaultDoorHeight) | float | 230.000000 | Door Detection | ||
Default Door Width (DefaultDoorWidth) | float | 130.000000 | Door Detection | D-158: the door's size when nothing was measured (cm). | |
Door Detection (DoorDetection) | FRSEDoorDetectionRules | (MinWidth=70.000000,MaxWidth=280.000000,MinHeight=170.000000,MaxHeight=380.000000,MaxSill=80.000000,DepthTolerance=5.000000,ColumnFill=0.750000,LintelRows=2,Pre... | Door Detection | D-158: what counts as a door modelled into a building's mesh (the Building Analyzer, Detect Door). | |
Door Zone Inside (DoorZoneInside) | float | 25.000000 | Door Detection | ||
Door Zone Outside (DoorZoneOutside) | float | 70.000000 | Door Detection | D-158: the entrance's interaction zone: how far it reaches out in front of the door and into the doorway (cm). | |
Analyzer Generates Interiors (bAnalyzerGeneratesInteriors) | bool | True | Generated Interiors | D-158: the Building Analyzer makes generated interiors (off: copies of the templates' maps, as before). | |
Generated Interior Map (GeneratedInteriorMap) | TSoftObjectPtr<UWorld> | /RPGSagaEngine/Interiors/Generated/L_RSE_Interior_Generated.L_RSE_Interior_Generated | Generated Interiors | D-158: the map generated interiors load (it holds an RSE Generated Interior actor that builds the rooms). | |
Generation (Generation) | FRSEInteriorLayoutRules | (Snap=(bSnapToKitGrid=True,SnapTolerance=25.000000,bHalfModules=True,bStoreyHeightFromKit=True,MinSteps=2,GridTolerance=2.000000),Windows=(bWindows=True,bWithKi... | Generated Interiors | D-158: the generator's measures (doors, walls, stairs, paths, the furniture checker). | |
Interior Scale (InteriorScale) | float | 1.150000 | Generated Interiors | D-158: the inside's size from the outside's footprint (a roomy feel) and its limits (cm). | |
Lore Libraries (LoreLibraries) | TArray<TSoftObjectPtr<URSELoreLibraryData> > | (1 entries) | Generated Interiors | D-158: lore texts for books, letters and notes in generated interiors. | |
Max Floors (MaxFloors) | int32 | 4 | Generated Interiors | ||
Max Interior Size (MaxInteriorSize) | FVector2D | (X=2800.000000,Y=2200.000000) | Generated Interiors | ||
Min Interior Size (MinInteriorSize) | FVector2D | (X=600.000000,Y=500.000000) | Generated Interiors | ||
Roof Share (RoofShare) | float | 0.300000 | Generated Interiors | ||
Storey Height (StoreyHeight) | float | 330.000000 | Generated Interiors | D-158: a building's storey height outside (cm) and the share of its height that is roof: its floor count. | |
Auto Close Delay (AutoCloseDelay) | float | 2.000000 | Real Doors | Seconds after the last member left before an auto-opened door closes (0 = it stays open). | |
Auto Open Radius (AutoOpenRadius) | float | 220.000000 | Real Doors | Real doors open by themselves when a party member comes this close (cm; 0 = only by Interact). | |
Blackout Adapt Speed (BlackoutAdaptSpeed) | float | 200.000000 | Separate Interiors | D-158: how fast the eye adapts under the blackout (f-stops per second; very fast = done before the screen is back). | |
Blackout Color (BlackoutColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=1.000000) | Separate Interiors | ||
Blackout Seconds (BlackoutSeconds) | float | 0.400000 | Separate Interiors | Seconds of black between outside and a separate interior (0.3 to 0.5 feels like a cut, not a loading screen). | |
Unload on Exit (bUnloadOnExit) | bool | True | Separate Interiors | Leaving unloads the interior (off: it stays loaded for a quick return; more memory). | |
Default Rules (DefaultRules) | FRSEInteriorRules | (bSeal=True,ShellPadding=(X=1500.000000,Y=1500.000000,Z=1200.000000),bHideWorldLighting=True,ExposureEV100=1.000000,bPresetExposureOnEntry=True,ExposureHoldSeco... | Separate Interiors | D-153: the rules of interiors without a template or an override of their own. | |
Exit Distance (ExitDistance) | float | 180.000000 | Separate Interiors | Where the party stands when it comes out: this far in front of the door (cm), facing away from it. | |
Exit Search Distance (ExitSearchDistance) | float | 420.000000 | Separate Interiors | D-153: an exit point is searched up to this far from the door (cm) when the first spot is blocked or off the ground. | |
Fade Out Share (FadeOutShare) | float | 0.400000 | Separate Interiors | Share of the blackout spent fading to black (the rest fades back in). | |
Instance Origin (InstanceOrigin) | FVector | (X=0.000000,Y=0.000000,Z=100000.000000) | Separate Interiors | Where the first interior's level instance sits (cm): far above the playable area (never below it: a level's Kill Z would destroy the party there). | |
Instance Slots (InstanceSlots) | int32 | 64 | Separate Interiors | How many different places interiors use (their ids spread over them). | |
Instance Spacing (InstanceSpacing) | FVector | (X=20000.000000,Y=0.000000,Z=0.000000) | Separate Interiors | The distance between two interiors' places (cm; each interior has its own, from its id). | |
Point Clearance Half Height (PointClearanceHalfHeight) | float | 88.000000 | Separate Interiors | ||
Point Clearance Radius (PointClearanceRadius) | float | 40.000000 | Separate Interiors | D-153: the room a character needs at an exit or entry point (capsule radius and half height, cm). | |
Shell Mesh (ShellMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Separate Interiors | D-153: the mesh the shell's slabs are made of (a box, scaled to each slab). | |
Void Material (VoidMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/EngineDebugMaterials/BlackUnlitMaterial.BlackUnlitMaterial | Separate Interiors | D-153: the material of a sealed interior's shell (unlit black). | |
Asked Host Text (AskedHostText) | FText | NSLOCTEXT("RSEBuildingEntrances", "AskedHost", "The host was asked to go in.") | Texts | A guest asked the host to enter (co-op). | |
Closed Text (ClosedText) | FText | NSLOCTEXT("RSEBuildingEntrances", "Closed", "It\'s closed. Come back later.") | Texts | ||
Enter Prompt (EnterPrompt) | FText | NSLOCTEXT("RSEBuildingEntrances", "Enter", "Enter") | Texts | ||
Exit Prompt (ExitPrompt) | FText | NSLOCTEXT("RSEBuildingEntrances", "Exit", "Leave") | Texts | ||
Locked Text (LockedText) | FText | NSLOCTEXT("RSEBuildingEntrances", "Locked", "The door is locked.") | Texts |
RPG Saga Engine: Camera Framing
Class URSECameraFramingSettings (module RSE), Project Settings, Project, RPG Saga Engine. D-183: obstruction-aware cameras (Project Settings -> RPG Saga Engine -> Camera Framing).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Capture Max Push Out (CaptureMaxPushOut) | float | 1500.000000 | Capture | How far a capture point inside geometry may be pushed out (cm). | |
Capture Min Clear Distance (CaptureMinClearDistance) | float | 400.000000 | Capture | A capture point without a look target is occluded when geometry stands closer than this along its view (cm). | |
Cinematic Battle (CinematicBattle) | FRSECinematicBattleCamera | (OverShoulderDistance=420.000000,ReactionDistance=360.000000,WideDistance=1100.000000,FieldOfView=50.000000,HeightOffset=40.000000,CutAngle=40.000000,BlendSecon... | Cinematic Battle Camera | The cinematic battle camera (captures, trailers). | |
Enabled (bEnabled) | bool | True | Framing | Cameras avoid obstructions (off = every camera keeps its own pose). | |
Camera Blocker Tag (CameraBlockerTag) | FName | RSE.CameraBlocker | Framing | Actors or components with this tag always block the camera (it moves instead of fading them). | |
Action (Action) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=20.000000,NearClipMargin=8.000000,bAnyGeometryObstructs=True,FocusHeights=(90.000000,160.000000),MaxFocusTarg... | Modes | The action battle camera: the view stays the player's; geometry pulls it in. | |
ATB (ATB) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,FocusHeights=(110.000000),MaxFocusTargets=6,YawStep=10.000000,YawSteps=3,Pi... | Modes | The ATB stage camera (framed once when the battle starts: the stage stays composed). | |
Capture (Capture) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,bAnyGeometryObstructs=True,FocusHeights=(0.000000),MaxFocusTargets=1,YawSte... | Modes | Clip capture points: how an occluded point is fixed. | |
Exploration (Exploration) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,FocusHeights=(90.000000,160.000000),MaxFocusTargets=1,YawStep=20.000000,Pit... | Modes | The exploration camera (tactical style): the yaw stays the player's; the angle rises and the distance comes in. | |
Free Tactics (FreeTactics) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,FocusHeights=(90.000000,160.000000),MaxFocusTargets=2,YawStep=20.000000,Yaw... | Modes | The Free Tactics / live battle camera. | |
Grid Tactics (GridTactics) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,FocusHeights=(60.000000,150.000000),MaxFocusTargets=2,YawStep=15.000000,Yaw... | Modes | The grid Tactics camera: the grid stays readable (steeper angles and other sides before coming in). | |
Shot (Shot) | FRSECameraFramingRules | (bEnabled=True,ProbeChannel=ECC_Camera,ProbeRadius=24.000000,NearClipMargin=8.000000,bAnyGeometryObstructs=True,FocusHeights=(90.000000,160.000000),MaxFocusTarg... | Modes | The cinematic shots of battle timelines: never inside geometry while they blend. |
RPG Saga Engine: Camera Occlusion
Class URSECameraOcclusionSettings (module RSE), Project Settings, Project, RPG Saga Engine. What stands between the RPG cameras (the tactical exploration camera, the Free Tactics camera) and the party (D-113, D-116): these cameras never collide with the world; what hides the party fades instead, only around the party.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Collection (Collection) | TSoftObjectPtr<UMaterialParameterCollection> | /RPGSagaEngine/Materials/Camera/MPC_RSE_CameraOcclusion.MPC_RSE_CameraOcclusion | Fade | The see-through circle of opted-in materials (MF_RSE_CameraOcclusion reads it). Empty = no fading, only the fallback. | |
Fade Function (FadeFunction) | TSoftObjectPtr<UMaterialFunctionInterface> | /RPGSagaEngine/Materials/Camera/MF_RSE_CameraOcclusion.MF_RSE_CameraOcclusion | Fade | The material function that makes a material fade (MF_RSE_CameraOcclusion): RPG Saga -> Add Camera Occlusion Fade (the Content Browser menu of materials) multiplies the material's Opacity Mask by it. | |
Fade Seconds (FadeSeconds) | float | 0.350000 | Fade | Seconds a see-through circle takes to open or close (opted-in materials and ghosts alike): never a pop. | |
Hole Keep Near Target (HoleKeepNearTarget) | float | 60.000000 | Fade | What stands closer than this in front of a character is left alone (the chair beside it, cm). | |
Hole Radius (HoleRadius) | float | 170.000000 | Fade | Radius of the see-through circle at the character (cm); it keeps its size on screen toward the camera. | |
Hole Softness (HoleSoftness) | float | 45.000000 | Fade | Soft edge of the circle (cm at the character). | |
Marker Parameter (MarkerParameter) | FName | RSE_CameraOcclusion | Fade | A material with this scalar parameter (the material function declares it) fades instead of hiding. | |
Opt in Content Roots (OptInContentRoots) | TArray<FString> | (1 entries) | Fade | D-116: content roots whose materials Add Camera Occlusion Fade may change (it changes an instance's parent material). The engine's and the plugins' materials are never changed: their objects become ghosts instead. | |
Ghost Fallback (bGhostFallback) | bool | True | Ghost Fallback | Objects whose materials have no Camera Occlusion Fade get the same see-through circle while they hide the party: their materials are swapped for the Ghost Material (with their own base texture and color when found), the circle opens over Fade Seconds, and their materials come back once it closed. An instanced mesh (a tree of a forest) gets a copy of the one tree in the way. Off = they hide (Hide Fallback). | |
Ghost Color Parameters (GhostColorParameters) | TArray<FName> | (8 entries) | Ghost Fallback | Color parameters a ghost multiplies its texture by, in this order (none = white). | |
Ghost Material (GhostMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Camera/M_RSE_CameraOcclusionGhost.M_RSE_CameraOcclusionGhost | Ghost Fallback | The material ghosts wear (M_RSE_CameraOcclusionGhost): masked, two-sided, the see-through circle of the Collection, with the parameters BaseTexture, BaseTint, Roughness, UseTextureAlpha, AlphaClip and RSE_GhostFade (0..1, how far the circle is open). | |
Ghost Material Two Sided (GhostMaterialTwoSided) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Camera/MI_RSE_CameraOcclusionGhost_TwoSided.MI_RSE_CameraOcclusionGhost_TwoSided | Ghost Fallback | The ghost of a two-sided material (leaves, cloth): the same, two-sided (MI_RSE_CameraOcclusionGhost_TwoSided). Empty = Ghost Material. | |
Ghost Min Coverage (GhostMinCoverage) | float | 0.200000 | Ghost Fallback | Share of a character's sample points (0..1) an object must cover before it turns into a ghost: a big tree touching one shoulder stays. | |
Ghost Neutral Color (GhostNeutralColor) | FLinearColor | (R=0.450000,G=0.450000,B=0.450000,A=1.000000) | Ghost Fallback | The color of a ghost whose material gives neither a texture nor a color. | |
Ghost Roughness Parameters (GhostRoughnessParameters) | TArray<FName> | (3 entries) | Ghost Fallback | Scalar parameters a ghost takes its roughness from, in this order (none = the ghost material's own). | |
Ghost Texture Parameters (GhostTextureParameters) | TArray<FName> | (15 entries) | Ghost Fallback | Texture parameters a ghost takes its base texture from, in this order (else the material's first color texture). | |
Max Ghosts (MaxGhosts) | int32 | 16 | Ghost Fallback | Ghosts at once at most (the nearest to the lines of view first); the rest fall back to hiding. | |
Hide Fallback (bHideFallback) | bool | True | Hide Fallback | Objects that cannot fade nor become a ghost are hidden while they hide the party (off = they stay). | |
Single Instances (bHideSingleInstances) | bool | True | Hide Fallback | D-112, D-116: single instances of instanced meshes whose materials cannot fade (one tree of an instanced forest, one rock) are handled one at a time while they hide the party: a ghost copy of that one tree (Ghost Fallback), else hidden (scaled to nothing, put back after); the rest of the forest stays. Off = instanced meshes are never touched. | |
Never Hide Instanced (bNeverHideInstanced) | bool | True | Hide Fallback | Instanced meshes (foliage, forests) are never hidden or ghosted as a whole: they fade when their material is opted in, else one instance at a time (Single Instances). | |
Hide Min Coverage (HideMinCoverage) | float | 0.600000 | Hide Fallback | Share of a character's sample points (0..1) an object must cover before it is hidden: never a whole big tree for a small intrusion. | |
Instance Max Size (InstanceMaxSize) | float | 1500.000000 | Hide Fallback | Instances at least this wide on both sides are never touched (ground pieces, cliffs, big terrain meshes). | |
Max Hidden (MaxHidden) | int32 | 24 | Hide Fallback | Objects hidden at once at most (the nearest to the lines of view first). | |
Max Hidden Instances (MaxHiddenInstances) | int32 | 32 | Hide Fallback | Instances hidden or ghosted at once at most. | |
Enabled (bEnabled) | bool | True | Occlusion | Objects between the camera and the party fade (opted-in materials) or hide (the rest). | |
Trace Complex (bTraceComplex) | bool | True | Occlusion | The lines of view test the meshes' real shape (their triangles), not their simple collision: a canopy over a trunk counts. | |
Check Interval (CheckInterval) | float | 0.100000 | Occlusion | Seconds between two checks of what stands in the way (the see-through circle itself moves every frame). | |
Floor Tolerance (FloorTolerance) | float | 40.000000 | Occlusion | Objects whose top is lower than this above a character's feet are ground, never hidden (cm). | |
Focus Height (FocusHeight) | float | 100.000000 | Occlusion | Height above a character's feet of the see-through circle's center (its chest, cm). | |
Max Fade Size (MaxFadeSize) | float | 1500.000000 | Occlusion | D-183: objects at least this wide on both sides (cliffs, big terrain meshes, whole rock faces) never fade or hide: the obstruction-aware cameras move around them instead (Camera Framing). 0 = any size fades. | |
Max Objects Per Line (MaxObjectsPerLine) | int32 | 6 | Occlusion | Objects one line of view looks through at most (a wall, then a tree behind it...). | |
Max Targets (MaxTargets) | int32 | 4 | Occlusion | Characters kept visible at most (the leader first, then the nearest party members; the active unit and the cursor in battle). | |
Never Fade Tag (NeverFadeTag) | FName | RSE.NoFade | Occlusion | Actors or components with this tag never fade or hide. | |
Probe Channel (ProbeChannel) | TEnumAsByte<ECollisionChannel> | ECC_Visibility | Occlusion | Trace channel of the probe (objects that ignore it never fade). | |
Probe Radius (ProbeRadius) | float | 0.000000 | Occlusion | Radius of each line of view (cm; 0 = a thin line). Wider catches more around the line. | |
Sample Points (SamplePoints) | TArray<FVector2D> | (5 entries) | Occlusion | D-116: the points of each character the camera must see, as its silhouette on screen: X = to the side, across the view (cm), Y = height above the feet (cm). A line of view goes from the camera to each point; an object counts by how many of them it covers (Ghost Min Coverage, Hide Min Coverage). | |
Ground Lift Release Speed (GroundLiftReleaseSpeed) | float | 4.000000 | Terrain | How quickly the camera settles back down after it was lifted over a hill (higher = faster). | |
Ground Probe Distance (GroundProbeDistance) | float | 6000.000000 | Terrain | How far above and below the camera the terrain is looked for (cm). | |
Ground Tags (GroundTags) | TArray<FName> | (1 entries) | Terrain | Besides landscapes, actors or components with one of these tags are terrain: the RPG cameras stay above them. | |
Hide Delay (HideDelay) | float | 0.150000 | Timing | An object turns into a ghost or hides after it has been in the way this long (no flicker when brushing past). | |
Show Delay (ShowDelay) | float | 0.400000 | Timing | A ghost or a hidden object comes back after it has been out of the way this long; the see-through circles close after it too. |
RPG Saga Engine: Cards
Class URSECardSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Card game rules (D-028).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Max Copies Per Card (MaxCopiesPerCard) | int32 | 99 | Collection | Most copies of one card the collection holds (extra copies are not added). | |
Starting Cards (StartingCards) | TMap<TSoftObjectPtr<URSECardData> ,int32> | (11 entries) | Collection | Cards owned when a new game starts; the starting deck is auto-built from them. | |
Max Deck Size (MaxDeckSize) | int32 | 15 | Deck | Most cards in a deck (the player's and every opponent's). | |
Min Deck Size (MinDeckSize) | int32 | 1 | Deck | Fewest cards the player needs to play. | |
Shuffle Decks (bShuffleDecks) | bool | True | Match | Shuffle both decks at the start of a match. Off only for debugging (decks play in list order). | |
Turn Limit (TurnLimit) | int32 | 40 | Match | A match ends after this many turns; the player with more cards wins (equal = draw). | |
Rarity Tiers (RarityTiers) | TArray<FRSECardRarityTier> | (3 entries) | Rarity | Rarity tiers and their value ranges; card validation checks each card against its tier. | |
Protected Value (ProtectedValue) | int32 | 7 | Stake | Cards with at least this value can never be lost as a stake. |
RPG Saga Engine: Cards UI
Class URSECardUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Card game presentation (D-028): the War table, the result screen, the album / deck editor and challenge notices.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Album Column Width (AlbumColumnWidth) | float | 380.000000 | Album | ||
Album Height (AlbumHeight) | float | 620.000000 | Album | ||
Album Width (AlbumWidth) | float | 1100.000000 | Album | --- Album layout --- | |
Protected Color (ProtectedColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.056059,Chroma=0.827640,Hue=-13.637671,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Album | ||
Validation Error Color (ValidationErrorColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.019198,Chroma=0.887452,Hue=-0.115458,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Album | ||
Validation Ok Color (ValidationOkColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Album | ||
Card Back Color (CardBackColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.106148,Chroma=0.976898,Hue=41.373325,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Card | ||
Card Back Pattern Color (CardBackPatternColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=0.012852,Chroma=0.996315,Hue=41.214352,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Card | Pattern colour of the card back (inner panel). | |
Card Corner Radius (CardCornerRadius) | float | 8.000000 | Card | ||
Card Face Bottom Color (CardFaceBottomColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=-0.032428,Chroma=0.276497,Hue=-8.469772,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Card | ||
Card Face Color (CardFaceColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.046021,Chroma=0.160610,Hue=-2.762362,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Card | Card face: a gradient from CardFaceColor (top) to CardFaceBottomColor. | |
Card Icon Size (CardIconSize) | float | 56.000000 | Card | Icon size inside a card (the art is optional). | |
Card Name Font Size (CardNameFontSize) | int32 | 11 | Card | ||
Card Size (CardSize) | FVector2D | (X=120.000000,Y=170.000000) | Card | Card size on the table (the album preview uses the same size). | |
Card Text Color (CardTextColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.430560,Chroma=1.949115,Hue=30.887167,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Card | Value and name text on the card face. | |
Card Value Font Size (CardValueFontSize) | int32 | 40 | Card | ||
Fallback Style (FallbackStyle) | FRSECardRarityStyle | (Rarity=(),FrameColor=(Token="Neutral",Alpha=1.000000,Lightness=-0.116132,Chroma=0.000002,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)),TextColor=(Tok... | Card | Frame used for a rarity without a style. | |
Rarity Styles (RarityStyles) | TArray<FRSECardRarityStyle> | (3 entries) | Card | --- Card look --- | |
Small Card Size (SmallCardSize) | FVector2D | (X=84.000000,Y=119.000000) | Card | Card size in the result screen's reward list. | |
Auto Build Keys (AutoBuildKeys) | TArray<FKey> | (2 entries) | Input | Album: build the best deck. | |
Back Keys (BackKeys) | TArray<FKey> | (3 entries) | Input | Table: skip to the result, then close it. Album: close. | |
Confirm Keys (ConfirmKeys) | TArray<FKey> | (3 entries) | Input | Table: skip to the result, then close it. Album: add / remove the selected card. | |
Down Keys (DownKeys) | TArray<FKey> | (4 entries) | Input | ||
Left Keys (LeftKeys) | TArray<FKey> | (4 entries) | Input | ||
Right Keys (RightKeys) | TArray<FKey> | (4 entries) | Input | ||
Speed Keys (SpeedKeys) | TArray<FKey> | (3 entries) | Input | Table: next replay speed. | |
Up Keys (UpKeys) | TArray<FKey> | (4 entries) | Input | --- Input (the card screens hold keyboard focus and read keys directly, like the main menu) --- | |
Default Speed Index (DefaultSpeedIndex) | int32 | 0 | Pacing | Index into SpeedOptions used for the first match of a session. | |
Notice Duration (NoticeDuration) | float | 2.500000 | Pacing | How long a challenge refusal notice stays on screen. | |
Pacing (Pacing) | FRSECardPacing | (Intro=0.600000,Reveal=0.450000,Compare=0.500000,WarBanner=0.900000,FaceDown=0.150000,Decider=0.700000,Forfeit=0.900000,PileReturned=0.900000,Collect=0.450000,T... | Pacing | --- Pacing (seconds at speed x1) --- | |
Speed Options (SpeedOptions) | TArray<float> | (3 entries) | Pacing | Replay speeds the speed button cycles through. | |
Cards Per Deck Layer (CardsPerDeckLayer) | int32 | 3 | Table | Deck piles show one back per this many cards (visual thickness). | |
Deck Offset (DeckOffset) | FVector2D | (X=-330.000000,Y=190.000000) | Table | Player's deck. | |
Max Visible Stack Cards (MaxVisibleStackCards) | int32 | 8 | Table | Most face-down cards drawn in a stack (the count label shows the real number). | |
Played Card Offset (PlayedCardOffset) | FVector2D | (X=0.000000,Y=115.000000) | Table | Player's revealed card (the opponent's is mirrored above the centre). | |
Result Panel Width (ResultPanelWidth) | float | 560.000000 | Table | ||
Stack Card Step (StackCardStep) | FVector2D | (X=6.000000,Y=-3.000000) | Table | Screen offset between two face-down cards of a war stack. | |
Table Color (TableColor) | FRSEUIColor | (Token="Secondary",Alpha=1.000000,Lightness=-0.420493,Chroma=0.888146,Hue=-34.901016,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Table | Table felt (opaque: the table hides the world and any dialog behind it). Edges darken toward TableEdgeColor. | |
Table Edge Color (TableEdgeColor) | FRSEUIColor | (Token="Secondary",Alpha=1.000000,Lightness=-0.596025,Chroma=0.501982,Hue=-31.293844,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Table | ||
Table Light Color (TableLightColor) | FRSEUIColor | (Token="Secondary",Alpha=0.120000,Lightness=0.026886,Chroma=1.248798,Hue=-41.326351,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Table | Soft light over the middle of the table. | |
War Banner Color (WarBannerColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.078838,Chroma=1.090544,Hue=-35.890274,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Table | ||
War Stack Offset (WarStackOffset) | FVector2D | (X=170.000000,Y=115.000000) | Table | Player's face-down war stack, next to the revealed card. | |
Winner Card Scale (WinnerCardScale) | float | 1.120000 | Table | The winning card is scaled up by this much while the trick is decided. | |
Album Column Action Text (AlbumColumnActionText) | FText | NSLOCTEXT("RSECardUISettings", "AlbumColumnAction", "Collection / Deck") | Texts|Album | Key prompt actions of the album. | |
Album Hint Text (AlbumHintText) | FText | Texts|Album | Optional line under the album key prompts (empty = none). | ||
Album Title (AlbumTitle) | FText | NSLOCTEXT("RSECardUISettings", "AlbumTitle", "Card Album") | Texts|Album | ||
Album Toggle Action Text (AlbumToggleActionText) | FText | NSLOCTEXT("RSECardUISettings", "AlbumToggleAction", "Add / Remove") | Texts|Album | ||
Auto Build Label (AutoBuildLabel) | FText | NSLOCTEXT("RSECardUISettings", "AutoBuild", "Best deck") | Texts|Album | ||
Card Row Format (CardRowFormat) | FText | NSLOCTEXT("RSECardUISettings", "CardRow", "[{Value}] {Name}") | Texts|Album | Row label: {Value} {Name} | |
Close Label (CloseLabel) | FText | NSLOCTEXT("RSECardUISettings", "Close", "Close") | Texts|Album | ||
Collection Header (CollectionHeader) | FText | NSLOCTEXT("RSECardUISettings", "Collection", "Collection") | Texts|Album | ||
Deck Header Format (DeckHeaderFormat) | FText | NSLOCTEXT("RSECardUISettings", "DeckHeader", "Deck {Count} / {Max}") | Texts|Album | {Count} {Max} | |
Deck Invalid Card Text (DeckInvalidCardText) | FText | NSLOCTEXT("RSECardUISettings", "DeckInvalidCard", "A card in the deck is missing.") | Texts|Album | ||
Deck Kept Text (DeckKeptText) | FText | NSLOCTEXT("RSECardUISettings", "DeckKept", "The edited deck is not valid: your previous deck is kept.") | Texts|Album | Shown when the album closes with an invalid deck: the last valid deck stays. | |
Deck Not Owned Text (DeckNotOwnedText) | FText | NSLOCTEXT("RSECardUISettings", "DeckNotOwned", "The deck uses cards you do not own.") | Texts|Album | ||
Deck Too Large Format (DeckTooLargeFormat) | FText | NSLOCTEXT("RSECardUISettings", "DeckTooLarge", "The deck holds at most {Max} {Max}|plural(one=card,other=cards).") | Texts|Album | ||
Deck Too Small Format (DeckTooSmallFormat) | FText | NSLOCTEXT("RSECardUISettings", "DeckTooSmall", "The deck needs at least {Min} {Min}|plural(one=card,other=cards).") | Texts|Album | ||
Deck Total Format (DeckTotalFormat) | FText | NSLOCTEXT("RSECardUISettings", "DeckTotal", "Total value {Total}") | Texts|Album | {Total} | |
Deck Valid Text (DeckValidText) | FText | NSLOCTEXT("RSECardUISettings", "DeckValid", "Deck ready.") | Texts|Album | ||
Empty Collection Text (EmptyCollectionText) | FText | NSLOCTEXT("RSECardUISettings", "EmptyCollection", "No cards yet.") | Texts|Album | ||
Empty Deck Text (EmptyDeckText) | FText | NSLOCTEXT("RSECardUISettings", "EmptyDeck", "The deck is empty.") | Texts|Album | ||
Owned Detail Format (OwnedDetailFormat) | FText | NSLOCTEXT("RSECardUISettings", "OwnedDetail", "{InDeck} / {Owned}") | Texts|Album | Collection row detail: {InDeck} {Owned} | |
Preview Owned Format (PreviewOwnedFormat) | FText | NSLOCTEXT("RSECardUISettings", "PreviewOwned", "Owned: {Owned} In deck: {InDeck}") | Texts|Album | Preview line: {Owned} {InDeck} | |
Protected Marker (ProtectedMarker) | FText | NSLOCTEXT("RSECardUISettings", "Protected", "Protected: never lost as a stake") | Texts|Album | Preview label of a card that cannot be lost as a stake. | |
Protected Owned Detail Format (ProtectedOwnedDetailFormat) | FText | NSLOCTEXT("RSECardUISettings", "ProtectedOwnedDetail", "{InDeck} / {Owned} (protected)") | Texts|Album | Collection row detail of a card that cannot be lost as a stake: {InDeck} {Owned} | |
Refused Busy Text (RefusedBusyText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedBusy", "You cannot play cards now.") | Texts|Challenge | Busy (battle, another card screen). | |
Refused Conditions Text (RefusedConditionsText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedConditions", "They do not want to play right now.") | Texts|Challenge | ||
Refused Host Only Text (RefusedHostOnlyText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedHostOnly", "Only the host can play cards in co-op.") | Texts|Challenge | Co-op: this player may not play cards (the card game is the host's at launch, D-139). Also the album's deck changes. | |
Refused Invalid Deck Text (RefusedInvalidDeckText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedInvalidDeck", "Your deck is not ready. Check it in the card album.") | Texts|Challenge | ||
Refused No Opponent Text (RefusedNoOpponentText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedNoOpponent", "There is nobody to play with.") | Texts|Challenge | ||
Refused No Rematch Text (RefusedNoRematchText) | FText | NSLOCTEXT("RSECardUISettings", "RefusedNoRematch", "They will not play you again.") | Texts|Challenge | ||
Continue Label (ContinueLabel) | FText | NSLOCTEXT("RSECardUISettings", "Continue", "Continue") | Texts|Result | ||
Draw Text (DrawText) | FText | NSLOCTEXT("RSECardUISettings", "Draw", "Draw") | Texts|Result | ||
End Deck Out Format (EndDeckOutFormat) | FText | NSLOCTEXT("RSECardUISettings", "EndDeckOut", "{Winner} took every card.") | Texts|Result | {Winner} | |
End No Cards for War Format (EndNoCardsForWarFormat) | FText | NSLOCTEXT("RSECardUISettings", "EndNoCardsForWar", "Nobody could finish the war: {Count0} to {Count1} cards.") | Texts|Result | {Count0} {Count1} | |
End Turn Limit Format (EndTurnLimitFormat) | FText | NSLOCTEXT("RSECardUISettings", "EndTurnLimit", "Turn limit ({Turns}) reached: {Count0} to {Count1} cards.") | Texts|Result | {Turns} {Count0} {Count1} | |
Lost Text (LostText) | FText | NSLOCTEXT("RSECardUISettings", "Lost", "Defeat") | Texts|Result | ||
No Stake Text (NoStakeText) | FText | NSLOCTEXT("RSECardUISettings", "NoStake", "No card changes hands.") | Texts|Result | Friendly match (no stake) or a draw. | |
Rewards Header (RewardsHeader) | FText | NSLOCTEXT("RSECardUISettings", "Rewards", "First victory rewards:") | Texts|Result | ||
Stake Lost Format (StakeLostFormat) | FText | NSLOCTEXT("RSECardUISettings", "StakeLost", "{Opponent} takes {Card} ({Rarity}).") | Texts|Result | {Opponent} {Card} {Rarity} | |
Stake Protected Text (StakeProtectedText) | FText | NSLOCTEXT("RSECardUISettings", "StakeProtected", "Every card in the loser\'s deck is protected: nothing is taken.") | Texts|Result | A winner, but every card of the loser was protected. | |
Stake Won Format (StakeWonFormat) | FText | NSLOCTEXT("RSECardUISettings", "StakeWon", "You win {Card} ({Rarity}).") | Texts|Result | {Card} {Rarity} | |
Won Text (WonText) | FText | NSLOCTEXT("RSECardUISettings", "Won", "Victory") | Texts|Result | ||
Deck Count Format (DeckCountFormat) | FText | NSLOCTEXT("RSECardUISettings", "DeckCount", "{Count} cards") | Texts|Table | {Count} | |
Forfeit Format (ForfeitFormat) | FText | NSLOCTEXT("RSECardUISettings", "Forfeit", "{Name} has no cards left for the war.") | Texts|Table | {Name} cannot go to war. | |
Pile Returned Text (PileReturnedText) | FText | NSLOCTEXT("RSECardUISettings", "PileReturned", "No cards left for the war: each takes back their own.") | Texts|Table | ||
Player Label (PlayerLabel) | FText | NSLOCTEXT("RSECardUISettings", "Player", "You") | Texts|Table | --- Texts (localizable; {named} arguments are filled by the widgets) --- | |
Skip Label (SkipLabel) | FText | NSLOCTEXT("RSECardUISettings", "Skip", "Skip") | Texts|Table | ||
Speed Action Text (SpeedActionText) | FText | NSLOCTEXT("RSECardUISettings", "SpeedAction", "Speed") | Texts|Table | Action of the speed key prompt. | |
Speed Format (SpeedFormat) | FText | NSLOCTEXT("RSECardUISettings", "Speed", "Speed x{Speed}") | Texts|Table | {Speed} | |
Stack Count Format (StackCountFormat) | FText | NSLOCTEXT("RSECardUISettings", "StackCount", "x{Count}") | Texts|Table | {Count} face-down cards in a war stack. | |
Table Hint Text (TableHintText) | FText | Texts|Table | |||
Turn Format (TurnFormat) | FText | NSLOCTEXT("RSECardUISettings", "Turn", "Turn {Turn} / {Limit}") | Texts|Table | {Turn} {Limit} | |
War Banner Text (WarBannerText) | FText | NSLOCTEXT("RSECardUISettings", "WarBanner", "War!") | Texts|Table | ||
War Detail Format (WarDetailFormat) | FText | NSLOCTEXT("RSECardUISettings", "WarDetail", "Tie on {Value}: {Count} {Count}|plural(one=card,other=cards) each") | Texts|Table | Under the banner. {Value} = tied value, {Count} = cards each player turns over. | |
Album Widget Class (AlbumWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widgets | Card album and deck editor (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSECardAlbumViewModel (docs/product/custom-ui.md). | |
Notice Widget Class (NoticeWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widgets | Card challenge notice (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSENoticeViewModel (docs/product/custom-ui.md). | |
Table Widget Class (TableWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Widgets | Card table (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSECardTableViewModel (docs/product/custom-ui.md). | |
Widget ZOrder (WidgetZOrder) | int32 | 60 | Widgets | Viewport Z order of the table and the album (above the HUDs). |
RPG Saga Engine: Character Actions
Class URSECharacterActionsSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. One-click character actions (D-084, docs/product/editors-and-wizards.md): Add to Starting Party, Make Recruitable and Make Enemy on a Character asset (Content Browser right-click, RPG Saga Engine -> Content -> Character Actions, the asset's Details).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Place Enemy in Level (bPlaceEnemyInLevel) | bool | True | Enemy | Place something that starts the battle in the open level: a roaming enemy spawner (classic modes) or a battle zone (Tactics). | |
Enemy Battle Mode (EnemyBattleMode) | FGameplayTag | () | Enemy | Battle mode of a new encounter. Empty = Wizards -> Default Battle Mode. | |
Enemy Group Size (EnemyGroupSize) | int32 | 2 | Enemy | Units of the character in a new encounter (a small group of the same enemy). | |
Enemy Outliner Folder (EnemyOutlinerFolder) | FName | RPG Saga/Enemies | Placement | World Outliner folder of the placed enemy spawners. | |
Ground Search Distance (GroundSearchDistance) | float | 2000.000000 | Placement | How far above and below the placement point the ground is searched. | |
NPCOutliner Folder (NPCOutlinerFolder) | FName | RPG Saga/NPCs | Placement | World Outliner folder of the placed NPCs. | |
Place Distance (PlaceDistance) | float | 500.000000 | Placement | New NPCs and enemy spawners are placed this far in front of the level viewport's camera (then dropped to the ground). | |
Declined Line (DeclinedLine) | FText | NSLOCTEXT("RSECharacterActions", "DefaultDeclined", "Suit yourself. You know where to find me.") | Recruit | Said after being turned down (the player may ask again later). | |
Decline Option (DeclineOption) | FText | NSLOCTEXT("RSECharacterActions", "DefaultDecline", "Not now.") | Recruit | Option that turns the character down (also the Cancel button). | |
Greeting Line (GreetingLine) | FText | NSLOCTEXT("RSECharacterActions", "DefaultGreeting", "Well met. I\'m {Name}. I hear you could use another pair of hands.") | Recruit | First line of the recruit dialog. {Name} = the character's name. | |
Joined Line (JoinedLine) | FText | NSLOCTEXT("RSECharacterActions", "DefaultJoined", "Then let\'s go. I\'m with you.") | Recruit | Said after joining. {Name} = the character's name. | |
Join Option (JoinOption) | FText | NSLOCTEXT("RSECharacterActions", "DefaultJoin", "Join us, {Name}.") | Recruit | Option that recruits the character. {Name} = the character's name. | |
Join Prompt (JoinPrompt) | FText | NSLOCTEXT("RSECharacterActions", "DefaultPrompt", "Ask {Name} to join the party?") | Recruit | Question shown with the two options. {Name} = the character's name. | |
Recruit Flag Root (RecruitFlagRoot) | FString | Narrative.Flag.Recruited | Recruit | Parent of the story flag set when a character joins ("Narrative.Flag.Recruited" -> Narrative.Flag.Recruited.Mira). | |
Recruit Flag Tag Source (RecruitFlagTagSource) | FString | RSE_Recruits.ini | Recruit | Tag file (Config/Tags of the project) new recruit flags are written to. | |
Max Starting Party Size (MaxStartingPartySize) | int32 | 0 | Starting Party | Most characters Add to Starting Party accepts in Party -> Starting Members. 0 = the battle places (the ATB party size of the default rules profile, Battle -> ATB Party Size) plus Starting Reserve Places (D-136). | |
Starting Reserve Places (StartingReservePlaces) | int32 | 4 | Starting Party | With Max Starting Party Size 0: starting members allowed after the battle places (D-136). They are in the party from the start and are swapped into battles from the party menu (Formation); in Tactics battles every member can be deployed. |
RPG Saga Engine: Character Packs
Class URSECharacterPackSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Character pack importer defaults (D-074): Project Settings -> RPG Saga Engine -> Character Packs.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Body Preset Prefix (BodyPresetPrefix) | FString | Importer | Prefix of the body presets the importer writes (<Prefix><Character>_<Skin>). | ||
Default Profile (DefaultProfile) | TSoftObjectPtr<URSECharacterPackProfile> | (set per project) | Importer | Profile the importer starts with (the plugin's generic one fits packs with conventional clip names). | |
Target Root (TargetRoot) | FDirectoryPath | (set per project) | Importer | Folder the imported characters go under (one subfolder per pack). Must be project content. | |
Display Name Noise Words (DisplayNameNoiseWords) | TArray<FString> | (26 entries) | New Character from Mesh | Words dropped when a character's display name is made from its asset name ("samurai_warrior_3d_model" -> "Samurai Warrior"): what model exporters and stores add to file names. Case-insensitive, whole words. | |
New Character Default Class (NewCharacterDefaultClass) | TSoftObjectPtr<URSEClassData> | /RPGSagaEngine/Data/Classes/DA_Class_Warrior.DA_Class_Warrior | New Character from Mesh | Class New Character from Mesh offers first. | |
New Character Profile (NewCharacterProfile) | TSoftObjectPtr<URSECharacterPackProfile> | /RPGSagaEngine/Data/CharacterPacks/DA_PackProfile_Generic.DA_PackProfile_Generic | New Character from Mesh | Profile New Character from Mesh starts from (D-085; a copy is adjusted for the one mesh: its class, height and animation source). Empty = Default Profile. |
RPG Saga Engine: Character Visuals
Class URSECharacterVisualSettings (module RSE), Project Settings, Project, RPG Saga Engine. Character Visuals
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Anchor Fallbacks (AnchorFallbacks) | TArray<FRSEAnchorFallback> | (2 entries) | Anchors | Where an anchor goes when a look has nothing for it, tried in order (e.g. Weapon Tip -> Right Hand for an unarmed caster, Muzzle -> Weapon Tip). A held weapon without a Weapon Tip socket gets its tip measured (the far end from the grip). | |
Default Blend Time (DefaultBlendTime) | float | 0.200000 | Animation | Blend in / out of state and reaction animations whose own BlendTime is negative. | |
Hit Direction Memory (HitDirectionMemory) | float | 3.000000 | Animation | A knock-out within this time of a hit falls the way the hit came from (directional Down animations); later ones use the front one. | |
Moving Speed Threshold (MovingSpeedThreshold) | float | 10.000000 | Animation | Speed (cm/s) above which a character counts as moving (the combat idle stops, locomotion takes over). | |
Speed Smoothing (SpeedSmoothing) | float | 12.000000 | Animation | How fast the measured speed follows the real one for actors moved without a movement component (grid units, cue moves). Higher = snappier, lower = smoother blends. 0 = no smoothing. | |
Turn Anim Min Angle (TurnAnimMinAngle) | float | 60.000000 | Animation | Standing turns of at least this angle play the anim set's turn in place clip (TurnLeft90 / TurnRight90 / Turn180), and the mesh turns over the clip's length. Smaller turns stay procedural. | |
Turn in Place Max Angle (TurnInPlaceMaxAngle) | float | 180.000000 | Animation | Turns larger than this snap (teleports, respawns). | |
Turn in Place Rate (TurnInPlaceRate) | float | 720.000000 | Animation | Facing turns (Tactics facing, turning to a target) are shown as a smooth turn in place at this speed instead of a snap. 0 = snap. | |
Animated Recoil Scale (AnimatedRecoilScale) | float | 0.400000 | Battle | Distance scale of the procedural hit recoil on animated units (0 = only the hit animation). | |
Animated Units Skip Procedural Fall (bAnimatedUnitsSkipProceduralFall) | bool | True | Battle | Units with an animated appearance skip the procedural tip-over on a knock-out (their Down animation shows it). | |
Impact from Anim Notifies (bImpactFromAnimNotifies) | bool | True | Battle | A Montage cue whose montage has RSEImpact notifies times its impacts with them (the damage shows on the hit frame). | |
Body Presets (BodyPresets) | TMap<FName,FRSEBodyPreset> | (43 entries) | Bodies | Bodies by name, used by appearances that name a Body Preset instead of a mesh (the framework's starter looks use "Mannequin" and "MannequinSlim"). A missing preset leaves those characters as placeholder shapes. The New RPG Project wizard (Install the UE mannequin kit) fills them. | |
Empty Slot Look (EmptySlotLook) | ERSEEmptySlotLook | PlayerCharacters | Equipment | D-128: whose looks hide their own weapon / shield while the matching equipment slot (Items -> Equipment Slots, with an Appearance Slot and Empty Hides Look Part) is empty. The paperdoll preview and the world follow every equipment change. | |
Tint Fallback by Team (bTintFallbackByTeam) | bool | True | Fallback | Battle units with the fallback look take their team color (Tactics Zone -> team colors), so the sides stay readable. | |
Character Appearance Overrides (CharacterAppearanceOverrides) | TMap<TSoftObjectPtr<URSECharacterData> ,TSoftObjectPtr<URSECharacterAppearance> > | (1 entries) | Fallback | Looks this project gives to characters it cannot edit (e.g. the plugin's example monsters, like the wolves of Call Wolves): used instead of the character's own Appearance, wherever it appears (battle, exploration, previews). | |
Fallback Appearance (FallbackAppearance) | TSoftObjectPtr<URSECharacterAppearance> | /RPGSagaEngine/Data/Appearance/DA_Appearance_Mannequin.DA_Appearance_Mannequin | Fallback | Look of characters that have no Appearance (enemies made before their art, generated groups): e.g. the mannequin, so they never show as placeholder blocks next to animated characters. Empty = the placeholder shapes. | |
Fallback Tint Parameter (FallbackTintParameter) | FName | Paint Tint | Fallback | Vector parameter of the fallback look's materials that takes the team color. | |
Fallback Tint Strength (FallbackTintStrength) | float | 0.800000 | Fallback | Multiplies the team color before it is applied (team colors are bright UI colors; a darker paint reads better on a body). | |
Default Idle Anims (DefaultIdleAnims) | TMap<FGameplayTag,FRSECharacterAnim> | (0 entries) | Idle Life | Idle clips for looks whose animation set lacks a slot (Idle.Anim.*): the visible party's idle behaviours try the set, its parent slots, then these (and their parents). Loaded when the party field starts. Empty = only the sets' clips. | |
Idle Interrupt Blend Out (IdleInterruptBlendOut) | float | 0.200000 | Idle Life | Blend out (seconds) of an idle animation cut short (the leader walks, a battle starts). | |
Locomotion Warping (bLocomotionWarping) | bool | True | Locomotion Warping | Orientation and stride warping of the locomotion (explorer, NPCs, grid units walking): the feet follow the real movement direction and speed instead of sliding. Off = the warping nodes are skipped (their alpha is 0). Debug override: CVar RSE.Anim.Warping. | |
Orientation Warp Snap Angle (OrientationWarpSnapAngle) | float | 45.000000 | Locomotion Warping | The blend space plays the nearest direction on this grid (45 = the mannequin's 8 directions) and orientation warping turns the legs by the rest. 0 = the blend space gets the exact direction (no orientation warp). | |
Stride Warp Max Scale (StrideWarpMaxScale) | float | 1.500000 | Locomotion Warping | Movement faster than the locomotion blend space's top speed (a sprint, a fast cue move) keeps the top speed's cycle and lengthens the strides (stride warping) up to this scale, instead of sliding the feet. | |
Cast Shadows (bCastShadows) | bool | True | Performance | Skeletal parts cast dynamic shadows (off saves shadow draw calls on low-end targets). | |
Enable Update Rate Optimizations (bEnableUpdateRateOptimizations) | bool | True | Performance | Animation update rate optimization: distant or small characters update their animation less often. | |
Receive Decals (bReceiveDecals) | bool | False | Performance | Character parts receive decals. Off (default): the target rings and area markers on the ground (decals) do not paint the characters standing in them (D-065). | |
Min LODBias (MinLODBias) | int32 | 0 | Performance | Most detailed LOD character meshes may use (1 = never LOD0, for very weak targets). 0 = the mesh's own LOD screen sizes. | |
Visibility Based Anim Tick Option (VisibilityBasedAnimTickOption) | EVisibilityBasedAnimTickOption | OnlyTickPoseWhenRendered | Performance | When off-screen characters update their animation and bones. |
RPG Saga Engine: Cinematics
Class URSECinematicSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Cinematic from Screenplay (D-078, docs/product/cinematics.md): stages a dialog as a Level Sequence (cast, cameras with a shot grammar, timing, animation, the dialog driving the sequence line by line).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Force Custom Anim Mode (bForceCustomAnimMode) | bool | False | Animation | The animation sections take over the whole body (Sequencer's own animation mode). Off = they play on the anim set's action slot of the character's Anim Blueprint, so idle and walking stay the Blueprint's (recommended). | |
Gesture Min Line Seconds (GestureMinLineSeconds) | float | 3.000000 | Animation | Shortest line that gets a gesture. | |
Gesture Probability (GestureProbability) | float | 0.350000 | Animation | Chance of a gesture on a long line. | |
Gestures (Gestures) | TArray<TSoftObjectPtr<UAnimSequenceBase> > | (0 entries) | Animation | Gestures played at the start of long lines (the speaker's own animations are preferred: its anim set's Talk). Empty = none. | |
Aperture (Aperture) | float | 4.000000 | Camera | Aperture with depth of field on. | |
Constrain Aspect Ratio (bConstrainAspectRatio) | bool | False | Camera | The cameras force their aspect ratio (black bars). Off = they fill the screen; the scene overlay draws its letterbox. | |
Depth Of Field (bDepthOfField) | bool | False | Camera | Depth of field (focus on the subject). Off = no blur at all: cheap, and the right choice for low-end hardware such as the Steam Deck. | |
Sensor Height (SensorHeight) | float | 13.365000 | Camera | ||
Sensor Width (SensorWidth) | float | 23.760000 | Camera | Sensor of the cine cameras (default: 16:9 digital film). | |
Binding Tag Prefix (BindingTagPrefix) | FString | Cast. | Output | Prefix of the generated binding tags (the scene data binds the real actors by them). | |
Frame Rate (FrameRate) | int32 | 30 | Output | Display rate of new sequences. | |
Generated Folder Name (GeneratedFolderName) | FName | RSE Generated | Output | Sequencer folder of everything the tool makes. Regeneration replaces its content; bindings and tracks outside it are kept. | |
Marker Prefix (MarkerPrefix) | FString | RSE. | Output | Prefix of the generated marked frames (Dialog start, one per line, outro). Other markers are kept. | |
Output Folder (OutputFolder) | FDirectoryPath | (set per project) | Output | Folder of the generated Level Sequences (LS_<Dialog>), under /Game. | |
Scene Data Prefix (SceneDataPrefix) | FString | DA_Scene_Cine_ | Output | Prefix of the generated scene data (in the Scenes folder of Content Import -> Types). | |
Sequence Prefix (SequencePrefix) | FString | LS_Cine_ | Output | Prefix of a generated sequence's name. | |
Close Up on Emotion (bCloseUpOnEmotion) | bool | True | Shots | Emotional lines are framed Close instead of over the shoulder. | |
Default Head Height (DefaultHeadHeight) | float | 160.000000 | Shots | Head height used when a character has no mesh to measure (a placeholder). | |
Emotional Expressions (EmotionalExpressions) | FGameplayTagContainer | () | Shots | Expressions that make a line emotional (reaction shots, close-ups). | |
Head Bones (HeadBones) | TArray<FName> | (4 entries) | Shots | Bones of the head, first found wins (the head height is measured on it). | |
Reaction Min Line Seconds (ReactionMinLineSeconds) | float | 2.000000 | Shots | Shortest line that gets a reaction shot (a short line keeps its speaker). | |
Reaction Probability (ReactionProbability) | float | 0.600000 | Shots | Chance of a reaction shot (the listener, at the end of the line) on emotional lines and questions. 0 = never. | |
Reaction Share (ReactionShare) | float | 0.350000 | Shots | The reaction's share of the line (its end). | |
Shot Presets (ShotPresets) | TArray<FRSECinematicShotPreset> | (6 entries) | Shots | Framings of the shot grammar, one per shot. | |
Two Shot After Exchanges (TwoShotAfterExchanges) | int32 | 3 | Shots | After this many back-and-forth lines between the same two speakers, short lines use a two-shot. 0 = never. | |
Two Shot Max Line Seconds (TwoShotMaxLineSeconds) | float | 3.500000 | Shots | Longest line of a back-and-forth that is shown as a two-shot. | |
Character Radius (CharacterRadius) | float | 35.000000 | Staging | Free radius a character needs (the free-space check). | |
Ground Search Above (GroundSearchAbove) | float | 300.000000 | Staging | How far above a spot the ground search starts, and how far below it goes. | |
Ground Search Below (GroundSearchBelow) | float | 1000.000000 | Staging | ||
Group Radius (GroupRadius) | float | 130.000000 | Staging | Radius of the triangle and the circle. | |
Line Up Spacing (LineUpSpacing) | float | 110.000000 | Staging | Spacing of a line-up. | |
Max Ground Step (MaxGroundStep) | float | 60.000000 | Staging | Largest height step between two cast spots (a formation over a ledge is rotated or tightened). | |
Nav Projection Distance (NavProjectionDistance) | float | 100.000000 | Staging | With a navmesh in the level, spots are projected on it (within this distance) and spots off it are refused. | |
Pair Distance (PairDistance) | float | 170.000000 | Staging | Distance between two characters facing each other. | |
Placement Rotations (PlacementRotations) | int32 | 12 | Staging | Rotations of the formation tried around the anchor when a spot is blocked. | |
Placement Scales (PlacementScales) | TArray<float> | (4 entries) | Staging | Spacing scales tried after the rotations (a tighter or wider formation). | |
Animation Blend Seconds (AnimationBlendSeconds) | float | 0.250000 | Timing | Blend in and out of the animation sections. | |
Choice Hold Seconds (ChoiceHoldSeconds) | float | 4.000000 | Timing | The hold of a choice (on whoever chooses). | |
Hold Seconds (HoldSeconds) | float | 3.000000 | Timing | The hold after each line: it loops while the line waits for the player. | |
Intro Seconds (IntroSeconds) | float | 2.500000 | Timing | Establishing wide before the first line. | |
Line Base Seconds (LineBaseSeconds) | float | 0.800000 | Timing | Unvoiced lines: added to the reading time (the eye finds the text). | |
Max Line Seconds (MaxLineSeconds) | float | 9.000000 | Timing | ||
Min Line Seconds (MinLineSeconds) | float | 1.500000 | Timing | ||
Outro Seconds (OutroSeconds) | float | 1.500000 | Timing | Closing wide after the dialog ends. | |
Reading Characters Per Second (ReadingCharactersPerSecond) | float | 15.000000 | Timing | Unvoiced lines: reading speed. | |
Turn Seconds (TurnSeconds) | float | 0.500000 | Timing | How long turning toward a new speaker takes. | |
Voice Tail Seconds (VoiceTailSeconds) | float | 0.300000 | Timing | Voiced lines: added after the voice ends. | |
Walk Speed (WalkSpeed) | float | 160.000000 | Timing | Walking speed of [move:...] directions. |
RPG Saga Engine: Classic Battle UI
Class URSEATBCommandUISettings (module RSE), Project Settings, Project, RPG Saga Engine. How the classic battle command menu tells the player who acts, with what and on whom (D-065): the acting unit's turn banner, the input guard when the menu changes hands, messages near the menu, the help line of the highlighted command, the target cursor and card, and the Wait / Active label.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Block Hint (BlockHint) | FText | NSLOCTEXT("RSEATBCommandUI", "BlockHint", "Block") | Enemy Actions | Key hint while a block prompt runs (Input -> Block Action). | |
Block Prompt Menu Opacity (BlockPromptMenuOpacity) | float | 0.450000 | Enemy Actions | Opacity of the command menu and the target list while a block prompt runs (they stay where they were and come back as they were; Enter still works in them, while a mouse click passes through them to the prompt). 1 = no dimming. | |
Back Help (BackHelp) | FText | NSLOCTEXT("RSEATBCommandUI", "BackHelp", "Back to the commands.") | Help | ||
Show Help (bShowHelp) | bool | True | Help | Show the help panel for the highlighted command (description, target, cost, element, charge). | |
Charge Format (ChargeFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Charge", "Charges {Seconds}s before it acts") | Help | Charge fact (ATB). Arguments: {Seconds}. | |
Cost Format (CostFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Cost", "Cost: {Cost}") | Help | Cost fact. Arguments: {Cost} (the menu's cost text, e.g. "8 MP"). | |
Element Format (ElementFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Element", "Element: {Element}") | Help | Element fact. Arguments: {Element}. | |
Fallen Target Format (FallenTargetFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "FallenTarget", "{Target} (fallen)") | Help | A revive ability. Arguments: {Target} (the scope line above). | |
Flee Help (FleeHelp) | FText | NSLOCTEXT("RSEATBCommandUI", "FleeHelp", "Try to escape from the battle ({Chance}% chance). A failed try costs the turn.") | Help | Help of Flee. Arguments: {Chance}. (Top-level commands take their help from the command menu layout.) | |
Help Placement (HelpPlacement) | ERSECommandHelpPlacement | AboveMenu | Help | Where the help panel sits: right above the command menu, or as a bar at the top of the screen. | |
Help Top Offset (HelpTopOffset) | float | 52.000000 | Help | Top placement: the help bar sits this far below the top margin (under the enemy chips). | |
Help Width (HelpWidth) | float | 560.000000 | Help | Width of the help panel. | |
Item Count Format (ItemCountFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ItemCount", "In the bag: {Count}") | Help | Item fact. Arguments: {Count}. | |
Scope All Format (ScopeAllFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ScopeAll", "Target: every {Side}") | Help | ||
Scope Row Format (ScopeRowFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ScopeRow", "Target: one {Side} row") | Help | ||
Scope Self Text (ScopeSelfText) | FText | NSLOCTEXT("RSEATBCommandUI", "ScopeSelf", "Target: self") | Help | Abilities used on the user only. | |
Scope Single Format (ScopeSingleFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ScopeSingle", "Target: one {Side}") | Help | Target facts. Arguments: {Side} (enemy / ally / self / anyone, below). | |
Side Allies (SideAllies) | FText | NSLOCTEXT("RSEATBCommandUI", "SideAllies", "ally") | Help | ||
Side Anyone (SideAnyone) | FText | NSLOCTEXT("RSEATBCommandUI", "SideAnyone", "unit") | Help | ||
Side Enemies (SideEnemies) | FText | NSLOCTEXT("RSEATBCommandUI", "SideEnemies", "enemy") | Help | ||
Side Self (SideSelf) | FText | NSLOCTEXT("RSEATBCommandUI", "SideSelf", "self") | Help | ||
Max Visible Rows (MaxVisibleRows) | int32 | 7 | Long Lists | Most rows the command menu and the target list show at once; longer lists scroll with the cursor (arrows above / below show there is more) and with the mouse wheel over the list. 0 = no limit. | |
More Above Mark (MoreAboveMark) | FText | NSLOCTEXT("RSEATBCommandUI", "MoreAbove", "▲") | Long Lists | Marks above / below a scrolled list. | |
More Below Mark (MoreBelowMark) | FText | NSLOCTEXT("RSEATBCommandUI", "MoreBelow", "▼") | Long Lists | ||
Command Title Format (CommandTitleFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "CommandTitle", "{Name} — Command") | Menu | Title of the first command list. Arguments: {Name}. | |
List Glyph (ListGlyph) | FText | INVTEXT("›") | Menu | Marks the commands that open a list (Skills, Magic...). | |
List Title Format (ListTitleFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ListTitle", "{Name} — {List}") | Menu | Title of a list (Skills, Magic, Items...). Arguments: {Name}, {List}. | |
Target Title Format (TargetTitleFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "TargetTitle", "{Name} — {Action}: choose a target") | Menu | Title while a target is chosen. Arguments: {Name}, {Action}. | |
Acting State Format (ActingStateFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "ActingState", "{Action}!") | Messages | Party row state while the unit's command is being shown (timed prompt, prelude). Arguments: {Action}. | |
Dropped Format (DroppedFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Dropped", "{Name}: {Action} cancelled — {Reason}") | Messages | A queued command that could no longer run. Arguments: {Name}, {Action}, {Reason}. | |
Error Color (ErrorColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Messages | A command that cannot be given (not enough MP, invalid target...). | |
Info Color (InfoColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.079403,Chroma=0.651117,Hue=-15.902557,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Messages | Information (command queued, time mode switched). | |
Message Seconds (MessageSeconds) | float | 2.000000 | Messages | Seconds a message stays near the menu (refused command, queued command, cancelled command, time mode). | |
Queued Format (QueuedFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Queued", "{Name}: {Action} — queued, acts after the current action") | Messages | Accepted while an action is being shown. Arguments: {Name}, {Action}. | |
Queued State Format (QueuedStateFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "QueuedState", "QUEUED {Action}") | Messages | Party row state of a unit with a queued command. Arguments: {Action}. | |
Hit Cursor Font Size (HitCursorFontSize) | int32 | 30 | Target | Glyph size over the other units the aimed ability hits (row / all). | |
Target Card Offset (TargetCardOffset) | FVector2D | (X=36.000000,Y=-20.000000) | Target | The target card (name, HP, expected result) sits this far from the cursor (pixels, right / down). | |
Target Card Width (TargetCardWidth) | float | 280.000000 | Target | ||
Target Cursor Bob (TargetCursorBob) | float | 6.000000 | Target | Cursor bob: height in pixels and cycles per second (0 = still). | |
Target Cursor Bob Rate (TargetCursorBobRate) | float | 1.500000 | Target | ||
Target Cursor Color (TargetCursorColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.066483,Chroma=1.192767,Hue=23.327459,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Target | ||
Target Cursor Font Size (TargetCursorFontSize) | int32 | 44 | Target | ||
Target Cursor Glyph (TargetCursorGlyph) | FText | NSLOCTEXT("RSEATBCommandUI", "TargetCursor", "▼") | Target | Glyph over the targeted unit. | |
All Allies Text (AllAlliesText) | FText | NSLOCTEXT("RSEATBCommandUI", "AllAllies", "All allies") | Target List | ||
All Enemies Text (AllEnemiesText) | FText | NSLOCTEXT("RSEATBCommandUI", "AllEnemies", "All enemies") | Target List | Group entries of row / all abilities. | |
Ally Side Text (AllySideText) | FText | NSLOCTEXT("RSEATBCommandUI", "AllySide", "Allies") | Target List | ||
Back Row Text (BackRowText) | FText | NSLOCTEXT("RSEATBCommandUI", "BackRow", "Back row") | Target List | ||
Hide Enemy Chips While Targeting (bHideEnemyChipsWhileTargeting) | bool | False | Target List | Hide the enemy chips at the top while a target is chosen. Off by default: the chips are the HP overview and stay clickable; they use the same names and the same highlight as the list, so they never disagree with it. | |
Letter Duplicate Names (bLetterDuplicateNames) | bool | True | Target List | RSE style names (D-066): enemies sharing a character get letters in their battle order ("Raider A", "Raider B"), in the list, the chips, the log and the banners. A unique one keeps its name. | |
Show Target List (bShowTargetList) | bool | True | Target List | While a target is chosen, a list next to the command menu names what the command can be given on: each enemy (or ally, for heals and buffs), or the groups a row / all ability hits ("Front row", "All enemies"). Up / down moves the cursor in the world too; a click on a row, a unit or its chip picks it. | |
Duplicate Name Format (DuplicateNameFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "DuplicateName", "{Name} {Letter}") | Target List | Arguments: {Name}, {Letter}. | |
Duplicate Name Letters (DuplicateNameLetters) | FString | ABCDEFGHIJKLMNOPQRSTUVWXYZ | Target List | The letters, in order (more units than letters: numbers). | |
Enemy Side Text (EnemySideText) | FText | NSLOCTEXT("RSEATBCommandUI", "EnemySide", "{Term.Enemies}") | Target List | ||
Everyone Text (EveryoneText) | FText | NSLOCTEXT("RSEATBCommandUI", "Everyone", "Everyone") | Target List | ||
Front Row Text (FrontRowText) | FText | NSLOCTEXT("RSEATBCommandUI", "FrontRow", "Front row") | Target List | ||
Row Side Format (RowSideFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "RowSide", "{Side}: {Row}") | Target List | A row when both sides can be targeted. Arguments: {Side} (Enemy / Ally side, below), {Row}. | |
Target List Title Format (TargetListTitleFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "TargetListTitle", "{Action}: on whom?") | Target List | Title of the list. Arguments: {Action}. | |
Target List Width (TargetListWidth) | float | 260.000000 | Target List | ||
Active Label (ActiveLabel) | FText | NSLOCTEXT("RSEATBCommandUI", "Active", "ACTIVE") | Time Mode | ||
Toggle Saves Option (bToggleSavesOption) | bool | True | Time Mode | Switching in battle also stores the choice as the player's option (Options -> Battle time). Off: this battle only. | |
Time Mode Format (TimeModeFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "TimeMode", "TIME: {Mode}") | Time Mode | Label of the time mode. Arguments: {Mode} (Wait / Active). | |
Time Running Text (TimeRunningText) | FText | NSLOCTEXT("RSEATBCommandUI", "TimeRunning", "time keeps running") | Time Mode | ||
Time Stopped Text (TimeStoppedText) | FText | NSLOCTEXT("RSEATBCommandUI", "TimeStopped", "time stops while you choose") | Time Mode | Second line while time stands still / runs. | |
Toggled Format (ToggledFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "Toggled", "Battle time: {Mode}") | Time Mode | Message after a switch. Arguments: {Mode}. | |
Toggle Hint (ToggleHint) | FText | NSLOCTEXT("RSEATBCommandUI", "ToggleHint", "Wait / Active") | Time Mode | Key hint of the Wait / Active switch (Input -> ATB Time Mode Action). | |
Wait Label (WaitLabel) | FText | NSLOCTEXT("RSEATBCommandUI", "Wait", "WAIT") | Time Mode | ||
Show Turn Banner (bShowTurnBanner) | bool | True | Turn | Show a banner ("Mira's turn") when the command menu opens for a party member. | |
Switch Input Guard Seconds (SwitchInputGuardSeconds) | float | 0.250000 | Turn | Confirm is ignored this long after the menu opens for another unit, so a press meant for the previous menu never picks a command for the new one. | |
Turn Banner Format (TurnBannerFormat) | FText | NSLOCTEXT("RSEATBCommandUI", "TurnBanner", "{Name}\'s turn") | Turn | Banner text. Arguments: {Name}. | |
Turn Banner Seconds (TurnBannerSeconds) | float | 1.200000 | Turn | How long the banner stays (it slides in and fades out within this time). | |
Turn Banner Slide (TurnBannerSlide) | float | 120.000000 | Turn | Slide distance of the banner as it comes in (pixels, from the left). |
RPG Saga Engine: Co-op Flow
Class URSECoopFlowSettings (module RSE), Project Settings, Project, RPG Saga Engine. How world actions behave when they arrive as commands from any player (D-138, networking.md §6): how much the authority trusts a player's position and timing, and who leads the group out of a zone.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Interact Reach Tolerance (InteractReachTolerance) | float | 150.000000 | Interaction | Extra distance the authority allows between a player's pawn and the object they interact with (or the exit they take), beyond the object's own range: the pawn the authority sees may lag behind the player's screen. | |
Leash Enabled (bLeashEnabled) | bool | True | Leash | Players may not roam farther than Leash Radius from the anchor (warning, then a pull back). Off = free roaming. | |
Leash Anchor (LeashAnchor) | ERSELeashAnchor | Host | Leash | What the guests are tied to: the host's explorer, or the center of every player's explorer. | |
Leash Check Interval (LeashCheckInterval) | float | 0.500000 | Leash | How often the authority measures the distances (no Tick). | |
Leash Grace Seconds (LeashGraceSeconds) | float | 4.000000 | Leash | Seconds past the radius between the warning and the pull back (coming back in time cancels it). | |
Leash Policy Class (LeashPolicyClass) | TSoftClassPtr<URSELeashPolicy> | None | Leash | Decides the anchor, the radius and when the leash applies. Empty = URSELeashPolicy (the settings above). | |
Leash Radius (LeashRadius) | float | 4000.000000 | Leash | How far a player may go from the anchor (a map's Co-op Map Settings actor may override it). | |
Leash Return Distance (LeashReturnDistance) | float | 400.000000 | Leash | The pull back puts the player this far from the anchor, on the side they came from. | |
Leash Pulled Text (LeashPulledText) | FText | NSLOCTEXT("RSECoopFlow", "LeashPulled", "You were brought back to the group.") | Leash|Texts | Notice after the pull back. | |
Leash Warning Detail (LeashWarningDetail) | FText | NSLOCTEXT("RSECoopFlow", "LeashDetail", "Go back, or you are brought back in {Seconds} s.") | Leash|Texts | ||
Leash Warning Title (LeashWarningTitle) | FText | NSLOCTEXT("RSECoopFlow", "LeashTitle", "Too far from the group") | Leash|Texts | Notice to the player past the radius ({Seconds} = seconds before the pull back). | |
Lockpick Min Seconds Per Pin (LockpickMinSecondsPerPin) | float | 0.150000 | Lockpick | Lockpick game played on a player's own machine: a reported success is believed only if the screen was open at least this long per pin (a plausibility check, not anti-cheat). 0 = any report is believed. | |
Notice Color (NoticeColor) | FLinearColor | (R=0.550000,G=0.800000,B=1.000000,A=1.000000) | Notices | ||
Notice Repeat Seconds (NoticeRepeatSeconds) | float | 2.000000 | Notices | The same notice is not repeated within this many seconds. | |
Refusal Notices (RefusalNotices) | ERSECoopNoticeMode | InSession | Notices | When a refused command's reason shows as a notice to the player who sent it. | |
Silent Refusal Types (SilentRefusalTypes) | TArray<TSoftObjectPtr<UScriptStruct> > | (1 entries) | Notices | Command types whose refusals never show (their own screens explain them, or they are routine). | |
Warning Notice Color (WarningNoticeColor) | FLinearColor | (R=1.000000,G=0.700000,B=0.300000,A=1.000000) | Notices | ||
Companion Took Over Text (CompanionTookOverText) | FText | NSLOCTEXT("RSECoopFlow", "TookOver", "The companion AI takes over {Member}.") | Notices|Texts | The companion AI drives {Member} again. | |
Host Saving Text (HostSavingText) | FText | NSLOCTEXT("RSECoopFlow", "HostSaving", "The host is saving the game.") | Notices|Texts | The host saves the game. | |
Player Joined Text (PlayerJoinedText) | FText | NSLOCTEXT("RSECoopFlow", "Joined", "{Player} joined the game.") | Notices|Texts | {Player} joined. | |
Player Left Text (PlayerLeftText) | FText | NSLOCTEXT("RSECoopFlow", "Left", "{Player} left the game.") | Notices|Texts | {Player} left. | |
Player Reconnected Text (PlayerReconnectedText) | FText | NSLOCTEXT("RSECoopFlow", "Reconnected", "{Player} is back.") | Notices|Texts | {Player} came back. | |
Refusal Notice Title (RefusalNoticeTitle) | FText | NSLOCTEXT("RSECoopFlow", "RefusalTitle", "Not now") | Notices|Texts | Header of a refused action. | |
Session Notice Title (SessionNoticeTitle) | FText | NSLOCTEXT("RSECoopFlow", "SessionTitle", "Co-op") | Notices|Texts | Header of session notices (joined, left, saving). | |
Scene Mirror End Wait Seconds (SceneMirrorEndWaitSeconds) | float | 10.000000 | Scenes | A guest whose scene reached its end before the host's waits this long for the host's end (then returns on its own). Keeps both machines leaving the scene together. | |
Scene Skip Policy Class (SceneSkipPolicyClass) | TSoftClassPtr<URSESceneSkipPolicy> | None | Scenes | Decides who may skip. Empty = URSESceneSkipPolicy (the rule above). | |
Scene Skip Rule (SceneSkipRule) | ERSESceneSkipRule | HostOnly | Scenes | Who may skip a story scene in co-op (single player: the player). | |
Scene Skip Vote Share (SceneSkipVoteShare) | float | 0.500000 | Scenes | Vote rule: the share of players that must ask to skip (0.5 = half; 1 = everyone). | |
Scene Skip Host Only Text (SceneSkipHostOnlyText) | FText | NSLOCTEXT("RSECoopFlow", "SkipHostOnly", "Only the host can skip this scene.") | Scenes|Texts | A guest pressed skip but only the host may ({Host}). | |
Scene Skip Vote Text (SceneSkipVoteText) | FText | NSLOCTEXT("RSECoopFlow", "SkipVote", "{Player} wants to skip the scene ({Votes} of {Needed}).") | Scenes|Texts | Vote progress ({Player}, {Votes}, {Needed}). | |
Group Travel Countdown Seconds (GroupTravelCountdownSeconds) | float | 3.000000 | Zone Travel | The countdown before the host pulls the whole group to the next zone (0 = at once). | |
Group Travel Policy Class (GroupTravelPolicyClass) | TSubclassOf<URSEGroupTravelPolicy> | /Script/CoreUObject.Class'/Script/RSE.RSEGroupTravelPolicy' | Zone Travel | Decides what a travel request does in a multiplayer session (D-124 §6.6: the host pulls everyone after a short countdown; a guest at an exit asks the host). Single player always travels at once. | |
Group Travel Asked Text (GroupTravelAskedText) | FText | NSLOCTEXT("RSECoopFlow", "RequestAsked", "The host decides whether the group goes to {Destination}.") | Zone Travel|Texts | Notice to the guest who asked: the host is asked ({Destination}). | |
Group Travel Cancel Hint (GroupTravelCancelHint) | FText | NSLOCTEXT("RSECoopFlow", "CountdownCancel", "Menu > Options > Stay here: cancel") | Zone Travel|Texts | The host's countdown screen: how to cancel. | |
Group Travel Cancelled Text (GroupTravelCancelledText) | FText | NSLOCTEXT("RSECoopFlow", "CountdownCancelled", "The host stays here for now.") | Zone Travel|Texts | Notice to everyone when the host cancels the countdown. | |
Group Travel Countdown Detail (GroupTravelCountdownDetail) | FText | NSLOCTEXT("RSECoopFlow", "CountdownDetail", "The group travels in {Seconds} s.") | Zone Travel|Texts | Countdown screen: the line under it ({Seconds} = seconds left). | |
Group Travel Countdown Title (GroupTravelCountdownTitle) | FText | NSLOCTEXT("RSECoopFlow", "CountdownTitle", "Leaving for {Destination}") | Zone Travel|Texts | Countdown screen: the title ({Destination} = the area's name or the map). | |
Group Travel Declined Text (GroupTravelDeclinedText) | FText | NSLOCTEXT("RSECoopFlow", "RequestDeclined", "The host stays here for now.") | Zone Travel|Texts | Notice to the guest who asked: the host stays ({Destination}). | |
Group Travel Request No (GroupTravelRequestNo) | FText | NSLOCTEXT("RSECoopFlow", "RequestNo", "Not now") | Zone Travel|Texts | ||
Group Travel Request Question (GroupTravelRequestQuestion) | FText | NSLOCTEXT("RSECoopFlow", "RequestQuestion", "{Player} wants to go to {Destination}. Go now, together?") | Zone Travel|Texts | The host's question when a guest walks into an exit ({Player}, {Destination}). | |
Group Travel Request Yes (GroupTravelRequestYes) | FText | NSLOCTEXT("RSECoopFlow", "RequestYes", "Go together") | Zone Travel|Texts |
RPG Saga Engine: Co-op Network
Class URSENetSettings (module RSENet), Project Settings, Project, RPG Saga Engine. The co-op network layer (D-140, docs/design/networking.md §3.4–3.8, docs/product/coop.md): how the state sections are replicated, the limits on players' commands, who the players are while a session runs and how often world actors update.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Action Claim Packets Per Second (ActionClaimPacketsPerSecond) | int32 | 60 | Action Battle | Anti-abuse: claim packets a guest may send per second (more are dropped and logged; the battle limits claims per unit too). | |
Action Claim Resend Interval (ActionClaimResendInterval) | float | 0.100000 | Action Battle | A guest repeats unanswered claims this often (seconds) even when it found no new hit. | |
Action Claim Resend Seconds (ActionClaimResendSeconds) | float | 1.000000 | Action Battle | A guest's hit claims travel unreliably and redundantly: every packet repeats the claims the host has not answered yet, for at most this long (the host answers reliably and ignores repeats). | |
Action Keyframe Seconds (ActionKeyframeSeconds) | float | 2.000000 | Action Battle | A full snapshot of the state goes reliably this often (the deltas between are based on what each guest acknowledged). | |
Action Max Claims Per Packet (ActionMaxClaimsPerPacket) | int32 | 24 | Action Battle | At most this many claims in one packet (the oldest unanswered first). | |
Action Mirror Budget Bytes Per Second (ActionMirrorBudgetBytesPerSecond) | int32 | 12000 | Action Battle | Bytes per second (as sent, per guest) the action battle's state may use. The unreliable deltas wait when the budget is spent (the next one carries the changes); the reliable full snapshots and the events always go. | |
Action Mirror Burst Seconds (ActionMirrorBurstSeconds) | float | 0.500000 | Action Battle | Seconds of the budget a quiet moment may save up (a burst of changes after it). | |
Action Mirror History (ActionMirrorHistory) | int32 | 32 | Action Battle | States the host (and each guest) keeps as baselines for deltas. | |
Battle Chunk Bytes (BattleChunkBytes) | int32 | 16384 | Battle | The start snapshot travels in chunks of at most this many bytes (as sent). | |
Battle Chunk Window (BattleChunkWindow) | int32 | 4 | Battle | Chunks a guest may have unacknowledged at once (the reliable channel never overflows). | |
Battle Max Events Per Packet (BattleMaxEventsPerPacket) | int32 | 96 | Battle | At most this many events per packet (a long AI turn goes in several packets, in order). | |
Battle Playback Report Interval (BattlePlaybackReportInterval) | float | 0.100000 | Battle | How often a guest tells the host how far its presentation got (seconds; only when it changed). | |
Battle Stream Interval (BattleStreamInterval) | float | 0.050000 | Battle | How often the host sends the battle's new events, notices and state to the guests (seconds). | |
Broadcast Result Types (BroadcastResultTypes) | TArray<FSoftObjectPath> | (0 entries) | Commands | Command types whose results every player receives (On Peer Command Result), not only the sender: for notices such as "Player 2 opened the gate". | |
Max Command Bytes (MaxCommandBytes) | int32 | 4096 | Commands | A command larger than this (bytes, encoded) is refused; a larger packet disconnects the sender. | |
Max Commands Per Second (MaxCommandsPerSecond) | int32 | 30 | Commands | Commands a guest may send per second (burst up to the same number); more are refused, not applied. | |
Max Queued Commands (MaxQueuedCommands) | int32 | 32 | Commands | Commands a guest keeps while it is not connected to the host yet (its player state has not arrived); more are refused. | |
Log Traffic (bLogTraffic) | bool | False | Diagnostics | Logs every section sent or received and every command packet (verbose). The CVar RSE.Net.LogTraffic does the same. | |
Enable Coop (bEnableCoop) | bool | True | General | Installs the co-op layer whenever this game runs a network session (listen server host or guest): the authority mode, the command transport, the replicated state and the players' identity. Off = the project replicates on its own. | |
Authority Policy Class (AuthorityPolicyClass) | TSubclassOf<URSEAuthorityPolicy> | /Script/CoreUObject.Class'/Script/RSENet.RSENetAuthorityPolicy' | Players | Decides authority and the multiplayer rules while a session runs. | |
Assign Member on Join (bAssignMemberOnJoin) | bool | True | Players | A joining player takes a party member from the companion AI: the lobby's choice when free, else the first member no player controls (D-124 §3.7). Off = the game assigns members itself (Assign Party Member command). | |
Player Provider Class (PlayerProviderClass) | TSubclassOf<URSEPlayerProvider> | /Script/CoreUObject.Class'/Script/RSENet.RSENetPlayerProvider' | Players | Lists the players while a session runs (slots from the replicated player states; stable across reconnects). | |
Player Pawns Always Relevant (bPlayerPawnsAlwaysRelevant) | bool | True | Relevancy | Players' explorers are sent to every player whatever the distance. | |
Class Relevancy (ClassRelevancy) | TArray<FRSENetClassRelevancy> | (3 entries) | Relevancy | Per class: cull distance, update rate and priority (roaming enemies, NPCs, companions). Applied on the host. | |
Player Pawn Priority (PlayerPawnPriority) | float | 3.000000 | Relevancy | ||
Player Pawn Update Frequency (PlayerPawnUpdateFrequency) | float | 60.000000 | Relevancy | Update rate and priority of the explorers players drive. | |
Compress Sections (bCompressSections) | bool | True | State Sections | Compress the sections before sending (they are save bytes: they compress well). | |
Change Detection Interval (ChangeDetectionInterval) | float | 0.500000 | State Sections | How often the host compares every section's bytes to catch writes that forgot to mark their section (seconds; 0 = never). Costs one serialization per section each time. | |
Compression Format (CompressionFormat) | FName | Oodle | State Sections | The compression format (Oodle, Zlib, LZ4...). | |
Compression Min Bytes (CompressionMinBytes) | int32 | 256 | State Sections | Sections smaller than this are sent uncompressed (bytes). | |
Max Section Bytes (MaxSectionBytes) | int32 | 262144 | State Sections | A section larger than this (bytes, as sent) is not replicated and is reported as an error: split the system's state or give it a delta of its own. | |
Min Section Resend Interval (MinSectionResendInterval) | float | 0.200000 | State Sections | A section that keeps changing is sent at most this often (seconds); the latest state always goes out. | |
Section Send Interval (SectionSendInterval) | float | 0.100000 | State Sections | How often the host looks for changed state sections to send (seconds). |
RPG Saga Engine: Co-op Rules
Class URSECoopRulesSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The co-op rules that live in the game logic (D-142).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Companion Order Policy Class (CompanionOrderPolicyClass) | TSoftClassPtr<URSECompanionOrderPolicy> | None | Companions | Decides who may order which companion. Empty = URSECompanionOrderPolicy (the rule above). | |
Companion Orders (CompanionOrders) | ERSECompanionOrderRule | AnyPlayer | Companions | Who orders the companions the AI drives. | |
Default Encounter Conversion (DefaultEncounterConversion) | ERSECoopBattleConversion | FreeTactics | Encounters | What Tactics / ATB encounters become in a session with more than one player (an encounter's own rule wins). | |
Encounter Policy Class (EncounterPolicyClass) | TSoftClassPtr<URSECoopEncounterPolicy> | None | Encounters | Decides each encounter's battle in co-op. Empty = URSECoopEncounterPolicy (the rules above). | |
Guest Equipment (GuestEquipment) | ERSEGuestEquipmentRule | OwnCharacter | Equipment | Whose equipment and Pacts a guest may change (read by the default Items -> Permission Policy Class, URSEInventoryPermissionPolicy::CanChangeEquipment). |
RPG Saga Engine: Combat Formulas
Class URSECombatFormulaSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Combat formulas as data (D-054, docs/design/attributes.md): damage per kind, healing, hit and critical chances, the critical multiplier, defense and the element step.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Critical Chance (CriticalChance) | FRSEExpression | (Source="BaseCriticalChance") | Formulas | Critical chance in percent. | |
Critical Multiplier (CriticalMultiplier) | FRSEExpression | (Source="CriticalMultiplier") | Formulas | Damage multiplier of a critical hit. | |
Defense Factor (DefenseFactor) | FRSEExpression | (Source="DefenseConstant / (DefenseConstant + max(0, Defense))") | Formulas | Share of damage that passes the defense ("DefenseConstant / (DefenseConstant + max(0, Defense))"). Read by the damage formulas as DefenseFactor. | |
Final Damage (FinalDamage) | FRSEExpression | (Source="max(MinDamage, Damage) * Affinity") | Formulas | Last step (the element multiplier hook): Damage after the critical, Affinity from the target's element affinity. | |
Fixed Damage (FixedDamage) | FRSEExpression | (Source="Power") | Formulas | Fixed damage (items such as bombs): stats, defense, position and variance usually ignored. | |
Healing (Healing) | FRSEExpression | (Source="Power * Attacker.Magic * Variance") | Formulas | Healing of a Magic-scaled restore (spells), before rounding. Fixed and percent restores stay as authored. | |
Hit Chance (HitChance) | FRSEExpression | (Source="Attacker.Accuracy - Target.Evasion + HitBonus") | Formulas | Chance to hit in percent, before the battle's MinHitChance / MaxHitChance bounds. | |
Magical Damage (MagicalDamage) | FRSEExpression | (Source="Power * Offense * DefenseFactor * Position * Variance") | Formulas | ||
Physical Damage (PhysicalDamage) | FRSEExpression | (Source="Power * Offense * DefenseFactor * Position * Variance") | Formulas | Damage of a physical hit before criticals, the minimum and the element. | |
Magical Defense Stat (MagicalDefenseStat) | FGameplayTag | (TagName="Stat.Spirit") | Stats | ||
Magical Offense Stat (MagicalOffenseStat) | FGameplayTag | (TagName="Stat.Magic") | Stats | ||
Physical Defense Stat (PhysicalDefenseStat) | FGameplayTag | (TagName="Stat.Defense") | Stats | ||
Physical Offense Stat (PhysicalOffenseStat) | FGameplayTag | (TagName="Stat.Attack") | Stats | --- Which attributes feed Offense / Defense --- |
RPG Saga Engine: Combat Roles
Class URSECombatRoleSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Combat roles (D-093): the role list, where asset roles are stored, the suggestion thresholds and the Combat Area checks.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Built in Assignments (BuiltInAssignments) | TMap<FSoftObjectPath,FGameplayTag> | (0 entries) | Assignments | Roles of the framework's own classes and meshes (a save point, a chest), read after the registries. Keys are asset or class paths (/Script/RSE.RSEChest). | |
Registries (Registries) | TArray<TSoftObjectPtr<URSECombatRoleRegistry> > | (1 entries) | Assignments | Registries of asset roles, read in order (the first that has an asset wins). The configurator adds its own here. | |
Registry Folder (RegistryFolder) | FDirectoryPath | (set per project) | Assignments | Folder of the registry the configurator creates when the project has none (must be under /Game). | |
Registry Name (RegistryName) | FString | DA_CombatRoles | Assignments | Name of that registry asset. | |
Combat Area Min Free Ratio (CombatAreaMinFreeRatio) | float | 0.600000 | Combat Areas | A Combat Area warns when less than this share of its tiles can be walked. | |
Combat Area Min Free Tiles (CombatAreaMinFreeTiles) | int32 | 24 | Combat Areas | A Combat Area warns when fewer tiles than this can be walked. | |
Default Role (DefaultRole) | FGameplayTag | () | Roles | Role of objects nothing assigns a role to. Empty = none (the grid bake and placement tools keep their own rules). | |
Roles (Roles) | TArray<FRSECombatRoleDefinition> | (10 entries) | Roles | Every combat role. Add a role here (with a new CombatRole.* tag) to use it in the configurator. | |
Suggestions (Suggestions) | FRSECombatRoleSuggestionRules | (NeutralMaxHeight=30.000000,HalfCoverMinHeight=80.000000,FullCoverMinHeight=150.000000,OverheadMinBottom=180.000000,FullCoverMinWidth=35.000000,AvoidMaxSize=60.... | Suggestions | Thresholds of the automatic suggestion. |
RPG Saga Engine: Command Menu
Class URSECommandMenuSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Command menu of classic battles (D-065).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Back Label (BackLabel) | FText | NSLOCTEXT("RSECommandMenu", "Back", "Back") | Behavior | Label and help of the Back entry, and of Flee inside a list. | |
Remember Cursor (bRememberCursor) | bool | True | Behavior | Memory cursor: each unit's menus open where its cursor was last (per list). Off: always on the first entry. | |
Show Back Entry (bShowBackEntry) | bool | True | Behavior | Lists end with a Back entry (for the mouse; Cancel always goes back). | |
Empty Groups (EmptyGroups) | ERSEEmptyCommandGroups | Hide | Behavior | Top-level commands with nothing in them. | |
Flee Label (FleeLabel) | FText | NSLOCTEXT("RSECommandMenu", "Flee", "Flee") | Behavior | ||
Default Layout (DefaultLayout) | TSoftObjectPtr<URSECommandMenuLayout> | None | Layout | Layout for units whose class names none. Empty = Fallback Entries below. | |
Fallback Entries (FallbackEntries) | TArray<FRSECommandMenuEntry> | (5 entries) | Layout | The layout used without a Default Layout asset (Attack, Skills, Magic, Items, Actions). |
RPG Saga Engine: Commands
Class URSECommandSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The command bus (D-133).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Log Refused Commands (bLogRefusedCommands) | bool | True | Debug | Logs every refused command (Rejected, No Handler, Invalid, Not Allowed) as a warning. RSE.Commands.Log 1 logs all. | |
Handler Classes (HandlerClasses) | TArray<TSoftClassPtr<URSECommandHandler> > | (0 entries) | Handlers | Handler classes created when the game starts (Blueprint or C++ children of RSE Command Handler): each one validates and applies its command type. The framework's own commands register themselves from code. | |
Permission Rules (PermissionRules) | TArray<FRSECommandPermissionRule> | (0 entries) | Permissions | Per-project permission of command types (D-139), over the handlers' own: who may save, play cards, abandon a quest, change the session's rules... The most specific rule wins (the type, then its base commands). | |
Max Nested Depth (MaxNestedDepth) | int32 | 8 | Safety | How deep commands may submit commands while they apply (a handler that sends another command runs it at once). Deeper submissions are refused as Not Allowed: a loop in content stops instead of freezing the game. |
RPG Saga Engine: Common UI
Class URSECommonUISettings (module RSECommonUI), Project Settings, Project, RPG Saga Engine. Project Settings -> RPG Saga Engine -> Common UI (D-176, docs/product/common-ui.md): how the Common UI host (off by default, D-181) puts RPG Saga screens on CommonUI layers and shows key prompt icons.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Apply Menu Input Config (bApplyMenuInputConfig) | bool | True | Input | Screens that read their own keys ask CommonUI for the Menu input config while active (game input blocked, cursor free). Off: our screens set the input mode themselves, as without the plugin. | |
Bind Action Bar (bBindActionBar) | bool | True | Input | D-176 C2: a screen on a layer binds its main actions (Confirm, Back, and the tab actions of screens with tabs) as CommonUI actions shown in the action bar: any Common Bound Action Bar of your layout lists them with the icons of the controller in use. The bindings do not consume the keys (the screen still reads them; an input counts once per frame). Off: no bindings. | |
Silence Viewport Client Check (bSilenceViewportClientCheck) | bool | True | Input | CommonUI logs an error when the game viewport client is not a CommonGameViewportClient. Our layers work without it (our screens read their keys; CommonUI's back action needs it), and the plugin enables CommonUI in every project (D-181), so the check is turned off at startup. Off: CommonUI's default (the error per player when the viewport client is not a CommonGameViewportClient). | |
Keyboard Icons (bKeyboardIcons) | bool | False | Key Prompts | Icons for keyboard / mouse keys too (when a controller data for Mouse And Keyboard has them). Off: text caps on keyboard. | |
Use Common Input Key Prompts (bUseCommonInputKeyPrompts) | bool | False | Key Prompts | Key prompts use the CommonInput controller data for icons (gamepad glyphs instead of text caps). Off by default (D-181). | |
Controller Data (ControllerData) | TArray<TSoftClassPtr<UCommonInputBaseControllerData> > | (0 entries) | Key Prompts | Controller data asked first (your platform icon sets: Blueprints derived from Common Input Base Controller Data). Then the platform's controller data from Project Settings -> Common Input, then the generic glyphs. | |
Generic Controller Data (GenericControllerData) | TSoftClassPtr<UCommonInputBaseControllerData> | /Script/RSECommonUI.RSEGenericControllerData | Key Prompts | The last resort: generic glyphs without platform logos (face buttons as a diamond, shoulders, triggers, sticks, D-pad). Empty: text caps. | |
Generic Glyph Resolution (GenericGlyphResolution) | int32 | 64 | Key Prompts | Size in pixels of the generated generic glyph textures. | |
Route Screens (bRouteScreens) | bool | False | Layers | Screens shown with Show Screen (options, save slots, shops, maps...) go onto the CommonUI layers. Off (the default, D-181): the viewport, as without Common UI. | |
Default Screen Layer (DefaultScreenLayer) | ERSECommonUILayer | Menu | Layers | The layer of a screen not listed in Screen Layers. | |
Layer Transition Duration (LayerTransitionDuration) | float | 0.000000 | Layers | Transition of our layer stacks when a screen is pushed or popped, seconds (0 = instant). | |
Layout Class (LayoutClass) | TSoftClassPtr<URSECommonUILayout> | None | Layers | The layout made for each local player when the project registers no stacks of its own (Register Layer Stack): a Widget Blueprint derived from RSE Common UI Layout may bind its own stacks (GameLayer, GameMenuLayer, MenuLayer, ModalLayer). Empty: ours. | |
Layout ZOrder (LayoutZOrder) | int32 | 50 | Layers | Viewport order of our layout (above the HUD; our viewport screens use 2 to 40). | |
Party Menu Host (PartyMenuHost) | ERSECommonUIHostMode | Off | Layers | Who hosts the party menu (see the values). Off by default (D-181): the framework's own hosts. | |
Party Menu Layer (PartyMenuLayer) | ERSECommonUILayer | GameMenu | Layers | The layer of the party menu. | |
Screen Host Class (ScreenHostClass) | TSoftClassPtr<URSECommonScreenHost> | /Script/RSECommonUI.RSECommonScreenHost | Layers | The activatable widget that wraps one RPG Saga screen (a Widget Blueprint derived from RSE Common Screen Host may add a frame or animations). | |
Screen Layers (ScreenLayers) | TMap<TSoftClassPtr<URSEScreenWidget> ,ERSECommonUILayer> | (1 entries) | Layers | Layers of particular screen classes (subclasses included; the most derived listed class wins). |
RPG Saga Engine: Content Budgets
Class URSEContentBudgetSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Content budgets (D-048): the RSE Configurator's validation (Validate All) warns about static / skeletal meshes, textures and, optionally, materials over the budget of their category.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Enabled (bEnabled) | bool | True | Budgets | Master switch of the budget checks in the configurator. | |
Categories (Categories) | TArray<FRSEContentBudgetCategory> | (7 entries) | Budgets | ||
Excluded Folders (ExcludedFolders) | TArray<FDirectoryPath> | (2 entries) | Budgets | Never checked (placeholders like /Game/Characters/Mannequins, imported samples...). | |
Included Folders (IncludedFolders) | TArray<FDirectoryPath> | (3 entries) | Budgets | Only assets under these folders are checked (e.g. /Game/MyRPG). | |
Check Material Statistics (bCheckMaterialStatistics) | bool | False | Materials | Also compiles base materials in the checked folders to count their instructions and texture samples. Slow on first use (shader compilation), so off by default. | |
Max Materials Per Validation (MaxMaterialsPerValidation) | int32 | 50 | Materials | Upper limit of materials compiled per validation. |
RPG Saga Engine: Content Import
Class URSEContentImportSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Content import/export (D-053): author DataAssets in spreadsheets (CSV) or JSON and import them without code.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
AIPack Examples (AIPackExamples) | int32 | 3 | AI Pack | Real rows from the project used as examples in each prompt (0 = none). | |
AIPack Folder (AIPackFolder) | FString | Saved/AIPack | AI Pack | Where Export AI Pack writes the prompt packs (one folder per type plus the extra packs). Relative to the project folder. | |
AIPack Max Listed Values (AIPackMaxListedValues) | int32 | 400 | AI Pack | Longest list of live values (tags, Ids) written into a prompt; longer lists are cut with "... and N more". | |
Forbidden Terms (ForbiddenTerms) | TArray<FString> | (8 entries) | AI Pack | Names and terms generated content must never use (trademarks of other games...). Listed in every self-check. | |
Report Folder (ReportFolder) | FString | Saved/ContentImport | AI Pack | Where every import writes its last report and, after errors, the fix prompt (LastReport.txt, FixPrompt.md). Relative to the project folder. | |
Default Source Folder (DefaultSourceFolder) | FString | Templates/Content/Example | Folders | Default source folder shown in the configurator. Relative to the project folder or absolute. | |
Example Folder (ExampleFolder) | FString | Templates/Content/Example | Folders | Full export of the project's content as a working example. Relative to the project folder. | |
Export Folder (ExportFolder) | FString | Saved/ContentExport | Folders | Default folder of Export in the configurator. Relative to the project folder. | |
Root Folder (RootFolder) | FDirectoryPath | (set per project) | Folders | Base folder of new assets for types without their own Folder (e.g. /Game/Data -> /Game/Data/Abilities). | |
Templates Folder (TemplatesFolder) | FString | Templates/Content | Folders | Empty template sheets (header, hints, one commented example row per type). Relative to the project folder. | |
Save After Apply (bSaveAfterApply) | bool | True | Import | Apply saves the created and changed assets (only those). Off = they stay dirty in the editor. | |
Validate After Apply (bValidateAfterApply) | bool | True | Import | Apply runs IsDataValid on the touched assets and reports the problems as warnings. | |
Localization Namespace Prefix (LocalizationNamespacePrefix) | FString | FFContent | Import | Localization namespace of imported texts = prefix + "." + type name; key = row Id + "." + field path. | |
Max Positional Fields (MaxPositionalFields) | int32 | 3 | Import | Small structs of plain values are written positionally ("Fire:Weak" instead of "(Element=Fire,Affinity=Weak)") when they have at most this many fields. 0 = always named. Both forms are always accepted on import. | |
New Tag Roots (NewTagRoots) | TArray<FString> | (20 entries) | Import | Tag roots under which imported content may name tags that do not exist yet (story flags, variables, class, status and speaker tags...): a dry run lists them as warnings, Apply adds them to New Tag Source first (D-068). Unknown tags under any other root stay errors (elements, stats, battle modes have meaning in code or settings). | |
New Tag Source (NewTagSource) | FString | FF_Content.ini | Import | Tag file (in Config/Tags) that receives the tags an import creates. | |
Types (Types) | TArray<FRSEContentTypeDef> | (48 entries) | Types | The content types (sheets). Order = order of export and of the report. |
RPG Saga Engine: Dialog
Class URSEDialogSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Dialog rules (Project Settings -> RPG Saga Engine -> Dialog).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Host May Control Any Dialog (bHostMayControlAnyDialog) | bool | True | Co-op | The host may also advance and answer any player's dialog (a speaker who left or is away). | |
Control Policy Class (ControlPolicyClass) | TSoftClassPtr<URSEDialogControlPolicy> | None | Co-op | Who may advance a dialog and pick its options in co-op (a Blueprint or C++ child of RSE Dialog Control Policy). Empty = the built-in rules below. Single player is never affected. | |
Story Choice Decider (StoryChoiceDecider) | ERSEDialogChoiceDecider | Host | Co-op | Story choices (choices of dialog assets whose Decider is Default): who picks. | |
System Choice Decider (SystemChoiceDecider) | ERSEDialogChoiceDecider | Speaker | Co-op | Puzzle and system prompts ("Use the key?", "Go to the harbor?", generated at run time): who picks. | |
Vote Timeout Seconds (VoteTimeoutSeconds) | float | 20.000000 | Co-op | A vote ends after this long with the votes cast so far (0 = waits for every player; the host can always end it). | |
Auto Advance After Voice Seconds (AutoAdvanceAfterVoiceSeconds) | float | 0.500000 | Flow | Auto-advance wait after a voiced line's audio ends. | |
Auto Advance Base Seconds (AutoAdvanceBaseSeconds) | float | 1.000000 | Flow | Auto-advance wait after a line is fully shown: base + per character. | |
Auto Advance Per Character Seconds (AutoAdvancePerCharacterSeconds) | float | 0.030000 | Flow | ||
Default Fast Forward (DefaultFastForward) | ERSEDialogFastForwardMode | ReadLinesOnly | Flow | ||
Max Call Depth (MaxCallDepth) | int32 | 8 | Flow | Deepest nesting of Jump nodes with bReturnAfter (sub-dialogs calling sub-dialogs). | |
Max Steps Without Input (MaxStepsWithoutInput) | int32 | 256 | Flow | Loop guard: nodes the runner may pass through without player input before it aborts the dialog. | |
Backlog Size (BacklogSize) | int32 | 100 | Subsystem | Lines kept in the backlog (history screen). | |
Max Concurrent Barks (MaxConcurrentBarks) | int32 | 4 | Subsystem | Barks running at once; the oldest is dropped when a new one starts. | |
Default Characters Per Second (DefaultCharactersPerSecond) | float | 40.000000 | Text | Typewriter speed when the player has not chosen one. | |
Default Unknown Name (DefaultUnknownName) | FText | NSLOCTEXT("RSEDialog", "UnknownSpeaker", "???") | Text | Name shown for a speaker whose name the player has not learned yet and who has no UnknownName. | |
Leader Variable Name (LeaderVariableName) | FName | Leader | Text | Text variable holding the party leader's name ({Leader}). None = not provided. | |
Text Speed Steps (TextSpeedSteps) | TArray<float> | (4 entries) | Text | Speeds offered in the player's options (characters per second; 0 = instant). | |
Text Variables (TextVariables) | TMap<FName,FGameplayTag> | (0 entries) | Text | Text variables backed by story variables: {Gold} in a line shows Narrative.Var.Gold. Key = variable name used in the text, value = Narrative.Var.* tag. |
RPG Saga Engine: Dialog UI
Class URSEDialogUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Look and controls of the dialog presentation (Project Settings -> RPG Saga Engine -> Dialog UI).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Additional Cue Handlers (AdditionalCueHandlers) | TArray<TSoftClassPtr<URSEDialogCueHandler> > | (0 entries) | Classes | Extra cue handlers (a handler for a cue class replaces the built-in one for that class and its subclasses). | |
Dialog Widget Class (DialogWidgetClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSEDialogWidget | Classes | Dialog screen: box, choices, backlog, barks (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEDialogViewModel (docs/product/custom-ui.md). | |
Widget ZOrder (WidgetZOrder) | int32 | 50 | Classes | Z-order of the dialog widget in the viewport (above the battle HUD). | |
Coop Host Decides Text (CoopHostDecidesText) | FText | NSLOCTEXT("RSEDialogUI", "CoopHostDecides", "The host decides.") | Co-op | Status line of a choice the host makes. | |
Coop Speaker Decides Text (CoopSpeakerDecidesText) | FText | NSLOCTEXT("RSEDialogUI", "CoopSpeakerDecides", "{Player} decides.") | Co-op | Status line of a choice the speaker makes ({Player}). | |
Coop Speaking Text (CoopSpeakingText) | FText | NSLOCTEXT("RSEDialogUI", "CoopSpeaking", "{Player} is speaking.") | Co-op | Status line when another player speaks ({Player}). | |
Coop Status Color (CoopStatusColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.084389,Chroma=0.564952,Hue=-10.903101,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Co-op | ||
Coop Vote Text (CoopVoteText) | FText | NSLOCTEXT("RSEDialogUI", "CoopVote", "Vote: {Votes} of {Voters}") | Co-op | Status line of a vote ({Votes}, {Voters}). | |
Coop Vote Timer Text (CoopVoteTimerText) | FText | NSLOCTEXT("RSEDialogUI", "CoopVoteTimer", "Vote: {Votes} of {Voters} - {Seconds} s") | Co-op | Status line of a vote with its timer ({Votes}, {Voters}, {Seconds}). | |
Auto on Color (AutoOnColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Backlog Background Color (BacklogBackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=0.970000,Lightness=-0.434893,Chroma=0.431964,Hue=7.769177,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Bark Color (BarkColor) | FRSEUIColor | (Token="Text",Alpha=0.950000,Lightness=0.002652,Chroma=3.155339,Hue=165.510986,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Bark Text Color (BarkTextColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.190085,Chroma=0.150423,Hue=21.873074,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Box Border Color (BoxBorderColor) | FRSEUIColor | (Token="Primary",Alpha=0.900000,Lightness=0.209728,Chroma=0.457120,Hue=3.533296,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Box Color (BoxColor) | FRSEUIColor | (Token="Primary",Alpha=0.930000,Lightness=-0.412186,Chroma=0.525066,Hue=10.617354,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Dialog box fill: a gradient from BoxTopColor (top) to BoxColor (bottom). | |
Box Top Color (BoxTopColor) | FRSEUIColor | (Token="Primary",Alpha=0.920000,Lightness=-0.242851,Chroma=0.783509,Hue=8.252986,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Choice Chosen Color (ChoiceChosenColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=0.009067,Chroma=0.979660,Hue=0.020606,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Options marked "already asked". | |
Choice Disabled Color (ChoiceDisabledColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.108759,Chroma=1.064321,Hue=5.894447,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Choice Selected Background (ChoiceSelectedBackground) | FRSEUIColor | (Token="Primary",Alpha=0.850000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Choice Selected Color (ChoiceSelectedColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Choice Text Color (ChoiceTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Emphasis Color (EmphasisColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.024543,Chroma=0.667459,Hue=-0.452705,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Help Text Color (HelpTextColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Hint Color (HintColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.023320,Chroma=0.520770,Hue=-23.612774,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Inactive Portrait Tint (InactivePortraitTint) | FLinearColor | (R=0.450000,G=0.450000,B=0.500000,A=1.000000) | Colors | Multiplies the portrait of the speaker who is not talking (a darkening factor, not a style color: it stays a plain color). | |
Letterbox Color (LetterboxColor) | FRSEUIColor | (Token="Black",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Named Colors (NamedColors) | TMap<FName,FRSEUIColor> | (3 entries) | Colors | <color=Name> styles: the text names a style, the look lives here. | |
Name Plate Color (NamePlateColor) | FRSEUIColor | (Token="Primary",Alpha=0.970000,Lightness=-0.303408,Chroma=0.664660,Hue=7.087053,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Narrator Text Color (NarratorTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.039856,Chroma=4.377486,Hue=-11.871398,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Placeholder Portrait Tint (PlaceholderPortraitTint) | FLinearColor | (R=0.350000,G=0.350000,B=0.350000,A=1.000000) | Colors | Portrait placeholder when a speaker has no texture: the speaker's name color (a data color) times this factor (a plain color). | |
Shake Color (ShakeColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.039194,Chroma=0.506467,Hue=-16.092417,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | <shake> / <wave> (drawn as a colored style for now; animated effects come later). | |
Shout Color (ShoutColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.069764,Chroma=0.625954,Hue=9.481684,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Text Color (TextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=0.006938,Chroma=0.986032,Hue=0.001201,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Wave Color (WaveColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.084389,Chroma=0.564952,Hue=-10.903101,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Whisper Color (WhisperColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=0.044332,Chroma=1.182665,Hue=3.650277,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Camera Cues Outside Cinematic (bCameraCuesOutsideCinematic) | bool | False | Cues | Camera cues also work outside Cinematic dialogs (the recommended default is Cinematic only). | |
Camera Shots (CameraShots) | TMap<FGameplayTag,FRSEDialogCameraShot> | (0 entries) | Cues | Dialog.Shot.* -> framing. A camera cue with an unknown shot uses DefaultShot. | |
Default Shot (DefaultShot) | FRSEDialogCameraShot | (Distance=250.000000,TargetHeight=60.000000,CameraHeight=20.000000,YawOffset=25.000000,FieldOfView=50.000000,SpreadDistanceScale=1.200000) | Cues | ||
Emote Balloons (EmoteBalloons) | TMap<FGameplayTag,FText> | (0 entries) | Cues | Emote.* -> balloon glyph shown above the speaker ("!", "?", "..."). A speaker's emote set may override it. | |
Player Speaker Tags (PlayerSpeakerTags) | FGameplayTagContainer | () | Cues | Speakers played by the possessed pawn (the party leader's speaker tags), for cues and barks. | |
Screen Fx (ScreenFx) | TMap<FGameplayTag,FRSEDialogScreenFxStyle> | (0 entries) | Cues | Dialog.Fx.* -> what it does. | |
Advance Keys (AdvanceKeys) | TArray<FKey> | (4 entries) | Input | Completes the line, then continues. Also confirms a choice. | |
Auto Advance Keys (AutoAdvanceKeys) | TArray<FKey> | (2 entries) | Input | ||
Backlog Keys (BacklogKeys) | TArray<FKey> | (2 entries) | Input | ||
Click to Advance (bClickToAdvance) | bool | True | Input | A mouse click on the dialog box advances. | |
Cancel Keys (CancelKeys) | TArray<FKey> | (3 entries) | Input | Picks the choice's cancel option; closes the backlog. | |
Down Keys (DownKeys) | TArray<FKey> | (4 entries) | Input | ||
Fast Forward Keys (FastForwardKeys) | TArray<FKey> | (2 entries) | Input | Held: fast-forwards through lines already read (URSEDialogSettings::DefaultFastForward). | |
Skip Scene Keys (SkipSceneKeys) | TArray<FKey> | (2 entries) | Input | Skips a skippable scene (bSkippable) up to its next choice. | |
Up Keys (UpKeys) | TArray<FKey> | (4 entries) | Input | ||
Backlog Size (BacklogSize) | FVector2D | (X=900.000000,Y=560.000000) | Layout | ||
Balloon World Height (BalloonWorldHeight) | float | 150.000000 | Layout | ||
Bark Fallback Anchor (BarkFallbackAnchor) | FVector2D | (X=0.030000,Y=0.200000) | Layout | Barks whose speaker has no actor in the world: normalized screen point where they stack. | |
Bark Max Distance (BarkMaxDistance) | float | 2500.000000 | Layout | Barks farther than this from the camera are not shown. | |
Bark Max Width (BarkMaxWidth) | float | 320.000000 | Layout | ||
Bark World Height (BarkWorldHeight) | float | 130.000000 | Layout | World height above the speaker's origin where barks and emote balloons appear. | |
Box Border Thickness (BoxBorderThickness) | float | 2.000000 | Layout | ||
Box Bottom Margin (BoxBottomMargin) | float | 40.000000 | Layout | ||
Box Min Height (BoxMinHeight) | float | 130.000000 | Layout | ||
Box Padding (BoxPadding) | float | 18.000000 | Layout | ||
Box Width Fraction (BoxWidthFraction) | float | 0.700000 | Layout | Width of the dialog box as a fraction of the screen. | |
Portraits in Cinematic (bPortraitsInCinematic) | bool | False | Layout | Portraits in Cinematic dialogs (faces are on camera there). | |
Choice Width (ChoiceWidth) | float | 560.000000 | Layout | ||
Cinematic Box Min Height (CinematicBoxMinHeight) | float | 96.000000 | Layout | ||
Cinematic Box Width Fraction (CinematicBoxWidthFraction) | float | 0.600000 | Layout | Cinematic dialogs use a thinner box. | |
Inactive Portrait Scale (InactivePortraitScale) | float | 0.900000 | Layout | The portrait of the speaker who is not talking is scaled by this. | |
Letterbox Height Fraction (LetterboxHeightFraction) | float | 0.110000 | Layout | Letterbox bar height as a fraction of the screen height (Cinematic). | |
Portrait Size (PortraitSize) | FVector2D | (X=180.000000,Y=180.000000) | Layout | ||
Media Panel Full Screen Padding (MediaPanelFullScreenPadding) | FMargin | () | Layout|Media Panel | Full-screen layout: space kept free around the clip (the dialog box stays readable below). | |
Media Panel Margin (MediaPanelMargin) | FVector2D | (X=48.000000,Y=48.000000) | Layout|Media Panel | Side layout: the panel's distance from the top screen corner opposite the speaker. | |
Media Panel Size (MediaPanelSize) | FVector2D | (X=560.000000,Y=315.000000) | Layout|Media Panel | Size of a line's media panel in the Side layout (D-075; 16:9 clips fit 560 x 315). | |
Balloon Font Size (BalloonFontSize) | int32 | 30 | Text | ||
Bark Font Size (BarkFontSize) | int32 | 15 | Text | ||
Reserve Unrevealed Text (bReserveUnrevealedText) | bool | True | Text | Keep unrevealed characters laid out (invisible) so words never jump lines while typing. | |
Choice Font Size (ChoiceFontSize) | int32 | 18 | Text | ||
Dialog Font (DialogFont) | TSoftObjectPtr<UObject> | None | Text | Font asset (composite, with culture fallbacks). Empty = the UI theme's body font (UI Theme -> Fonts -> Body). | |
Emphasis Typeface (EmphasisTypeface) | FName | Italic | Text | Typeface used for <em> and the narrator. | |
Hint Font Size (HintFontSize) | int32 | 13 | Text | ||
Line Font Size (LineFontSize) | int32 | 20 | Text | ||
Name Font Size (NameFontSize) | int32 | 18 | Text | ||
Regular Typeface (RegularTypeface) | FName | Regular | Text | ||
Shout Size Scale (ShoutSizeScale) | float | 1.200000 | Text | <shout> text size relative to the line size. | |
Shout Typeface (ShoutTypeface) | FName | Bold | Text | ||
Title Card Font Size (TitleCardFontSize) | int32 | 34 | Text | ||
Whisper Size Scale (WhisperSizeScale) | float | 0.900000 | Text | <whisper> text size relative to the line size. | |
Advance Indicator (AdvanceIndicator) | FText | NSLOCTEXT("RSEDialogUI", "AdvanceIndicator", "▼") | Texts | Indicator while the line is complete and more follows / at the last line. | |
Auto Action Format (AutoActionFormat) | FText | NSLOCTEXT("RSEDialogUI", "AutoAction", "Auto {AutoState}") | Texts | Auto-advance prompt. Argument: {AutoState} (AutoOnText / AutoOffText). | |
Auto Off Text (AutoOffText) | FText | NSLOCTEXT("RSEDialogUI", "AutoOff", "off") | Texts | ||
Auto on Text (AutoOnText) | FText | NSLOCTEXT("RSEDialogUI", "AutoOn", "ON") | Texts | ||
Backlog Choice Format (BacklogChoiceFormat) | FText | NSLOCTEXT("RSEDialogUI", "BacklogChoiceFormat", "» {Option}") | Texts | A chosen option in the backlog. Argument: {Option}. | |
Backlog Title (BacklogTitle) | FText | NSLOCTEXT("RSEDialogUI", "BacklogTitle", "Log") | Texts | ||
Chosen Marker (ChosenMarker) | FText | NSLOCTEXT("RSEDialogUI", "ChosenMarker", "✓") | Texts | ||
Continue Action Text (ContinueActionText) | FText | NSLOCTEXT("RSEDialogUI", "ContinueAction", "Continue") | Texts | Key prompts of the help bar under the box (the keys are those of the active device). | |
Fast Action Text (FastActionText) | FText | NSLOCTEXT("RSEDialogUI", "FastAction", "Fast") | Texts | ||
Key Separator (KeySeparator) | FText | NSLOCTEXT("RSEDialogUI", "KeySeparator", " / ") | Texts | Separator between the keyboard and gamepad key names in the help bar. | |
Locked Marker (LockedMarker) | FText | NSLOCTEXT("RSEDialogUI", "LockedMarker", "✕ ") | Texts | ||
Log Action Text (LogActionText) | FText | NSLOCTEXT("RSEDialogUI", "LogAction", "Log") | Texts | ||
Media Panel Skip Hint (MediaPanelSkipHint) | FText | NSLOCTEXT("RSEDialogUI", "MediaSkipHint", "Confirm: skip") | Texts | Hint under a clip the line waits for. | |
Selected Marker (SelectedMarker) | FText | NSLOCTEXT("RSEDialogUI", "SelectedMarker", "▶ ") | Texts | ||
Skip Action Text (SkipActionText) | FText | NSLOCTEXT("RSEDialogUI", "SkipAction", "Skip scene") | Texts | Shown only when the scene can be skipped. | |
Unselected Marker (UnselectedMarker) | FText | NSLOCTEXT("RSEDialogUI", "UnselectedMarker", " ") | Texts | ||
Balloon Pop Seconds (BalloonPopSeconds) | float | 0.150000 | Timing | Pop-in scale time of an emote balloon. | |
Balloon Seconds (BalloonSeconds) | float | 1.400000 | Timing | ||
Bark Min Seconds (BarkMinSeconds) | float | 2.500000 | Timing | Barks stay at least this long. | |
Blip Every Characters (BlipEveryCharacters) | int32 | 3 | Timing | One blip every N revealed characters (unvoiced lines with a speaker blip sound). | |
Camera Return Blend Seconds (CameraReturnBlendSeconds) | float | 0.500000 | Timing | Blend back to the gameplay camera after a Cinematic dialog. | |
Close Seconds (CloseSeconds) | float | 0.150000 | Timing | ||
Fast Forward Line Seconds (FastForwardLineSeconds) | float | 0.080000 | Timing | Time each read line stays while fast-forwarding. | |
Indicator Pulse Seconds (IndicatorPulseSeconds) | float | 0.800000 | Timing | Pulse period of the advance indicator. | |
Letterbox Seconds (LetterboxSeconds) | float | 0.400000 | Timing | ||
Open Seconds (OpenSeconds) | float | 0.150000 | Timing | Box open / close animation. | |
Title Card Fade Seconds (TitleCardFadeSeconds) | float | 0.500000 | Timing | Title card of a Cinematic scene: fade in + hold + fade out. The first line waits for it. | |
Title Card Hold Seconds (TitleCardHoldSeconds) | float | 1.800000 | Timing |
RPG Saga Engine: Difficulty
Class URSEDifficultySettings (module RSECore), Project Settings, Project, RPG Saga Engine. Adaptive difficulty (CLAUDE.md 2.8, D-007).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Dead Zone (DeadZone) | float | 0.050000 | Adjustment | Average scores within 0.5 +- DeadZone change nothing (the player is on par). | |
Gain (Gain) | float | 0.200000 | Adjustment | Intelligence change per point of average score away from 0.5 ("on par"), before the step limits. | |
Max Step Down (MaxStepDown) | float | 0.030000 | Adjustment | Largest drop per battle. Smaller than the rise on purpose (D-007: slow decrease, anti-exploit). | |
Max Step Up (MaxStepUp) | float | 0.050000 | Adjustment | Largest rise per battle. | |
Min Battles to Adjust (MinBattlesToAdjust) | int32 | 3 | Adjustment | No adjustment until the window holds at least this many battles (one lucky battle changes nothing). | |
Window Size (WindowSize) | int32 | 5 | Adjustment | Battles remembered per mode; the adjustment follows their weighted average score. | |
Record Escapes (bRecordEscapes) | bool | False | Defeat | Whether escaping an ATB battle is recorded. Off: escapes are ignored (the player may just skip a fight). | |
Defeat Score (DefeatScore) | float | 0.000000 | Defeat | Score of a defeat. | |
Escape Score (EscapeScore) | float | 0.350000 | Defeat | Score of an escape when recorded. | |
Retry Weight Falloff (RetryWeightFalloff) | float | 0.500000 | Defeat | Weight of a defeat in the average is RetryWeightFalloff ^ retries: repeated quick losses count less, so losing on purpose cannot drag the AI down (D-007 anti-exploit). | |
Enabled (bEnabled) | bool | True | General | Off: intelligence never changes and each encounter uses its own Intelligence value. | |
Max Intelligence (MaxIntelligence) | float | 1.000000 | Limits | ||
Min Intelligence (MinIntelligence) | float | 0.150000 | Limits | Global bounds of the adaptive value. Encounters narrow them further (MinIntelligence / MaxIntelligence). | |
ATB (ATB) | FRSEDifficultyModeTuning | (StartIntelligence=0.500000,TargetTurnsPerEnemy=4.000000,WorstTurnsPerEnemy=10.000000) | Modes | ||
Tactics (Tactics) | FRSEDifficultyModeTuning | (StartIntelligence=0.500000,TargetTurnsPerEnemy=4.000000,WorstTurnsPerEnemy=10.000000) | Modes | ||
Damage Weight (DamageWeight) | float | 1.000000 | Score | Weight of damage taken in a victory's score. | |
Fallen Weight (FallenWeight) | float | 1.000000 | Score | Weight of fallen player units in a victory's score. | |
Retry Penalty (RetryPenalty) | float | 0.100000 | Score | Score lost per retry before a victory (a win after several defeats was hard). | |
Target Damage Taken Share (TargetDamageTakenShare) | float | 0.350000 | Score | Damage taken, as a share of the party's total max HP, that counts as "on par" (score 0.5). | |
Target Fallen Share (TargetFallenShare) | float | 0.100000 | Score | Share of player units that fell (at least once) that counts as "on par". | |
Tempo Weight (TempoWeight) | float | 1.000000 | Score | Weight of tempo (player turns per opposing unit) in a victory's score. | |
Worst Damage Taken Share (WorstDamageTakenShare) | float | 1.000000 | Score | Damage taken share that counts as a full struggle (score 0). Must exceed the target. | |
Worst Fallen Share (WorstFallenShare) | float | 0.750000 | Score | Share of fallen player units that counts as a full struggle. Must exceed the target. |
RPG Saga Engine: Economy
Class URSEEconomySettings (module RSECore), Project Settings, Project, RPG Saga Engine. Economy rules (D-042, docs/design/economy.md): the currency, selling, inns and the money cap.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Battle Money Cap (BattleMoneyCap) | FRuntimeFloatCurve | (EditorCurveData=(Keys=((Time=1.000000,Value=600.000000),(Time=10.000000,Value=1000.000000),(Time=24.000000,Value=2500.000000),(Time=38.000000,Value=5000.000000... | Battle Money | Most money one battle gives (Y) for the level of its strongest defeated enemy (X). Linear between the keys, flat beyond the ends. The defaults sit above the starter campaign's boss rewards of each zone. | |
Cap Battle Money (bCapBattleMoney) | bool | True | Battle Money | One battle never gives more money than Battle Money Cap allows for its strongest defeated enemy's level. Loot tables are shared between zones: a late boss's table on an early enemy would otherwise pay a fortune. | |
Currency Name (CurrencyName) | FText | NSLOCTEXT("RSEEconomy", "CurrencyName", "Crowns") | Currency | Name of the one currency, in menus ("Crowns"). | |
Currency Symbol (CurrencySymbol) | FText | NSLOCTEXT("RSEEconomy", "CurrencySymbol", "cr") | Currency | Short symbol shown after amounts ("cr"). | |
Max Money (MaxMoney) | int32 | 9999999 | Currency | The party never holds more than this; extra money is lost. | |
Money Format (MoneyFormat) | FText | NSLOCTEXT("RSEEconomy", "MoneyFormat", "{Amount} {Symbol}") | Currency | How an amount is written. {Amount} = the number, {Symbol} = CurrencySymbol, {Name} = CurrencyName. | |
Starting Money (StartingMoney) | int32 | 200 | Currency | Money of a new game (and of saves made before the economy existed). | |
Inn Revives KO (bInnRevivesKO) | bool | True | Inns | Resting also revives fallen members. Off = KO members stay KO (a revive item or save point is needed). | |
Default Inn Cost (DefaultInnCost) | int32 | 50 | Inns | Price of a night when the Rest At Inn effect does not set one. | |
Buy Price Multiplier (BuyPriceMultiplier) | float | 1.000000 | Shops | Buy prices of every shop are multiplied by this (chapter inflation, a rules profile's "hard" economy). | |
Sell Ratio (SellRatio) | float | 0.500000 | Shops | Sell price = buy price x this, rounded down, unless the item sets its own sell price. |
RPG Saga Engine: Economy UI
Class URSEEconomyUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of the economy (D-042): the shop screen, chests, the inn fade and the money shown in menus.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Chest Empty Text (ChestEmptyText) | FText | NSLOCTEXT("RSEEconomyUI", "ChestEmpty", "It\'s empty.") | Chest | Opened again, or opened with nothing inside. | |
Chest Full Text (ChestFullText) | FText | NSLOCTEXT("RSEEconomyUI", "ChestFull", "You cannot carry any more.") | Chest | ||
Chest Item Format (ChestItemFormat) | FText | NSLOCTEXT("RSEEconomyUI", "ChestItemFormat", "Found {Item} ×{Count}.") | Chest | Pickup line per item: {Item}, {Count}. | |
Chest Key Used Format (ChestKeyUsedFormat) | FText | NSLOCTEXT("RSEEconomyUI", "ChestKeyUsedFormat", "Used the {Item}.") | Chest | The key was used up: {Item}. | |
Chest Locked Text (ChestLockedText) | FText | NSLOCTEXT("RSEEconomyUI", "ChestLocked", "It\'s locked.") | Chest | Locked and the chest sets no lines of its own. | |
Chest Money Format (ChestMoneyFormat) | FText | NSLOCTEXT("RSEEconomyUI", "ChestMoneyFormat", "Found {Money}.") | Chest | Pickup line for money: {Money}. | |
Chest Open Seconds (ChestOpenSeconds) | float | 0.600000 | Chest | Seconds the lid takes to open. | |
Chest Placeholder Mesh (ChestPlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Chest | Placeholder chest body when the chest has no mesh (engine cube by default). | |
Chest Prompt Text (ChestPromptText) | FText | NSLOCTEXT("RSEEconomyUI", "ChestPrompt", "Open") | Chest | Prompt of a chest without its own PromptText. | |
Inn Fade Color (InnFadeColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=1.000000) | Inn | ||
Inn Fade in Seconds (InnFadeInSeconds) | float | 0.800000 | Inn | ||
Inn Fade Out Seconds (InnFadeOutSeconds) | float | 0.800000 | Inn | --- Inn --- | |
Inn Hold Seconds (InnHoldSeconds) | float | 1.200000 | Inn | Black screen between the fades. | |
Party Menu Money Format (PartyMenuMoneyFormat) | FText | NSLOCTEXT("RSEEconomyUI", "PartyMenuMoneyFormat", "{Money}") | Menus | Party menu header: {Money} (formatted with the currency). | |
Results Money Format (ResultsMoneyFormat) | FText | NSLOCTEXT("RSEEconomyUI", "ResultsMoneyFormat", "{Term.Money}: +{Money}") | Menus | Results screen line: {Money}. | |
Quantity Big Step (QuantityBigStep) | int32 | 10 | Shop | Quantity step of Left / Right in the quantity selector (Up / Down step by 1). | |
Shop Backdrop Color (ShopBackdropColor) | FRSEUIColor | (Token="Primary",Alpha=0.700000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Shop | ||
Shop Height (ShopHeight) | float | 600.000000 | Shop | ||
Shop List Width (ShopListWidth) | float | 460.000000 | Shop | Width of the item list; the details take the rest. | |
Shop Widget Class (ShopWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Shop | Shop screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEShopViewModel (docs/product/custom-ui.md). | |
Shop Width (ShopWidth) | float | 1000.000000 | Shop | ||
Shop ZOrder (ShopZOrder) | int32 | 55 | Shop | Z-order in the viewport (above the HUDs and the party menu). | |
All Category Text (AllCategoryText) | FText | NSLOCTEXT("RSEEconomyUI", "AllCategory", "All") | Shop|Text | ||
Bought Format (BoughtFormat) | FText | NSLOCTEXT("RSEEconomyUI", "BoughtFormat", "Bought {Item} ×{Count} for {Money}.") | Shop|Text | After a purchase: {Item}, {Count}, {Money} (the total). | |
Buy Action Text (BuyActionText) | FText | NSLOCTEXT("RSEEconomyUI", "BuyAction", "Buy") | Shop|Text | ||
Buy Tab Text (BuyTabText) | FText | NSLOCTEXT("RSEEconomyUI", "BuyTab", "Buy") | Shop|Text | ||
Cannot Equip Text (CannotEquipText) | FText | NSLOCTEXT("RSEEconomyUI", "CannotEquip", "Cannot equip") | Shop|Text | Comparison line of a member that cannot wear the item. | |
Category Action Text (CategoryActionText) | FText | NSLOCTEXT("RSEEconomyUI", "CategoryAction", "Category") | Shop|Text | ||
Compare Header (CompareHeader) | FText | NSLOCTEXT("RSEEconomyUI", "CompareHeader", "{Term.Party}") | Shop|Text | Equipment comparison heading. | |
Consumables Category Text (ConsumablesCategoryText) | FText | NSLOCTEXT("RSEEconomyUI", "ConsumablesCategory", "{Term.Items}") | Shop|Text | ||
Documents Category Text (DocumentsCategoryText) | FText | NSLOCTEXT("RSEEconomyUI", "DocumentsCategory", "Documents") | Shop|Text | ||
Equipment Category Text (EquipmentCategoryText) | FText | NSLOCTEXT("RSEEconomyUI", "EquipmentCategory", "{Term.Equipment}") | Shop|Text | ||
Inventory Full Text (InventoryFullText) | FText | NSLOCTEXT("RSEEconomyUI", "InventoryFull", "You cannot carry any more of that.") | Shop|Text | ||
Key Items Category Text (KeyItemsCategoryText) | FText | NSLOCTEXT("RSEEconomyUI", "KeyItemsCategory", "{Term.KeyItems}") | Shop|Text | ||
Leave Action Text (LeaveActionText) | FText | NSLOCTEXT("RSEEconomyUI", "LeaveAction", "Leave") | Shop|Text | ||
No Change Text (NoChangeText) | FText | NSLOCTEXT("RSEEconomyUI", "NoChange", "No change") | Shop|Text | Comparison line when nothing changes. | |
Not Enough Money Text (NotEnoughMoneyText) | FText | NSLOCTEXT("RSEEconomyUI", "NotEnoughMoney", "Not enough money.") | Shop|Text | ||
Nothing for Sale Text (NothingForSaleText) | FText | NSLOCTEXT("RSEEconomyUI", "NothingForSale", "Nothing for sale right now.") | Shop|Text | ||
Nothing to Sell Text (NothingToSellText) | FText | NSLOCTEXT("RSEEconomyUI", "NothingToSell", "Nothing to sell.") | Shop|Text | ||
Owned Format (OwnedFormat) | FText | NSLOCTEXT("RSEEconomyUI", "OwnedFormat", "Owned: {Count}") | Shop|Text | Details: how many the party holds. {Count}. | |
Quantity Action Text (QuantityActionText) | FText | NSLOCTEXT("RSEEconomyUI", "QuantityAction", "Quantity") | Shop|Text | ||
Quantity Format (QuantityFormat) | FText | NSLOCTEXT("RSEEconomyUI", "QuantityFormat", "Quantity: ◀ {Count} ▶") | Shop|Text | Quantity selector: {Count}. | |
Sell Action Text (SellActionText) | FText | NSLOCTEXT("RSEEconomyUI", "SellAction", "Sell") | Shop|Text | ||
Sell Tab Text (SellTabText) | FText | NSLOCTEXT("RSEEconomyUI", "SellTab", "Sell") | Shop|Text | ||
Sold Format (SoldFormat) | FText | NSLOCTEXT("RSEEconomyUI", "SoldFormat", "Sold {Item} ×{Count} for {Money}.") | Shop|Text | After a sale: {Item}, {Count}, {Money}. | |
Sold Out Text (SoldOutText) | FText | NSLOCTEXT("RSEEconomyUI", "SoldOut", "Sold out") | Shop|Text | ||
Stock Format (StockFormat) | FText | NSLOCTEXT("RSEEconomyUI", "StockFormat", "In stock: {Count}") | Shop|Text | Details: stock left of a limited entry. {Count}. | |
Switch Tab Action Text (SwitchTabActionText) | FText | NSLOCTEXT("RSEEconomyUI", "SwitchTabAction", "Buy / Sell") | Shop|Text | ||
Total Format (TotalFormat) | FText | NSLOCTEXT("RSEEconomyUI", "TotalFormat", "Total: {Money}") | Shop|Text | Quantity selector: {Money} = the total. |
RPG Saga Engine: Encounters
Class URSEEncounterSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Random encounters v2 (D-063, docs/design/random-encounters.md): generated groups, encounter rate effects, the player's battle frequency option, contact initiative and the grace periods of visible enemies.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Allow Back Attack (bAllowBackAttack) | bool | True | Contact | A chasing enemy that touches the party from behind starts a Back Attack (the enemies' gauges start filled). | |
Allow Preemptive (bAllowPreemptive) | bool | True | Contact | Touching an unaware enemy from behind starts a Preemptive battle (the party's ATB gauges start filled). | |
Behind Half Angle (BehindHalfAngle) | float | 60.000000 | Contact | Half angle of the "behind" cone of a pawn (0 = exactly behind, 90 = the whole back half). | |
Flee Grace Seconds (FleeGraceSeconds) | float | 6.000000 | Contact | After the party flees a visible group, the group ignores the party for this long (no immediate re-contact). | |
Initiative Gauge Fraction (InitiativeGaugeFraction) | float | 1.000000 | Contact | ATB gauge (share of full) of the side that has the initiative; 1 = ready at once. | |
Post Battle Grace Seconds (PostBattleGraceSeconds) | float | 2.000000 | Contact | After any battle, no visible enemy may start a battle for this long. | |
Surprised Gauge Fraction (SurprisedGaugeFraction) | float | 0.000000 | Contact | ATB gauge (share of full) of the surprised side. | |
Frequency Affects Visible Enemies (bFrequencyAffectsVisibleEnemies) | bool | True | Frequency | The frequency option also changes how many visible enemy groups spawners place. | |
Default Frequency Index (DefaultFrequencyIndex) | int32 | 1 | Frequency | The level a new player starts with (index into Frequency Levels). | |
Frequency Levels (FrequencyLevels) | TArray<FRSEEncounterFrequencyLevel> | (3 entries) | Frequency | The choices of the "Battle frequency" option, in menu order. | |
Default Enemy Team (DefaultEnemyTeam) | FGameplayTag | (TagName="Team.Enemy") | Generated Groups | Enemy side of generated groups whose pool leaves it empty (global). | |
Default Player Team (DefaultPlayerTeam) | FGameplayTag | (TagName="Team.Player") | Generated Groups | Player side of generated groups whose pool leaves it empty (global). | |
Elite Chance Multiplier (EliteChanceMultiplier) | float | 1.000000 | Generated Groups | Multiplies every pool's elite chance (0 = no elite groups). | |
Max Group Size (MaxGroupSize) | int32 | 6 | Generated Groups | Most enemies a generated group may have, whatever its pool says (the ATB stage has a limited number of slots). | |
Multiply Different Sources (bMultiplyDifferentSources) | bool | False | Rate Effects | Effects of different sources multiply each other. Off: a new effect replaces every active one (classic Repel / Lure). | |
Rate Scales Enemy Detection (bRateScalesEnemyDetection) | bool | True | Rate Effects | Visible enemies see and hear less while the rate is below 1 (detection radius x rate; 0 = they never notice the party). | |
Max Active Effects (MaxActiveEffects) | int32 | 4 | Rate Effects | Most rate effects active at once (the oldest ones end first). | |
Max Rate Multiplier (MaxRateMultiplier) | float | 5.000000 | Rate Effects | The total multiplier (effects x traits x player frequency) never goes above this. | |
Same Source Stacking (SameSourceStacking) | ERSEEncounterRateStacking | Refresh | Rate Effects | What a rate effect does to an active one of the same source (same item or ability). | |
Trait Rate Multipliers (TraitRateMultipliers) | TMap<FGameplayTag,float> | (2 entries) | Rate Effects | Passive traits (Trait.* tags granted by the equipment of the party's battle formation, their statuses or Pacts) that multiply the encounter rate, e.g. Trait.Encounter.Half -> 0.5. Each trait counts once, however many members have it. | |
World Step Length (WorldStepLength) | float | 100.000000 | Rate Effects | Distance walked that counts as one step for rate effect durations and step-based respawns, everywhere in the world (global). |
RPG Saga Engine: Encounters (World)
Class URSEEncounterPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. Visible enemies in the world (D-063, docs/design/random-encounters.md): update rates, sleeping far from the player, the placeholder body, the alert above the leader and the debug colors.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Alert Color (AlertColor) | FLinearColor | (R=1.000000,G=0.850000,B=0.100000,A=1.000000) | Alert | ||
Alert Height (AlertHeight) | float | 40.000000 | Alert | Height of the alert above the top of the capsule. | |
Alert Text Size (AlertTextSize) | float | 60.000000 | Alert | World size of the alert text. | |
Default Alert Text (DefaultAlertText) | FText | NSLOCTEXT("RSEEncounterPresentation", "Alert", "!") | Alert | Alert text when a behavior sets none. | |
Capsule Half Height (CapsuleHalfHeight) | float | 88.000000 | Body | ||
Capsule Radius (CapsuleRadius) | float | 34.000000 | Body | --- Body --- | |
Follower Catch Up (FollowerCatchUp) | float | 1.100000 | Body | Followers walk this much faster than their leader, to keep up after turns. | |
Follower Spacing (FollowerSpacing) | float | 140.000000 | Body | Followers keep this distance behind the leader. | |
Max Followers (MaxFollowers) | int32 | 2 | Body | Most followers shown behind a leader (the rest of the group is only in the battle). | |
Placeholder Mesh (PlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Body | Shown while the enemy has no animated appearance (its character's Appearance, D-046). | |
Placeholder Scale (PlaceholderScale) | FVector | (X=0.600000,Y=0.600000,Z=1.700000) | Body | ||
Turn Rate (TurnRate) | float | 540.000000 | Body | How fast enemies turn toward where they walk. | |
Debug Chase Color (DebugChaseColor) | FColor | (B=40,G=60,R=255,A=255) | Debug | ||
Debug Hearing Color (DebugHearingColor) | FColor | (B=255,G=180,R=80,A=255) | Debug | ||
Debug Segments (DebugSegments) | int32 | 24 | Debug | Segments of the debug circles and cones. | |
Debug Sight Color (DebugSightColor) | FColor | (B=40,G=200,R=255,A=255) | Debug | --- Debug (RSE.Encounter.Debug) --- | |
Acceptance Radius (AcceptanceRadius) | float | 50.000000 | Updates | Distance at which a move counts as arrived. | |
Activation Check Interval (ActivationCheckInterval) | float | 1.000000 | Updates | How often spawners check the explorer's distance to wake or put their groups to sleep. | |
Activation Radius (ActivationRadius) | float | 5000.000000 | Updates | Groups farther than this from the explorer sleep: no thinking, no movement (Steam Deck budget). 0 = never sleep. | |
Use Navigation (bUseNavigation) | bool | True | Updates | Moves use the navigation mesh when the map has one; without it (or off) enemies walk straight to their target. | |
Step Sample Interval (StepSampleInterval) | float | 0.250000 | Updates | How often the world step counter (rate effect durations, step respawns) samples the explorer. | |
Think Interval (ThinkInterval) | float | 0.200000 | Updates | How often a visible enemy decides what to do (detection, chase, give up). No per-frame tick. |
RPG Saga Engine: Exploration
Class URSEExplorationSettings (module RSE), Project Settings, Project, RPG Saga Engine. Exploration (D-026, D-113): input assets, movement, the exploration camera (tactical or third person) and the hand-off to battles.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
ATBEnd Check Interval (ATBEndCheckInterval) | float | 0.100000 | Battle Transition | How often a running ATB battle is checked for the player leaving it. | |
Battle Start During Story (BattleStartDuringStory) | ERSEBattleStartDuringStory | Wait | Battle Transition | D-120: what a battle start does while a story scene or a blocking dialog is on screen. Every start path asks the battle start gate (encounter triggers, roaming contact, Free Tactics detection, the Start Battle effect, dev commands). | |
Hide Explorer During Tactics (bHideExplorerDuringTactics) | bool | True | Battle Transition | Hide the explorer (and its collision) during Tactics battles, so it does not stand on the grid. | |
Return on Interact (bReturnOnInteract) | bool | True | Battle Transition | Interact skips the wait after a Tactics battle. | |
Camera Blend Time (CameraBlendTime) | float | 0.600000 | Battle Transition | Blend between the exploration camera and the tactical camera, both ways. | |
Tactics Camera Pawn Class (TacticsCameraPawnClass) | TSoftClassPtr<ARSETacticsCameraPawn> | /Script/RSE.RSETacticsCameraPawn | Battle Transition | Camera pawn possessed during Tactics battles started from exploration. | |
Tactics Return Delay (TacticsReturnDelay) | float | 2.500000 | Battle Transition | Seconds after a Tactics battle's result is shown before returning to exploration. 0 = wait for Interact. | |
Clear Battle Area (bClearBattleArea) | bool | True | Battle Transition|Clear Battle Area | Battles on the live map clear their area while they run: the explorer, the visible group that started the battle and the chosen actors on the stage or in the battle camera's view are hidden (no collision, no movement) and come back afterwards. A defeated group despawns as usual (D-063). | |
Hide Explorer During Classic (bHideExplorerDuringClassic) | bool | True | Battle Transition|Clear Battle Area | Hide the explorer during classic (ATB / turn-based) battles: the party stands on the stage instead. | |
Hide NPCs (bHideNPCs) | bool | True | Battle Transition|Clear Battle Area | Hide NPCs in the battle area or the battle camera's view. | |
Hide Roaming Enemies (bHideRoamingEnemies) | bool | True | Battle Transition|Clear Battle Area | Hide other visible enemies in the battle area or the battle camera's view. | |
Hide Source Group (bHideSourceGroup) | bool | True | Battle Transition|Clear Battle Area | Hide the whole visible group whose contact started the battle, wherever it stands. | |
Clear Delay (ClearDelay) | float | 0.150000 | Battle Transition|Clear Battle Area | Seconds after the battle starts before the area is cleared: the camera blend leaves the explorer first. 0 = at once. | |
Clear Radius (ClearRadius) | float | 800.000000 | Battle Transition|Clear Battle Area | Added to the room the battle's formation needs: candidates closer than that to the battle's center are hidden. | |
Clear View Distance (ClearViewDistance) | float | 6000.000000 | Battle Transition|Clear Battle Area | Candidates the battle camera sees closer than this are hidden too (0 = only the area). | |
Clear View Margin (ClearViewMargin) | float | 8.000000 | Battle Transition|Clear Battle Area | The camera's view is widened by this on every side (an actor at the frame's edge still shows). | |
Extra Classes to Hide (ExtraClassesToHide) | TArray<TSoftClassPtr<AActor> > | (0 entries) | Battle Transition|Clear Battle Area | Other actor classes hidden the same way (animals, props that move, your own actors). | |
Keep Visible Tag (KeepVisibleTag) | FName | RSE.KeepInBattle | Battle Transition|Clear Battle Area | Actors with this tag are never hidden (a guard that watches the fight, a scripted witness). None = no exception. | |
Camera Style (CameraStyle) | ERSEExplorationCameraStyle | Tactical | Camera | D-113: the party RPG camera (Tactical: high, tactical angle, zoom, rotation around the party, occluders fade) or the classic third person camera (D-026, the values below). A level may override it (RSE Exploration Camera actor); Interior Volumes still use their close profiles. | |
Tactical Camera (TacticalCamera) | FRSETacticalCameraSettings | (MinDistance=700.000000,MaxDistance=2600.000000,StartDistance=1600.000000,ZoomStep=220.000000,bZoomStepIsRelative=True,ZoomSmoothSpeed=8.000000,PitchAtMinDistan... | Camera|Tactical | D-113: the tactical camera (Camera Style = Tactical). | |
Camera Collision (bCameraCollision) | bool | True | Camera|Third Person | Third person: the camera is pulled in front of walls (its collision probe). The tactical camera never collides. | |
Enable Camera Lag (bEnableCameraLag) | bool | True | Camera|Third Person | ||
Invert Look Y (bInvertLookY) | bool | False | Camera|Third Person | ||
Camera Distance (CameraDistance) | float | 480.000000 | Camera|Third Person | Distance from the character to the camera (third person; also the start of an interior profile's blend). | |
Camera Lag Speed (CameraLagSpeed) | float | 10.000000 | Camera|Third Person | Higher follows the character more tightly. | |
Camera Probe Size (CameraProbeSize) | float | 12.000000 | Camera|Third Person | Radius of the probe that pulls the camera in front of walls. | |
Camera Rotation Lag Speed (CameraRotationLagSpeed) | float | 0.000000 | Camera|Third Person | 0 = the camera turns instantly with the input. | |
Camera Target Offset (CameraTargetOffset) | FVector | (X=0.000000,Y=0.000000,Z=60.000000) | Camera|Third Person | Point the camera looks at, relative to the character's origin (height above the capsule center). | |
Default Pitch (DefaultPitch) | float | -15.000000 | Camera|Third Person | Camera pitch when exploration starts (negative looks down). | |
Field Of View (FieldOfView) | float | 70.000000 | Camera|Third Person | ||
Look Sensitivity (LookSensitivity) | FVector2D | (X=1.000000,Y=1.000000) | Camera|Third Person | Degrees per unit of Look input (mouse counts or scaled stick), X = yaw, Y = pitch. | |
Max Pitch (MaxPitch) | float | 15.000000 | Camera|Third Person | ||
Min Pitch (MinPitch) | float | -60.000000 | Camera|Third Person | ||
Recover from Falls (bRecoverFromFalls) | bool | True | Fall Recovery | A safety net for gaps in a level's collision: an explorer (the leader or a visible party member) that falls for too long, ends up under the terrain, below the level's Kill Z or outside its map bounds is put back where it last stood on solid ground. Nothing happens during battles, and only where the explorer really lost its footing. | |
Recover from Under Terrain (bRecoverFromUnderTerrain) | bool | True | Fall Recovery | An explorer with a landscape above its feet (it slipped under the terrain) is put back. | |
Fall Check Interval (FallCheckInterval) | float | 0.500000 | Fall Recovery | How often the explorers are checked (a timer, no tick). | |
Kill ZMargin (KillZMargin) | float | 5000.000000 | Fall Recovery | Put back an explorer this close above the level's Kill Z (before the engine destroys it). | |
Map Bounds Margin (MapBoundsMargin) | float | 2000.000000 | Fall Recovery | Put back an explorer outside the map's bounds (an RSE Map Bounds Volume): beyond its sides or this far below its floor. | |
Max Fall Seconds (MaxFallSeconds) | float | 3.000000 | Fall Recovery | Falling longer than this counts as falling out of the level (a jump or a ledge takes far less). | |
Recovery Lift (RecoveryLift) | float | 30.000000 | Fall Recovery | The explorer comes back this high above the spot it last stood on. | |
Block Pawn Input Under Screens (bBlockPawnInputUnderScreens) | bool | True | Input | D-152, a safety net under the input contexts and the focus: while a menu or another modal screen of its player is open (URSEModalScreenSubsystem, per local player), the explorer ignores movement, camera and action input, so the character never walks under an open map or menu. Other local players keep moving. | |
Hide Cursor While Exploring (bHideCursorWhileExploring) | bool | True | Input | Hide the mouse cursor while exploring, so the mouse turns the camera (shown again in battles and menus). The tactical camera with Mouse Rotation "While Dragging" keeps the cursor visible (the drag turns the view). | |
Distract Action (DistractAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Distract.IA_Distract | Input | Aims and throws a distraction (D-109): hold to aim with the camera, release to throw (Exploration RPG settings). | |
Exploration Mapping Context (ExplorationMappingContext) | TSoftObjectPtr<UInputMappingContext> | /RPGSagaEngine/Input/IMC_Exploration.IMC_Exploration | Input | Mapping context active while exploring. The tactics context is removed meanwhile (both use WASD). | |
Exploration Mapping Priority (ExplorationMappingPriority) | int32 | 0 | Input | ||
Interact Action (InteractAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Interact.IA_Interact | Input | Examine / talk (Phase 7) and "continue" after a battle. | |
Look Action (LookAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreLook.IA_ExploreLook | Input | Axis2D: X = yaw, Y = pitch (positive looks up). Gamepad mappings should scale by delta time. | |
Menu Check Interval (MenuCheckInterval) | float | 0.100000 | Input | How often exploration checks whether the party menu opened or closed (to swap input contexts). | |
Move Action (MoveAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreMove.IA_ExploreMove | Input | Axis2D: X = right, Y = forward, relative to the camera. | |
Party Command Action (PartyCommandAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_PartyCommand.IA_PartyCommand | Input | Opens the radial menu of delegated party commands (D-097). | |
Run Action (RunAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreRun.IA_ExploreRun | Input | Held: switches between walking and running (see bRunByDefault). | |
Sneak Action (SneakAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreSneak.IA_ExploreSneak | Input | Toggles sneaking (D-097): a slow walk the visible enemies notice much later (Stealth settings). | |
Switch Leader Action (SwitchLeaderAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_SwitchLeader.IA_SwitchLeader | Input | Axis1D or button: the next (positive) / previous party member becomes the leader (D-097, the visible party). | |
Invert Camera Tilt (bInvertCameraTilt) | bool | False | Input|Camera | D-129: the project's default for the player's Invert Camera Tilt option (up looks down). The player's choice wins (Options). | |
Camera Drag Action (CameraDragAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraDrag.IA_ExploreCameraDrag | Input|Camera | D-113, tactical camera: held, the mouse turns the view (right or middle mouse button; LB: the right stick pans). | |
Camera Gamepad Speed (CameraGamepadSpeed) | float | 1.000000 | Input|Camera | D-150: the project's default for the player's Camera speed (gamepad) option: multiplies Tactical Camera -> Rotate Speed. | |
Camera Mouse Speed (CameraMouseSpeed) | float | 1.000000 | Input|Camera | D-150: the project's default for the player's Camera speed (mouse) option: multiplies Tactical Camera -> Mouse Rotate Sensitivity (1 = as set). The player's choice wins (Options -> Controls). | |
Camera Pan Action (CameraPanAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraPan.IA_ExploreCameraPan | Input|Camera | D-113, tactical camera: Axis2D, pans the view away from the leader (arrow keys). | |
Camera Rotate Action (CameraRotateAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraRotate.IA_ExploreCameraRotate | Input|Camera | D-113, tactical camera: Axis1D, turns the view (positive = right; Q / R, the right stick): -1..1 at Rotate Speed. | |
Camera Speed Option Range (CameraSpeedOptionRange) | FVector2D | (X=0.250000,Y=2.000000) | Input|Camera | D-150: the range the player's camera speed options offer (Options -> Controls), and their step. | |
Camera Speed Option Step (CameraSpeedOptionStep) | float | 0.050000 | Input|Camera | ||
Camera Tilt Action (CameraTiltAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraTilt.IA_ExploreCameraTilt | Input|Camera | D-129, tactical camera: Axis1D, tilts the view a little (positive = up, toward the horizon; Page Up / Page Down, the right stick up / down): -1..1 at Tactical Camera -> Tilt Speed. The mouse tilts while Camera Drag is held (vertical movement). | |
Camera Tilt Reset Action (CameraTiltResetAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraTiltReset.IA_ExploreCameraTiltReset | Input|Camera | D-129, tactical camera: puts the tilt back to the zoom's angle (Home; LB + right stick click). A double click of Camera Drag does too. | |
Camera Zoom Action (CameraZoomAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_ExploreCameraZoom.IA_ExploreCameraZoom | Input|Camera | D-113, tactical camera: Axis1D, the mouse wheel (positive zooms in; notches: a trigger or stick mapping scales by delta time). D-129: RT / LT on the gamepad. | |
Run by Default (bRunByDefault) | bool | True | Movement | RSE style: run unless the Run action is held (then walk). False: walk unless Run is held. | |
Run Speed (RunSpeed) | float | 550.000000 | Movement | ||
Turn Rate (TurnRate) | float | 720.000000 | Movement | How fast the character turns toward its movement direction. | |
Walk Speed (WalkSpeed) | float | 220.000000 | Movement | --- Movement --- | |
Placeholder Mesh (PlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Movement|Placeholder | Placeholder body until real characters exist (e.g. /Engine/BasicShapes/Cylinder). Empty = none. | |
Placeholder Mesh Scale (PlaceholderMeshScale) | FVector | (X=0.700000,Y=0.700000,Z=1.800000) | Movement|Placeholder | Scale of the placeholder mesh (the engine basic shapes are 100 cm). | |
Random Encounter Sample Interval (RandomEncounterSampleInterval) | float | 0.200000 | Random Encounters | How often random encounter areas measure the distance walked. |
RPG Saga Engine: Exploration RPG
Class URSEExploreRPGSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Exploration RPG rules (D-109): skills, traps, locks, stealing, dialog battles, distractions and fallen members.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Choice Opening (ChoiceOpening) | ERSEFreeOpening | PlayerSurprise | Dialog Battles | "From Context" battles started by a dialog choice (the player strikes first). | |
NPCBattle Encounter (NPCBattleEncounter) | TSoftObjectPtr<URSEEncounterData> | /RPGSagaEngine/Data/Explore/DA_Encounter_NPCFight.DA_Encounter_NPCFight | Dialog Battles | The encounter a Start Battle effect without one uses when only NPCs fight (teams, objectives, rewards; a Free Tactics encounter without enemies: the NPCs are its enemies). | |
Scene Radius (SceneRadius) | float | 1500.000000 | Dialog Battles | Scene NPCs: combatant NPCs this close to the party join a dialog battle that asks for the scene (cm). | |
Speaker Line Opening (SpeakerLineOpening) | ERSEFreeOpening | EnemySurprise | Dialog Battles | "From Context" battles started by a speaker's line or node (the speaker's side strikes first). | |
Alerted Ignore Distractions (bAlertedIgnoreDistractions) | bool | True | Distractions | Enemies already chasing the party ignore distractions. | |
Distractions (bDistractions) | bool | True | Distractions | The party may throw a distraction (the Distract action). | |
Cooldown (Cooldown) | float | 4.000000 | Distractions | Seconds before the next throw. | |
Investigate Seconds (InvestigateSeconds) | float | 6.000000 | Distractions | Seconds an enemy looks around at the point before it goes back. | |
Noise Radius (NoiseRadius) | float | 1200.000000 | Distractions | Visible enemies within this distance of the landing point hear it and come to look (cm). | |
Throw Item (ThrowItem) | TSoftObjectPtr<URSEItemData> | None | Distractions | Each throw uses one of this item (a stone, a bottle). Empty = free. | |
Throw Range (ThrowRange) | float | 1500.000000 | Distractions | Farthest throw from the leader (cm). | |
After Battle (AfterBattle) | ERSEFallenAfterBattle | GetUp | Fallen Members | After a won or fled battle, the fallen get up (Get Up) or stay down until revived. | |
Help Up Without Item (bHelpUpWithoutItem) | bool | False | Fallen Members | Stay Down: a standing member may help a fallen one up without any item or spell ("Help up"), with Help Up HP. Off = only a revive item, a revive spell, an inn or a rest. | |
Carry Distance (CarryDistance) | float | 2500.000000 | Fallen Members | Stay Down: the party carries a fallen member it walked this far away from (cm): the body stops lying there. 0 = never. | |
Get Up HP (GetUpHP) | int32 | 1 | Fallen Members | Get Up: HP they get up with (at least this many). | |
Get Up HPShare (GetUpHPShare) | float | 0.000000 | Fallen Members | Get Up: share of their max HP they get up with (the larger of the two counts; 0 = only Get Up HP). | |
Help Up HP (HelpUpHP) | int32 | 1 | Fallen Members | ||
Base Pins (BasePins) | int32 | 2 | Locks | Minigame: pins for a lock of difficulty 0; one more pin per Difficulty Per Pin (at most Max Pins). | |
Difficulty Per Pin (DifficultyPerPin) | float | 15.000000 | Locks | ||
Lockpick Mode (LockpickMode) | ERSELockpickMode | Minigame | Locks | Picking a lock by hand: the small game, or a chance from the best member's score. | |
Max Pins (MaxPins) | int32 | 5 | Locks | ||
Max Sweet Spot (MaxSweetSpot) | float | 0.400000 | Locks | ||
Min Sweet Spot (MinSweetSpot) | float | 0.070000 | Locks | Minigame: narrowest and widest sweet spot. | |
Misses Allowed (MissesAllowed) | int32 | 2 | Locks | Minigame: misses allowed before the attempt fails (a failure breaks a pick if the lock says so). | |
Sweep Seconds (SweepSeconds) | float | 1.400000 | Locks | Minigame: seconds for the marker to cross the bar once (it goes back and forth). | |
Sweet Spot Per Point (SweetSpotPerPoint) | float | 0.006000 | Locks | Minigame: sweet spot width gained per point of score above the difficulty (lost below). | |
Sweet Spot Width (SweetSpotWidth) | float | 0.180000 | Locks | Minigame: width of the sweet spot (share of the bar) when the member's score equals the difficulty. | |
Visible Members Perceive (bVisibleMembersPerceive) | bool | True | Perception | The visible party members check too (off = only the leader looks). | |
Perception Interval (PerceptionInterval) | float | 0.300000 | Perception | Seconds between the passive perception checks while exploring (a timer, no Tick). | |
Perception Radius (PerceptionRadius) | float | 600.000000 | Perception | A member notices hidden traps within this distance of itself (cm). | |
Search Bonus (SearchBonus) | float | 15.000000 | Perception | The delegated command "Search here" adds this to the searcher's perception around the point. | |
Search Radius (SearchRadius) | float | 800.000000 | Perception | ... within this distance of the searched point (cm). | |
Search Seconds (SearchSeconds) | float | 20.000000 | Perception | ... for this many seconds after the search. | |
Sneak Perception Bonus (SneakPerceptionBonus) | float | 5.000000 | Perception | Sneaking members pay more attention: this is added to their perception. | |
Chance at Equal Score (ChanceAtEqualScore) | float | 0.600000 | Skills | Chance of an attempt whose score equals the difficulty (disarming, auto lockpicking, stealing). | |
Chance Per Point (ChancePerPoint) | float | 0.030000 | Skills | Chance gained per point of score above the difficulty (lost per point below). | |
Disarm (Disarm) | FRSEExploreSkillRule | (StatWeights=(((TagName="Stat.Accuracy"), 0.250000),((TagName="Stat.Speed"), 0.250000)),PerLevel=1.000000,TagBonuses=(((TagName="Class.Archer"), 4.000000),((Tag... | Skills | Disarming traps. | |
Lockpick (Lockpick) | FRSEExploreSkillRule | (StatWeights=(((TagName="Stat.Accuracy"), 0.200000),((TagName="Stat.Speed"), 0.300000)),PerLevel=1.000000,TagBonuses=(((TagName="Class.Archer"), 3.000000),((Tag... | Skills | Picking locks. | |
Max Chance (MaxChance) | float | 0.950000 | Skills | Highest chance of any attempt (1 = a master never fails). | |
Min Chance (MinChance) | float | 0.050000 | Skills | Lowest chance of any attempt the member may make. | |
Perception (Perception) | FRSEExploreSkillRule | (StatWeights=(((TagName="Stat.Accuracy"), 0.300000),((TagName="Stat.Speed"), 0.200000)),PerLevel=1.000000,TagBonuses=(((TagName="Class.Archer"), 6.000000),((Tag... | Skills | Spotting hidden traps. | |
Pickpocket (Pickpocket) | FRSEExploreSkillRule | (StatWeights=(((TagName="Stat.Speed"), 0.400000),((TagName="Stat.Evasion"), 0.200000)),PerLevel=1.000000,TagBonuses=(((TagName="Class.Archer"), 2.000000),((TagN... | Skills | Stealing from NPCs. | |
Attempts Per NPC (AttemptsPerNPC) | int32 | 3 | Stealing | Attempts on the same NPC allowed per game day after a failure that was not noticed (0 = no limit). | |
Behind Angle (BehindAngle) | float | 110.000000 | Stealing | The thief must be behind the NPC: the angle between the NPC's facing and the direction to the thief is at least this. | |
Steal Requires Sneaking (bStealRequiresSneaking) | bool | True | Stealing | The thief must be sneaking. | |
Busy Activities (BusyActivities) | FGameplayTagContainer | (GameplayTags=((TagName="NPC.Activity.Work"),(TagName="NPC.Activity.Chat"),(TagName="NPC.Activity.Eat"))) | Stealing | Activities during which an NPC counts as busy (NPC.Activity.*). | |
Busy Bonus (BusyBonus) | float | 5.000000 | Stealing | Score bonus when the NPC is busy (working, talking with someone else: an activity in Busy Activities). | |
Caught on Failure (CaughtOnFailure) | float | 0.700000 | Stealing | Chance that a failed attempt is noticed (0 = a failure is only a failure). | |
Steal Reach (StealReach) | float | 180.000000 | Stealing | Farthest a thief may stand from the NPC (cm). | |
Found Traps Spare Party in Battle (bFoundTrapsSparePartyInBattle) | bool | True | Traps | In Free Tactics, traps the party has found go off only for the enemies (the party steps around them). | |
Traps Can KO (bTrapsCanKO) | bool | False | Traps | Traps can knock party members out in exploration (off = they leave at least 1 HP). | |
Traps in Free Tactics (bTrapsInFreeTactics) | bool | True | Traps | Traps that were not found yet also go off in Free Tactics battles on the live map. |
RPG Saga Engine: Exploration RPG (Presentation)
Class URSEExploreRPGUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of the exploration RPG actions (D-109): how traps, locks, stealing, distractions and fallen members look and what the notifications say.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Aim Hint (AimHint) | FText | NSLOCTEXT("RSEExploreRPG", "AimHint", "Aim with the camera, release to throw.") | Distractions | Hint while aiming. | |
Aim Marker Material (AimMarkerMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Explore/M_RSE_ExploreMarker.M_RSE_ExploreMarker | Distractions | ||
Aim Marker Mesh (AimMarkerMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Distractions | Mesh of the landing marker while aiming. Empty = /Engine basic cylinder, flattened. | |
Toggle Aim (bToggleAim) | bool | False | Distractions | Press the Distract action once to aim and again to throw (off = hold to aim, release to throw). | |
Investigate Mark (InvestigateMark) | FText | NSLOCTEXT("RSEExploreRPG", "InvestigateMark", "?") | Distractions | Over an enemy that comes to look. | |
Nothing to Throw Text (NothingToThrowText) | FText | NSLOCTEXT("RSEExploreRPG", "NothingToThrow", "Nothing to throw.") | Distractions | "Nothing to throw." (Throw Item missing). | |
Throw Arc Height (ThrowArcHeight) | float | 250.000000 | Distractions | Height of the arc (cm). | |
Throw Flight Seconds (ThrowFlightSeconds) | float | 0.700000 | Distractions | Seconds the throw flies. | |
Thrown Mesh (ThrownMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Sphere.Sphere | Distractions | The thrown thing (a small stone). Empty = /Engine basic sphere. | |
Thrown Scale (ThrownScale) | float | 0.120000 | Distractions | ||
Carried Text (CarriedText) | FText | NSLOCTEXT("RSEExploreRPG", "Carried", "The party carries {Name}.") | Fallen Members | "The party carries {Name}." | |
Got Up Text (GotUpText) | FText | NSLOCTEXT("RSEExploreRPG", "GotUp", "{Name} is back on their feet.") | Fallen Members | "{Name} is back on their feet." | |
Needs Revive Text (NeedsReviveText) | FText | NSLOCTEXT("RSEExploreRPG", "NeedsRevive", "{Name} needs a revive item or spell.") | Fallen Members | "{Name} needs a revive item or spell." | |
Revive Prompt (RevivePrompt) | FText | NSLOCTEXT("RSEExploreRPG", "RevivePrompt", "Revive {Name}") | Fallen Members | Prompt at a fallen member: "Revive {Name}". | |
Key Used Text (KeyUsedText) | FText | NSLOCTEXT("RSEExploreRPG", "KeyUsed", "Opened with the {Key}.") | Locks | "Opened with the {Key}." | |
Lockable Placeholder Mesh (LockablePlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Locks | Body and lid of a lockable without meshes of its own (a box). Empty = /Engine basic cube. | |
Locked Text (LockedText) | FText | NSLOCTEXT("RSEExploreRPG", "Locked", "It\'s locked.") | Locks | "It's locked." (nobody may pick it, no key). | |
Lockpick Help (LockpickHelp) | FText | NSLOCTEXT("RSEExploreRPG", "LockpickHelp", "Press Confirm (or click) while the marker is in the green spot to set each pin. Back gives up.") | Locks | Line under the bar: how to play. | |
Lockpick Title (LockpickTitle) | FText | NSLOCTEXT("RSEExploreRPG", "LockpickTitle", "Locked") | Locks | Title of the lockpick screen when the lock has no Display Name. | |
Lockpick Widget Class (LockpickWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Locks | Lockpick screen (D-052). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSELockpickViewModel (docs/product/custom-ui.md). | |
Lockpick ZOrder (LockpickZOrder) | int32 | 55 | Locks | ||
Open Seconds (OpenSeconds) | float | 0.600000 | Locks | Seconds the lid / door takes to open. | |
Pick Broke Text (PickBrokeText) | FText | NSLOCTEXT("RSEExploreRPG", "PickBroke", "The {Item} broke.") | Locks | "The {Item} broke." | |
Picked Text (PickedText) | FText | NSLOCTEXT("RSEExploreRPG", "Picked", "{Member} picked the lock.") | Locks | "{Member} picked the lock." | |
Pick Failed Text (PickFailedText) | FText | NSLOCTEXT("RSEExploreRPG", "PickFailed", "{Member} could not pick the lock.") | Locks | "{Member} could not pick the lock." | |
Unlock Prompt (UnlockPrompt) | FText | NSLOCTEXT("RSEExploreRPG", "UnlockPrompt", "Unlock") | Locks | Prompt on a locked door or chest: "Unlock". | |
Caught Text (CaughtText) | FText | NSLOCTEXT("RSEExploreRPG", "Caught", "{Name}: Thief!") | Stealing | "{Name}: Thief!" | |
Nothing Left Text (NothingLeftText) | FText | NSLOCTEXT("RSEExploreRPG", "NothingLeft", "Nothing left to take.") | Stealing | "Nothing left to take." | |
Steal Failed Text (StealFailedText) | FText | NSLOCTEXT("RSEExploreRPG", "StealFailed", "Not this time... nobody noticed.") | Stealing | "Not this time..." (nobody noticed). | |
Steal Prompt (StealPrompt) | FText | NSLOCTEXT("RSEExploreRPG", "StealPrompt", "Steal") | Stealing | Prompt behind an NPC while sneaking: "Steal". | |
Stolen Money Text (StolenMoneyText) | FText | NSLOCTEXT("RSEExploreRPG", "StolenMoney", "{Member} lifted {Money} coins.") | Stealing | "{Member} lifted {Money} coins." | |
Stolen Text (StolenText) | FText | NSLOCTEXT("RSEExploreRPG", "Stolen", "{Member} lifted {Item}.") | Stealing | "{Member} lifted {Item}." | |
Default Trap Mesh (DefaultTrapMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Traps | Mesh of traps without one (a flat plate). Empty = /Engine basic cylinder. | |
Disarmed Text (DisarmedText) | FText | NSLOCTEXT("RSEExploreRPG", "Disarmed", "{Member} disarmed the {Trap}.") | Traps | "{Member} disarmed the {Trap}." | |
Disarm Failed Text (DisarmFailedText) | FText | NSLOCTEXT("RSEExploreRPG", "DisarmFailed", "{Member} could not disarm the {Trap}.") | Traps | "{Member} could not disarm it." (the trap did not go off). | |
Disarm Prompt (DisarmPrompt) | FText | NSLOCTEXT("RSEExploreRPG", "DisarmPrompt", "Disarm {Trap}") | Traps | Prompt on a spotted trap: "Disarm {Trap}". | |
Spotted Text (SpottedText) | FText | NSLOCTEXT("RSEExploreRPG", "Spotted", "{Member} spotted a trap: {Trap}.") | Traps | "{Member} spotted a {Trap}." | |
Sprung Mesh Seconds (SprungMeshSeconds) | float | 0.000000 | Traps | Seconds a trap's mesh shows after it went off unseen (0 = it stays). | |
Trap Damage Text (TrapDamageText) | FText | NSLOCTEXT("RSEExploreRPG", "TrapDamage", "{Member} takes {Damage} damage.") | Traps | "{Member} takes {Damage} damage." | |
Trap Marker Color (TrapMarkerColor) | FLinearColor | (R=1.000000,G=0.250000,B=0.150000,A=1.000000) | Traps | ||
Trap Marker Material (TrapMarkerMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Explore/M_RSE_ExploreMarker.M_RSE_ExploreMarker | Traps | Material of the marker (a bright translucent red works best). Empty = the mesh's own. | |
Trap Marker Mesh (TrapMarkerMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Traps | The marker over a spotted trap (a ring on the ground). Empty = /Engine basic cylinder, flattened. | |
Trap Marker Text (TrapMarkerText) | FText | NSLOCTEXT("RSEExploreRPG", "TrapMarker", "!") | Traps | Text floating over a spotted trap. | |
Trap Meshes (TrapMeshes) | TMap<FGameplayTag,TSoftObjectPtr<UStaticMesh> > | (0 entries) | Traps | Mesh of a trap by its Kind (Trap.PressurePlate -> a flat plate). A trap actor's own mesh wins. Missing = Default Trap Mesh. | |
Triggered Text (TriggeredText) | FText | NSLOCTEXT("RSEExploreRPG", "Triggered", "{Trap}!") | Traps | "{Trap}!" when a trap goes off and the trap has no text of its own. |
RPG Saga Engine: Features
Class URSEFeatureSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Feature toggles (D-165).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Action Combat (bActionCombat) | bool | True | Battle | Real-time action battles (D-171). Off: action encounters refuse to start. | |
Grid Tactics (bGridTactics) | bool | True | Battle | Tactics battles on a tile grid. Off: grid encounters refuse to start. | |
Live Tactics (bLiveTactics) | bool | True | Battle | Free (live) Tactics on the live map. Off: its subsystem is not created and its encounters refuse to start. | |
ATB / Turn-Based (bTurnBased) | bool | True | Battle | Classic battles on a stage (ATB, turn-based, CTB). Off: classic encounters refuse to start and the ATB options row is hidden. | |
Economy (bEconomy) | bool | True | Characters and Items | Currency, shops, inns and the economy screens. | |
Growth / Progression (bGrowth) | bool | True | Characters and Items | Progression systems (points, the Growth Board) and the Growth page. | |
Inventory (bInventory) | bool | True | Characters and Items | Inventory rules, the Items and Equipment pages and the inventory options. | |
Adaptive Difficulty (bAdaptiveDifficulty) | bool | True | Extras | The adaptive AI parameter that follows the player's results. Off: the AI keeps the fixed intelligence of its profile. | |
Bestiary (bBestiary) | bool | True | Extras | The bestiary (entries, the Bestiary page, the enemy HP option). | |
Cards (bCards) | bool | True | Extras | The card minigame. | |
Tutorials (bTutorials) | bool | True | Extras | Contextual tutorials, the Help page and the tutorials option. | |
Online and Co-op (bOnline) | bool | True | Online | Online sessions, lobbies and the co-op transport. Off: the online subsystems are not created. | |
Dialog (bDialog) | bool | True | Story | Dialog runner and dialog screens. Off: dialogs do not run; quest givers cannot talk. | |
Quests (bQuests) | bool | True | Story | Quests, the quest tracker and the Journal page. | |
Story Scenes (bScenes) | bool | True | Story | Story scenes (Level Sequences played by the story). | |
Living NPCs (bLivingNPCs) | bool | True | World | Living NPCs: routines, barks and their world subsystems. | |
Map and Minimap (bMapMinimap) | bool | True | World | Area maps, the minimap and the compass, the Map page and their options. | |
Puzzles (bPuzzles) | bool | True | World | Puzzles (state and screens). | |
Stealth (bStealth) | bool | True | World | Stealth detection and ambushes. | |
Time and Weather (bTimeWeather) | bool | True | World | Time of day and weather, the clock HUD and the night lights. |
RPG Saga Engine: Free Tactics
Class URSEFreeTacticsSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Free Tactics (D-091, docs/design/free-tactics.md): turn-based battles with free movement in meters on the live map.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
AICandidate Positions (AICandidatePositions) | int32 | 40 | AI | Candidate positions the AI samples in its reachable area per decision (plus rings around the targets). | |
AICover Weight (AICoverWeight) | float | 4.000000 | AI | Value of ending in partial cover from the enemies (full cover counts double), times the profile's danger awareness. | |
AICrowding Weight (AICrowdingWeight) | float | 6.000000 | AI | D-127: value lost per meter a position cuts into an ally's personal space (0 = units may stand shoulder to shoulder). | |
AIHeight Weight (AIHeightWeight) | float | 2.000000 | AI | Value per meter of height above the nearest enemy (capped at the height damage bonus), times danger awareness. | |
AIJump Min Saving (AIJumpMinSaving) | float | 2.000000 | AI | D-121: a jump to a place walking also reaches is considered only when it saves at least this much movement (meters). | |
AIJump Samples (AIJumpSamples) | int32 | 24 | AI | D-121: points the AI tries for a jump (Free Tactics Field -> Jumping) on three rings up to its jump reach. A jump is considered where walking does not go or costs more (see AI Jump Min Saving). 0 = the AI never jumps. | |
AIMin Move Distance (AIMinMoveDistance) | float | 0.500000 | AI | The AI does not consider moves shorter than this (meters). | |
AIOpportunity Risk Weight (AIOpportunityRiskWeight) | float | 1.000000 | AI | D-127: positions weigh the opportunity attacks walking there would provoke: their expected damage times this, the profile's danger weight (at least a quarter) and its danger awareness. 0 = the AI walks out of reach regardless. | |
AIOverwatch Risk Weight (AIOverwatchRiskWeight) | float | 1.000000 | AI | D-146: positions weigh the enemy Overwatch reactions walking there would provoke (expected damage times this, the profile's danger weight, at least a quarter, and its danger awareness). 0 = the AI ignores enemy watches. | |
AIOverwatch Weight (AIOverwatchWeight) | float | 1.000000 | AI | D-146: value of going on Overwatch for an AI unit, per point of the damage its watch reaction is expected to do, times the profile's damage weight. Only offered when it is sensible: the unit has nothing to attack from where it stands or could walk to this turn, and an enemy could step into its watch next turn (a ranged unit without a good target, a guard at a choke). 0 = the AI never uses Overwatch. | |
AIPersonal Space (AIPersonalSpace) | float | 1.000000 | AI | D-127: room the AI keeps between a unit and its allies (meters, edge to edge), plus Personal Space Per Radius times the two units' radii together (big units keep more room). Positions inside it lose AI Crowding Weight per meter. | |
AIPersonal Space Per Radius (AIPersonalSpacePerRadius) | float | 0.500000 | AI | D-127: extra personal space per meter of the two units' radii together. | |
AIReposition Min Distance (AIRepositionMinDistance) | float | 1.500000 | AI | D-156: after acting, the movement left is used only for a reposition at least this far (meters): into cover, out of reach. | |
AIReposition Min Gain (AIRepositionMinGain) | float | 2.000000 | AI | D-156: ...and only when it is worth at least this much more than staying (the AI's position score: cover, danger, distance). | |
AIRing Samples Per Target (AIRingSamplesPerTarget) | int32 | 8 | AI | Points sampled on the ring around each potential target at the unit's best attack range. | |
AISingle Move (bAISingleMove) | bool | True | AI | D-156: an AI unit walks once, in one continuous move, to the spot it chose with its follow-up in mind (spacing, cover, Overwatch, the reach of its abilities): after a walk that arrived it acts or ends its turn, never takes a small corrective step. A walk stopped short (an Overwatch, a slip, a trap) is planned again. Off = every step weighs moving again (before D-156). | |
Back Arc (BackArc) | float | 90.000000 | Combat | Attacks from within this arc behind the target hit its back (full angle, degrees). | |
Areas Include Unit Radius (bAreasIncludeUnitRadius) | bool | True | Combat | Area abilities also catch units whose footprint only overlaps the area (off = the unit's center must be inside). | |
Front Arc (FrontArc) | float | 120.000000 | Combat | Attacks from within this arc around the target's facing are frontal (full angle, degrees). Side and back multipliers are in Battle. | |
Height Advantage Threshold (HeightAdvantageThreshold) | float | 0.500000 | Combat | Height advantage below this difference does not count (uneven ground). | |
Height Damage Max (HeightDamageMax) | float | 1.300000 | Combat | ||
Height Damage Min (HeightDamageMin) | float | 0.700000 | Combat | ||
Height Damage Per Meter (HeightDamagePerMeter) | float | 0.100000 | Combat | Damage change per meter the attacker stands above (+) or below (-) the target. | |
Height Hit Bonus Max (HeightHitBonusMax) | float | 15.000000 | Combat | ||
Height Hit Bonus Per Meter (HeightHitBonusPerMeter) | float | 5.000000 | Combat | Hit chance change (percent points) per meter of height advantage. | |
Cover Distance (CoverDistance) | float | 1.500000 | Cover | Partial cover counts only for blockers this close to the target (a low wall far away does not protect it). | |
Cover Provider (CoverProvider) | TSoftClassPtr<URSECoverProvider> | None | Cover | Decides the cover a blocker gives and whether it blocks sight. Empty = the built-in rules below (the blocker's own cover, else its height). A project (or the asset combat roles) may plug in its own class. | |
Full Cover Min Height (FullCoverMinHeight) | float | 1.500000 | Cover | Built-in rule: a blocker at least this high above the ground blocks sight (full cover). | |
Partial Cover Damage Multiplier (PartialCoverDamageMultiplier) | float | 1.000000 | Cover | Damage multiplier against a target in partial cover. | |
Partial Cover Hit Penalty (PartialCoverHitPenalty) | float | 20.000000 | Cover | Hit chance lost (percent points) against a target in partial cover. | |
Partial Cover Min Height (PartialCoverMinHeight) | float | 0.800000 | Cover | Built-in rule: a blocker at least this high (and below full) gives partial cover. Lower obstacles give none. | |
AIDoor Open Value (AIDoorOpenValue) | float | 6.000000 | Doors | The AI opens a closed door in reach when that opens a way to its enemies; this is the option's value. 0 = never. | |
Doors in Battle (bDoorsInBattle) | bool | True | Doors | Units can open and close doors during a battle (a door command). Off = doors stay as the battle found them. | |
Door Action Cost (DoorActionCost) | ERSEFreeActionCost | BonusAction | Doors | Separate budgets: what opening or closing a door costs (an action, a bonus action or nothing). | |
Door Action Point Cost (DoorActionPointCost) | int32 | 1 | Doors | Shared budget: Action Points a door costs. | |
Door Reach (DoorReach) | float | 1.000000 | Doors | A unit reaches a door this close (meters, from its edge to the nearest part of the doorway). | |
Fleeing (bFleeing) | bool | True | Fleeing | The party's units can run away with the Flee command (the encounter's Can Flee must allow it too). A unit that flees leaves the battle; when every standing party member got away, the battle ends as an escape. Off = no running away from Free Tactics battles. | |
Flee Provokes Opportunity Attacks (bFleeProvokesOpportunityAttacks) | bool | True | Fleeing | The Flee command's own walk provokes opportunity attacks like any move (off = fleeing disengages safely). | |
Escape Hidden Radius (EscapeHiddenRadius) | float | 3.000000 | Fleeing | An enemy that cannot see the unit (walls, full cover) stops it from fleeing only this close (meters, edge to edge). | |
Escape Radius (EscapeRadius) | float | 8.000000 | Fleeing | Flee needs this much room (meters, edge to edge): no enemy that sees the unit may stand closer. The unit can walk out first (a Move, or the Flee command's own walk), and a unit engaged in melee is always inside it. | |
Escape Rounds (EscapeRounds) | int32 | 0 | Fleeing | Rounds a fleeing unit must then stay out of every enemy's Escape Radius before it leaves (checked at the start of each round; an enemy coming close starts the count again, an action cancels the escape). 0 = it leaves at once. | |
Pursuit Leash Radius (PursuitLeashRadius) | float | 20.000000 | Fleeing | Pursuit limit of the AI: an enemy never moves farther than this from where it entered the battle (it may still walk back), so it gives up the chase of a party that runs. 0 = no limit. The party's own units are never limited. | |
Join at Next Round (bJoinAtNextRound) | bool | True | Joining | Enemies who notice the battle while it runs join at the start of the next round (off = at once, at the next turn). | |
Call for Help Radius (CallForHelpRadius) | float | 12.000000 | Joining | Enemies within this distance of those who noticed the party are called in: they join the battle from the start ("call for help"). The others keep patrolling. 0 = only the group that noticed the party. | |
Party Join Radius (PartyJoinRadius) | float | 20.000000 | Joining | Party members within this distance of the leader enter the battle from where they stand; the others stay out of it. | |
Any Angle Paths (bAnyAnglePaths) | bool | True | Navigation | Any-angle paths (straight lines across open ground) instead of 8-direction steps. Off = classic grid A*. | |
Climb Cost Per Meter (ClimbCostPerMeter) | float | 1.000000 | Navigation | Extra movement cost per meter climbed (1 = climbing one meter costs as much as walking one more meter). | |
Layer Snap Tolerance (LayerSnapTolerance) | float | 1.000000 | Navigation | Several floors (D-110): a point belongs to the highest floor at most this far above its height. Keep it above the step height and below the height between two floors. | |
Max Search Cells (MaxSearchCells) | int32 | 200000 | Navigation | Search guard: most cells a path or reach search may expand (0 = no limit). | |
Max Step Down (MaxStepDown) | float | 1.000000 | Navigation | Deepest drop a unit walks down between two neighbouring cells. | |
Max Step Up (MaxStepUp) | float | 0.500000 | Navigation | Highest step a unit walks up between two neighbouring cells (stairs, curbs). | |
Snapshot Cell Size (SnapshotCellSize) | float | 0.250000 | Navigation | Cell size of the navigation snapshot captured from the battle area. Smaller = finer paths, more memory and time. | |
Surprise Opener Acts First (bSurpriseOpenerActsFirst) | bool | True | Openings | Individual order: the side that opens with a surprise starts with full Charge Time, so it acts first (fastest first). | |
Surprise Rounds (bSurpriseRounds) | bool | True | Openings | Surprise rounds: when one side attacks the other unseen (the party sneaks up, or an ambush), the surprised units lose their first turn. Off = every battle opens normally. | |
Surprise Bonus Side (SurpriseBonusSide) | ERSESurpriseBonusSide | Party | Openings | D-151: which side's surprise earns the opener's bonus below (its first turn in round 1). | |
Surprise Opener Bonus Actions (SurpriseOpenerBonusActions) | int32 | 0 | Openings | D-151: extra actions of each opener unit in its first turn (Separate Budgets). | |
Surprise Opener Bonus AP (SurpriseOpenerBonusAP) | int32 | 1 | Openings | D-151: extra Action Points of each opener unit in its first turn (the shared budget; in Separate Budgets they add movement). | |
Surprise Opener Bonus Movement (SurpriseOpenerBonusMovement) | float | 0.000000 | Openings | D-151: extra movement of each opener unit in its first turn (meters). | |
Built in Opportunity Attack (bBuiltInOpportunityAttack) | bool | True | Opportunity Attacks | Units without their own Left Melee Range reaction still strike with their basic attack. | |
Opportunity Attacks (bOpportunityAttacks) | bool | False | Opportunity Attacks | Leaving an enemy's melee reach triggers its opportunity attack reactions (Left Melee Range). D-146: off by default in the live mode; reactions then come only from Overwatch abilities (an ability's Free Tactics Rules -> Overwatch). On = the D-091 / D-127 rule (every setting below). | |
Built in Opportunity Rule (BuiltInOpportunityRule) | ERSEBuiltInOpportunityRule | MeleeFighters | Opportunity Attacks | D-127: who gets the built-in opportunity attack. The traits Trait.Reaction.OpportunityAttack and Trait.Reaction.NoOpportunityAttack (class, character, equipment or status) decide for their unit whatever this says. | |
Max Opportunity Attacks Per Move (MaxOpportunityAttacksPerMove) | int32 | 1 | Opportunity Attacks | D-127: one move provokes at most this many opportunity attacks (the nearest units first), so walking past a group costs one strike, not one per enemy. 0 = every unit left behind strikes. | |
Melee Reach Max (MeleeReachMax) | float | 2.000000 | Opportunity Attacks | An ability reaching at most this far (meters, edge to edge) is a melee ability: its range is the unit's melee reach. | |
Opportunity Attacks Per Turn (OpportunityAttacksPerTurn) | int32 | 1 | Opportunity Attacks | Built-in opportunity attacks per unit between two of its own turns (0 = unlimited). | |
Opportunity Power Multiplier (OpportunityPowerMultiplier) | float | 1.000000 | Opportunity Attacks | Power multiplier of the built-in opportunity attack. | |
Aim Height (AimHeight) | float | 1.000000 | Space | Height above a target's ground that attacks aim at (its chest): where line of sight ends. | |
Default Unit Radius (DefaultUnitRadius) | float | 0.400000 | Space | Footprint radius of a unit whose spawn does not set one. | |
Destination Max Shift (DestinationMaxShift) | float | 0.750000 | Space | D-127: farthest a move order's point is shifted to keep Destination Min Gap (meters). | |
Destination Min Gap (DestinationMinGap) | float | 0.400000 | Space | D-127: a move order keeps this much room (meters, edge to edge) from the other units: a point picked right next to an ally moves the least it needs to (at most Destination Max Shift). 0 = the exact point. | |
Eye Height (EyeHeight) | float | 1.500000 | Space | Height of a unit's eyes above its ground: where line of sight starts. | |
Max Start Nudge (MaxStartNudge) | float | 1.500000 | Space | D-115: a unit that starts a battle where it cannot stand (touching another unit, its footprint against a wall) is moved to the nearest free spot within this distance; farther than that it stays where it is. Battles on the live map start in place: nobody is pulled somewhere else (the presentation slides the few centimeters, it never teleports). 0 = never moved. | |
Meters Per Tile (MetersPerTile) | float | 1.500000 | Space | Meters per grid tile: converts Tactics rules (ranges, areas) and tile positions (encounters, simulator) to meters. | |
Start Min Gap (StartMinGap) | float | 0.300000 | Space | D-127: units that start a battle closer than this to another unit (meters, edge to edge) slide apart to the nearest spot that keeps it, within Max Start Nudge (a short slide, never a teleport). 0 = they start exactly where they stand. | |
Unit Height (UnitHeight) | float | 1.800000 | Space | How tall a unit is (D-110): units whose feet are this far apart in height stand on different floors and do not block each other, a door or an opportunity attack does not reach across floors. | |
AISummon Placement Samples (AISummonPlacementSamples) | int32 | 24 | Summons | Points the AI tries around itself when it places a summon (rings toward the enemy; the valid one nearest the enemy wins). | |
Summon Placement Needs Sight (bSummonPlacementNeedsSight) | bool | True | Summons | The summoner must see the point (from its eyes to the summon's chest). | |
Summons at Chosen Point (bSummonsAtChosenPoint) | bool | True | Summons | Summons (a Pact's creature, Summon Units) are placed at a point the summoner picks on the ground, within Summon Placement Range. Off = next to the summoner, as on the grid. | |
Default Summon Radius (DefaultSummonRadius) | float | 0.000000 | Summons | A summoned unit's footprint radius when its Pact or effect sets none (0 = Default Unit Radius). | |
Summon Placement Range (SummonPlacementRange) | float | 6.000000 | Summons | How far from the summoner's edge the summon may appear (meters, to the summon's center). | |
Action Model (ActionModel) | ERSEFreeActionModel | SeparateBudgets | Turns | --- Turns --- | |
Actions Per Turn (ActionsPerTurn) | int32 | 1 | Turns | Separate budgets: actions per turn (abilities whose Action Cost is Action). | |
Items Use Bonus Action (bItemsUseBonusAction) | bool | True | Turns | Separate budgets: using a consumable costs a bonus action instead of an action. | |
Bonus Actions Per Turn (BonusActionsPerTurn) | int32 | 1 | Turns | Separate budgets: bonus actions per turn (abilities whose Action Cost is Bonus Action). | |
Derived Bonus Action Max Cost (DerivedBonusActionMaxCost) | int32 | 0 | Turns | Separate budgets, abilities without their own Free Tactics rules: those whose Tactics Action Point cost is at most this become bonus actions (-1 = none; 0 = only free abilities). Consumables follow Items Use Bonus Action. | |
Meters Per AP (MetersPerAP) | float | 1.500000 | Turns | Meters of movement per Action Point (shared budget), and per point of the Action Points stat (separate budgets, From Action Points). | |
Movement Meters (MovementMeters) | float | 9.000000 | Turns | Separate budgets, Fixed: movement allowance per turn. | |
Movement Source (MovementSource) | ERSEFreeMovementSource | Fixed | Turns | Separate budgets: where the movement allowance comes from. | |
Team Order (TeamOrder) | ERSEFreeTeamOrder | PlayerFirst | Turns | ||
Turn Order (TurnOrder) | ERSEFreeTurnOrder | IndividualCT | Turns | ||
Turn Share Action (TurnShareAction) | float | 0.600000 | Turns | Separate budgets: share of the turn (for the Charge Time spent at its end) that using the action, a bonus action and the whole movement stand for. The Charge Time spent follows Battle -> Turn CT Cost (nothing used .. everything used). | |
Turn Share Bonus Action (TurnShareBonusAction) | float | 0.200000 | Turns | ||
Turn Share Movement (TurnShareMovement) | float | 0.200000 | Turns |
RPG Saga Engine: Free Tactics (Co-op)
Class URSEFreeTacticsCoopSettings (module RSE), Project Settings, Project, RPG Saga Engine. Free Tactics in co-op (D-141, docs/design/networking.md §3.6, docs/product/coop.md): who commands which unit, how long a turn may wait for a player, how far players are pulled into a battle that starts away from them, and how guests present the host's battle.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Actor Binding Wait Seconds (ActorBindingWaitSeconds) | float | 1.000000 | Guests | A unit that joins on a guest's screen waits this long for the host's world actor to arrive (a reinforcement running in) before the guest shows a stand-in of its own. | |
Pull in Far Players (bPullInFarPlayers) | bool | True | Joining | Players whose explorer is farther than the party's join radius (Free Tactics -> Party Join Radius) when the battle starts are brought next to the leader (with a short fade on their screen) instead of staying out of it. | |
Reconnect Retakes Unit at Once (bReconnectRetakesUnitAtOnce) | bool | False | Joining | A player who reconnects during a battle gets their unit back at once (it was the AI's meanwhile). Off = they watch until the battle ends, then take a member (D-124 §6.3). | |
Pull in Fade Seconds (PullInFadeSeconds) | float | 0.350000 | Joining | The fade of a player brought into the battle (seconds, out then in). | |
Catch Up Backlog (CatchUpBacklog) | int32 | 24 | Pacing | A guest that falls this many events behind the host plays the backlog faster (Catch Up Playback Rate). | |
Catch Up Playback Rate (CatchUpPlaybackRate) | float | 2.000000 | Pacing | ||
Guest Playback Wait Max (GuestPlaybackWaitMax) | float | 4.000000 | Pacing | The host's battle goes on (the AI acts, the next turn starts) only once every guest has shown the events so far, or after this many seconds (a slow or stalled guest never holds the battle longer). 0 = never wait for guests. | |
Companion Units (CompanionUnits) | ERSEFreeCoopCompanionUnits | AI | Turns | Party units that no player plays (the companions): the AI, or the host. | |
Turn Timeout Action (TurnTimeoutAction) | ERSEFreeTurnTimeoutAction | HostTakesOver | Turns | ||
Turn Timeout Seconds (TurnTimeoutSeconds) | float | 45.000000 | Turns | Seconds a guest's turn waits for their command before Turn Timeout Action applies (0 = forever). Counted while the battle waits only for that player (not during animations). |
RPG Saga Engine: Free Tactics (Presentation)
Class URSEFreeTacticsPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How Free Tactics battles on the live map look and feel (D-097, docs/design/free-tactics.md): the seamless entry, the tactical camera, the ground overlay (movement area, ability areas, path), the pacing, and the exit.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Area Participant Margin (AreaParticipantMargin) | float | 8.000000 | Battle Area | ||
Area Size (AreaSize) | float | 44.000000 | Battle Area | Size of the area captured around the battle (meters, square): units cannot walk out of it; escapes happen inside it. | |
Grow Area to Participants (bGrowAreaToParticipants) | bool | True | Battle Area | D-113: the captured area grows past Area Size (up to Max Area Size) so that every unit of the battle stands inside it with Area Participant Margin to spare: nobody starts at, or is pulled in from, beyond the area's edge. Units never leave the area. | |
Hide World Labels (bHideWorldLabels) | bool | True | Battle Area | Hide the world labels (Text Render components) around the battle while it lasts: they face the exploration camera. | |
Max Area Size (MaxAreaSize) | float | 120.000000 | Battle Area | ||
Action Camera (ActionCamera) | ERSEFreeActionCamera | Off | Camera | D-113, the camera during actions. Off (default): the tactical camera stays, no close-up cuts. Subtle Reframe: it glides to keep the actor and the target on screen at the current zoom. Cinematic: the actions' camera shots (the classic modes' close shots stay available there whatever this says). | |
Action Camera Shake (bActionCameraShake) | bool | False | Camera | D-113: actions may shake the camera (hits, explosions). Off: the view never jolts (Cinematic shakes as its shots say). | |
Focus Actions (bFocusActions) | bool | True | Camera | Subtle Reframe and Cinematic: the camera glides to each action's target while it plays. | |
Focus Active Unit (bFocusActiveUnit) | bool | True | Camera | The camera glides to the unit whose turn starts. | |
Hide Occluders (bHideOccluders) | bool | True | Camera | Objects between the camera and the active unit or the cursor fade (opted-in materials) or hide (the rest): walls, trees, roofs. The camera never collides with them. How: Project Settings -> RPG Saga Engine -> Camera Occlusion (D-113). | |
Inherit Exploration Zoom (bInheritExplorationZoom) | bool | False | Camera | D-113: the battle camera starts from the exploration camera's angle and zoom (it is the same camera, taking over) and glides to its own angle; on: it also keeps the exploration zoom (clamped), instead of gliding to Camera Start Distance. | |
Keep Exploration Tilt (bKeepExplorationTilt) | bool | True | Camera | D-129: the battle camera keeps the tilt the player gave the exploration camera (degrees around Camera Pitch, within the exploration's tilt limits). Off: it glides to Camera Pitch. Inside interiors the interior's pitch wins. | |
Camera Field Of View (CameraFieldOfView) | float | 55.000000 | Camera | D-113: the camera's field of view (degrees; the exploration camera's tactical view uses 55). 0 = the exploration camera's. | |
Camera Focus Height (CameraFocusHeight) | float | 100.000000 | Camera | The camera orbits a point this high above the ground it looks at (a unit's chest): its probe never starts in the ground. | |
Camera Interp Speed (CameraInterpSpeed) | float | 6.000000 | Camera | How quickly the camera glides to its target (focus, yaw, zoom). | |
Camera Max Distance (CameraMaxDistance) | float | 4200.000000 | Camera | ||
Camera Min Distance (CameraMinDistance) | float | 900.000000 | Camera | ||
Camera Min Height Above Terrain (CameraMinHeightAboveTerrain) | float | 150.000000 | Camera | D-113: the camera never goes below the terrain (landscapes, Camera Occlusion -> Ground Tags); at least this high (cm). | |
Camera Motion Blur (CameraMotionBlur) | float | 0.000000 | Camera | D-113: motion blur of the battle camera (0 = none: it stays sharp while it glides; 1 = the engine's). | |
Camera Pan Speed (CameraPanSpeed) | float | 1400.000000 | Camera | Pan speed (cm/s at the start distance; faster zoomed out). | |
Camera Pawn Class (CameraPawnClass) | TSoftClassPtr<APawn> | None | Camera | Tactical camera pawn (a subclass of ARSEFreeTacticsCameraPawn). Empty = the built-in one. | |
Camera Pitch (CameraPitch) | float | 54.000000 | Camera | Downward angle of the camera (degrees below the horizon). | |
Camera Rotate Step (CameraRotateStep) | float | 45.000000 | Camera | Degrees per rotate press (keys, shoulder buttons). | |
Camera Start Distance (CameraStartDistance) | float | 2300.000000 | Camera | ||
Camera Zoom Step (CameraZoomStep) | float | 180.000000 | Camera | Distance change per zoom step. | |
Ability Effect Scale (AbilityEffectScale) | float | 1.600000 | Effects | D-120: multiplies the size of ability effects in Free Tactics (look timelines, projectiles, impacts, cast and status effects of the battle feel). The live battle camera sits farther than the Tactics one, so the packs' effects, made for close-ups, need to be bigger to read. | |
Seamless Camera Hand Off (bSeamlessCameraHandOff) | bool | True | Entry | D-127: the battle starts on exactly the picture the player saw: the view is frozen while control passes from the explorer to the battle camera, and the battle camera takes over from that very view (location, angle, field of view), so nothing jumps (before, the explorer's camera swung behind the leader for the length of the blend). Off = the D-113 hand-over. | |
Camera Blend Seconds (CameraBlendSeconds) | float | 0.900000 | Entry | Seconds the camera takes to move from the explorer to the tactical view. | |
Decal Warm Up Delay (DecalWarmUpDelay) | float | 1.000000 | Entry | D-127: seconds after the map starts before the warm-up (the player's camera exists by then). | |
Decal Warm Up Seconds (DecalWarmUpSeconds) | float | 0.500000 | Entry | D-127: seconds the battle's ground decal materials (the entry ring, the surfaces, the movement overlay) are drawn once, invisibly small, soon after a map starts. A decal material's first draw in a session fell back to the engine's default decal material for a frame (a pale wash over the whole battle area at the first battle start). 0 = off. | |
Enemy Surprise Text (EnemySurpriseText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "EnemySurprise", "Ambush!") | Entry | ||
Entry Slow Motion (EntrySlowMotion) | float | 0.250000 | Entry | Time runs this slow the moment a battle starts, then eases back to normal (a seamless "freeze"). 1 = no slow motion. | |
Entry Slow Motion Seconds (EntrySlowMotionSeconds) | float | 0.800000 | Entry | Real seconds the slow motion takes to ease back to normal. | |
Entry Sound (EntrySound) | TSoftObjectPtr<USoundBase> | None | Entry | Sound when a battle starts (optional). | |
Normal Opening Text (NormalOpeningText) | FText | Entry | Banner of each opening (empty = none): "Ambush!", "Surprise attack!". {Name} = the encounter's name. | ||
Player Surprise Text (PlayerSurpriseText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "PlayerSurprise", "Surprise attack!") | Entry | ||
Unit Look Wait Seconds (UnitLookWaitSeconds) | float | 5.000000 | Entry | D-141 addendum: when the battle starts, the looks of its units that are still loading (stand-ins spawned for enemies without a world actor, a pawn whose look is not in yet) load ahead of everything else, and the first turn waits for them up to this many real seconds (under the entry), so no unit fights as a placeholder. A look that takes longer still shows the moment it is in. 0 = no wait (the looks still load first). | |
Corpse Mode (CorpseMode) | ERSEFreeCorpseMode | Fade | Exit | ||
Corpse Seconds (CorpseSeconds) | float | 12.000000 | Exit | Fade: seconds before fallen enemies disappear. | |
Escape Text (EscapeText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "Escaped", "You got away.") | Exit | Banner after an escape (empty = none). | |
Result Banner Seconds (ResultBannerSeconds) | float | 3.000000 | Exit | Seconds the victory banner stays. | |
Results Mode (ResultsMode) | ERSEFreeResultsMode | Feed | Exit | How a victory shows (D-128: the reward feed by default; Project Settings -> Reward Feed). | |
Area Color (AreaColor) | FRSEUIColor | (Token="Negative",Alpha=0.450000,Lightness=-0.007488,Chroma=1.143559,Hue=21.617987,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay | Where an ability would hit (friendly abilities use Area Support Color). | |
Area Support Color (AreaSupportColor) | FRSEUIColor | (Token="Positive",Alpha=0.450000,Lightness=-0.005095,Chroma=1.046268,Hue=2.276912,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay | ||
Move Edge Color (MoveEdgeColor) | FRSEUIColor | (Token="Info",Alpha=0.850000,Lightness=0.031412,Chroma=1.025162,Hue=-12.566440,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay | Edge of the movement area. | |
Move Fill Color (MoveFillColor) | FRSEUIColor | (Token="Info",Alpha=0.180000,Lightness=-0.056104,Chroma=1.581283,Hue=-1.063226,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay | Filled and Cells styles: inside of the movement area. | |
Overlay Cell Size (OverlayCellSize) | float | 0.500000 | Ground Overlay | Cell size of the overlay (meters): a multiple of Free Tactics -> Snapshot Cell Size; smaller = smoother edges, more upload. | |
Overlay Edge Boost (OverlayEdgeBoost) | float | 2.500000 | Ground Overlay | Filled style: opacity multiplier of the range and area outlines (the movement edge has its own color). | |
Overlay Edge Width (OverlayEdgeWidth) | float | 0.120000 | Ground Overlay | Filled style: width of the outline inside each area (0 = no outline; the mask goes from 0.5 at the edge to 1 inside). | |
Overlay Glow (OverlayGlow) | float | 1.200000 | Ground Overlay | Emissive strength of the overlay (reads in shadow). | |
Overlay Height Tolerance (OverlayHeightTolerance) | float | 35.000000 | Ground Overlay | Ground more than this above or below a cell is not painted (walls, props). | |
Overlay Material (OverlayMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Battle/M_RSE_FreeOverlay.M_RSE_FreeOverlay | Ground Overlay | Deferred decal material of the ground overlay; it must match Overlay Style (see there). | |
Overlay Smoothing (OverlaySmoothing) | int32 | 2 | Ground Overlay | Subtle and Filled styles: how far the edges are softened (overlay cells; 0 = the cell outline, only straightened). | |
Overlay Sort Order (OverlaySortOrder) | int32 | 5 | Ground Overlay | ||
Overlay Style (OverlayStyle) | ERSEFreeOverlayStyle | Subtle | Ground Overlay | How the overlay looks. Subtle (D-113, default): a thin soft outline around the movement area, an almost invisible fill, lighter ability areas (Subtle Look). Filled: filled areas with a clear outline (the colors below). Both read a blurred mask (Overlay Material = M_RSE_FreeOverlay). Cells: solid squares of Overlay Cell Size (Overlay Material is the Tactics grid decal, M_RSE_GridDecal, D-088). | |
Range Color (RangeColor) | FRSEUIColor | (Token="Warning",Alpha=0.220000,Lightness=0.069987,Chroma=0.969670,Hue=21.024740,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay | The ability's range (where it can be aimed from here). | |
Subtle Look (SubtleLook) | FRSEFreeOverlaySubtleLook | (MoveOutlineColor=(Token="Info",Alpha=0.800000,Lightness=0.088866,Chroma=0.532645,Hue=-11.446269,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)),MoveFil... | Ground Overlay|Subtle | The Subtle style's colors, outline width and softness. | |
AIReach Cells Per Frame (AIReachCellsPerFrame) | int32 | 800 | Pacing | D-111: before an AI decision, the unit's movement circle is computed this many cells per frame (spread over a few frames instead of one ~15 ms frame on a 9 m circle; a Steam Deck is ~3.5x slower). 0 = all at once. | |
AIThink Delay (AIThinkDelay) | float | 0.450000 | Pacing | Pause before each AI decision, so the player can follow. | |
End Pause (EndPause) | float | 0.800000 | Pacing | Seconds of the pause after the last hit before the battle ends. | |
Event Pause (EventPause) | float | 0.300000 | Pacing | Pause after an event without a timeline (a turn lost, a unit joining). | |
Unit Walk Speed (UnitWalkSpeed) | float | 380.000000 | Pacing | Walking speed of units along their paths (cm/s). | |
Confirm Hazardous Moves (bConfirmHazardousMoves) | bool | True | Route Hazards | Ask the player before a walk that crosses (or ends in) a dangerous surface, or a jump that lands in one (Free Tactics Field -> Route Hazards decides when). The project's default; every player may turn it off in Options ("Confirm dangerous moves"). | |
Hazard Cancel Text (HazardCancelText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "HazardNo", "Pick another path") | Route Hazards | ||
Hazard Continue Text (HazardContinueText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "HazardYes", "Yes") | Route Hazards | ||
Hazard Prompt Title (HazardPromptTitle) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "HazardTitle", "Danger") | Route Hazards | The warning's title and its two answers. | |
Disabled Menu Row Opacity (DisabledMenuRowOpacity) | float | 0.600000 | UI | Opacity of a command menu row that cannot be used now (the action or bonus action is spent, not enough points), on top of the disabled text color and the reason in its cost column (D-106). | |
HUDWidget Class (HUDWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | UI | The Free Tactics battle HUD (turn order, commands, forecast). Empty = the built-in one. | |
Sneaking Text (SneakingText) | FText | NSLOCTEXT("RSEFreeTacticsPresentation", "Sneaking", "Sneaking") | UI | The explorer's sneak indicator (shown while sneaking). | |
Turn Order Count (TurnOrderCount) | int32 | 8 | UI | Units shown in the turn order bar. | |
Detection Alert Color (DetectionAlertColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.067218,Chroma=1.455528,Hue=8.830938,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | UI|Detection Meter | ||
Detection Back Color (DetectionBackColor) | FRSEUIColor | (Token="Black",Alpha=0.550000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | UI|Detection Meter | ||
Detection Meter Color (DetectionMeterColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.053951,Chroma=1.144979,Hue=19.771044,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | UI|Detection Meter | ||
Detection Meter Height (DetectionMeterHeight) | float | 60.000000 | UI|Detection Meter | Height of the meter above the enemy's head (cm). | |
Detection Meter Size (DetectionMeterSize) | FVector2D | (X=64.000000,Y=9.000000) | UI|Detection Meter | Detection meter above visible enemies (D-097): size on screen (pixels) and colors. |
RPG Saga Engine: Free Tactics Capture
Class URSEFreeTacticsCaptureSettings (module RSE), Project Settings, Project, RPG Saga Engine. How the world is read into a Free Tactics navigation snapshot (D-091).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Only Pawn Blocking Surfaces (bOnlyPawnBlockingSurfaces) | bool | True | Capture | Only surfaces that block pawns count (grass, ivy and other walk-through decoration are skipped). | |
Use Combat Roles (bUseCombatRoles) | bool | True | Capture | The capture follows combat roles (D-093, D-097): decoration and clutter are looked through, rough ground costs its role's multiplier, standable objects are ground, and blockers get their role's cover (full, half, none for obstacles). | |
Floor Tag (FloorTag) | FName | RSE.Floor | Capture | Actor or component tag of surfaces that are always floor, however narrow (D-110): stair steps, a plank bridge. The combat role Standable does the same through the asset. | |
Ground Min Surface Size (GroundMinSurfaceSize) | float | 400.000000 | Capture | A surface at least this wide (its bounds' shorter side) is ground: floors, landscape, platforms. Narrower ones are objects. | |
Ignore Tag (IgnoreTag) | FName | RSE.FreeTacticsIgnore | Capture | Actors or components with this tag are ignored (actor or component tag). | |
Max Floors (MaxFloors) | int32 | 4 | Capture | Most floors a cell may hold (D-110): the ground, upper floors, balconies, a bridge over a path, a roof. 1 = only the top floor of each cell is read (a plain heightfield). Separate floors need separate collision (one slab per actor or component): the capture looks under a surface by ignoring the object it hit. | |
Max Layers (MaxLayers) | int32 | 4 | Capture | Most surfaces read per floor of a cell (the floor plus objects stacked on it). | |
Min Opening Height (MinOpeningHeight) | float | 30.000000 | Capture | A gap at least this tall between two stacked objects is an opening (D-110): a window between a sill and a lintel, a door under its lintel. Sight passes through it; what floats above it (the lintel, a balcony) is the ceiling of the floor below. | |
Min Walkable Normal Z (MinWalkableNormalZ) | float | 0.700000 | Capture | Surfaces steeper than this (normal Z below it) are not walkable. | |
Required Headroom (RequiredHeadroom) | float | 180.000000 | Capture | Free space a unit needs above the ground (a table or a low beam makes the cell unwalkable). | |
Trace Channel (TraceChannel) | TEnumAsByte<ECollisionChannel> | ECC_Visibility | Capture | Channel of the vertical traces. | |
Trace Depth Below (TraceDepthBelow) | float | 1500.000000 | Capture | ||
Trace Height Above (TraceHeightAbove) | float | 1500.000000 | Capture | Traces start this far above the area's plane and end this far below it. | |
Window Tag (WindowTag) | FName | RSE.Window | Capture | Actor or component tag of windows (D-110): the object blocks movement but not sight (a glass pane, bars). A gap in a wall (a low wall under a lintel with room above the floor) is a window without any tag. |
RPG Saga Engine: Free Tactics Field
Class URSEFreeTacticsFieldSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Free Tactics Field (D-108): surfaces and their interactions, destructible objects, positional effects in meters, jumping, falling and the AI's use of them.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
AIExplosive Weight (AIExplosiveWeight) | float | 1.000000 | AI | Weight of shooting an explosive object: the blast's expected damage on enemies, minus on allies. | |
AISurface Combo Weight (AISurfaceComboWeight) | float | 1.000000 | AI | Weight of what an ability's surfaces and elements would do to units (combos: igniting oil under enemies). | |
AISurface Danger Weight (AISurfaceDangerWeight) | float | 1.000000 | AI | Weight of the damage harmful surfaces would do to the unit where it would stand (times its danger awareness). | |
Jumping (bJumping) | bool | True | Jumping | Units can jump (a movement option: up ledges, over gaps and low obstacles). | |
Jump Provokes Opportunity Attacks (bJumpProvokesOpportunityAttacks) | bool | False | Jumping | Jumping out of an enemy's reach provokes its opportunity attack (off: a jump disengages, as in many party tactics games). | |
Jump Arc Height (JumpArcHeight) | float | 1.000000 | Jumping | How high the arc rises above the higher end (meters): obstacles lower than the arc are jumped over. | |
Jump Base Distance (JumpBaseDistance) | float | 3.000000 | Jumping | Longest jump (meters) before the unit's Jump stat: reach = base + per point x Jump. | |
Jump Base Height (JumpBaseHeight) | float | 1.250000 | Jumping | Highest ledge (meters) a unit jumps up to, before its Jump stat: base + per point x Jump. | |
Jump Cost (JumpCost) | ERSEFreeJumpCost | Movement | Jumping | What a jump costs in the separate budgets model (the shared budget pays Action Points for the movement). | |
Jump Distance Per Jump Stat (JumpDistancePerJumpStat) | float | 0.500000 | Jumping | ||
Jump Height Per Jump Stat (JumpHeightPerJumpStat) | float | 0.250000 | Jumping | ||
Jump Min Distance (JumpMinDistance) | float | 1.000000 | Jumping | Shortest jump (meters): anything nearer is a walk. | |
Jump Movement Multiplier (JumpMovementMultiplier) | float | 1.500000 | Jumping | Movement a jump costs per meter of its length. | |
Destructible Objects (bDestructibleObjects) | bool | True | Objects | World objects whose combat role is Destructible (and objects placed by abilities) can be targeted and broken. | |
Target Objects (bTargetObjects) | bool | True | Objects | Abilities aimed at an explosive may target it directly (off: only area abilities and pushes break objects). | |
Min Explosion Radius (MinExplosionRadius) | float | 2.000000 | Objects | Blast radius (meters) of an exploding object whose data sets none: its Explosion Radius tiles x Meters Per Tile, at least this. | |
Spawned Object Height (SpawnedObjectHeight) | float | 1.000000 | Objects | ||
Spawned Object Radius (SpawnedObjectRadius) | float | 0.450000 | Objects | Footprint radius and height of an object placed by an ability (Spawn Object) when its data sets none. | |
Fall Damage (bFallDamage) | bool | True | Positional | Falls (pushed off a ledge, a jump down) hurt. | |
Fall Damage Curve (FallDamageCurve) | FRuntimeFloatCurve | (EditorCurveData=(Keys=((Time=2.000000),(Time=3.000000,Value=10.000000),(Time=6.000000,Value=35.000000),(Time=10.000000,Value=80.000000),(Time=15.000000,Value=1... | Positional | Fall damage: meters dropped (X) -> percent of the unit's max HP (Y). Drops below the first key's X do nothing. Default: harmless up to 2 m, 10% at 3 m, 35% at 6 m, 80% at 10 m, 100% at 15 m. | |
Push Max Climb (PushMaxClimb) | float | 0.350000 | Positional | A push stops at a rise higher than this (meters): it hits it like a wall. | |
Hazard Aware Routes (bHazardAwareRoutes) | bool | True | Route Hazards | Paths go around dangerous surfaces when the movement left allows it (the walk shown, the walk taken and the AI's routes): each meter inside a surface weighs its Route Avoid Cost on top of its movement cost. A route that still crosses one (not enough movement to go around, or no way around) is shown in Hazard Color and the player is asked first. Off = the shortest path, as before D-156. | |
Warn Destination in Hazard (bWarnDestinationInHazard) | bool | True | Route Hazards | The player is warned when the chosen destination itself lies in a dangerous surface (the walk ends there). | |
Warn Landing in Hazard (bWarnLandingInHazard) | bool | True | Route Hazards | The player is warned when a jump lands, or an ability carries the user (Leap, Dash, Teleport), into a dangerous surface. | |
Harmful Avoid Cost (HarmfulAvoidCost) | float | 8.000000 | Route Hazards | Route Avoid Cost of a surface that hurts (damage or a harmful status) and has none of its own (meters of detour per meter inside). | |
Slippery Avoid Cost (SlipperyAvoidCost) | float | 2.000000 | Route Hazards | Route Avoid Cost of a surface that only makes units slip (ice, oil) and has none of its own. | |
Enter Effects on Create (bEnterEffectsOnCreate) | bool | True | Surfaces | Units standing where a surface appears (or changes) get its enter effects at once (lightning electrifies water under them). | |
Surfaces (bSurfaces) | bool | True | Surfaces | Surfaces work in Free Tactics battles (Create Zone effects lay them; off = Create Zone uses its classic fallback). | |
Contact Margin (ContactMargin) | float | 0.150000 | Surfaces | A unit is in a surface when its center is inside, grown by this margin (meters). | |
Default Slip Chance (DefaultSlipChance) | float | 50.000000 | Surfaces | Slippery tile zones without their own chance (bSlippery): chance to slip (percent). | |
Default Slip Status (DefaultSlipStatus) | TSoftObjectPtr<URSEStatusData> | /RPGSagaEngine/Data/Statuses/DA_Status_Prone.DA_Status_Prone | Surfaces | Status of a unit that slips when the surface names none (prone). | |
Element Hit Radius (ElementHitRadius) | float | 0.750000 | Surfaces | Radius an element hit from a single-target ability reaches on the ground (it can ignite oil or electrify water there). | |
Height Tolerance (HeightTolerance) | float | 1.000000 | Surfaces | A surface covers the ground within this height of where it was laid (meters): fire on the road does not burn the wall top above it. | |
Interactions (Interactions) | TArray<FRSESurfaceInteraction> | (18 entries) | Surfaces | What happens when a surface meets a trigger: another surface, an element, the weather. The first matching row wins (a row for Zone.Fire also matches Zone.Fire.Big). The plugin ships fire + oil, lightning + water, fire + ice / water, cold + water, rain on fire. | |
Max Chain Reactions (MaxChainReactions) | int32 | 4 | Surfaces | Surfaces changed by a surface change react in turn (burning oil lights the next puddle) up to this many times. | |
Max Surfaces (MaxSurfaces) | int32 | 64 | Surfaces | Most surfaces at once (the oldest go first). | |
Point Surface Radius (PointSurfaceRadius) | float | 1.250000 | Surfaces | Radius of a surface laid by a single-target ability (or on the aimed point only, Use Ability Area off). | |
Slide Meters (SlideMeters) | float | 1.500000 | Surfaces | A unit pushed onto a slippery surface slides this much further (meters). |
RPG Saga Engine: Free Tactics Field (Presentation)
Class URSEFreeTacticsFieldPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How the Free Tactics field looks (D-108): surface decals and their light effects, breaking and exploding objects, the tactical clarity overlay (cover icons, the forecast from a destination, the line of fire, tooltips) and the camera cutaway.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Cutaway (bCutaway) | bool | True | Camera Cutaway | Roofs, upper floors and tree canopies that hide the active unit or the cursor are hidden while they do. | |
Cutaway Ceiling (CutawayCeiling) | float | 3000.000000 | Camera Cutaway | How far above the focus to look for overhead parts (cm). | |
Cutaway Min Height (CutawayMinHeight) | float | 200.000000 | Camera Cutaway | Only parts starting this high above the focus are cut (upper floors, roofs; not the walls around it). | |
Cutaway Probe Radius (CutawayProbeRadius) | float | 80.000000 | Camera Cutaway | Radius of the cutaway probes (cm). | |
Cutaway Tags (CutawayTags) | TArray<FName> | (1 entries) | Camera Cutaway | Actor or component tags that mark something the camera may cut away (roles with Cutaway set count too). | |
Cover Icons (bCoverIcons) | bool | False | Clarity | Cover icons (full / half shield) all along the movement area where the unit would be in cover. D-113: off by default; the shields show only at the hovered destination (Destination Preview), on the side of each threat. | |
Destination Preview (bDestinationPreview) | bool | True | Clarity | While a destination is hovered: each enemy's hit chance from there and the unit's cover against it. | |
Line Of Fire (bLineOfFire) | bool | True | Clarity | The line of fire while aiming (clear, covered, blocked), and from a hovered destination to the enemies it could hit. | |
Tooltips (bTooltips) | bool | True | Clarity | Hovering a surface or an object shows what it is and does. | |
Cover Icon Opacity (CoverIconOpacity) | float | 0.700000 | Clarity | Opacity of the cover icons along the movement area (D-113; the hovered destination's icon is always opaque). | |
Cover Icon Size (CoverIconSize) | float | 12.000000 | Clarity | Size of a cover icon along the movement area on screen (pixels; D-113: small and discreet). | |
Cover Icon Spacing (CoverIconSpacing) | float | 1.750000 | Clarity | Spacing of the cover icons (meters) and the most shown. | |
Destination Cover Icon Size (DestinationCoverIconSize) | float | 22.000000 | Clarity | Size of the cover icons at the hovered destination (pixels). | |
Destination Enemy Chips (DestinationEnemyChips) | ERSEFreeEnemyChips | Focused | Clarity | D-120: which enemies show their chip (hit chance, "Exposed to it") over their head while a destination is hovered. Focused: only the enemy under the cursor, the aimed one, or the one last hovered this turn (the shields at the destination and the lines of fire still show every threat). | |
Destination Shield Merge Angle (DestinationShieldMergeAngle) | float | 40.000000 | Clarity | ...and enemies within this angle of each other share one shield (the weaker cover wins). | |
Destination Shield Offset (DestinationShieldOffset) | float | 110.000000 | Clarity | D-113: at the hovered destination one shield stands on the side of each threat it has cover from (full / half), this far from the destination toward the enemy (cm)... | |
Exposed Text (ExposedText) | FText | NSLOCTEXT("RSEFreeTacticsField", "Exposed", "Exposed to it") | Clarity | ||
Flanked Color (FlankedColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.022824,Chroma=1.155754,Hue=7.402624,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | A spot some enemy sees with no cover in the way. | |
Font Size (FontSize) | int32 | 13 | Clarity | Font size of the clarity texts (pixels). | |
Full Cover Color (FullCoverColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=-0.025899,Chroma=1.312299,Hue=1.460616,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | ||
Full Cover Text (FullCoverText) | FText | NSLOCTEXT("RSEFreeTacticsField", "Hidden", "Hidden from it") | Clarity | ||
Half Cover Color (HalfCoverColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.053951,Chroma=1.144979,Hue=19.771044,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | ||
Half Cover Text (HalfCoverText) | FText | NSLOCTEXT("RSEFreeTacticsField", "HalfCover", "Half cover from it") | Clarity | ||
Hit Chance Format (HitChanceFormat) | FText | NSLOCTEXT("RSEFreeTacticsField", "HitChip", "{Hit}% hit, {Crit}% crit") | Clarity | Texts (localized): the chip over an enemy ("{Hit}% hit, {Crit}% crit"), the cover names, the jump label, a surface's rounds. | |
Line Blocked Color (LineBlockedColor) | FRSEUIColor | (Token="Negative",Alpha=0.900000,Lightness=-0.041562,Chroma=1.260038,Hue=0.818512,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | ||
Line Clear Color (LineClearColor) | FRSEUIColor | (Token="Positive",Alpha=0.900000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | ||
Line Cover Color (LineCoverColor) | FRSEUIColor | (Token="Warning",Alpha=0.900000,Lightness=0.053951,Chroma=1.144979,Hue=19.771044,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Clarity | ||
Line Thickness (LineThickness) | float | 2.500000 | Clarity | ||
Max Cover Icons (MaxCoverIcons) | int32 | 40 | Clarity | ||
Rounds Left Format (RoundsLeftFormat) | FText | NSLOCTEXT("RSEFreeTacticsField", "RoundsLeft", "{Name} ({Rounds} rounds left)") | Clarity | ||
Top Margin (TopMargin) | float | 90.000000 | Clarity | Screen band (pixels, from the top) kept free for the turn order bar: enemy chips and tooltips stay below it (an enemy off screen keeps its chip at the screen's edge). | |
Break Effect (BreakEffect) | TSoftObjectPtr<UNiagaraSystem> | /RPGSagaEngine/Visual/Field/NS_RSE_ObjectBreak.NS_RSE_ObjectBreak | Objects | Effect when a destructible object breaks (its field visual's End Effect wins). | |
Debris Mesh (DebrisMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Objects | Mesh of a debris piece (a small cube by default) and its size (cm). | |
Debris Pieces (DebrisPieces) | int32 | 8 | Objects | Debris pieces thrown by a breaking object (0 = none) and how long they last. | |
Debris Seconds (DebrisSeconds) | float | 1.600000 | Objects | ||
Debris Size (DebrisSize) | float | 14.000000 | Objects | ||
Explosion Effect (ExplosionEffect) | TSoftObjectPtr<UNiagaraSystem> | /RPGSagaEngine/Visual/Field/NS_RSE_Explosion.NS_RSE_Explosion | Objects | Effect when an object explodes (its field visual's End Effect wins). | |
Explosion Sound (ExplosionSound) | TSoftObjectPtr<USoundBase> | None | Objects | Sound of an explosion (optional). | |
Placed Object Mesh (PlacedObjectMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Objects | Mesh of an object placed by an ability when its field visual names none (the engine cylinder by default). | |
Loop Effect Spacing (LoopEffectSpacing) | float | 2.000000 | Surfaces | Loop effects (the surface visual's Loop Effect: embers, sparks, bubbles) are spawned on a lattice of this spacing. | |
Max Loop Effects (MaxLoopEffects) | int32 | 24 | Surfaces | Most loop effect components at once (Steam Deck budget). 0 = none. | |
Surface Cell Size (SurfaceCellSize) | float | 0.250000 | Surfaces | Texel size of the surface texture (meters; a multiple of the snapshot cell). Smaller = rounder edges, more upload. | |
Surface Glow (SurfaceGlow) | float | 3.000000 | Surfaces | Emissive strength of glowing surfaces (fire, electricity). | |
Surface Material (SurfaceMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Battle/M_RSE_FreeSurfaces.M_RSE_FreeSurfaces | Surfaces | Deferred decal material of the surfaces (M_RSE_FreeSurfaces): one decal over the battle area reads a color texture. | |
Surface Opacity (SurfaceOpacity) | float | 1.000000 | Surfaces | Opacity of the surface decals (times each surface's Color alpha). | |
Surface Smoothing (SurfaceSmoothing) | int32 | 2 | Surfaces | How far the surface edges are softened (texels). | |
Surface Sort Order (SurfaceSortOrder) | int32 | 3 | Surfaces |
RPG Saga Engine: Free Tactics Targeting
Class URSEFreeTacticsTargetingSettings (module RSE), Project Settings, Project, RPG Saga Engine. D-146: single-target aiming, the ability previews of the battle menus and the dotted walk line in the live mode.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Style (Style) | TSoftObjectPtr<URSETargetingStyle> | /RPGSagaEngine/Data/Presentation/DA_RSE_TargetingStyle.DA_RSE_TargetingStyle | Look | The look (null = the built-in defaults of URSETargetingStyle). | |
Click Away Confirms (bClickAwayConfirms) | bool | False | Picking | A click away from every unit confirms the chosen target anyway (off: it says to click a target or press Confirm). | |
Focus Offscreen Targets (bFocusOffscreenTargets) | bool | True | Picking | The camera glides to a target chosen with Next / Previous only when it is off screen. | |
Unit Picking (bUnitPicking) | bool | True | Picking | Single-target abilities pick a unit (rings, Next / Previous target) instead of aiming at the ground under the cursor. | |
Cycle Order (CycleOrder) | ERSEFreeTargetCycleOrder | Distance | Picking | The order Next / Previous target (Tab, arrows, D-pad) walks the valid targets in. | |
Hostile Auto Pick (HostileAutoPick) | ERSEFreeHostileAutoPick | Nearest | Picking | The enemy an attack highlights first. | |
Pick Radius (PickRadius) | float | 110.000000 | Picking | The mouse picks the unit whose body is nearest the cursor on screen within this many pixels (at 1080 lines; scaled with the screen), not only the one under it. | |
Support Auto Pick (SupportAutoPick) | ERSEFreeSupportAutoPick | MostNeeding | Picking | The ally a support ability highlights first. | |
Legacy Line Of Fire (bLegacyLineOfFire) | bool | False | Previews | The straight line of fire from the unit to the cursor while aiming (before D-146; the arc and the rings replace it). | |
Menu Hover Preview (bMenuHoverPreview) | bool | True | Previews | Hovering or highlighting an ability in a battle menu shows its reach around the active unit and the targets in reach. | |
Show Enemy Watches (bShowEnemyWatches) | bool | True | Previews | The watch range of enemies on Overwatch shows while you choose where to walk. | |
Path Preview (PathPreview) | ERSEFreePathPreview | WhenNotBrowsing | Previews | When the dotted line of a walk shows. |
RPG Saga Engine: GAS Export
Class URSEGASExportSettings (module RSEGASEditor), Project Settings, Project, RPG Saga Engine. Defaults of the Export to GAS tool (G3, docs/product/gas-interop.md): where the generated Gameplay Effects and Abilities go, which maps they read, and how battle turns become seconds.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Ability Map (AbilityMap) | TSoftObjectPtr<URSEGASAbilityMap> | None | Mapping | ||
Attribute Map (AttributeMap) | TSoftObjectPtr<URSEGASAttributeMap> | None | Mapping | The attribute map the export reads when the run names none. Empty = the sample attribute set's rows. | |
Seconds Per Turn (SecondsPerTurn) | float | 3.000000 | Mapping | A battle turn in seconds: status durations and periods (GAS has no turns). | |
Status Map (StatusMap) | TSoftObjectPtr<URSEGASStatusMap> | None | Mapping | ||
Ability Folder (AbilityFolder) | FString | Abilities | Output | Sub-folders of the output folder. | |
Ability Prefix (AbilityPrefix) | FString | GA_ | Output | ||
Effect Folder (EffectFolder) | FString | Effects | Output | ||
Effect Prefix (EffectPrefix) | FString | GE_ | Output | ||
Output Folder (OutputFolder) | FDirectoryPath | (set per project) | Output | Folder of the generated assets: Abilities, Effects and Statuses sub-folders. A folder of the project. | |
Status Folder (StatusFolder) | FString | Statuses | Output | ||
Ability Tag Root (AbilityTagRoot) | FString | Ability.RSE | Tags | Gameplay tag root of the generated abilities' own tags (Ability.RSE.<Name>), when no Ability Map row gives them. | |
Cooldown Tag Root (CooldownTagRoot) | FString | Cooldown.RSE | Tags | Gameplay tag root of the generated cooldown effects' tags (Cooldown.RSE.<Name>). | |
Tag Source (TagSource) | FName | None | Tags | The Gameplay Tag list the missing tags are added to (empty = the project's default list). |
RPG Saga Engine: Game Flow
Class URSEGameFlowSettings (module RSE), Project Settings, Project, RPG Saga Engine. Front-end flow (D-026): which maps the main menu and a new game use, the menu's texts, input keys, layout and transitions.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Show Continue (bShowContinue) | bool | True | Flow | Offer Continue (load the most recent save) at the top of the menu when a save exists. | |
Show Title Screen (bShowTitleScreen) | bool | True | Flow | Show a "press any key" title screen before the menu. | |
Fade Color (FadeColor) | FRSEUIColor | (Token="Black",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Flow | ||
Fade in Duration (FadeInDuration) | float | 0.600000 | Flow | Fade from black when the main menu opens. 0 = no fade. | |
Fade Out Duration (FadeOutDuration) | float | 0.500000 | Flow | Fade to black before a map change or quitting. 0 = immediate. | |
Screen Keys Toggle (bScreenKeysToggle) | bool | True | Input | D-116: a screen opened by a key closes with the same key (the area map with M / View, the party menu and its journal with the menu key); Back (Esc / B) always closes too. Off = those keys only open. | |
Menu Back Keys (MenuBackKeys) | TArray<FKey> | (3 entries) | Input | Returns from the menu to the title screen. | |
Menu Confirm Keys (MenuConfirmKeys) | TArray<FKey> | (3 entries) | Input | ||
Menu Down Keys (MenuDownKeys) | TArray<FKey> | (4 entries) | Input | ||
Menu Left Keys (MenuLeftKeys) | TArray<FKey> | (4 entries) | Input | Changes the value of an option row (options screen, D-038). | |
Menu Next Tab Keys (MenuNextTabKeys) | TArray<FKey> | (3 entries) | Input | ||
Menu Prev Tab Keys (MenuPrevTabKeys) | TArray<FKey> | (3 entries) | Input | Previous / next tab of tabbed menu screens (options). | |
Menu Right Keys (MenuRightKeys) | TArray<FKey> | (4 entries) | Input | ||
Menu Up Keys (MenuUpKeys) | TArray<FKey> | (4 entries) | Input | --- Input (the main menu reads keys directly: it has no pawn and no mapping context) --- | |
Background Color (BackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.448875,Chroma=0.275618,Hue=10.644761,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout | Bottom of the full-screen background gradient. Lower the alpha to show the map's scene behind it. | |
Background Glow Colors (BackgroundGlowColors) | TArray<FRSEUIColor> | (2 entries) | Layout | Soft lights drifting slowly behind the title (none = a still background). | |
Background Glow Drift (BackgroundGlowDrift) | float | 140.000000 | Layout | How far the lights drift from their place. | |
Background Glow Size (BackgroundGlowSize) | float | 1100.000000 | Layout | Diameter of the drifting lights. | |
Background Top Color (BackgroundTopColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.286595,Chroma=0.658696,Hue=8.438069,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout | Top of the full-screen background gradient. | |
Menu Vertical Anchor (MenuVerticalAnchor) | float | 0.650000 | Layout | Normalized screen height of the menu's (and the "press any key" text's) center. | |
Menu Width (MenuWidth) | float | 380.000000 | Layout | ||
Title Font Size (TitleFontSize) | int32 | 0 | Layout | Title size; 0 = the theme's Display font size (UI Theme -> Fonts -> Display). | |
Title Vertical Anchor (TitleVerticalAnchor) | float | 0.300000 | Layout | Normalized screen height of the title's center. | |
Vignette Opacity (VignetteOpacity) | float | 0.850000 | Layout | Darkening toward the screen corners (0 = none). | |
Main Menu Map (MainMenuMap) | TSoftObjectPtr<UWorld> | (set per project) | Maps | Map with the main menu (game mode ARSEFrontEndGameMode). Also the project's Game Default Map. | |
New Game Map (NewGameMap) | TSoftObjectPtr<UWorld> | (set per project) | Maps | Map opened by New Game, after the party is reset. | |
Menu Extensions (MenuExtensions) | TArray<TSoftClassPtr<URSEMenuExtension> > | (0 entries) | Menus | Entries a project adds to the main menu and the in-game menu (D-142): each class is a URSEMenuExtension child (C++ or Blueprint). Modules add theirs from code (RSEOnline: Host Game, Join Game, Invite). | |
Main Menu Widget Class (MainMenuWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Title screen and main menu (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEMainMenuViewModel (docs/product/custom-ui.md). | |
Continue Label (ContinueLabel) | FText | NSLOCTEXT("RSEGameFlowSettings", "Continue", "Continue") | Texts | ||
Game Title (GameTitle) | FText | NSLOCTEXT("RSEDemo", "DemoTitle", "RPG Saga Engine Demo") | Texts | The title on the main menu. Empty = the project's name. | |
Load Label (LoadLabel) | FText | NSLOCTEXT("RSEGameFlowSettings", "Load", "Load") | Texts | ||
Load Unavailable Detail (LoadUnavailableDetail) | FText | NSLOCTEXT("RSEGameFlowSettings", "LoadNoSaves", "No saved games") | Texts | Detail next to Load when there is no save to load. | |
Menu Hint Text (MenuHintText) | FText | Texts | Hint line under the menu; hidden when empty. | ||
New Game Label (NewGameLabel) | FText | NSLOCTEXT("RSEGameFlowSettings", "NewGame", "New Game") | Texts | ||
New Game Map Missing Text (NewGameMapMissingText) | FText | NSLOCTEXT("RSEGameFlowSettings", "NewGameMapMissing", "No new game map is set (Project Settings -> RPG Saga Engine -> Game Flow).") | Texts | Shown when New Game is chosen but NewGameMap is not set. | |
Options Label (OptionsLabel) | FText | NSLOCTEXT("RSEGameFlowSettings", "Options", "Options") | Texts | Opens the options screen (D-038). Empty = no Options entry. | |
Press Any Key Text (PressAnyKeyText) | FText | NSLOCTEXT("RSEGameFlowSettings", "PressAnyKey", "Press any key") | Texts | ||
Quit Label (QuitLabel) | FText | NSLOCTEXT("RSEGameFlowSettings", "Quit", "Quit") | Texts | ||
Subtitle (Subtitle) | FText | Texts | Line under the title; hidden when empty. | ||
Version Text (VersionText) | FText | Texts | Shown in the bottom-right corner; hidden when empty. |
RPG Saga Engine: Game Foundation
Class URSEFoundationSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Game Foundation and archetype tools (D-095).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Report Settings References (bReportSettingsReferences) | bool | True | Change Safety | Also report framework settings (Pacts, Bestiary, Progression Designer...) that name a tag the foundation drops. | |
Managed Tag Roots (ManagedTagRoots) | TArray<FString> | (7 entries) | Change Safety | Tag roots the foundation defines. Content tags under them that the foundation does not list are reported as broken references before applying (change safety). | |
Library Folders (LibraryFolders) | TArray<FString> | (2 entries) | Library | Folders searched for foundation presets and archetypes (the plugin's first). | |
Applied Foundation (AppliedFoundation) | TSoftObjectPtr<URSEGameFoundation> | None | Project | The foundation the project was last set up from (written by Apply Foundation To Project; shown by the Studio). | |
New Tag Source (NewTagSource) | FString | RSE_Foundation_Project.ini | Project | Tag file (Config/Tags/<name>) that receives tags a foundation needs and the project does not have yet. | |
Project Foundation Folder (ProjectFoundationFolder) | FString | (set per project) | Project | Folder in /Game where applying a foundation writes the project's attribute registry and command menu layout. | |
Starter Content Folder (StarterContentFolder) | FString | (set per project) | Project | Folder in /Game that receives a preset's starter content (one subfolder per preset, D-100). | |
Starter Enemy Intelligence (StarterEnemyIntelligence) | float | -1.000000 | Starter Balance | AI intelligence of the starter enemies; negative = as a new game resolves it (the encounter's adaptive start value). | |
Starter Grid Size (StarterGridSize) | int32 | 12 | Starter Balance | Side length of the generated Tactics grid. | |
Starter Player Intelligence (StarterPlayerIntelligence) | float | 0.500000 | Starter Balance | AI intelligence playing the starter party. | |
Starter Runs (StarterRuns) | int32 | 40 | Starter Balance | Battles per starter encounter (seeds 1..N). | |
Starter Win Rate Max (StarterWinRateMax) | float | 0.850000 | Starter Balance | ||
Starter Win Rate Min (StarterWinRateMin) | float | 0.600000 | Starter Balance | Target band of the starter party's win rate at each battle's party level. | |
Test Accuracy (TestAccuracy) | float | 95.000000 | Test Battle | Hit chance style attributes (named Accuracy in the registry) start here so hits land. | |
Test Action Points (TestActionPoints) | float | 6.000000 | Test Battle | Action Points and Jump of the test units (Tactics). | |
Test Grid Size (TestGridSize) | int32 | 8 | Test Battle | Side length of the generated Tactics grid. | |
Test Intelligence (TestIntelligence) | float | 0.600000 | Test Battle | AI intelligence of both sides. | |
Test Jump (TestJump) | float | 2.000000 | Test Battle | ||
Test Life Value (TestLifeValue) | float | 120.000000 | Test Battle | Base value of the life resource's maximum attribute (e.g. Max HP). | |
Test Resource Value (TestResourceValue) | float | 40.000000 | Test Battle | Base value of other resources' maximum attributes (Max MP, Max Energy...). | |
Test Runs (TestRuns) | int32 | 4 | Test Battle | Battles per mode (different seeds). | |
Test Skill Cost (TestSkillCost) | float | 6.000000 | Test Battle | ||
Test Skill Power (TestSkillPower) | float | 1.500000 | Test Battle | Power of the test skill (magical, the foundation's first element) and its cost in the first spendable resource. | |
Test Speed (TestSpeed) | float | 10.000000 | Test Battle | Speed of the test units (the side's units get +1 each, so turns do not tie). | |
Test Stat Value (TestStatValue) | float | 14.000000 | Test Battle | Base value of every other plain attribute (offense, defense, accuracy...). | |
Test Units Per Side (TestUnitsPerSide) | int32 | 3 | Test Battle | Units per side. |
RPG Saga Engine: Game Terms
Class URSEGameTermsSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The game's vocabulary (D-095, Game Foundation step 1): what the game calls things ("Party", "Class", "Magic", "Gold") and the player-facing names of tags (elements, equipment kinds, item and ability categories).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Tag Names (TagNames) | TMap<FGameplayTag,FText> | (0 entries) | Terms | Player-facing names of tags (Element.Fire -> "Fire", Equip.Type.Weapon.Firearm -> "Firearm"). | |
Terms (Terms) | TMap<FName,FText> | (0 entries) | Terms | Words by id (Party, Class, Level, Experience, Abilities, Magic, Items, Equipment, Money...). |
RPG Saga Engine: Generated Art
Class URSEArtSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Where the generated art of read-only content is found (D-075).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Libraries (Libraries) | TArray<TSoftObjectPtr<URSEArtLibrary> > | (1 entries) | Generated Art | Art libraries read after an asset's own Portrait / Icon field, in order. The Portrait & Icon Studio adds its library here when it creates one. Empty = only the assets' own fields. |
RPG Saga Engine: Grid
Class URSEGridSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Global rules of the tactical grid.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Height Step Size (HeightStepSize) | float | 50.000000 | Dimensions | Height of one height step, in cm. Tile heights are stored as whole steps. Global only. | |
Tile Size (TileSize) | float | 100.000000 | Dimensions | Edge length of one tile, in cm. Global only (levels are built for it). | |
Cost Rules (CostRules) | FRSEGridCostRules | (ClimbCostPerStep=1,bLevitateIgnoresTerrainCost=True) | Movement | Height costs (climbing, dropping) and levitation rules, for every unit and terrain. | |
Default Terrain (DefaultTerrain) | FGameplayTag | (TagName="Terrain.Ground") | Terrain | Terrain assigned to tiles that have no explicit terrain (when grids are built). Global only. | |
Fallback Terrain Rules (FallbackTerrainRules) | FRSETerrainRules | (MoveCost=1) | Terrain | Rules for terrains missing from TerrainRules. | |
Terrain Rules (TerrainRules) | TMap<FGameplayTag,FRSETerrainRules> | (8 entries) | Terrain | Movement rules per terrain type. Terrains not listed use FallbackTerrainRules. |
RPG Saga Engine: Growth UI
Class URSEGrowthUISettings (module RSE), Project Settings, Project, RPG Saga Engine. The progression screens (D-144): the Growth page of the party menu (points or board), the teacher screen, the results lines and the New Game question.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Available Glow Scale (AvailableGlowScale) | float | 1.350000 | Board | Glow ring around nodes that can be unlocked now, in node sizes. | |
Available Node Kind Tint (AvailableNodeKindTint) | float | 0.600000 | Board | ||
Board Token Colors (BoardTokenColors) | FRSEGrowthBoardTokenColors | (ReferenceStyle="/RPGSagaEngine/UI/Styles/DA_UIStyle_Classic.DA_UIStyle_Classic",HueFollow=1.000000,ChromaFollow=1.000000,LightnessFollow=0.350000,MaxChromaRati... | Board | P65: how board style assets with Color Mode "Follow UI Style" (the default) follow the UI style: the token each color follows, the reference style their colors were made for (Classic), and how strongly they follow. | |
Show Board Title (bShowBoardTitle) | bool | True | Board | The board's name and the selected member's points drawn in the board's top corner. | |
Show Controls Hint (bShowControlsHint) | bool | True | Board | The pan / zoom controls (Board Controls Hint) drawn in the board's bottom corner. | |
Show Gate Labels (bShowGateLabels) | bool | False | Board | Labels of gates are shown only for the selected or hovered node (their details say what opens them). | |
Show Help Button (bShowHelpButton) | bool | True | Board | D-154: a small Help button in the member strip that shows the legend of node kinds over the board. | |
Show Hub Labels (bShowHubLabels) | bool | False | Board | Labels of crossings (hubs) are shown only for the selected or hovered node. | |
Show Legend (bShowLegend) | bool | False | Board | The legend of node kinds always drawn in the board's corner. D-154: off (each kind's purpose is in the node card; the strip's Help button shows the legend on demand). | |
Center Light Steps (CenterLightSteps) | int32 | 28 | Board | Rings of the soft light behind the board's center (more = smoother). | |
Circle Segments (CircleSegments) | int32 | 28 | Board | Segments of a round node (smoothness). | |
Current Glow Scale (CurrentGlowScale) | float | 2.200000 | Board | The glow around the character's current node, in node sizes. | |
Default Kind Icons (DefaultKindIcons) | TMap<ERSEGrowthNodeKind,TSoftObjectPtr<UTexture2D> > | (4 entries) | Board | Node icons per kind for boards whose style names none (the plugin's glyphs by default). Ability and passive nodes show their ability's icon first. | |
Edge Thickness (EdgeThickness) | float | 3.000000 | Board | ||
Fallback Look (FallbackLook) | int32 | 0 | Board | Which fallback look (index). | |
Fallback Looks (FallbackLooks) | TArray<FRSEGrowthBoardLook> | (3 entries) | Board | Built-in looks of boards without a style asset (Progression Systems -> Default Board Style empty too). Original designs: a night sky, roots and a circuit. | |
Fit Padding (FitPadding) | float | 0.700000 | Board | Room around the whole board when the view is fitted (board units). | |
Fit Readable Zoom (FitReadableZoom) | float | 0.360000 | Board | A board that fits the view only below this zoom opens at this zoom instead, centered on its open part (the nodes that are open or can be opened); the whole board is one press away (right stick click). 0 = always the whole board. | |
Follow Speed (FollowSpeed) | float | 10.000000 | Board | How fast the view glides to the cursor node (0 = jump). | |
Glow Steps (GlowSteps) | int32 | 5 | Board | Rings of a soft glow (more = smoother, slower). | |
Icon Scale (IconScale) | float | 0.580000 | Board | Icons are drawn at this share of the node size. | |
Label Min Zoom (LabelMinZoom) | float | 0.300000 | Board | Labels are drawn under nodes from this zoom on (the selected node's label always). | |
Locked Node Kind Tint (LockedNodeKindTint) | float | 0.300000 | Board | D-154: how much of its kind's color a closed node shows (0 = the look's Locked Node Color, 1 = the kind's color), so every node reads clearly; nodes that can be opened now use the second value. | |
Marker Scale (MarkerScale) | float | 0.500000 | Board | Marker size (the character's place), in node sizes. | |
Max Zoom (MaxZoom) | float | 1.600000 | Board | D-154: 1.6 by default, so nodes stay proportionate when zoomed in (Look Node Size x Pixels Per Board Unit x zoom). | |
Min Node Pixels (MinNodePixels) | float | 34.000000 | Board | Nodes are never drawn smaller than this on screen (pixels at 1080p), so a fitted large board stays readable. | |
Minor Label Font Size (MinorLabelFontSize) | int32 | 0 | Board | Font size of minor nodes' labels (0 = the theme's smallest size). | |
Minor Label Min Zoom (MinorLabelMinZoom) | float | 1.600000 | Board | Minor nodes (stat boosts) show their label from this zoom on (always when selected or hovered). | |
Min Zoom (MinZoom) | float | 0.050000 | Board | ||
Nebula Clouds (NebulaClouds) | TArray<FRSEGrowthNebulaCloud> | (3 entries) | Board | Soft clouds behind boards whose style names none (depth). | |
Nebula Steps (NebulaSteps) | int32 | 26 | Board | Rings of a nebula cloud (smoothness). | |
Overview Min Node Pixels (OverviewMinNodePixels) | float | 9.000000 | Board | The whole-board overview of a board too large to read whole (right click / R3) keeps true proportions, nodes never below this. | |
Pixels Per Board Unit (PixelsPerBoardUnit) | float | 120.000000 | Board | Screen pixels per board unit at zoom 1. | |
Selected Ring Thickness (SelectedRingThickness) | float | 4.000000 | Board | ||
Socket Darkness (SocketDarkness) | float | 0.620000 | Board | How dark the socket is (0 = the node's color, 1 = black). | |
Socket Scale (SocketScale) | float | 0.740000 | Board | The dark socket inside a node that holds its icon, as a share of the node size (0 = none). | |
Stick Dead Zone (StickDeadZone) | float | 0.250000 | Board | ||
Stick Pan Per Second (StickPanPerSecond) | float | 900.000000 | Board | Pan speed of the right stick (pixels per second). | |
Trigger Zoom Per Second (TriggerZoomPerSecond) | float | 1.600000 | Board | Zoom change per second with a gamepad trigger fully pressed (left out, right in). | |
Wheel Zoom Step (WheelZoomStep) | float | 0.120000 | Board | Zoom change per mouse wheel notch (multiplier minus one). | |
Zoom Smooth Speed (ZoomSmoothSpeed) | float | 12.000000 | Board | How fast the zoom glides to its target (wheel, triggers, fit); 0 = jump. | |
Card Fill Color (CardFillColor) | FRSEUIColor | (Token="Primary",Alpha=0.920000,Lightness=-0.327827,Chroma=0.363428,Hue=8.707818,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | D-162: more colors of the board page, so every one of them can be set (and follows the UI style). | |
Dim Text Color (DimTextColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=0.044332,Chroma=1.182665,Hue=3.650277,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | A disabled menu entry and the counter at zero. | |
Locked Label Color (LockedLabelColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=0.052537,Chroma=1.162014,Hue=3.667405,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | The labels of locked nodes. | |
Menu Pill Color (MenuPillColor) | FRSEUIColor | (Token="Primary",Alpha=0.920000,Lightness=-0.293923,Chroma=0.304596,Hue=9.952320,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | Fill of a node menu entry. | |
Negative Stat Color (NegativeStatColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.019198,Chroma=0.887452,Hue=-0.115458,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | A stat that goes down in the preview. | |
Unaffordable Color (UnaffordableColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.056368,Chroma=1.144359,Hue=1.275545,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Colors | A cost you cannot pay, a requirement not met. | |
Node Menu Key Hint (bNodeMenuKeyHint) | bool | True | Board|Node Menu | D-154: the small key hint ([Confirm] Choose [Back] Cancel) under the node menu. | |
Show Node Card (bShowNodeCard) | bool | True | Board|Node Menu | The hover card next to the node under the mouse or the cursor (name, kind and purpose, cost, effect). | |
Neighbour Frame Share (NeighbourFrameShare) | float | 0.750000 | Board|Node Menu | D-152: when a node is selected or its menu opens, the view frames the node with its neighbours in the board's free part (beside the docked card or the details panel), zooming out down to Min Zoom if they would not fit this share of it. | |
Node Card Margin (NodeCardMargin) | float | 12.000000 | Board|Node Menu | D-152: the docked card's distance from the board's edges (pixels at 1080p). | |
Node Card Placement (NodeCardPlacement) | ERSEGrowthNodeCardPlacement | SidePanel | Board|Node Menu | D-152: the node card docked at the board's side (default: the middle stays free) or beside the node. | |
Node Card Width (NodeCardWidth) | float | 340.000000 | Board|Node Menu | Widest the hover card gets (pixels at 1080p). | |
Node Menu Dim (NodeMenuDim) | float | 0.120000 | Board|Node Menu | D-154: how much the board darkens behind an open node menu (0 = not at all). | |
Node Menu Font Share (NodeMenuFontShare) | float | 0.320000 | Board|Node Menu | D-154: the node menu is sized from its node: its font is this share of the node's drawn diameter (clamped to Node Menu Min / Max Font Size), so the menu stays proportional to the node at any zoom. | |
Node Menu Gap (NodeMenuGap) | float | 8.000000 | Board|Node Menu | The node menu (D-149): gap between the node's ring and the menu, pixels at 1080p. D-154: 8 (close to its node). | |
Node Menu Layout (NodeMenuLayout) | ERSEGrowthNodeMenuLayout | Column | Board|Node Menu | D-152: the node menu's layout (a compact column by default). | |
Node Menu Max Font Size (NodeMenuMaxFontSize) | float | 13.000000 | Board|Node Menu | ||
Node Menu Min Font Size (NodeMenuMinFontSize) | float | 10.000000 | Board|Node Menu | ||
Node Menu Padding (NodeMenuPadding) | FVector2D | (X=9.000000,Y=3.000000) | Board|Node Menu | D-154: room inside each menu entry around its text (pixels at 1080p, horizontal and vertical). | |
Node Menu Ring Scale (NodeMenuRingScale) | float | 1.300000 | Board|Node Menu | D-154: the ring around the node while its menu is open, in node radii. | |
Node Menu Spread (NodeMenuSpread) | float | 38.000000 | Board|Node Menu | Angle between the menu's entries around the node (degrees). | |
Points Count Seconds (PointsCountSeconds) | float | 0.600000 | Board|Points | Seconds the counter takes to count to a new value. | |
Points Font Scale (PointsFontScale) | float | 2.400000 | Board|Points | The points counter on the board (D-149): its number is this many times the theme's heading size. | |
Points Gain Color (PointsGainColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Lightness=0.024962,Chroma=0.662686,Hue=-1.154955,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Points | Flash colors of the counter when points are gained and spent. | |
Points Pulse Scale (PointsPulseScale) | float | 0.250000 | Board|Points | How much the counter grows at the pop (share of its size). | |
Points Pulse Seconds (PointsPulseSeconds) | float | 0.700000 | Board|Points | Seconds of the pop and flash when the points change. | |
Points Spend Color (PointsSpendColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.011733,Chroma=0.718531,Hue=-11.985731,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Board|Points | ||
Region Label Min Zoom (RegionLabelMinZoom) | float | 0.040000 | Board|Regions | Region names are written from this zoom on. | |
Region Padding (RegionPadding) | float | 0.900000 | Board|Regions | Room around a region's nodes inside its tint (board units). | |
Region Tint Strength (RegionTintStrength) | float | 0.150000 | Board|Regions | Themed regions: how strongly their tint shows behind their nodes (multiplies the region color's alpha; 0 = none). | |
Board Details Open by Default (bBoardDetailsOpenByDefault) | bool | False | Layout | The board page opens with its details panel shown (else the node menu's Details opens it). | |
Board Show All Stats (bBoardShowAllStats) | bool | True | Layout | The board page lists every stat now and after under the details (off: only the stats the selected node changes, in its Effect). | |
Board Details Width (BoardDetailsWidth) | float | 340.000000 | Layout | The board page: details narrower (the board takes the room; members move to a strip above it). | |
Details Backing Color (DetailsBackingColor) | FRSEUIColor | (Token="Primary",Alpha=0.960000,Lightness=-0.309960,Chroma=0.330729,Hue=9.426590,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout | Backing of the details panel (it floats over the board on the board page). | |
Details Width (DetailsWidth) | float | 420.000000 | Layout | ||
Member Column Width (MemberColumnWidth) | float | 280.000000 | Layout | --- Layout --- | |
Portrait Fallback Color (PortraitFallbackColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.038524,Chroma=0.484163,Hue=3.557762,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Layout | Background of a member portrait slot without art (the member's initial is written on it). | |
Strip Action Gap (StripActionGap) | float | 4.000000 | Layout | D-154: space between two strip actions (pixels at 1080p). | |
Strip Action Padding (StripActionPadding) | FMargin | (Left=10.000000,Top=3.000000,Right=10.000000,Bottom=3.000000) | Layout | ||
Strip Action Text Role (StripActionTextRole) | ERSETextRole | Caption | Layout | D-154: the member strip's action buttons (Undo, Auto, Reset points, Details, Help): small and discreet. Their text role and the room around their text (pixels at 1080p). | |
Strip Portrait Size (StripPortraitSize) | float | 76.000000 | Layout | Member strip (D-149): portrait size in pixels at 1080p (names and points under / on it; no level). | |
Teacher Height (TeacherHeight) | float | 640.000000 | Layout | ||
Teacher Width (TeacherWidth) | float | 1180.000000 | Layout | Width of the teacher window. | |
New Game Prompt Timeout (NewGamePromptTimeout) | float | 30.000000 | New Game | Seconds the New Game question waits for the game to be ready (party, no dialog) before giving up. | |
Result Learned Format (ResultLearnedFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ResultLearned", "{Name} learned {Ability}!") | Result Texts | {Name} {Ability} | |
Result Mastery Format (ResultMasteryFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ResultMastery", "{Name}: +{Amount} mastery") | Result Texts | {Name} {Amount} | |
Result Points Format (ResultPointsFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ResultPoints", "{Name}: +{Amount} {Currency}") | Result Texts | {Name} {Amount} {Currency} | |
Result Rank Format (ResultRankFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ResultRank", "{Name}: {Ability} grew stronger") | Result Texts | {Name} {Ability} | |
Screen Widget Class (ScreenWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | The Growth page of the party menu (a Widget Blueprint derived from RSE Screen Widget). Empty = the built-in screen. | |
Teacher Widget Class (TeacherWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | The teacher screen. Empty = the built-in screen. | |
Can Learn Text (CanLearnText) | FText | NSLOCTEXT("RSEGrowthUI", "CanLearn", "Can learn") | Teacher Texts | ||
Close Button (CloseButton) | FText | NSLOCTEXT("RSEGrowthUI", "Close", "Leave") | Teacher Texts | ||
Confirm Learn Format (ConfirmLearnFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmLearn", "Teach {Ability} to {Name} for {Price}?") | Teacher Texts | {Ability} {Name} {Price} | |
Guest Text (GuestText) | FText | NSLOCTEXT("RSEGrowthUI", "GuestFixed", "Guest: fixed build") | Teacher Texts | A guest (Character -> Guest) keeps the build it came with: shown instead of a refusal. | |
Known Text (KnownText) | FText | NSLOCTEXT("RSEGrowthUI", "Known", "Already known") | Teacher Texts | ||
Learn Button (LearnButton) | FText | NSLOCTEXT("RSEGrowthUI", "Learn", "Learn") | Teacher Texts | ||
Learned Format (LearnedFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Learned", "{Name} learned {Ability}!") | Teacher Texts | {Name} {Ability} | |
Price Item Format (PriceItemFormat) | FText | INVTEXT("{Amount}") | Teacher Texts | {Amount} | |
Price Items Format (PriceItemsFormat) | FText | NSLOCTEXT("RSEGrowthUI", "PriceItems", "{Count}x {Item}") | Teacher Texts | {Item} {Count} | |
Required Level Format (RequiredLevelFormat) | FText | NSLOCTEXT("RSEGrowthUI", "RequiredLevel", "Level {Level}") | Teacher Texts | {Level} | |
Respec Offer Text (RespecOfferText) | FText | NSLOCTEXT("RSEGrowthUI", "RespecOffer", "Reset a hero\'s points") | Teacher Texts | ||
Teacher Learner Header (TeacherLearnerHeader) | FText | NSLOCTEXT("RSEGrowthUI", "TeacherLearner", "Who learns") | Teacher Texts | ||
Teacher Offers Header (TeacherOffersHeader) | FText | NSLOCTEXT("RSEGrowthUI", "TeacherOffers", "Lessons") | Teacher Texts | --- Teacher texts --- | |
Already Open Text (AlreadyOpenText) | FText | NSLOCTEXT("RSEGrowthUI", "AlreadyOpen", "Already open.") | Texts | Said when an open node is chosen again. | |
Attributes Header (AttributesHeader) | FText | NSLOCTEXT("RSEGrowthUI", "AttributesHeader", "Attributes") | Texts | ||
Auto Button (AutoButton) | FText | NSLOCTEXT("RSEGrowthUI", "Auto", "Auto") | Texts | ||
Auto Done Format (AutoDoneFormat) | FText | NSLOCTEXT("RSEGrowthUI", "AutoDone", "{Name} spent the points ({Count} steps).") | Texts | ||
Available Text (AvailableText) | FText | NSLOCTEXT("RSEGrowthUI", "Available", "Available") | Texts | ||
Board Controls Hint (BoardControlsHint) | FText | NSLOCTEXT("RSEGrowthUI", "BoardControls", "Drag / right stick: pan Wheel / triggers: zoom Right click / R3: whole board") | Texts | The pan / zoom controls drawn on the board (Show Controls Hint). | |
Board Progress Format (BoardProgressFormat) | FText | NSLOCTEXT("RSEGrowthUI", "BoardProgress", "{Open} / {Total} open") | Texts | {Open} {Total}: how much of the board is open, under the points (Show Board Title). Empty = not shown. | |
Bought Format (BoughtFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Bought", "{Name} learned {Ability}!") | Texts | ||
Buy Button (BuyButton) | FText | NSLOCTEXT("RSEGrowthUI", "Buy", "Learn") | Texts | ||
Cap Format (CapFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Cap", "{Points}/{Cap}") | Texts | {Points} {Cap} | |
Catalog Header (CatalogHeader) | FText | NSLOCTEXT("RSEGrowthUI", "CatalogHeader", "Abilities to learn") | Texts | ||
Classic Note (ClassicNote) | FText | NSLOCTEXT("RSEGrowthUI", "ClassicNote", "Your heroes grow with their levels: stats rise and abilities are learned on their own.") | Texts | ||
Confirm Auto Format (ConfirmAutoFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmAuto", "Spend all of {Name}\'s points automatically?") | Texts | {Name} | |
Confirm Buy Format (ConfirmBuyFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmBuy", "Learn {Ability}? It costs {Cost} of your {Currency}.") | Texts | {Ability} {Cost} {Currency} | |
Confirm Raise Format (ConfirmRaiseFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmRaise", "Raise {Stat} by {Count}? It costs {Cost} of your {Currency}.") | Texts | {Count} {Stat} {Cost} {Currency} | |
Confirm Respec Format (ConfirmRespecFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmRespec", "Reset every point {Name} spent? {Price}") | Texts | {Name} {Price} | |
Confirm Respec Penalty Format (ConfirmRespecPenaltyFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmRespecPenalty", "Reset every point {Name} spent?\nYou get back {Back} of {Spent} {Currency}: {Lost} ({Percent}%) are lost for g... | Texts | {Name} {Back} {Spent} {Lost} {Percent} {Currency} {Price}: the reset question when it costs points (Respec Point Penalty). | |
Confirm Unlock Format (ConfirmUnlockFormat) | FText | NSLOCTEXT("RSEGrowthUI", "ConfirmUnlock", "{Verb} {Node}? It costs {Cost} of your {Currency}.") | Texts | {Verb} {Node} {Cost} {Currency} | |
Cost Format (CostFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Cost", "Cost {Cost}") | Texts | {Cost} {Currency} | |
Currency Names (CurrencyNames) | TMap<FGameplayTag,FText> | (3 entries) | Texts | Names of point currencies (Progression.Points.*); board points use the board's Points Term when it has one. | |
Default Board Term (DefaultBoardTerm) | FText | NSLOCTEXT("RSEGrowthUI", "BoardTerm", "Growth Board") | Texts | ||
Default Node Term (DefaultNodeTerm) | FText | NSLOCTEXT("RSEGrowthUI", "NodeTerm", "Node") | Texts | ||
Default Unlock Verb (DefaultUnlockVerb) | FText | NSLOCTEXT("RSEGrowthUI", "UnlockVerb", "Unlock") | Texts | ||
Delta Format (DeltaFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Delta", "{Current} > {After}") | Texts | {Current} {After} | |
Details Button (DetailsButton) | FText | NSLOCTEXT("RSEGrowthUI", "DetailsButton", "Details") | Texts | ||
Details Header (DetailsHeader) | FText | NSLOCTEXT("RSEGrowthUI", "DetailsHeader", "Details") | Texts | ||
Effect Header (EffectHeader) | FText | NSLOCTEXT("RSEGrowthUI", "EffectHeader", "Effect") | Texts | ||
Element Format (ElementFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Element", "Element: {Element}") | Texts | {Element} | |
Free Text (FreeText) | FText | NSLOCTEXT("RSEGrowthUI", "Free", "Free") | Texts | ||
Gate Level Format (GateLevelFormat) | FText | NSLOCTEXT("RSEGrowthUI", "GateLevel", "Opens at level {Level}") | Texts | {Level} | |
Help Button (HelpButton) | FText | NSLOCTEXT("RSEGrowthUI", "HelpButton", "Help") | Texts | D-154: the strip's Help button (shows the legend of node kinds). | |
Junction Purpose Format (JunctionPurposeFormat) | FText | NSLOCTEXT("RSEGrowthUI", "JunctionPurpose", "Free waypoint: opens {Count} paths, choose one.") | Texts | {Count}: a junction's purpose with the number of paths it opens. | |
Legend Title (LegendTitle) | FText | NSLOCTEXT("RSEGrowthUI", "LegendTitle", "Node kinds") | Texts | D-154: the title of the legend Help shows. | |
Level Format (LevelFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Level", "Level {Level}") | Texts | {Level} | |
Locked Text (LockedText) | FText | NSLOCTEXT("RSEGrowthUI", "Locked", "Locked") | Texts | ||
Mastered Format (MasteredFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Mastered", "{Ability}: learned") | Texts | {Ability} | |
Mastery Format (MasteryFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Mastery", "Teaches {Ability}: {Points}/{Need}") | Texts | {Ability} {Points} {Need} | |
Mastery Header (MasteryHeader) | FText | NSLOCTEXT("RSEGrowthUI", "MasteryHeader", "Mastery") | Texts | ||
No Button (NoButton) | FText | NSLOCTEXT("RSEGrowthUI", "No", "No") | Texts | ||
No Cap Format (NoCapFormat) | FText | INVTEXT("{Points}") | Texts | {Points} | |
Node Kind Names (NodeKindNames) | TMap<ERSEGrowthNodeKind,FText> | (6 entries) | Texts | ||
Node Kind Purposes (NodeKindPurposes) | TMap<ERSEGrowthNodeKind,FText> | (6 entries) | Texts | What each node kind is for, one line (legend and hover card). D-149. | |
Node Menu Cancel (NodeMenuCancel) | FText | NSLOCTEXT("RSEGrowthUI", "MenuCancel", "Cancel") | Texts | ||
Node Menu Choose (NodeMenuChoose) | FText | NSLOCTEXT("RSEGrowthUI", "MenuChoose", "Choose") | Texts | The key hint under the node menu: [Confirm] this. | |
Node Menu Details (NodeMenuDetails) | FText | NSLOCTEXT("RSEGrowthUI", "MenuDetails", "Details") | Texts | ||
Node Menu Unlock Format (NodeMenuUnlockFormat) | FText | NSLOCTEXT("RSEGrowthUI", "MenuUnlock", "{Verb} {Cost} {Currency}") | Texts | {Verb} {Cost} {Currency}: the Unlock entry of the node menu. | |
No Plan Text (NoPlanText) | FText | NSLOCTEXT("RSEGrowthUI", "NoPlan", "This character grows with its levels only.") | Texts | ||
No Requirements Text (NoRequirementsText) | FText | NSLOCTEXT("RSEGrowthUI", "NoRequirements", "Next to an open node.") | Texts | ||
No Respec Text (NoRespecText) | FText | NSLOCTEXT("RSEGrowthUI", "NoRespec", "Points cannot be reset here.") | Texts | ||
Nothing to Undo Text (NothingToUndoText) | FText | NSLOCTEXT("RSEGrowthUI", "NothingToUndo", "Nothing to take back.") | Texts | ||
Open Text (OpenText) | FText | NSLOCTEXT("RSEGrowthUI", "Open", "Open") | Texts | ||
Owned Text (OwnedText) | FText | NSLOCTEXT("RSEGrowthUI", "Owned", "Known") | Texts | ||
Page Label (PageLabel) | FText | NSLOCTEXT("RSEGrowthUI", "PageLabel", "Growth") | Texts | --- Texts --- | |
Passive Text (PassiveText) | FText | NSLOCTEXT("RSEGrowthUI", "PassiveText", "Passive: always active") | Texts | ||
Points Cost Format (PointsCostFormat) | FText | INVTEXT("{Cost} {Currency}") | Texts | {Cost} {Currency} | |
Points Header (PointsHeader) | FText | NSLOCTEXT("RSEGrowthUI", "PointsHeader", "Points") | Texts | ||
Prerequisites Format (PrerequisitesFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Prereq", "Needs {List}") | Texts | {List} | |
Preview Header (PreviewHeader) | FText | NSLOCTEXT("RSEGrowthUI", "PreviewHeader", "After") | Texts | Header of the stat preview (current -> after). | |
Raise Button (RaiseButton) | FText | NSLOCTEXT("RSEGrowthUI", "Raise", "Raise") | Texts | ||
Raised Format (RaisedFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Raised", "{Name}: {Stat} raised.") | Texts | ||
Range Format (RangeFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Range", "Range: {Min}-{Max}") | Texts | {Min} {Max} (Tactics range of an ability). | |
Range Single Format (RangeSingleFormat) | FText | NSLOCTEXT("RSEGrowthUI", "RangeSingle", "Range: {Range}") | Texts | {Range} when the minimum and maximum are the same. | |
Rank Format (RankFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Rank", "{Ability}: rank {Rank} ({Uses} uses to the next)") | Texts | {Ability} {Rank} {Uses} | |
Ranks Header (RanksHeader) | FText | NSLOCTEXT("RSEGrowthUI", "RanksHeader", "Ability ranks") | Texts | ||
Requirements Header (RequirementsHeader) | FText | NSLOCTEXT("RSEGrowthUI", "RequirementsHeader", "Requirements") | Texts | ||
Respec Button (RespecButton) | FText | NSLOCTEXT("RSEGrowthUI", "Respec", "Reset points") | Texts | ||
Respec Done Format (RespecDoneFormat) | FText | NSLOCTEXT("RSEGrowthUI", "RespecDone", "{Name}\'s points are back.") | Texts | ||
Respec Final Text (RespecFinalText) | FText | NSLOCTEXT("RSEGrowthUI", "RespecFinal", "A reset cannot be undone.") | Texts | Under the reset question: the free undo does not cover a reset. | |
Stats Header (StatsHeader) | FText | NSLOCTEXT("RSEGrowthUI", "StatsHeader", "Stats") | Texts | ||
Target Format (TargetFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Target", "Target: {Target}") | Texts | {Target} | |
Target Names (TargetNames) | TMap<ERSETargetFilter,FText> | (5 entries) | Texts | ||
Top Rank Format (TopRankFormat) | FText | NSLOCTEXT("RSEGrowthUI", "TopRank", "{Ability}: rank {Rank} (top)") | Texts | {Ability} {Rank} | |
Undo Button (UndoButton) | FText | NSLOCTEXT("RSEGrowthUI", "Undo", "Undo") | Texts | ||
Undo Count Format (UndoCountFormat) | FText | NSLOCTEXT("RSEGrowthUI", "UndoCount", "Undo ({Count})") | Texts | {Count} | |
Undo Hint Text (UndoHintText) | FText | NSLOCTEXT("RSEGrowthUI", "UndoHint", "Undo is free while this page stays open.") | Texts | Under the points counter: Undo is free while the page is open. | |
Undone Format (UndoneFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Undone", "Step taken back: {Count} points returned.") | Texts | {Count}: points given back by an undo. | |
Unlocked Format (UnlockedFormat) | FText | NSLOCTEXT("RSEGrowthUI", "Unlocked", "{Name}: {Node} unlocked.") | Texts | ||
Use Cost Format (UseCostFormat) | FText | NSLOCTEXT("RSEGrowthUI", "UseCost", "Uses {Cost}") | Texts | {Cost} | |
Waiting Text (WaitingText) | FText | NSLOCTEXT("RSEGrowthUI", "Waiting", "Waiting for the host...") | Texts | ||
Yes Button (YesButton) | FText | NSLOCTEXT("RSEGrowthUI", "Yes", "Yes") | Texts | ||
You Are Here Text (YouAreHereText) | FText | NSLOCTEXT("RSEGrowthUI", "YouAreHere", "You are here") | Texts |
RPG Saga Engine: Input
Class URSEInputSettings (module RSE), Project Settings, Project, RPG Saga Engine. Input assets used by game code, so no controller hardcodes asset paths.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Back Action Text (BackActionText) | FText | NSLOCTEXT("RSEInput", "ActionBarBack", "Back") | Action Bar | ||
Confirm Action Text (ConfirmActionText) | FText | NSLOCTEXT("RSEInput", "ActionBarConfirm", "Select") | Action Bar | Names of the main screen actions a CommonUI action bar shows (the companion plugin binds them when a screen is on a CommonUI layer): Confirm and Back on every screen, the two tab actions on screens that switch tabs or pages. | |
Next Tab Action Text (NextTabActionText) | FText | NSLOCTEXT("RSEInput", "ActionBarNextTab", "Next tab") | Action Bar | ||
Previous Tab Action Text (PreviousTabActionText) | FText | NSLOCTEXT("RSEInput", "ActionBarPreviousTab", "Previous tab") | Action Bar | ||
Block Action (BlockAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Block.IA_Block | Battle | Blocks an enemy attack during its block prompt (D-066), in both battle modes (Action Commands -> Defense Input = Block). A key and button of its own: Select / Confirm stays with the command menu while enemies act. Unset = block prompts take Select, as before. | |
ATBTime Mode Action (ATBTimeModeAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_DangerZone.IA_DangerZone | Classic Battle | Classic battles: switches Wait / Active (D-065). It may be the same action as another context's (e.g. the danger zone's): it only acts during classic battles, where the others do nothing. | |
Analog Threshold (AnalogThreshold) | float | 0.350000 | Devices | Stick / trigger deflection that switches the prompts to the gamepad. | |
Simulate Steam Deck (bSimulateSteamDeck) | bool | False | Devices | Treat the game as running on a Steam Deck (testing the Deck start and labels on PC). Detected otherwise from the SteamDeck=1 environment variable or -SteamDeck. | |
Start with Gamepad (bStartWithGamepad) | bool | False | Devices | Device assumed before any input on PC (a controller-first build may start on the gamepad). The Steam Deck always starts on the gamepad. | |
Gamepad Labels (GamepadLabels) | ERSEGamepadLabelStyle | Auto | Devices | Gamepad button labels (the player can override it in Options). Auto: Steam Deck labels on a Deck, Xbox labels elsewhere. | |
Key Prompt Icon Size (KeyPromptIconSize) | float | 26.000000 | Devices | D-176: size (Slate units) of a key prompt icon shown instead of a text key cap. | |
Key Prompt Provider (KeyPromptProvider) | TSoftClassPtr<UObject> | None | Devices | D-176: where key prompts get their labels and icons (a class implementing RSE Key Prompt Provider, C++ or Blueprint). Empty: the UI theme's labels and no icons. A provider set at runtime (the Common UI companion) wins over this one. | |
Mouse Move Threshold (MouseMoveThreshold) | float | 4.000000 | Devices | Mouse movement (pixels in one event) that switches the prompts to keyboard / mouse. | |
Prompt Device (PromptDevice) | ERSEForcedInputDevice | Auto | Devices | Device of the key prompts. Auto: keyboard / mouse on PC until a gamepad is used (and back on keyboard / mouse input); gamepad on a Steam Deck and on consoles. The other values force one device (testing; RSE.Input.ForceDevice overrides this at runtime). | |
Menu Stick Navigation (bMenuStickNavigation) | bool | True | Menu Stick | While a menu has focus (party menu, battle command menus, options, save, card album, dialog choices...), the left stick moves the menu cursor like the D-pad, and it no longer pans the camera or moves the character. | |
Menu Stick Scroll (bMenuStickScroll) | bool | True | Menu Stick | D-176 C2: the right stick scrolls the read-only panels of menus (item and quest descriptions, the bestiary, the shop's details) that a cursor cannot reach, so a gamepad can read a long text. | |
Menu Scroll Speed (MenuScrollSpeed) | float | 700.000000 | Menu Stick | Scroll speed of the right stick at full deflection, in pixels per second. | |
Menu Stick Deadzone (MenuStickDeadzone) | float | 0.500000 | Menu Stick | Stick deflection (0..1) that counts as a direction in menus. | |
Menu Stick Repeat Delay (MenuStickRepeatDelay) | float | 0.400000 | Menu Stick | Seconds a direction is held before the cursor repeats. | |
Menu Stick Repeat Interval (MenuStickRepeatInterval) | float | 0.120000 | Menu Stick | Seconds between repeats while the direction stays held. | |
Map Action (MapAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Map.IA_Map | Menus | Opens / closes the area map (D-089, outside battles; M and the gamepad's View button by default). D-148: when it is listed in UI -> Party Menu Page Actions it opens the menu's Map tab instead (the default). | |
Menu Mapping Context (MenuMappingContext) | TSoftObjectPtr<UInputMappingContext> | /RPGSagaEngine/Input/IMC_Menus.IMC_Menus | Menus | Mapping context for menu input (party menu), active alongside the tactics context. | |
Menu Mapping Priority (MenuMappingPriority) | int32 | 1 | Menus | ||
Minimap Zoom Action (MinimapZoomAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_MinimapZoom.IA_MinimapZoom | Menus | Cycles the minimap's zoom levels (D-089; N by default). | |
Party Menu Action (PartyMenuAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_PartyMenu.IA_PartyMenu | Menus | Opens / closes the party menu (outside battles). | |
Party Menu Open Action (PartyMenuOpenAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_MenuOpen.IA_MenuOpen | Menus | D-148: opens the party menu on its start page but never closes it (Esc by default): Back keeps going back inside the menu. Unset = only the Party Menu Action opens it. | |
Cancel Action (CancelAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Cancel.IA_Cancel | Tactics | Cancel the current selection. | |
Select Action (SelectAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_Select.IA_Select | Tactics | Confirm / select the unit or tile under the cursor. | |
Tactics Mapping Context (TacticsMappingContext) | TSoftObjectPtr<UInputMappingContext> | /RPGSagaEngine/Input/IMC_Tactics.IMC_Tactics | Tactics | Mapping context active during tactical play. | |
Tactics Mapping Priority (TacticsMappingPriority) | int32 | 0 | Tactics | ||
Ability Cycle Action (AbilityCycleAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_AbilityCycle.IA_AbilityCycle | Tactics|Battle | Cycles through the active unit's abilities (enters targeting). | |
Danger Zone Action (DangerZoneAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_DangerZone.IA_DangerZone | Tactics|Battle | Toggles the danger zone overlay: tiles enemies can hit next turn (D-033). | |
End Turn Action (EndTurnAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_EndTurn.IA_EndTurn | Tactics|Battle | Ends the turn: first press picks the facing, confirm with Select. | |
Grid Cursor Action (GridCursorAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_GridCursor.IA_GridCursor | Tactics|Battle | Axis2D: moves the tile cursor one tile per press, relative to the camera (gamepad D-pad, arrow keys). | |
Camera Pan Action (CameraPanAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_CameraPan.IA_CameraPan | Tactics|Camera | Axis2D: X = right, Y = forward, relative to the camera. | |
Camera Rotate Action (CameraRotateAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_CameraRotate.IA_CameraRotate | Tactics|Camera | Axis1D: sign gives the rotation direction; one step per press. | |
Camera Zoom Action (CameraZoomAction) | TSoftObjectPtr<UInputAction> | /RPGSagaEngine/Input/IA_CameraZoom.IA_CameraZoom | Tactics|Camera | Axis1D: positive zooms in. |
RPG Saga Engine: Interactables
Class URSEInteractablesSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Interaction library settings (D-150): Project Settings -> RPG Saga Engine -> Interactables.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Danger (DefaultDanger) | float | 1.000000 | Danger | The danger of a place with no progression zone and no override (an enemy level). | |
Fair Margin (FairMargin) | int32 | -2 | Danger | ||
Rating Names (RatingNames) | TArray<FText> | (4 entries) | Danger | The rating names (Safe, Fair, Risky, Deadly). | |
Risky Margin (RiskyMargin) | int32 | -5 | Danger | ||
Safe Margin (SafeMargin) | int32 | 3 | Danger | Danger ratings: the party's level minus the recommended level at or above which a place counts as Safe / Fair / Risky (else Deadly). | |
Warning Format (WarningFormat) | FText | NSLOCTEXT("RSEInteractables", "WarningFormat", "Danger ahead: {Place}. Recommended level {Level} ({Rating} for your party).") | Danger | The danger warning ({Place}, {Level}, {Rating}). | |
Populate Destructible Kinds (PopulateDestructibleKinds) | TArray<TSoftObjectPtr<URSEInteractableData> > | (3 entries) | Populate | D-157: the kinds the Populate Destructibles tool places by default (barrels, crates, pots). | |
Populate Kinds (PopulateKinds) | TArray<TSoftObjectPtr<URSEInteractableData> > | (13 entries) | Populate | The kinds the Populate Interactions tool offers by default (their Placement decides where). | |
Break Prompt (BreakPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptBreak", "Break") | Prompts | D-157: destructibles. | |
Clear Prompt (ClearPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptClear", "Clear the way") | Prompts | ||
Cross Prompt (CrossPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptCross", "Cross") | Prompts | ||
Examine Prompt (ExaminePrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptExamine", "Examine") | Prompts | ||
Extinguish Prompt (ExtinguishPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptExtinguish", "Put out") | Prompts | ||
Gather Prompt (GatherPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptGather", "Gather") | Prompts | ||
Light Prompt (LightPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptLight", "Light") | Prompts | ||
Look Prompt (LookPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptLook", "Look around") | Prompts | ||
Open Prompt (OpenPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptOpen", "Open") | Prompts | The default verbs of the kinds. | |
Pray Prompt (PrayPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptPray", "Pray") | Prompts | ||
Push Prompt (PushPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptPush", "Push") | Prompts | ||
Read Prompt (ReadPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptRead", "Read") | Prompts | ||
Rest Prompt (RestPrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptRest", "Rest") | Prompts | ||
Save Prompt (SavePrompt) | FText | NSLOCTEXT("RSEInteractables", "PromptSave", "Rest and save") | Prompts | ||
Compass Points (CompassPoints) | TArray<FText> | (8 entries) | Signposts | The eight compass points from north, clockwise (N, NE, E...): signposts. World north = +X unless North Yaw says otherwise. | |
North Yaw (NorthYaw) | float | 0.000000 | Signposts | The world yaw that counts as north (degrees; 0 = +X). | |
Place Revealed Format (PlaceRevealedFormat) | FText | NSLOCTEXT("RSEInteractables", "PlaceRevealed", "{Place} was added to the map.") | Signposts | Said when a place is added to the map ({Place}). | |
Signpost Line Format (SignpostLineFormat) | FText | NSLOCTEXT("RSEInteractables", "SignpostLine", "{Direction}: {Label}{Note}") | Signposts | A signpost line ({Direction}, {Label}, {Note}). | |
Signpost Note Format (SignpostNoteFormat) | FText | NSLOCTEXT("RSEInteractables", "SignpostNote", " ({Note})") | Signposts | ||
Blessed Format (BlessedFormat) | FText | NSLOCTEXT("RSEInteractables", "Blessed", "The party is blessed: {Status}.") | Texts | A shrine blessed ({Status}); not ready yet. | |
Done by Format (DoneByFormat) | FText | NSLOCTEXT("RSEInteractables", "DoneBy", "{Member} did it.") | Texts | Said by an action done by a member ({Member}). | |
Empty Text (EmptyText) | FText | NSLOCTEXT("RSEInteractables", "Empty", "It\'s empty.") | Texts | ||
Extinguished Text (ExtinguishedText) | FText | NSLOCTEXT("RSEInteractables", "Extinguished", "Put out.") | Texts | ||
Found Item Format (FoundItemFormat) | FText | NSLOCTEXT("RSEInteractables", "FoundItem", "Found {Item} x{Count}.") | Texts | Found lines ({Item}, {Count}; {Money}). | |
Found Money Format (FoundMoneyFormat) | FText | NSLOCTEXT("RSEInteractables", "FoundMoney", "Found {Money}.") | Texts | ||
Hurt Format (HurtFormat) | FText | NSLOCTEXT("RSEInteractables", "Hurt", "{Member} takes {Damage} damage.") | Texts | D-157: a hazard hurt a member ({Member}, {Damage}). | |
Item Used Format (ItemUsedFormat) | FText | NSLOCTEXT("RSEInteractables", "ItemUsed", "Used {Item}.") | Texts | A key or offering used ({Item}). | |
Lit Text (LitText) | FText | NSLOCTEXT("RSEInteractables", "Lit", "Lit.") | Texts | ||
Nothing to Gather Text (NothingToGatherText) | FText | NSLOCTEXT("RSEInteractables", "NothingToGather", "Nothing left to gather. It will grow back.") | Texts | ||
Rested Text (RestedText) | FText | NSLOCTEXT("RSEInteractables", "Rested", "The party rested by the fire.") | Texts | ||
Shrine Quiet Text (ShrineQuietText) | FText | NSLOCTEXT("RSEInteractables", "ShrineQuiet", "The shrine is quiet. Come back later.") | Texts | ||
Status Given Format (StatusGivenFormat) | FText | NSLOCTEXT("RSEInteractables", "StatusGiven", "{Member}: {Status}.") | Texts | D-157: a hazard gave a member a status ({Member}, {Status}). |
RPG Saga Engine: Interaction
Class URSEInteractionSettings (module RSE), Project Settings, Project, RPG Saga Engine. Interactables and NPCs in exploration (Project Settings -> RPG Saga Engine -> Interaction): focus rules, the on-screen prompt, NPC placeholders, facing and barks.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Angle Weight (AngleWeight) | float | 2.000000 | Focus | Focus score = distance to the bounds / range + AngleWeight * angle / 180 - Priority. Lowest wins. Higher values favor what the player faces over what is nearest. | |
Bodies Use Default Range (bBodiesUseDefaultRange) | bool | False | Focus | Objects with a body (meshes, blocking shapes) are also in range within DefaultRange of their origin (the rule before the 2026-09-27 playtest; it lets small objects be used from far away). Off: only CloseReach from the body, or the actor's own Interaction Radius, counts. | |
Center Distance Weight (CenterDistanceWeight) | float | 0.150000 | Focus | Weight of the distance from the player to the object's center, added to the score (tie-break between neighbors that are both within reach, e.g. two things on one table; the facing weighs more). | |
Close Reach (CloseReach) | float | 55.000000 | Focus | Reach from the object's body (its meshes and blocking shapes): the player's capsule within this distance of the body is in range, however big the object or far its origin. The interaction volume grows to cover it. Actors can set their own (Reach Override). | |
Default Range (DefaultRange) | float | 120.000000 | Focus | Range around the origin of interactables without a body (trigger areas, optional scene zones) that do not set their own Interaction Radius: the player's capsule within this distance of the origin is in range. Objects with a body use CloseReach from their body instead (unless bBodiesUseDefaultRange). | |
Focus Check Interval (FocusCheckInterval) | float | 0.100000 | Focus | How often the focused interactable is re-evaluated while the player stands in at least one range. | |
Focus Keep Slack (FocusKeepSlack) | float | 25.000000 | Focus | The focused object stays in range this much farther than its range (no flicker at the edge). | |
Focus Switch Margin (FocusSwitchMargin) | float | 0.150000 | Focus | Another object takes the focus only when its score beats the focused one's by this much (no flicker between neighbors). | |
Ignore Facing Distance (IgnoreFacingDistance) | float | 30.000000 | Focus | Closer than this to the object's bounds, the facing does not matter (standing against it works in any direction). | |
Max Focus Angle (MaxFocusAngle) | float | 75.000000 | Focus | Objects farther than this angle from the pawn's facing are not focused, unless closer than IgnoreFacingDistance. Within the angle the facing weighs in the score (AngleWeight). Actors can set their own (Facing Rule). | |
Vertical Tolerance (VerticalTolerance) | float | 50.000000 | Focus | Largest vertical gap between the player's capsule and the object's body (or origin) that still counts as in range: objects on the floor above or below, on a balcony or down a ledge are left out. Actors can set their own. | |
Player Faces Interactable (bPlayerFacesInteractable) | bool | True | NPC | The player's pawn also turns toward what it interacts with. | |
Standing NPCs Block Navigation (bStandingNPCsBlockNavigation) | bool | True | NPC | D-120: an NPC that stands still (no schedule, Stay) carves a hole in the level's navmesh, so walkers go around it. NPCs that walk (a schedule, or Wander / Route) never do: the static navmesh would keep holes where they once stood (a guard line across a bridge cut the bridge in two for everyone, the guards included). | |
Default Bark Cooldown (DefaultBarkCooldown) | float | 30.000000 | NPC | Time before an NPC may bark again, for NPCs that do not set their own. | |
Default Bark Radius (DefaultBarkRadius) | float | 450.000000 | NPC | Proximity bark range of NPCs that do not set their own. | |
Face Turn Seconds (FaceTurnSeconds) | float | 0.250000 | NPC | NPC and player turn toward each other over this time when a conversation starts (0 = snap). | |
Face Turn Step Seconds (FaceTurnStepSeconds) | float | 0.016000 | NPC | Update step of the facing turn. | |
NPCCapsule Half Height (NPCCapsuleHalfHeight) | float | 88.000000 | NPC | ||
NPCCapsule Radius (NPCCapsuleRadius) | float | 34.000000 | NPC | ||
NPCPlaceholder Mesh (NPCPlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | NPC | Placeholder body of NPCs without their own mesh. | |
NPCPlaceholder Scale (NPCPlaceholderScale) | FVector | (X=0.700000,Y=0.700000,Z=1.800000) | NPC | ||
Prompt at Actor (bPromptAtActor) | bool | True | Prompt | Prompt above the focused actor (else at PromptScreenAnchor). | |
Prompt Avoids Player (bPromptAvoidsPlayer) | bool | True | Prompt | Actor prompts never cover the player's character: they move above its head when they would. | |
Prompt Shows Object Name (bPromptShowsObjectName) | bool | True | Prompt | The prompt names the object it acts on (so two things close together are told apart), when it has a name. | |
Default Prompt (DefaultPrompt) | FText | NSLOCTEXT("RSEInteraction", "DefaultPrompt", "Examine") | Prompt | Action shown by interactables without their own prompt text. | |
Fallback Keys (FallbackKeys) | FText | NSLOCTEXT("RSEInteraction", "FallbackKeys", "E / A") | Prompt | {Keys} when the Interact action's keys cannot be read from the input mapping. | |
Key Separator (KeySeparator) | FText | NSLOCTEXT("RSEInteraction", "KeySeparator", " / ") | Prompt | Between the keyboard and gamepad key names in {Keys}. | |
Prompt Fade Seconds (PromptFadeSeconds) | float | 0.120000 | Prompt | Fade in / out of the prompt (0 = none). | |
Prompt Follow Speed (PromptFollowSpeed) | float | 20.000000 | Prompt | How fast an actor prompt follows its point on screen (per second; 0 = sticks to it). Smooths camera jitter. | |
Prompt Font Size (PromptFontSize) | int32 | 18 | Prompt | ||
Prompt Format (PromptFormat) | FText | NSLOCTEXT("RSEInteraction", "PromptFormat", "[{Keys}] {Action}") | Prompt | Prompt layout. Arguments: {Keys} (e.g. "E / A"), {Action}. | |
Prompt Height Above Bounds (PromptHeightAboveBounds) | float | 25.000000 | Prompt | Height of the prompt above the top of the object's bounds (objects without their own prompt point). | |
Prompt Named Format (PromptNamedFormat) | FText | NSLOCTEXT("RSEInteraction", "PromptNamedFormat", "{Action}: {Name}") | Prompt | Action + object name. Arguments: {Action}, {Name}. | |
Prompt Panel Color (PromptPanelColor) | FRSEUIColor | (Token="Primary",Alpha=0.820000,Lightness=-0.327827,Chroma=0.363428,Hue=8.707818,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Prompt | ||
Prompt Player Clearance (PromptPlayerClearance) | float | 10.000000 | Prompt | Gap between the prompt and the top of the player's head when it moves out of the way. | |
Prompt Screen Anchor (PromptScreenAnchor) | FVector2D | (X=0.500000,Y=0.780000) | Prompt | Normalized screen point of screen-space prompts (and of actor prompts whose actor is off screen). | |
Prompt Screen Margin (PromptScreenMargin) | float | 24.000000 | Prompt | Actor prompts stay this far inside the screen edges. | |
Prompt Text Color (PromptTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Prompt | ||
Prompt Widget Class (PromptWidgetClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSEInteractionPromptWidget | Prompt | Interaction prompt (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEInteractionPromptViewModel (docs/product/custom-ui.md). | |
Prompt World Height (PromptWorldHeight) | float | 120.000000 | Prompt | Height above the interactable's origin, for objects without bounds (trigger areas) or prompt point. | |
Prompt ZOrder (PromptZOrder) | int32 | 20 | Prompt | ||
Talk Prompt (TalkPrompt) | FText | NSLOCTEXT("RSEInteraction", "TalkPrompt", "Talk") | Prompt | Action shown by NPCs without their own prompt text. |
RPG Saga Engine: Interior Kits
Class URSEKitLibrarySettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Interior Kits settings (D-164): Project Settings -> RPG Saga Engine -> Interior Kits.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Grid Rules (GridRules) | FRSEKitGridRules | (ModuleBin=5.000000,HeightBin=5.000000,ThicknessBin=2.000000,ModuleMultiples=(0.500000,1.000000,2.000000,3.000000,4.000000),SpanTolerance=5.000000,SpanTolerance... | Detection | Kit grouping and grid detection. | |
Probe Rules (ProbeRules) | FRSEKitProbeRules | (ProbeStep=5.000000,MinProbeCells=16,MaxProbeCells=128,MaxWallThickness=60.000000,MinWallHeight=100.000000,MinWallRunRatio=2.000000,DoorRules=(MinWidth=70.00000... | Detection | Probe thresholds (openings, fronts, corners, pivots). | |
Library Asset Name (LibraryAssetName) | FString | DA_KitLibrary | Output | ||
Library Folder (LibraryFolder) | FDirectoryPath | (set per project) | Output | Project folder of the library asset. Project content only. | |
Output Folder (OutputFolder) | FDirectoryPath | (set per project) | Output | Where the Create step writes kits, furniture and themes. Project content only. | |
Inspector Exposure EV100 (InspectorExposureEV100) | float | 2.000000 | Preview | ||
Interior Exposure EV100 (InteriorExposureEV100) | float | 2.000000 | Preview | Wizard preview and piece inspector: fixed exposure (EV100) of the 3D views. | |
Preview Floors (PreviewFloors) | int32 | 2 | Preview | ||
Preview Footprint (PreviewFootprint) | FVector2D | (X=1700.000000,Y=1300.000000) | Preview | Wizard preview: the sample house's footprint (cm; X along the facade), floors and seed. | |
Preview Light Brightness (PreviewLightBrightness) | float | 4.000000 | Preview | Wizard preview and piece inspector: the brightness of the scene's sun (the sky gets half). | |
Preview Program (PreviewProgram) | FSoftObjectPath | /RPGSagaEngine/Data/Interiors/Programs/DA_InteriorProgram_Inn.DA_InteriorProgram_Inn | Preview | Wizard preview: the program (rooms) of the sample house and the theme whose furnishings, light and materials it borrows (empty = the first the project has). | |
Preview Seed (PreviewSeed) | int32 | 11 | Preview | ||
Preview Theme (PreviewTheme) | FSoftObjectPath | /RPGSagaEngine/Data/Interiors/Themes/DA_InteriorTheme_Common.DA_InteriorTheme_Common | Preview | ||
Expected Kinds (ExpectedKinds) | TArray<FGameplayTag> | (0 entries) | Review | Kinds a complete kit has; the wizard's Kits step warns about the missing ones. Empty = the built-in list (walls, door and window walls, corner, floor, ceiling, stairs, railing, door leaf). | |
Thumbnail Pool Size (ThumbnailPoolSize) | int32 | 128 | Review | Thumbnails kept by the review table (0 = no thumbnail column). | |
Thumbnail Size (ThumbnailSize) | int32 | 64 | Review | Thumbnail size in the review table (px). | |
Batch Size (BatchSize) | int32 | 64 | Scan | Meshes loaded per batch (one worker task per batch). | |
Garbage Collect Every Batches (GarbageCollectEveryBatches) | int32 | 8 | Scan | Collect garbage every this many batches (loaded meshes are released); 0 = never. | |
Max Batches in Flight (MaxBatchesInFlight) | int32 | 2 | Scan | Batches allowed in flight on workers (memory cap on copied triangles). | |
Read Options (ReadOptions) | FRSEKitMeshReadOptions | (MinProbeTriangles=8,MaxProbeTriangles=100000,bAllowMeshDescription=True,bAllowCollision=True,bAllowBounds=True) | Scan | How triangles are read. | |
Time Slice Ms (TimeSliceMs) | float | 12.000000 | Scan | Game-thread time per editor frame while scanning (ms): the editor stays responsive. | |
Taxonomy (Taxonomy) | TSoftObjectPtr<URSEKitTaxonomy> | None | Taxonomy | How meshes are classified (kinds, words, languages, shape tests). |
RPG Saga Engine: Interiors
Class URSEInteriorSettings (module RSE), Project Settings, Project, RPG Saga Engine. Interiors (D-110, docs/design/free-tactics.md section 17): doors, ladders and the camera inside buildings and dungeons.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Battle Area Margin (BattleAreaMargin) | float | 1.000000 | Battle | A Free Tactics battle that starts inside an Interior Volume captures only the volume (plus this margin, meters) instead of Free Tactics (Presentation) -> Area Size: the rooms, not the whole street. | |
Close Door Text (CloseDoorText) | FText | NSLOCTEXT("RSEInteriors", "CloseDoor", "Close") | Doors | ||
Door Close Sound (DoorCloseSound) | TSoftObjectPtr<USoundBase> | None | Doors | ||
Door Leaf Mesh (DoorLeafMesh) | TSoftObjectPtr<UStaticMesh> | None | Doors | Mesh of a door leaf without its own (scaled to the leaf size; a 1 m cube). Empty = the engine cube. | |
Door Open Sound (DoorOpenSound) | TSoftObjectPtr<USoundBase> | None | Doors | D-150: played when a door without its own sounds swings open / shut (empty = silent). | |
Door Swing Seconds (DoorSwingSeconds) | float | 0.450000 | Doors | Seconds a door takes to swing open or shut (0 = at once). Doors may override it. | |
Locked Door Text (LockedDoorText) | FText | NSLOCTEXT("RSEInteriors", "LockedDoor", "It\'s locked.") | Doors | Said when a locked door is tried. | |
Open Door Text (OpenDoorText) | FText | NSLOCTEXT("RSEInteriors", "OpenDoor", "Open") | Doors | Prompts of doors without their own. | |
Climb Text (ClimbText) | FText | NSLOCTEXT("RSEInteriors", "Climb", "Climb") | Ladders | Prompt of ladders in exploration (the explorer climbs to the other end). | |
Ladder Mesh (LadderMesh) | TSoftObjectPtr<UStaticMesh> | None | Ladders | Mesh of a ladder without its own (scaled between its ends; a 1 m cube). Empty = the engine cube. |
RPG Saga Engine: Inventory Rules
Class URSEInventoryRulesSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Inventory rules (D-143): how the party carries items, in which containers, and who receives what it gains.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Bag (Bag) | FRSEItemContainerDef | (Id="Bag",DisplayName=NSLOCTEXT("RSEInventoryRules", "BagName", "Bag"),Grid=(Width=8,MinHeight=5,MaxHeight=5),Filter=(TagQuery=())) | Containers | Each member's bag: its id (the command and layout key), name, icon and size (8 x 5 by default; bounded). | |
Pending Loot (PendingLoot) | FRSEItemContainerDef | (Id="PendingLoot",DisplayName=NSLOCTEXT("RSEInventoryRules", "PendingName", "Pending Loot"),Grid=(Width=8,MinHeight=5),Filter=(TagQuery=())) | Containers | Loot nobody could carry: shown as its own tab until taken or distributed. Grows. | |
Stash (Stash) | FRSEItemContainerDef | (Id="Stash",DisplayName=NSLOCTEXT("RSEInventoryRules", "StashName", "Stash"),Grid=(Width=8,MinHeight=7,SpareRows=1),Filter=(TagQuery=())) | Containers | The shared stash (large; Max Height 0 = it grows). | |
Stash Access (StashAccess) | ERSEStashAccess | SavePoints | Containers | Where the stash opens. | |
Stash Access Radius (StashAccessRadius) | float | 600.000000 | Containers | How close to a save point / rest place the player must stand for the stash to open (the presentation measures it). | |
Auto Distribute Rule (AutoDistributeRule) | TSoftClassPtr<URSELootDistributionRule> | /Script/RSECore.RSELootRule_Smart | Distribution | The rule of the inventory's Auto-distribute button (re-deals every bag and, when open, the stash). | |
Pickups to Picker in Coop (bPickupsToPickerInCoop) | bool | True | Distribution | Co-op: what a player picks up (chests, pick-ups, shop purchases) goes to that player's member first. | |
Distribution Rule (DistributionRule) | TSoftClassPtr<URSELootDistributionRule> | /Script/RSECore.RSELootRule_Smart | Distribution | Who receives what the party gains (chests, battles, quests, shops, pick-ups). Blueprintable: write your own. | |
Overflow (Overflow) | ERSELootOverflow | PendingLoot | Distribution | When no member has room, the stash takes it if the source stands at a stash point or the stash opens anywhere; otherwise this decides (pending loot by default). Nothing is ever lost. | |
Minimum Upgrade (MinimumUpgrade) | float | 0.001000 | Distribution|Smart | Smart rule: an upgrade must be worth at least this (sum of weighted relative changes) to beat free space. | |
Role Rules (RoleRules) | TArray<FRSELootRoleRule> | (0 entries) | Distribution|Smart | Smart rule: who receives which consumables (ethers to mages). Items no rule matches are balanced among everyone. | |
Stat Weights (StatWeights) | TMap<FGameplayTag,float> | (0 entries) | Distribution|Smart | Smart rule: how much each stat counts when equipment is compared (relative change x weight). Missing stats count 1. | |
Migration (Migration) | ERSEModeMigration | Distribute | Mode | A game played in the Per Character mode for the first time (or after a switch from Shared): what happens to its items. | |
Mode (Mode) | ERSEInventoryMode | Shared | Mode | Shared: one party grid (JRPG, ATB, Tactics). Per Character: a bag per member, a stash, pending loot (live / Free Tactics). | |
Shared Kinds (SharedKinds) | TArray<ERSEItemKind> | (2 entries) | Mode | Item kinds that stay shared in the Per Character mode (story items): they never go into bags. | |
Money Mode (MoneyMode) | ERSEMoneyMode | Shared | Money | --- Money --- | |
Use Weight (bUseWeight) | bool | False | Weight | Items weigh something and each member carries up to a capacity. Off by default. | |
Carry Capacity Base (CarryCapacityBase) | float | 40.000000 | Weight | Capacity every member has. | |
Carry Capacity Per Stat Point (CarryCapacityPerStatPoint) | float | 1.000000 | Weight | Capacity per point of Carry Capacity Stat. | |
Carry Capacity Stat (CarryCapacityStat) | FGameplayTag | () | Weight | The stat that adds capacity (Stat.Strength...). Empty = only the base and equipment. | |
Overweight Rule (OverweightRule) | ERSEOverweightRule | BlockAdding | Weight |
RPG Saga Engine: Inventory UI
Class URSEInventoryUISettings (module RSE), Project Settings, Project, RPG Saga Engine. The grid inventory screen (D-123, docs/design/inventory-grid.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Board (Board) | FRSEInventoryBoardStyle | (CellSize=60.000000,CellGap=3.000000,CornerRadius=4.000000,CellFill=(Token="Primary",Alpha=0.850000,Lightness=-0.309568,Chroma=0.498216,Hue=4.227151,Override=(R... | Board | ||
Menu Height (MenuHeight) | float | 860.000000 | Layout | ||
Menu Width (MenuWidth) | float | 1500.000000 | Layout | Party menu window size while the grid page shows (the grid needs more room than the lists). | |
Party Card Width (PartyCardWidth) | float | 210.000000 | Layout | Width of one party strip card. | |
Party Portrait Size (PartyPortraitSize) | float | 44.000000 | Layout | Portrait on the party strip cards (0 = none). | |
Stats Panel Width (StatsPanelWidth) | float | 280.000000 | Layout | Width of the stats panel right of the board. | |
Tooltip Width (TooltipWidth) | float | 330.000000 | Layout | Width of the item tooltip. | |
Visible Rows (VisibleRows) | int32 | 8 | Layout | Grid rows shown before the grid scrolls. | |
Body Anchors (BodyAnchors) | TArray<FRSEPaperdollAnchor> | (9 entries) | Paperdoll | Body parts on the figure area (D-126): where slots of each body part are placed and their connectors end. | |
Default Slot Size (DefaultSlotSize) | FVector2D | (X=1.100000,Y=1.100000) | Paperdoll | ||
Figure Image (FigureImage) | TSoftObjectPtr<UTexture2D> | None | Paperdoll | Shown on the figure area when the character has neither a live preview nor a portrait. Empty = nothing. | |
Paperdoll Size (PaperdollSize) | FIntPoint | (X=7,Y=8) | Paperdoll | Size of the paperdoll area, in cells. | |
Paperdoll Slots (PaperdollSlots) | TArray<FRSEPaperdollSlotLayout> | (9 entries) | Paperdoll | Placement of the equipment slots (body part anchor + offset, or a fixed position) and their sizes. Slots of Items -> Equipment Slots not listed here are placed from their body part (beside the figure, on the side of the anchor), or down the edges of the paperdoll without one, at Default Slot Size. | |
Portrait Position (PortraitPosition) | FVector2D | (X=1.350000,Y=1.300000) | Paperdoll | The figure area (the live 3D preview, else the portrait, else the fallback figure), in cells of the paperdoll. | |
Portrait Size (PortraitSize) | FVector2D | (X=4.300000,Y=6.700000) | Paperdoll | ||
Action Portrait Size (ActionPortraitSize) | float | 28.000000 | Per Character | Portrait beside each "Give to" entry of the action menu. | |
Capacity Color (CapacityColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.057774,Chroma=2.643006,Hue=-31.508739,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Per Character | Colors of the capacity line: normal and over capacity / full. | |
Over Capacity Color (OverCapacityColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.006601,Chroma=0.942214,Hue=0.319182,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Per Character | ||
Live Preview (bLivePreview) | bool | True | Preview | The selected character in 3D on the paperdoll, wearing its equipment (weapons and accessories on sockets, armor on modular bodies). Off, or RSE.Inventory.LivePreview 0 = the portrait. | |
Preview Backdrop Color (PreviewBackdropColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.348259,Chroma=0.363512,Hue=9.359602,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Preview | Behind the character (match the paperdoll panel: the edges fade into it). | |
Preview Capture Rate (PreviewCaptureRate) | float | 30.000000 | Preview | Captures per second while the preview is on screen (the idle animation). 0 = only when something changes (equipment, turning, zoom): a still pose. RSE.Inventory.PreviewRate overrides it (the Steam Deck profile: 15). | |
Preview Class (PreviewClass) | TSoftClassPtr<URSEPaperdollPreview> | None | Preview | Who makes the picture: a Blueprint or C++ class derived from RSEPaperdollPreview. Empty = the scene capture preview. | |
Preview Drag Degrees (PreviewDragDegrees) | float | 0.600000 | Preview | Turning by dragging the figure: degrees per screen unit. | |
Preview Framing (PreviewFraming) | FName | Paperdoll | Preview | Framing of the preview (Project Settings -> Portraits -> Framings). The plugin's "Paperdoll" preset fits every character head to feet with its hat and held weapon (Fit Head Top, Fit Whole Look), with room under the helmet slot. | |
Preview Light Rig (PreviewLightRig) | FName | Studio | Preview | Lighting of the preview (Project Settings -> Portraits -> Light Rigs). | |
Preview Resolution (PreviewResolution) | FIntPoint | (X=360,Y=560) | Preview | Render target size (match the figure area's aspect). RSE.Inventory.PreviewScale scales it (the Steam Deck profile: 0.75). | |
Preview Scene Location (PreviewSceneLocation) | FVector | (X=0.000000,Y=40000.000000,Z=-60000.000000) | Preview | Where the preview scene stands in the world: far from the playable space and from the dialog portrait scene. | |
Preview Start Zoom (PreviewStartZoom) | float | 0.850000 | Preview | The zoom the preview opens at (D-128): below 1 shows the figure a bit smaller in its frame, with air around it. Clamped to Preview Zoom Range. | |
Preview Stick Dead Zone (PreviewStickDeadZone) | float | 0.200000 | Preview | Stick tilt ignored before it turns or zooms the preview. | |
Preview Stick Degrees Per Second (PreviewStickDegreesPerSecond) | float | 200.000000 | Preview | Turning with the right stick: degrees per second at full tilt. | |
Preview Stick Zoom Per Second (PreviewStickZoomPerSecond) | float | 0.600000 | Preview | Zoom per second with the right stick (up / down) at full tilt. | |
Preview Zoom Range (PreviewZoomRange) | FVector2D | (X=0.700000,Y=2.200000) | Preview | Zoom range (1 = the framing; below 1 = wider, the figure smaller) and the step of one mouse wheel notch. | |
Preview Zoom Step (PreviewZoomStep) | float | 0.150000 | Preview | ||
Default Style (DefaultStyle) | ERSEInventoryScreenStyle | Grid | Style | The product default; players can change it in Options -> Game -> Inventory. | |
Screen Widget Class (ScreenWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Style | The grid page of the party menu. Empty = the built-in RSEInventoryScreenWidget. A Widget Blueprint derived from RSEScreenWidget receives the party menu's RSEPartyMenuViewModel and can create a RSEInventoryViewModel. | |
Cancel Action Text (CancelActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Cancel", "Cancel") | Texts | ||
Combine Action Text (CombineActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Combine", "Combine") | Texts | ||
Combine Prompt Text (CombinePromptText) | FText | NSLOCTEXT("RSEInventoryUI", "CombinePrompt", "Choose the item to combine with {Item}.") | Texts | Combining: pick the second key item. | |
Compare for Format (CompareForFormat) | FText | NSLOCTEXT("RSEInventoryUI", "CompareFor", "For {Character}:") | Texts | Tooltip: the stat comparison is for {Character}. | |
Discard Action Text (DiscardActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Discard", "Discard") | Texts | ||
Equip Action Text (EquipActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Equip", "Equip") | Texts | --- Texts --- | |
Equipped Format (EquippedFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Equipped", "{Character} equips {Item}.") | Texts | Messages after commands. {Item} {Character} {Slot}. | |
In Battle Text (InBattleText) | FText | NSLOCTEXT("RSEInventoryUI", "InBattle", "The inventory cannot change during a battle.") | Texts | ||
Locked Text (LockedText) | FText | NSLOCTEXT("RSEInventoryUI", "Locked", "Fixed equipment (guest)") | Texts | Guests' slots (D-011). | |
Move Action Text (MoveActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Move", "Move") | Texts | ||
No Room Text (NoRoomText) | FText | NSLOCTEXT("RSEInventoryUI", "NoRoom", "There is no room there.") | Texts | ||
Not Allowed Text (NotAllowedText) | FText | NSLOCTEXT("RSEInventoryUI", "NotAllowed", "You may not change this.") | Texts | ||
Place Prompt Text (PlacePromptText) | FText | NSLOCTEXT("RSEInventoryUI", "PlacePrompt", "Choose where to put {Item}.") | Texts | Move mode: place the held item. | |
Read Action Text (ReadActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Read", "Read") | Texts | ||
Replaces Format (ReplacesFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Replaces", "Replaces: {Item}") | Texts | Tooltip: the item the comparison replaces. {Item}. | |
Size Format (SizeFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Size", "{Width}x{Height} x{Count}") | Texts | Tooltip: size and count. {Width} {Height} {Count}. | |
Size Only Format (SizeOnlyFormat) | FText | NSLOCTEXT("RSEInventoryUI", "SizeOnly", "{Width}x{Height}") | Texts | Tooltip of a worn item (none in the inventory): size only. {Width} {Height}. | |
Slot Format (SlotFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Slot", "Slot: {Slot}") | Texts | Tooltip: the slot it goes into. {Slot}. | |
Sort Action Text (SortActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Sort", "Sort") | Texts | ||
Sorted Text (SortedText) | FText | NSLOCTEXT("RSEInventoryUI", "Sorted", "Sorted.") | Texts | ||
Stats Title (StatsTitle) | FText | NSLOCTEXT("RSEInventoryUI", "StatsTitle", "Stats") | Texts | ||
Unequip Action Text (UnequipActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Unequip", "Unequip") | Texts | ||
Unequipped Format (UnequippedFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Unequipped", "{Item} back in the inventory.") | Texts | ||
Use Action Text (UseActionText) | FText | NSLOCTEXT("RSEInventoryUI", "Use", "Use") | Texts | ||
Use on Format (UseOnFormat) | FText | NSLOCTEXT("RSEInventoryUI", "UseOn", "Use on {Target}") | Texts | {Target}: the object the player stands at. | |
Auto Distribute Confirm Text (AutoDistributeConfirmText) | FText | NSLOCTEXT("RSEInventoryUI", "AutoDistributeConfirm", "Deal every bag again by the Smart rule?") | Texts|Per Character | ||
Auto Distributed Text (AutoDistributedText) | FText | NSLOCTEXT("RSEInventoryUI", "AutoDistributed", "The bags were dealt again.") | Texts|Per Character | ||
Auto Distribute Text (AutoDistributeText) | FText | NSLOCTEXT("RSEInventoryUI", "AutoDistribute", "Auto-distribute") | Texts|Per Character | The tab-row button and its confirmation. | |
Bag Tab Format (BagTabFormat) | FText | NSLOCTEXT("RSEInventoryUI", "BagTab", "{Bag}: {Member}") | Texts|Per Character | The bag tab of the selected member. {Member}, {Bag} (Inventory Rules -> Bag name). | |
Capacity Format (CapacityFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Capacity", "{Used}/{Total}") | Texts|Per Character | The bag's capacity under the tabs. {Used} {Total}. | |
Container Full Text (ContainerFullText) | FText | NSLOCTEXT("RSEInventoryUI", "ContainerFull", "There is no room in that bag.") | Texts|Per Character | ||
Gave Format (GaveFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Gave", "{Item} → {Member}") | Texts|Per Character | After a give / take / send. {Item} {Member} (the receiver; the stash's name when sent there). | |
Give to Format (GiveToFormat) | FText | NSLOCTEXT("RSEInventoryUI", "GiveTo", "Give to {Member}") | Texts|Per Character | Action: give the item to another member. {Member}. | |
Pending Hint Text (PendingHintText) | FText | NSLOCTEXT("RSEInventoryUI", "PendingHint", "Loot nobody could carry. Take it or give it to someone.") | Texts|Per Character | Shown above the pending loot grid. | |
Send to Stash Text (SendToStashText) | FText | NSLOCTEXT("RSEInventoryUI", "SendToStash", "Send to stash") | Texts|Per Character | ||
Stash Unavailable Text (StashUnavailableText) | FText | NSLOCTEXT("RSEInventoryUI", "StashUnavailable", "The stash opens only at a save point.") | Texts|Per Character | ||
Take Format (TakeFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Take", "Take ({Member})") | Texts|Per Character | Action: take the item from the stash or the pending loot into the selected member's bag. {Member}. | |
Used Cells Format (UsedCellsFormat) | FText | NSLOCTEXT("RSEInventoryUI", "UsedCells", "Cells used: {Used}") | Texts|Per Character | A container that grows (the stash, the pending loot). {Used}. | |
Weight Format (WeightFormat) | FText | NSLOCTEXT("RSEInventoryUI", "Weight", "{Weight}/{Capacity} kg") | Texts|Per Character | Weight (Inventory Rules -> Use Weight). {Weight} {Capacity}. | |
Wrong Mode Text (WrongModeText) | FText | NSLOCTEXT("RSEInventoryUI", "WrongMode", "Not in this inventory mode.") | Texts|Per Character |
RPG Saga Engine: Items
Class URSEItemSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Item and equipment rules.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Equipment Slots (EquipmentSlots) | TArray<FRSEEquipmentSlotDef> | (9 entries) | Equipment | Character equipment slots, in display order (D-024). | |
Off Hand Slot Id (OffHandSlotId) | FName | OffHand | Equipment | Slot a two-handed weapon also occupies. | |
Allow Discard (bAllowDiscard) | bool | False | Grid Inventory | The player may discard consumables and equipment from the inventory (the Discard command). Key items and documents can never be discarded. Off by default: classic JRPGs do not drop items. | |
Max Item Grid Size (MaxItemGridSize) | FIntPoint | (X=4,Y=4) | Grid Inventory | Largest Grid Size an item may have (data validation). | |
Permission Policy Class (PermissionPolicyClass) | TSoftClassPtr<URSEInventoryPermissionPolicy> | None | Grid Inventory | Who may change what through inventory commands (co-op, D-094 / D-124): a Blueprint or C++ class derived from RSEInventoryPermissionPolicy. Empty = everyone may do everything (single player; the host decides later). | |
Sort Order (SortOrder) | TArray<ERSEItemSortKey> | (5 entries) | Grid Inventory | Auto-sort order: the first key decides, the next ones break ties. | |
Stash Tabs (StashTabs) | TArray<FRSEItemContainerDef> | (3 entries) | Grid Inventory | Tabs of the party's stash in grid inventories, each a grid container. An item shows in the first tab whose filter accepts it (the first tab when none does), so every item always has a place. | |
Default Rarity (DefaultRarity) | FGameplayTag | (TagName="Item.Rarity.Common") | Grid Inventory|Rarity | ||
Rarity Tiers (RarityTiers) | TArray<FRSEItemRarityTier> | (5 entries) | Grid Inventory|Rarity | Rarity tiers (name, color, rank). Items without a rarity use Default Rarity. | |
Default Max Stack (DefaultMaxStack) | int32 | 99 | Inventory | Stack limit for items that do not set their own. | |
Starting Items (StartingItems) | TMap<TSoftObjectPtr<URSEItemData> ,int32> | (15 entries) | Inventory | Items in the inventory when a new game starts. |
RPG Saga Engine: Level Tools
Class URSELevelToolsSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Level tools of D-062 (docs/design/encounter-editor.md): the encounter layout editor mode, the character preview actor and the gallery map builder.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Blast Color (BlastColor) | FLinearColor | (R=1.000000,G=0.500000,B=0.000000,A=0.300000) | Encounter Layout|Colors | Tiles an explosive field object would hit (shown for the selected object), tinted by the zone it leaves when it has one. | |
Blocked Color (BlockedColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=0.450000) | Encounter Layout|Colors | Unwalkable tiles. | |
Deployment Color (DeploymentColor) | FLinearColor | (R=0.150000,G=0.450000,B=1.000000,A=0.450000) | Encounter Layout|Colors | Tiles where the player deploys (the encounter's Deployment Tiles). | |
Enemy Color (EnemyColor) | FLinearColor | (R=1.000000,G=0.250000,B=0.200000,A=0.400000) | Encounter Layout|Colors | Tile of an enemy. | |
Field Object Color (FieldObjectColor) | FLinearColor | (R=0.800000,G=0.600000,B=0.300000,A=0.400000) | Encounter Layout|Colors | Tile of a field object (its own color is used for the box). | |
Grid Line Color (GridLineColor) | FLinearColor | (R=0.080000,G=0.080000,B=0.100000,A=1.000000) | Encounter Layout|Colors | Outline of every tile of the zone. | |
Hover Invalid Color (HoverInvalidColor) | FLinearColor | (R=1.000000,G=0.000000,B=0.000000,A=0.500000) | Encounter Layout|Colors | Tile under the cursor when the action is refused there (blocked, occupied, outside). | |
Hover Valid Color (HoverValidColor) | FLinearColor | (R=0.200000,G=1.000000,B=0.350000,A=0.500000) | Encounter Layout|Colors | Tile under the cursor when the action is allowed there. | |
Issue Color (IssueColor) | FLinearColor | (R=1.000000,G=0.000000,B=0.600000,A=0.600000) | Encounter Layout|Colors | Tiles with a validation problem (overlap, unwalkable...). | |
Row Color (RowColor) | FLinearColor | (R=0.600000,G=0.600000,B=1.000000,A=0.350000) | Encounter Layout|Colors | ATB stage: the rows of the enemy side. | |
Selection Color (SelectionColor) | FLinearColor | (R=1.000000,G=0.900000,B=0.100000,A=1.000000) | Encounter Layout|Colors | The selected element's outline. | |
ATBPick Radius (ATBPickRadius) | float | 80.000000 | Encounter Layout|Drawing | ATB stage: distance around a slot that counts as a click on its unit. | |
Show Appearance (bShowAppearance) | bool | True | Encounter Layout|Drawing | Enemy markers use the character's appearance (else only the placeholder shape). | |
Show Labels (bShowLabels) | bool | True | Encounter Layout|Drawing | Name and level labels above the enemies, names above field objects. | |
Label Height (LabelHeight) | float | 220.000000 | Encounter Layout|Drawing | Height of the labels above the tile. | |
Surface Offset (SurfaceOffset) | float | 3.000000 | Encounter Layout|Drawing | Height of the drawn tiles above the surface (avoids flicker with the floor). | |
Tile Fill (TileFill) | float | 0.900000 | Encounter Layout|Drawing | Drawn tile size as a fraction of the tile (a gap shows the grid). | |
Validate on Change (bValidateOnChange) | bool | True | Encounter Layout|Editing | Validate the layout after every edit (the Issues list and the tile markers). | |
Max Brush Radius (MaxBrushRadius) | int32 | 6 | Encounter Layout|Editing | Largest radius of the deployment brush (0 = one tile). | |
Delete Key (DeleteKey) | FKey | Delete | Encounter Layout|Keys | Deletes the selected enemy or field object. | |
Rotate Clockwise Key (RotateClockwiseKey) | FKey | E | Encounter Layout|Keys | Rotates the selected enemy clockwise (Tactics facing). | |
Rotate Counter Clockwise Key (RotateCounterClockwiseKey) | FKey | Q | Encounter Layout|Keys | Rotates the selected enemy counter-clockwise. | |
Toggle Row Key (ToggleRowKey) | FKey | R | Encounter Layout|Keys | ATB: moves the selected enemy to the other row. | |
Content Root (ContentRoot) | FDirectoryPath | (Path="/Game") | Gallery | Only content under this path goes on display ("/Game" = the whole project). | |
Excluded Paths (ExcludedPaths) | TArray<FDirectoryPath> | (2 entries) | Gallery | Content paths left out (test and dev data). | |
Floor Mesh (FloorMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Gallery | Floor of the gallery map (scaled to cover every row). | |
Game Mode (GameMode) | TSoftClassPtr<AGameModeBase> | /Script/RSE.RSEExplorationGameMode | Gallery | Game mode of the gallery map (the player walks between the stations). | |
Label World Size (LabelWorldSize) | float | 28.000000 | Gallery | Size of the label text panels. | |
Max Ability Pads (MaxAbilityPads) | int32 | 0 | Gallery | Most ability pads (0 = every ability). | |
Pad Mesh (PadMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cylinder.Cylinder | Gallery | Pad under each ability demo. Empty = none. | |
Pad Scale (PadScale) | FVector | (X=2.500000,Y=2.500000,Z=0.050000) | Gallery | Scale of the pad mesh. | |
Pedestal Mesh (PedestalMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Gallery | Pedestal shown under field objects and class stations. | |
Row Spacing (RowSpacing) | float | 900.000000 | Gallery | Distance between two rows (characters, classes, abilities, field objects, world actors). | |
Station Spacing (StationSpacing) | float | 350.000000 | Gallery | Distance between two stations of a row. | |
Stations Per Line (StationsPerLine) | int32 | 12 | Gallery | Stations per row before a new line starts. |
RPG Saga Engine: Living NPCs
Class URSENPCSettings (module RSE), Project Settings, Project, RPG Saga Engine. Living NPCs in the world (D-104, docs/product/living-npcs.md): how they walk, pause, look around, make way for the player, stop to talk, sleep far from the player and show their activities.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Activity Animations (ActivityAnimations) | TMap<FGameplayTag,FRSECharacterAnim> | (0 entries) | Activities | Looping animations of the activities (NPC.Activity.Work -> hammering, NPC.Activity.Sit -> sitting) on characters built with an RSE anim set, while the NPC stays at its place. Missing = the locomotion idle. | |
Activity Blend Out (ActivityBlendOut) | float | 0.250000 | Activities | Blend out of an activity animation when the NPC starts walking or talking. | |
Activity Idle Slots (ActivityIdleSlots) | TMap<FGameplayTag,FGameplayTag> | (3 entries) | Activities | D-153: an activity can play an idle slot of the NPC's own animation set instead (NPC.Activity.Chat -> Idle.Anim.Chat, NPC.Activity.Sit -> Idle.Anim.Sit): the same slots the party's idle life uses, filled by the Animation & FX Library for any skeleton. Tried first; an NPC whose set has no clip for the slot falls back to Activity Animations. | |
Appear Distance (AppearDistance) | float | 3000.000000 | Arriving | When the hour changes, an NPC walks to its next place, unless where it is and where it goes are both farther than this from the player: then it appears there (nobody sees it). Time skips and sleeping NPCs always appear. 0 = always walk. | |
Max Walk Seconds (MaxWalkSeconds) | float | 90.000000 | Arriving | A walk that takes longer than this (stuck, blocked) ends with the NPC appearing at its place. 0 = never. | |
Chat Ends when Focused (bChatEndsWhenFocused) | bool | True | Chats | The talk is interrupted when the player comes closer than this to either NPC and looks at it (its prompt shows). Off: it goes on. | |
Chat Line Gap (ChatLineGap) | FVector2D | (X=2.400000,Y=4.200000) | Chats | Seconds between two lines of a talk between NPCs (random between the two). | |
Idle Life Seed (IdleLifeSeed) | int32 | 1729 | Idle Life | Seed of the idle life's random choices (the NPC's id is mixed in): the same level plays the same way. | |
Look Around Angle (LookAroundAngle) | float | 70.000000 | Looking Around | Largest look-around turn either way. | |
Look Around Chance (LookAroundChance) | float | 0.500000 | Looking Around | Chance to look around at each pause (turn a little, then back). | |
Acceptance Radius (AcceptanceRadius) | float | 30.000000 | Moving | A point counts as reached within this distance. | |
Snap to Ground (bSnapToGround) | bool | True | Moving | NPCs that are not pawns keep their feet on the ground with a trace down (the Visibility channel). | |
Use Navigation (bUseNavigation) | bool | True | Moving | Walks follow the navigation mesh when the level has one; without it (or off) they walk straight. | |
Default Wander Radius (DefaultWanderRadius) | float | 500.000000 | Moving | Wander: default distance from the place (an activity or a place may set its own). | |
Ground Trace Height (GroundTraceHeight) | float | 120.000000 | Moving | Height of the ground trace above and below the feet. | |
Pause Max (PauseMax) | float | 6.000000 | Moving | ||
Pause Min (PauseMin) | float | 2.000000 | Moving | Pause at a wander point or a route stop without its own pause (random between the two). | |
Turn Rate (TurnRate) | float | 360.000000 | Moving | How fast they turn toward where they walk. | |
Walk Speed (WalkSpeed) | float | 140.000000 | Moving | Walking speed (an NPC may set its own; an activity scales it). | |
Face Player when Talking (bFacePlayerWhenTalking) | bool | True | Player | It turns to face the player when a conversation starts (NPCs that are not RSE NPC actors; those have their own setting). | |
Stop when Focused (bStopWhenFocused) | bool | True | Player | It stops walking while the player looks at it (its talk prompt is shown), so the player can talk. | |
Make Way Distance (MakeWayDistance) | float | 160.000000 | Player | A walking NPC with the player this close ahead makes way: it stops and steps aside. | |
Make Way Step (MakeWayStep) | float | 110.000000 | Player | How far it steps aside. | |
Resume Delay (ResumeDelay) | float | 1.200000 | Player | After a conversation, it waits this long before going on. | |
Assault Noise Radius (AssaultNoiseRadius) | float | 1500.000000 | Reactions | ||
Assault Is Crime (bAssaultIsCrime) | bool | True | Reactions | A battle begun against a living NPC (the party attacked it) is a crime of assault, heard this far (cm). | |
Guards Detect Crimes (bGuardsDetectCrimes) | bool | True | Reactions | Guards (reactions with Crime rules) notice crimes: theft, trespass, assault, and the Report Crime effect. Off = nobody answers crimes. | |
React to Battles (bReactToBattles) | bool | True | Reactions | NPCs react to a battle on the live map (flee, watch, cower, help: their Reaction data). Off = they go on with their day as if nothing happened (before D-173 they froze). | |
Theft Is Crime (bTheftIsCrime) | bool | True | Reactions | A thief who stole from an NPC is a crime of theft (NPC.Crime.Theft), seen or heard by guards. | |
Default Reaction (DefaultReaction) | TSoftObjectPtr<URSENPCReactionData> | None | Reactions | The reaction of NPCs whose schedule and component name none (a civilian who watches from a distance by default). Empty = the defaults of the Reaction Data class: watch from 11 m, within 22 m of the fight. | |
Theft Noise Radius (TheftNoiseRadius) | float | 0.000000 | Reactions | How far a theft is heard (cm) by guards who do not see it: 0 = only seen. | |
Activation Check Interval (ActivationCheckInterval) | float | 0.750000 | Updates | How often the NPCs' distance to the player is checked (sleep / wake), in one batch for the whole level. | |
Offscreen Seconds (OffscreenSeconds) | float | 2.000000 | Updates | Seconds without being rendered that count as "off screen". | |
Offscreen Sleep Distance (OffscreenSleepDistance) | float | 2500.000000 | Updates | NPCs off screen for a while and farther than this also sleep (0 = only by distance). | |
Sleep Distance (SleepDistance) | float | 6000.000000 | Updates | NPCs farther than this from the player sleep: no thinking, no walking (Steam Deck budget). 0 = never sleep. | |
Think Interval (ThinkInterval) | float | 0.250000 | Updates | How often a living NPC decides what to do (next wander point, route stop, making way). No per-frame tick while standing. |
RPG Saga Engine: Living World
Class URSELivingWorldSettings (module RSE), Project Settings, Project, RPG Saga Engine. Project Settings -> RPG Saga Engine -> Living World (D-157): how interactables show themselves (a highlight when near, a hint from farther, a sparkle on valuables, card players marked among NPCs), the strike that breaks objects, the effects of hazards and world reactions.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Caravan Skip Snap Hours (CaravanSkipSnapHours) | float | 0.500000 | Caravans | A clock skip at least this long puts caravans where the clock says at once (game hours); shorter ones they walk. | |
Caravan Smooth Distance (CaravanSmoothDistance) | float | 6000.000000 | Caravans | A caravan this near a player moves every frame (cm). | |
Caravan Snap Distance (CaravanSnapDistance) | float | 3000.000000 | Caravans | Farther behind its timetable than this, it jumps there while nobody sees it (cm). | |
Caravan Update Interval (CaravanUpdateInterval) | float | 1.000000 | Caravans | How often a caravan far from the players updates its place (s). | |
Caravan Walk Speed (CaravanWalkSpeed) | float | 140.000000 | Caravans | Its walking speed when it catches up after a halt (cm/s, times the data's Catch Up Multiplier). | |
Hazard Fx (HazardFx) | TMap<FGameplayTag,FRSEWorldFx> | (4 entries) | Effects | What a broken object's hazard looks like (Interactable.Hazard.*). | |
Hurt Color (HurtColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.016834,Chroma=0.914864,Hue=7.362913,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Effects | A member hurt by a hazard: the notification color. | |
Reaction Fx (ReactionFx) | TMap<FGameplayTag,FRSEWorldFx> | (6 entries) | Effects | What a world reaction looks like (World.Reaction.Fx.*). | |
Hints Avoid Overlap (bHintsAvoidOverlap) | bool | True | Hints | Hints of objects close together stack upward instead of drawing over each other. | |
Challenger Color (ChallengerColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.066506,Chroma=0.653430,Hue=-3.701602,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Hints | ||
Challenger Distance (ChallengerDistance) | float | 2000.000000 | Hints | ||
Challenger Head Socket (ChallengerHeadSocket) | FName | head | Hints | Socket or bone of the NPC's body mesh the mark floats over. Missing on the mesh = the top of the NPC's visible bounds. | |
Challenger Height (ChallengerHeight) | float | 35.000000 | Hints | Over the top of the NPC's head (cm): the Challenger Head Socket of its body mesh, else the top of its visible bounds. | |
Challenger Mark (ChallengerMark) | FText | INVTEXT("♠") | Hints | NPCs who play cards wear this mark over their heads (a short glyph) within Challenger Distance. | |
Hint Background (HintBackground) | FRSEUIColor | (Token="Primary",Alpha=0.600000,Lightness=-0.327827,Chroma=0.363428,Hue=8.707818,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Hints | ||
Hint Font Size (HintFontSize) | int32 | 13 | Hints | ||
Hint Format (HintFormat) | FText | NSLOCTEXT("RSELivingWorld", "HintFormat", "{Name} · {Action}") | Hints | A hint: {Name}, {Action}. | |
Hint Height (HintHeight) | float | 40.000000 | Hints | Height of the hint above the object's top (cm). | |
Hint Stack Gap (HintStackGap) | float | 3.000000 | Hints | Gap between stacked hints (screen units). | |
Hint Stack Max Steps (HintStackMaxSteps) | int32 | 6 | Hints | The most moves a hint makes to find a free place (the rest of a crowd overlaps; the farthest hints are the first to give way). | |
Hints ZOrder (HintsZOrder) | int32 | 4 | Hints | ||
Hint Text Color (HintTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.001490,Chroma=4.197116,Hue=169.197342,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Hints | ||
Debris Mesh (DebrisMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Strike | The engine mesh thrown as debris. | |
Debris Seconds (DebrisSeconds) | float | 1.400000 | Strike | ||
Default Interact Anims (DefaultInteractAnims) | TMap<FGameplayTag,FRSECharacterAnim> | (0 entries) | Strike | Interaction slots (Interact.Anim.*) of characters whose anim set has none: the strike that breaks objects. | |
Procedural Lunge Distance (ProceduralLungeDistance) | float | 35.000000 | Strike | Without any clip: the body lunges this far toward the object and back (cm). | |
Strike Impact Seconds (StrikeImpactSeconds) | float | 0.300000 | Strike | The object breaks this long after the strike starts (s): the blow lands. | |
Enabled (bEnabled) | bool | True | Visibility | Interactables show themselves before use (highlight, hints, sparkles). Off = only the prompt in reach, as before. | |
Check Interval (CheckInterval) | float | 0.200000 | Visibility | How often the nearby objects are checked (s). | |
Default Highlight Color (DefaultHighlightColor) | FLinearColor | (R=1.000000,G=0.850000,B=0.450000,A=1.000000) | Visibility | ||
Highlight Color Parameter (HighlightColorParameter) | FName | Color | Visibility | ||
Highlight Distance (HighlightDistance) | float | 500.000000 | Visibility | Objects this near the player get the highlight (cm). | |
Highlight Material (HighlightMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/LivingWorld/M_RSE_InteractHighlight.M_RSE_InteractHighlight | Visibility | The highlight: an overlay material over the object's meshes (a rim glow); its Color Parameter takes the kind's color. | |
Hint Distance (HintDistance) | float | 1000.000000 | Visibility | Objects this near show their name and action over them (cm; a kind's Hint Distance wins). | |
Kind Colors (KindColors) | TMap<FGameplayTag,FLinearColor> | (5 entries) | Visibility | The highlight's color per kind (Interactable.Kind.*; the closest parent tag counts). | |
Max Hints (MaxHints) | int32 | 5 | Visibility | At most this many hints at once (the nearest). | |
Sparkle Distance (SparkleDistance) | float | 3000.000000 | Visibility | Sparkles show only this near the player (cm; 0 = always). | |
Sparkle Height (SparkleHeight) | float | 25.000000 | Visibility | Above the top of the object (cm). | |
Sparkle Material (SparkleMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/LivingWorld/M_RSE_Sparkle.M_RSE_Sparkle | Visibility | The sparkle of valuables: a small camera-facing sprite with this material (or a Niagara system, which wins). | |
Sparkle Niagara (SparkleNiagara) | TSoftObjectPtr<UNiagaraSystem> | None | Visibility | ||
Sparkle Size (SparkleSize) | float | 36.000000 | Visibility |
RPG Saga Engine: Map & Minimap
Class URSEMapSettings (module RSE), Project Settings, Project, RPG Saga Engine. Area map and minimap (D-089).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Area Map Backdrop (AreaMapBackdrop) | FRSEUIColor | (Token="Primary",Alpha=0.900000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Area Map | Background of the area map screen around the map. | |
Area Map Size (AreaMapSize) | float | 760.000000 | Area Map | Side of the square map view on the area map screen, in pixels at 1080p (smaller screens scale the window down). | |
Area Map View Height (AreaMapViewHeight) | float | 760.000000 | Area Map | ||
Area Map View Width (AreaMapViewWidth) | float | 1300.000000 | Area Map | The map view on the area map screen, in pixels at 1080p (D-092): a wide view that fills the screen. 0 = the square Area Map Size. Smaller screens scale the window down. | |
Area Map Widget Class (AreaMapWidgetClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSEAreaMapWidget | Area Map | Full area map screen (D-052). Empty = the built-in screen; a Widget Blueprint derived from RSEScreenWidget receives a RSEAreaMapViewModel. | |
Area Map ZOrder (AreaMapZOrder) | int32 | 60 | Area Map | ||
Area Map in Party Menu (bAreaMapInPartyMenu) | bool | True | Area Map | D-148: the area map is a tab of the party menu (Map), like the other pages: the Map key opens the menu on it, the journal's "Show on map" moves to it. Off (or a game without the built-in party menu) = the area map screen of D-089 on its own. | |
Fit Playable Area (bFitPlayableArea) | bool | True | Area Map | At zoom 1 the view fits the playable area (not the whole picture), and panning stays near it. | |
Open on Player (bOpenOnPlayer) | bool | True | Area Map | The area map opens centered on the player (else on the whole map). | |
Show Region Names (bShowRegionNames) | bool | True | Area Map | ||
Center Keys (CenterKeys) | TArray<FKey> | (2 entries) | Area Map | Center the view on the player. | |
Legend Keys (LegendKeys) | TArray<FKey> | (2 entries) | Area Map | Keys of the area map beyond the menu keys: show / hide the legend filters (gamepad: move into the legend). | |
Legend Width (LegendWidth) | float | 260.000000 | Area Map | Width of the legend column in pixels. | |
Major Region Label Size (MajorRegionLabelSize) | int32 | 24 | Area Map | ||
Max Zoom (MaxZoom) | float | 6.000000 | Area Map | Zoom range of the area map (1 = the whole map fits the view). | |
Menu Tab Zoom Prompt Keys (MenuTabZoomPromptKeys) | TArray<FKey> | (2 entries) | Area Map | D-148: the keys the Map tab's hint shows for zooming (the camera zoom input's: the wheel, the gamepad's triggers). | |
Minor Region Label Size (MinorRegionLabelSize) | int32 | 13 | Area Map | Region names by importance (Minor, Normal, Major): size at zoom 1 (theme display font). | |
Minor Region Label Zoom (MinorRegionLabelZoom) | float | 1.800000 | Area Map | Minor region names show from this zoom. | |
Open Zoom (OpenZoom) | float | 1.000000 | Area Map | Zoom the area map opens at (1 = the playable area fits the view). | |
Pan Step (PanStep) | float | 0.120000 | Area Map | Share of the visible map one D-pad / arrow press pans. | |
Pin Wheel Back Prompt Keys (PinWheelBackPromptKeys) | TArray<FKey> | (3 entries) | Area Map | D-152: the keys the pin wheel names to back out (those of the device in use; a click outside the slices cancels too). | |
Player Arrow Icon (PlayerArrowIcon) | TSoftObjectPtr<UTexture2D> | None | Area Map | Optional arrow icon (points up); empty = a drawn triangle. | |
Player Arrow Size (PlayerArrowSize) | float | 22.000000 | Area Map | Player arrow size in pixels on the area map. | |
Player Color (PlayerColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.044895,Chroma=0.961445,Hue=11.376876,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Area Map | ||
Region Label Color (RegionLabelColor) | FRSEUIColor | (Token="Text",Alpha=0.950000,Lightness=0.012879,Chroma=4.664923,Hue=165.714676,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Area Map | ||
Region Label Outline (RegionLabelOutline) | FRSEUIColor | (Token="Primary",Alpha=0.850000,Lightness=-0.277798,Chroma=0.166567,Hue=167.457993,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Area Map | Outline of region names (dark, for contrast on any ground). | |
Region Label Outline Size (RegionLabelOutlineSize) | int32 | 2 | Area Map | ||
Region Label Size (RegionLabelSize) | int32 | 14 | Area Map | Region name size (theme display font) at zoom 1; it grows a little as the player zooms in. | |
Zoom Step (ZoomStep) | float | 1.400000 | Area Map | Zoom factor of one wheel notch or one tab press. | |
Compass North from Map (bCompassNorthFromMap) | bool | True | Compass | North on the compass is the map's north (else the world's +X). | |
Compass Pin Objective to Edge (bCompassPinObjectiveToEdge) | bool | True | Compass | The tracked objective stays at the bar's edge with an arrow when it is behind the player. | |
Compass Show Distance (bCompassShowDistance) | bool | True | Compass | Distance in meters under the tracked objective and pins. | |
Show Compass (bShowCompass) | bool | True | Compass | The compass at the top of the screen: cardinal points, the tracked objective, pins and important places (players can turn it off). | |
Compass Background (CompassBackground) | FRSEUIColor | (Token="Primary",Alpha=0.550000,Lightness=-0.348694,Chroma=0.179359,Hue=21.284424,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Compass | ||
Compass Cardinal Names (CompassCardinalNames) | TArray<FText> | (8 entries) | Compass | Letters of the cardinal points (north, east, south, west) and of the four between them (NE, SE, SW, NW). | |
Compass Fade Start (CompassFadeStart) | float | 12000.000000 | Compass | Places start fading out from this distance (to Compass Max Distance). | |
Compass Field Of View (CompassFieldOfView) | float | 170.000000 | Compass | How much of the horizon the bar shows (degrees from edge to edge). | |
Compass Height (CompassHeight) | float | 34.000000 | Compass | ||
Compass Max Distance (CompassMaxDistance) | float | 25000.000000 | Compass | Places farther than this are not shown (the tracked objective and pins always are). | |
Compass North Color (CompassNorthColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.024303,Chroma=0.871947,Hue=7.490834,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Compass | ||
Compass Tick Color (CompassTickColor) | FRSEUIColor | (Token="Text",Alpha=0.800000,Lightness=-0.001490,Chroma=4.197116,Hue=169.197342,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Compass | ||
Compass Top Offset (CompassTopOffset) | float | 18.000000 | Compass | Distance from the top of the screen in pixels at 1080p. | |
Compass Vertical Threshold (CompassVerticalThreshold) | float | 400.000000 | Compass | Up / down arrow when a place is this much higher or lower than the player. | |
Compass Widget Class (CompassWidgetClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSECompassWidget | Compass | Compass HUD (D-052). Empty = the built-in one; a Widget Blueprint derived from RSEScreenWidget receives a RSECompassViewModel. | |
Compass Width (CompassWidth) | float | 620.000000 | Compass | Width and height of the compass bar in pixels at 1080p. | |
Compass ZOrder (CompassZOrder) | int32 | 2 | Compass | ||
Show Difficulty Overlay (bShowDifficultyOverlay) | bool | True | Difficulty Overlay | The area map tints each zone of the level by how dangerous it is for the party now: a zone is a part of the level covered by an RSE Area Volume whose area names a progression zone (its level = the middle of the zone's enemy levels). The rating uses Interactables -> Danger margins, like the danger warnings. The player can turn it off (options menu). | |
Difficulty Colors (DifficultyColors) | TArray<FLinearColor> | (4 entries) | Difficulty Overlay | The tint per rating: Safe, Fair, Risky, Deadly. Keep the alpha low: the overlay should be barely there, but noticeable. | |
Difficulty Overlay Blur (DifficultyOverlayBlur) | int32 | 3 | Difficulty Overlay | Blur passes that soften the zones' edges (0 = hard edges). | |
Difficulty Overlay Resolution (DifficultyOverlayResolution) | int32 | 128 | Difficulty Overlay | Overlay pixels per map side (blurred and filtered: zones get soft edges; 128 costs 64 KB). | |
Fog Of War (bFogOfWar) | bool | False | Fog Of War | Unexplored parts of maps stay hidden until the player comes near (a map can override it). | |
Fog Color (FogColor) | FLinearColor | (R=0.020000,G=0.020000,B=0.030000,A=0.920000) | Fog Of War | ||
Fog Resolution (FogResolution) | int32 | 96 | Fog Of War | Fog cells per map side (the saved mask is Resolution x Resolution bits). | |
Reveal Interval (RevealInterval) | float | 0.500000 | Fog Of War | How often the fog is revealed around the player. | |
Reveal Radius (RevealRadius) | float | 2500.000000 | Fog Of War | How far around the player the map is revealed. | |
Auto Markers (AutoMarkers) | TArray<FRSEMapAutoMarkerRule> | (10 entries) | Markers | Which actors get markers automatically (first match wins). | |
Card Player Category (CardPlayerCategory) | FGameplayTag | (TagName="Map.Marker.CardPlayer") | Markers | D-157: NPCs with a Card Challenger component (card players) get this category when no rule gave them another. | |
Categories (Categories) | TArray<FRSEMapMarkerCategory> | (18 entries) | Markers | How every marker category looks. Categories without an entry use a white dot. | |
Objective Category (ObjectiveCategory) | FGameplayTag | (TagName="Map.Marker.Objective") | Markers | Category of the tracked quest's objective marker. | |
Pin Category (PinCategory) | FGameplayTag | (TagName="Map.Marker.Pin") | Markers | Category of player pins. | |
Quest Giver Category (QuestGiverCategory) | FGameplayTag | (TagName="Map.Marker.QuestGiver") | Markers | NPCs whose Map Marker component (or quest-giver id) names the giver of a quest the player can start get this category. | |
Quest Objective Category (QuestObjectiveCategory) | FGameplayTag | (TagName="Map.Marker.QuestObjective") | Markers | Category of current objectives of active quests that are not tracked (D-092). | |
Update Interval (UpdateInterval) | float | 0.100000 | Markers | How often moving markers (roaming enemies) and the player position are refreshed. | |
Battle Check Interval (BattleCheckInterval) | float | 0.250000 | Minimap | How often the minimap checks whether a battle runs (it hides during battles). | |
Minimap Compass Ring (bMinimapCompassRing) | bool | True | Minimap | D-148: a compass ring around the minimap with N / E / S / W (turning with the map; north highlighted). | |
Minimap Info Lines (bMinimapInfoLines) | bool | True | Minimap | Shows the extra lines other systems put under the minimap (the clock, D-104; URSEMapWorldSubsystem::SetMinimapInfo). | |
Minimap Region Name (bMinimapRegionName) | bool | True | Minimap | Shows the name of the region the player is in under the minimap. | |
Minimap Smooth Motion (bMinimapSmoothMotion) | bool | True | Minimap | D-152: the minimap glides between its position updates (a few per second): the view, the player arrow and the markers move every frame from where they are shown toward the newest update, over the time between updates, so it never steps or jumps while following, turning or stopping. Ticks only while the minimap is shown and moving. | |
Pin Objective to Edge (bPinObjectiveToEdge) | bool | True | Minimap | The objective marker sticks to the minimap's edge with an arrow when it is out of view. | |
Show Minimap (bShowMinimap) | bool | True | Minimap | --- Minimap --- | |
Default Minimap Zoom (DefaultMinimapZoom) | int32 | 1 | Minimap | ||
Game Modes Without Minimap (GameModesWithoutMinimap) | TArray<TSoftClassPtr<AGameModeBase> > | (1 entries) | Minimap | No minimap in worlds run by these game modes (main menu). | |
Minimap Alignment (MinimapAlignment) | FVector2D | (X=1.000000,Y=0.000000) | Minimap | ||
Minimap Anchor (MinimapAnchor) | FVector2D | (X=1.000000,Y=0.000000) | Minimap | Normalized screen anchor and pivot of the minimap, plus a pixel offset. | |
Minimap Background (MinimapBackground) | FRSEUIColor | (Token="Primary",Alpha=0.850000,Lightness=-0.348694,Chroma=0.179359,Hue=21.284424,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Minimap | ||
Minimap Frame Color (MinimapFrameColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=-0.003934,Chroma=0.384095,Hue=0.870895,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Minimap | ||
Minimap Frame Width (MinimapFrameWidth) | float | 3.000000 | Minimap | ||
Minimap Glide Max Seconds (MinimapGlideMaxSeconds) | float | 0.350000 | Minimap | ||
Minimap Glide Min Seconds (MinimapGlideMinSeconds) | float | 0.040000 | Minimap | D-152: the glide toward an update lasts the time since the previous update, kept inside these limits (seconds). | |
Minimap Icon Scale (MinimapIconScale) | float | 0.750000 | Minimap | Minimap icons are this share of their area map size. | |
Minimap Offset (MinimapOffset) | FVector2D | (X=-24.000000,Y=24.000000) | Minimap | ||
Minimap Ring Color (MinimapRingColor) | FRSEUIColor | (Token="Primary",Alpha=0.820000,Lightness=-0.310384,Chroma=0.141913,Hue=21.671797,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Minimap | ||
Minimap Ring Text Color (MinimapRingTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.001490,Chroma=4.197116,Hue=169.197342,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Minimap | ||
Minimap Ring Width (MinimapRingWidth) | float | 22.000000 | Minimap | D-148: width of the compass ring (pixels at 1080p, outside the map's edge) and its colors. | |
Minimap Rotation (MinimapRotation) | ERSEMinimapRotation | RotateWithPlayer | Minimap | How the minimap turns (the player may choose in Options -> Interface; D-148 default: around the player). | |
Minimap Shape (MinimapShape) | ERSEMinimapShape | Round | Minimap | ||
Minimap Size (MinimapSize) | float | 220.000000 | Minimap | Side (or diameter) in pixels at 1080p. | |
Minimap Snap Span Fraction (MinimapSnapSpanFraction) | float | 0.500000 | Minimap | D-152: a jump longer than this share of the visible span (a teleport, a zone change) is shown at once, not glided. | |
Minimap Turn Speed (MinimapTurnSpeed) | float | 540.000000 | Minimap | D-148: how fast a turning minimap follows the heading (degrees per second; 0 = at once). Smooths the 10 Hz position updates. | |
Minimap Widget Class (MinimapWidgetClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSEMinimapWidget | Minimap | Minimap HUD (D-052). Empty = the built-in screen; a Widget Blueprint derived from RSEScreenWidget receives a RSEMinimapViewModel. | |
Minimap Zoom Levels (MinimapZoomLevels) | TArray<float> | (3 entries) | Minimap | World width the minimap shows at each zoom level (meters across); the player cycles them. | |
Minimap ZOrder (MinimapZOrder) | int32 | 2 | Minimap | ||
Allow Pins (bAllowPins) | bool | True | Pins | Player pins on the area map (Confirm / right click). | |
Replace Oldest Pin (bReplaceOldestPin) | bool | True | Pins | With Max Pins Per Map reached, a new pin replaces the oldest one (off = it is refused). | |
Max Pins Per Map (MaxPinsPerMap) | int32 | 8 | Pins | Pins per map (0 = no limit). | |
Pin Pick Radius (PinPickRadius) | float | 0.030000 | Pins | A pin press this close (share of the visible map) to a pin edits it (change its type or remove it). | |
Pin Types (PinTypes) | TArray<FRSEMapPinType> | (6 entries) | Pins | The pin types the pin wheel offers, in wheel order (clockwise from the top). The first one is the default. | |
Pin Wheel Dead Zone (PinWheelDeadZone) | float | 0.300000 | Pins | Stick or mouse movement (share of the wheel radius) needed to pick a slice. | |
Pin Wheel Radius (PinWheelRadius) | float | 120.000000 | Pins | Radius of the pin wheel in pixels at 1080p. | |
Click Objective Opens Journal (bClickObjectiveOpensJournal) | bool | True | Quests | A click on an objective of the area map opens its quest in the journal. | |
Point to Exit for Other Levels (bPointToExitForOtherLevels) | bool | True | Quests | Objectives on another level point at the exit toward that level. | |
Show Quest Objectives (bShowQuestObjectives) | bool | True | Quests | Objectives of active quests with a place in the world show on the maps and the compass (players can turn it off). | |
Show Untracked Objectives (bShowUntrackedObjectives) | bool | True | Quests | Also the objectives of quests that are not tracked (smaller, dimmer). Off = only the tracked quest. | |
Objective Area Color (ObjectiveAreaColor) | FRSEUIColor | (Token="Accent",Alpha=0.180000,Lightness=-0.001825,Chroma=1.113716,Hue=1.749989,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Quests | Fill and outline of area objectives ("search the forest") on the maps. |
RPG Saga Engine: Map Generator
Class URSEMapGeneratorSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. How Generate Map pictures a level (D-089).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Landscape Bounds (bLandscapeBounds) | bool | True | Bounds | With a landscape, the map covers the landscape only (else every mesh of the level). | |
Bounds Source (BoundsSource) | ERSEMapBoundsSource | PlayableArea | Bounds | What the map frames when the level has no RSE Map Bounds Volume. Playable Area (default) leaves out the background (horizon mountains, sea, sky); without a navmesh or gameplay actors it falls back to the landscape, then every mesh. | |
Floating Margin (FloatingMargin) | float | 500.000000 | Bounds | Meshes floating this far above the playable area's top are left out (clouds, sky props). | |
Max Content Size (MaxContentSize) | float | 150000.000000 | Bounds | Meshes wider than this are background (sky spheres, horizon planes) and do not count for the bounds. | |
Padding (Padding) | float | 0.030000 | Bounds | Space around the level's content, as a share of its size on each side. | |
Playable Margin (PlayableMargin) | float | 1500.000000 | Bounds | Space kept around each gameplay actor when the playable area is measured from them. | |
Hide Canopies (bHideCanopies) | bool | True | Hidden | ||
Hide Foliage (bHideFoliage) | bool | False | Hidden | Leaves painted foliage out of the picture (grass and trees of the Foliage tool). | |
Hide Skeletal Meshes (bHideSkeletalMeshes) | bool | True | Hidden | Leaves skeletal meshes out (characters, animals, NPCs placed as plain meshes). | |
Canopy Tags (CanopyTags) | TArray<FName> | (1 entries) | Hidden | Tree canopies and roofs: actors or components with one of these tags are left out when Hide Canopies is on. | |
Hidden Classes (HiddenClasses) | TArray<TSoftClassPtr<AActor> > | (0 entries) | Hidden | Actors of these classes are left out of the picture (pawns and characters always are). | |
Hidden Tags (HiddenTags) | TArray<FName> | (1 entries) | Hidden | Actors or components with one of these tags are left out of the picture. | |
Building Keywords (BuildingKeywords) | TArray<FString> | (28 entries) | Layers | Buildings: drawn as clear shapes with an outline and a shadow. Very low ones (Flat Height) count as ground (floors, paving). | |
Building Min Height (BuildingMinHeight) | float | 250.000000 | Layers | ||
Building Min Size (BuildingMinSize) | float | 400.000000 | Layers | Unnamed meshes at least this wide and deep (and Building Min Height tall) are buildings; smaller ones are props. | |
Building Tag (BuildingTag) | FName | MapBuilding | Layers | Actor or component tags that put a mesh in a layer, whatever its name: MapBuilding, MapWater, MapForest, MapRock, MapGround. | |
Flat Height (FlatHeight) | float | 80.000000 | Layers | Building pieces lower than this are ground (floors, paving, docks). | |
Forest Keywords (ForestKeywords) | TArray<FString> | (14 entries) | Layers | Trees and bushes: merged into forest shapes. | |
Forest Tag (ForestTag) | FName | MapForest | Layers | ||
Ground Keywords (GroundKeywords) | TArray<FString> | (17 entries) | Layers | Ground surfaces (terrain meshes, roads, floors): their colors make the terrain. The landscape always is ground. | |
Ground Min Size (GroundMinSize) | float | 3000.000000 | Layers | Unnamed meshes wider than this are ground (big terrain pieces). | |
Ground Tag (GroundTag) | FName | MapGround | Layers | ||
Ignore Keywords (IgnoreKeywords) | TArray<FString> | (16 entries) | Layers | Meshes with these words are left out (grass tufts, flowers, logs, clouds...). Checked first. | |
Min Rock Height (MinRockHeight) | float | 60.000000 | Layers | Rocks lower than this are left out (pebbles). | |
Road Keywords (RoadKeywords) | TArray<FString> | (5 entries) | Layers | Ground meshes that are roads and paths (drawn in the style's road color). | |
Rock Keywords (RockKeywords) | TArray<FString> | (4 entries) | Layers | Rocks and cliffs. | |
Rock Tag (RockTag) | FName | MapRock | Layers | ||
Water Keywords (WaterKeywords) | TArray<FString> | (5 entries) | Layers | Water (mesh or material name). | |
Water Tag (WaterTag) | FName | MapWater | Layers | ||
Batch Excluded Folders (BatchExcludedFolders) | TArray<FString> | (2 entries) | Output | Batch generation (RSE.Map.Generate All) skips levels under these folders. | |
Data Prefix (DataPrefix) | FString | DA_Map_ | Output | ||
Output Subfolder (OutputSubfolder) | FString | Map | Output | Folder, next to the level, where the map's picture and data go. | |
Texture Prefix (TexturePrefix) | FString | T_Map_ | Output | ||
Default Style (DefaultStyle) | TSoftObjectPtr<URSEMapStyle> | /RPGSagaEngine/Data/Map/DA_MapStyle_Clean.DA_MapStyle_Clean | Picture | Style of new maps (a map data asset can name its own). Empty = the Clean look. | |
Resolution (Resolution) | int32 | 2048 | Picture | Picture size in pixels (square). 2048 is sharp on a Steam Deck and costs about 3 MB; a map can ask for its own. | |
Supersample (Supersample) | int32 | 2 | Picture | Renders at this multiple of the size and scales down (smoother edges). | |
Target Mid Gray (TargetMidGray) | float | 0.220000 | Picture | Target brightness of the picture's middle tones (0.18 = photographic middle gray). | |
Warmup Captures (WarmupCaptures) | int32 | 2 | Picture | Extra frames rendered before the picture (textures stream in, shadows settle). |
RPG Saga Engine: Mobile Rendering
Class URSEMobileSettings (module RSE), Project Settings, Project, RPG Saga Engine. Mobile rendering (M4, D-180, docs/product/mobile.md "Rendering"): the Low / Mid / High tiers with their device profiles and frame budgets, the maps of the Mobile Preview and the materials flagged with a mobile fallback.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Material Fallbacks (MaterialFallbacks) | TArray<FRSEMobileMaterialFallback> | (2 entries) | Materials | Materials known not to compile for ES3.1, with their fallback. | |
Apply RSEProfile in Preview (bApplyRSEProfileInPreview) | bool | True | Preview | Applies the tier's RSE device profile on top of the engine preview profile while the preview runs. The editor only lets scalability (sg.*) CVars through in a preview, so this mostly matters for the report. | |
Default Preview Platform (DefaultPreviewPlatform) | ERSEMobilePlatform | Android | Preview | Platform the Mobile Preview uses when none is given. | |
Default Preview Tier (DefaultPreviewTier) | FName | Mid | Preview | Tier the Mobile Preview uses when none is given, and the device tier when the engine's pick has no Low / Mid / High family. | |
Preview Maps (PreviewMaps) | TArray<FRSEMobilePreviewMap> | (2 entries) | Preview | Maps the Mobile Preview can open and capture. | |
Preview Settle Seconds (PreviewSettleSeconds) | float | 8.000000 | Preview | Seconds between the start of the play session and the first capture (assets stream in, shaders compile). | |
Report Folder (ReportFolder) | FString | Perf/Mobile | Preview | Report folder under Saved/ (a sub-folder per run). | |
Apply on Device (bApplyOnDevice) | bool | True | Tiers | On Android and iOS, applies the RSE device profile of the device's tier at game start (the tier is read from the engine's own device profile pick: Low / Mid / High family). A -dp= command line always wins. | |
Tiers (Tiers) | TArray<FRSEMobileTier> | (3 entries) | Tiers | Low / Mid / High: device profiles and budgets. Defaults: 30 FPS, <= 600 draw calls and <= 400k triangles on a high phone (design/industry-gaps.md 4.1). |
RPG Saga Engine: Narrative
Class URSENarrativeSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Narrative rules (Project Settings -> RPG Saga Engine -> Narrative): the story state of a new game.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Starting Flags (StartingFlags) | FGameplayTagContainer | () | New Game | Flags that are true when a new game starts. | |
Starting Unlocked Areas (StartingUnlockedAreas) | FGameplayTagContainer | () | New Game | Areas open from the start. | |
Starting Variables (StartingVariables) | TMap<FGameplayTag,int32> | (0 entries) | New Game | Variables with a non-zero starting value. |
RPG Saga Engine: Online
Class URSEOnlineSettings (module RSEOnline), Project Settings, Project, RPG Saga Engine. Online sessions (D-135, docs/product/online-sessions.md): which online service hosts and finds sessions, how many players, who can see a session, timeouts, reconnecting and the lobby screen.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Keep Slots for Reconnect (bKeepSlotsForReconnect) | bool | True | Hosting | Keep a dropped player's slot and character for them; it is given away only when a new player needs the place. | |
Host Map (HostMap) | TSoftObjectPtr<UWorld> | None | Hosting | Map the host opens when the session starts. Empty = stay on the current map and start listening there (drop-in on the map being played). | |
Join in Progress Policy (JoinInProgressPolicy) | ERSEJoinInProgressPolicy | SpectateUntilBattleEnds | Hosting | Players who join while a battle runs (D-124 §6: they watch until it ends, then get their character). | |
LANPort (LANPort) | int32 | 7777 | Hosting | Game port the host listens on (LAN and other IP services; Steam and EOS use their own relays). 0 = the engine's default. | |
Lobby Update Interval (LobbyUpdateInterval) | float | 1.000000 | Hosting | Seconds between two lobby advertisement updates (slots, characters, battle flag); changes in between are merged. | |
Max Players (MaxPlayers) | int32 | 4 | Hosting | Players in a session, host included. The co-op rules (D-094) are made for 2 to 4. | |
Visibility (Visibility) | ERSELobbyVisibility | FriendsOnly | Hosting | Who can find and join a hosted session (Steam / EOS; LAN sessions are always visible on the local network). | |
Hide Incompatible Sessions (bHideIncompatibleSessions) | bool | False | Joining | Hide sessions of other game versions from search results (otherwise they are listed as incompatible). | |
Leave Map (LeaveMap) | TSoftObjectPtr<UWorld> | None | Joining | Map a client opens after leaving a session. Empty = the project's Game Default Map. | |
Max Search Results (MaxSearchResults) | int32 | 50 | Joining | Sessions shown per search. | |
Search Seconds (SearchSeconds) | float | 5.000000 | Joining | Seconds a search may run (LAN broadcast window; online services answer sooner). | |
Lobby Panel Width (LobbyPanelWidth) | float | 720.000000 | Lobby Screen | Width of the built-in lobby window (slate units at the reference resolution). | |
Lobby Widget Class (LobbyWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Lobby Screen | The lobby screen (host, find, join, invite, character choice). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSELobbyViewModel (docs/product/custom-ui.md). | |
Lobby ZOrder (LobbyZOrder) | int32 | 60 | Lobby Screen | Viewport Z order of the lobby screen. | |
Add Menu Entries (bAddMenuEntries) | bool | True | Menus | Adds Host Game and Join Game to the main menu and Host Here, Join Game, Invite and Leave to the in-game menu (D-142, RSE's menu extension point). Off = the project shows its own entries (the session nodes do the same). | |
Auto Reconnect (bAutoReconnect) | bool | True | Reliability | A client whose connection drops tries to join the same session again. | |
Operation Timeout Seconds (OperationTimeoutSeconds) | float | 30.000000 | Reliability | Seconds any session operation (create, search, join, travel, leave) may take before it fails with Timeout. | |
Reconnect Attempts (ReconnectAttempts) | int32 | 3 | Reliability | Reconnect attempts before giving up. | |
Reconnect Delay Seconds (ReconnectDelaySeconds) | float | 3.000000 | Reliability | Seconds before each reconnect attempt. | |
Fallback to LAN (bFallbackToLAN) | bool | True | Service | When the chosen service is not available (Steam not running, EOS not configured, -nosteam), use the LAN provider instead of failing. The switch is logged and reported once as a notice. | |
Game Version (GameVersion) | FString | Service | Game version advertised by hosts and compared by joiners: players join only hosts with the same version. Empty = Project Settings -> Description -> Project Version. | ||
Provider Class (ProviderClass) | TSoftClassPtr<URSESessionProvider> | /Script/RSEOnline.RSESessionProvider_LAN | Service | The online service for sessions: RSESessionProvider_LAN (local network, no setup), RSESessionProvider_Steam, RSESessionProvider_EOS, or your own class derived from RSESessionProvider. Steam and EOS need their engine plugin enabled and configured (docs/product/online-sessions.md). The command line -RSESessionProvider=LAN|Steam|EOS|<class path> overrides it for one run. | |
Session Name (SessionName) | FName | GameSession | Service | The online service's name for the session (one session per game). |
RPG Saga Engine: Options
Class URSEOptionsSettings (module RSE), Project Settings, Project, RPG Saga Engine. The options screen (D-038): layout, the values offered to the player and the display defaults.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Volume Step (VolumeStep) | float | 0.050000 | Audio | Volume step of the audio sliders (left / right). | |
Action Names (ActionNames) | TArray<FRSEOptionsActionName> | (31 entries) | Controls | Names of the input actions in the controls list (the action's own Description wins when set; without either, the asset name is shown). | |
Allow Video Mode in Editor (bAllowVideoModeInEditor) | bool | False | Display | Resolution and window mode can be changed in the editor's play-in-editor (off: they only work in the game). | |
Default VSync (bDefaultVSync) | bool | True | Display | ||
Show Visual Style (bShowVisualStyle) | bool | True | Display | Offer the visual style presets (D-037) to the player. | |
Confirm Seconds (ConfirmSeconds) | float | 15.000000 | Display | Seconds the "Keep these settings?" question waits before the resolution / window mode goes back. | |
Default Frame Rate Limit (DefaultFrameRateLimit) | float | 0.000000 | Display | Frame rate limit restored by "Reset to defaults" (0 = uncapped). | |
Default Quality Level (DefaultQualityLevel) | int32 | 3 | Display | Overall quality restored by "Reset to defaults" (0 = Low / Steam Deck ... 3 = Epic). | |
Frame Rate Limits (FrameRateLimits) | TArray<float> | (4 entries) | Display | Frame rate limits offered (frames per second; 0 = uncapped). | |
Battle Speed Steps (BattleSpeedSteps) | TArray<float> | (4 entries) | Game | Battle presentation speeds offered (multipliers of Battle Presentation -> Playback Speed). | |
Default Language (DefaultLanguage) | FString | en | Game | The game's language until the player picks one in the options (D-083): a culture code (en, ro...). Used when neither the command line (-culture=), the player's saved choice nor the project's [Internationalization] Culture in DefaultGame.ini names one, so a new project starts in this language instead of the system's. Also the options screen's default. Empty = the system language. | |
Languages (Languages) | TArray<FString> | (0 entries) | Game | Allow-list of the languages offered (culture codes, e.g. en, fr). Empty = every culture with a compiled translation in any localization target (the plugin's, the game's, yours); otherwise only those of the list that are compiled. | |
Session Rule Locked Text (SessionRuleLockedText) | FText | NSLOCTEXT("RSEOptionsSettings", "SessionRuleLocked", "Set by the host") | Game | Note of a rule-of-play row a co-op guest cannot change (D-139): the host's value is shown, greyed out. Which rows are rules: Rules Profiles -> Co-op -> Session Rule Options. | |
Text Speed Names (TextSpeedNames) | TArray<FText> | (4 entries) | Game | Names of the dialog text speeds, one per Dialog -> Text Speed Steps entry (same order). Missing names show the speed in characters per second ("Instant" for 0). | |
Tutorials Off in Session Text (TutorialsOffInSessionText) | FText | NSLOCTEXT("RSEOptionsSettings", "TutorialsOffInSession", "Off in co-op") | Game | Note of the Tutorials row while a co-op session runs (no tutorials in co-op, D-124 §6.9). | |
Background Color (BackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=0.800000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Screen | Dims whatever is behind the screen. A UI color (D-162): it follows the UI style; old .ini colors load as a fixed color. | |
Choice Value Width (ChoiceValueWidth) | float | 260.000000 | Screen | Minimum width of the value between the arrows of choice rows; the column widens to the tab's longest value (measured, D-106). | |
Label Column Share (LabelColumnShare) | float | 0.460000 | Screen | Share of the list width taken by the option names (the values take the rest). | |
List Height (ListHeight) | float | 400.000000 | Screen | Height of the scrolling list of rows. | |
Next Glyph (NextGlyph) | FText | INVTEXT("›") | Screen | ||
Previous Glyph (PreviousGlyph) | FText | INVTEXT("‹") | Screen | Glyphs of the value arrows on choice rows (clickable). | |
Slider Height (SliderHeight) | float | 8.000000 | Screen | ||
Slider Width (SliderWidth) | float | 220.000000 | Screen | Width of slider bars. | |
Vertical Anchor (VerticalAnchor) | float | 0.500000 | Screen | Normalized screen height of the window's center. | |
Widget Class (WidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screen | Options screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEOptionsViewModel (docs/product/custom-ui.md). | |
Width (Width) | float | 900.000000 | Screen | ||
ZOrder (ZOrder) | int32 | 60 | Screen | Z-order in the viewport (above HUDs, the party menu and the main menu). |
RPG Saga Engine: Pacts
Class URSEPactSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Global Pact rules (D-013).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Award Fallen Members (bAwardFallenMembers) | bool | False | Points | Whether members that ended the battle KO still earn points for their Pact. | |
Points Per Enemy Defeated (PointsPerEnemyDefeated) | int32 | 2 | Points | Extra points per enemy defeated in that battle. | |
Points Per Victory (PointsPerVictory) | int32 | 10 | Points | Points each Pact that fought (bound to a party member) earns for a victory. | |
Summon Resource (SummonResource) | FGameplayTag | (TagName="Resource.Resonance") | Resonance | The resource a summon costs: a full bar is required and consumed (D-013). Resonance is an ordinary resource of the attribute registry (D-054): its bar size, start value, gains (Pact rates: Pact.OnAct, Pact.OnHit, Pact.PerDamagePercent) and whether it grows while the summon is out are set there (Attributes settings). | |
Backlash Can Defeat (bBacklashCanDefeat) | bool | False | Summon | Whether backlash damage may defeat the summoner (false: it leaves at least 1 HP). | |
Summoner Return ATBFraction (SummonerReturnATBFraction) | float | 0.000000 | Summon | ATB: gauge the summoner has when it comes back, as a fraction of the full gauge. | |
Summon Initial ATBFraction (SummonInitialATBFraction) | float | 0.500000 | Summon | ATB: gauge a summon starts with, as a fraction of the full gauge. | |
Summon Initial CTFraction (SummonInitialCTFraction) | float | 0.500000 | Summon | Tactics: CT a summon starts with, as a fraction of the CT threshold. | |
Summon Placement Range (SummonPlacementRange) | int32 | 3 | Summon | Tactics: how far from the summoner (tiles) a summon or a reinforcement may appear when the tiles next to it are taken (D-081): the nearest free walkable tile. 1 = next to it only. |
RPG Saga Engine: Paired Animation Detection
Class URSEPairedDetectSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. How the Animation & FX Library recognizes paired clips in packs (D-172): role words ("Attacker" / "Victim"), pair words ("Sync", "Paired", "Finisher"...) and the words of each kind.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Counter Words (CounterWords) | TArray<FString> | (3 entries) | Kinds | ||
Finisher Words (FinisherWords) | TArray<FString> | (7 entries) | Kinds | ||
Grab Words (GrabWords) | TArray<FString> | (5 entries) | Kinds | ||
Parry Words (ParryWords) | TArray<FString> | (2 entries) | Kinds | ||
Register Library (bRegisterLibrary) | bool | True | Output | Create Pairs adds the library to Project Settings -> Paired Animations -> Libraries. | |
Library Asset Name (LibraryAssetName) | FString | DA_PairedLibrary | Output | Name of the library Create Pairs adds the pairs to (created in the output folder when missing). | |
Output Folder (OutputFolder) | FDirectoryPath | () | Output | Folder (under the scanned one) where Create Pairs writes the montages, pair assets and the library. Empty = "<folder>/Paired". | |
Length Tolerance (LengthTolerance) | float | 0.250000 | Pairs | Clips whose lengths differ by more than this share are still proposed, with a lower confidence. | |
Pair Words (PairWords) | TArray<FString> | (14 entries) | Pairs | Words that mark a clip as half of a pair (in its name or folder). | |
Attacker Words (AttackerWords) | TArray<FString> | (13 entries) | Roles | Words of the attacker's clip (the unit acting). One-letter words ("A") count only when the clip also has a pair word. | |
Victim Words (VictimWords) | TArray<FString> | (10 entries) | Roles | Words of the victim's clip. One-letter words ("B") count only when the clip also has a pair word. |
RPG Saga Engine: Paired Animations
Class URSEPairedAnimationSettings (module RSE), Project Settings, Project, RPG Saga Engine. Paired animations and finishers (D-172): which libraries hold the pairs, how often finishers play, the alignment, the default camera and slow motion.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Libraries (Libraries) | TArray<TSoftObjectPtr<URSEPairedAnimationLibrary> > | (0 entries) | Content | Libraries the pairs are picked from (in order; all of them are searched). | |
Default Camera Distance (DefaultCameraDistance) | float | 420.000000 | Default Look | Distance of the default shot (cm; negative = Battle Presentation's). | |
Default Camera FOV (DefaultCameraFOV) | float | 50.000000 | Default Look | Field of view of the default shot (0 = Battle Presentation's). | |
Default Camera Height (DefaultCameraHeight) | float | 20.000000 | Default Look | ||
Default Camera Shot (DefaultCameraShot) | ERSECameraShot | TwoShot | Default Look | Camera of pairs without their own (when the battle allows camera shots). | |
Default Slow Motion Blend Out (DefaultSlowMotionBlendOut) | float | 0.400000 | Default Look | ||
Default Slow Motion Dilation (DefaultSlowMotionDilation) | float | 0.300000 | Default Look | Slow motion at the sync point of pairs without their own curve: dilation (1 = none). Reduced effects turn it off. | |
Default Slow Motion Hold (DefaultSlowMotionHold) | float | 0.300000 | Default Look | Real seconds the default slow motion holds, then eases back over Default Slow Motion Blend Out. | |
Finishers (bFinishers) | bool | True | Finishers | Master switch: kills may play a finisher. | |
Player Side Only (bPlayerSideOnly) | bool | False | Finishers | Only kills by the player's side play finishers (enemies' kills keep their ordinary look). | |
Cooldown Actions (CooldownActions) | int32 | 2 | Finishers | Actions that must pass after a finisher before the next one may play by chance (0 = none; Always ignores it). | |
Default Frequency (DefaultFrequency) | ERSEFinisherFrequency | Sometimes | Finishers | How often finishers play when the player never chose (Options -> Finishers overrides it). | |
Last Kill Chance (LastKillChance) | float | 1.000000 | Finishers | Chance when the kill ends the battle (the last foe falls), frequency Sometimes. | |
Sometimes Chance (SometimesChance) | float | 0.350000 | Finishers | Chance of a finisher on a kill when the frequency is Sometimes (and a pair fits). | |
Align Seconds (AlignSeconds) | float | 0.200000 | Playback | Seconds the alignment slide takes when the pair does not say. | |
Approach Beyond (ApproachBeyond) | float | 150.000000 | Playback | The attacker runs to the victim first (and back after) when farther than the pair's distance plus this (cm; the ATB stage). | |
Hold Victim Down Pose (bHoldVictimDownPose) | bool | True | Playback | A victim that falls holds the last pose of its montage (no second fall from its knock-out animation). | |
Skippable (bSkippable) | bool | True | Playback | Confirm / Cancel skip a pair (its results still show). | |
Use Motion Warping (bUseMotionWarping) | bool | True | Playback | Attackers with a motion warping component are carried by their montage's warp window instead of the slide. | |
Motion Warping Component Class (MotionWarpingComponentClass) | FSoftClassPath | /Script/MotionWarping.MotionWarpingComponent | Playback | The motion warping component class looked for on the attacker (optional plugin; nothing breaks when it is missing). | |
Synced Counters (bSyncedCounters) | bool | True | Reactions | Counter abilities play a Counter pair when one fits (else their ordinary look). | |
Synced Parries (bSyncedParries) | bool | True | Reactions | Parries known before the presentation (action battles, Blueprint) play a Parry pair when one fits. |
RPG Saga Engine: Party
Class URSEPartySettings (module RSECore), Project Settings, Project, RPG Saga Engine. Party rules and the new-game party.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Defeat Recovery HPPercent (DefeatRecoveryHPPercent) | float | 0.000000 | Defeat | HP fallen members get back after a story battle the party may lose, in percent of maximum HP. | |
Defeat Recovery Min HP (DefeatRecoveryMinHP) | float | 1.000000 | Defeat | At least this much HP (so 0% still means "back on their feet"). | |
Starting Members (StartingMembers) | TArray<TSoftObjectPtr<URSECharacterData> > | (4 entries) | New Game | Party members when a new game starts (recruitment adds more later, Phase 8). Global only. |
RPG Saga Engine: Party Field
Class URSEPartyFieldSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Party field settings (D-097): the visible party in exploration, its formation and the delegated commands.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Arrive Distance (ArriveDistance) | float | 150.000000 | Commands | A member who reaches the target of Search / Interact within this distance acts (cm). | |
Commands (Commands) | TArray<TSoftObjectPtr<URSEPartyCommandData> > | (6 entries) | Commands | The delegated commands of the radial menu (in Sort Order). | |
Guard Warning Radius (GuardWarningRadius) | float | 1500.000000 | Commands | Guard: a guarding member warns when an enemy comes this close (cm). | |
Scout Report Radius (ScoutReportRadius) | float | 1800.000000 | Commands | Scout: enemies within this distance of the scout's path are reported (cm). | |
Formation Slots (FormationSlots) | TArray<FVector2D> | (3 entries) | Formation | Places of the followers relative to the leader (cm; X forward, Y right): one per follower in order; more followers than places line up behind the last rows. | |
Hold Distance (HoldDistance) | float | 90.000000 | Formation | A follower closer than this to its place stands. | |
Run Distance (RunDistance) | float | 650.000000 | Formation | Farther than this it runs to catch up (closer: walks). D-150: 650 (was 400): members may lag a little before they run. | |
Run Speed (RunSpeed) | float | 600.000000 | Formation | Running speed of followers catching up (cm/s). | |
Teleport Distance (TeleportDistance) | float | 3000.000000 | Formation | Farther than this from the leader it appears near the leader (stuck, another floor). 0 = never. | |
Think Interval (ThinkInterval) | float | 0.200000 | Formation | Seconds between the followers' decisions (a timer, no Tick). | |
Walk Speed (WalkSpeed) | float | 250.000000 | Formation | Walking speed of followers (cm/s). | |
Avoidance Radius (AvoidanceRadius) | float | 300.000000 | Life | D-129: how far a follower looks for others to steer around (cm). D-150: 300 (was 150), for the roomier spacing. | |
Followers Avoid Each Other (bFollowersAvoidEachOther) | bool | True | Life | D-129: followers steer around each other (the engine's RVO avoidance on their movement): no crowding in corridors. | |
Followers Avoid Leader (bFollowersAvoidLeader) | bool | True | Life | D-150: followers also steer around the leader (the leader is an avoidance agent that never yields itself: its movement stays exactly the player's). Needs Followers Avoid Each Other. | |
Interactables Are Points Of Interest (bInteractablesArePointsOfInterest) | bool | True | Life | D-129: resting members also look at interactable objects nearby (chests, doors, NPCs), besides RSE Idle Spots of interest. | |
Catch Up Speed Margin (CatchUpSpeedMargin) | float | 90.000000 | Life | D-129: a member catching up (running) is always at least this much faster than the leader (cm/s), whatever its own pace. | |
Follower Avoidance Weight (FollowerAvoidanceWeight) | float | 0.500000 | Life | D-150: how much a follower yields to others it meets (the engine's avoidance weight, 0..1; the leader never yields). | |
Follower Profile (FollowerProfile) | TSoftObjectPtr<URSEFollowerProfile> | /RPGSagaEngine/Data/PartyField/DA_FollowerProfile_Default.DA_FollowerProfile_Default | Life | D-129: how the party's members follow and live (their loose places, their pace, their idle behaviours). A character may have its own (Character -> Follower Profile). Empty = the formation slots exactly and no idle life. | |
Follower Seed (FollowerSeed) | int32 | 129 | Life | D-129: the seed of the followers' choices (drift, pace, idle picks): the same seed plays the same party life. | |
Leader Moving Speed (LeaderMovingSpeed) | float | 40.000000 | Life | D-129: the leader counts as walking above this speed (cm/s): followers react, idle life stops at once. | |
Move Acceptance Radius (MoveAcceptanceRadius) | float | 40.000000 | Life | D-150: a follower's move ends this close to where it aims (cm). | |
Repath Distance (RepathDistance) | float | 60.000000 | Life | D-150: a follower asks for a new path only when where it aims moved at least this far (cm; fewer path queries). | |
Spot Arrive Distance (SpotArriveDistance) | float | 30.000000 | Life | P32d: a member walking to an idle spot (a seat, a wall) arrives within this distance (cm), then steps onto the spot's exact place and facing (swept: never into a wall) before its loop starts, so it sits on the bench, not next to it. | |
Show Party in Exploration (bShowPartyInExploration) | bool | True | Visible Party | Party members walk behind the leader in exploration (off = only the leader is visible, as before D-097). | |
Max Followers (MaxFollowers) | int32 | 3 | Visible Party | Most members following the leader (the ATB formation order; the rest stay hidden). |
RPG Saga Engine: Performance
Class URSEPerformanceSettings (module RSE), Project Settings, Project, RPG Saga Engine. Performance (D-048, docs/design/performance.md): the Steam Deck device profile selection and the scripted benchmark (RSE.Perf.Benchmark).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Benchmark Steps (BenchmarkSteps) | TArray<FRSEBenchmarkStep> | (17 entries) | Benchmark | The scripted sequence of RSE.Perf.Benchmark. Runs unattended: no step needs input. | |
Quit when Unattended (bQuitWhenUnattended) | bool | True | Benchmark | Quits the game when the benchmark ends if it was started unattended (-unattended) or with the Quit argument. | |
Budget (Budget) | FRSEPerfBudget | (MinAverageFPS=30.000000,MinOnePercentLowFPS=25.000000,HitchFrameMs=100.000000,MaxAverageGPUMs=17.000000,MaxDrawCalls=1500,MaxPrimitives=2000000,MaxUsedPhysical... | Benchmark | Limits every segment is checked against (Steam Deck: 30 FPS minimum). | |
Uncap Frame Rate (bUncapFrameRate) | bool | True | Benchmark | Removes the frame rate limit and VSync while the benchmark runs (measures the headroom); restored after. | |
Write Frame Csv (bWriteFrameCsv) | bool | True | Benchmark | Also writes frames.csv (every recorded frame). | |
Map Load Timeout Seconds (MapLoadTimeoutSeconds) | float | 60.000000 | Benchmark | Time limit for a map load before the step is skipped. | |
Report Folder (ReportFolder) | FString | Perf | Benchmark | Report folder under Saved/ (a sub-folder per run: <timestamp>[_Deck]). | |
Warmup Seconds (WarmupSeconds) | float | 1.000000 | Benchmark | Frames skipped at the start of each capture (after loads and camera cuts). | |
Apply Deck Profile (bApplyDeckProfile) | bool | True | Steam Deck | Applies the Deck profile at startup when the game runs on a Steam Deck (SteamDeck=1 from Steam, -SteamDeck, or Input -> Devices -> Simulate Steam Deck). A -dp= / -DeviceProfile= command line always wins. | |
Deck Device Profile (DeckDeviceProfile) | FString | SteamDeck | Steam Deck | Device profile applied on a Steam Deck (Windows build under Proton, and the default name for RSE.Visual.DeckPreview / -dp=). | |
Deck First Run Frame Rate Limit (DeckFirstRunFrameRateLimit) | float | 40.000000 | Steam Deck | Frame rate limit set once, on the first start on a Deck (the player can change it in Options -> Display). 40 matches the Deck's 40 Hz mode; 30 saves battery. 0 = leave the limit alone. | |
Deck Linux Device Profile (DeckLinuxDeviceProfile) | FString | SteamDeck_Linux | Steam Deck | Device profile applied on a Steam Deck running a native Linux build. Empty = DeckDeviceProfile. | |
Deck Preview Resolution (DeckPreviewResolution) | FIntPoint | (X=1280,Y=800) | Steam Deck | Window size of RSE.Visual.DeckPreview (the Deck screen). |
RPG Saga Engine: Phone UI
Class URSEPhoneUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Phone UI (D-180, docs/product/mobile.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Use Phone Layouts (bUsePhoneLayouts) | bool | True | Phone Layouts | Screens use their phone layout while the phone UI is on (a UI style's custom layout still wins). | |
Phone ATB / Turn-Based HUD Layout (PhoneATBHUDLayout) | TSoftClassPtr<URSEATBHUDLayout> | None | Phone Layouts | ||
Phone Dialog Layout (PhoneDialogLayout) | TSoftClassPtr<URSEDialogLayout> | None | Phone Layouts | ||
Phone Grid Tactics HUD Layout (PhoneGridHUDLayout) | TSoftClassPtr<URSEGridHUDLayout> | None | Phone Layouts | ||
Phone Live Tactics HUD Layout (PhoneLiveHUDLayout) | TSoftClassPtr<URSELiveHUDLayout> | None | Phone Layouts | ||
Phone Party Menu Layout (PhonePartyMenuLayout) | TSoftClassPtr<URSEPartyMenuLayout> | None | Phone Layouts | ||
Max Phone Diagonal Inches (MaxPhoneDiagonalInches) | float | 7.600000 | Phone UI | Screens up to this diagonal are phones (bigger ones are tablets: physical scaling, but the regular layouts). | |
Phone UI (PhoneUI) | ERSEPhoneUIMode | Auto | Phone UI | ||
Desktop DPI (DesktopDPI) | float | 96.000000 | Physical Scaling | DPI assumed for desktop screens (millimetre sizes of touch controls on PC). | |
Fallback Phone DPI (FallbackPhoneDPI) | float | 420.000000 | Physical Scaling | DPI assumed when a phone does not report one. | |
Max Canvas Short Side (MaxCanvasShortSide) | float | 1080.000000 | Physical Scaling | ...and at most this many (big tablets do not get a tiny UI). | |
Min Canvas Short Side (MinCanvasShortSide) | float | 620.000000 | Physical Scaling | The screen's short side keeps at least this many layout units (small phones shrink the unit instead of losing the UI). | |
Target Unit Millimetres (TargetUnitMillimetres) | float | 0.105000 | Physical Scaling | Size of one layout unit on the glass of a phone or tablet. | |
Apply Platform Safe Area (bApplyPlatformSafeArea) | bool | True | Safe Area | The platform's safe area (notch, rounded corners, home indicator) moves every screen's parts inside it. | |
Simulate Phone (bSimulatePhone) | bool | False | Simulation | Simulate a phone on PC (physical scaling with Simulated DPI, phone layouts, the simulated safe area). RSE.UI.Phone.Simulate overrides it. | |
Simulated DPI (SimulatedDPI) | float | 405.000000 | Simulation | DPI of the simulated phone (a 6.5" 2400 x 1080 phone is about 405). | |
Simulated Resolution (SimulatedResolution) | FIntPoint | (X=2400,Y=1080) | Simulation | Screen size used when there is no game viewport (headless tests, tools). | |
Simulated Safe Insets (SimulatedSafeInsets) | FMargin | (Left=96.000000,Right=48.000000,Bottom=42.000000) | Simulation | Safe-area insets of the simulated phone, in pixels (left, top, right, bottom; a landscape notch is on the left). | |
Min Touch Target MM (MinTouchTargetMM) | float | 9.000000 | Touch Targets | Smallest size of anything a finger presses (buttons, rows, touch controls): 9 mm is about 48 dp. |
RPG Saga Engine: Platform
Class URSEPlatformSettings (module RSE), Project Settings, Project, RPG Saga Engine. How the game reacts to platform events (D-170, docs/product/platforms.md): controller disconnects, sign-outs, app suspend and the front end's "press start".
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Pause on Suspend (bPauseOnSuspend) | bool | True | App Lifecycle | The app being suspended (sent to the background) pauses the game until it resumes. Bind On App Resumed (Platform User subsystem) to open a pause menu on resume instead. | |
Allow Continue Without Controller (bAllowContinueWithoutController) | bool | True | Controllers | The reconnect screen can be dismissed with Confirm from another device (keyboard on PC, the built-in controls of a handheld). Off = only a reconnecting controller closes it (console behaviour). | |
Pause on Controller Disconnect (bPauseOnControllerDisconnect) | bool | True | Controllers | The primary user's controller disconnecting pauses the game and shows the reconnect screen until it reconnects. | |
Continue Action Text (ContinueActionText) | FText | NSLOCTEXT("RSEPlatform", "ContinueAction", "Continue") | Controllers | Action of the confirm prompt when the screen may be dismissed without a controller. | |
Reconnect Detail (ReconnectDetail) | FText | NSLOCTEXT("RSEPlatform", "ReconnectDetail", "Reconnect the controller to continue.") | Controllers | ||
Reconnect Title (ReconnectTitle) | FText | NSLOCTEXT("RSEPlatform", "ReconnectTitle", "Controller disconnected") | Controllers | ||
Reconnect Widget Class (ReconnectWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Controllers | The reconnect screen (a Widget Blueprint derived from RSE Screen Widget; empty = the framework's screen). | |
Reconnect ZOrder (ReconnectZOrder) | int32 | 950 | Controllers | Z-order of the reconnect screen (above every other screen). | |
Return to Title on Sign Out (bReturnToTitleOnSignOut) | bool | True | Users | The primary user signing out returns to the title screen (Game Flow -> Main Menu Map). | |
Select User on Press Start (bSelectUserOnPressStart) | bool | True | Users | The front end's "press start" makes the user of the pressing device the primary user (whose saves are used). |
RPG Saga Engine: Players & Authority
Class URSEPlayersSettings (module RSE), Project Settings, Project, RPG Saga Engine. Who the players are, who has authority over the game logic and how pause and time dilation behave (D-134, docs/design/networking.md §3.7–3.9).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Authority Policy Class (AuthorityPolicyClass) | TSubclassOf<URSEAuthorityPolicy> | /Script/CoreUObject.Class'/Script/RSE.RSEAuthorityPolicy' | Authority | Decides whether this machine runs the game logic (encounters, spawners, roaming enemies, NPC schedules, traps, map fog, travel...) and whether a multiplayer session is running. Default: authority everywhere except on network clients. | |
Guest Start Spacing (GuestStartSpacing) | float | 150.000000 | Players | Distance between the host and each other player when they start a map (side by side, alternating sides). | |
Player Provider Class (PlayerProviderClass) | TSubclassOf<URSEPlayerProvider> | /Script/CoreUObject.Class'/Script/RSE.RSEPlayerProvider' | Players | Lists the players (controllers), their slots and the host. The default works with the engine's player controllers (single-player, listen server); the networking module replaces it with one that reads the player states. | |
Time Policy Class (TimePolicyClass) | TSubclassOf<URSETimePolicy> | /Script/CoreUObject.Class'/Script/RSE.RSETimePolicy' | Time and Pause | Decides who may pause the world, change the world's time dilation (hit-stop, slow motion) and show tutorials. Default: single-player behaves as always; in a multiplayer session nothing pauses or slows the world for everyone and tutorials stay hidden (D-124 §6). |
RPG Saga Engine: Portrait Studio
Class URSEPortraitStudioSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Portrait & Icon Studio (D-075): renders portraits of characters and speakers from their appearance, and icons for items, abilities and statuses (a mesh render for equipment with a mesh, else a template: theme frame, glyph, tint), into textures under Output Root, and fills the assets' Portrait / Icon...
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Icon Frame (bIconFrame) | bool | False | Icons | The Look's frame around icons too (off by default: the UI frames items by rarity). | |
Render Equipment Meshes (bRenderEquipmentMeshes) | bool | True | Icons | Items with a mesh get a render of it (else a template icon): the item's Item Mesh, else (equipment) its Appearance Part's static mesh, else its skeletal mesh in the reference pose. | |
Buff Tint (BuffTint) | FLinearColor | (R=0.250000,G=0.650000,B=0.350000,A=1.000000) | Icons | ||
Debuff Tint (DebuffTint) | FLinearColor | (R=0.750000,G=0.250000,B=0.300000,A=1.000000) | Icons | ||
Default Tint (DefaultTint) | FLinearColor | (R=0.300000,G=0.360000,B=0.550000,A=1.000000) | Icons | Tint of icons no rule matches. | |
Glyph Fill (GlyphFill) | float | 0.860000 | Icons | Silhouette icons: share of the icon the shape fills. | |
Glyph Letters (GlyphLetters) | int32 | 2 | Icons | Letters taken from the name when no rule gives a glyph. | |
Glyph Outline Color (GlyphOutlineColor) | FLinearColor | (R=0.020000,G=0.020000,B=0.030000,A=0.900000) | Icons | Silhouette icons: outline color and width (share of the icon size; 0 = none). | |
Glyph Outline Width (GlyphOutlineWidth) | float | 0.012000 | Icons | ||
Glyph Rules (GlyphRules) | TArray<FRSEIconGlyphRule> | (44 entries) | Icons | Glyph and tint per tag: the first rule matching the entry's element, type, status or category wins. | |
Glyph Scale (GlyphScale) | float | 0.420000 | Icons | Glyph height as a share of the icon. | |
Glyph Shade Bottom (GlyphShadeBottom) | float | 0.550000 | Icons | ||
Glyph Shade Top (GlyphShadeTop) | float | 1.350000 | Icons | Silhouette icons (rules with a Glyph Texture): the tint is scaled by these at the top and the bottom of the shape. | |
Icon Background (IconBackground) | ERSEStudioBackground | Transparent | Icons | Behind icons (D-126): transparent by default, so the UI draws its own rarity frame and fill around them. Portraits use Look -> Background. | |
Icon Field Of View (IconFieldOfView) | float | 20.000000 | Icons | Field of view of mesh icons (narrow = flat, consistent silhouettes). | |
Icon Fill (IconFill) | float | 1.000000 | Icons | Share of the icon a mesh's bounding sphere fills (the same framing for every item). | |
Icon Light Rig (IconLightRig) | FName | None | Icons | Lighting of mesh icons (Project Settings -> Portraits -> Light Rigs). Empty = Light Rig. | |
Icon Size (IconSize) | ERSEStudioTextureSize | Size256 | Icons | --- Icons --- | |
Item Glyph Rules (ItemGlyphRules) | TArray<FRSEIconGlyphRule> | (35 entries) | Icons | Template icons of items (D-126), checked before Glyph Rules: matched against the item's equipment type, slot type, category and (consumables) its ability's element and type, its name and its kind. The first matching rule wins. | |
Mesh Icon View (MeshIconView) | FRotator | (Pitch=-25.000000,Yaw=35.000000,Roll=0.000000) | Icons | Direction the mesh icons are seen from (items can turn their mesh first: Icon Mesh Rotation). | |
Background (Background) | ERSEStudioBackground | Gradient | Look | --- Look --- | |
Background Bottom (BackgroundBottom) | FLinearColor | (R=0.010000,G=0.012000,B=0.040000,A=1.000000) | Look | ||
Background Top (BackgroundTop) | FLinearColor | (R=0.080000,G=0.100000,B=0.220000,A=1.000000) | Look | ||
Frame (bFrame) | bool | True | Look | A frame (the theme's outline color and corner radius) around portraits and icons. | |
Use Theme Colors (bUseThemeColors) | bool | True | Look | Colors from the UI theme (window fill, outline): portraits and icons match the menus. | |
Corner Radius (CornerRadius) | float | 0.060000 | Look | Corner radius as a share of the texture size (0 = square). | |
Frame Color (FrameColor) | FLinearColor | (R=0.420000,G=0.500000,B=0.720000,A=1.000000) | Look | ||
Frame Thickness (FrameThickness) | float | 0.012000 | Look | Frame width as a share of the texture size. | |
Art Library Name (ArtLibraryName) | FString | DA_GeneratedArt | Output | Name of the generated art library asset (portraits and icons of content outside /Game, e.g. the plugin's starter content). | |
Overwrite Hand Authored (bOverwriteHandAuthored) | bool | False | Output | Replace textures the team set by hand (not made by the studio). Off = those assets are skipped. | |
Register Library (bRegisterLibrary) | bool | True | Output | Adds the library to Project Settings -> Generated Art -> Libraries when it is created. | |
Output Root (OutputRoot) | FDirectoryPath | (set per project) | Output | Folder of the generated textures (Portraits/, Icons/) and of the generated art library. Must be under /Game. | |
Pick Upright Frame (bPickUprightFrame) | bool | True | Portraits | When the pose has no Start Time of its own, the studio samples the animation and keeps the frame where the head is most upright (D-081): idles that nod or look down still give a straight portrait. An anim set's Portrait Pose with a Start Time is the per-character override. | |
Variant Portraits (bVariantPortraits) | bool | True | Portraits | Portraits of each appearance variant (Portrait Variants of characters). | |
Default Pose (DefaultPose) | TSoftObjectPtr<UAnimSequenceBase> | None | Portraits | Pose when the anim set has no Portrait Pose: this animation (on the character's skeleton), else the locomotion idle. | |
Dialog Framing (DialogFraming) | FName | Head | Portraits | Framing of dialog (emotion) portraits of speakers. | |
Emotions (Emotions) | TArray<FGameplayTag> | (5 entries) | Portraits | Dialog portraits per expression for speakers. An expression renders only when the anim set has an animation for it (Portraits -> Expressions); the others fall back to the neutral portrait in the dialog box. | |
Light Rig (LightRig) | FName | Studio | Portraits | Lighting (Project Settings -> Portraits -> Light Rigs). | |
Portrait Framing (PortraitFraming) | FName | Bust | Portraits | Framing of menu portraits (Project Settings -> Portraits -> Framings). | |
Portrait Size (PortraitSize) | ERSEStudioTextureSize | Size512 | Portraits | --- Portraits --- | |
Pose Time (PoseTime) | float | 0.000000 | Portraits | Seconds into the pose animation when it has no Start Time of its own (and Pick Upright Frame is off). | |
Supersample (Supersample) | int32 | 2 | Portraits | Renders at this multiple of the size, then filters down (smooth edges). | |
Upright Frame Samples (UprightFrameSamples) | int32 | 16 | Portraits | Frames sampled for Pick Upright Frame. | |
Warmup Captures (WarmupCaptures) | int32 | 3 | Portraits | Frames rendered before the kept one (shadows and caches settle). | |
Quest Camera Distance (QuestCameraDistance) | float | 1100.000000 | Quest Images | The camera looks at the quest's place (its giver, else its first objective's map marker) from this far (cm, horizontally)... | |
Quest Camera FOV (QuestCameraFOV) | float | 50.000000 | Quest Images | ||
Quest Camera Height (QuestCameraHeight) | float | 450.000000 | Quest Images | ...this high above it (cm)... | |
Quest Camera Yaw (QuestCameraYaw) | float | 225.000000 | Quest Images | ...from this direction (world yaw, degrees; the camera stands on that side of the place). | |
Quest Image Folder (QuestImageFolder) | FString | Quests | Quest Images | Folder under Output Root for the journal pictures of quests (RPG Saga Engine -> Content -> Capture Quest Images). | |
Quest Image Height (QuestImageHeight) | int32 | 240 | Quest Images | ||
Quest Image Width (QuestImageWidth) | int32 | 640 | Quest Images | ||
Quest Target Height (QuestTargetHeight) | float | 120.000000 | Quest Images | The point looked at, above the place (cm): a character's chest. | |
SRGB (bSRGB) | bool | True | Texture | ||
Compression (Compression) | TEnumAsByte<TextureCompressionSettings> | TC_EditorIcon | Texture | ||
LODGroup (LODGroup) | TEnumAsByte<TextureGroup> | TEXTUREGROUP_UI | Texture | --- Texture --- | |
Mip Gen (MipGen) | TEnumAsByte<TextureMipGenSettings> | TMGS_NoMipmaps | Texture |
RPG Saga Engine: Portraits
Class URSEPortraitSettings (module RSE), Project Settings, Project, RPG Saga Engine. Portraits (D-075): framing and lighting presets (shared by the Portrait & Icon Studio and live dialog portraits) and live 3D options.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Allow Live Portraits (bAllowLivePortraits) | bool | True | Dialog Portraits | Live 3D portraits may render (off = images). The Steam Deck profile turns them off with RSE.Dialog.LivePortraits 0. | |
Allow Video Portraits (bAllowVideoPortraits) | bool | True | Dialog Portraits | Video portraits may play (off = every speaker shows its image). | |
Portrait Video Audio (bPortraitVideoAudio) | bool | False | Dialog Portraits | Play the portrait clips' own sound (off: voices stay in the dialog audio system). | |
Live Backdrop Color (LiveBackdropColor) | FLinearColor | (R=0.060000,G=0.080000,B=0.160000,A=1.000000) | Live Portraits | Backdrop color behind a live portrait (a lit plane; alpha 0 = no backdrop: the capture's clear color). | |
Live Capture Interval (LiveCaptureInterval) | float | 0.033333 | Live Portraits | Seconds between live captures (0 = every frame; 1/30 is smooth and half the cost at 60 fps). | |
Live Framing (LiveFraming) | FName | Bust | Live Portraits | Framing of live portraits. | |
Live Light Rig (LiveLightRig) | FName | Studio | Live Portraits | Lighting of live portraits. | |
Live Resolution (LiveResolution) | int32 | 256 | Live Portraits | Render target size of the live portrait (square; one capture is shared by the dialog box). | |
Live Scene Location (LiveSceneLocation) | FVector | (X=0.000000,Y=0.000000,Z=-60000.000000) | Live Portraits | Where the portrait scene stands in the world: far from the playable space (only the subject is rendered). | |
Talk Nod Cm (TalkNodCm) | float | 0.800000 | Live Portraits | Nod while talking, cm up and down. | |
Talk Sway Degrees (TalkSwayDegrees) | float | 2.500000 | Live Portraits | Head sway while talking when the character has no Talk animation (degrees of the body's yaw / roll). | |
Talk Sway Speed (TalkSwaySpeed) | float | 6.000000 | Live Portraits | Speed of the talking sway and nod. | |
Framings (Framings) | TArray<FRSEPortraitFraming> | (5 entries) | Presets | Framing presets, by name. | |
Light Rigs (LightRigs) | TArray<FRSEPortraitLightRig> | (2 entries) | Presets | Lighting rigs, by name. | |
Max Upright Correction (MaxUprightCorrection) | float | 25.000000 | Presets | Most the character is tilted back for Upright Correction. | |
Upright Correction (UprightCorrection) | float | 0.800000 | Presets | Share of the head's remaining lean the studio straightens by tilting the whole character back (D-081): idles that hunch or look down keep their pose, the face comes up. 0 = off. | |
Upright Scan Seconds (UprightScanSeconds) | float | 4.000000 | Presets | Portraits posed by the character's Anim Blueprint (no pose animation): how long its idle is played while the most upright moment of the head is searched (D-081). |
RPG Saga Engine: Progression
Class URSEProgressionSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Character progression rules (D-030): maximum level, the experience curve and the experience enemies give.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Scale Enemy Levels (bScaleEnemyLevels) | bool | True | Enemy Levels | Regular encounters (Level Mode "Scaled") fought in a progression zone set their enemies' level from the party: PartyLevel + EnemyLevelOffset + OverlevelBias * max(0, PartyLevel - ZoneEntryTarget) + the encounter's offset, plus a random spread of +-EnemyLevelVariance per enemy, clamped to the zone's range and the level cap. Off = authored levels everywhere. Encounters in Level Mode "Fixed" never scale. | |
Enemy Level Offset (EnemyLevelOffset) | float | 0.000000 | Enemy Levels | Levels added to the party level (negative = enemies a bit below the party). | |
Enemy Level Variance (EnemyLevelVariance) | int32 | 1 | Enemy Levels | Random spread per enemy: each one gets -N..+N levels (seeded by the battle), then the zone's range clamps it. | |
Overlevel Bias (OverlevelBias) | float | 0.000000 | Enemy Levels | Share of the party's lead over the zone's entry target added on top (0 = none, 1 = enemies climb twice as fast as the party). A player who farmed meets enemies near the top of the zone's range sooner. | |
Party Level Source (PartyLevelSource) | ERSEPartyLevelSource | Average | Enemy Levels | ||
Enemy Defense Bonus Per Level (EnemyDefenseBonusPerLevel) | float | 0.000000 | Enemy Stats | ||
Enemy Defense Stats (EnemyDefenseStats) | FGameplayTagContainer | (GameplayTags=((TagName="Stat.Defense"),(TagName="Stat.Spirit"))) | Enemy Stats | Stats that EnemyDefenseBonusPerLevel raises. Global only. | |
Enemy HPBonus Per Level (EnemyHPBonusPerLevel) | float | 0.000000 | Enemy Stats | Extra growth of enemy stats on top of their class, in percent per level above 1 (enemy characters only, Roster Enemy). 2 = +2% per level, i.e. +98% at level 50. Lets enemies share a class with the party yet scale differently. Negative values weaken high-level enemies; the total never goes below -90%. | |
Enemy HPStats (EnemyHPStats) | FGameplayTagContainer | (GameplayTags=((TagName="Stat.MaxHP"))) | Enemy Stats | Stats that EnemyHPBonusPerLevel raises. Global only. | |
Enemy Offense Bonus Per Level (EnemyOffenseBonusPerLevel) | float | 0.000000 | Enemy Stats | ||
Enemy Offense Stats (EnemyOffenseStats) | FGameplayTagContainer | (GameplayTags=((TagName="Stat.Attack"),(TagName="Stat.Magic"))) | Enemy Stats | Stats that EnemyOffenseBonusPerLevel raises. Global only. | |
Experience Base (ExperienceBase) | float | 15.000000 | Experience Curve | --- Experience curve --- | |
Experience Curve (ExperienceCurve) | TSoftObjectPtr<UCurveFloat> | None | Experience Curve | Optional: total experience (Y) needed to reach each level (X). Replaces the formula when set. | |
Experience Exponent (ExperienceExponent) | float | 2.000000 | Experience Curve | ||
Experience Per Level (ExperiencePerLevel) | float | 0.000000 | Experience Curve | ||
Max Level (MaxLevel) | int32 | 99 | Levels | Highest level. Global only, like the experience curve (saved levels and totals must stay consistent); profiles change rewards. | |
Enemy Experience Base (EnemyExperienceBase) | float | 12.000000 | Rewards | Experience an enemy gives when its character sets none: EnemyExperienceBase + EnemyExperiencePerLevel * (Level - 1). | |
Enemy Experience Per Level (EnemyExperiencePerLevel) | float | 6.000000 | Rewards |
RPG Saga Engine: Progression Designer
Class URSEProgressionDesignerSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The Progression Designer's projection and advisor (D-051, docs/design/progression-designer.md): which stats a class growth recommendation touches, how the advisor weighs the targets, how long it searches and within which bounds.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Max Class Growth Scale (MaxClassGrowthScale) | float | 1.500000 | Advisor|Bounds | Class growth scales stay within [1/x, x]. | |
Max Enemy Bonus Per Level (MaxEnemyBonusPerLevel) | float | 5.000000 | Advisor|Bounds | ||
Max Experience Exponent (MaxExperienceExponent) | float | 3.500000 | Advisor|Bounds | ||
Min Enemy Bonus Per Level (MinEnemyBonusPerLevel) | float | -0.500000 | Advisor|Bounds | ||
Min Experience Exponent (MinExperienceExponent) | float | 1.200000 | Advisor|Bounds | --- Bounds --- | |
Min Recommended Change (MinRecommendedChange) | float | 0.020000 | Advisor|Bounds | Changes smaller than this (relative, or percent points for the bonuses) are not recommended. | |
Recommend Zone Ranges (bRecommendZoneRanges) | bool | True | Advisor|Scope | Suggest zone range changes where the projected party levels leave a zone's range by more than the overlevel margin (unchecked by default in the list). | |
Tune Class Growth (bTuneClassGrowth) | bool | True | Advisor|Scope | Only the campaign's standard classes. | |
Tune Enemy Experience (bTuneEnemyExperience) | bool | True | Advisor|Scope | ||
Tune Enemy Stats (bTuneEnemyStats) | bool | True | Advisor|Scope | ||
Tune Experience Curve (bTuneExperienceCurve) | bool | True | Advisor|Scope | --- What the advisor may change --- | |
Battle Feel Passes (BattleFeelPasses) | int32 | 2 | Advisor|Search | Passes of "battle feel search, then level rounds" after the first level rounds. | |
Initial Percent Step (InitialPercentStep) | float | 0.500000 | Advisor|Search | First step of the enemy stat bonuses (percent points per level). | |
Initial Relative Step (InitialRelativeStep) | float | 0.250000 | Advisor|Search | First step of multiplicative parameters (0.2 = try x1.2 and /1.2); halves when a sweep finds nothing better. | |
Level Rounds (LevelRounds) | int32 | 3 | Advisor|Search | Rounds of "levels search on the fast model, then a full projection": each round replays the newest projection, so battles that change outcome (a party no longer underleveled) feed the next round. | |
Max Battle Evaluations (MaxBattleEvaluations) | int32 | 60 | Advisor|Search | Hard cap on probe evaluations (each = ProbeBattlesPerZone battles per zone plus the key battles). | |
Max Battle Iterations (MaxBattleIterations) | int32 | 6 | Advisor|Search | Sweeps of the coordinate search over enemy stats and class growth (each step simulates probe battles). | |
Max Experience Iterations (MaxExperienceIterations) | int32 | 60 | Advisor|Search | Sweeps of the coordinate search over the experience parameters (fast model, no battles). | |
Min Relative Step (MinRelativeStep) | float | 0.010000 | Advisor|Search | The search stops when every multiplicative step is below this. | |
Model Outcome Margin (ModelOutcomeMargin) | float | 3.000000 | Advisor|Search | Fast model: a battle's outcome flips when the party-minus-enemy level gap moved this many levels away from the baseline's (lost -> won when the gap is also at least -this). | |
Probe Battles Per Zone (ProbeBattlesPerZone) | int32 | 3 | Advisor|Search | Regular battles simulated per zone for each probe evaluation. | |
Boredom Weight (BoredomWeight) | float | 2.000000 | Advisor|Weights | Each 0.1 of boredom index above the maximum. | |
Change Weight (ChangeWeight) | float | 0.500000 | Advisor|Weights | Keeps recommendations small: squared log-ratio of every multiplicative change (and squared percent points of the enemy bonuses / 10). | |
Completion Weight (CompletionWeight) | float | 3.000000 | Advisor|Weights | Each level outside the tolerance of the completion target. | |
Damage Weight (DamageWeight) | float | 2.000000 | Advisor|Weights | Each 10 points of damage taken outside its band. | |
Grind Weight (GrindWeight) | float | 1.000000 | Advisor|Weights | Each 0.1 of grind index above the maximum. | |
Level Weight (LevelWeight) | float | 1.000000 | Advisor|Weights | Each level outside the tolerance of a zone's exit target. | |
Optional Weight (OptionalWeight) | float | 1.000000 | Advisor|Weights | Each 10 post-game battles beyond the reasonable grind for the optional content level. | |
Risk Weight (RiskWeight) | float | 2.000000 | Advisor|Weights | Each 10 points of minimum HP below the floor. | |
Turns Weight (TurnsWeight) | float | 2.000000 | Advisor|Weights | Each party turn outside the turns bands. | |
Chart Stats (ChartStats) | TArray<FGameplayTag> | (7 entries) | Class Growth | Stats shown in the attribute curves (empty = every stat the classes grow). | |
Power Samples (PowerSamples) | int32 | 20 | Class Growth | D-144: levels sampled for the power curves of the progression systems (each sample builds a character with every point spent); the levels in between are interpolated. More = smoother, slower. | |
Power Stats (PowerStats) | FGameplayTagContainer | (GameplayTags=((TagName="Stat.Attack"),(TagName="Stat.Magic"))) | Class Growth | Stats a class's "power" growth scale multiplies (their PerLevel). | |
Vitality Stats (VitalityStats) | FGameplayTagContainer | (GameplayTags=((TagName="Stat.MaxHP"),(TagName="Stat.Defense"),(TagName="Stat.Spirit"))) | Class Growth | Stats a class's "vitality" growth scale multiplies (their PerLevel). | |
Output Folder (OutputFolder) | FString | ProgressionDesigner | Reports | Reports go to Saved/<OutputFolder>/<timestamp>_<campaign>/. |
RPG Saga Engine: Progression Systems
Class URSEGrowthSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Progression systems and ability learning (D-144, docs/design/progression-systems.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Ability Power Share (AbilityPowerShare) | float | 3.000000 | Automatic Allocation | Progression Designer: power each ability gained adds to the power estimate (percent of the level-1 Classic power). | |
Allocation Policy Class (AllocationPolicyClass) | TSoftClassPtr<URSEGrowthAllocationPolicy> | None | Automatic Allocation | Spends points for characters nobody builds by hand: AI-controlled members, autoplay, the battle simulator, Balance My Campaign and the Progression Designer. Blueprintable: override Choose Option. Empty = the built-in policy. | |
Auto Allocate AIControlled (bAutoAllocateAIControlled) | bool | True | Automatic Allocation | After each battle and level up, AI-controlled members (Control = AI) spend their points automatically. | |
Max Auto Steps (MaxAutoSteps) | int32 | 500 | Automatic Allocation | Most steps one automatic allocation takes (safety against content loops). | |
Score Weights (ScoreWeights) | FRSEGrowthScoreWeights | (StatPercent=1.000000,ActiveAbility=12.000000,PassiveAbility=9.000000,PathLookahead=0.600000,UngrownStatWeight=0.250000) | Automatic Allocation | How the built-in policy (and every policy's option scores) value the steps. | |
Simulated Enemies Per Victory (SimulatedEnemiesPerVictory) | float | 3.000000 | Automatic Allocation | D-154: enemies defeated per won battle in a typical playthrough (Battle Points -> Per Enemy Defeated counts this many). The simulator's builds, the board generator's pacing and the fill-level estimate use it with Simulated Victories Per Level. | |
Simulated Victories Per Level (SimulatedVictoriesPerLevel) | float | 4.000000 | Automatic Allocation | Won battles per level the simulator assumes when it builds a typical character (battle points earned on the way); the Progression Designer and Balance My Campaign use it too. | |
Battle Points (BattlePoints) | TArray<FRSEBattlePointReward> | (1 entries) | Battle Points | Points earned for won battles (board points usually; attribute or ability points too). Default: 5 board points per victory. | |
Board Scope (BoardScope) | ERSEGrowthBoardScope | PerClass | Board | ||
Default Board Style (DefaultBoardStyle) | TSoftObjectPtr<URSEGrowthBoardStyle> | /RPGSagaEngine/Data/Growth/Styles/DA_GrowthStyle_Constellation.DA_GrowthStyle_Constellation | Board | Look of boards that name no style. | |
Layout Rules (LayoutRules) | FRSEGrowthLayoutRules | (MinNodeDistance=1.000000,EdgeClearance=0.400000,CurveBend=0.180000,CurveSegments=12) | Board | What makes a board layout clean (D-149): the validator of the editor, the importer and the tests, and the screen's curves. | |
Shared Board (SharedBoard) | TSoftObjectPtr<URSEGrowthBoard> | /RPGSagaEngine/Data/Growth/DA_GrowthBoard_Default.DA_GrowthBoard_Default | Board | The board of Shared scope, and of classes whose plan has no board. | |
Travel Cost Per Step (TravelCostPerStep) | int32 | 0 | Board | Board points per step walked from where the character stands to the node unlocked (through open nodes; 0 = no travel cost, every open node is reachable for free). | |
Enable Enemy Learning (bEnableEnemyLearning) | bool | True | Enemy Learning | --- Learning from enemies --- | |
Never Learnable Types (NeverLearnableTypes) | FGameplayTagContainer | () | Enemy Learning | Abilities of these types are never learned from enemies (attacks, monster-only actions). | |
Trait Learning (TraitLearning) | TArray<FRSETraitLearning> | (0 entries) | Enemy Learning | Traits that let any character learn from enemies (besides the class plans' rules). | |
Fallback Layout (FallbackLayout) | ERSEGrowthLayoutPreset | Constellation | Generator | Layout of Auto when the role names none. | |
Generator Defaults (GeneratorDefaults) | FRSEGrowthGeneratorParams | (Seed=1,EmphasizedStats=(),TargetMaxLevel=50,KeyAttributes=3,AttributePointsPerLevel=3,AbilityPointsPerLevel=1,MilestoneEvery=10,MilestoneBonus=2,ValueShareOfLe... | Generator | Starting inputs of Generate Point Tables / Generate Board (Studio and the plan's buttons copy them). | |
Region Themes (RegionThemes) | TArray<FRSEGrowthRegionTheme> | (4 entries) | Generator | Themes of generated board regions (D-149), in order: a region takes the first theme listing its main stat. | |
Role Emphasis (RoleEmphasis) | TMap<FGameplayTag,FGameplayTagContainer> | (7 entries) | Generator | Stats a generated plan favors per archetype role (Archetype.Role.*), beyond what the class growth says. | |
Role Layouts (RoleLayouts) | TMap<FGameplayTag,ERSEGrowthLayoutPreset> | (7 entries) | Generator | Layout preset per archetype role (Archetype.Role.*) when the generator's Layout is Auto (D-149). | |
Enable Mastery (bEnableMastery) | bool | True | Mastery | Items with Mastery Abilities teach them for good after enough mastery points. | |
Fallen Members Earn Mastery (bFallenMembersEarnMastery) | bool | False | Mastery | Members that ended the battle KO earn mastery too. | |
Mastery Points Per Enemy (MasteryPointsPerEnemy) | int32 | 1 | Mastery | ||
Mastery Points Per Victory (MasteryPointsPerVictory) | int32 | 2 | Mastery | ||
Default Plan (DefaultPlan) | TSoftObjectPtr<URSEGrowthPlan> | /RPGSagaEngine/Data/Growth/DA_GrowthPlan_Default.DA_GrowthPlan_Default | Plans | Plan of classes that have none (points, catalog, board). Empty = such classes only grow by level. | |
Max Undo Steps (MaxUndoSteps) | int32 | 50 | Respec | The Growth page's free undo (D-149): the last steps the player took (raise, learn, unlock) can be taken back for nothing while the page stays open; closing it (or a reset) clears them. Most steps kept per character (0 = no undo). | |
Respec Item (RespecItem) | TSoftObjectPtr<URSEItemData> | None | Respec | Item mode: the item consumed per reset. | |
Respec Mode (RespecMode) | ERSERespecMode | Free | Respec | --- Respec --- | |
Respec Point Penalty (RespecPointPenalty) | float | 0.100000 | Respec | Share of the refundable spent points a full reset keeps for good (D-149: 0.1 = the reset costs 10% of the points spent, rounded, per currency; 0 = everything back). The Growth page says how much before the player confirms. | |
Player Chooses at New Game (bPlayerChoosesAtNewGame) | bool | False | System | The player picks the system when starting a new game (from New Game Choices). | |
New Game Choices (NewGameChoices) | TArray<ERSEProgressionSystem> | (0 entries) | System | Systems offered at New Game, in order. Empty = all three. | |
System (System) | ERSEProgressionSystem | Classic | System | How characters grow. The class level abilities and stat growth stay in every system. | |
New Game Prompt (NewGamePrompt) | FText | NSLOCTEXT("RSEGrowth", "NewGamePrompt", "How should your heroes grow?") | System|Text | The New Game question. | |
System Descriptions (SystemDescriptions) | TMap<ERSEProgressionSystem,FText> | (3 entries) | System|Text | One-line descriptions of the systems (New Game, Studio). | |
System Names (SystemNames) | TMap<ERSEProgressionSystem,FText> | (3 entries) | System|Text | Names of the systems on screen. Missing = the enum's display name. | |
Enable Use Growth (bEnableUseGrowth) | bool | False | Use Growth | Abilities rank up with battle uses (power and cost per rank). | |
Default Use Growth (DefaultUseGrowth) | TSoftObjectPtr<URSEUseGrowthCurve> | /RPGSagaEngine/Data/Growth/DA_UseGrowth_Standard.DA_UseGrowth_Standard | Use Growth | Curve of abilities that name none. Empty = only abilities with their own curve grow. |
RPG Saga Engine: Progression Tools
Class URSEGrowthEditorSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Editor tools of the progression systems (D-144): the Growth Board visual editor, the Studio pages (Progression System, Growth Board, New Teacher, Weapon with Mastery) and the progression JSON importer of the AI workflow (docs/product/progression-ai-schema.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Fallback Prefixes (FallbackPrefixes) | TMap<FString,FString> | (5 entries) | Assets | Asset name prefixes of progression assets (class name -> prefix) used when Content Import -> Types has no type for the class (projects that list their own types). | |
Ability Node Color (AbilityNodeColor) | FLinearColor | (R=0.700000,G=0.350000,B=0.100000,A=1.000000) | Board Editor | ||
Gate Node Color (GateNodeColor) | FLinearColor | (R=0.550000,G=0.120000,B=0.120000,A=1.000000) | Board Editor | ||
Hub Node Color (HubNodeColor) | FLinearColor | (R=0.300000,G=0.300000,B=0.300000,A=1.000000) | Board Editor | ||
Keystone Node Color (KeystoneNodeColor) | FLinearColor | (R=0.750000,G=0.550000,B=0.050000,A=1.000000) | Board Editor | ||
Passive Node Color (PassiveNodeColor) | FLinearColor | (R=0.450000,G=0.250000,B=0.600000,A=1.000000) | Board Editor | ||
Start Node Color (StartNodeColor) | FLinearColor | (R=0.100000,G=0.450000,B=0.100000,A=1.000000) | Board Editor | The start node of the board (any kind) is drawn in this color. | |
Stat Node Color (StatNodeColor) | FLinearColor | (R=0.150000,G=0.350000,B=0.650000,A=1.000000) | Board Editor | Title colors of board nodes per kind in the visual editor. | |
Pool Excluded Name Prefixes (PoolExcludedNamePrefixes) | TArray<FString> | (4 entries) | Generators | Suggested pools leave out abilities whose asset name starts with one of these (item effects, summons, enemy-only actions). | |
Suggested Pool Size (SuggestedPoolSize) | int32 | 10 | Generators | Most abilities the generators' suggested pool holds (abilities of the class's own types and elements, not in the class). | |
Generate Missing by Default (bGenerateMissingByDefault) | bool | True | Progression JSON | Fill what a document leaves out (point tables, board) with the generators, when the document does not say otherwise. | |
File Suffix (FileSuffix) | FString | .progression.json | Progression JSON | Progression documents: the file name ends with this (e.g. Warrior.progression.json). | |
Suggestion Max Distance (SuggestionMaxDistance) | int32 | 3 | Progression JSON | Unknown names get "did you mean" suggestions within this many edits. | |
Template Folder (TemplateFolder) | FString | Config/AIPacks/Progression | Progression JSON | Where the AI pack's progression template lives (schema, prompt notes, checked examples). Relative to the plugin folder. | |
Max Board Nodes (MaxBoardNodes) | int32 | 400 | Progression JSON|Ranges | Most nodes of one board. | |
Max Cost (MaxCost) | int32 | 1000 | Progression JSON|Ranges | Highest cost of a node, catalog ability or attribute point a document may set. | |
Max Mastery Points (MaxMasteryPoints) | int32 | 2000 | Progression JSON|Ranges | Highest mastery points an ability may need. | |
Max Money (MaxMoney) | int32 | 1000000 | Progression JSON|Ranges | Highest price (money) of a teacher's offer or respec. | |
Max Points Per Level (MaxPointsPerLevel) | int32 | 500 | Progression JSON|Ranges | Highest points per level a grant may give. | |
Max Tier (MaxTier) | int32 | 3 | Progression JSON|Ranges | Highest node tier (ring color: 0 common .. rare). | |
Blank Weapon Slot (BlankWeaponSlot) | FGameplayTag | (TagName="Equip.Slot.Weapon") | Studio | Studio -> Weapon with Mastery: the slot of a blank weapon (Equip.Slot.*). | |
Blank Weapon Type (BlankWeaponType) | FGameplayTag | (TagName="Equip.Type.Weapon.Sword") | Studio | Studio -> Weapon with Mastery: the kind of a blank weapon (Equip.Type.*). |
RPG Saga Engine: Puzzle UI
Class URSEPuzzleUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of the puzzles (D-039): the code lock screen, puzzle doors and the optional scene prompt.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Attempts Left Format (AttemptsLeftFormat) | FText | NSLOCTEXT("RSEPuzzleUI", "AttemptsLeftFormat", "Attempts left: {Count}") | Code Lock | {Count} = wrong codes still allowed. | |
Clock Separator (ClockSeparator) | FText | NSLOCTEXT("RSEPuzzleUI", "ClockSeparator", ":") | Code Lock | Between the hour and minute wheels of a clock lock. | |
Code Lock Backdrop Color (CodeLockBackdropColor) | FRSEUIColor | (Token="Primary",Alpha=0.650000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Code Lock | Dims the world behind the lock. | |
Code Lock Widget Class (CodeLockWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Code Lock | Code lock screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSECodeLockViewModel (docs/product/custom-ui.md). | |
Code Lock ZOrder (CodeLockZOrder) | int32 | 55 | Code Lock | Z-order in the viewport (above the HUDs and the party menu). | |
Default Lock Title (DefaultLockTitle) | FText | NSLOCTEXT("RSEPuzzleUI", "DefaultLockTitle", "Lock") | Code Lock | Title when the lock has no Display Name. | |
Default Wrong Text (DefaultWrongText) | FText | NSLOCTEXT("RSEPuzzleUI", "DefaultWrongText", "Nothing happens.") | Code Lock | Shown after a wrong code when the lock has no Failure Text. | |
Leave Text (LeaveText) | FText | NSLOCTEXT("RSEPuzzleUI", "LeaveText", "Leave") | Code Lock | ||
Select Wheel Action Text (SelectWheelActionText) | FText | NSLOCTEXT("RSEPuzzleUI", "SelectWheelAction", "Select") | Code Lock | Key hint actions. | |
Submit Text (SubmitText) | FText | NSLOCTEXT("RSEPuzzleUI", "SubmitText", "Enter") | Code Lock | ||
Turn Wheel Action Text (TurnWheelActionText) | FText | NSLOCTEXT("RSEPuzzleUI", "TurnWheelAction", "Turn") | Code Lock | ||
Wheel Down Glyph (WheelDownGlyph) | FText | NSLOCTEXT("RSEPuzzleUI", "WheelDownGlyph", "▼") | Code Lock | ||
Wheel Up Glyph (WheelUpGlyph) | FText | NSLOCTEXT("RSEPuzzleUI", "WheelUpGlyph", "▲") | Code Lock | Glyphs of the wheel arrows (clickable). | |
Wheel Width (WheelWidth) | float | 84.000000 | Code Lock | ||
Door Open Seconds (DoorOpenSeconds) | float | 1.200000 | Doors | Seconds a puzzle door takes to open when its conditions become true (0 = at once). Doors may override it. | |
Door Placeholder Mesh (DoorPlaceholderMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Doors | Mesh of doors without their own (placeholder). | |
Optional Scene Prompt on Screen (bOptionalScenePromptOnScreen) | bool | True | Optional Scenes | The optional scene prompt sits at the screen anchor of the interaction prompt, not above the trigger. | |
Optional Scene Priority (OptionalScenePriority) | int32 | 5 | Optional Scenes | Focus priority of optional scene triggers (they win over nearby objects). | |
Optional Scene Prompt Format (OptionalScenePromptFormat) | FText | NSLOCTEXT("RSEPuzzleUI", "OptionalScenePromptFormat", "Optional scene: {Title}") | Optional Scenes | Prompt of an optional scene. {Title} = the scene's Display Name. | |
Optional Scene Range (OptionalSceneRange) | float | 400.000000 | Optional Scenes | Range of optional scene triggers without their own. |
RPG Saga Engine: Puzzles
Class URSEPuzzleSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Puzzle rules and texts (D-039, docs/design/puzzles.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Combine Fail Text (CombineFailText) | FText | NSLOCTEXT("RSEPuzzle", "CombineFailText", "These don\'t go together.") | Combine | Shown when no recipe matches. | |
Combine Success Format (CombineSuccessFormat) | FText | NSLOCTEXT("RSEPuzzle", "CombineSuccessFormat", "Obtained: {Result}.") | Combine | Shown after a successful combination (recipes may have their own lines). {Result}, {Count}. | |
Recipes (Recipes) | TArray<TSoftObjectPtr<URSEItemRecipeData> > | (1 entries) | Combine | Every recipe of the game. Any two items may be tried together; the combination succeeds when a recipe matches (the player does not need to know the recipe first). Global list, loaded when the player combines. | |
Pickup Format (PickupFormat) | FText | NSLOCTEXT("RSEPuzzle", "PickupFormat", "Obtained: {Item}.") | Examine | Said when an examined object gives an item and the pickup has no lines of its own. {Item}, {Count}. | |
Decline Option (DeclineOption) | FText | NSLOCTEXT("RSEPuzzle", "DeclineOption", "Leave it") | Use Item | The option that uses nothing. | |
Default Refusal Lines (DefaultRefusalLines) | TArray<FText> | (1 entries) | Use Item | Said when an item the object does not accept is used on it (an item-use asset may have its own lines). | |
Use Option Format (UseOptionFormat) | FText | NSLOCTEXT("RSEPuzzle", "UseOptionFormat", "Use the {Item}") | Use Item | One option per accepted item. {Item} = the item. | |
Use Prompt Format (UsePromptFormat) | FText | NSLOCTEXT("RSEPuzzle", "UsePromptFormat", "Use the {Item}?") | Use Item | Question asked when the party holds one item the object accepts. {Item} = the item. | |
Use Several Prompt (UseSeveralPrompt) | FText | NSLOCTEXT("RSEPuzzle", "UseSeveralPrompt", "Use an item?") | Use Item | Question asked when the party holds several items the object accepts. |
RPG Saga Engine: Quest UI
Class URSEQuestUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Look and behaviour of the quest journal, the HUD quest tracker, quest notifications and the Pact page.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Abandoned Color (AbandonedColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.056772,Chroma=0.921091,Hue=15.394094,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Ability Learned Color (AbilityLearnedColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.079403,Chroma=0.651117,Hue=-15.902557,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Learned-ability notices (D-082). | |
Completed Color (CompletedColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Failed Color (FailedColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.034214,Chroma=1.006407,Hue=0.868554,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Missed Color (MissedColor) | FRSEUIColor | (Token="Secondary",Alpha=1.000000,Lightness=0.006516,Chroma=0.886550,Hue=105.310432,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Objective Color (ObjectiveColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.071629,Chroma=0.579612,Hue=2.998248,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Quest Started Color (QuestStartedColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Toast Background Color (ToastBackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=0.900000,Lightness=-0.412186,Chroma=0.525066,Hue=10.617354,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Tracker Background Color (TrackerBackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=0.620000,Lightness=-0.417701,Chroma=0.449361,Hue=5.975613,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | --- Colors --- | |
Battle Check Interval (BattleCheckInterval) | float | 0.250000 | HUD | How often the presentation checks whether a battle runs (hides the tracker, holds notifications). | |
Game Modes Without Quest HUD (GameModesWithoutQuestHUD) | TArray<TSoftClassPtr<AGameModeBase> > | (1 entries) | HUD | No quest HUD in worlds run by these game modes (main menu). | |
Quest HUDClass (QuestHUDClass) | TSoftClassPtr<URSEScreenWidget> | /Script/RSE.RSEQuestHUDWidget | HUD | Quest tracker and notifications HUD (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEQuestHUDViewModel (docs/product/custom-ui.md). | |
Viewport ZOrder (ViewportZOrder) | int32 | 1 | HUD | ||
Confirm Abandon (bConfirmAbandon) | bool | True | Journal | Abandoning needs a second Confirm on the same row. | |
Journal Categories (JournalCategories) | TArray<FRSEJournalCategoryTab> | (4 entries) | Journal | Journal tabs, in order. | |
Journal Details Width (JournalDetailsWidth) | float | 680.000000 | Journal | Width of the quest details column (the quest list uses the party menu column width). | |
Block Spacing (BlockSpacing) | float | 14.000000 | Journal|Pictures | Space between the journal's blocks (picture, key line, text, objectives, rewards). | |
Show Characters (bShowCharacters) | bool | True | Journal|Pictures | Show the portraits of the quest's characters (Quest -> Characters). | |
Show Header Image (bShowHeaderImage) | bool | True | Journal|Pictures | Show the quest's header picture (or, without one, a band in the category's color). | |
Show Mini Map (bShowMiniMap) | bool | True | Journal|Pictures | Show a mini-map of the current objective (when the level's map can show it); a click opens the Map tab there. | |
Show Rewards (bShowRewards) | bool | True | Journal|Pictures | Show what a quest's success gives (items, money, experience...). | |
Category Colors (CategoryColors) | TMap<FGameplayTag,FRSEUIColor> | (4 entries) | Journal|Pictures | Colors of the header band of a quest without a picture, by category (missing = the started color). | |
Character Portrait Size (CharacterPortraitSize) | float | 52.000000 | Journal|Pictures | ||
Experience Reward Format (ExperienceRewardFormat) | FText | NSLOCTEXT("RSEQuestUI", "ExperienceRewardFormat", "{Amount} XP") | Journal|Pictures | Reward rows: experience ("{Amount} XP") and points ("{Amount} {Currency}"). | |
Header Image Height (HeaderImageHeight) | float | 150.000000 | Journal|Pictures | Height of the header picture (the width is the details column's). | |
Key Line Color (KeyLineColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.026962,Chroma=0.677076,Hue=0.810119,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Journal|Pictures | The highlighted line (the current objective) and its band. | |
Key Line Fill (KeyLineFill) | FRSEUIColor | (Token="Accent",Alpha=0.120000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Journal|Pictures | ||
Mini Map Hint (MiniMapHint) | FText | NSLOCTEXT("RSEQuestUI", "MiniMapHint", "Click to open the map here") | Journal|Pictures | ||
Mini Map Size (MiniMapSize) | float | 150.000000 | Journal|Pictures | ||
Mini Map Span (MiniMapSpan) | float | 0.300000 | Journal|Pictures | Share of the whole map the mini-map shows around the objective (0.25 = a quarter of the map's side). | |
Objective Icon Size (ObjectiveIconSize) | float | 26.000000 | Journal|Pictures | ||
Objective Kind Icons (ObjectiveKindIcons) | TMap<FGameplayTag,TSoftObjectPtr<UTexture2D> > | (7 entries) | Journal|Pictures | Icons of the objective kinds (Quest.Objective.*; a kind without one uses its parent's, then Quest.Objective's). | |
Objective Kind Labels (ObjectiveKindLabels) | TMap<FGameplayTag,FText> | (7 entries) | Journal|Pictures | Names of the objective kinds (tooltips, Blueprint screens). | |
Points Reward Format (PointsRewardFormat) | FText | NSLOCTEXT("RSEQuestUI", "PointsRewardFormat", "{Amount} {Currency}") | Journal|Pictures | ||
Reward Icons (RewardIcons) | TMap<ERSERewardKind,TSoftObjectPtr<UTexture2D> > | (7 entries) | Journal|Pictures | Icons of rewards without their own (money, experience, points; items and abilities use theirs, recruits their portrait). | |
Reward Icon Size (RewardIconSize) | float | 34.000000 | Journal|Pictures | ||
Rewards Header (RewardsHeader) | FText | NSLOCTEXT("RSEQuestUI", "RewardsHeader", "Rewards") | Journal|Pictures | ||
Ability Forgotten Format (AbilityForgottenFormat) | FText | NSLOCTEXT("RSEQuestUI", "AbilityForgottenFormat", "{Character} forgot {Ability}.") | Notifications | Body of the forgotten-ability notice. Arguments: {Character}, {Ability}. | |
Ability Learned Format (AbilityLearnedFormat) | FText | NSLOCTEXT("RSEQuestUI", "AbilityLearnedFormat", "{Character} learned {Ability}!") | Notifications | Body of the learned-ability notice. Arguments: {Character}, {Ability}. | |
Ability Learned Header (AbilityLearnedHeader) | FText | NSLOCTEXT("RSEQuestUI", "AbilityLearnedHeader", "New Ability") | Notifications | Header of the learned-ability notice. | |
Hold Toasts in Battle (bHoldToastsInBattle) | bool | True | Notifications | Notifications wait while a battle runs and appear afterwards. | |
Toast Abandoned Quests (bToastAbandonedQuests) | bool | False | Notifications | ||
Toast Learned Abilities (bToastLearnedAbilities) | bool | True | Notifications | Notify abilities learned or forgotten for good (Learn Ability / Forget Ability effects, scrolls; D-082). | |
Toast Objective Progress (bToastObjectiveProgress) | bool | True | Notifications | Notify counter changes ("Wolves 2/5"), not only completed objectives. | |
Toast Quests Missed Before Start (bToastQuestsMissedBeforeStart) | bool | False | Notifications | Notify quests missed before the player ever started them (they always appear in the journal). | |
Max Queued Toasts (MaxQueuedToasts) | int32 | 8 | Notifications | Notifications waiting beyond this are dropped (oldest first). | |
Max Visible Toasts (MaxVisibleToasts) | int32 | 3 | Notifications | ||
Toast Alignment (ToastAlignment) | FVector2D | (X=0.500000,Y=0.000000) | Notifications | ||
Toast Anchor (ToastAnchor) | FVector2D | (X=0.500000,Y=0.100000) | Notifications | --- Notifications --- | |
Toast Duration (ToastDuration) | float | 3.500000 | Notifications | ||
Toast Spacing (ToastSpacing) | float | 6.000000 | Notifications | ||
Toast Width (ToastWidth) | float | 420.000000 | Notifications | ||
Hide Tracker in Battle (bHideTrackerInBattle) | bool | True | Tracker | ||
Show Tracker (bShowTracker) | bool | True | Tracker | --- Tracker --- | |
Tracker Shows Optional Objectives (bTrackerShowsOptionalObjectives) | bool | True | Tracker | ||
Max Tracker Objectives (MaxTrackerObjectives) | int32 | 4 | Tracker | Open objectives listed under the tracked quest. | |
Tracker Alignment (TrackerAlignment) | FVector2D | (X=1.000000,Y=0.000000) | Tracker | ||
Tracker Anchor (TrackerAnchor) | FVector2D | (X=1.000000,Y=0.000000) | Tracker | Normalized screen anchor and pivot of the tracker panel, plus a pixel offset (default: under the minimap, D-092). | |
Tracker Offset (TrackerOffset) | FVector2D | (X=-24.000000,Y=296.000000) | Tracker | ||
Tracker Width (TrackerWidth) | float | 320.000000 | Tracker |
RPG Saga Engine: Quests
Class URSEQuestSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Quest system rules (Project Settings -> RPG Saga Engine -> Quests).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Ending Set (EndingSet) | TSoftObjectPtr<URSEEndingSetData> | None | Endings | The game's endings, key choices, hidden score and point of no return. | |
Auto Track Started Quests (bAutoTrackStartedQuests) | bool | True | Quests | A newly started quest becomes the tracked quest when nothing is tracked. | |
Load Quests from Asset Manager (bLoadQuestsFromAssetManager) | bool | True | Quests | Load every quest registered with the Asset Manager (type RSEQuestData) when the game starts, so availability and auto-start are evaluated for all of them. Quest assets are small (heavy references must be soft). | |
Max Evaluation Passes (MaxEvaluationPasses) | int32 | 64 | Quests | Safety cap on chained re-evaluations in one update (effects that change state which completes more objectives...). Reaching it means content loops; it is logged as an error. |
RPG Saga Engine: Reinforcements
Class URSEReinforcementSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Reinforcements and scripted battle events (D-117, docs/product/reinforcements.md): an enemy calls its friends, who appear out of sight and run to the fight; important battles pause for a line and a turn.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Incoming Blackboard Key (IncomingBlackboardKey) | FName | IncomingReinforcements | Calling | The AI team blackboard key that holds how many reinforcements are on their way for a team (D-056 blackboard): AI profile rules may read it (hold back, defend the caller) while help is coming. Empty = not written. | |
Interrupting Statuses (InterruptingStatuses) | FGameplayTagContainer | (GameplayTags=((TagName="Status.Silence"),(TagName="Status.Sleep"),(TagName="Status.Daze"),(TagName="Status.Stop"))) | Calling | Statuses that stop a caller from calling (and, when its data says so, cancel a call in progress): silence, sleep, a daze. A caller that is not standing (fallen, gone) never calls. | |
Max Units Per Wave (MaxUnitsPerWave) | int32 | 8 | Calling | Most units one wave may bring (a safety cap over the data). | |
Reinforcements (bReinforcements) | bool | True | General | Off = no reinforcement is ever called (the data stays; scripted battle events still run). | |
Scripted Events (bScriptedEvents) | bool | True | General | Off = scripted battle events never run. | |
Grid Enter at Edge (bGridEnterAtEdge) | bool | True | Other Modes | Grid Tactics: reinforcements enter on the grid's edge tiles (the nearest to the caller), else next to the caller. | |
Classic Row (ClassicRow) | ERSEATBRow | Front | Other Modes | ATB / turn-based: the row reinforcements take when their data does not say. | |
Grid Min Party Tiles (GridMinPartyTiles) | int32 | 3 | Other Modes | Grid Tactics: edge tiles closer than this to a party unit are skipped (tiles, Manhattan). | |
Classic Act Now Shift (ClassicActNowShift) | float | 1.000000 | Scripted Events | Grid Tactics, ATB and turn-based have no inserted turns: a scripted event's "acts now" moves the unit's next turn this much sooner (a fraction of a turn: 1 = a whole turn). | |
Max Events Per Step (MaxEventsPerStep) | int32 | 4 | Scripted Events | Most scripted events that may fire at one safe point (a guard against events that trigger each other). | |
Hide from Party Sight (bHideFromPartySight) | bool | True | Spawn Points | Points must also be hidden from the party's line of sight (not only out of the camera's view). | |
Concealment Radius (ConcealmentRadius) | float | 3.000000 | Spawn Points | How far around a point obstacles count for the concealment preference (meters). | |
Concealment Weight (ConcealmentWeight) | float | 0.600000 | Spawn Points | Preference for points next to tall obstacles (trees, rocks, walls): they come out of the forest. 0 = none. | |
Edge Weight (EdgeWeight) | float | 1.000000 | Spawn Points | Preference for points far from the party (the edges of the battle area). 0 = none. | |
Max Samples (MaxSamples) | int32 | 800 | Spawn Points | Most candidate points tested per wave (each one runs a line of sight check per party member). | |
Min Party Distance (MinPartyDistance) | float | 10.000000 | Spawn Points | Spawn points closer than this to any party member are never used (meters, 2D). | |
Sample Spacing (SampleSpacing) | float | 1.000000 | Spawn Points | Spacing of the candidate points sampled around the caller (meters). Smaller = more candidates, more cost. | |
Unit Spacing (UnitSpacing) | float | 0.800000 | Spawn Points | Room between two units of the same wave (meters, edge to edge). |
RPG Saga Engine: Reinforcements (Presentation)
Class URSEReinforcementPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How reinforcements and scripted battle events look and sound (D-117): the caller's bubble, the banner, the runners, the minimap markers, the lines of scripted events.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Announce Sound (AnnounceSound) | FGameplayTag | (TagName="Audio.Battle.Reinforcement.Announce") | Audio | Sound of the "Reinforcements!" banner. | |
Arrival Sound (ArrivalSound) | FGameplayTag | (TagName="Audio.Battle.Reinforcement.Arrive") | Audio | Sound when a wave joins. | |
Call Sound (CallSound) | FGameplayTag | (TagName="Audio.Battle.Reinforcement.Call") | Audio | Sound of a call when the data has none (an Audio.* tag of the sound catalog). | |
Bubble Back Color (BubbleBackColor) | FRSEUIColor | (Token="Primary",Alpha=0.820000,Lightness=-0.279664,Chroma=0.119391,Hue=21.873074,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Bubbles | ||
Bubble Height (BubbleHeight) | float | 70.000000 | Bubbles | Height of a bubble above the unit's head (cm). | |
Bubble Text Color (BubbleTextColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=0.006437,Chroma=2.642451,Hue=162.667007,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Bubbles | --- Bubbles --- | |
Bubble Wrap Width (BubbleWrapWidth) | float | 320.000000 | Bubbles | Widest a bubble's text wraps at (px). | |
Announce Text (AnnounceText) | FText | NSLOCTEXT("RSEReinforcementPresentation", "AnnounceText", "Reinforcements!") | Call | Banner when help is called (data without its own text). | |
Arrived Text (ArrivedText) | FText | NSLOCTEXT("RSEReinforcementPresentation", "ArrivedText", "Reinforcements arrive!") | Call | Banner when a wave joins the battle. Empty = no banner. | |
Banner Seconds (BannerSeconds) | float | 1.600000 | Call | How long the banners stay (real seconds). | |
Call Focus Seconds (CallFocusSeconds) | float | 1.200000 | Call | The battle waits this long on the caller when a call starts (the camera shows it calling; game seconds). | |
Calling Color (CallingColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.016729,Chroma=1.097072,Hue=-1.844743,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Call | ||
Calling Icon (CallingIcon) | FText | INVTEXT("(!)") | Call | The icon over a unit that is calling for help (a short text or symbol, shown in the bubble before the bark). | |
Cancelled Text (CancelledText) | FText | NSLOCTEXT("RSEReinforcementPresentation", "CancelledText", "Cut off!") | Call | Shown over the caller when its call was stopped ("Silenced!"). Empty = nothing. | |
Default Call Bark (DefaultCallBark) | FText | NSLOCTEXT("RSEReinforcementPresentation", "DefaultCallBark", "To me!") | Call | What a caller shouts when its data has no bark. | |
Area Margin (AreaMargin) | float | 4.000000 | Runners | Extra room around the farthest reinforcement point when the area grows (meters). | |
Grow Area for Reinforcements (bGrowAreaForReinforcements) | bool | True | Runners | The battle area grows to take the farthest reinforcement point (within Free Tactics (Presentation) -> Max Area Size). | |
Require Nav Mesh (bRequireNavMesh) | bool | True | Runners | On a map with a navigation mesh, spawn points must lie on it. | |
Camera Margin (CameraMargin) | float | 4.000000 | Runners | Margin inside the screen edges a spawn point must stay out of (degrees of the view's half angles). | |
Leftover Behavior (LeftoverBehavior) | TSoftObjectPtr<URSERoamingBehaviorData> | /RPGSagaEngine/Data/Encounters/Roaming/DA_Roam_Aggressive.DA_Roam_Aggressive | Runners | Behavior of reinforcements left in the world when the battle ended before they arrived (Leftover = Become Roaming). Empty = Aggressive. | |
Marker Category (MarkerCategory) | FGameplayTag | (TagName="Map.Marker.Reinforcement") | Runners | The minimap / compass category of units on their way (Map & Minimap categories). | |
Min Run Seconds (MinRunSeconds) | float | 1.500000 | Runners | They run at least this long before they may be handed to the battle (real seconds), so the player sees them come. | |
Run Speed (RunSpeed) | float | 520.000000 | Runners | How fast the reinforcements run in (cm/s). | |
Stop Distance (StopDistance) | float | 3.000000 | Runners | They stop running this far from the caller (meters). | |
Confirm Skips Line (bConfirmSkipsLine) | bool | True | Scripted Events | The confirm input skips a scripted line (not a dialog: the dialog has its own input). | |
Show Speaker Banner (bShowSpeakerBanner) | bool | True | Scripted Events | The speaker's name in front of a scripted line in the banner ("Varg: ..."). | |
Cinematic Distance (CinematicDistance) | float | 900.000000 | Scripted Events | Cinematic camera of scripted events: the distance to the speaker (cm). | |
Script Line Seconds (ScriptLineSeconds) | float | 2.800000 | Scripted Events | How long a scripted line stays when its event does not say (real seconds). |
RPG Saga Engine: Reward Feed
Class URSERewardFeedSettings (module RSE), Project Settings, Project, RPG Saga Engine. Reward feed (D-128).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Announce Loot Placements (bAnnounceLootPlacements) | bool | True | Style | D-143: loot dealt into the members' bags outside battles (chests, pick-ups, quests, shops) shows a toast per receiver ("Potion x2 -> Mira"), with the style's Items provider texts. Battle rewards name the receivers in their own toasts. | |
Kind Icons (KindIcons) | TMap<FName,TSoftObjectPtr<UTexture2D> > | (9 entries) | Style | Glyph of each kind of toast without an icon of its own (tinted with the kind's color). The plugin's defaults use its glyphs. | |
Style (Style) | TSoftObjectPtr<URSERewardFeedStyle> | None | Style | The look, timings and providers. Empty = the built-in style. | |
Widget Class (WidgetClass) | TSoftClassPtr<URSERewardFeedWidget> | None | Style | The widget that shows the feed on each local player's screen. Empty = the built-in one (painted, no widget per toast). | |
ZOrder (ZOrder) | int32 | 12 | Style | Viewport Z order of the feed (over the HUD, under modal screens). |
RPG Saga Engine: Rules Profiles
Class URSERulesSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Rules profiles (D-035).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Session Rule Options (SessionRuleOptions) | TArray<FName> | (4 entries) | Co-op | Option rows that change rules of play (D-139): in co-op their values are the host's for everyone (a guest sees them greyed out) and only the host changes them. Ids of the options screen's rows; add a game's own rule rows here. | |
Default Profile (DefaultProfile) | TSoftObjectPtr<URSERulesProfile> | /RPGSagaEngine/Data/Rules/DA_Rules_Default.DA_Rules_Default | Rules Profiles | Profile of a new game (and of saves that have none). Empty = the global settings only. Story effects ("Set Rules Profile") switch the game's profile later; encounters may override it per battle. |
RPG Saga Engine: Save
Class URSESaveSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Save/load rules (D-010).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Autosave Slot Count (AutosaveSlotCount) | int32 | 1 | Autosave | Autosave slots in rotation: each autosave goes to an empty one, else overwrites the oldest. 1 = the usual single autosave (playtest 2026-09-28); the save screen lists extra autosave slots only once they hold a save. | |
Autosave in No Save Zones (bAutosaveInNoSaveZones) | bool | False | Autosave | Zone transition autosaves also in no-save areas (by default they are skipped there, like the save item). | |
Autosave on Zone Transition (bAutosaveOnZoneTransition) | bool | True | Autosave | Autosave when the player arrives on another map through a zone exit, the world map or a story travel. | |
Min Seconds Between Autosaves (MinSecondsBetweenAutosaves) | float | 30.000000 | Autosave | Zone transition autosaves closer than this to the previous autosave are skipped (walking back and forth). | |
Zone Autosave Delay (ZoneAutosaveDelay) | float | 0.500000 | Autosave | Delay after arriving before the zone transition autosave (the new map settles, the thumbnail shows it). | |
Backend (Backend) | ERSESaveBackendType | File | Backend | Where save slots are stored. File: our own files with checksum, atomic replace and backup (default, PC / Steam Deck). Save Game System: the engine's platform save system (ISaveGameSystem), which console SDKs implement. Custom: a C++ class implementing IRSESaveBackend. | |
Custom Backend Class (CustomBackendClass) | TSoftClassPtr<UObject> | None | Backend | The backend class when Backend = Custom (a C++ class implementing IRSESaveBackend). | |
Suspend Flush Timeout (SuspendFlushTimeout) | float | 2.000000 | Backend | Seconds the app waits for save writes in flight when it is suspended (the platform may stop it right after). | |
Session Policy Class (SessionPolicyClass) | TSoftClassPtr<URSESaveSessionPolicy> | None | Co-op | Who may save and load during a co-op session and what a refused player reads (default: only the host; the host may load while guests are connected). Empty = RSE Save Session Policy. | |
Keep Backup (bKeepBackup) | bool | True | Files | Keep the previous good save of each slot as a backup (.bak) that loads when the slot is damaged (File backend). | |
Min Free Disk Space MB (MinFreeDiskSpaceMB) | int32 | 1 | Files | Free disk space a save must leave (File backend): a write that would go below it fails with No Space before touching the slot. 0 = no check. | |
Legacy Player Options Sections (LegacyPlayerOptionsSections) | TArray<FString> | (1 entries) | Player Options | Older GameUserSettings.ini sections that held the player options (e.g. a section of an earlier version of the game). At the first access, when [RSE.PlayerOptions] is empty, their keys are copied into it and the old section is removed, so the players keep their options. Empty = nothing to migrate. | |
Autosave Slot Name (AutosaveSlotName) | FString | Autosave | Slots | Autosave slot file name (never overwritten by manual saves, D-010). With several autosave slots the others are Name1, Name2... Empty = no autosave at all. | |
Slot Count (SlotCount) | int32 | 3 | Slots | Manual save slots offered by the save/load menus. | |
Slot Name Prefix (SlotNamePrefix) | FString | Slot | Slots | Manual slot file names are Prefix + index (Slot0, Slot1...). | |
User Index (UserIndex) | int32 | 0 | Slots | Platform user index of the saves while no platform user is known (D-170: URSEPlatformUserSubsystem sets the primary user). |
RPG Saga Engine: Save UI
Class URSESaveUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Save/load user flow (D-010): save points, the save item, the slot screens and restoring the player on load.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Map Area Names (MapAreaNames) | TMap<TSoftObjectPtr<UWorld> ,FText> | (0 entries) | Areas | Area name per map, used when the player stands in no ARSEAreaVolume. | |
Unknown Area Name (UnknownAreaName) | FText | Areas | Area name when neither a volume nor MapAreaNames names the place. Empty = the map's asset name. | ||
Autosave at Save Points (bAutosaveAtSavePoints) | bool | True | Rules | Save points write the autosave slot as soon as they are used (D-010), before the slot screen opens. | |
Lock Screen After Save (bLockScreenAfterSave) | bool | True | Rules | After a successful save the slot screen only accepts closing (one save per use, so one item per save). | |
Restore Party at Save Points (bRestorePartyAtSavePoints) | bool | True | Rules | Save points fully restore the party (HP/MP, KO, statuses) before saving, RSE style rest. | |
Fallback Load Map (FallbackLoadMap) | TSoftObjectPtr<UWorld> | None | Rules | Map used when a save has no map (should not happen outside tests). Empty = Game Flow -> NewGameMap. | |
Save Point Interact Radius (SavePointInteractRadius) | float | 0.000000 | Save Points | Range around the origin of save points that set no Interact Radius of their own. 0 = none: like any interactable with a body, the player uses it within the interaction reach of its body (Project Settings -> RPG Saga Engine -> Interaction). | |
Save Point Mesh (SavePointMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cone.Cone | Save Points | Placeholder look of save points that set no mesh of their own. | |
Save Point Mesh Scale (SavePointMeshScale) | FVector | (X=0.600000,Y=0.600000,Z=0.800000) | Save Points | ||
Screen Background Color (ScreenBackgroundColor) | FRSEUIColor | (Token="Primary",Alpha=0.780000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Screen | Dims the world (and the menus) behind the slot screen. | |
Screen Vertical Anchor (ScreenVerticalAnchor) | float | 0.500000 | Screen | Normalized screen height of the panel's center. | |
Screen Width (ScreenWidth) | float | 720.000000 | Screen | ||
Screen ZOrder (ScreenZOrder) | int32 | 50 | Screen | Z-order of the slot screen in the viewport (above HUDs and the party menu). | |
Slot Widget Class (SlotWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screen | Save / load slot screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSESaveSlotsViewModel (docs/product/custom-ui.md). | |
Autosave Label (AutosaveLabel) | FText | NSLOCTEXT("RSESaveUISettings", "Autosave", "Autosave") | Texts | ||
Autosave Numbered Label Format (AutosaveNumberedLabelFormat) | FText | NSLOCTEXT("RSESaveUISettings", "AutosaveNumbered", "Autosave {0}") | Texts | Autosave rows when there are several autosave slots. {0} = 1-based number. | |
Backup Slot Detail (BackupSlotDetail) | FText | NSLOCTEXT("RSESaveUISettings", "BackupDetail", "Backup copy") | Texts | Detail of a damaged save whose backup copy is shown (and loads) instead. | |
Backup Slot Message (BackupSlotMessage) | FText | NSLOCTEXT("RSESaveUISettings", "BackupMessage", "This save file is damaged. Its backup copy (the previous save in this slot) will be loaded.") | Texts | Message on the load screen when the selected save is damaged and its backup will load. | |
Blocked Message (BlockedMessage) | FText | NSLOCTEXT("RSESaveUISettings", "Blocked", "You cannot save here.") | Texts | Saving is not allowed here (battle, dialog, cutscene, no-save zone). | |
Busy Message (BusyMessage) | FText | NSLOCTEXT("RSESaveUISettings", "Busy", "Please wait...") | Texts | ||
Corrupt Message (CorruptMessage) | FText | NSLOCTEXT("RSESaveUISettings", "Corrupt", "This save is damaged and cannot be loaded.") | Texts | D-170: the save is damaged and has no readable backup. | |
Corrupt Slot Detail (CorruptSlotDetail) | FText | NSLOCTEXT("RSESaveUISettings", "CorruptDetail", "Damaged") | Texts | Detail of a save file that is damaged and has no readable backup (it cannot be loaded). | |
Done Hint Text (DoneHintText) | FText | Texts | Hint after a save, when the screen only accepts closing. | ||
Empty Slot Text (EmptySlotText) | FText | NSLOCTEXT("RSESaveUISettings", "Empty", "Empty") | Texts | ||
Incompatible Slot Detail (IncompatibleSlotDetail) | FText | NSLOCTEXT("RSESaveUISettings", "Incompatible", "Newer version") | Texts | Detail of a save written by a newer game version. | |
Load Action Text (LoadActionText) | FText | NSLOCTEXT("RSESaveUISettings", "LoadAction", "Load") | Texts | Action of the confirm key prompt on the load screen. | |
Load Failed Message (LoadFailedMessage) | FText | NSLOCTEXT("RSESaveUISettings", "LoadFailed", "This save could not be loaded.") | Texts | ||
Load Hint Text (LoadHintText) | FText | Texts | |||
Load Title (LoadTitle) | FText | NSLOCTEXT("RSESaveUISettings", "LoadTitle", "Load") | Texts | --- Texts --- | |
Member Level Format (MemberLevelFormat) | FText | NSLOCTEXT("RSESaveUISettings", "MemberLevel", "{Name} {Term.LevelShort} {Level}") | Texts | A party member with its level on the slot screens. {Name}, {Level}. | |
Member Separator (MemberSeparator) | FText | NSLOCTEXT("RSESaveUISettings", "MemberSeparator", ", ") | Texts | Joins party member names. | |
No Label (NoLabel) | FText | NSLOCTEXT("RSESaveUISettings", "No", "No") | Texts | ||
No Space Message (NoSpaceMessage) | FText | NSLOCTEXT("RSESaveUISettings", "NoSpace", "There is not enough free storage to save. Free some space and try again.") | Texts | D-170: the storage is full (the save was not written; the previous save is untouched). | |
Overwrite Prompt (OverwritePrompt) | FText | NSLOCTEXT("RSESaveUISettings", "Overwrite", "Overwrite this save?") | Texts | ||
Play Time Format (PlayTimeFormat) | FText | NSLOCTEXT("RSESaveUISettings", "PlayTime", "{Hours}:{Minutes}:{Seconds}") | Texts | {Hours}, {Minutes}, {Seconds}: minutes and seconds have two digits. | |
Protected Slot Detail (ProtectedSlotDetail) | FText | NSLOCTEXT("RSESaveUISettings", "Protected", "Protected") | Texts | Detail of the autosave row on the save screen. | |
Protected Slot Message (ProtectedSlotMessage) | FText | NSLOCTEXT("RSESaveUISettings", "ProtectedMessage", "The autosave slot cannot be overwritten.") | Texts | ||
Save Action Text (SaveActionText) | FText | NSLOCTEXT("RSESaveUISettings", "SaveAction", "Save") | Texts | Action of the confirm key prompt on the save screen. | |
Saved Message (SavedMessage) | FText | NSLOCTEXT("RSESaveUISettings", "Saved", "Game saved.") | Texts | ||
Save Failed Message (SaveFailedMessage) | FText | NSLOCTEXT("RSESaveUISettings", "SaveFailed", "The game could not be saved.") | Texts | ||
Save Hint Text (SaveHintText) | FText | Texts | Optional line under the key prompts (empty = none). | ||
Save Point Prompt (SavePointPrompt) | FText | NSLOCTEXT("RSESaveUISettings", "SavePointPrompt", "Save") | Texts | Action of the interaction prompt on a save point ("[E] Save"). | |
Save Title (SaveTitle) | FText | NSLOCTEXT("RSESaveUISettings", "SaveTitle", "Save") | Texts | ||
Signed Out Message (SignedOutMessage) | FText | NSLOCTEXT("RSESaveUISettings", "SignedOut", "The profile that owns these saves is signed out. Sign in to save or load.") | Texts | D-170: the platform user the saves belong to signed out. | |
Slot Label Format (SlotLabelFormat) | FText | NSLOCTEXT("RSESaveUISettings", "SlotLabel", "Slot {0}") | Texts | {0} = 1-based slot number. | |
Slot Money Format (SlotMoneyFormat) | FText | NSLOCTEXT("RSESaveUISettings", "SlotMoney", "{Money}") | Texts | Money on the slot screens. {Money} = the amount in the Economy money format. | |
Yes Label (YesLabel) | FText | NSLOCTEXT("RSESaveUISettings", "Yes", "Yes") | Texts | ||
Capture Thumbnails (bCaptureThumbnails) | bool | True | Thumbnails | Saves carry a screenshot of the scene (without UI) taken when the save was requested. | |
Show Thumbnails (bShowThumbnails) | bool | True | Thumbnails | The slot screens show each save's thumbnail. | |
Thumbnail Capture Timeout (ThumbnailCaptureTimeout) | float | 1.000000 | Thumbnails | A screenshot that has not arrived after this long is given up (the save goes on without a thumbnail). | |
Thumbnail Display Size (ThumbnailDisplaySize) | FVector2D | (X=112.000000,Y=63.000000) | Thumbnails | Size of the thumbnail on the slot screens. | |
Thumbnail Placeholder Color (ThumbnailPlaceholderColor) | FRSEUIColor | (Token="White",Alpha=0.060000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Thumbnails | Background of a slot without a thumbnail. | |
Thumbnail Quality (ThumbnailQuality) | int32 | 80 | Thumbnails | JPEG quality of the stored thumbnail (1-100). | |
Thumbnail Width (ThumbnailWidth) | int32 | 320 | Thumbnails | Width the screenshot is downscaled to (the height keeps the aspect). |
RPG Saga Engine: Scenes
Class URSESceneSettings (module RSE), Project Settings, Project, RPG Saga Engine. Story scenes played with Level Sequences (D-043, docs/design/scenes.md): skip, camera return, letterbox and the overlay.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Blend Out Seconds (DefaultBlendOutSeconds) | float | 1.000000 | Camera | Camera blend back to gameplay at the end of a scene (scenes may override it). | |
Skip Blend Out Seconds (SkipBlendOutSeconds) | float | 0.350000 | Camera | Camera blend back after a skipped scene (a skip should feel quick). | |
Confirm Skip (bConfirmSkip) | bool | True | Input | Skipping asks for a confirmation first. Off = the key skips at once. | |
Skip Keys (SkipKeys) | TArray<FKey> | (2 entries) | Input | Asks to skip a skippable scene (also while one of its dialog lines is shown). | |
Hide Engine HUD (bHideEngineHUD) | bool | True | Overlay | Hides the engine HUD (AHUD) while a scene plays. The RSE prompt and quest tracker always hide. | |
Letterbox Color (LetterboxColor) | FRSEUIColor | (Token="Black",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Overlay | ||
Letterbox Fraction (LetterboxFraction) | float | 0.100000 | Overlay | Height of each letterbox bar, as a fraction of the screen height. 0 = no letterbox. | |
Letterbox in Seconds (LetterboxInSeconds) | float | 0.400000 | Overlay | Seconds the letterbox bars take to slide in. | |
Overlay Widget Class (OverlayWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Overlay | Scene overlay (letterbox, skip hint and question) (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSESceneOverlayViewModel (docs/product/custom-ui.md). | |
Overlay ZOrder (OverlayZOrder) | int32 | 45 | Overlay | Z-order in the viewport: above the HUDs, below the dialog box (URSEDialogUISettings::WidgetZOrder). | |
Skip Action Text (SkipActionText) | FText | NSLOCTEXT("RSEScene", "SkipAction", "Skip") | Text | Key hint of a skippable scene ("[Tab] Skip"). | |
Skip No Text (SkipNoText) | FText | NSLOCTEXT("RSEScene", "SkipNo", "Keep watching") | Text | ||
Skip Question Text (SkipQuestionText) | FText | NSLOCTEXT("RSEScene", "SkipQuestion", "Skip this scene?") | Text | ||
Skip Yes Text (SkipYesText) | FText | NSLOCTEXT("RSEScene", "SkipYes", "Skip") | Text |
RPG Saga Engine: Seeds
Class URSESeedSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Where game randomness comes from (D-133).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Fixed World Seed (FixedWorldSeed) | int32 | 0 | Seeds | World seed of every new game (replays, bug reports, automated runs). 0 = a new seed per game. The console variable RSE.Seed.World overrides it while it is not 0. | |
Headless World Seed (HeadlessWorldSeed) | int32 | 1 | Seeds | World seed used where no game instance exists (headless simulations and tests): their results are reproducible. |
RPG Saga Engine: Starter Project
Class URSEStarterSliceSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Starter project (D-177, docs/design/plugin-phase.md section 3): what -run=RSENewProject -Slice=Starter builds into the project's root: a small playable slice made from the plugin's own content and shapes: a hub village, one generated interior, one battle of every mode, a branching dialog and a two-s...
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Action Arena Location (ActionArenaLocation) | FVector2D | (X=0.000000,Y=-3800.000000) | Battle Sites | Action: the arena's middle, its radius and the pillars that mark it. | |
Action Arena Pillars (ActionArenaPillars) | int32 | 10 | Battle Sites | ||
Action Arena Radius (ActionArenaRadius) | float | 700.000000 | Battle Sites | ||
ATBStage Location (ATBStageLocation) | FVector2D | (X=-4200.000000,Y=-4200.000000) | Battle Sites | ATB: the stage the classic battles (random encounter and the gate fight) are fought on. | |
Gate Location (GateLocation) | FVector2D | (X=3000.000000,Y=-1200.000000) | Battle Sites | Turn-based gate fight: the gate (two pillars with the trigger between them). | |
Grass Half Size (GrassHalfSize) | FVector2D | (X=900.000000,Y=600.000000) | Battle Sites | ||
Grass Location (GrassLocation) | FVector2D | (X=-2600.000000,Y=1200.000000) | Battle Sites | ATB random encounter: the tall grass (center and half size). | |
Live Group Location (LiveGroupLocation) | FVector2D | (X=-3300.000000,Y=3600.000000) | Battle Sites | Live Tactics (free movement on the live map): where the visible enemy group stands. | |
Tactics Trigger Location (TacticsTriggerLocation) | FVector2D | (X=2300.000000,Y=2300.000000) | Battle Sites | ||
Tactics Zone Location (TacticsZoneLocation) | FVector2D | (X=3600.000000,Y=3600.000000) | Battle Sites | Grid Tactics: the zone's middle and the trigger that starts the battle. | |
Enemies (Enemies) | TArray<TSoftObjectPtr<URSECharacterData> > | (2 entries) | Content | Enemies of the starter battles. Empty = Project Settings -> Wizards -> Default Enemies. | |
Interior Template (InteriorTemplate) | TSoftObjectPtr<URSEInteriorData> | /RPGSagaEngine/Data/Interiors/Examples/DA_Interior_Example_HunterLodge.DA_Interior_Example_HunterLodge | Content | The interior copied into the project and entered from the first plot (a generated interior: D-158). | |
Live Group Behavior (LiveGroupBehavior) | TSoftObjectPtr<URSERoamingBehaviorData> | /RPGSagaEngine/Data/Encounters/Roaming/DA_Roam_Cautious.DA_Roam_Cautious | Content | The roaming behavior of the live Tactics group. | |
Shop (Shop) | TSoftObjectPtr<URSEShopData> | /RPGSagaEngine/Data/Economy/DA_Shop_Starter_Z1.DA_Shop_Starter_Z1 | Content | The shop the Shopkeeper opens. | |
Floor Size (FloorSize) | float | 14000.000000 | Hub | The hub floor's side (cm). Every battle site below stands on it. | |
Player Start Location (PlayerStartLocation) | FVector2D | (X=0.000000,Y=-500.000000) | Hub | ||
Plot Locations (PlotLocations) | TArray<FVector2D> | (4 entries) | Hub | Village plots (houses made of shapes): their centers (cm) and size (width, depth, height). | |
Plot Size (PlotSize) | FVector | (X=600.000000,Y=500.000000,Z=400.000000) | Hub | ||
Save Point Location (SavePointLocation) | FVector2D | (X=350.000000,Y=-450.000000) | Hub | ||
Shape Mesh (ShapeMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Hub | The shape village plots, pillars and counters are made of (an engine shape by default). | |
Villagers (Villagers) | TArray<FRSEStarterVillager> | (5 entries) | Hub | The people of the village (Talker, Shopkeeper, QuestGiver). |
RPG Saga Engine: Stealth
Class URSEStealthSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Stealth and detection of visible enemies (D-097, D-151, docs/design/free-tactics.md sections 4 and 28): the detection meter, sneaking, concealment, light, cover, noise, the alarm, takedowns and the return to stealth.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Alarms (bAlarms) | bool | True | Alarm | An enemy that becomes aware of the party raises the alarm: the groups within its radius join, the others stay unaware. | |
Ambush Delays Alarm (bAmbushDelaysAlarm) | bool | True | Alarm | In the party's ambush the enemies were unaware: nobody is called at the start, and a surprised enemy raises the alarm only when it gets a turn of its own (kill it first and nobody comes). | |
Default Alarm Radius (DefaultAlarmRadius) | float | 1200.000000 | Alarm | The alarm radius of a behavior that leaves Alarm Radius at -1 (cm; as Free Tactics -> Call For Help Radius by default). | |
Ambush Range (AmbushRange) | float | 1400.000000 | Ambush | The party may spring an ambush on an unaware group this far from the leader (cm). | |
Placed Member Join Radius (PlacedMemberJoinRadius) | float | 3000.000000 | Ambush | Members placed for an ambush fight from their places when they stand this close to the leader (cm), farther than the usual join radius. | |
Suspicious Looks Toward (bSuspiciousLooksToward) | bool | True | Awareness | A suspicious enemy stops and turns toward where it saw or heard something (off: it keeps patrolling). | |
Suspicious Above (SuspiciousAbove) | float | 0.350000 | Awareness | From this share of its meter an enemy is suspicious ("?"): it stops and looks toward what it noticed. | |
Concealment Tags (ConcealmentTags) | TMap<FName,float> | (2 entries) | Concealment | Places that hide the party: an actor or component tag (on a volume, a tall grass field, a shadowed area) and the multiplier it gives the enemies' sight and hearing distance there (0.5 = half). Several: the lowest counts. | |
Sneak Behind Cover Hides (bSneakBehindCoverHides) | bool | True | Cover | Sneaking behind partial cover hides a party member from sight completely (crouched behind the wall). | |
Partial Cover Sight Multiplier (PartialCoverSightMultiplier) | float | 0.600000 | Cover | Partly behind cover (a low wall hides the body, the head shows): the enemies' sight reaches this share of its distance. | |
Use Detection Meter (bUseDetectionMeter) | bool | True | Detection | Visible enemies notice the party through a detection meter that fills up to "!" (off = at once, as before D-097: the first moment they see or hear the party). | |
Decay Delay (DecayDelay) | float | 1.500000 | Detection | Seconds without seeing or hearing anything before the meter starts to drain. | |
Decay Seconds (DecaySeconds) | float | 5.000000 | Detection | Seconds for a full meter to drain back to empty. | |
Seconds to Fill Close (SecondsToFillClose) | float | 0.800000 | Detection | Seconds to fill the meter for a party member right in front of the enemy (a quarter of the way to the edge of its senses or closer). | |
Seconds to Fill Far (SecondsToFillFar) | float | 4.000000 | Detection | Seconds to fill the meter for a party member at the very edge of the enemy's sight or hearing. | |
Show Meter Above (ShowMeterAbove) | float | 0.020000 | Detection | The meter shows above an enemy once it passes this share (below: nothing shown). | |
Rules Class (RulesClass) | TSoftClassPtr<URSEStealthRules> | None | Extending | The rules object (a subclass of URSEStealthRules changes how takedowns, noise and alarms resolve). Empty = the built-in rules. | |
Dark Sight Multiplier (DarkSightMultiplier) | float | 0.550000 | Light | In full darkness the enemies' sight reaches this share of its distance (light 1 = all of it). | |
Lamp Light Radius (LampLightRadius) | float | 600.000000 | Light | A party member within this distance of a lit lamp (a Night Light component that is on) stands in its light (cm). | |
Phase Light (PhaseLight) | TMap<FGameplayTag,float> | (3 entries) | Light | How lit the world is in each phase of the day (Time.Phase.*; 1 = daylight). A phase not listed is lit. Use these or the Time & Weather Rules' sight multipliers for the night, not both (they multiply). | |
Weather Light (WeatherLight) | TMap<FGameplayTag,float> | (2 entries) | Light | Light multiplier of weathers (Weather.*: fog, storm); a parent tag covers its children; several: the lowest. | |
Ability Noise (AbilityNoise) | TMap<TSoftObjectPtr<URSEAbilityData> ,float> | (0 entries) | Noise | Abilities with their own noise radius (cm): a thunder spell heard across the valley. Overrides Action Noise Radius. | |
Action Noise Radius (ActionNoiseRadius) | float | 1500.000000 | Noise | In a battle that began as the party's ambush, an action that is not silent is heard this far (cm; 0 = actions are silent). | |
Noise Gain at Edge (NoiseGainAtEdge) | float | 0.400000 | Noise | A noise at the very edge of its radius fills this share. | |
Noise Gain at Source (NoiseGainAtSource) | float | 1.000000 | Noise | A noise right next to an enemy fills this share of its meter at once (1 = it notices the party). | |
Silent Abilities (SilentAbilities) | TArray<TSoftObjectPtr<URSEAbilityData> > | (0 entries) | Noise | Abilities that make no noise (a silenced shot, a sleeping spell). | |
Silent Tag (SilentTag) | FGameplayTag | (TagName="Stealth.Silent") | Noise | The tag that makes a unit's weapon attacks silent (a weapon's Granted Tags, a class or trait tag). | |
Return Only After Ambush (bReturnOnlyAfterAmbush) | bool | True | Return To Stealth | Only after a battle the party opened unseen (its ambush, a failed takedown); off = after any battle. | |
Return to Stealth (bReturnToStealth) | bool | True | Return To Stealth | A won battle with nobody aware left standing (no alarm reached another group) gives the party back to sneaking, and the rest of the area stays as it was. | |
Run Hearing Multiplier (RunHearingMultiplier) | float | 2.000000 | Sneak | Hearing distance multiplier while running (running is loud). | |
Run Speed Share (RunSpeedShare) | float | 0.700000 | Sneak | The explorer counts as running above this share of its run speed. | |
Sneak Hearing Multiplier (SneakHearingMultiplier) | float | 0.350000 | Sneak | Hearing distance multiplier while sneaking. | |
Sneak Sight Multiplier (SneakSightMultiplier) | float | 0.600000 | Sneak | Sneaking: the enemies' sight reaches this share of its usual distance. | |
Sneak Speed Multiplier (SneakSpeedMultiplier) | float | 0.450000 | Sneak | Sneaking: movement speed multiplier (a slow, careful walk). | |
Still Hearing Multiplier (StillHearingMultiplier) | float | 0.500000 | Sneak | Hearing distance multiplier while standing still. | |
Walk Hearing Multiplier (WalkHearingMultiplier) | float | 1.000000 | Sneak | Hearing distance multiplier while walking. | |
Unseen Below (UnseenBelow) | float | 0.750000 | Surprise | Attacking an enemy whose meter is below this share counts as attacking unseen (a surprise round for the party). | |
Takedown Gives Experience (bTakedownGivesExperience) | bool | True | Takedown | A takedown gives the target's experience to the party, split like a battle's. | |
Takedown Lone Targets Only (bTakedownLoneTargetsOnly) | bool | True | Takedown | Only a lone enemy (its group has nobody else standing) can be taken down; a group is fought in an ambush instead. | |
Takedowns (bTakedowns) | bool | True | Takedown | Silent takedowns while sneaking: an unaware, isolated enemy is taken out without a battle when nobody sees or hears it. | |
Default Takedown (DefaultTakedown) | FRSETakedownProfile | (bAllowed=True,Reach=220.000000,MaxAngleFromBehind=80.000000,bRequireUnaware=True,NoiseRadius=1200.000000,WitnessHearingRadius=150.000000) | Takedown | Means of an attacker without any listed tag (bare hands, a sword: loud). Not Allowed = only the listed means take down. | |
Takedown Profiles (TakedownProfiles) | TMap<FGameplayTag,FRSETakedownProfile> | (1 entries) | Takedown | Means by tag (the attacker's: weapons' Granted Tags, class, traits): the first listed tag the attacker has wins. |
RPG Saga Engine: Stealth (Presentation)
Class URSEStealthPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How stealth ambushes look and feel (D-151, docs/design/free-tactics.md section 28): the detection shapes on the ground (one decal over the area around the local player, the D-113 overlay material and look), the meters' suspicious mark, the takedown and ambush prompts, the keys, the notifications.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Awareness Precision (AwarenessPrecision) | float | 0.050000 | Co-op | The shared meters are rounded to this step (fewer updates sent). | |
Awareness Sync Interval (AwarenessSyncInterval) | float | 0.200000 | Co-op | Seconds between the authority's awareness writes to the shared stealth state (co-op meters and marks). | |
Area Size (AreaSize) | float | 4400.000000 | Ground Overlay | Side of the square around the local player the overlay covers (cm). | |
Cell Size (CellSize) | float | 35.000000 | Ground Overlay | Size of one mask cell (cm): smaller = finer shapes, more work. | |
Cone Rays (ConeRays) | int32 | 28 | Ground Overlay | Rays per sight cone: the cone stops at walls along each ray. | |
Height Stride (HeightStride) | int32 | 3 | Ground Overlay | The ground heights are measured every this many cells (in between they are interpolated). | |
Height Tolerance (HeightTolerance) | float | 60.000000 | Ground Overlay | Ground within this height of a cell's measured ground takes paint (cm): never walls or props. | |
Max Enemies (MaxEnemies) | int32 | 12 | Ground Overlay | At most this many enemies are drawn (the nearest). | |
Overlay Material (OverlayMaterial) | TSoftObjectPtr<UMaterialInterface> | None | Ground Overlay | The overlay material (it reads a mask texture: sight, hearing, aware sight, ground height). Empty = Free Tactics (Presentation) -> Overlay Material. | |
Overlay Mode (OverlayMode) | ERSEStealthOverlayMode | WhileSneaking | Ground Overlay | --- Ground overlay --- | |
Refresh Interval (RefreshInterval) | float | 0.120000 | Ground Overlay | Seconds between redraws of the shapes (the enemies move, turn, see). | |
Smoothing (Smoothing) | int32 | 1 | Ground Overlay | How far the edges are softened (mask cells). | |
Sort Order (SortOrder) | int32 | 4 | Ground Overlay | ||
Aware Fill Color (AwareFillColor) | FRSEUIColor | (Token="Negative",Alpha=0.180000,Lightness=-0.007488,Chroma=1.143559,Hue=21.617987,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | Sight cones of suspicious or alerted enemies. | |
Aware Outline Color (AwareOutlineColor) | FRSEUIColor | (Token="Negative",Alpha=0.950000,Lightness=0.012073,Chroma=1.020684,Hue=21.934082,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | ||
Glow (Glow) | float | 1.000000 | Ground Overlay|Look | ||
Hearing Fill Color (HearingFillColor) | FRSEUIColor | (Token="Info",Lightness=0.094183,Chroma=0.417866,Hue=4.035979,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | Hearing circles: an outline only by default. | |
Hearing Outline Color (HearingOutlineColor) | FRSEUIColor | (Token="Info",Alpha=0.600000,Lightness=0.094183,Chroma=0.417866,Hue=4.035979,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | ||
Outline Softness (OutlineSoftness) | float | 6.000000 | Ground Overlay|Look | ||
Outline Width (OutlineWidth) | float | 12.000000 | Ground Overlay|Look | Outline width on the ground (cm) and its softness (cm). | |
Sight Fill Color (SightFillColor) | FRSEUIColor | (Token="Accent",Alpha=0.100000,Lightness=0.056368,Chroma=0.358493,Hue=4.888667,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | Sight cones of unaware enemies. | |
Sight Outline Color (SightOutlineColor) | FRSEUIColor | (Token="Accent",Alpha=0.800000,Lightness=0.041558,Chroma=0.461881,Hue=0.020349,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Ground Overlay|Look | ||
Input Priority (InputPriority) | int32 | 2 | Keys | Priority of the stealth keys' mapping context (above the exploration context). | |
Place Keys (PlaceKeys) | TArray<FKey> | (2 entries) | Keys | Place: the character the player leads holds its spot and the next member is taken (while sneaking); not sneaking: everyone regroups. | |
Strike Keys (StrikeKeys) | TArray<FKey> | (2 entries) | Keys | Strike: a takedown on the enemy in reach, else springs the ambush on the unaware group in range. | |
Ambush Prompt (AmbushPrompt) | FText | NSLOCTEXT("RSEStealthPresentation", "AmbushPrompt", "{Key} Ambush") | Meter | The prompt over an unaware group the party can ambush. | |
Prompt Color (PromptColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.000937,Chroma=4.794667,Hue=-58.577801,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Meter | ||
Suspicious Color (SuspiciousColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.018861,Chroma=1.223331,Hue=2.236193,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Meter | The meter's color while the enemy is suspicious, and the mark it shows. | |
Suspicious Mark (SuspiciousMark) | FText | NSLOCTEXT("RSEStealthPresentation", "SuspiciousMark", "?") | Meter | ||
Takedown Prompt (TakedownPrompt) | FText | NSLOCTEXT("RSEStealthPresentation", "TakedownPrompt", "{Key} Takedown") | Meter | The prompt over an enemy the party can take down ({Key}: the key's name). | |
Alarm Callout Seconds (AlarmCalloutSeconds) | float | 2.200000 | Notifications | Seconds the alarm's shout shows over the enemy that raised it (in the battle). | |
Alarm Color (AlarmColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.004980,Chroma=1.076515,Hue=14.498447,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Notifications | ||
Alarm Text (AlarmText) | FText | NSLOCTEXT("RSEStealthPresentation", "Alarm", "Alarm!") | Notifications | ||
Failed Takedown Text (FailedTakedownText) | FText | NSLOCTEXT("RSEStealthPresentation", "FailedTakedown", "{Name} fights back!") | Notifications | ||
Noisy Takedown Text (NoisyTakedownText) | FText | NSLOCTEXT("RSEStealthPresentation", "NoisyTakedown", "Someone noticed!") | Notifications | ||
Notice Color (NoticeColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.066506,Chroma=0.653430,Hue=-3.701602,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Notifications | ||
Placed Text (PlacedText) | FText | NSLOCTEXT("RSEStealthPresentation", "Placed", "{Name} holds this spot") | Notifications | A member was placed ({Name}). | |
Regroup Text (RegroupText) | FText | NSLOCTEXT("RSEStealthPresentation", "Regroup", "The party regroups") | Notifications | ||
Return to Stealth Text (ReturnToStealthText) | FText | NSLOCTEXT("RSEStealthPresentation", "ReturnToStealth", "Back in the shadows") | Notifications | ||
Silent Takedown Text (SilentTakedownText) | FText | NSLOCTEXT("RSEStealthPresentation", "SilentTakedown", "Silent takedown") | Notifications | --- Notifications --- | |
Takedown Corpse Seconds (TakedownCorpseSeconds) | float | 0.000000 | Notifications | Seconds a taken-down enemy lies before it goes (0 = stays; as Free Tactics corpses otherwise). | |
Takedown Sound (TakedownSound) | TSoftObjectPtr<USoundBase> | None | Notifications | Played at a takedown (empty = none). |
RPG Saga Engine: Studio
Class URSEStudioSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. RPG Saga Studio (D-090, docs/product/studio.md): the project-wide settings of the Studio window, its explanations and the character sheet.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Ability Preview Aim Color (AbilityPreviewAimColor) | FLinearColor | (R=1.000000,G=0.150000,B=0.100000,A=1.000000) | Ability Preview | ||
Ability Preview Area Color (AbilityPreviewAreaColor) | FLinearColor | (R=1.000000,G=0.550000,B=0.100000,A=1.000000) | Ability Preview | ||
Ability Preview Damage Color (AbilityPreviewDamageColor) | FLinearColor | (R=1.000000,G=0.920000,B=0.850000,A=1.000000) | Ability Preview | Colors of damage, healing and status numbers, and of the area telegraph (the aimed tile in Aim Color). | |
Ability Preview Exposure EV100 (AbilityPreviewExposureEV100) | float | -1.000000 | Ability Preview | Fixed exposure of the preview (EV100; lower = brighter). | |
Ability Preview Field Of View (AbilityPreviewFieldOfView) | float | 38.000000 | Ability Preview | Vertical field of view of the preview camera. | |
Ability Preview Floor Material (AbilityPreviewFloorMaterial) | TSoftObjectPtr<UMaterialInterface> | None | Ability Preview | Its material. Empty = the mesh's own. | |
Ability Preview Floor Mesh (AbilityPreviewFloorMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Plane.Plane | Ability Preview | The floor under the preview (a flat mesh, scaled to the scene). Empty = no floor. | |
Ability Preview Heal Color (AbilityPreviewHealColor) | FLinearColor | (R=0.450000,G=1.000000,B=0.550000,A=1.000000) | Ability Preview | ||
Ability Preview Loop Delay (AbilityPreviewLoopDelay) | float | 0.800000 | Ability Preview | Loop: the pause between two plays (seconds). | |
Ability Preview Number Material (AbilityPreviewNumberMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/EngineMaterials/UnlitText.UnlitText | Ability Preview | Material of the floating numbers (an unlit text material reads in any light). Empty = the engine's default text material. | |
Ability Preview Number Rise (AbilityPreviewNumberRise) | float | 80.000000 | Ability Preview | ||
Ability Preview Number Seconds (AbilityPreviewNumberSeconds) | float | 1.400000 | Ability Preview | Floating numbers: how long they stay (seconds), how high they rise (cm) and their size (cm). | |
Ability Preview Number Size (AbilityPreviewNumberSize) | float | 60.000000 | Ability Preview | ||
Ability Preview Side Distance (AbilityPreviewSideDistance) | float | 700.000000 | Ability Preview | Classic modes (ATB, turn-based): distance between the two sides (cm) and between units of a side (cm). | |
Ability Preview Status Color (AbilityPreviewStatusColor) | FLinearColor | (R=0.750000,G=0.600000,B=1.000000,A=1.000000) | Ability Preview | ||
Ability Preview Tile Size (AbilityPreviewTileSize) | float | 160.000000 | Ability Preview | Distance between two grid tiles in the preview (cm). | |
Ability Preview Unit Spacing (AbilityPreviewUnitSpacing) | float | 190.000000 | Ability Preview | ||
Prompt Propagation on Archetype Save (bPromptPropagationOnArchetypeSave) | bool | True | Archetypes | After an archetype is saved, offer the propagation list when assets inherit fields that now differ (a notification with "Review changes"). Nothing is applied without the list (D-090 decision 2). | |
Difficulty Easy Win Rate (DifficultyEasyWinRate) | float | 0.900000 | Difficulty Estimate | The party wins at least this often: "Easy". | |
Difficulty Hard Win Rate (DifficultyHardWinRate) | float | 0.550000 | Difficulty Estimate | The party wins less often than this: "Hard" (between the two: "Fair"). Below half of it: "Very hard". | |
Difficulty Runs (DifficultyRuns) | int32 | 12 | Difficulty Estimate | "How hard is it?" (New Enemy, New Battle): battles the simulator plays for the estimate. | |
Help Table (HelpTable) | TSoftObjectPtr<UDataTable> | /RPGSagaEngine/Data/Studio/DT_RSE_StudioHelp.DT_RSE_StudioHelp | Explanations | The explanations of the Studio, the wizards and the character sheet: a Data Table of Studio Help Rows (row name = the help id, e.g. "Character.Class"). Localizable: its texts are gathered with the plugin's texts. Copy it to rewrite the texts. | |
Starter Character Count (StarterCharacterCount) | int32 | 0 | First Steps | Characters and battles in the project when the starter content was made: "Create a character" and "Create a battle" are done when there are more. | |
Starter Encounter Count (StarterEncounterCount) | int32 | 0 | First Steps | ||
Starter Root (StarterRoot) | FDirectoryPath | () | First Steps | The content root of the starter slice (/Game/Starter). Empty = the project has no slice: playing the new-game map counts as playing. | |
Learn Links (LearnLinks) | TArray<FRSEStudioLearnLink> | (5 entries) | Learn | Links of the Studio's Learn section, in order. | |
Ability List Max Level (AbilityListMaxLevel) | int32 | 0 | New Character | Level of the New Character wizard's ability list: abilities up to this level are listed. 0 = every level. | |
Enemy Only Class Tags (EnemyOnlyClassTags) | FGameplayTagContainer | (GameplayTags=((TagName="Class.Foe"),(TagName="Class.Wyrm"))) | New Character | Classes with one of these tags (or a child tag) are enemy classes: the New Character wizard offers them only for enemies. | |
Preview Turn Speed (PreviewTurnSpeed) | float | 20.000000 | New Character | How fast the live 3D preview of the wizard and the character sheet turns (degrees per second). 0 = it stands still. | |
Warn when Editing Plugin Assets (bWarnWhenEditingPluginAssets) | bool | True | Plugin Templates | Warn with a notification when a plugin asset (under the plugin's content folder) is changed in an editor: plugin assets are templates shared by every asset using them and are replaced when the plugin updates (D-090 11b). | |
Template Manifest File (TemplateManifestFile) | FString | Config/Studio/TemplateManifest.json | Plugin Templates | The file listing the shipped state of the plugin's data assets (RSE.Studio.ExportTemplateManifest writes it), relative to the plugin folder. Validate All Data warns about plugin data assets that differ from it (modified locally). | |
Preview Shadows (bPreviewShadows) | bool | True | Preview | Character preview: the key light casts a soft shadow. | |
Preview Ambient (PreviewAmbient) | float | 0.350000 | Preview | Character preview: soft ambient light from the sky (0 = none). | |
Preview Background Color (PreviewBackgroundColor) | FLinearColor | (R=0.045000,G=0.047000,B=0.052000,A=1.000000) | Preview | Character preview: the background color (a neutral studio backdrop). | |
Preview Drag Degrees Per Pixel (PreviewDragDegreesPerPixel) | float | 0.600000 | Preview | Character preview: dragging turns the character by this many degrees per pixel. | |
Preview Exposure EV100 (PreviewExposureEV100) | float | 2.400000 | Preview | Character preview: fixed exposure (EV100; lower = brighter). The light rig's Exposure Bias is added. | |
Preview Field Of View (PreviewFieldOfView) | float | 28.000000 | Preview | Character preview: vertical field of view (a narrow lens keeps proportions, like a studio photo). | |
Preview Framing Margin (PreviewFramingMargin) | float | 1.120000 | Preview | Character preview: room above the head and below the feet (1 = the character fills the height). | |
Preview Key Light Size (PreviewKeyLightSize) | float | 40.000000 | Preview | Character preview: size of the key light (larger = softer shadow edges). | |
Preview Light Rig (PreviewLightRig) | FName | Studio | Preview | Character preview (wizard, sheets): the lighting rig by name (Project Settings -> Portraits -> Light Rigs; key, fill and rim). | |
Preview Max Zoom (PreviewMaxZoom) | float | 1.600000 | Preview | ||
Preview Min Zoom (PreviewMinZoom) | float | 0.350000 | Preview | Character preview: the mouse wheel zooms between these framings (1 = the whole character). | |
Preview Turn Resume Delay (PreviewTurnResumeDelay) | float | 3.000000 | Preview | Character preview: after a drag, the slow turn waits this long before it goes on (seconds). | |
Role Fields (RoleFields) | TArray<FRSEStudioRoleRule> | (10 entries) | Roles | Role-aware views (D-098): which fields each role sees on the character sheet (Simple and Advanced), the Studio's wizards and their help. Party characters do not see enemy rewards or the bestiary; enemies do not see party-only settings. The generic asset editor always shows every field. | |
Max Recent Assets (MaxRecentAssets) | int32 | 10 | Studio | How many recently created or edited assets "Continue where you left off" shows. | |
Recent Thumbnail Size (RecentThumbnailSize) | int32 | 64 | Studio | Size of the thumbnails in "Continue where you left off" (pixels). | |
Test Battle Mode (TestBattleMode) | FGameplayTag | (TagName="Battle.Mode.ATB") | Test in Battle | Battle mode of an enemy's test battle (the hero's test uses the Test Encounter's mode). | |
Test Encounter (TestEncounter) | TSoftObjectPtr<URSEEncounterData> | /RPGSagaEngine/Data/Encounters/DA_Encounter_Starter_Z1_Skirmish.DA_Encounter_Starter_Z1_Skirmish | Test in Battle | Character sheet "Test in battle": the battle the character's party fights (heroes). | |
Test Enemy Count (TestEnemyCount) | int32 | 2 | Test in Battle | Character sheet "Test in battle" of an enemy: how many of it the new-game party fights. | |
Test Runs (TestRuns) | int32 | 20 | Test in Battle | Battles the simulator plays for "Test in battle" (the win rate and the length are averages). |
RPG Saga Engine: Tactics Camera
Class URSETacticsCameraSettings (module RSE), Project Settings, Project, RPG Saga Engine. Tactical camera behaviour.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Pan Speed (PanSpeed) | float | 1500.000000 | Pan | Pan speed at full input, in cm per second. | |
Rotation Step (RotationStep) | float | 90.000000 | Rotation | Yaw change per rotate input. | |
Focus Interp Speed (FocusInterpSpeed) | float | 5.000000 | Smoothing | How fast the camera glides to a new focus (the unit whose turn starts). 0 = cut at once. | |
Interp Speed (InterpSpeed) | float | 8.000000 | Smoothing | How fast yaw and zoom blend to their targets (higher is snappier). | |
Field Of View (FieldOfView) | float | 35.000000 | View | Narrow field of view flattens perspective toward an isometric look. | |
Initial Yaw (InitialYaw) | float | 45.000000 | View | Yaw at start, in degrees. 45 gives the classic diagonal isometric view. | |
Pitch (Pitch) | float | -50.000000 | View | Downward camera angle in degrees (negative looks down). | |
Initial Distance (InitialDistance) | float | 2600.000000 | Zoom | ||
Max Distance (MaxDistance) | float | 5000.000000 | Zoom | ||
Min Distance (MinDistance) | float | 1200.000000 | Zoom | ||
Zoom Step (ZoomStep) | float | 300.000000 | Zoom | Distance change per unit of zoom input (one mouse wheel notch). |
RPG Saga Engine: Tactics Path Preview
Class URSEPathPreviewSettings (module RSE), Project Settings, Project, RPG Saga Engine. Look of the live movement path line and of the danger zone overlay in Tactics battles (D-033).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Label Height (LabelHeight) | float | 60.000000 | Cost Label | Height of the Action Point label above the end of the path, in cm. | |
No Action Label Color (NoActionLabelColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=0.024668,Chroma=1.941756,Hue=-7.776914,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Cost Label | Label color when the destination leaves too few Action Points to attack, or to act at all. | |
Arc Height (ArcHeight) | float | 20.000000 | Line | Extra height of the arc between two tiles of different height, above the higher one. | |
Hide Path Tiles with Line (bHidePathTilesWithLine) | bool | True | Line | Hide the yellow path tiles while the line is drawn (the line replaces them). | |
Show Path Line (bShowPathLine) | bool | True | Line | Draw the path line while choosing a move destination. | |
Dashes Per Tile (DashesPerTile) | float | 3.000000 | Line | ||
Dash Speed (DashSpeed) | float | 1.500000 | Line | ||
Hazard Color (HazardColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=-0.116643,Chroma=2.591229,Hue=117.309082,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Line | D-156 (Free Tactics): the part of an affordable path inside a dangerous surface (fire, poison, ice...). | |
Height Offset (HeightOffset) | float | 12.000000 | Line | Height of the line above the tile surface. | |
Line Material (LineMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/M_PathPreview.M_PathPreview | Line | Material of the line. Parameters below are set when the material has them. | |
Line Mesh (LineMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Line | Mesh bent along the path by spline mesh components; its X axis runs along the path. A unit cube works. | |
Line Mesh Size (LineMeshSize) | float | 100.000000 | Line | Size of LineMesh along each axis, in cm (to scale it to LineWidth / LineThickness). | |
Line Thickness (LineThickness) | float | 2.000000 | Line | ||
Line Width (LineWidth) | float | 12.000000 | Line | ||
Over Budget Color (OverBudgetColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.072038,Chroma=1.357145,Hue=1.787338,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Line | Part of the path beyond the remaining Action Points. | |
Reachable Color (ReachableColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.055424,Chroma=1.415302,Hue=23.530649,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Line | Affordable part of the path. | |
Color Parameter (ColorParameter) | FName | Color | Line|Material Parameters | Material vector parameter receiving the line color. | |
Dash Count Parameter (DashCountParameter) | FName | DashesPerTile | Line|Material Parameters | Material scalar parameter: dashes per tile. | |
Dash Speed Parameter (DashSpeedParameter) | FName | DashSpeed | Line|Material Parameters | Material scalar parameter: dash scroll speed (tiles per second, 0 = still). | |
Segment Length Data Index (SegmentLengthDataIndex) | int32 | 0 | Line|Material Parameters | Custom primitive data index receiving each segment's length in tiles, so dashes keep their size on long straight segments (the material multiplies U by it). INDEX_NONE = not sent. | |
Click to Move from Menu (bClickToMoveFromMenu) | bool | False | When | In the command menu, clicking a reachable tile moves there at once (a mouse shortcut past the Move command). | |
Preview Move in Menu (bPreviewMoveInMenu) | bool | False | When | Show the movement range and the path under the cursor in the command menu too, before Move is chosen. Off (classic tactical RPG style, playtest 2026-09-27): only the Move command shows them, so pointing at objects or units in the menu draws no path over them. |
RPG Saga Engine: Tactics Zone
Class URSETacticsZoneSettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation and baking settings of tactics zones (grid baking from level geometry, grid visuals, placeholder units).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Bake Ignore Tag (BakeIgnoreTag) | FName | RSE.GridIgnore | Baking | Actors or components with this tag are skipped by the bake (props that must not become tiles). | |
Bake Max Skipped Hits (BakeMaxSkippedHits) | int32 | 8 | Baking | How many skipped objects a single bake trace may pass through before it gives up on the tile. | |
Bake Min Surface Size (BakeMinSurfaceSize) | float | 40.000000 | Baking | Objects narrower than this (on either horizontal axis) are skipped by the bake: small rocks, rubble, bottles. 0 = keep everything. | |
Bake Trace Channel (BakeTraceChannel) | TEnumAsByte<ECollisionChannel> | ECC_Visibility | Baking | Collision channel traced against level geometry when baking a grid. | |
Bake Trace Depth Below (BakeTraceDepthBelow) | float | 500.000000 | Baking | How far below the zone origin the bake trace ends. | |
Bake Trace Height Above (BakeTraceHeightAbove) | float | 2000.000000 | Baking | How far above the zone origin the bake trace starts. | |
Bake Only Pawn Blocking Surfaces (bBakeOnlyPawnBlockingSurfaces) | bool | True | Baking | The bake skips what a character cannot stand on (D-088): surfaces that do not block pawns (grass, ivy, decoration you walk through), pawns, and actors or components tagged Bake Ignore Tag. The trace goes on to the ground below. | |
Bake Uses Combat Roles (bBakeUsesCombatRoles) | bool | True | Baking | The bake follows combat roles (D-093, Project Settings -> Combat Roles): Ignore roles (decoration, clutter) are looked through, Standable roles are ground whatever their size, Block roles (cover, obstacles) close the tiles under them and Terrain roles give their tiles the role's terrain. Objects without a role keep the rules above. | |
Min Walkable Normal Z (MinWalkableNormalZ) | float | 0.700000 | Baking | Minimum surface normal Z to count as walkable (1 = flat, 0.7 ~ 45 degrees). | |
Required Clearance (RequiredClearance) | float | 150.000000 | Baking | Free space needed above a surface for a unit to stand on it. | |
Role Footprint Inset (RoleFootprintInset) | float | 0.250000 | Baking | Share of a tile's side left out at each edge when a Block or Terrain object's footprint is matched to tiles: an object must reach into the middle of a tile to affect it (a wall grazing a tile's edge leaves it open). | |
Show Blocked Tiles (bShowBlockedTiles) | bool | False | Grid Visuals | Draws the base grid's blocked tiles (walls, tree tops, props). Off by default: on a live map they often sit on partial meshes and read as red patches hanging in the air; the walkable grid alone already shows where units can go. | |
Danger Tile Scale (DangerTileScale) | float | 1.000000 | Grid Visuals | Fraction of the tile covered by the danger zone layer. Above TileVisualScale it shows as a frame around the selection tiles. | |
Grid Visual Mode (GridVisualMode) | ERSEGridVisualMode | Projected | Grid Visuals | How zones draw the grid (a zone can override it). Projected follows the real ground; Tiles are meshes. | |
Highlight Colors (HighlightColors) | TMap<ERSEGridHighlight,FRSEUIColor> | (13 entries) | Grid Visuals | ||
Layer Height Offset (LayerHeightOffset) | float | 1.000000 | Grid Visuals | Vertical offset of each highlight layer above the surface, to avoid z-fighting. | |
Tile Color Parameter (TileColorParameter) | FName | Color | Grid Visuals | ||
Tile Material (TileMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial | Grid Visuals | Material for tile visuals. Must expose a vector parameter named TileColorParameter. | |
Tile Mesh (TileMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Plane.Plane | Grid Visuals | Mesh drawn per tile. Expected to be a 100x100 cm plane facing up. | |
Tile Visual Scale (TileVisualScale) | float | 0.920000 | Grid Visuals | Fraction of the tile covered by its visual, leaving a visible gap between tiles. | |
Grid Decal Material (GridDecalMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Battle/M_RSE_GridDecal.M_RSE_GridDecal | Grid Visuals|Projected | Deferred decal material of the Projected mode (M_RSE_GridDecal). It reads the zone's tile state from a small texture (parameter GridState) and the zone's frame (Origin, AxisX, AxisY, AxisZ, Grid, Shape, Look, Glow, Opacity). | |
Projected Base Opacity (ProjectedBaseOpacity) | float | 0.120000 | Grid Visuals|Projected | Opacity of the base grid (walkable / blocked tiles) in the Projected mode. Its outlines are stronger (Edge Boost). | |
Projected Box Margin (ProjectedBoxMargin) | float | 150.000000 | Grid Visuals|Projected | Extra height of the projection box above the highest and below the lowest tile. | |
Projected Edge Boost (ProjectedEdgeBoost) | float | 4.000000 | Grid Visuals|Projected | The outline is this many times more opaque than the tile's fill. | |
Projected Edge Width (ProjectedEdgeWidth) | float | 0.060000 | Grid Visuals|Projected | Width of a tile's outline, as a fraction of the tile. | |
Projected Glow (ProjectedGlow) | float | 1.500000 | Grid Visuals|Projected | Emissive strength of the projected grid (reads in shadow and at night). | |
Projected Height Tolerance (ProjectedHeightTolerance) | float | 30.000000 | Grid Visuals|Projected | Ground more than this above or below a tile's measured surface is not painted (walls, props, the level below). | |
Projected Highlight Opacity (ProjectedHighlightOpacity) | float | 0.500000 | Grid Visuals|Projected | Opacity of the selection highlights (range, path, target, area, cursor, danger) in the Projected mode. | |
Projected Marker Opacity (ProjectedMarkerOpacity) | float | 0.800000 | Grid Visuals|Projected | Opacity of the target markers (units targeted or left out, landing tiles) in the Projected mode. | |
Projected Min Normal Z (ProjectedMinNormalZ) | float | 0.500000 | Grid Visuals|Projected | Surfaces steeper than this are not painted (1 = only flat ground, 0 = walls too). | |
Projected Sort Order (ProjectedSortOrder) | int32 | 5 | Grid Visuals|Projected | Sort order of the grid decal (under the ability target preview's decals). | |
Team Colors (TeamColors) | TMap<FGameplayTag,FRSEUIColor> | (2 entries) | Placeholder Units | Color per team (Team.*). Units of unlisted teams use UnknownTeamColor. | |
Unit Body Mesh (UnitBodyMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Placeholder Units | --- Placeholder units --- | |
Unit Body Scale (UnitBodyScale) | FVector | (X=0.600000,Y=0.600000,Z=1.000000) | Placeholder Units | ||
Unit Facing Mesh (UnitFacingMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cone.Cone | Placeholder Units | Small mesh on the front of the unit that shows its facing. | |
Unit Hop Height (UnitHopHeight) | float | 40.000000 | Placeholder Units | Arc height of the hop between two tiles of different height. | |
Unit Material (UnitMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial | Placeholder Units | Material for placeholder units. Must expose TileColorParameter. | |
Unit Move Speed (UnitMoveSpeed) | float | 4.000000 | Placeholder Units | Presentation speed of unit movement, in tiles per second. | |
Unknown Team Color (UnknownTeamColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.059238,Chroma=0.000002,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Placeholder Units | ||
Unit Corner Radius (UnitCornerRadius) | float | 45.000000 | Unit Movement | Corners of a path are rounded over this distance (no stop at each tile). 0 = sharp. | |
Unit Ease Distance (UnitEaseDistance) | float | 40.000000 | Unit Movement | Speeding up at the start and slowing down at the end of a walk, over this distance. | |
Unit Hop Min Step (UnitHopMinStep) | float | 35.000000 | Unit Movement | Height steps up to this are walked as slopes; bigger ones are hops (Unit Hop Height). | |
Unit Turn Speed (UnitTurnSpeed) | float | 600.000000 | Unit Movement | How fast a walking unit turns toward where it goes (degrees per second). | |
Unit Walk Speed (UnitWalkSpeed) | float | 320.000000 | Unit Movement | Walking speed along a path (cm/s): the locomotion blend space plays walk / jog from it. 0 = Unit Move Speed (tiles per second). |
RPG Saga Engine: Target Preview
Class URSETargetPreviewSettings (module RSE), Project Settings, Project, RPG Saga Engine. The ability target preview (D-064): what an ability or item can hit and how far, shown while it is highlighted in the command menu and while aiming.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Marker Tile Scale (MarkerTileScale) | float | 0.550000 | Classic | Size of the target markers on the tile layers (fraction of a tile), so the area color still frames them. | |
Collision Color (CollisionColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.069953,Chroma=1.630424,Hue=-30.283195,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Displacements | Landing tile when the unit collides (wall, unit, object) or falls. | |
Displacement Color (DisplacementColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=-0.107768,Chroma=2.050810,Hue=98.833572,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Displacements | Knockback / pull path (Modern) and landing tile marker. | |
Acting Unit Color (ActingUnitColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=-0.021431,Chroma=1.486113,Hue=-7.032476,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Markers | Color of the acting unit's ring (distinct from the target colors). | |
Classic Target Rings (bClassicTargetRings) | bool | False | Markers | Classic battles: rings under the units the ability can target and under the ones it hits (D-064). Off by default (D-066): the bobbing cursor over the target (smaller ones over the others a row / all ability hits) and the target list say it alone; a ring and an arrow on the same unit read as two different things. Tactics keeps its markers (Mark Targets). | |
Mark Acting Unit (bMarkActingUnit) | bool | True | Markers | Classic battles: a ring under the party member whose command menu is open (D-065). | |
Ignored Target Color (IgnoredTargetColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.083984,Chroma=0.985413,Hue=15.365562,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Markers | A unit in the area that the ability does not affect. | |
Marker Fill Opacity (MarkerFillOpacity) | float | 0.150000 | Markers | ||
Marker Follow Tolerance (MarkerFollowTolerance) | float | 5.000000 | Markers | Markers follow their unit when it moves more than this (a melee attacker running to its target). | |
Marker Ring Width (MarkerRingWidth) | float | 0.140000 | Markers | ||
Marker Tile Size (MarkerTileSize) | float | 0.850000 | Markers | Marker ring diameter, as a fraction of a tile (Tactics). | |
Selected Target Color (SelectedTargetColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.025459,Chroma=1.207711,Hue=14.619749,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Markers | The unit the ability is aimed at now / a unit its area hits. | |
Stage Marker Size (StageMarkerSize) | float | 130.000000 | Markers | Marker ring diameter under units on an ATB stage. | |
Valid Target Color (ValidTargetColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=0.066483,Chroma=1.192767,Hue=23.327459,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Markers | A unit the ability can target. | |
Area Color (AreaColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=0.022890,Chroma=1.241273,Hue=43.380360,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Area | --- Modern: area --- | |
Area Fill Opacity (AreaFillOpacity) | float | 0.400000 | Modern|Area | ||
Area Ring Width (AreaRingWidth) | float | 0.120000 | Modern|Area | ||
Edge Softness (EdgeSoftness) | float | 0.040000 | Modern|Area | Softness of every preview shape's edge (fraction of its half size). | |
Decal Depth (DecalDepth) | float | 400.000000 | Modern|Decals | Vertical depth of the decals' projection box (covers tile height changes under a shape). | |
Decal Material (DecalMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Materials/Battle/M_RSE_TargetPreviewDecal.M_RSE_TargetPreviewDecal | Modern|Decals | Deferred decal material (translucent). Parameters: Color (vector), Opacity, Shape (0 square, 1 diamond, 2 circle), RingWidth and Softness (fractions of the decal's half size), FillOpacity. Empty: the Modern style falls back to Classic. | |
Decal Sort Order (DecalSortOrder) | int32 | 10 | Modern|Decals | Sort order of the decals (above the level's own decals). | |
Color Parameter (ColorParameter) | FName | Color | Modern|Decals|Parameters | ||
Fill Opacity Parameter (FillOpacityParameter) | FName | FillOpacity | Modern|Decals|Parameters | ||
Opacity Parameter (OpacityParameter) | FName | Opacity | Modern|Decals|Parameters | ||
Ring Width Parameter (RingWidthParameter) | FName | RingWidth | Modern|Decals|Parameters | ||
Shape Parameter (ShapeParameter) | FName | Shape | Modern|Decals|Parameters | ||
Softness Parameter (SoftnessParameter) | FName | Softness | Modern|Decals|Parameters | ||
Labels in Classic (bLabelsInClassic) | bool | True | Modern|Labels | The Classic style shows the labels too (the classic forecast: the hit chance over the target, live as the cursor moves). | |
Show Labels (bShowLabels) | bool | True | Modern|Labels | Hit chance and damage over the targets (the D-033 forecast). | |
Damage Label Format (DamageLabelFormat) | FText | NSLOCTEXT("RSETargetPreview", "DamageLabel", "{Hit}% -{Damage}") | Modern|Labels | Label text. Arguments: {Hit} (percent), {Damage} (expected, or a range), {Heal}. | |
Heal Label Format (HealLabelFormat) | FText | NSLOCTEXT("RSETargetPreview", "HealLabel", "+{Heal}") | Modern|Labels | ||
KOLabel Color (KOLabelColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.112868,Chroma=1.765735,Hue=3.107039,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Labels | ||
KOLabel Suffix (KOLabelSuffix) | FText | NSLOCTEXT("RSETargetPreview", "KOSuffix", " KO") | Modern|Labels | Appended when the hit can knock the target out. | |
Label Color (LabelColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.019709,Chroma=17.654202,Hue=163.570023,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Labels | ||
Label Height (LabelHeight) | float | 210.000000 | Modern|Labels | ||
Label World Size (LabelWorldSize) | float | 34.000000 | Modern|Labels | ||
Blocked Color (BlockedColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.477765,Chroma=2.294284,Hue=14.205691,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Range | Tiles inside the range the ability cannot be aimed at: blocked by sight or height, or too close. | |
Blocked Opacity (BlockedOpacity) | float | 0.550000 | Modern|Range | ||
Range Color (RangeColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.020015,Chroma=1.244049,Hue=-19.015455,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Range | --- Modern: range ring --- | |
Range Fill Opacity (RangeFillOpacity) | float | 0.120000 | Modern|Range | Soft fill inside the range (0 = ring only). | |
Range Ring Width (RangeRingWidth) | float | 0.035000 | Modern|Range | Width of the ring at the edge of the range (fraction of the shape's half size). | |
Arc Segments (ArcSegments) | int32 | 12 | Modern|Trajectory | Segments of an arc. | |
Blocked Trajectory Color (BlockedTrajectoryColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.079992,Chroma=1.299466,Hue=1.996110,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Trajectory | A trajectory an obstacle blocks (aimed at a blocked tile). | |
Show Trajectory (bShowTrajectory) | bool | True | Modern|Trajectory | Draw the path of ranged abilities and projectiles (the ability's projectile cue, else its line of sight rules). | |
Min Range for Trajectory (MinRangeForTrajectory) | int32 | 2 | Modern|Trajectory | Ranged abilities without a projectile cue draw a trajectory from this range on (1 = melee never does). | |
Trajectory Color (TrajectoryColor) | FRSEUIColor | (Token="White",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Modern|Trajectory | ||
Trajectory Width (TrajectoryWidth) | float | 6.000000 | Modern|Trajectory | ||
Mark Targets (bMarkTargets) | bool | True | Rules | Classic and ATB: mark the units the ability can target (and, aimed, the ones its area hits or leaves out). | |
Preview While Highlighted (bPreviewWhileHighlighted) | bool | True | Rules | Show the preview while an ability or item is highlighted in the command menu, before it is chosen. | |
Show Displacements (bShowDisplacements) | bool | True | Rules | Show where knockback and pull effects would move the units they hit. | |
Default Style (DefaultStyle) | ERSETargetPreviewStyle | Classic | Rules | Style for players who did not choose one in the options. | |
Aim Invalid Format (AimInvalidFormat) | FText | NSLOCTEXT("RSETargetPreview", "AimInvalid", "{Ability}: cannot be aimed here") | Summary | Aimed at a tile it cannot reach (blocked, too close, nothing to target). Arguments: {Ability}. | |
Aim Summary Format (AimSummaryFormat) | FText | NSLOCTEXT("RSETargetPreview", "AimSummary", "{Ability}: hits {Hit}, leaves out {Ignored}") | Summary | Aimed at a tile. Arguments: {Ability}, {Hit} (units affected), {Ignored} (units in the area left out). | |
Reach Summary Format (ReachSummaryFormat) | FText | NSLOCTEXT("RSETargetPreview", "ReachSummary", "{Ability}: range {Min}-{Max}, {Targets} {Targets}|plural(one=target,other=targets) in reach") | Summary | Highlighted in the menu. Arguments: {Ability}, {Min}, {Max} (range in tiles), {Targets} (units it can target now). | |
Turn Marker Color (TurnMarkerColor) | FRSEUIColor | (Token="Charge",Alpha=1.000000,Lightness=-0.021431,Chroma=1.486113,Hue=-7.032476,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Turn Marker | ||
Turn Marker Style (TurnMarkerStyle) | ERSETurnMarkerStyle | FollowPreviewStyle | Turn Marker | Tactics: how the unit whose turn it is stands out (player and AI turns). It follows the unit as it moves. | |
Turn Pin Bob Amplitude (TurnPinBobAmplitude) | float | 8.000000 | Turn Marker|Pin | Up / down bob of the pin (0 = still). | |
Turn Pin Bob Speed (TurnPinBobSpeed) | float | 1.200000 | Turn Marker|Pin | Bobs per second. | |
Turn Pin Height (TurnPinHeight) | float | 235.000000 | Turn Marker|Pin | Height of the pin's tip over the unit's feet. | |
Turn Pin Mesh (TurnPinMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cone.Cone | Turn Marker|Pin | Pin mesh (pointing up; it is turned over). Colored through Tactics Zone -> Unit Material. | |
Turn Pin Size (TurnPinSize) | float | 22.000000 | Turn Marker|Pin | ||
Turn Ring Fill Opacity (TurnRingFillOpacity) | float | 0.080000 | Turn Marker|Ring | ||
Turn Ring Opacity (TurnRingOpacity) | float | 0.900000 | Turn Marker|Ring | ||
Turn Ring Size (TurnRingSize) | float | 110.000000 | Turn Marker|Ring | Ring diameter. | |
Turn Ring Width (TurnRingWidth) | float | 0.100000 | Turn Marker|Ring |
RPG Saga Engine: Time & Weather Rules
Class URSETimeWeatherRules (module RSECore), Project Settings, Project, RPG Saga Engine. Gameplay rules of the time of day and the weather (D-101), a rules profile section (D-035): how roaming enemies behave by phase and weather, other encounter pools at night, and weather / time modifiers in battles.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Battle Modifiers (BattleModifiers) | TArray<FRSEEnvironmentBattleModifier> | (5 entries) | Battles | Battle modifiers by weather / phase; every matching entry multiplies in. | |
Environment Affects Battles (bEnvironmentAffectsBattles) | bool | True | Battles | Weather and time change battles (the modifiers below). | |
Behavior Rules (BehaviorRules) | TArray<FRSETimeBehaviorRule> | (7 entries) | Roaming Enemies | Roaming enemies by phase / weather: every matching rule multiplies in (URSETimeSubsystem::GetBehaviorModifiers). | |
Pool Swaps (PoolSwaps) | TArray<FRSEEncounterPoolSwap> | (0 entries) | Roaming Enemies | Other encounter pools at some times / weather (the first matching swap wins). |
RPG Saga Engine: Time of Day
Class URSETimeSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The game clock (D-101, docs/design/time-weather.md): day length, phases of the day, seasons, when the clock stops, how the time is written.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Clock Enabled (bClockEnabled) | bool | True | Clock | The clock runs (off: the time only changes through effects, commands and rests). | |
Day Length Minutes (DayLengthMinutes) | float | 60.000000 | Clock | Real minutes for one game day at speed 1 (60 = one real hour per game day). | |
Max Advance Hours (MaxAdvanceHours) | float | 240.000000 | Clock | Longest single Advance Time / Set Time jump, in game hours (a safety net for data mistakes). | |
Start Day (StartDay) | int32 | 1 | Clock | Day of a new game. | |
Start Hour (StartHour) | float | 8.000000 | Clock | Hour of a new game (8.5 = 08:30). | |
Update Interval (UpdateInterval) | float | 0.100000 | Clock | Real seconds between clock steps (events fire at most this often). Lower is smoother, not costlier in practice. | |
Am Text (AmText) | FText | NSLOCTEXT("RSETimeSettings", "Am", "AM") | Display | ||
Use 24Hour Clock (bUse24HourClock) | bool | True | Display | 24-hour clock (14:05); off: 2:05 PM. | |
Clock 12Format (Clock12Format) | FText | NSLOCTEXT("RSETimeSettings", "Clock12", "{Hour}:{Minute} {AmPm}") | Display | {Hour} {Minute} {AmPm}. | |
Clock 24Format (Clock24Format) | FText | NSLOCTEXT("RSETimeSettings", "Clock24", "{Hour}:{Minute}") | Display | {Hour} {Minute} (two digits). | |
Day Format (DayFormat) | FText | NSLOCTEXT("RSETimeSettings", "DayFormat", "Day {Day}") | Display | {Day}. | |
Pm Text (PmText) | FText | NSLOCTEXT("RSETimeSettings", "Pm", "PM") | Display | ||
Pause in Battle (bPauseInBattle) | bool | True | Pause | The clock stops while a battle runs (live-map battles included). | |
Pause in Cutscenes (bPauseInCutscenes) | bool | True | Pause | The clock stops while a story scene (cutscene) plays. | |
Pause in Dialog (bPauseInDialog) | bool | True | Pause | The clock stops while a dialog runs. | |
Pause with Play Time (bPauseWithPlayTime) | bool | True | Pause | The clock stops when the play time stops (menus that pause the play time, the main menu). | |
Phases (Phases) | TArray<FRSEDayPhaseDef> | (4 entries) | Phases | Phases of the day in order of their start hour; each lasts until the next one starts (the last one wraps past midnight). | |
Inn Rest Advances Time (bInnRestAdvancesTime) | bool | True | Rest | Resting at an inn moves the clock to the next Rest Wake Hour (the inn's fade covers the jump). | |
Rest Wake Hour (RestWakeHour) | float | 7.000000 | Rest | The hour a rest ends (7 = 07:00 the next morning). | |
Days Per Season (DaysPerSeason) | int32 | 0 | Seasons | Days in each season (0 = no seasons); after the last season the first comes again. | |
Seasons (Seasons) | TArray<FGameplayTag> | (0 entries) | Seasons | Seasons in order (Time.Season.* content tags). Empty = no seasons. |
RPG Saga Engine: Time of Day Visuals
Class URSETimeOfDayVisualSettings (module RSE), Project Settings, Project, RPG Saga Engine. The sky, sun, moon, fog and grading of the Time of Day actor (D-101, docs/design/time-weather.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Parameter Collection (ParameterCollection) | TSoftObjectPtr<UMaterialParameterCollection> | /RPGSagaEngine/Visual/MPC_RSEWeather.MPC_RSEWeather | Assets | Global material parameters every material can read (TimeOfDay, NightAmount, Wetness, SnowCover, Wind...). | |
Sky Dome Material (SkyDomeMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Weather/M_RSE_SkyDome.M_RSE_SkyDome | Assets | ||
Sky Dome Mesh (SkyDomeMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/EngineSky/SM_SkySphere.SM_SkySphere | Assets | Sky dome with stars, moon glow and the 2D cloud layer. | |
Sky Dome Scale (SkyDomeScale) | float | 100.000000 | Assets | Scale of the dome mesh (the engine's sky sphere is 40.96 m: 100 = 4 km). | |
Volumetric Cloud Material (VolumetricCloudMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/EngineSky/VolumetricClouds/m_SimpleVolumetricCloud_Inst.m_SimpleVolumetricCloud_Inst | Assets | Material of the volumetric clouds (the engine's simple clouds by default). | |
Clock on Minimap (bClockOnMinimap) | bool | True | HUD | Shows the time under the minimap (D-104, Map & Minimap -> Minimap Info Lines), on levels with a sky actor and a map. | |
Clock Shows Weather (bClockShowsWeather) | bool | True | HUD | Shows the weather's name next to the time. | |
Hide Clock Panel with Minimap (bHideClockPanelWithMinimap) | bool | True | HUD | The clock panel hides while the minimap shows the time (no second clock on screen). | |
Show Clock Widget (bShowClockWidget) | bool | True | HUD | Shows the clock / weather widget while exploring. | |
Show Time in Party Menu (bShowTimeInPartyMenu) | bool | True | HUD | Shows the time in the party menu header (next to the money). | |
Clock Anchor (ClockAnchor) | FVector2D | (X=0.985000,Y=0.340000) | HUD | Normalized screen point of the clock (top right by default, under the minimap region). | |
Clock Widget Class (ClockWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | HUD | Replaces the built-in clock (a Widget Blueprint derived from RSEScreenWidget reading an RSEClockViewModel). | |
Clock ZOrder (ClockZOrder) | int32 | 40 | HUD | ||
Minimap Clock Format (MinimapClockFormat) | FText | NSLOCTEXT("RSETimeVisualSettings", "MinimapClock", "{Time} {Day} {Weather}") | HUD | The line under the minimap: {Day} {Time} {Phase} {Weather}. | |
Party Menu Time Format (PartyMenuTimeFormat) | FText | NSLOCTEXT("RSETimeVisualSettings", "PartyMenuTime", "{Day} {Time} {Weather}") | HUD | {Day} {Time} {Phase} {Weather}. | |
Suppress Other Sky Actors (bSuppressOtherSkyActors) | bool | True | Look | Other sky actors in the level (directional lights marked as atmosphere sun, sky lights, atmospheres, height fogs, clouds) are hidden while a Time of Day actor drives the sky. | |
Default Profile (DefaultProfile) | TSoftObjectPtr<URSETimeOfDayProfile> | /RPGSagaEngine/Data/TimeOfDay/DA_TimeOfDay_BrightStylized.DA_TimeOfDay_BrightStylized | Look | Profile of Time of Day actors that name none. | |
Post Process Priority (PostProcessPriority) | float | 50.000000 | Look | Priority of the actor's post process (the visual style's layer, 100 by default, stays on top). | |
Max Dynamic Night Lights (MaxDynamicNightLights) | int32 | 8 | Night Lights | Night lights that stay real lights at the same time on High / Epic (nearest to the camera first); the rest glow only. | |
Max Dynamic Night Lights Low (MaxDynamicNightLightsLow) | int32 | 4 | Night Lights | The same on Low / Medium (Steam Deck). 0 = emissive only. | |
Night Light Focus Ahead (NightLightFocusAhead) | float | 1000.000000 | Night Lights | The real lights are the nearest to a point this far in front of the camera (D-111), not to the camera itself: the lamps around the party and ahead of it light the view, the ones behind the camera give their place up. 0 = the camera. | |
Night Light Update Rate (NightLightUpdateRate) | float | 12.000000 | Night Lights | Night light updates per second (fades and flicker; the schedule is cheap). | |
Volumetric Clouds on High (bVolumetricCloudsOnHigh) | bool | True | Performance | Volumetric clouds on High / Epic (Low / Medium draw the cheap cloud layer of the sky dome only). | |
Volumetric Fog on High (bVolumetricFogOnHigh) | bool | False | Performance | Volumetric fog on High / Epic (never on Low / Medium). | |
High Quality From (HighQualityFrom) | int32 | 2 | Performance | Effects quality at or above which the High path is used (Low 0, Medium 1, High 2, Epic 3). | |
Sky Light Recapture Interval (SkyLightRecaptureInterval) | float | 20.000000 | Performance | Seconds between throttled sky light recaptures (phase changes, skips and weather changes also recapture). | |
Sky Light Recapture Look Delta (SkyLightRecaptureLookDelta) | float | 0.100000 | Performance | Throttled path: the sky light is also recaptured as soon as the weather's look moved this much since the last capture (sky light, sky brightness or cloud cover; D-104: a storm no longer keeps the clear sky's ambient for 20 s). | |
Sky Light Update (SkyLightUpdate) | ERSESkyLightUpdate | RealTimeCapture | Performance | Sky light on High / Epic. | |
Sky Light Update Low (SkyLightUpdateLow) | ERSESkyLightUpdate | RealTimeCapture | Performance | Sky light on Low / Medium. D-111: real-time capture here too. It captures only the sky (the sky dome's 2D clouds are excluded from captures either way), time-sliced over frames: the same look as Throttled, no hitch, no measurable GPU cost. | |
Update Rate (UpdateRate) | float | 20.000000 | Performance | Light, sky and fog updates per second on High / Epic (the sun moves smoothly; no work between updates). | |
Update Rate Low (UpdateRateLow) | float | 10.000000 | Performance | Updates per second on Low / Medium (Steam Deck). |
RPG Saga Engine: Toolkit Presentation
Class URSEToolkitPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of the Ability Toolkit v2 on the Tactics grid (D-055): unit motions (leap arcs, slides, teleports), the default look of zones and field objects.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Reveal Enemy Traps (bRevealEnemyTraps) | bool | False | Field | Traps are drawn for the player's side only when the player's team created them (Tile Zone: Hidden From Enemies). | |
Color Parameter (ColorParameter) | FName | Color | Field | Name of the color parameter set on field materials. | |
Default Material (DefaultMaterial) | TSoftObjectPtr<UMaterialInterface> | /Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial | Field | Material with a "Color" vector parameter (the engine's basic shape material has one). | |
Default Object Mesh (DefaultObjectMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | Field | ||
Default Projectile Material (DefaultProjectileMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Feel/M_RSE_FXGlow.M_RSE_FXGlow | Field | D-184: the material of Projectile cues without one (empty = Default Material). The plugin sets its glow (Color, Intensity), so a projectile reads as a bright bolt, not a grey ball. | |
Default Projectile Mesh (DefaultProjectileMesh) | TSoftObjectPtr<UStaticMesh> | /RPGSagaEngine/Visual/Weapons/SM_RSE_ProjectileCore.SM_RSE_ProjectileCore | Field | Projectile cues without a mesh fly this one. | |
Default Zone Mesh (DefaultZoneMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Plane.Plane | Field | --- Default look of zones and objects (engine assets; replace per zone / object with a Field Visual asset) --- | |
Object Height Scale (ObjectHeightScale) | float | 1.000000 | Field | ||
Object Tile Scale (ObjectTileScale) | float | 0.700000 | Field | Objects: size relative to a tile (the cube's height is scaled by Object Height Scale). | |
Projectile Intensity (ProjectileIntensity) | float | 6.000000 | Field | Brightness given to the projectile material's "Intensity" parameter (when it has one). | |
Zone Height Offset (ZoneHeightOffset) | float | 3.000000 | Field | ||
Zone Tile Scale (ZoneTileScale) | float | 0.900000 | Field | Zone plates: size relative to a tile, and height above the tile surface (cm). | |
Dash Speed (DashSpeed) | float | 1400.000000 | Motion | ||
Leap Arc Height Per Tile (LeapArcHeightPerTile) | float | 40.000000 | Motion | Height of a leap arc per tile of distance (cm), plus the minimum. | |
Leap Arc Min Height (LeapArcMinHeight) | float | 120.000000 | Motion | ||
Leap Hop Seconds (LeapHopSeconds) | float | 0.450000 | Motion | Seconds of one leap hop (arc). | |
Slide Speed (SlideSpeed) | float | 900.000000 | Motion | Speed of knockbacks, pulls, slides and dashes (cm/s). | |
Swap Seconds (SwapSeconds) | float | 0.500000 | Motion | Swap: seconds of the two arcs. | |
Teleport Fade Seconds (TeleportFadeSeconds) | float | 0.200000 | Motion | Teleport: seconds to vanish, then to reappear. |
RPG Saga Engine: Touch
Class URSETouchSettings (module RSE), Project Settings, Project, RPG Saga Engine. Touch controls (D-180, docs/product/mobile.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Control Opacity Range (ControlOpacityRange) | FVector2D | (X=0.200000,Y=1.000000) | Controls | Range of the player's Touch Controls Opacity option. | |
Control Scale Range (ControlScaleRange) | FVector2D | (X=0.750000,Y=1.300000) | Controls | Range of the player's Touch Controls Size option. | |
Pressed Opacity (PressedOpacity) | float | 0.950000 | Controls | Opacity of a control while touched. | |
Rest Opacity (RestOpacity) | float | 0.550000 | Controls | Opacity of the controls at rest (the player's Touch Controls Opacity option multiplies it). | |
Stick Dead Zone (StickDeadZone) | float | 0.120000 | Controls | Joystick deflection (0..1) under which it sends nothing (controls may set their own). | |
Double Tap Seconds (DoubleTapSeconds) | float | 0.350000 | Gestures | Two taps closer in time than this (and within Tap Confirm Radius) are a double tap. | |
Drag Full Rate MMPer Second (DragFullRateMMPerSecond) | float | 80.000000 | Gestures | Drags as a rate (camera pans): finger speed in millimetres per second that gives full value. | |
Long Press Seconds (LongPressSeconds) | float | 0.500000 | Gestures | A touch held still this long is a long press (details and tooltips of rows, inventory items). | |
Pinch Step Ratio (PinchStepRatio) | float | 1.150000 | Gestures | Pinch: change of the distance between the fingers that makes one zoom step (1.15 = 15 %). | |
Rotate Step Degrees (RotateStepDegrees) | float | 30.000000 | Gestures | Two-finger rotate: degrees of turn that make one rotate step. | |
Tap Confirm Radius MM (TapConfirmRadiusMM) | float | 6.000000 | Gestures | Cursor Then Confirm and double taps: how close the second tap must be to the first. | |
Tap Max Seconds (TapMaxSeconds) | float | 0.300000 | Gestures | A touch held longer than this is not a tap. | |
Tap Slop MM (TapSlopMM) | float | 3.000000 | Gestures | A touch that moves less than this is a tap / long press. | |
Default Touch Hint (DefaultTouchHint) | FText | NSLOCTEXT("RSETouch", "DefaultTouchHint", "Tap") | Key Prompts | ||
Mouse After Touch Guard Seconds (MouseAfterTouchGuardSeconds) | float | 0.600000 | Key Prompts | Mouse events this soon after a touch are the platform's copy of the touch (Windows touch screens) and do not switch the prompts to the mouse. | |
Touch Hints (TouchHints) | TMap<FKey,FText> | (8 entries) | Key Prompts | Touch hints of key prompts: the text a prompt shows for a gamepad key while the player uses touch, when no on-screen control presses that key's action (a control's label wins). Keys without a hint show Default Touch Hint for the face button bottom, nothing otherwise. | |
Context Poll Seconds (ContextPollSeconds) | float | 0.250000 | Layouts | Seconds between two looks at the moment of play (exploration, the battle kind, an open screen). The screens' open / close events also update it at once. | |
Controls Widget Class (ControlsWidgetClass) | TSoftClassPtr<URSETouchControlsWidget> | None | Layouts | The widget that draws the controls (a subclass of RSE Touch Controls Widget). Empty = the built-in one. | |
Controls ZOrder (ControlsZOrder) | int32 | 4 | Layouts | Z order of the controls in the player's screen (under the menus, which hide them anyway). | |
Layouts (Layouts) | TMap<ERSETouchContext,TSoftObjectPtr<URSETouchLayout> > | (5 entries) | Layouts | The layout of each moment of play. A context without one shows no controls and takes no gestures. | |
Show Controls (ShowControls) | ERSETouchControlsMode | Auto | Layouts | ||
Move to Accept Radius (MoveToAcceptRadius) | float | 60.000000 | Tap To Move | Tap-to-move stops this close to the tapped point (cm). | |
Move to Timeout Seconds (MoveToTimeoutSeconds) | float | 6.000000 | Tap To Move | Tap-to-move gives up after this long (blocked by a wall). | |
Debug Touches (bDebugTouches) | bool | False | Testing | Draws the touches and recognised gestures on screen (RSE.Input.Touch.Debug). | |
Emulate Touch with Mouse (bEmulateTouchWithMouse) | bool | False | Testing | PIE and PC builds: the left mouse button acts as a finger (Slate's fake touch events), so every touch path can be tried without a phone; hold Alt to add a second finger mirrored around the screen centre (pinch, rotate). RSE.Input.Touch.Emulate switches it at run time. |
RPG Saga Engine: Translate with AI
Class URSETranslateSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Translate with AI (D-163): export the game's texts for an AI, validate what comes back, import and compile.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Register Culture (bRegisterCulture) | bool | True | Compile | After a compile, add the culture to the target's gather configs, the project's cultures to stage and the Options menu's languages. | |
Gather Timeout Seconds (GatherTimeoutSeconds) | int32 | 1800 | Compile | Seconds the Gather step may take before it is stopped (when it runs as a separate editor process). | |
Include Glossary (bIncludeGlossary) | bool | True | Export | Put the content names (abilities, items, characters, enemies...) into the prompt and the Glossary.csv. | |
Only Untranslated (bOnlyUntranslated) | bool | True | Export | Export only the texts that have no translation yet in the culture (a re-export after new content is small). | |
Resolve Speakers (bResolveSpeakers) | bool | True | Export | Look the speaker of a dialog line up in the asset (adds "speaker" to the entry's context). Loads the assets that hold texts. | |
Do Not Translate (DoNotTranslate) | TArray<FString> | (3 entries) | Export | Terms that stay as they are in every language (stat abbreviations, brand names). Checked on import. | |
Format (Format) | ERSETranslateFormat | Json | Export | ||
Max Chars Per Chunk (MaxCharsPerChunk) | int32 | 12000 | Export | Most source characters in one chunk file: keeps each request inside the AI's context window. | |
Max Entries Per Chunk (MaxEntriesPerChunk) | int32 | 120 | Export | Most entries in one chunk file (one AI request). | |
Max Glossary Terms in Prompt (MaxGlossaryTermsInPrompt) | int32 | 300 | Export | Most glossary terms listed in the prompt (the Glossary.csv has all of them). | |
Output Folder (OutputFolder) | FString | Saved/Translate | Export | Folder (relative to the project) that receives the export packs and the import reports. | |
Max Length Factor (MaxLengthFactor) | float | 1.500000 | Length | Length limit = source length x this factor, for texts longer than "Short Text Length". Translations are often longer than English. | |
Min Extra Length (MinExtraLength) | int32 | 6 | Length | Characters always allowed on top of the factor (so a 3 letter source can become a 5 letter word). | |
Short Label Fields (ShortLabelFields) | TArray<FString> | (5 entries) | Length | Property names whose texts are always short labels (the short factor applies whatever the length). | |
Short Text Factor (ShortTextFactor) | float | 1.300000 | Length | Length limit factor of short texts (a 6 letter word has little room, but a longer word is common). | |
Short Text Length (ShortTextLength) | int32 | 24 | Length | Texts up to this many characters (names, buttons) are "short": they get the short factor below. | |
New Target Asset Filters (NewTargetAssetFilters) | TArray<FString> | (1 entries) | Target | Project folders a created target gathers assets from (long package paths with a trailing wildcard, e.g. "Content"). | |
New Target Name (NewTargetName) | FString | Game | Target | Name of the target created when the project has none (Create target). The Localization Dashboard shows it as well. | |
New Target Native Culture (NewTargetNativeCulture) | FString | en | Target | Native (source) culture of a target created by Create target. | |
Target Name (TargetName) | FString | Target | Localization target to translate (the name of its Config/Localization/<Name>_Gather.ini). Empty = the project's first target (the project's own content), else the RPG Saga Engine target (the plugin's texts). | ||
Edge Whitespace Severity (EdgeWhitespaceSeverity) | ERSETranslateSeverity | Warning | Validation | What leading or trailing whitespace that differs from the source counts as. | |
Extra Id Severity (ExtraIdSeverity) | ERSETranslateSeverity | Warning | Validation | What an entry with an id the export did not contain counts as (the entry is ignored either way). | |
Extra Plural Severity (ExtraPluralSeverity) | ERSETranslateSeverity | Warning | Validation | What an extra plural category (one the language does not use) counts as. Missing categories are always errors. | |
Invalid Policy (InvalidPolicy) | ERSETranslateInvalidPolicy | SkipInvalidEntries | Validation | What happens to entries with errors. | |
Too Long Severity (TooLongSeverity) | ERSETranslateSeverity | Warning | Validation | What a translation longer than its limit counts as. | |
Untranslated Min Letters (UntranslatedMinLetters) | int32 | 5 | Validation | Identical texts shorter than this many letters are not flagged as untranslated (names, "OK", "Yes"). | |
Untranslated Severity (UntranslatedSeverity) | ERSETranslateSeverity | Warning | Validation | What a translation that looks untranslated (identical to a source with letters, not a do-not-translate term) counts as. |
RPG Saga Engine: Travel
Class URSETravelSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Zone navigation and fast travel rules (D-044, docs/design/zones-travel.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Discover on Visit (bDiscoverOnVisit) | bool | True | Discovery | Being in an area marks it (and its visit-discovered places) as discovered. Off: only effects and flags discover places. | |
Fast Travel Enabled (bFastTravelEnabled) | bool | True | Fast Travel | The world map can be used to travel between discovered places (areas may still forbid it). |
RPG Saga Engine: Travel UI
Class URSETravelUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of zone navigation and fast travel (D-044, docs/design/zones-travel.md): the fades and the loading screen of a map change, the area banner, zone exits and the world map screen.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Area Check Interval (AreaCheckInterval) | float | 0.250000 | Areas | How often the player's area is checked on maps with ARSEAreaVolumes linked to areas (no timer on other maps). | |
Banner Anchor (BannerAnchor) | FVector2D | (X=0.500000,Y=0.200000) | Banner | Where the banner sits (normalized screen point, banner centered on it). | |
Banner Delay (BannerDelay) | float | 0.200000 | Banner | ||
Banner Fade Seconds (BannerFadeSeconds) | float | 0.450000 | Banner | ||
Banner Seconds (BannerSeconds) | float | 2.400000 | Banner | Time fully shown. | |
Banner on Area Change (bBannerOnAreaChange) | bool | True | Banner | The area name when the player walks into another area of the same map (an ARSEAreaVolume with an Area). | |
Banner on Arrival (bBannerOnArrival) | bool | True | Banner | The area name after a travel (at the end of the fade-in). | |
Banner on Map Start (bBannerOnMapStart) | bool | True | Banner | The area name when a map starts without a travel (new game, load). | |
Banner Shows Description (bBannerShowsDescription) | bool | False | Banner | The area's description under its name. | |
Confirm No Text (ConfirmNoText) | FText | NSLOCTEXT("RSETravelUI", "ConfirmNo", "No") | Exits | ||
Confirm Travel Format (ConfirmTravelFormat) | FText | NSLOCTEXT("RSETravelUI", "ConfirmTravelFormat", "Go to {Place}?") | Exits | Question of exits that ask first. {Place} = the destination area. | |
Confirm Yes Text (ConfirmYesText) | FText | NSLOCTEXT("RSETravelUI", "ConfirmYes", "Yes") | Exits | ||
Default Blocked Message (DefaultBlockedMessage) | FText | NSLOCTEXT("RSETravelUI", "DefaultBlockedMessage", "The way is blocked.") | Exits | Said when an exit's conditions fail and the exit has no lines of its own. | |
Default Exit Prompt (DefaultExitPrompt) | FText | NSLOCTEXT("RSETravelUI", "DefaultExitPrompt", "Go") | Exits | Prompt of exits used with Interact ("Go"). An exit's own PromptText wins. | |
Blocked Area Text (BlockedAreaText) | FText | NSLOCTEXT("RSETravelUI", "BlockedArea", "The map can\'t be used here.") | Texts | ||
Blocked Battle Text (BlockedBattleText) | FText | NSLOCTEXT("RSETravelUI", "BlockedBattle", "Not during a battle.") | Texts | ||
Blocked Busy Text (BlockedBusyText) | FText | NSLOCTEXT("RSETravelUI", "BlockedBusy", "Not now.") | Texts | ||
Blocked Disabled Text (BlockedDisabledText) | FText | NSLOCTEXT("RSETravelUI", "BlockedDisabled", "Fast travel is not available.") | Texts | ||
Blocked Traveling Text (BlockedTravelingText) | FText | NSLOCTEXT("RSETravelUI", "BlockedTraveling", "Already on the way.") | Texts | ||
Locked Text (LockedText) | FText | NSLOCTEXT("RSETravelUI", "Locked", "You can\'t go there now.") | Texts | Detail of a discovered place that cannot be reached now. | |
Need Map Item Text (NeedMapItemText) | FText | NSLOCTEXT("RSETravelUI", "NeedMapItem", "You have no map.") | Texts | Party menu entry when WorldMapItem is missing. | |
No Places Text (NoPlacesText) | FText | NSLOCTEXT("RSETravelUI", "NoPlaces", "No places discovered yet.") | Texts | ||
Party Menu Entry Hint (PartyMenuEntryHint) | FText | NSLOCTEXT("RSETravelUI", "PartyMenuEntryHint", "Travel to a place you have already visited.") | Texts | ||
Party Menu Entry Text (PartyMenuEntryText) | FText | NSLOCTEXT("RSETravelUI", "PartyMenuEntry", "World map") | Texts | The party menu row. | |
Travel Action Text (TravelActionText) | FText | NSLOCTEXT("RSETravelUI", "TravelAction", "Travel") | Texts | Key hint of Confirm. | |
World Map Title (WorldMapTitle) | FText | NSLOCTEXT("RSETravelUI", "WorldMapTitle", "World Map") | Texts | --- Texts --- | |
You Are Here Text (YouAreHereText) | FText | NSLOCTEXT("RSETravelUI", "YouAreHere", "You are here.") | Texts | Detail of the place the party is in. | |
Show Loading Area Name (bShowLoadingAreaName) | bool | True | Transition | The destination's area name on the black loading screen. | |
Fade Color (FadeColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=1.000000) | Transition | ||
Fade in Seconds (FadeInSeconds) | float | 0.600000 | Transition | Fade from FadeColor once the new map is in. 0 = cut. | |
Fade Out Seconds (FadeOutSeconds) | float | 0.450000 | Transition | Fade to FadeColor before the map changes. 0 = cut. | |
Loading Hold Seconds (LoadingHoldSeconds) | float | 0.150000 | Transition | Time spent fully faded, with the destination's name shown, before the map opens (the loading screen). | |
Loading Text Anchor (LoadingTextAnchor) | FVector2D | (X=0.500000,Y=0.500000) | Transition | Where the loading name sits (normalized screen point). | |
Overlay Widget Class (OverlayWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Transition | Fade / loading / banner overlay (D-052). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSETravelOverlayViewModel (docs/product/custom-ui.md). | |
Overlay ZOrder (OverlayZOrder) | int32 | 90 | Transition | Z-order of the overlay (above every HUD and menu). | |
Backdrop Color (BackdropColor) | FRSEUIColor | (Token="Primary",Alpha=0.700000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | Dims the world behind the map. | |
World Map in Party Menu (bWorldMapInPartyMenu) | bool | True | World Map | The party menu offers the world map (Options page). | |
Current Marker Color (CurrentMarkerColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.069244,Chroma=0.841473,Hue=-23.016491,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | ||
Current Marker Glyph (CurrentMarkerGlyph) | FText | NSLOCTEXT("RSETravelUI", "CurrentMarkerGlyph", "★") | World Map | Marker of the place the party is in. | |
List Width (ListWidth) | float | 280.000000 | World Map | Width of the place list next to the map. | |
Locked Marker Color (LockedMarkerColor) | FRSEUIColor | (Token="Neutral",Alpha=1.000000,Lightness=-0.114986,Chroma=0.432908,Hue=15.523865,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | ||
Map Background (MapBackground) | TSoftObjectPtr<UTexture2D> | None | World Map | Picture of the world under the markers. Empty = a plain themed panel. | |
Map Background Tint (MapBackgroundTint) | FLinearColor | (R=1.000000,G=1.000000,B=1.000000,A=1.000000) | World Map | ||
Map Fill Color (MapFillColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.207849,Chroma=0.243229,Hue=-14.189053,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | Map color without a picture. | |
Map Size (MapSize) | FVector2D | (X=640.000000,Y=400.000000) | World Map | Size of the map area (the markers' MapPosition is relative to it). | |
Marker Color (MarkerColor) | FRSEUIColor | (Token="Text",Alpha=1.000000,Lightness=-0.042130,Chroma=6.947662,Hue=169.558411,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | ||
Marker Glyph (MarkerGlyph) | FText | NSLOCTEXT("RSETravelUI", "MarkerGlyph", "◆") | World Map | ||
Selected Marker Color (SelectedMarkerColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | World Map | ||
World Map Item (WorldMapItem) | TSoftObjectPtr<URSEItemData> | None | World Map | When set, the party menu entry needs this item in the inventory (a map). Signposts work without it. | |
World Map Widget Class (WorldMapWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | World Map | World map screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEWorldMapViewModel (docs/product/custom-ui.md). | |
World Map ZOrder (WorldMapZOrder) | int32 | 56 | World Map | Z-order of the world map (above the party menu). |
RPG Saga Engine: Traversal
Class URSETraversalSettings (module RSE), Project Settings, Project, RPG Saga Engine. Traversal (D-121, docs/design/traversal.md): ladders, ropes, swimming, jumps, vaults and drops in exploration and in Free Tactics.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Default Anims (DefaultAnims) | TMap<FGameplayTag,FRSECharacterAnim> | (0 entries) | Animation | Traversal slot (Traversal.Anim.*) -> clip, for characters whose anim set has none (and its parent tags have none). Empty = the body moves along the traversal in its current pose. | |
Loop Blend Out Seconds (LoopBlendOutSeconds) | float | 0.200000 | Animation | Blend out (seconds) of a traversal loop when the body gets off. | |
Battle Swim Sink Fallback (BattleSwimSinkFallback) | float | 100.000000 | Battle | Free Tactics playback: the swimmer's body hangs this far below the battle position (cm) when its kind gives no offset. | |
Capture Links (bCaptureLinks) | bool | True | Battle | Placed traversal links (ladders, ropes, jumps...) become nav links in Free Tactics battles. | |
Capture Volumes (bCaptureVolumes) | bool | True | Battle | Placed swim volumes become traversal volumes in Free Tactics battles. | |
End Start Distance (EndStartDistance) | float | 160.000000 | Exploration | How far from an end a body may be to start the link from it (cm, from the capsule's feet to the end point). | |
End Use Radius (EndUseRadius) | float | 110.000000 | Exploration | Radius of the interaction sphere at each end of a link (cm): standing in it shows the prompt. | |
Swim Move Threshold (SwimMoveThreshold) | float | 30.000000 | Exploration | Horizontal speed (cm/s) above which a swimmer plays the move loop instead of the idle one. | |
Volume Check Interval (VolumeCheckInterval) | float | 0.100000 | Exploration | Seconds between checks while a body is inside a traversal volume (depth, banks, swim idle or move). | |
Follower Approach Speed (FollowerApproachSpeed) | float | 350.000000 | Followers | Walking speed of a follower going to a link (cm/s). | |
Follower Check Interval (FollowerCheckInterval) | float | 0.200000 | Followers | Seconds between the follower order checks (a timer, no Tick). | |
Follower Stagger Seconds (FollowerStaggerSeconds) | float | 0.600000 | Followers | Seconds between followers starting the same link (they climb one after the other). | |
Follower Start Distance (FollowerStartDistance) | float | 120.000000 | Followers | A follower sent to a link starts it once this close to its start end (cm). | |
Follower Timeout Seconds (FollowerTimeoutSeconds) | float | 8.000000 | Followers | Seconds a follower has to reach the link before it is brought to the far end. | |
Default Ladder Kind (DefaultLadderKind) | TSoftObjectPtr<URSETraversalLinkKindData> | /RPGSagaEngine/Data/Traversal/DA_Traversal_Ladder.DA_Traversal_Ladder | Kinds | --- Default kinds (placed actors without their own) --- | |
Default Link Kind (DefaultLinkKind) | TSoftObjectPtr<URSETraversalLinkKindData> | /RPGSagaEngine/Data/Traversal/DA_Traversal_Jump.DA_Traversal_Jump | Kinds | A Traversal Link actor without a kind (usually a jump). | |
Default Rope Kind (DefaultRopeKind) | TSoftObjectPtr<URSETraversalLinkKindData> | /RPGSagaEngine/Data/Traversal/DA_Traversal_Rope.DA_Traversal_Rope | Kinds | ||
Default Swim Kind (DefaultSwimKind) | TSoftObjectPtr<URSETraversalVolumeKindData> | /RPGSagaEngine/Data/Traversal/DA_Traversal_Swim.DA_Traversal_Swim | Kinds | ||
Rope Mesh (RopeMesh) | TSoftObjectPtr<UStaticMesh> | None | Placeholders | Look of a rope without its own mesh (a 1 m cube scaled along the rope). Empty = the engine cylinder. |
RPG Saga Engine: Turn Order Bar
Class URSETurnOrderSettings (module RSE), Project Settings, Project, RPG Saga Engine. The live battle's turn order bar (D-147, docs/design/battle-menus.md): portraits with an HP bar under each, the acting unit first and larger.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Active Frame Color (ActiveFrameColor) | FRSEUIColor | (Token="Accent",Alpha=1.000000,Lightness=0.013676,Chroma=0.827775,Hue=0.129302,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Enemy Frame Color (EnemyFrameColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.018272,Chroma=1.010696,Hue=-1.060005,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Enemy HPColor (EnemyHPColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.034214,Chroma=1.006407,Hue=0.868554,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Hidden HPColor (HiddenHPColor) | FRSEUIColor | (Token="Neutral",Alpha=0.800000,Lightness=-0.102636,Chroma=1.665689,Hue=3.202312,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
HPBack Color (HPBackColor) | FRSEUIColor | (Token="Black",Alpha=0.700000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Low HPColor (LowHPColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.016729,Chroma=1.097072,Hue=-1.844743,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | ||
Low HPShare (LowHPShare) | float | 0.300000 | Colors | ||
Party Frame Color (PartyFrameColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Lightness=0.031412,Chroma=1.025162,Hue=-12.566440,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Frames: party, enemies, the acting unit. | |
Party HPColor (PartyHPColor) | FRSEUIColor | (Token="Health",Alpha=1.000000,Lightness=0.022416,Chroma=0.945263,Hue=0.075144,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | HP bars: party fill, enemy fill, low HP (below Low HP Share), the empty part, and a hidden bar (not scanned). | |
Portrait Back Color (PortraitBackColor) | FRSEUIColor | (Token="Primary",Alpha=0.950000,Lightness=-0.172664,Chroma=0.334008,Hue=10.670621,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Colors | Behind a portrait without art (the initials show on it). | |
Active Scale (ActiveScale) | float | 1.250000 | Look | ||
Show Names (bShowNames) | bool | False | Look | The unit's name under its portrait (off: the portrait and the HP bar only; the name shows on the acting unit's panel). | |
Corner Radius (CornerRadius) | float | 6.000000 | Look | Corner radius of the portrait frames, and the frame's width. | |
Frame Width (FrameWidth) | float | 2.000000 | Look | ||
Hidden HPText (HiddenHPText) | FText | NSLOCTEXT("RSETurnOrderSettings", "HiddenHP", "?") | Look | Shown on a hidden HP bar. | |
HPBar Height (HPBarHeight) | float | 6.000000 | Look | Height of the HP bar under a portrait and the gap between portraits (pixels at 1080p). | |
Portrait Size (PortraitSize) | float | 52.000000 | Look | Side of a portrait (pixels at 1080p) and the acting unit's size (multiplier). | |
Spacing (Spacing) | float | 6.000000 | Look | ||
Steam Deck Scale (SteamDeckScale) | float | 1.100000 | Look | Scale on a Steam Deck. |
RPG Saga Engine: Turn-Based Battle
Class URSETurnBattleSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Turn-based battles (D-050, docs/design/turn-based.md) and the choice of the classic mode.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Classic Encounters Enabled (bClassicEncountersEnabled) | bool | True | Modes | Off: encounter triggers that lead to a classic stage start no battle (Tactics-only games). Tactics triggers are not affected. | |
Classic Mode Override (ClassicModeOverride) | FGameplayTag | () | Modes | Mode of every battle on a classic stage (ATB director). Empty = each encounter's BattleMode (ATB unless it says Turn). Battle.Mode.ATB or Battle.Mode.Turn switches all classic battles at once: the genre presets use this. | |
Reorder on Speed Change (bReorderOnSpeedChange) | bool | True | Turn Order | Round: a Speed change (haste, slow) reorders the fighters still waiting this round. Off = the order is fixed at the round's start. | |
Charge Delay Scale (ChargeDelayScale) | float | 1.000000 | Turn Order | CTB: an ability's charge time (ATB rules) becomes extra waiting before its user's next turn, times this. The action itself resolves at once. 0 = every action costs the same. Round battles ignore charge times. | |
Initiative Variance (InitiativeVariance) | float | 0.100000 | Turn Order | Round: initiative = Speed x (1 +/- this), rolled per fighter each round. 0 = strict Speed order. | |
Tie Break (TieBreak) | ERSETurnTieBreak | PlayerFirst | Turn Order | Tie-break after initiative (Round) or waiting time (CTB), then Speed. The unit id decides last. | |
Turn Order Preview Count (TurnOrderPreviewCount) | int32 | 8 | Turn Order | Upcoming turns shown in the HUD's turn order strip (and returned by URSETurnBattle::GetTurnOrderPreview by default). | |
Turn Order Style (TurnOrderStyle) | ERSETurnOrderStyle | Round | Turn Order | --- Turn order --- |
RPG Saga Engine: Tutorial UI
Class URSETutorialUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Presentation of the tutorials (D-047): the tutorial screen and the party menu's Help page.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Help Column Text (HelpColumnText) | FText | NSLOCTEXT("RSETutorialUI", "HelpColumn", "Tutorials") | Help Page | --- Help page (party menu) --- | |
Help Details Width (HelpDetailsWidth) | float | 460.000000 | Help Page | Width of the preview panel. | |
Help Disabled Text (HelpDisabledText) | FText | NSLOCTEXT("RSETutorialUI", "HelpDisabled", "New tutorials are turned off (Options, Game tab).") | Help Page | Under the list when the player turned tutorials off. | |
Help Empty Text (HelpEmptyText) | FText | NSLOCTEXT("RSETutorialUI", "HelpEmpty", "No tutorials yet. They appear here once you have seen them.") | Help Page | ||
Help Hint Text (HelpHintText) | FText | NSLOCTEXT("RSETutorialUI", "HelpHint", "Choose a tutorial to read it again.") | Help Page | Under the list. | |
Help Pages Format (HelpPagesFormat) | FText | NSLOCTEXT("RSETutorialUI", "HelpPages", "{Count} {Count}|plural(one=page,other=pages)") | Help Page | {Count} pages. | |
Backdrop Color (BackdropColor) | FRSEUIColor | (Token="Primary",Alpha=0.550000,Lightness=-0.526921,Chroma=0.679858,Hue=0.163523,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Screen | Dims the game behind the tutorial. | |
Pause Game (bPauseGame) | bool | True | Screen | The game pauses while a tutorial is open (battles stop: ATB time, animations, AI). | |
Image Max Height (ImageMaxHeight) | float | 220.000000 | Screen | Largest height of a page picture (its width follows its aspect, capped by the window). | |
Max Width (MaxWidth) | float | 760.000000 | Screen | ||
Min Width (MinWidth) | float | 560.000000 | Screen | Window width: grows with the text between the two, then the text wraps. | |
Open Delay Frames (OpenDelayFrames) | int32 | 2 | Screen | Frames to wait before opening a requested tutorial, so the screen that triggered it (shop, lock) is open underneath. | |
Widget Class (WidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screen | Tutorial screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSETutorialViewModel (docs/product/custom-ui.md). | |
ZOrder (ZOrder) | int32 | 70 | Screen | Z-order in the viewport: above the HUDs, the shop, the card table and the options. | |
Close Text (CloseText) | FText | NSLOCTEXT("RSETutorialUI", "Close", "Got it") | Texts | Button and key prompt that close the last page. | |
Header Text (HeaderText) | FText | NSLOCTEXT("RSETutorialUI", "Header", "Tutorial") | Texts | Small heading above the title. | |
Next Text (NextText) | FText | NSLOCTEXT("RSETutorialUI", "Next", "Next") | Texts | ||
Page Format (PageFormat) | FText | NSLOCTEXT("RSETutorialUI", "PageFormat", "{Page} / {Count}") | Texts | {Page} of {Count}. | |
Previous Text (PreviousText) | FText | NSLOCTEXT("RSETutorialUI", "Previous", "Previous") | Texts | ||
Turn Page Action Text (TurnPageActionText) | FText | NSLOCTEXT("RSETutorialUI", "TurnPage", "Page") | Texts | Key prompt of the page keys. | |
Screen Triggers (ScreenTriggers) | TMap<TSoftClassPtr<UUserWidget> ,FGameplayTag> | (4 entries) | Triggers | D-147: screens that fire a tutorial trigger when they open (widget class -> trigger; a subclass matches too): the inventory and stash, the growth board, the companion commands, the area map. A new screen's tutorial = one row here and a Tutorial Data asset with that trigger. |
RPG Saga Engine: Tutorials
Class URSETutorialSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Tutorial rules (D-047, Project Settings -> RPG Saga Engine -> Tutorials).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Enabled by Default (bEnabledByDefault) | bool | True | Rules | Tutorials show unless the player turns them off in the options (the project default; not stored for the player). | |
Load from Asset Manager (bLoadFromAssetManager) | bool | True | Rules | Every Tutorial Data asset of the Asset Manager can be triggered. Off: only tutorials registered from code. | |
Story Tutorials Follow Option (bStoryTutorialsFollowOption) | bool | True | Rules | Story effects (Show Tutorial) also respect the player's option. Off: a story tutorial always shows (once). | |
Ability Target Trigger (AbilityTargetTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.Tactics.FirstAbility") | Triggers | Tactics: the player aims an ability or item (range, area, line of sight, forecast). | |
Action Command Trigger (ActionCommandTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.ActionCommand") | Triggers | The timing window of the player's own action command is about to open (D-034): the battle holds, the tutorial shows, and the window starts only after it closes. | |
Battle Mode Triggers (BattleModeTriggers) | TMap<FGameplayTag,FGameplayTag> | (3 entries) | Triggers | Trigger fired when a battle of a mode starts (Battle.Mode.* -> Tutorial.Trigger.*). Tactics: at a manual deployment (an auto-deployed battle has no deployment to explain). Just-in-time tutorials about playing the battle belong in First Command Triggers. | |
Block Prompt Trigger (BlockPromptTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.BlockPrompt") | Triggers | A block window is about to open (defensive action command, D-034): the attack freezes, the tutorial shows, and the window starts only after it closes (its time is not counted against the press). | |
Card Match Trigger (CardMatchTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.CardMatch") | Triggers | ||
First Command Triggers (FirstCommandTriggers) | TMap<FGameplayTag,FGameplayTag> | (4 entries) | Triggers | Trigger fired the first time the player can give a command in a battle of a mode (D-064): the Tactics command menu of the player's first turn, the first ATB command menu, the first command of a turn-based battle's first round. | |
Level Up Trigger (LevelUpTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.LevelUp") | Triggers | ||
Move Trigger (MoveTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.Tactics.FirstMove") | Triggers | Tactics: the player chooses Move (reachable tiles, path line, costs). | |
Resonance Full Trigger (ResonanceFullTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.ResonanceFull") | Triggers | A party member with a full Resonance gets its command menu (the summon can be used now). | |
Screen Triggers (ScreenTriggers) | TMap<TSoftClassPtr<UObject> ,FGameplayTag> | (2 entries) | Triggers | Screens opened through a screen request (the Open Shop / Open Code Lock effects) that fire a trigger: the class of the requested asset -> the trigger. A subclass matches too. | |
Ability Triggers (AbilityTriggers) | TArray<FRSETutorialAbilityTrigger> | (5 entries) | Triggers|Live Battle | An ability aimed in battle fires these (in order): first area ability, first heal on allies, first surface, first Scan... | |
Battle Event Triggers (BattleEventTriggers) | TMap<ERSEBattleEventType,FGameplayTag> | (1 entries) | Triggers|Live Battle | Presented battle events of every mode fire these (a reinforcement joins: Unit Joined). | |
Entry Aim Triggers (EntryAimTriggers) | TMap<FName,FGameplayTag> | (1 entries) | Triggers|Live Battle | Battle menu entries (by id, or the part before the first dot: "Jump", "Overwatch", "Door") fire these when the player aims them, and those of Entry Offer Triggers the first time the menu offers them. | |
Entry Offer Triggers (EntryOfferTriggers) | TMap<FName,FGameplayTag> | (1 entries) | Triggers|Live Battle | ||
Live Aim Trigger (LiveAimTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.Live.FirstAim") | Triggers|Live Battle | Live battles (Free Tactics): the player aims an ability or item (range, cover, height, the estimate). | |
No Actions Left Trigger (NoActionsLeftTrigger) | FGameplayTag | (TagName="Tutorial.Trigger.Live.NoActionsLeft") | Triggers|Live Battle | Live battles: the active unit can still decide but has nothing left to use (End Turn). |
RPG Saga Engine: UI
Class URSEUISettings (module RSE), Project Settings, Project, RPG Saga Engine. Look of the game UI.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Action Banner Top Offset (ActionBannerTopOffset) | float | 138.000000 | Battle Banners | Distance of the action banner ("Brute — Strike", D-065) from the top of the screen, in screen units at the 1080-unit reference height (D-083): below the top bar (turn order, enemy chips). Scales with the screen like the rest of the UI (1280x800 and 1920x1080 alike). | |
Target Card Portrait Size (TargetCardPortraitSize) | float | 48.000000 | Battle HUD | Portrait on the classic battle target card (D-075). 0 = none. | |
Turn Chip Portrait Size (TurnChipPortraitSize) | float | 28.000000 | Battle HUD | Portrait on turn order chips (D-075; units with a portrait). 0 = names only. | |
Battle Camera Blend Time (BattleCameraBlendTime) | float | 0.500000 | Camera | Blend time when switching to and from an ATB stage camera. | |
Accent Color (AccentColor) | FLinearColor | (R=1.000000,G=0.780000,B=0.250000,A=1.000000) | Colors | ||
Damage Text Color (DamageTextColor) | FLinearColor | (R=1.000000,G=0.350000,B=0.300000,A=1.000000) | Colors | ||
Defeat Color (DefeatColor) | FLinearColor | (R=0.850000,G=0.200000,B=0.200000,A=1.000000) | Colors | ||
Dim Text Color (DimTextColor) | FLinearColor | (R=0.600000,G=0.620000,B=0.680000,A=1.000000) | Colors | ||
Disabled Text Color (DisabledTextColor) | FLinearColor | (R=0.350000,G=0.360000,B=0.400000,A=1.000000) | Colors | ||
Heal Text Color (HealTextColor) | FLinearColor | (R=0.350000,G=1.000000,B=0.450000,A=1.000000) | Colors | ||
HPColor (HPColor) | FLinearColor | (R=0.250000,G=0.800000,B=0.350000,A=1.000000) | Colors | ||
Low HPColor (LowHPColor) | FLinearColor | (R=0.900000,G=0.250000,B=0.200000,A=1.000000) | Colors | ||
MPColor (MPColor) | FLinearColor | (R=0.300000,G=0.500000,B=1.000000,A=1.000000) | Colors | ||
Panel Color (PanelColor) | FLinearColor | (R=0.020000,G=0.025000,B=0.050000,A=0.820000) | Colors | ||
Panel Highlight Color (PanelHighlightColor) | FLinearColor | (R=0.120000,G=0.160000,B=0.300000,A=0.950000) | Colors | ||
Text Color (TextColor) | FLinearColor | (R=0.930000,G=0.930000,B=0.950000,A=1.000000) | Colors | ||
Victory Color (VictoryColor) | FLinearColor | (R=1.000000,G=0.850000,B=0.300000,A=1.000000) | Colors | ||
Companion Menu Style (CompanionMenuStyle) | ERSECompanionMenuStyle | Radial | Companion Commands | The companion command menu (G): the companion radial (default) or the single ring of D-097. | |
Companion Radial Style (CompanionRadialStyle) | TSoftObjectPtr<URSEBattleMenuStyle> | None | Companion Commands | The companion radial's look and presenter: a Radial battle menu style asset (any URSEBattleMenuStyle). Empty = the built-in companion look (URSECompanionRadialStyle: the battle radial at full size, names on the slices). | |
Companion Radial Widget Class (CompanionRadialWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Companion Commands | The companion radial's screen (D-052). Empty = the built-in one; a Widget Blueprint derived from RSECompanionRadialWidget. | |
Companion Radial ZOrder (CompanionRadialZOrder) | int32 | 20 | Companion Commands | ||
Floating Fade Start (FloatingFadeStart) | float | 0.600000 | Floating Text | The fade starts at this share of the text's duration. | |
Floating Hit Height (FloatingHitHeight) | float | 115.000000 | Floating Text | World height above the unit's origin where combat numbers appear: the hit point (D-083). The timing grade shows higher, above the head (Battle Presentation -> Grade Height). | |
Floating Lane Release (FloatingLaneRelease) | float | 0.550000 | Floating Text | A lane is free again once its text has lived this share of its duration (it has risen out of the way). | |
Floating Lane Shift (FloatingLaneShift) | float | 16.000000 | Floating Text | Lanes above the first also step sideways, alternately right and left, by this many screen units. | |
Floating Lane Spacing (FloatingLaneSpacing) | float | 46.000000 | Floating Text | Texts on the same unit never overlap (D-083): each takes the lowest free lane, lanes this many screen units apart (numbers stack upwards, status tags downwards). | |
Floating Pop Time (FloatingPopTime) | float | 0.120000 | Floating Text | Seconds of the pop (from Pop Scale to the text's size). | |
Floating Stagger (FloatingStagger) | float | 0.140000 | Floating Text | Texts on the same unit start at least this far apart (several hits at once come one after another). | |
Floating Tag Lane Spacing (FloatingTagLaneSpacing) | float | 24.000000 | Floating Text | Status tags are smaller: their lanes are this far apart. | |
Floating Text Duration (FloatingTextDuration) | float | 1.200000 | Floating Text | --- Floating combat text --- | |
Floating Text Height (FloatingTextHeight) | float | 160.000000 | Floating Text | World height above the unit's origin of markers over units (target markers). | |
Floating Text Rise (FloatingTextRise) | float | 60.000000 | Floating Text | Rise in screen pixels over the text's lifetime. | |
Floating Text Styles (FloatingTextStyles) | TMap<ERSEFloatingTextKind,FRSEFloatingTextStyle> | (7 entries) | Floating Text | Style of each kind of combat text (D-083). Missing kinds use Damage's. | |
Bar Height (BarHeight) | float | 8.000000 | Layout | ||
Log Lines (LogLines) | int32 | 6 | Layout | ||
Log Max Width (LogMaxWidth) | float | 420.000000 | Layout | Widest line of the battle logs (longer lines are shortened), so the log never runs into the turn order. | |
Panel Padding (PanelPadding) | float | 12.000000 | Layout | ||
Screen Margin (ScreenMargin) | float | 24.000000 | Layout | --- Layout --- | |
Side Panel Max Width (SidePanelMaxWidth) | float | 440.000000 | Layout | ||
Side Panel Width (SidePanelWidth) | float | 320.000000 | Layout | Width of the battle side panels (unit, command menu, deployment, forecast). They grow with longer text up to SidePanelMaxWidth, then wrap or shorten it. | |
Turn Order Length (TurnOrderLength) | int32 | 8 | Layout | ||
Enemy HPBar Width (EnemyHPBarWidth) | float | 90.000000 | Layout|ATB | ||
Gauge Width (GaugeWidth) | float | 160.000000 | Layout|ATB | ||
Party HPBar Width (PartyHPBarWidth) | float | 150.000000 | Layout|ATB | ||
Party MPWidth (PartyMPWidth) | float | 70.000000 | Layout|ATB | ||
Party Name Width (PartyNameWidth) | float | 130.000000 | Layout|ATB | ATB party panel column widths and bar heights. | |
Text Column Growth (TextColumnGrowth) | float | 1.600000 | Layout|ATB | ATB party panel and enemy chips: text columns grow up to this factor of their width. | |
Bestiary Portrait Size (BestiaryPortraitSize) | float | 128.000000 | Party Menu | Portrait of the bestiary page (0 = none). | |
Uniform Party Menu Size (bUniformPartyMenuSize) | bool | True | Party Menu | D-132: every page of the party menu uses one window size, so switching tabs never resizes the window. With the grid inventory (Inventory UI -> Style: Grid) that size is Inventory UI -> Menu Width / Menu Height (its largest page), otherwise Party Menu Width / Party Menu Height. The window still shrinks as a whole on small screens (Screen Margin). Off: only the grid page uses the larger size (D-123). | |
Party Menu Ability Groups (PartyMenuAbilityGroups) | TArray<FRSEAbilityGroupLabel> | (4 entries) | Party Menu | Groups of the party menu's ability list (D-073), in order: abilities whose AbilityType matches a group's tag are listed under its label (the command menu groups of D-065). The rest follow under PartyMenuOtherAbilitiesLabel. | |
Party Menu Background Color (PartyMenuBackgroundColor) | FLinearColor | (R=0.020000,G=0.025000,B=0.050000,A=0.960000) | Party Menu | ||
Party Menu Blocked Hint (PartyMenuBlockedHint) | FText | NSLOCTEXT("RSEUISettings", "PartyMenuBlockedHint", "Use items from the battle menu") | Party Menu | ||
Party Menu Blocked Text (PartyMenuBlockedText) | FText | NSLOCTEXT("RSEUISettings", "PartyMenuBlocked", "Menu not available in battle") | Party Menu | Shown when the menu key is pressed during a battle and the menu stays closed (a toast of the reward feed: the line, and the hint above it). | |
Party Menu Column Width (PartyMenuColumnWidth) | float | 340.000000 | Party Menu | Width of one list column (members, slots, candidates). | |
Party Menu Height (PartyMenuHeight) | float | 620.000000 | Party Menu | ||
Party Menu in Battle (PartyMenuInBattle) | ERSEPartyMenuBattleAccess | Blocked | Party Menu | D-128: the party menu during a battle (Free Tactics, Tactics, ATB). Blocked by default: items are used through the battle menu. Each local player's menu asks for itself (URSEPartyMenuViewModel::GetBattleAccess), so co-op guests follow the same rule on their own screens. | |
Party Menu Other Abilities Label (PartyMenuOtherAbilitiesLabel) | FText | NSLOCTEXT("RSEUISettings", "GroupOther", "Other") | Party Menu | ||
Party Menu Portrait Size (PartyMenuPortraitSize) | float | 44.000000 | Party Menu | Portrait beside each member row and on the bestiary page (D-075; the character's Portrait or generated art). 0 = none. | |
Party Menu Stats (PartyMenuStats) | TArray<FGameplayTag> | (0 entries) | Party Menu | Stats listed on the equipment page and in the shop, in order. Empty = the attribute registry's visible attributes, in UI order (D-054). | |
Party Menu View Only Text (PartyMenuViewOnlyText) | FText | NSLOCTEXT("RSEUISettings", "PartyMenuViewOnly", "Nothing can be changed during battle. Use items from the battle menu.") | Party Menu | Shown when a change is tried in the view-only menu during a battle. | |
Party Menu Width (PartyMenuWidth) | float | 1100.000000 | Party Menu | ||
Stat Decrease Color (StatDecreaseColor) | FLinearColor | (R=1.000000,G=0.400000,B=0.350000,A=1.000000) | Party Menu | ||
Stat Increase Color (StatIncreaseColor) | FLinearColor | (R=0.350000,G=1.000000,B=0.450000,A=1.000000) | Party Menu | ||
Tag Labels (TagLabels) | TMap<FGameplayTag,FText> | (0 entries) | Party Menu | Optional overrides of stat and resource names in menus. Missing tags use the attribute registry's display names (D-054). | |
Back Row Color (BackRowColor) | FRSEUIColor | (Token="Info",Alpha=1.000000,Chroma=1.000000,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Formation Page | ||
Enemy Side Color (EnemySideColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.061080,Chroma=1.063807,Hue=-6.477600,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Formation Page | ||
Formation Page (FormationPage) | ERSEFormationPageMode | Auto | Party Menu|Formation Page | D-155: what the Formation tab shows. Auto: the classic formation (battle party, front / back rows) where classic battles can start (the level has an ATB battle director), else Party (leader, order and the exploration formation: live-only games). | |
Formation Portrait Size (FormationPortraitSize) | float | 64.000000 | Party Menu|Formation Page | Portrait size of the member tiles (Formation and Party pages). | |
Formation Preview Ground Color (FormationPreviewGroundColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.199310,Chroma=0.205483,Hue=-19.591469,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Formation Page | The ground of the Formation page's top-down preview. | |
Formation Preview Portrait Size (FormationPreviewPortraitSize) | float | 40.000000 | Party Menu|Formation Page | Portrait size in the battle and exploration previews. | |
Front Row Color (FrontRowColor) | FRSEUIColor | (Token="Warning",Alpha=1.000000,Lightness=-0.018197,Chroma=0.849770,Hue=-8.843429,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Formation Page | Colors of the rows in the Formation page's diagram and preview, and of the enemy side. | |
Party Page Label (PartyPageLabel) | FText | NSLOCTEXT("RSEUISettings", "PartyPageLabel", "Party") | Party Menu|Formation Page | The tab's label when it is the Party page. | |
Party Preview Range (PartyPreviewRange) | float | 500.000000 | Party Menu|Formation Page | World distance from the leader to the preview's edge (cm): the follower places are drawn to this scale. | |
Party Preview Size (PartyPreviewSize) | float | 260.000000 | Party Menu|Formation Page | Side of the Party page's top-down preview (pixels at 1080p). | |
Fallen Color (FallenColor) | FRSEUIColor | (Token="Negative",Alpha=1.000000,Lightness=-0.047762,Chroma=1.193834,Hue=-1.875349,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Status Page | ||
Fallen Portrait Tint (FallenPortraitTint) | FRSEUIColor | (Token="Neutral",Alpha=0.850000,Lightness=-0.182117,Chroma=0.522234,Hue=15.480350,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Status Page | A fallen member's portrait is tinted with this (greyed), and its mark and name use Fallen Color. | |
Fallen Text (FallenText) | FText | NSLOCTEXT("RSEUISettings", "StatusFallen", "KO") | Party Menu|Status Page | The mark on a fallen member ("KO"). | |
Growth Button Text (GrowthButtonText) | FText | NSLOCTEXT("RSEUISettings", "StatusGrowthButton", "Open growth board") | Party Menu|Status Page | Label of the button to the member's Growth page. | |
Growth Points Color (GrowthPointsColor) | FRSEUIColor | (Token="Positive",Alpha=1.000000,Lightness=0.000965,Chroma=0.733272,Hue=1.974552,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Status Page | Color of the growth points badge and button (points to spend). | |
Growth Points Format (GrowthPointsFormat) | FText | NSLOCTEXT("RSEUISettings", "StatusGrowthPoints", "{Points} points to spend") | Party Menu|Status Page | "{Points} points to spend" ({Points}). | |
Portrait Backdrop Color (PortraitBackdropColor) | FRSEUIColor | (Token="Primary",Alpha=1.000000,Lightness=-0.174197,Chroma=0.275893,Hue=8.668930,Override=(R=1.000000,G=1.000000,B=1.000000,A=1.000000)) | Party Menu|Status Page | The plate behind a member portrait (also the whole portrait when the character has none). | |
Status Card Column Width (StatusCardColumnWidth) | float | 400.000000 | Party Menu|Status Page | Width of the member card column. | |
Status Card Portrait Size (StatusCardPortraitSize) | float | 64.000000 | Party Menu|Status Page | Portrait size of the member cards (left) and of the selected member (right), pixels at 1080p. | |
Status Page Stats (StatusPageStats) | TArray<FGameplayTag> | (0 entries) | Party Menu|Status Page | Stats on the Status page, in order. Empty = the menu stats (Party Menu Stats). | |
Status Portrait Size (StatusPortraitSize) | float | 132.000000 | Party Menu|Status Page | ||
Party Menu Page Actions (PartyMenuPageActions) | TArray<FRSEPartyMenuPageAction> | (4 entries) | Party Menu|Tabs | D-148: keys that open the menu straight on a page (I = Items, J = Journal, M = Map, K = Growth by default; the same key closes it again). Add a row to give any page its own key; the actions are rebound in Options -> Controls (list them in Options -> Action Names). The actions must be mapped in the menu mapping context (Input -> Menu Mapping Context). | |
Party Menu Start Page (PartyMenuStartPage) | ERSEPartyMenuPage | Status | Party Menu|Tabs | D-148: the page the menu opens on with the menu key (Tab, Esc, the gamepad's Start). Not offered = the first tab. | |
Party Menu Tab Order (PartyMenuTabOrder) | TArray<ERSEPartyMenuPage> | (12 entries) | Party Menu|Tabs | D-148: the tabs of the party menu, left to right. A page left out is not offered (its key does nothing); Growth, Map and Equipment still hide themselves when they do not apply (Classic progression, no map on the level, the grid inventory). Empty = every page in its enum order. | |
ATB HUD Widget Class (ATBHUDWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Classic battle HUD (ATB and turn-based, D-052). Empty = the built-in themed HUD. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEATBHUDViewModel (docs/product/custom-ui.md). | |
Modal Screen Pending Grace (ModalScreenPendingGrace) | float | 5.000000 | Screens | D-152, the safety net of the modal screen stacks: a widget registered as an open screen that has not been shown (not in the viewport, not built) after this long is forgotten, so a screen registered and never shown cannot block the menus and hide the HUD forever. A screen that was shown and then left the screen without closing is forgotten at once. 0 = only shown screens are checked. | |
Party Menu Page Widget Classes (PartyMenuPageWidgetClasses) | TMap<ERSEPartyMenuPage,TSoftClassPtr<URSEScreenWidget> > | (0 entries) | Screens | One page of the built-in party menu replaced by a Widget Blueprint derived from RSEScreenWidget (D-052): the menu keeps its tabs, footer and key prompts and shows the widget as the page body. The widget receives the menu's RSEPartyMenuViewModel and gets Confirm / Back / Navigate first (Back returning false closes the menu). | |
Party Menu Widget Class (PartyMenuWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Party menu screen (D-052). Empty = the built-in themed screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSEPartyMenuViewModel (docs/product/custom-ui.md). | |
Screen Close Input Guard (ScreenCloseInputGuard) | float | 0.350000 | Screens | After a modal screen (menu, dialog, shop, card table...) closes, world actions (Interact, the menu key) are ignored this long, so the confirm press that closed the screen never reaches the world and reopens it. | |
Tactics Deployment Panel Class (TacticsDeploymentPanelClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Only the deployment panel and start confirmation of the built-in Tactics HUD (D-018): a Widget Blueprint receiving the RSETacticsHUDViewModel. | |
Tactics Forecast Panel Class (TacticsForecastPanelClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Only the attack forecast panel of the built-in Tactics HUD (D-033): a Widget Blueprint receiving the RSETacticsHUDViewModel. | |
Tactics HUD Widget Class (TacticsHUDWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Screens | Tactics battle HUD (D-052). Empty = the built-in themed HUD. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSETacticsHUDViewModel (docs/product/custom-ui.md). | |
Banner Font Size (BannerFontSize) | int32 | 54 | Text | ||
Floating Font Size (FloatingFontSize) | int32 | 26 | Text | ||
Large Font Size (LargeFontSize) | int32 | 20 | Text | ||
Normal Font Size (NormalFontSize) | int32 | 15 | Text | ||
Small Font Size (SmallFontSize) | int32 | 14 | Text | --- Text --- |
RPG Saga Engine: UI Layouts
Class URSEUILayoutSettings (module RSE), Project Settings, Project, RPG Saga Engine. Sizes the built-in screen layouts use (P61).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Group Spacing (GroupSpacing) | float | 8.000000 | Battle HUD | Space between grouped panels (compact corner, bottom bar). | |
Shooter Edge Inset (ShooterEdgeInset) | float | 18.000000 | Battle HUD | Shooter minimal: space between the panels and the screen edge. | |
Shooter Forecast Anchor Y (ShooterForecastAnchorY) | float | 0.500000 | Battle HUD | Shooter minimal: height of the forecast on the right edge (0 = top, 1 = bottom). | |
Shooter Scrim Opacity (ShooterScrimOpacity) | float | 0.350000 | Battle HUD | Shooter minimal: opacity of the soft dark backing behind the frameless panels (0 = text only). | |
Bubble Gap (BubbleGap) | float | 8.000000 | Dialog | Bubble dialog: space between the speaker's head and the bubble's tail. | |
Bubble Width (BubbleWidth) | float | 560.000000 | Dialog | Bubble dialog: width of the bubble (layout units, 1080p reference). | |
Cinematic Bottom Margin (CinematicBottomMargin) | float | 18.000000 | Dialog | Cinematic dialog: space between the line and the bottom of the screen. | |
Cinematic Text Width Fraction (CinematicTextWidthFraction) | float | 0.720000 | Dialog | Cinematic dialog: width share of the line. | |
Novel Box Width Fraction (NovelBoxWidthFraction) | float | 0.900000 | Dialog | Novel portrait dialog: width share of the box. | |
Novel Portrait Inset (NovelPortraitInset) | float | 60.000000 | Dialog | Novel portrait dialog: how far the portrait stands in from the screen's side. | |
Novel Portrait Size (NovelPortraitSize) | FVector2D | (X=420.000000,Y=600.000000) | Dialog | Novel portrait dialog: size of the large portrait. | |
Side Tab Width (SideTabWidth) | float | 210.000000 | Party Menu | Party menu with side tabs: width of the tab column. |
RPG Saga Engine: UI Style Editor
Class URSEUIStyleEditorSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. The Style Editor (P65, D-162 addendum; docs/product/ui-styles.md "Editing styles"): where its copies go, the map and the screens of "Preview in game", and the captures.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Gallery Folder (GalleryFolder) | FDirectoryPath | () | Capture | Where Capture gallery saves its shots (<folder>/<StyleId>/<shot>.png). Empty = Saved/RSE/UIStyleGallery. | |
Thumbnail Shot (ThumbnailShot) | FString | 01_party_menu | Capture | The shot of the gallery used as the style's thumbnail in the Studio's UI Styles page. | |
Project Styles Folder (ProjectStylesFolder) | FDirectoryPath | (set per project) | Duplicate | Where "Duplicate to project" puts its copies (plugin content is read-only when the plugin is installed from Fab). | |
Loop Preview (bLoopPreview) | bool | True | Preview | Repeat the gallery while Preview in game runs (edit the style and watch the screens come round again). | |
Gallery Commands (GalleryCommands) | TArray<FString> | (29 entries) | Preview | The UI gallery: console commands run one by one in the preview game, opening the main screens in sequence. "wait <seconds>" pauses, "shot <name>" saves a screenshot with the UI (Capture gallery only; skipped by Preview in game). | |
Gallery Start Delay (GalleryStartDelay) | float | 4.000000 | Preview | Seconds the preview game waits before the gallery starts (the map loads, the party spawns). | |
Preview Map (PreviewMap) | TSoftObjectPtr<UWorld> | /RPGSagaEngine/Examples/Maps/L_RSE_StarterExample.L_RSE_StarterExample | Preview | The map "Preview in game" and "Capture gallery" play (an example map of the plugin with a party). | |
Hue Slider Range (HueSliderRange) | float | 180.000000 | Toolbar | Range of the toolbar's Hue slider (degrees either way). |
RPG Saga Engine: UI Theme
Class URSEUIThemeSettings (module RSE), Project Settings, Project, RPG Saga Engine. The UI theme (D-032): the UI style the game uses (D-162), key prompt labels, spacing and the minimum font size.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Accessibility (Accessibility) | FRSEUIAccessibilitySettings | (SafePositive=(R=0.093059,G=0.456411,B=0.814847,A=1.000000),SafeNegative=(R=0.830770,G=0.155926,B=0.006995,A=1.000000),SafeWarning=(R=0.871367,G=0.775822,B=0.05... | Accessibility | Colors of the accessibility transforms (color vision remap, high contrast), D-164. | |
Minimum Font Size (MinimumFontSize) | int32 | 14 | Fonts | No text of the game UI is drawn smaller than this, whatever a role or a screen asks for: small labels (costs, captions, key caps) stay readable at 1280x800 (Steam Deck, D-037), where the UI scale is 0.9. | |
Back Action Text (BackActionText) | FText | NSLOCTEXT("RSEUITheme", "ActionBack", "Back") | Key Prompts | ||
Close Action Text (CloseActionText) | FText | NSLOCTEXT("RSEUITheme", "ActionClose", "Close") | Key Prompts | ||
Confirm Action Text (ConfirmActionText) | FText | NSLOCTEXT("RSEUITheme", "ActionConfirm", "Confirm") | Key Prompts | Generic action names for prompts. | |
Key Labels (KeyLabels) | TMap<FKey,FText> | (47 entries) | Key Prompts | Short key labels in prompts ("A" instead of "Gamepad Face Button Bottom", arrows for arrow keys). Gamepad keys here are the Xbox label set. Missing keys use the engine name. | |
Key Separator (KeySeparator) | FText | NSLOCTEXT("RSEUITheme", "KeySeparator", "/") | Key Prompts | Between the keys of one prompt (keyboard and gamepad). | |
Page Action Text (PageActionText) | FText | NSLOCTEXT("RSEUITheme", "ActionPage", "Page") | Key Prompts | ||
Select Action Text (SelectActionText) | FText | NSLOCTEXT("RSEUITheme", "ActionSelect", "Select") | Key Prompts | ||
Play Station Key Labels (PlayStationKeyLabels) | TMap<FKey,FText> | (14 entries) | Key Prompts|Gamepad Label Sets | PlayStation label set: gamepad labels that differ from KeyLabels (face buttons, shoulders, triggers, Create / Options). | |
Steam Deck Key Labels (SteamDeckKeyLabels) | TMap<FKey,FText> | (10 entries) | Key Prompts|Gamepad Label Sets | Steam Deck label set: gamepad labels that differ from KeyLabels (L1 / R1, L2 / R2, View / Menu). | |
Body (Body) | FRSEUIFontStyle | (Typeface="Regular",Size=17,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.950000,G=0.930000,B=0.880000,A=1.000000),bShadow=True) | Legacy|Fonts | ||
Caption (Caption) | FRSEUIFontStyle | (Typeface="Regular",Size=14,LetterSpacing=20,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.620000,G=0.660000,B=0.760000,A=1.000000),bSha... | Legacy|Fonts | ||
Display (Display) | FRSEUIFontStyle | (Typeface="Black",Size=76,LetterSpacing=180,OutlineSize=2,OutlineColor=(R=0.050000,G=0.030000,B=0.000000,A=0.900000),Color=(R=1.000000,G=0.700000,B=0.260000,A=1... | Legacy|Fonts | --- Fonts --- | |
Heading (Heading) | FRSEUIFontStyle | (Typeface="Bold",Size=15,LetterSpacing=140,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.620000,G=0.660000,B=0.760000,A=1.000000),bShado... | Legacy|Fonts | ||
Key Cap (KeyCap) | FRSEUIFontStyle | (Typeface="Bold",Size=14,LetterSpacing=40,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.020000,G=0.025000,B=0.050000,A=1.000000)) | Legacy|Fonts | ||
Label (Label) | FRSEUIFontStyle | (Typeface="Medium",Size=17,LetterSpacing=20,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.950000,G=0.930000,B=0.880000,A=1.000000),bShad... | Legacy|Fonts | ||
Numeric (Numeric) | FRSEUIFontStyle | (Typeface="Bold",Size=16,LetterSpacing=30,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=0.950000,G=0.930000,B=0.880000,A=1.000000),bShadow... | Legacy|Fonts | ||
Text Shadow Color (TextShadowColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=0.750000) | Legacy|Fonts | ||
Text Shadow Offset (TextShadowOffset) | FVector2D | (X=1.000000,Y=1.500000) | Legacy|Fonts | Drop shadow of texts whose role has bShadow. | |
Title (Title) | FRSEUIFontStyle | (Typeface="Bold",Size=26,LetterSpacing=120,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=0.850000),Color=(R=1.000000,G=0.700000,B=0.260000,A=1.000000),bShado... | Legacy|Fonts | ||
Key Cap Fill (KeyCapFill) | FLinearColor | (R=0.850000,G=0.860000,B=0.900000,A=0.950000) | Legacy|Key Prompts | --- Key prompts --- | |
Key Cap Text Color (KeyCapTextColor) | FLinearColor | (R=0.020000,G=0.025000,B=0.050000,A=1.000000) | Legacy|Key Prompts | ||
Key Hint Text Color (KeyHintTextColor) | FLinearColor | (R=0.620000,G=0.660000,B=0.760000,A=1.000000) | Legacy|Key Prompts | ||
Backdrop Color (BackdropColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.010000,A=0.720000) | Legacy|Panels | Screen dim behind modal screens (save, album). | |
Divider Color (DividerColor) | FLinearColor | (R=0.450000,G=0.520000,B=0.750000,A=0.350000) | Legacy|Panels | Thin separator lines. | |
Divider Thickness (DividerThickness) | float | 1.000000 | Legacy|Panels | ||
Hud Panel (HudPanel) | FRSEUIPanelStyle | (FillTop=(R=0.020000,G=0.030000,B=0.090000,A=0.780000),FillBottom=(R=0.005000,G=0.008000,B=0.025000,A=0.700000),OutlineColor=(R=0.500000,G=0.580000,B=0.800000,A... | Legacy|Panels | ||
Inset Panel (InsetPanel) | FRSEUIPanelStyle | (FillTop=(R=0.000000,G=0.000000,B=0.010000,A=0.350000),FillBottom=(R=0.000000,G=0.000000,B=0.010000,A=0.500000),OutlineColor=(R=0.400000,G=0.470000,B=0.700000,A... | Legacy|Panels | ||
Plain Panel Corner Radius (PlainPanelCornerRadius) | float | 6.000000 | Legacy|Panels | Corner radius of plain panels (MakePanel with a single color). | |
Plain Panel Outline Color (PlainPanelOutlineColor) | FLinearColor | (R=0.420000,G=0.500000,B=0.720000,A=0.450000) | Legacy|Panels | Outline of plain panels. | |
Plain Panel Outline Width (PlainPanelOutlineWidth) | float | 1.000000 | Legacy|Panels | ||
Plate Panel (PlatePanel) | FRSEUIPanelStyle | (FillTop=(R=0.070000,G=0.100000,B=0.250000,A=0.970000),FillBottom=(R=0.020000,G=0.030000,B=0.090000,A=0.970000),OutlineColor=(R=0.720000,G=0.600000,B=0.300000,A... | Legacy|Panels | ||
Window Panel (WindowPanel) | FRSEUIPanelStyle | (FillTop=(R=0.030000,G=0.050000,B=0.140000,A=0.950000),FillBottom=(R=0.006000,G=0.008000,B=0.030000,A=0.960000),OutlineColor=(R=0.440000,G=0.520000,B=0.760000,A... | Legacy|Panels | --- Panels --- | |
Button Fill (ButtonFill) | FLinearColor | (R=0.100000,G=0.140000,B=0.300000,A=0.950000) | Legacy|Rows | Buttons (card table, album). | |
Button Hover Fill (ButtonHoverFill) | FLinearColor | (R=0.180000,G=0.260000,B=0.550000,A=1.000000) | Legacy|Rows | ||
Chip Fill Opacity (ChipFillOpacity) | float | 0.200000 | Legacy|Rows | Chips and badges (D-073: "LEVEL UP!", new abilities, rare drops, elements): a small rounded tag tinted with the color it is given. Fill and outline are that color at these opacities. | |
Chip Outline Opacity (ChipOutlineOpacity) | float | 0.750000 | Legacy|Rows | ||
Chip Padding (ChipPadding) | FMargin | (Left=8.000000,Top=1.000000,Right=8.000000,Bottom=1.000000) | Legacy|Rows | ||
Rows (Rows) | FRSEUIRowStyle | (SelectedFill=(R=0.140000,G=0.240000,B=0.550000,A=0.680000),ActiveFill=(R=0.350000,G=0.260000,B=0.060000,A=0.550000),HoverFill=(R=1.000000,G=1.000000,B=1.000000... | Legacy|Rows | --- Rows --- | |
Tab Fill (TabFill) | FLinearColor | (R=1.000000,G=1.000000,B=1.000000,A=0.040000) | Legacy|Rows | Tabs (party menu pages, item categories, journal tabs). | |
Tab Selected Fill (TabSelectedFill) | FLinearColor | (R=0.140000,G=0.240000,B=0.550000,A=0.950000) | Legacy|Rows | ||
Open Seconds (OpenSeconds) | float | 0.180000 | Legacy|Transitions | Panels fade in and rise into place when a screen opens. 0 = no transition. | |
Open Slide (OpenSlide) | float | 14.000000 | Legacy|Transitions | Distance a panel rises while it opens. | |
Selection Seconds (SelectionSeconds) | float | 0.120000 | Legacy|Transitions | A newly selected row slides in from the left over this time. 0 = none. | |
Selection Slide (SelectionSlide) | float | 6.000000 | Legacy|Transitions | ||
Spacing (Spacing) | FRSEUISpacing | (XS=2.000000,S=4.000000,M=8.000000,L=14.000000,XL=24.000000) | Spacing | --- Spacing --- | |
Background Drift Seconds (BackgroundDriftSeconds) | float | 14.000000 | Transitions | Period of the title screen's slow background drift. | |
Pulse Seconds (PulseSeconds) | float | 1.600000 | Transitions | Period of the "press any key" pulse. | |
Player Can Choose Style (bPlayerCanChooseStyle) | bool | True | UI Style | The player may pick a style in the options (when there is more than one). | |
Default Style (DefaultStyle) | TSoftObjectPtr<URSEUIStyle> | /RPGSagaEngine/UI/Styles/DA_UIStyle_Classic.DA_UIStyle_Classic | UI Style | The game's UI style. Empty = a style made from the Legacy settings below (the look from before UI styles). | |
Frame Material (FrameMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/UI/Materials/M_RSE_UIFrame.M_RSE_UIFrame | UI Style | The procedural frame material (M_RSE_UIFrame). Empty or not loadable = frames are drawn as rounded boxes. | |
Selectable Styles (SelectableStyles) | TArray<TSoftObjectPtr<URSEUIStyle> > | (10 entries) | UI Style | Styles the player can pick in the options. Empty = only the default style. |
RPG Saga Engine: Visual Editors
Class URSEGraphEditorSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. The visual dialog and quest editors (D-061, docs/design/editors.md): layout spacing, node colors and previews.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Comment Color (CommentColor) | FLinearColor | (R=1.000000,G=1.000000,B=1.000000,A=0.900000) | Colors | New comment boxes. | |
Default Node Color (DefaultNodeColor) | FLinearColor | (R=0.250000,G=0.250000,B=0.250000,A=1.000000) | Colors | ||
Dialog Node Colors (DialogNodeColors) | TMap<TSoftClassPtr<URSEDialogNode> ,FLinearColor> | (7 entries) | Colors | Title color of dialog node types. A type not listed (e.g. a custom node class) uses Default Node Color. | |
Quest Fail Rules Color (QuestFailRulesColor) | FLinearColor | (R=0.500000,G=0.300000,B=0.050000,A=1.000000) | Colors | The quest's failure rules node. | |
Quest Failure Color (QuestFailureColor) | FLinearColor | (R=0.650000,G=0.150000,B=0.120000,A=1.000000) | Colors | ||
Quest Stage Color (QuestStageColor) | FLinearColor | (R=0.120000,G=0.300000,B=0.600000,A=1.000000) | Colors | ||
Quest Success Color (QuestSuccessColor) | FLinearColor | (R=0.150000,G=0.550000,B=0.200000,A=1.000000) | Colors | ||
Start Node Color (StartNodeColor) | FLinearColor | (R=0.100000,G=0.450000,B=0.100000,A=1.000000) | Colors | Start node of both editors (dialog entry, quest start). | |
Column Spacing (ColumnSpacing) | float | 420.000000 | Layout | Horizontal distance between the columns of an automatic layout (nodes of the same depth from the start). | |
Quest Row Scale (QuestRowScale) | float | 1.600000 | Layout | Extra rows between the nodes of a quest stage (stages are taller: they list their objectives). | |
Row Spacing (RowSpacing) | float | 190.000000 | Layout | Vertical distance between the rows of an automatic layout. | |
Pin Label Max Chars (PinLabelMaxChars) | int32 | 36 | Nodes | Longest pin label (choice option text, condition summary). | |
Preview Max Chars (PreviewMaxChars) | int32 | 110 | Nodes | Longest text preview shown inside a node (line text, journal entry); longer texts end with "...". | |
Start PIEFor Preview (bStartPIEForPreview) | bool | True | Preview | Play from Here: start Play In Editor when no session runs (off = the button needs a running PIE session). | |
Preview Start Delay (PreviewStartDelay) | float | 0.500000 | Preview | Seconds to wait after PIE starts before the preview dialog opens (the game mode and HUD need a moment). | |
Validate on Change (bValidateOnChange) | bool | True | Validation | Check the asset again after every change and show the problems on the nodes (off = only with the Validate button). |
RPG Saga Engine: Visual Style
Class URSEVisualStyleSettings (module RSE), Project Settings, Project, RPG Saga Engine. Visual styles (D-037): the default style of the game, the style parameter collection, the order of the presets for cycling and the developer switch (hotkey + toast).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Show Toast (bShowToast) | bool | True | Developer | Shows a toast with the style's name when it changes. | |
Cycle Keys (CycleKeys) | TArray<FKey> | (1 entries) | Developer | Keys that cycle the presets in development builds (Shift = previous). Empty = no hotkey. | |
Toast Anchor (ToastAnchor) | FVector2D | (X=0.500000,Y=0.060000) | Developer | Normalized screen point of the toast. | |
Toast Seconds (ToastSeconds) | float | 2.000000 | Developer | ||
Toast Widget Class (ToastWidgetClass) | TSoftClassPtr<URSEScreenWidget> | None | Developer | Visual style toast (D-052). Empty = the built-in screen. A Widget Blueprint derived from RSEScreenWidget replaces it and receives a RSENoticeViewModel (docs/product/custom-ui.md). | |
Toast ZOrder (ToastZOrder) | int32 | 900 | Developer | ||
Area Check Interval (AreaCheckInterval) | float | 0.250000 | Rendering | How often the player's position is checked against area volumes that override the style. | |
Parameter Collection (ParameterCollection) | TSoftObjectPtr<UMaterialParameterCollection> | /RPGSagaEngine/Visual/MPC_RSEStyle.MPC_RSEStyle | Rendering | Material parameter collection the styles write to (ScalarParameters / VectorParameters of a style). Every parameter not set by the active style is reset to the collection's default. Empty = styles set no parameters. | |
Post Process Priority (PostProcessPriority) | float | 100.000000 | Rendering | Priority of the style's unbound post-process layer. Level volumes with a higher priority still win over it (a dark cave keeps its grading); keep it above the levels' global volumes so the style is visible everywhere. | |
Allow User Choice (bAllowUserChoice) | bool | True | Styles | Whether the player's choice is honored (off = only area overrides and the default). | |
Cycle Styles (CycleStyles) | TArray<TSoftObjectPtr<URSEVisualStyle> > | (4 entries) | Styles | Order of the presets for RSE.Visual.Style Next and the dev hotkey. Empty = every RSEVisualStyle asset, by name. | |
Default Style (DefaultStyle) | TSoftObjectPtr<URSEVisualStyle> | /RPGSagaEngine/Data/Visual/DA_Style_Realistic.DA_Style_Realistic | Styles | Style of a new player (no saved choice) outside every area override. Empty = no style (the levels' own look). |
RPG Saga Engine: Weapon Hold
Class URSEWeaponHoldSettings (module RSE), Project Settings, Project, RPG Saga Engine. How weapons are held (D-185, docs/product/weapons.md): Project Settings -> RPG Saga Engine -> Weapon Hold.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Body Muzzle Socket Patterns (BodyMuzzleSocketPatterns) | TArray<FString> | (4 entries) | Body Mesh Weapons | D-185 addendum 2: socket or bone name patterns of a gun's muzzle on a body mesh that includes its weapon (hero-shooter style characters, leader-pose weapon parts). Wildcards * and ?, case-insensitive; a plain word matches when the name contains it. | |
Body Tip Socket Patterns (BodyTipSocketPatterns) | TArray<FString> | (6 entries) | Body Mesh Weapons | Socket or bone name patterns of a melee weapon's tip on a body mesh that includes its weapon. | |
Fit Search Folders (FitSearchFolders) | TArray<FString> | (1 entries) | Fit Weapon | Where Fit Weapon's Apply to Category looks for looks, items, weapon presentations and skeletons (long package paths). | |
Fit Weapon Min Confidence (FitWeaponMinConfidence) | float | 0.500000 | Fit Weapon | The Fit Weapon tab lists meshes the weapon library classifies as weapons with at least this confidence (plus every mesh a weapon presentation uses). | |
Max Grip Offset (MaxGripOffset) | float | 10.000000 | Fit Weapon | Validate: the weapon's grip must sit within this distance of the palm (else the weapon is reported as offset). | |
Weapon Socket Angle Tolerance (WeaponSocketAngleTolerance) | float | 3.000000 | Fit Weapon | Apply to Category: ... and within this angle. | |
Weapon Socket Tolerance (WeaponSocketTolerance) | float | 1.000000 | Fit Weapon | Apply to Category: a weapon whose pivot would sit within this distance of its category socket's needs no socket of its own. | |
Generated Holds (GeneratedHolds) | TArray<FRSEGeneratedHoldRule> | (7 entries) | Generated Holds | How each hold type is generated from a skeleton's reference pose (skeletons without a profile, Generate Holds). | |
Enabled (bEnabled) | bool | True | Hold | Weapon parts of looks and worn weapon items attach through the hold: the hand socket of the hold type, the weapon's grip, then the part's own transform as a fine offset. Off = parts attach with their raw transform (before D-185). CVar: RSE.Weapons.Hold. | |
Fallback Hold Type (FallbackHoldType) | ERSEWeaponHoldType | OneHandMelee | Hold | Hold of weapons whose presentation and kind say nothing (a weapon part without a presentation). | |
Profiles (Profiles) | TArray<TSoftObjectPtr<URSEWeaponHoldProfile> > | (0 entries) | Hold | Hold profiles of the project's skeletons (a look without its own uses the one whose Skeleton matches its body). | |
Procedural Recoil (bProceduralRecoil) | bool | True | Recoil | D-185 addendum 2: guns without a fire clip kick with a procedural recoil (spine and arm pitch). CVar: RSE.Weapons.Recoil. | |
Recoil Arm Bone Names (RecoilArmBoneNames) | TArray<FString> | (7 entries) | Recoil | Names of the weapon arm bone the recoil pitches up (the right upper arm), tried in order. | |
Recoil Defaults (RecoilDefaults) | TArray<FRSEWeaponRecoilDefault> | (3 entries) | Recoil | The kick per hold type (a hold profile may override it). Hold types without an entry use the recoil struct's defaults. | |
Recoil Spine Bone Names (RecoilSpineBoneNames) | TArray<FString> | (6 entries) | Recoil | Names of the bone the recoil pitches back (the upper spine), tried in order. | |
Use Skeleton Sockets (bUseSkeletonSockets) | bool | True | Skeleton Sockets | Skeleton sockets drive the right hand (D-185 addendum, Tools -> RPG Saga Engine -> Fit Weapon): a skeleton that has the socket of a weapon's hold type (Hold Sockets), or that weapon's own socket (Weapon Socket Prefix + mesh name), holds the weapon with its PIVOT on that socket, exactly as the Skeleton Editor previews it. Without one, the profile / generated hold applies. CVar: RSE.Weapons.Hold.SkeletonSockets. | |
Hold Sockets (HoldSockets) | TArray<FRSEHoldSocketName> | (7 entries) | Skeleton Sockets | The socket name of each hold type on the skeletons (parented to the hand bone of the hold: bows in the left hand). | |
Weapon Socket Prefix (WeaponSocketPrefix) | FString | RSE_W_ | Skeleton Sockets | Prefix of a weapon's own socket on a skeleton (prefix + the weapon mesh's name, e.g. RSE_W_SK_AR4): for weapons whose pivot sits elsewhere than their category's. It wins over the hold type's socket. Apply to Category writes them. | |
Index Finger Words (IndexFingerWords) | TArray<FString> | (2 entries) | Skeletons | ||
Left Hand Bone Names (LeftHandBoneNames) | TArray<FString> | (8 entries) | Skeletons | ||
Metacarpal Words (MetacarpalWords) | TArray<FString> | (1 entries) | Skeletons | Words of metacarpal bones (they start at the wrist, not at the knuckles): skipped when the knuckles are measured. | |
Middle Finger Words (MiddleFingerWords) | TArray<FString> | (2 entries) | Skeletons | Finger bone words (children of the hand) used to generate holds: the middle finger, the index, the pinky, the thumb. | |
Pinky Finger Words (PinkyFingerWords) | TArray<FString> | (4 entries) | Skeletons | ||
Right Hand Bone Names (RightHandBoneNames) | TArray<FString> | (8 entries) | Skeletons | Names of the right hand bone, tried in order (exact, case-insensitive, then contained). | |
Thumb Words (ThumbWords) | TArray<FString> | (1 entries) | Skeletons | ||
Upper Body Bone Names (UpperBodyBoneNames) | TArray<FString> | (5 entries) | Skeletons | Names of the first upper body bone (stance overlays, procedural recoil). | |
Default Ready Mode (DefaultReadyMode) | ERSEStanceReadyMode | UpperBody | Stance | D-185 addendum 2: how stance Ready clips play for looks without a hold profile (profiles have their own Default Ready Mode). | |
Gun Reject Clip Words (GunRejectClipWords) | TArray<FString> | (20 entries) | Stance | Words that keep a clip from playing as a gun's shot (melee swings mis-sorted as attacks): matched against the clip name's words like Idle Reject Words. A gun without a fitting fire clip kicks with the procedural recoil instead. | |
Stance Blend Time (StanceBlendTime) | float | 0.200000 | Stance | Seconds the upper body stance blends in and out (it fades while attacks, hits and knock-outs play). | |
Idle Reject Words (IdleRejectWords) | TArray<FString> | (24 entries) | Stance Idle | Words that make a clip unfit as a standing stance idle (prone, crouch, death, sit...): matched against the words of the clip's name (split on _ - spaces, digits and capitals; a word matches when it starts with one of these). The Fit Weapon preview, the Workbench and the character pack idle mapping skip such clips; without a fitting idle, the reference pose shows. | |
Support Hand IK (bSupportHandIK) | bool | True | Support Hand IK | The support hand reaches the weapon (two-bone IK) for holds that ask for it. CVar: RSE.Weapons.SupportHandIK. | |
Support Hand Rotation (bSupportHandRotation) | bool | True | Support Hand IK | D-185 addendum 2: the support hand also turns to the weapon's LeftHand socket rotation (the Hand Rotation node after the Two Bone IK), so the fingers wrap under the handguard. Off = the IK places the wrist only. CVar: RSE.Weapons.SupportHandRotation. | |
Support Hand Rotations (SupportHandRotations) | TArray<FRSESupportHandRotation> | (2 entries) | Support Hand IK | The support hand's orientation per hold type, relative to the weapon's LeftHand socket (a hold profile may override it). | |
Min Barrel Forward Dot (MinBarrelForwardDot) | float | 0.700000 | Validation | Validation: the barrel must point forward in the ready pose (dot of grip-to-muzzle with the character's forward at least this). | |
Support Hand Tolerance (SupportHandTolerance) | float | 8.000000 | Validation | Validation: the support hand must end within this distance of the weapon's support point (Fit Weapon's Validate checks it in the stance idle). | |
Grip Heuristics (GripHeuristics) | TArray<FRSEGripHeuristic> | (7 entries) | Weapon Grips | Where grips are measured on meshes without sockets or a stored grip, per hold type. | |
Grip Socket Words (GripSocketWords) | TArray<FString> | (3 entries) | Weapon Grips | Socket or bone words of a weapon's grip (where the palm holds it; X forward, Z up). | |
Support Socket Words (SupportSocketWords) | TArray<FString> | (5 entries) | Weapon Grips | Socket or bone words of a weapon's support point (where the other hand goes). | |
Tip Socket Words (TipSocketWords) | TArray<FString> | (4 entries) | Weapon Grips | Socket or bone words of a muzzle or blade tip. | |
Weapon Grip Socket (WeaponGripSocket) | FName | Grip | Weapon Sockets | Socket on a weapon mesh where the right hand holds it (X = barrel / blade forward, Z = top / edge). Wins over stored and measured grips. | |
Weapon Muzzle Socket (WeaponMuzzleSocket) | FName | Muzzle | Weapon Sockets | Socket on a gun where shots leave. | |
Weapon Support Socket (WeaponSupportSocket) | FName | LeftHand | Weapon Sockets | Socket on a weapon mesh where the support (left) hand goes: the support hand IK target. Move it in the mesh editor to tweak the left hand. | |
Weapon Tip Socket (WeaponTipSocket) | FName | Tip | Weapon Sockets | Socket on a melee weapon at its tip (blade or head). |
RPG Saga Engine: Weapon Library
Class URSEWeaponLibrarySettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Weapon Library settings (D-184): how weapon meshes are classified and where their presentations are written.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Anim Weapons (AnimWeapons) | TArray<FRSEWeaponKindAnimTag> | (12 entries) | Animations | The library's weapon tag of each kind (its fire, aim, reload and attack clips are picked by it). | |
Accessory Words (AccessoryWords) | TArray<FString> | (18 entries) | Classification | Words of parts and accessories that are not weapons (magazines, scopes, holsters, ammo). | |
Shape Overrides Name (bShapeOverridesName) | bool | True | Classification | D-185 addendum 2: a mesh named like a melee weapon whose SHAPE is a handgun (a grip hanging below a short barrel, flat sideways) is a Pistol (pack names like "..._Mace" for a revolver). Off = the name alone decides. | |
Folder Weight (FolderWeight) | float | 0.500000 | Classification | ||
Gun Outline Ratio (GunOutlineRatio) | float | 2.500000 | Classification | Shape check: how much more the bottom must step between the two ends than the top (a gun's grip hangs below a level slide). | |
Max Handgun Length (MaxHandgunLength) | float | 45.000000 | Classification | Shape check: the longest a handgun can be (cm); longer gun shapes stay what their name says. | |
Max Handgun Width Ratio (MaxHandgunWidthRatio) | float | 0.550000 | Classification | Shape check: a handgun is at most this wide relative to its height (flat sideways; a mace head is round). | |
Review Threshold (ReviewThreshold) | float | 0.500000 | Classification | Below this confidence the classification is reported for review (it is still used). | |
Rules (Rules) | TArray<FRSEWeaponWordRule> | (15 entries) | Classification | Name words per weapon kind (name words count fully, folder words at Folder Weight). | |
Shape Check Kinds (ShapeCheckKinds) | TArray<ERSEWeaponKind> | (2 entries) | Classification | Shape check: the name kinds the shape may overrule (a "mace" or an unnamed mesh shaped like a revolver). Blades and axes are left out: a hatchet's head steps down like a pistol grip. | |
Output Folder (OutputFolder) | FDirectoryPath | () | Output | Folder of the weapon presentations made for meshes (empty = the Animation & FX Library folder + /Weapons). Project content only. | |
Muzzle Socket Words (MuzzleSocketWords) | TArray<FString> | (4 entries) | Sockets | Socket name words of a muzzle (the first socket whose name holds one is the muzzle). | |
Shell Socket Words (ShellSocketWords) | TArray<FString> | (4 entries) | Sockets | Socket name words of a shell ejection port. | |
Hold Anim Weapons (HoldAnimWeapons) | TArray<FRSEHoldAnimWeapons> | (7 entries) | Stance Suggestions | D-185 addendum 2: the library weapon tags of each hold type (Suggest Stance Animations picks their clips). | |
Max Swing Variants (MaxSwingVariants) | int32 | 3 | Stance Suggestions | How many clips a swing slot takes (the first is the main clip, the others its variants). | |
Stance Reject Flags (StanceRejectFlags) | FGameplayTagContainer | (GameplayTags=((TagName="AnimLibrary.Flag.Crouch"),(TagName="AnimLibrary.Flag.Air"))) | Stance Suggestions | Library flags that keep a clip out of every stance slot (crouched, airborne). | |
Stance Role Categories (StanceRoleCategories) | TArray<FRSEStanceRoleCategory> | (7 entries) | Stance Suggestions | The library categories that fill each stance slot. |
RPG Saga Engine: Weapon Presentation
Class URSEWeaponPresentationSettings (module RSE), Project Settings, Project, RPG Saga Engine. How weapons look in battles (D-184, docs/product/weapons.md): the presentations per weapon kind and equipment type, the defaults for units without a weapon of their own, the surfaces of units and of the world, and the shared tracer look.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Decal Lifetime (DecalLifetime) | float | 8.000000 | Shots | Seconds a world decal (bullet hole, scorch) stays. | |
Default Tracer Material (DefaultTracerMaterial) | TSoftObjectPtr<UMaterialInterface> | /RPGSagaEngine/Visual/Feel/M_RSE_FXGlow.M_RSE_FXGlow | Shots | Material of tracers without their own (its "Color" and "Intensity" parameters are set). | |
Default Tracer Mesh (DefaultTracerMesh) | TSoftObjectPtr<UStaticMesh> | /RPGSagaEngine/Visual/Weapons/SM_RSE_TracerStreak.SM_RSE_TracerStreak | Shots | Mesh of tracers and projectiles without their own (a glowing streak). | |
Max Tracers Per Attack (MaxTracersPerAttack) | int32 | 24 | Shots | Most tracers one attack draws (bursts times pellets; performance cap on low-end hardware). | |
Tracer Intensity (TracerIntensity) | float | 8.000000 | Shots | Brightness given to the tracer material's "Intensity". | |
Unarmed Shot Anchor (UnarmedShotAnchor) | FGameplayTag | (TagName="Appearance.Anchor.Chest") | Shots | D-185 addendum 2: where units that hold no gun fire ranged attacks from (the chest or a hand; a look's Unarmed Shot Anchor wins). Units holding a gun or a bow fire from its muzzle. | |
Default Unit Surface (DefaultUnitSurface) | FGameplayTag | (TagName="Surface.Flesh") | Surfaces | The surface of units (unless their actor tags or the character's Personal Traits name a Surface.* tag). Blood-free by default. | |
Default World Surface (DefaultWorldSurface) | FGameplayTag | (TagName="Surface.Stone") | Surfaces | The surface of world hits whose physical material has no entry below. | |
Physical Surfaces (PhysicalSurfaces) | TArray<FRSEPhysicalSurfaceTag> | (0 entries) | Surfaces | ||
Approach Defaults (bApproachDefaults) | bool | True | Weapons | Units with no weapon presentation (monsters, placeholder units) still show a swing or a shot: melee attacks use Default Melee, ranged attacks Default Ranged. Off = they keep the plain procedural pose. | |
Enabled (bEnabled) | bool | True | Weapons | Attacks show their weapon (animations, flashes, tracers, trails, impacts) in timelines built by default and in Weapon Attack cues. | |
Default Melee (DefaultMelee) | TSoftObjectPtr<URSEWeaponPresentation> | /RPGSagaEngine/Data/Weapons/DA_WeaponPresentation_DefaultMelee.DA_WeaponPresentation_DefaultMelee | Weapons | ||
Default Ranged (DefaultRanged) | TSoftObjectPtr<URSEWeaponPresentation> | /RPGSagaEngine/Data/Weapons/DA_WeaponPresentation_DefaultRanged.DA_WeaponPresentation_DefaultRanged | Weapons | ||
Equipment Type Kinds (EquipmentTypeKinds) | TArray<FRSEEquipmentTypeWeaponKind> | (7 entries) | Weapons | The weapon kind of equipment types (items without a presentation of their own). | |
Kind Presentations (KindPresentations) | TArray<FRSEWeaponKindPresentation> | (13 entries) | Weapons | The presentation of each weapon kind (an item without its own uses its kind's). |
RPG Saga Engine: Weather
Class URSEWeatherSettings (module RSECore), Project Settings, Project, RPG Saga Engine. The weather (D-101): the weather types, the default weather table, transitions.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Weather Enabled (bWeatherEnabled) | bool | True | Weather | The weather changes on its own (off: only effects and commands change it). | |
Default Table (DefaultTable) | TSoftObjectPtr<URSEWeatherTableData> | /RPGSagaEngine/Data/Weather/DA_WeatherTable_Temperate.DA_WeatherTable_Temperate | Weather | Table of levels that name none (per level: the Time of Day actor or a weather volume). | |
Default Transition Seconds (DefaultTransitionSeconds) | float | 30.000000 | Weather | Transition of Set Weather when neither the effect nor the weather type gives one. | |
Default Weather (DefaultWeather) | FGameplayTag | (TagName="Weather.Clear") | Weather | Weather of a new game when no table gives one. | |
Seed (Seed) | int32 | 0 | Weather | Seed of the weather rolls (0 = a new random seed for each new game). | |
Weather Types (WeatherTypes) | TArray<TSoftObjectPtr<URSEWeatherTypeData> > | (6 entries) | Weather | Every weather type of the game (a tag not listed here cannot be set). |
RPG Saga Engine: Weather Visuals
Class URSEWeatherVisualSettings (module RSE), Project Settings, Project, RPG Saga Engine. Weather presentation (D-101): precipitation around the camera, ground wetness and snow, wind, lightning and thunder, weather sounds, where weather is hidden.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Weather Darkness Kept (WeatherDarknessKept) | float | 0.200000 | Exposure | Share of the sunlight a weather takes away (its Sun Light) that eye adaptation does not give back, by day. 0 = the camera adapts fully (a noon storm looks almost as bright as a clear day, washed out and white); 1 = no adaptation. | |
Drying Rate (DryingRate) | float | 0.010000 | Ground | Drying per second toward a drier weather. | |
Snow Melt Rate (SnowMeltRate) | float | 0.008000 | Ground | ||
Snow Settle Rate (SnowSettleRate) | float | 0.020000 | Ground | ||
Wetting Rate (WettingRate) | float | 0.050000 | Ground | Ground wetness per second toward a wetter weather (0..1 a second). | |
Flash Color (FlashColor) | FLinearColor | (R=0.750000,G=0.820000,B=1.000000,A=1.000000) | Lightning | ||
Flash Exposure (FlashExposure) | float | 0.150000 | Lightning | Exposure added at the peak of a flash (EV). | |
Flash Light Intensity (FlashLightIntensity) | float | 2.500000 | Lightning | Lightning flash brightness of the sky light and the key light (x the weather's Flash Intensity). D-104: 2.5 (was 30, which lit a storm like a sunny noon for the length of a strike). | |
Flash Seconds (FlashSeconds) | float | 0.600000 | Lightning | Length of a strike (two quick flickers). | |
Flash Sky Brightness (FlashSkyBrightness) | float | 1.500000 | Lightning | How much a flash brightens the sky itself (the atmosphere's luminance: 1 + Flash x this). | |
Covered Sound Volume (CoveredSoundVolume) | float | 0.450000 | Occlusion | Weather sounds under a roof (0..1). | |
Occlusion Channel (OcclusionChannel) | TEnumAsByte<ECollisionChannel> | ECC_Visibility | Occlusion | ||
Occlusion Check Interval (OcclusionCheckInterval) | float | 0.250000 | Occlusion | How often the camera checks for a roof or a no-weather volume. | |
Occlusion Trace Distance (OcclusionTraceDistance) | float | 3000.000000 | Occlusion | A roof within this height above the camera hides the rain (0 = volumes only). | |
Full Particles From (FullParticlesFrom) | int32 | 2 | Precipitation | Effects quality below which the weather types' Particles Low are used (Low 0, Medium 1, High 2, Epic 3). | |
Precipitation Fade Seconds (PrecipitationFadeSeconds) | float | 1.500000 | Precipitation | Precipitation fades in / out over this time (weather changes, going under a roof). | |
Sound Fade Seconds (SoundFadeSeconds) | float | 2.000000 | Sound | Weather sounds fade (seconds). | |
Wind Direction (WindDirection) | FVector2D | (X=1.000000,Y=0.350000) | Wind | Direction the wind blows toward (world X / Y). |
RPG Saga Engine: Wizards
Class URSEWizardSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. Defaults of the "Create New" wizards and of the New RPG Project wizard (D-061, docs/design/editors.md).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Ability Templates (AbilityTemplates) | TArray<FRSEWizardAbilityTemplate> | (18 entries) | Ability | Templates of the Ability wizard (and of the Item wizard's use ability). | |
Enemy Character Template (EnemyCharacterTemplate) | TSoftObjectPtr<URSECharacterData> | (set per project) | Character | Template of an enemy (AI profile, loot, bestiary fields). | |
Party Character Template (PartyCharacterTemplate) | TSoftObjectPtr<URSECharacterData> | (set per project) | Character | Template of a party character (main or secondary). | |
Blank Class Stats (BlankClassStats) | TMap<FGameplayTag,FRSEStatGrowth> | (11 entries) | Class | Stat growth of a blank class (no template). Must give MaxHP, Speed and Action Points a Base above 0. | |
Class Tag Root (ClassTagRoot) | FString | Class | Class | Parent of new class tags: typed in the Class wizard, or made by the Studio for a class made from a hero archetype ("Class" -> Class.Paladin, D-136). | |
Class Tag Source (ClassTagSource) | FString | FF_Characters.ini | Class | Tag file of the project (Config/Tags/<file>) new class tags are written to. Must not be the name of a plugin's tag file (the plugin's own are RSE_Characters.ini, RSE_Abilities.ini...): wizards never write into plugins (D-136). | |
Class Template (ClassTemplate) | TSoftObjectPtr<URSEClassData> | None | Class | Class copied by the Class wizard (empty = a blank class with the stats below). | |
Default Speaker (DefaultSpeaker) | TSoftObjectPtr<URSESpeakerData> | None | Dialog | Speaker of the first line (empty = narrator). | |
Dialog End Node Id (DialogEndNodeId) | FName | end | Dialog | ||
Dialog Entry Node Id (DialogEntryNodeId) | FName | start | Dialog | --- Dialog --- | |
Default Battle Mode (DefaultBattleMode) | FGameplayTag | (TagName="Battle.Mode.Tactics") | Encounter | --- Encounter --- | |
Default Enemies (DefaultEnemies) | TArray<TSoftObjectPtr<URSECharacterData> > | (2 entries) | Encounter | Enemies pre-filled in a new encounter. | |
Deployment Step (DeploymentStep) | FRSEGridCoord | (X=1) | Encounter | ||
Deployment Tile Count (DeploymentTileCount) | int32 | 6 | Encounter | ||
Enemy Step (EnemyStep) | FRSEGridCoord | (X=1) | Encounter | ||
Enemy Team (EnemyTeam) | FGameplayTag | (TagName="Team.Enemy") | Encounter | ||
First Deployment Coord (FirstDeploymentCoord) | FRSEGridCoord | (X=4,Y=1) | Encounter | Tactics: first deployment tile of the player; the next ones follow DeploymentStep. | |
First Enemy Coord (FirstEnemyCoord) | FRSEGridCoord | (X=4,Y=9) | Encounter | Tactics: tile of the first enemy; the next ones follow EnemyStep. | |
Player Team (PlayerTeam) | FGameplayTag | (TagName="Team.Player") | Encounter | ||
Open After Create (bOpenAfterCreate) | bool | True | General | Default of the wizards' "Open after create" box. | |
Register Folders with Asset Manager (bRegisterFoldersWithAssetManager) | bool | True | General | Default of the wizards' "Register folder with the Asset Manager" box: when the chosen folder is not scanned for the asset's primary asset type, it is added (Project Settings -> Asset Manager, DefaultGame.ini). Without it the game cannot find the asset by its id (saves, rules profiles, bestiary). | |
Save After Create (bSaveAfterCreate) | bool | True | General | Default of the wizards' "Save" box (off = the new asset stays unsaved in the editor). | |
Writable Roots (WritableRoots) | TArray<FString> | (1 entries) | General | Content roots new assets may go to besides project plugins (never engine or marketplace plugins, which are read-only). | |
Consumable Ability Template (ConsumableAbilityTemplate) | FName | ItemHeal | Item | Ability template of a new consumable's use ability (an Id of Ability Templates). | |
Default Equipment Slot (DefaultEquipmentSlot) | FGameplayTag | (TagName="Equip.Slot.Weapon") | Item | ||
Default Equipment Type (DefaultEquipmentType) | FGameplayTag | (TagName="Equip.Type.Weapon.Sword") | Item | ||
Default Item Price (DefaultItemPrice) | int32 | 50 | Item | Shop price of a new consumable or equipment piece. | |
Equipment Template (EquipmentTemplate) | TSoftObjectPtr<URSEEquipmentData> | /RPGSagaEngine/Data/Items/DA_Equip_IronSword.DA_Equip_IronSword | Item | Equipment copied by the Item wizard (empty = blank equipment with the slot and type below). | |
ATBStage Offset (ATBStageOffset) | FVector | (X=-900.000000,Y=-1000.000000,Z=0.000000) | New Project | ||
Classic Trigger Offset (ClassicTriggerOffset) | FVector | (X=1000.000000,Y=-600.000000,Z=0.000000) | New Project | ||
Data Subfolder (DataSubfolder) | FString | Data | New Project | Data subfolder of the project root (content types go to <Root>/<Data>/<type folder>). | |
Default Cultures (DefaultCultures) | TArray<FString> | (1 entries) | New Project | Culture codes proposed for localization (the first is the native one). | |
Default Project Root (DefaultProjectRoot) | FDirectoryPath | (set per project) | New Project | Content root proposed by the New RPG Project wizard. | |
Example Map (ExampleMap) | TSoftObjectPtr<UWorld> | /RPGSagaEngine/Examples/Maps/L_RSE_StarterExample.L_RSE_StarterExample | New Project | The framework's example map (D-070: the starter set's zone 1): the wizard offers to open it, or to start the project from a copy of it (Start From Example Map) instead of an empty first map. | |
Exploration Game Mode (ExplorationGameMode) | TSoftClassPtr<AGameModeBase> | /Script/RSE.RSEExplorationGameMode | New Project | ||
First Map Name (FirstMapName) | FString | L_Start | New Project | ||
Floor Mesh (FloorMesh) | TSoftObjectPtr<UStaticMesh> | /Engine/BasicShapes/Cube.Cube | New Project | Floor of the starter maps (an engine shape by default). | |
Floor Scale (FloorScale) | FVector | (X=40.000000,Y=40.000000,Z=1.000000) | New Project | ||
Genre Presets (GenrePresets) | TArray<FRSEWizardGenrePreset> | (5 entries) | New Project | ||
Main Menu Game Mode (MainMenuGameMode) | TSoftClassPtr<AGameModeBase> | /Script/RSE.RSEFrontEndGameMode | New Project | ||
Main Menu Map Name (MainMenuMapName) | FString | L_MainMenu | New Project | ||
Maps Subfolder (MapsSubfolder) | FString | Maps | New Project | ||
NPCOffset (NPCOffset) | FVector | (X=500.000000,Y=300.000000,Z=0.000000) | New Project | ||
Save Point Offset (SavePointOffset) | FVector | (X=400.000000,Y=-300.000000,Z=0.000000) | New Project | Starter map layout, relative to the PlayerStart (cm). The Tactics zone and the classic stage stand on the floor (Z = 0) and must fit on it with the stage's camera (FloorScale x 100 cm square, D-072). | |
Starter Content Folders (StarterContentFolders) | TArray<FDirectoryPath> | (0 entries) | New Project | Folders copied into the project root by "Copy starter content" (references between them are kept). | |
Starter Party Templates (StarterPartyTemplates) | TArray<TSoftObjectPtr<URSECharacterData> > | (3 entries) | New Project | Characters copied as the starter party (they become Party -> Starting Members). | |
Tactics Trigger Offset (TacticsTriggerOffset) | FVector | (X=1000.000000,Y=600.000000,Z=0.000000) | New Project | ||
Tactics Zone Offset (TacticsZoneOffset) | FVector | (X=700.000000,Y=700.000000,Z=0.000000) | New Project | ||
Theme Presets (ThemePresets) | TArray<FRSEWizardThemePreset> | (3 entries) | New Project | ||
Default Summon Character (DefaultSummonCharacter) | TSoftObjectPtr<URSECharacterData> | (set per project) | Pact | Summoned unit pre-filled in a new Pact (not a main character). | |
Summon Ability Template (SummonAbilityTemplate) | TSoftObjectPtr<URSEAbilityData> | (set per project) | Pact | Ability copied as a new Pact's summon ability (must have a Summon effect and target Self). | |
Default Quest Category (DefaultQuestCategory) | FGameplayTag | (TagName="Quest.Category.Side") | Quest | --- Quest --- | |
First Objective Id (FirstObjectiveId) | FName | Objective1 | Quest | ||
First Stage Id (FirstStageId) | FName | Start | Quest | ||
Success Outcome Id (SuccessOutcomeId) | FName | Success | Quest | ||
Default Shop Stock (DefaultShopStock) | TArray<TSoftObjectPtr<URSEItemData> > | (3 entries) | Shop | Stock pre-filled in a new shop (items without a price are skipped). |
RPG Saga Engine: World Partition
Class URSEWorldPartitionSettings (module RSE), Project Settings, Project, RPG Saga Engine. World Partition support (D-174, docs/design/save-system.md "World Partition"): Project Settings -> RPG Saga Engine -> World Partition.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Battle Streaming Margin (BattleStreamingMargin) | float | 2000.000000 | Battles | Kept loaded beyond the battle area's own radius (cm). | |
Keep Battle Cells Loaded (bKeepBattleCellsLoaded) | bool | True | Battles | A battle on the live map keeps the cells around it loaded (a streaming source at the battle's center) until it ends, so its units, cover and doors do not unload while the camera or the party moves away. Off: the players' streaming sources only. | |
Min Battle Streaming Radius (MinBattleStreamingRadius) | float | 5000.000000 | Battles | The smallest radius kept loaded around a battle (cm): battles whose area has no size (Free Tactics) use it. | |
Auto Assign State Keys (bAutoAssignStateKeys) | bool | True | Editor | The editor gives every placed or duplicated object that keeps saved state (triggers, spawners, traps, locks, interactables, building entrances) its own State Key, unique in the map. Off: keys only from RPG Saga Engine -> Fix State Keys. | |
Keep Exterior Loaded Inside (bKeepExteriorLoadedInside) | bool | True | Interiors | While the party is inside, the cells around the building entrance stay loaded (a streaming source at the door), so the way out is there at once and the entrance, its neighbours and their saved state do not unload and reload. Off: the cells stream out, and the way out waits under the blackout until the door streamed in again (Exit Stream Wait Seconds). | |
Move Interiors Off the Map (bMoveInteriorsOffTheMap) | bool | True | Interiors | Separate interiors on a partitioned map load at Interior Origin (below) instead of the Buildings settings' origin: the player's streaming source goes there with the party, and the Buildings origin can lie over real cells of a large map (they would load for nothing while the party is inside). Off: the Buildings settings' origin. | |
Exit Stream Poll Interval (ExitStreamPollInterval) | float | 0.100000 | Interiors | How often the way out checks whether the cells at the door loaded (s). | |
Exit Stream Wait Seconds (ExitStreamWaitSeconds) | float | 15.000000 | Interiors | The way out of an interior waits (under the blackout) for the cells at the door to load, at most this long (s); then it goes on anyway. | |
Exterior Streaming Radius (ExteriorStreamingRadius) | float | 3000.000000 | Interiors | The radius of cells kept loaded around the door while inside, and waited for on the way out (cm). | |
Interior Origin (InteriorOrigin) | FVector | (X=1000000.000000,Y=1000000.000000,Z=100000.000000) | Interiors | Where the first interior's level instance sits on a partitioned map (cm). Keep it away from the playable area (no cells there) and within about 10 km of the origin (floats stay precise); the Buildings settings' spacing and slots apply from here. | |
Entrance Stream Wait Seconds (EntranceStreamWaitSeconds) | float | 10.000000 | Saves | A save made inside an interior: seconds the interior waits for its building entrance to stream in (a partitioned world loads the cells around the party after the map begins play). After that the visit is over and the party stands outside. |
RPG Saga Engine: World Reactions
Class URSEWorldReactionSettings (module RSECore), Project Settings, Project, RPG Saga Engine. Project Settings -> RPG Saga Engine -> World Reactions (D-157): the rules, the reach of field casts, the texts.
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Battle Radius Padding (BattleRadiusPadding) | float | 150.000000 | Battle | Battle: an ability that lands within its area (Free Tactics radius) plus this padding changes the world objects there (cm). | |
Battle Abilities React (bBattleAbilitiesReact) | bool | True | Battle | Battle abilities change the world on the live map (off = only field casts do). | |
Default Field Radius (DefaultFieldRadius) | float | 900.000000 | Field | Field casts of abilities without their own World Radius reach this far around the caster (cm). | |
Max Targets Per Cast (MaxTargetsPerCast) | int32 | 12 | Field | At most this many objects react to one cast (the nearest first; 0 = no limit). | |
Rules (Rules) | TArray<FRSEWorldReactionRule> | (6 entries) | Rules | The rules (higher Priority first, then in order). The first rule an object matches decides. | |
Nothing Reacts Text (NothingReactsText) | FText | NSLOCTEXT("RSEWorldReactions", "NothingReacts", "Nothing here reacts to it.") | Texts | Said when a field cast finds nothing that reacts (nothing is spent). | |
Surroundings Target Text (SurroundingsTargetText) | FText | NSLOCTEXT("RSEWorldReactions", "SurroundingsTarget", "The surroundings") | Texts | The party menu's target entry for a cast on the surroundings. |
RPG Saga Engine: World Tools
Class URSEWorldToolsSettings (module RSEEditor), Project Settings, Project, RPG Saga Engine. World tools of D-076 (docs/product/world-tools.md): "Make Battle Zone Here" (a ready Tactics battle site, optionally with an ATB stage) and "Populate Zone" (random areas, visible enemies, chests, a save point, a trader, placeholders).
| Setting | Type | Default | Category | Restart | Description |
|---|---|---|---|---|---|
Add Stage by Default (bAddStageByDefault) | bool | True | Battle Site|ATB Stage | Also looks for a flat, clear place for a classic battle stage next to the zone. | |
Stage Camera View Distance (StageCameraViewDistance) | float | 6000.000000 | Battle Site|ATB Stage | The stage camera must see the level within this distance. | |
Stage Clearance (StageClearance) | float | 200.000000 | Battle Site|ATB Stage | Free height above every slot (no roof, branch or wall over the formation). | |
Stage Gap (StageGap) | float | 300.000000 | Battle Site|ATB Stage | Free space kept between the zone and the stage's area. | |
Stage Search Angles (StageSearchAngles) | int32 | 16 | Battle Site|ATB Stage | Directions tried on each ring. | |
Stage Search Radius (StageSearchRadius) | float | 5000.000000 | Battle Site|ATB Stage | How far from the zone the stage may go. | |
Stage Search Step (StageSearchStep) | float | 250.000000 | Battle Site|ATB Stage | Distance between two search rings. | |
Stage Slot Tolerance (StageSlotTolerance) | float | 5.000000 | Battle Site|ATB Stage | Largest distance between a formation slot and the ground under it (the stage is flat). | |
Add Trigger by Default (bAddTriggerByDefault) | bool | True | Battle Site|Encounter | Adds an encounter trigger on the deployment tiles (walking in starts the battle). | |
Deployment Tile Count (DeploymentTileCount) | int32 | 8 | Battle Site|Encounter | Deployment tiles painted on the player's side (at least the encounter's Max Deployed Units). | |
Enemy Area Depth (EnemyAreaDepth) | float | 0.650000 | Battle Site|Encounter | Where the enemy group gathers (D-088), from the deployment (0) to the farthest tile the party can walk to (1). The group stays together around one tile, not along the back line. A request's Enemy Area Center overrides it. | |
Enemy Area Depth Tolerance (EnemyAreaDepthTolerance) | float | 0.150000 | Battle Site|Encounter | Any tile within this share of the farthest walking distance from Enemy Area Depth is as good (other preferences decide). | |
Enemy Edge Margin (EnemyEdgeMargin) | int32 | 1 | Battle Site|Encounter | The enemy group keeps this many tiles away from the zone's border when the grid allows it. | |
Enemy High Ground Preference (EnemyHighGroundPreference) | float | 1.000000 | Battle Site|Encounter | How much the enemy group prefers high ground (per height step above the deployment). 0 = ignore height. | |
Enemy Min Distance from Deployment (EnemyMinDistanceFromDeployment) | int32 | 4 | Battle Site|Encounter | Enemies stand at least this many tiles from any deployment tile when the grid allows it. | |
Enemy Min Spacing (EnemyMinSpacing) | int32 | 2 | Battle Site|Encounter | Enemies stand at least this many tiles apart (Manhattan) when the grid allows it. | |
Generated Enemy Count (GeneratedEnemyCount) | int32 | 0 | Battle Site|Encounter | Enemies of a group generated from a progression zone; 0 = the pool's group size. | |
New Encounter Folder (NewEncounterFolder) | FDirectoryPath | (set per project) | Battle Site|Encounter | Folder of the encounters the tool creates (DA_Encounter_<Site>). | |
Site Folder (SiteFolder) | FString | BattleSites | Battle Site|Encounter | Outliner folder that holds every battle site (one sub-folder per site). | |
Site Name Prefix (SiteNamePrefix) | FString | BattleSite | Battle Site|Encounter | Name of a new site (a number is added): its actors, its Outliner folder and its encounter. | |
Snap to Tile Grid (bSnapToTileGrid) | bool | True | Battle Site|Zone | The zone's corner snaps to the world tile grid (zones placed side by side line up). | |
Default Size Preset (DefaultSizePreset) | int32 | 1 | Battle Site|Zone | Preset used by the viewport's context menu. | |
Ground Search Above (GroundSearchAbove) | float | 1500.000000 | Battle Site|Zone | How far above the area's reference point the ground search starts. | |
Ground Search Below (GroundSearchBelow) | float | 3000.000000 | Battle Site|Zone | How far below the area's reference point the ground search goes. | |
Max Connected Step (MaxConnectedStep) | int32 | 2 | Battle Site|Zone | Two walkable neighbors are connected when their heights differ by at most this many steps (regions, deployment). | |
Max Zone Tiles (MaxZoneTiles) | int32 | 32 | Battle Site|Zone | Largest zone side, in tiles. | |
Min Walkable Fraction (MinWalkableFraction) | float | 0.500000 | Battle Site|Zone | Below this share of walkable tiles the site is refused (the report says why). | |
Min Zone Tiles (MinZoneTiles) | int32 | 4 | Battle Site|Zone | Smallest zone side, in tiles (a dragged rectangle is never smaller). | |
Size Presets (SizePresets) | TArray<FRSEBattleSiteSizePreset> | (4 entries) | Battle Site|Zone | Sizes offered when the area is the camera focus or a click (not a dragged rectangle). | |
Building Mode Colors (BuildingModeColors) | TArray<FLinearColor> | (3 entries) | Building Analyzer | ||
Building Probe Headroom (BuildingProbeHeadroom) | float | 180.000000 | Building Analyzer | Free height a probe point needs above the floor to count as walkable inside (cm). | |
Building Probe Spacing (BuildingProbeSpacing) | float | 100.000000 | Building Analyzer | The interior probe grid's spacing inside a building's bounds (cm). | |
Entrance Folder (EntranceFolder) | FString | Buildings | Building Analyzer | Outliner folder of the entrances the analyzer places. | |
Interior Asset Folder (InteriorAssetFolder) | FString | (set per project) | Building Analyzer | Where the analyzer's new interior data assets go (Separate Interior proposals). | |
Default Populate Rules (DefaultPopulateRules) | TSoftObjectPtr<URSEPopulateRules> | None | Populate | Rules used when the Populate tool is given none (empty = the rules' built-in defaults). | |
Nav Mesh Volume Height (NavMeshVolumeHeight) | float | 2000.000000 | Populate | Height of the navigation bounds volume the tool adds around an area without a navmesh. | |
Populate Area from Point (PopulateAreaFromPoint) | float | 6000.000000 | Populate | Side of the square area Populate uses when the area is a point (a click or the camera focus). | |
Populate Folder Pattern (PopulateFolderPattern) | FString | Populate_{Zone} | Populate | Outliner folder of a populated zone: the text {Zone} is replaced by the progression zone's name. | |
Crossroad Merge (CrossroadMerge) | float | 300.000000 | Populate Interactions | ||
Crossroad Offset (CrossroadOffset) | float | 300.000000 | Populate Interactions | ||
Danger Edge Offset (DangerEdgeOffset) | float | 250.000000 | Populate Interactions | ||
Danger Threshold (DangerThreshold) | float | 1.000000 | Populate Interactions | A zone counts as dangerous at this danger (an enemy level) or above. | |
Existing Clearance (ExistingClearance) | float | 400.000000 | Populate Interactions | Existing objects (interactables, NPCs, exits, save points) are kept this far from new placements (cm). | |
Interactions Folder Pattern (InteractionsFolderPattern) | FString | Interactions_{Group} | Populate Interactions | Outliner folder of a Populate Interactions group: {Group} is replaced by the group's name. | |
Interaction Spot Colors (InteractionSpotColors) | TArray<FLinearColor> | (5 entries) | Populate Interactions | Preview marker colors by spot (Road, Crossroads, Danger Edge, Point Of Interest, Wilds). | |
Min Spacing Any (MinSpacingAny) | float | 400.000000 | Populate Interactions | ||
Point Of Interest Radius (PointOfInterestRadius) | float | 600.000000 | Populate Interactions | ||
Road Clearance (RoadClearance) | float | 500.000000 | Populate Interactions | ||
Road Preview Color (RoadPreviewColor) | FLinearColor | (R=0.850000,G=0.600000,B=0.250000,A=1.000000) | Populate Interactions | ||
Road Sample Step (RoadSampleStep) | float | 200.000000 | Populate Interactions | A road spline is sampled every this many cm. | |
Road Spacing (RoadSpacing) | float | 1500.000000 | Populate Interactions | Candidates along roads every this many cm (at density 1). | |
Road Tags (RoadTags) | TArray<FName> | (1 entries) | Populate Interactions | Actors with one of these tags whose spline is a road (else actors named with a Road Word). | |
Road Words (RoadWords) | TArray<FString> | (4 entries) | Populate Interactions | Words in an actor's label that make its spline a road (lower case). | |
Signpost Arm Cone (SignpostArmCone) | float | 50.000000 | Populate Interactions | A signpost arm names the point of interest within this angle of the road's way. | |
Spawner Danger Radius (SpawnerDangerRadius) | float | 1500.000000 | Populate Interactions | A visible enemy spawner makes the ground within this radius dangerous (cm). | |
Wilds Spacing (WildsSpacing) | float | 2500.000000 | Populate Interactions | ||
Camera Focus Distance (CameraFocusDistance) | float | 30000.000000 | Viewport | How far the camera focus looks for the ground. | |
Marker Size (MarkerSize) | float | 120.000000 | Viewport | Size of a Populate preview marker. | |
Surface Offset (SurfaceOffset) | float | 4.000000 | Viewport | Height of the drawn tiles above the ground (avoids flicker). | |
Area Color (AreaColor) | FLinearColor | (R=1.000000,G=0.850000,B=0.100000,A=1.000000) | Viewport|Colors | ||
Blocked Color (BlockedColor) | FLinearColor | (R=0.000000,G=0.000000,B=0.000000,A=0.450000) | Viewport|Colors | ||
Deployment Color (DeploymentColor) | FLinearColor | (R=0.150000,G=0.450000,B=1.000000,A=0.550000) | Viewport|Colors | ||
Enemy Color (EnemyColor) | FLinearColor | (R=1.000000,G=0.250000,B=0.200000,A=0.600000) | Viewport|Colors | ||
Populate Kind Colors (PopulateKindColors) | TArray<FLinearColor> | (7 entries) | Viewport|Colors | Marker colors of the Populate preview, by kind (Random Area, Spawner, Chest, Save Point, Trader, Signpost, Zone Exit). | |
Problem Color (ProblemColor) | FLinearColor | (R=1.000000,G=0.000000,B=0.600000,A=1.000000) | Viewport|Colors | ||
Stage Color (StageColor) | FLinearColor | (R=1.000000,G=0.550000,B=0.100000,A=1.000000) | Viewport|Colors | ||
Walkable Color (WalkableColor) | FLinearColor | (R=0.200000,G=0.800000,B=0.300000,A=0.250000) | Viewport|Colors |
Appendix C. Console variables and commands
Generated from the console manager: every variable and command whose name starts with RSE.. 356 entries. Type the name in the editor or game console; a variable without a value shows its current value.
| Name | Type | Default | Description |
|---|---|---|---|
RSE.Action.Face | command | RSE.Action.Face <unit|lock|soft>: the commanded character and the camera turn to a unit. | |
RSE.Action.FinisherLibrary | command | RSE.Action.FinisherLibrary <library asset>: adds a paired animation library for this session (dev). | |
RSE.Action.Finishers | command | RSE.Action.Finishers <Off|Sometimes|Always>: the player's finisher option. | |
RSE.Action.Input | command | RSE.Action.Input <input> [0|1]: presses (1) or releases (0) an action battle input of the first local player. | |
RSE.Action.Lock | command | RSE.Action.Lock [unit|soft|off]: hard lock on a unit (none: the best target unless one is held). | |
RSE.Action.Look | command | RSE.Action.Look <yaw> <pitch>: turns the action camera (degrees). | |
RSE.Action.Pull | command | RSE.Action.Pull <unit|lock|soft> [cm]: a unit steps in front of the commanded character (dev). | |
RSE.Action.SetHP | command | RSE.Action.SetHP <unit|lock|soft> <hp>: sets a unit's HP (dev). | |
RSE.Action.Start | command | RSE.Action.Start <encounter>: starts an action encounter where the party stands (D-171). | |
RSE.Action.Status | command | RSE.Action.Status: logs the running action battle's units. | |
RSE.Action.Weapon | command | RSE.Action.Weapon <unit> <weapon asset>: gives a unit an action weapon for this battle. | |
RSE.Action.Win | command | RSE.Action.Win: every enemy of the running action battle falls (dev). | |
RSE.ActionCommand.PlayerMode | command | Player option for action command prompts: RSE.ActionCommand.PlayerMode [All|OffenseOnly|Off]. Without an argument, prints the current mode. | |
RSE.AI.Debug | int | 0 | AI debugger (D-056): 0 = off, 1 = record every AI decision (top options with their score breakdown) for the in-game debugger and log it, 2 = also log every score term. |
RSE.AIInterop.CreateExampleBossBT | command | Creates (or rebuilds) the boss example Behavior Tree and Blackboard of the RPG Saga Engine AI interop (action battles). | |
RSE.AIInterop.CreateExampleBT | command | Creates (or rebuilds) the example Behavior Tree and Blackboard of the RPG Saga Engine AI interop. | |
RSE.Anim.Warping | int | -1 | Locomotion orientation and stride warping: -1 = Project Settings (Character Visuals), 0 = off, 1 = on. |
RSE.Appearance.WeaponTip | bool | true | Whether the WeaponTip presentation anchor resolves to the tip of the held weapon (0 = use the anchor fallbacks, e.g. the hand). |
RSE.ATB.Grant | command | Teaches a running classic battle's units an ability. Args: <AbilityName> [party | enemies | UnitId] [timed] (timed: with a timing prompt, this session only) | |
RSE.ATB.Input | command | Classic battle input without a keyboard. Args: select | cancel | up | down | left | right | next | prev | toggle | block | aim <UnitId> | choose <UnitId> | entry <Index> | pick <Index> | unit <UnitId> | state | |
RSE.ATB.Mode | command | Sets ATB time mode for the running battle. Args: Wait|Active | |
RSE.Audio.Debug | bool | false | Logs every music change and sound effect the game plays or would play (D-036). |
RSE.Audio.Dump | command | Prints the music layers, what plays, the volumes and the sound catalog. | |
RSE.Audio.PlayContext | command | Plays a music context over the current music (story layer): RSE.Audio.PlayContext <MainMenu|Exploration|BattleATB|BattleTactics|Boss|Victory|GameOver|Dialog>. RSE.Audio.PlayContext None restores the music below. | |
RSE.Audio.SetVolume | command | Sets a player volume (saved in GameUserSettings.ini): RSE.Audio.SetVolume <Master|Music|SFX|Voice|UI> <0..1>. Without a value, prints it. | |
RSE.Authority.Mode | command | RSE.Authority.Mode [Standalone|Authority|Proxy] [Slot]: shows or forces the authority mode (debug). | |
RSE.Battle.AutoPlay | bool | false | When true, the AI also commands player units (demos, AI-vs-AI observation, soak tests). |
RSE.Battle.ModeOverride | command | D-182: fights every encounter that allows it in this mode: Tactics | Live | ATB | Turn | Action | None. No argument: shows the override. | |
RSE.Battle.Presentation.ReduceEffects | int | -1 | -1 = use Project Settings, 0 = full effects, 1 = reduced effects (shake, flash... per settings). |
RSE.Battle.Presentation.Speed | float | 1 | Extra multiplier of the battle presentation speed (testing). |
RSE.Battle.PreviewTransition | command | Plays battle intro transitions in the running game, without a battle (D-096). Args: Style[+Style...] | All, [ShotAt=0.5] (effect progress of the saved frame), [ShotDir=<folder>] (saves <Style>_<DrawnStyle>.png there), [Quit]. | |
RSE.Battle.Restart | command | Restarts the encounter from deployment. | |
RSE.Battle.Start | command | Fills the free deployment slots, ends deployment and starts the battle. | |
RSE.Battle.StartATB | command | Starts the ATB test battle on the ATB stage. Args: [DirectorNameFilter] (default: the first classic director) | |
RSE.Battle.StartEncounter | command | Starts an encounter asset on this map without a trigger (classic: the battle stage; Tactics: its battle site, else the first one). Args: <EncounterAssetName> | |
RSE.Battle.StartTurn | command | Starts a turn-based battle on the map's classic stage (D-050). Args: [EncounterAssetName] (default: the first Battle.Mode.Turn encounter) | |
RSE.Battle.Transition | int | 1 | Screen transitions between exploration and battles (D-083): 1 = per Battle Transition settings, 0 = off. |
RSE.BattleFlow.Confirm | command | RSE.BattleFlow.Confirm: confirms the open results or game over screen (Continue / the selected choice), as Select does. | |
RSE.BattleFlow.ShowGameOver | command | Shows the game over screen (Load last save / main menu work; Retry is disabled outside battles). | |
RSE.BattleFlow.ShowResults | command | RSE.BattleFlow.ShowResults [Experience=120] [Money=250] [MaxItems=6]: shows the victory results with sample rewards from the party (really given). | |
RSE.BattleMenu | command | Battle menus (D-122, D-147). Args: style [Id] | open <CategoryId> | close | pick <NodeId> | picki <N> | hli <N> | skipto <CategoryId> | expand <0|1> | highlight <Id> | page <N> | activate <EntryId> | input <confirm|cancel|left|right|up|down|page+|page-|aim X Y|key Name> | hotbar <From> <To> | state | |
RSE.BattleMenu.Style | string | Debug: the battle menu style in use (a Style Id: List, Radial, Hotbar...), over the player's option and the project's default. Empty = normal. | |
RSE.Bestiary.List | command | Lists the bestiary entries (encountered / defeated / highest level). | |
RSE.Bestiary.Scan | command | RSE.Bestiary.Scan [0]: marks every bestiary entry scanned (D-147: enemy HP shows in battle HUDs); 0 clears the marks. | |
RSE.Bestiary.Unlock | command | RSE.Bestiary.Unlock [defeats]: records every enemy character of the Asset Manager as met and defeated (default 1). | |
RSE.BlueprintAPI.Export | command | Writes the Blueprint API manifest (the plugin's Config/BlueprintAPI/Manifest.json) and the reference (docs/product/blueprint-api.md) from reflection (D-052). | |
RSE.Buildings | command | D-150 building entrances: enter <label> [instant] | exit [instant] | door <label> | floor <level> | check | state | |
RSE.Camera | command | The party RPG camera (D-113). Args: zoom <cm|in|out|min|max> [instant] | yaw <deg> | turn <deg> | tilt <deg|up|down|reset> [instant] | pan <X> <Y> | style <tactical|thirdperson|clear> | prop <wall|tree|bigtree|pillar|mesh|forest> [fade] [meters] [/Mesh/Path] [x<scale>] | clearprops | overlay <subtle|filled> | jitter <seconds> | faceturn <deg> [seconds] | absolute <0|1> | state | |
RSE.Camera.AddOcclusionFade | command | Adds the camera occlusion fade (MF_RSE_CameraOcclusion) to materials (D-113, D-116; an instance changes its parent; project materials only; backups and a report in Saved/RSE). Args: <MaterialPath> [...] | |
RSE.Camera.CinematicBattle | int | -1 | D-183: the cinematic battle camera (1 = on, 0 = off, -1 = Camera Framing -> Cinematic Battle Camera -> Enabled). |
RSE.Camera.Framing | int | 1 | D-183: obstruction-aware cameras (1 = on, 0 = every camera keeps its own pose). |
RSE.Camera.FramingDebug | int | 0 | D-183: draws the obstruction-aware cameras' probes (1 = on). |
RSE.Camera.RemoveOcclusionFade | command | Takes the camera occlusion fade out of materials again (D-116). Args: <MaterialPath> [...] | |
RSE.Cards.Album | command | Opens the card album and deck editor. | |
RSE.Cards.Challenge | command | Requests a card match, as a Start Card Match effect would. Args: <OpponentAssetName> | |
RSE.Cards.Dump | command | Logs the card collection, deck size and records per opponent. | |
RSE.Cards.ForceSeed | int | -1 | Fixed seed for every card match (shuffle and stake). -1 = off. |
RSE.Cards.Give | command | Adds copies of a card to the collection. Args: <CardAssetName> [Count] | |
RSE.Cards.Log | bool | false | Logs every event of every card match played. |
RSE.CharacterActions.AddToStartingParty | command | Adds a character to Party -> Starting Members (D-084). Args: <CharacterPath> [Config=<file>] | |
RSE.CharacterActions.MakeEnemy | command | Encounter of a character + spawner or battle zone in the editor's level (D-084). Args: <CharacterPath> [Folder=/Game/X] [Location=X,Y,Z] [Count=N] [Mode=Battle.Mode.ATB] [-NoPlace] [-NoSave] | |
RSE.CharacterActions.MakeRecruitable | command | Recruit dialog + story flag + NPC in the editor's level (D-084). Args: <CharacterPath> [Folder=/Game/X] [Location=X,Y,Z] [Flag=Narrative.Flag.X] [-NoPlace] [-NoSave] | |
RSE.Cinematic.Generate | command | Cinematic from Screenplay in the open level (D-078). Args: Dialog=<path> [Screenplay=<file>] [Anchor=Auto|SelectedActor|CameraFocus|Marker|Location] [Marker=<label>] [Location=x,y,z] [Yaw=deg] [Staging=...] [Player=<path>] [Output=/Game/...] [Name=...] [SceneFolder=...] [Seed=n] [CastBinding=...] [-DryRun] [-Trigger] [-SequenceActor] [-AutoAdvance] [-NoSave] [-NoPlayer] | |
RSE.Commands.Log | int | 0 | Logs commands on the bus: 0 = only refused ones (Commands -> Log Refused Commands), 1 = every command. |
RSE.Coop.Dev.Advance | command | Advances the running dialog as this machine's player (the dialog command; co-op rules apply). | |
RSE.Coop.Dev.CancelTravel | command | Cancels the group travel countdown (host). | |
RSE.Coop.Dev.Choose | command | RSE.Coop.Dev.Choose <OptionId>: picks (or votes for) an option of the running dialog as this machine's player. | |
RSE.Coop.Dev.Leash | command | Measures the leash now (host). | |
RSE.Coop.Dev.Notify | command | RSE.Coop.Dev.Notify [Text]: shows a notice to every player. | |
RSE.Coop.Dev.Prompt | command | Starts a test dialog made at run time: a line, then a choice (Left / Right) decided by [Host|Speaker|Vote] (default Host). | |
RSE.Coop.Dev.Status | command | Logs the co-op rules' state on this machine: the dialog (authority or mirror), the scene, the leash, the travel countdown. | |
RSE.Debug.CameraLog | bool | false | Logs the player's view (location, rotation, view target) every frame, to check camera moves for jitter. |
RSE.Debug.EllipsisProbe | command | Shows ellipsis texts squeezed to 2..40 px (UI robustness check). Args: [clip | off] | |
RSE.Debug.TacticsInput | command | Logs why the Tactics controller may ignore battle input (mode, menus, screens, ATB, presentation). | |
RSE.Dev.Inventory | command | Grid inventory (D-123): open | member N | tab N | cursor X Y | slot N | focus Item | tooltip Item | actions | hold | move Item X Y | equip Item [Slot] | unequip Slot [X Y] | sort | rotate Degrees | zoom Delta | preview | style Classic|Grid|Default | dump. D-143: mode Shared|PerCharacter | bagsize W H | loot Item [Count] | stashpoint -1|0|1 | give Item Member | tostash Item | take Item | distribute [now] | |
RSE.Dev.Mark | command | A thin coloured post in the world (door captures). Args: <X> <Y> <Z> [HeightCm] [R G B] | clear | |
RSE.Dev.Script | command | Runs a playtest script: console commands, 'wait <seconds>', 'waituntil <battle|exploration|results|gameover|dialog|nodialog|scene|noscene>[|<another>] [timeout]', 'shot <name>', 'cleanshot <name>' (no UI). Args: <ScriptFile> [ShotFolder] | |
RSE.Dev.View | command | Views the world from a fixed camera (captures). Args: <X> <Y> <Z> <Pitch> <Yaw> [FOV] [BlendSeconds] | off | |
RSE.Dialog.Abort | command | RSE.Dialog.Abort: ends the running dialog. | |
RSE.Dialog.Advance | command | RSE.Dialog.Advance: the dialog box's Confirm (reveals the line, skips a clip the line waits for, or goes on). | |
RSE.Dialog.AnchorFallbackToPlayer | bool | false | Lines whose speaker has no actor in the world follow the player's pawn (world-anchored dialog layouts such as Bubble). |
RSE.Dialog.Auto | command | RSE.Dialog.Auto [0|1]: prints or sets dialog auto-advance. | |
RSE.Dialog.Choose | command | RSE.Dialog.Choose <OptionId>: picks an option of the choice on screen. | |
RSE.Dialog.Demo | command | RSE.Dialog.Demo [box|cinematic|bark]: a built-in demo dialog (no content needed). | |
RSE.Dialog.Dump | command | RSE.Dialog.Dump <asset>: logs a dialog as a screenplay. | |
RSE.Dialog.Explore | command | RSE.Dialog.Explore <asset>: walks every branch and reports dead ends, missing speakers, unreachable nodes and loops. | |
RSE.Dialog.ExploreMaxPaths | int | 10000 | Routes the dialog explorer counts before it stops counting (the other checks always cover every node). |
RSE.Dialog.History | command | Logs the dialog history of the running game. | |
RSE.Dialog.InstantText | bool | false | Dialog lines appear at once (ignores the text speed). |
RSE.Dialog.LivePortraits | int | 1 | 1 = live 3D dialog portraits may render (Portraits settings); 0 = they show the image (the Steam Deck device profile sets 0). |
RSE.Dialog.LogConditions | bool | false | Logs how dialog Branch nodes chose their output. |
RSE.Dialog.PortraitDemo | command | RSE.Dialog.PortraitDemo <image|video|live|both> [ClipFile]: the party leader speaking with a portrait mode (D-075). | |
RSE.Dialog.Present | command | RSE.Dialog.Present <asset> [NodeId]: starts a dialog with its presentation. | |
RSE.Dialog.Print | command | Alias of RSE.Dialog.Dump. | |
RSE.Dialog.ShowNodeIds | bool | false | Shows the NodeId of the current line in the dialog box. |
RSE.Dialog.SpeedTest | command | RSE.Dialog.SpeedTest: one line with every markup feature at the current text speed. | |
RSE.Dialog.Start | command | RSE.Dialog.Start <asset> [NodeId]: starts a dialog in the running game. | |
RSE.Dialog.TextSpeed | command | RSE.Dialog.TextSpeed [step]: prints or sets the text speed step. | |
RSE.Dialog.VideoPortraits | int | 1 | 1 = video dialog portraits may play (Portraits settings); 0 = they show the image. |
RSE.Difficulty.Log | bool | false | Logs every battle recorded by adaptive difficulty (metrics, score, change) and every intelligence resolved. |
RSE.Difficulty.Override | float | -1 | Fixed enemy intelligence (0-1) for every battle, ignoring adaptive difficulty and encounter bounds. -1 = off. |
RSE.Docs.ExportReference | command | Writes nodes.json, settings.json, cvars.json and assets.json (reflection of the RSE* modules) for the manual build. Optional argument: output folder (default: the plugin's Docs/Manual/Generated). | |
RSE.Economy.Money | command | Shows or sets the party's money: RSE.Economy.Money [Amount] | |
RSE.Economy.OpenShop | command | Opens a shop screen: RSE.Economy.OpenShop <shop asset path> | |
RSE.Economy.Rest | command | Rests like an inn (pays, restores, fades): RSE.Economy.Rest [Cost] | |
RSE.Economy.Shop | command | Drives the open shop: RSE.Economy.Shop up|down|left|right|tab|confirm|back ... | |
RSE.Encounter.Debug | bool | false | Visible enemies (D-063): draws sight cones, hearing circles, chase lines and states. |
RSE.Encounter.ForceElite | int | -1 | Generated groups (D-063): -1 = the pools' elite chance, 0 = never elite, 1 = always elite. |
RSE.Encounter.RateOverride | float | -1 | Random encounter rate multiplier override (D-063): -1 = the game's (effects x traits x option), 0 = no random battles, 5 = many. |
RSE.Encounter.Status | command | Logs random encounters v2 (D-063): the rate multiplier and its effects, world steps, and every visible enemy (group, state, place). | |
RSE.Encounter.TimeModifiers | bool | true | Visible enemies follow the time and weather rules (D-101 / D-104): sight, hearing, chase, attitude. 0 = the profiles as authored. |
RSE.EncounterLayout | command | Drives the active Encounter Layout mode: select enemy|object <Index> | move <X> <Y> | rotate [ccw] | row | delete | paint|erase <X> <Y> [Radius] | tool select|enemy|paint|erase|object | |
RSE.Exploration.Encounter | command | Starts an encounter trigger's battle as if the player walked in. Args: [NameFilter | ATB | Turn | Tactics] | |
RSE.Exploration.Teleport | command | Moves the player's pawn. Args: <X> <Y> [Z] | |
RSE.Exploration.WalkTo | command | Walks the player's pawn through points with movement input (animation, camera, random encounters as when playing); stops at the last point or when a battle starts. Args: <X> <Y> [<X> <Y> ...] [loop] | |
RSE.Explore.AfterBattle | command | Applies Fallen Members -> After Battle now. | |
RSE.Explore.DialogBattle | command | Runs a Start Battle effect From Context. Args: [choice | node | normal] [scene] [EncounterFilter] | |
RSE.Explore.Fall | command | Knocks members out and applies the fallen rules. Args: [Member | all] (default: the last follower) | |
RSE.Explore.Lockpick | command | Drives the open lockpick screen. Args: press | auto (presses in the spot) | miss (presses outside) | giveup | state | |
RSE.Explore.Perceive | command | Runs the passive perception check now. | |
RSE.Explore.Revive | command | Revives a fallen member the best way the party has. Args: [Member] | |
RSE.Explore.Rule | command | Sets an Exploration RPG setting for this session. Args: <Property> <Value> | |
RSE.Explore.Setup | command | Places the exploration RPG test pieces in front of the explorer: a hidden trap, a locked chest, an NPC to rob (its back turned). Args: [all | trap | lock | thief] [Meters=4] [AssetFilter] [FighterFilter (thief) or Radius (trap)] | |
RSE.Explore.Status | command | Logs the members' exploration skills, every trap, lock and robbable NPC, and the enemies investigating a noise. | |
RSE.Explore.Steal | command | The explorer sneaks up behind an NPC and steals. Args: [NPC=DevMark] [Distance=110] [place] | |
RSE.Explore.Throw | command | Distractions. Args: aim [Pitch] | throw [Meters=10] | at X Y | cancel | |
RSE.Foundation.Preview | command | Applies a foundation preset to this session's settings only (nothing is saved): its stats, resources, rules and Game Terms. Args: <Preset> (e.g. DarkFantasy, SciFi) | |
RSE.FreeTactics.Approach | command | The explorer walks toward the test group. Args: <Meters> [sneak] | |
RSE.FreeTactics.Field | command | Free Tactics field test tools (D-108). Args: site [camp m] | barrel|crate|roof <ahead> [side] | surface <Name> <ahead> [side] [radius] | element <Fire|Ice|Lightning|Water> <ahead> [side] [radius] | grant <Ability> | use <Ability> [unit <Id> | nearest | object <Id> | point <ahead> <side>] | shoot | jumpaim | jump <ahead> [side] | hover <ahead> [side] | hoverroof | hovercover | hoverobject <Id> | clear | state | |
RSE.FreeTactics.Input | command | Scripted Free Tactics input. Args: move [nearest | Meters] | hover [nearest | UnitId | ground X Y] | attack [nearest | UnitId] | cast [nearest | UnitId] (D-115: the first spell) | feel (D-115: entry, pace, intent) | select <MenuIndex> | area (the first area ability, at the nearest enemy) | end [moved] | menu | join (the reserve group) | flee [walk] | auto [0 | 1] | state | |
RSE.FreeTactics.Interior | command | Free Tactics inside buildings (D-110). Args: door [Index] | grant <Ability> [party] | fill | summon [hover] [Ability] | moveto <X> <Y> <Z> | camera <zoom N | yaw Deg | focus X Y Z> | state; outside a battle: explorer <X> <Y> <Z> [Yaw] | door | |
RSE.FreeTactics.Place | command | Puts the explorer (and the party) in front of / behind the test group. Args: <Meters> [front | back] [sneak] | |
RSE.FreeTactics.Setup | command | Places a Free Tactics test site in front of the explorer (idempotent): an aggressive Free Tactics group, walls and cover with combat roles, tall grass. Args: [Meters=16] [ambush] [behind] [reserve] [keep] (isolated by default: the map's other groups are turned off; keep leaves them) | |
RSE.FreeTactics.Start | command | Starts the test site's Free Tactics battle. Args: [normal | surprise | ambush] | |
RSE.FreeTactics.Target | command | D-146 targeting test input. Args: aim <ranged|spell|melee|heal|self|overwatch|Name> | next | prev | pick <UnitId> | cursor <X01> <Y01> | preview <Kind|Name|none> | walk | confirm | click | cancel | state | |
RSE.Growth | command | Progression systems (D-144): System Classic|Points|Board|Default | Award Attribute|Ability|Board|All <Amount> | Generate | Layout <Preset> [Regions] | Auto | Page | Member <N> | Select <NodeId|Row|Available> | Request | AskAuto | Menu | MenuClose | MenuNext | Undo | Details | Help | Teacher <ObjectPath> | Ask | Dump | |
RSE.Input.Device | command | RSE.Input.Device [Gamepad|Keyboard|Touch]: sets the last used device (key prompts follow it until the next real input). No argument: prints it. | |
RSE.Input.ForceDevice | int | 0 | Device of the key prompts: 0 = project setting (Input -> Devices -> Prompt Device), 1 = keyboard / mouse, 2 = gamepad, 3 = touch. |
RSE.Input.State | command | Logs who has the input per local player: Slate focus, cursor, exploration / tactics mapping contexts, party menu, the exploration hand-off (D-145). | |
RSE.Input.Touch.Context | command | Prints the touch context and layout of the first local player. | |
RSE.Input.Touch.Debug | int | 0 | Logs touches, recognised gestures and injected actions (D-180). 0 = Touch -> Debug Touches. |
RSE.Input.Touch.Emulate | command | RSE.Input.Touch.Emulate 0|1: the left mouse button acts as a finger (Alt: a second, mirrored finger). | |
RSE.Input.TraceFocus | command | RSE.Input.TraceFocus 0|1|2: logs every Slate focus change (2 also logs the call stack when the focus goes to no widget). | |
RSE.Interactables | command | D-150 interaction library: list | use <label> | reset [label] | |
RSE.Interaction.Debug | bool | false | Logs every focus check of the interaction system (candidates, distance to the body, angle, score, why interaction is blocked) and draws the candidates' bodies. |
RSE.Inventory.ForceStashAccess | int | 0 | D-143: 1 = the stash opens everywhere (captures, tests), whatever Inventory Rules -> Stash Access says (except Never). |
RSE.Inventory.LivePreview | int | 1 | D-126: the inventory paperdoll shows the selected character in 3D (1) or its portrait (0). |
RSE.Inventory.PreviewRate | float | -1 | D-126: captures per second of the inventory preview while it is on screen (0 = only on change; negative = Inventory UI -> Preview Capture Rate). |
RSE.Inventory.PreviewScale | float | 1 | D-126: scale of the inventory preview's render target (Inventory UI -> Preview Resolution). The Steam Deck profile sets 0.75. |
RSE.Items.Give | command | Adds an item to the party inventory. Args: <ItemAssetName> [Count] | |
RSE.Items.List | command | Logs the party inventory. | |
RSE.Items.Reset | command | Resets inventory and equipment to the new-game state. | |
RSE.Language | command | Switches the game language and locale. Args: <culture> (en, ro). No args: prints the current language. | |
RSE.LivingWorld | command | D-157 living world: cast <ability> | tags <tag> [radius] | say <label> [kind] | caravans | hints | |
RSE.Map.Click | command | RSE.Map.Click <x> <y> [left|right] [down|up|both]: a mouse click at window pixels. | |
RSE.Map.ClickWorld | command | RSE.Map.ClickWorld <x> <y> [left|right|move]: clicks (or only moves the mouse to) the open area map where a world point is drawn. | |
RSE.Map.Generate | command | Generates area maps (D-089). No argument: the level open in the editor. 'All': every level of the project and the plugin. Else level package names. Options: -Style=<style asset path> -Resolution=<px>. | |
RSE.Map.Journal | command | RSE.Map.Journal <QuestAssetName>: opens the journal on a quest. | |
RSE.Map.Key | command | RSE.Map.Key <KeyName> [down|up|both]: a key press through Slate. | |
RSE.Map.Legend | command | RSE.Map.Legend focus | leave | next | toggle | |
RSE.Map.List | command | Lists the saved map state: explored share and pins per map. | |
RSE.Map.Markers | command | Counts the markers the maps show now, per category (D-116). | |
RSE.Map.Open | command | Opens the area map of the current level (D-089). | |
RSE.Map.Option | command | RSE.Map.Option <minimap|compass|markers|difficulty> <value|default> | |
RSE.Map.Pin | command | RSE.Map.Pin <x> <y> [type]: adds a pin at a world point. | |
RSE.Map.Pins | command | Lists the current map's pins. | |
RSE.Map.RevealAll | command | Reveals the whole fog of war of the current map. | |
RSE.Map.ShowQuest | command | RSE.Map.ShowQuest <QuestAssetName>: opens the area map on a quest's objective. | |
RSE.Map.Stick | command | RSE.Map.Stick <x> <y>: the left stick through Slate. | |
RSE.Map.View | command | RSE.Map.View zoom <steps> | pan <dx> <dy> | center <u> <v> | world <x> <y> | player | |
RSE.Map.Wheel | command | RSE.Map.Wheel open [u v] | aim <x> <y> | select <i> | confirm | cancel | |
RSE.Mobile.ApplyProfiles | command | RSE.Mobile.ApplyProfiles [DryRun]: adds the RSE mobile device profiles and scalability to the project's Config (sections it already has are left alone). | |
RSE.Mobile.CheckMaterials | command | RSE.Mobile.CheckMaterials [Android | iOS] [/ContentFolder]: compiles every plugin material for the ES3.1 feature level and writes Saved/Perf/Mobile/MobileMaterials_<Platform>.txt. Slow on first use (shader compilation). | |
RSE.Mobile.Preview | command | RSE.Mobile.Preview <Map labels | All> [Android | iOS] [Low | Mid | High] [NoCapture]: switches the editor to the ES3.1 Mobile Preview, plays the example maps from the Mobile Rendering settings and records frame statistics against the tier's budget. RSE.Mobile.Preview Off restores the editor. | |
RSE.Narrative.Dump | command | Logs the narrative state (flags, variables, puzzles, areas, events). | |
RSE.Narrative.Reset | command | Resets the narrative state to a new game's. | |
RSE.Narrative.Set | command | RSE.Narrative.Set <Narrative.* tag> [Value]: sets a flag, variable, puzzle, area or event. | |
RSE.Narrative.Trace | bool | false | Logs every story effect executed and every skipped gate. |
RSE.Net.Dev.Kick | command | RSE.Net.Dev.Kick Slot: the host disconnects a guest. | |
RSE.Net.Dev.ScriptWhen | command | RSE.Net.Dev.ScriptWhen guest|synced|noguest ScriptFile [TimeoutSeconds]. | |
RSE.Net.Dev.SwitchLeader | command | RSE.Net.Dev.SwitchLeader [Step]: the local player's Switch Leader. | |
RSE.Net.Dev.Walk | command | RSE.Net.Dev.Walk X Y Seconds: the local explorer walks (movement input). | |
RSE.Net.ForceProxy | int | 0 | 1 = the default authority policy reports no authority, as on a network client: logic timers (encounters, spawners, roaming enemies, NPC schedules, traps, fog, travel) stop. Debug and tests only. |
RSE.Net.LogTraffic | int | 0 | 1 = log every state section sent or received and every command packet of the co-op layer (D-140). |
RSE.Net.SimulateMultiplayer | int | 0 | 1 = the default authority policy reports a multiplayer session: the co-op time and pause rules apply (no world pause, no world time dilation, no tutorials). Debug and tests only. |
RSE.Net.Stats | command | RSE.Net.Stats [Seconds]: average and peak bandwidth per connection, then the status. | |
RSE.Net.Status | command | Logs the co-op role, players, sections and traffic (D-140). | |
RSE.NPC.Debug | bool | false | Living NPCs (D-104): draws their walks, places and states. |
RSE.NPC.Dump | command | Logs every living NPC of the level: activity, state, place, awake. | |
RSE.NPC.Overrides | command | Logs the living NPCs' story overrides and the registered NPCs' activities now. | |
RSE.NPC.PlayerTo | command | RSE.NPC.PlayerTo <X> <Y> [Yaw]: puts the player's pawn at a point of the level (on the ground), facing Yaw (scripted checks). | |
RSE.NPC.Refresh | command | RSE.NPC.Refresh [snap]: every living NPC looks at its schedule again (snap: appears there). | |
RSE.Online.AutoJoin | command | Searches until a joinable session appears, then joins it. Optional: seconds to keep trying (default 60), the session label to join (default any). | |
RSE.Online.Battle | command | Host: marks a battle as running (1) or over (0) for join-in-progress. | |
RSE.Online.Character | command | Sets the preferred character (<Type:Name> primary asset id). | |
RSE.Online.Find | command | Searches for sessions (RSE.Online.Status lists them). | |
RSE.Online.Host | command | Hosts a session (Online settings). Optional: max players (0 = the settings'), a session label. | |
RSE.Online.Invite | command | Opens the online service's invite overlay. | |
RSE.Online.Join | command | Joins search result <index> (default 0). | |
RSE.Online.Leave | command | Leaves (client) or ends (host) the session. | |
RSE.Online.Lobby | command | Opens the lobby screen for the local player. | |
RSE.Online.Status | command | Logs the session state, the lobby and the last search results. | |
RSE.Options.Open | command | RSE.Options.Open [Game|Audio|Display|Controls|Close]: opens the options screen (on a tab) for the primary local player (captures and scripted checks), or closes it. | |
RSE.Pacts.Bind | command | RSE.Pacts.Bind <MemberAssetName> <PactAssetName>: binds an owned Pact to a party member. | |
RSE.Pacts.Give | command | RSE.Pacts.Give <PactAssetName>: the party obtains a Pact. | |
RSE.Pacts.List | command | Logs owned Pacts, holders, points and learned abilities. | |
RSE.Pacts.Points | command | RSE.Pacts.Points <PactAssetName> <Points>: awards Pact points. | |
RSE.Pacts.Unbind | command | RSE.Pacts.Unbind <MemberAssetName>: takes a member's Pact away. | |
RSE.Paired.Disable | int | 0 | 1 = paired animations and finishers never play (D-172). |
RSE.Paired.ForceFinishers | int | 0 | 1 = every kill with a fitting pair plays its finisher (D-172 testing). |
RSE.Party.Add | command | Adds a character to the party and the classic battle formation. Args: <CharacterAssetName | Path> | |
RSE.Party.Field | command | The visible party. Args: leader [next | prev] | command <Name> | menu | refresh | state | |
RSE.Party.GiveExperience | command | RSE.Party.GiveExperience <MemberAssetName|all> <Amount>: adds experience (levels up as in battle). | |
RSE.Party.KO | command | Knocks out a party member (testing revive). Args: <Name> | |
RSE.Party.Levels | command | Logs every party member's level and experience. | |
RSE.Party.Life | command | The visible party's life (D-129). Args: walk <dx> <dy> [s] | walkto <x> <y> [s] | stop | corridor <length> <width> | idle | spot <sit|lean|interest> <dx> <dy> [yaw] | state | |
RSE.Party.List | command | Logs each party member's HP, MP, KO and lasting statuses. | |
RSE.Party.Restore | command | Full HP/MP, no KO, no statuses. Args: [Name] (default: everyone) | |
RSE.Party.Set | command | The party becomes exactly these characters (the first ones in the classic formation). Args: <Character> [Character...] | |
RSE.Party.SetHP | command | Sets a party member's current HP. Args: <Name> <HP> | |
RSE.Party.SetLevel | command | RSE.Party.SetLevel <MemberAssetName|all> <Level>: sets a member's level. | |
RSE.Perf.Benchmark | command | RSE.Perf.Benchmark [Deck] [Quit] | Stop: runs the scripted benchmark (Project Settings -> RPG Saga Engine -> Performance) and writes Saved/Perf/<timestamp>/. Deck = Steam Deck preview first; Quit = quit when done (also when -unattended). | |
RSE.Perf.Budget | command | RSE.Perf.Budget [Low | Mid | High | Default] [NoMemory]: checks the next capture reports against a mobile tier's budget (Mobile Rendering settings); Default = the Steam Deck budget. | |
RSE.Perf.Capture | command | RSE.Perf.Capture <Seconds> <Label...> [Orbit=<Degrees>]: records a benchmark segment now (frame, game, render, GPU times, draw calls, triangles, memory). RSE.Perf.Capture Report [Name]: writes the captured segments to Saved/Perf/<timestamp>[Deck]<Name>/. | |
RSE.Perf.CompanionRadial | command | RSE.Perf.CompanionRadial Open | Pick <Index> | Highlight <Index> | Back | Close: drives the companion command radial without input (D-148). | |
RSE.Perf.FaceYaw | command | RSE.Perf.FaceYaw <Degrees>: turns the player's pawn to a world yaw (D-148: the rotating minimap). | |
RSE.Perf.PartyMenu | command | RSE.Perf.PartyMenu Open | Start | Key <Page> | Close | Next | Prev | Page <Name> | FormationPage <Auto|Formation|Party|Hidden> | Confirm | Back | Up | Down | Left | Right: opens, closes, pages or drives the party menu without input. | |
RSE.Perf.Profile | command | RSE.Perf.Profile [Deck | Default | <Name>]: logs the active device profile, or switches it (the player's quality levels are kept). | |
RSE.Platform.Dump | command | Logs the platform users, their input devices and the app lifecycle state. | |
RSE.Platform.SimulateDisconnect | command | RSE.Platform.SimulateDisconnect [device]: the primary user's input device (default 0) disconnects (pause + reconnect screen). | |
RSE.Platform.SimulateReconnect | command | RSE.Platform.SimulateReconnect [device]: the primary user's input device (default 0) connects again. | |
RSE.Platform.SimulateResume | command | RSE.Platform.SimulateResume: the app comes back from suspend. | |
RSE.Platform.SimulateSignIn | command | RSE.Platform.SimulateSignIn: the primary user signs in again. | |
RSE.Platform.SimulateSignOut | command | RSE.Platform.SimulateSignOut: the primary user signs out (saving stops; the game returns to the title screen). | |
RSE.Platform.SimulateSuspend | command | RSE.Platform.SimulateSuspend: the app is suspended (pause, save writes flushed). | |
RSE.Players | command | Logs the players (slots, host, local / remote, pawns) and the authority state (D-134). | |
RSE.PortraitStudio.Generate | command | Portrait & Icon Studio in the editor (D-075). Args: [Paths=/Game/X+/Y] [Assets=<path>+<path>] [Output=/Game/Generated] [Png=<folder>] [-NoPortraits] [-NoIcons] [-Force] [-DryRun] | |
RSE.Puzzle.GoTo | command | Moves the player in front of a level object: RSE.Puzzle.GoTo <ActorLabel> [Distance] | |
RSE.Puzzle.Interact | command | Interacts with a level object as the player: RSE.Puzzle.Interact <ActorLabel> | |
RSE.Puzzle.Lock | command | Drives the open code lock: RSE.Puzzle.Lock Turn <Delta> | Select <Delta> | Submit | Leave | |
RSE.QuestImages.Capture | command | Captures the journal pictures of the quests in the open level (D-155). Args: [-DryRun] [-Force] [Png=<folder>] | |
RSE.Quests.Abandon | command | RSE.Quests.Abandon <QuestAssetName>: abandons an active side quest that allows it. | |
RSE.Quests.Complete | command | RSE.Quests.Complete <QuestAssetName> [Outcome]: finishes an active quest. | |
RSE.Quests.Dump | command | Logs every quest's progress, the tracked quest and the ending lock. | |
RSE.Quests.Ending | command | Logs the ending the story leads to, the hidden score and the point of no return. | |
RSE.Quests.Fail | command | RSE.Quests.Fail <QuestAssetName> [Outcome]: fails an active quest. | |
RSE.Quests.List | command | Logs known quests with category, status, stage and the tracked one. | |
RSE.Quests.Start | command | RSE.Quests.Start <QuestAssetName>: starts a quest, ignoring availability. | |
RSE.Quests.Toast | command | RSE.Quests.Toast [Text]: shows a test notification on the quest HUD. | |
RSE.Quests.Trace | bool | false | Logs quest starts, objectives, stage changes, outcomes and ending changes. |
RSE.Quests.Track | command | RSE.Quests.Track <QuestAssetName | none>: sets the quest on the HUD tracker. | |
RSE.Reinforcements.HurtLeader | command | Sets the enemy leader's HP to a percent (tries a scripted event's HP trigger). Args: <Percent=40> | |
RSE.Reinforcements.Interrupt | command | Stops the call in progress. Args: [kill | silence] | |
RSE.Reinforcements.Look | command | The battle camera looks at the first reinforcement runner. | |
RSE.Reinforcements.Setup | command | The Free Tactics test site with a lone sentry that calls 3 friends (D-117). Args: [CallTurns=1] [leftover] [script] [points] | |
RSE.Reinforcements.Status | command | Logs the running battle's reinforcement calls and runners (on screen, seen by the party). | |
RSE.Rooms.Go | command | Opens a test room's map. Args: <RoomId> (RSE.Rooms.List shows the ids) | |
RSE.Rooms.Interior | command | The Interiors room's kit switcher. Args: kit <Name> [EntranceLabel] (no args: list the kits) | |
RSE.Rooms.Launch | command | Starts an encounter through the battle launcher. Args: <EncounterAssetName> [Tactics|FreeTactics|ATB|Turn|Action] [Seed] [auto] | |
RSE.Rooms.Launcher | command | Shows or hides the battle launcher panel (the F10 key does the same; RSE.Rooms.LauncherKey changes the key). Args: [0|1] | |
RSE.Rooms.LauncherKey | string | F10 | Key that shows or hides the battle launcher panel in test rooms (a key name such as F10; None = no hotkey). |
RSE.Rooms.List | command | Lists the test rooms (DA_Room_* data assets) and their maps. | |
RSE.Rooms.Restart | command | Restarts the launcher's battle from its start. Args: [new] (a new seed; default: the same seed) | |
RSE.Rooms.Use | command | The host's pawn interacts with the first actor (by label) that has an RSE Interactable component. Args: <ActorLabel> | |
RSE.Rules.Dump | command | Logs the game's active rules profile and its overridden sections (with parents). | |
RSE.Rules.SetProfile | command | RSE.Rules.SetProfile <RulesProfileAssetName | None>: switches the game's rules profile (running battles keep theirs). | |
RSE.Save.Load | command | RSE.Save.Load [slot index | auto | slot name]: loads a save and opens its map (no argument: the most recent). | |
RSE.Save.SimulateFault | string | Makes save backend operations fail (D-170), to test the error screens without the hardware: NoSpace or Failed (writes), Corrupt (reads), SignedOut (both). Empty = off. | |
RSE.Save.Slots | command | Lists the save slots (autosave first), marks the Continue slot and says whether the save item is allowed now. | |
RSE.Save.To | command | RSE.Save.To <slot index | slot name>: saves the current game (as from a save point). | |
RSE.Save.UseItem | command | RSE.Save.UseItem [item path] [give]: uses the save item like the party menu would (opens the save screen). | |
RSE.Scene.Dump | command | Logs the playing scene and the waiting ones. | |
RSE.Scene.Play | command | Plays a scene data asset: RSE.Scene.Play /Game/MyRPG/Data/Scenes/DA_X [replay]. Replays run no end effects. | |
RSE.Scene.RequestSkip | command | Asks to skip the playing scene as this machine's player (the Skip Scene command: co-op rules apply, D-142). | |
RSE.Scene.Skip | command | Skips the playing scene now (no confirmation, even if it is not skippable). | |
RSE.Seed.World | int | 0 | World seed of every new game while not 0 (overrides Seeds -> Fixed World Seed): reproducible runs. |
RSE.Sim.Run | command | RSE.Sim.Run <scenario.json> [Runs]: simulates the scenario headless (AI on both sides) and writes results.csv, summary.json and summary.html to Saved/BattleSim. | |
RSE.Sky.Dump | command | Logs what the Time of Day actor shows now (hour, sun, moon, light, fog, weather look, quality). | |
RSE.Sky.Measure | command | RSE.Sky.Measure <seconds> [label]: records frame and GPU times for a while, then logs the average, the 1% low and the GPU time. | |
RSE.Sky.Snap | command | Applies the sky and the weather at once (the ground wetness and snow jump to their targets). | |
RSE.Sneak | command | Sneaking on / off for the explorer. Args: [0 | 1] | |
RSE.StateKeys.Check | command | D-174: logs the objects of the open level (loaded actors) with a missing or duplicate State Key. | |
RSE.StateKeys.Fix | command | D-174: gives every object of the open level that keeps saved state a unique State Key (unloaded World Partition actors too). | |
RSE.StateTree.CreateExample | command | Creates (or rebuilds) the example StateTree of the RPG Saga Engine StateTree bridge (/RPGSagaEngine/Examples/AI/ST_RSE_ExampleEnemy). | |
RSE.Stealth.Behind | command | D-151: the explorer sneaks right behind a site group's leader. Args: <sentry | camp | near | far> [Meters = 1.5] | |
RSE.Stealth.Hour | command | D-151: sets the game clock's hour (night and day for the light rule). Args: <Hour> | |
RSE.Stealth.Member | command | D-151: moves a party member (field order) to (Forward, Side) meters of the site. Args: <Index> <Forward> <Side> | |
RSE.Stealth.Noise | command | D-151: how far the party's non-silent actions are heard in an ambush battle, this session (0 = as with silent weapons). Args: <Meters> | |
RSE.Stealth.Overlay | command | D-151: the detection shapes on the ground. Args: on | off | auto (the setting) | |
RSE.Stealth.Place | command | D-151: Place, as the key: sneaking = hold this spot and take the next member; else regroup. | |
RSE.Stealth.Put | command | D-151: the explorer at (Forward, Side) meters of the site. Args: <Forward> <Side> [Yaw] [sneak] | |
RSE.Stealth.Setup | command | D-151: an ambush site ahead of the explorer: a lone sentry, a camp with cover and tall grass, a group within the camp's alarm and one beyond. Args: [Meters to the camp = 24] | |
RSE.Stealth.State | command | D-151: logs the overlay, the ambush tracker, the placed members and every group's awareness and takedown preview. | |
RSE.Stealth.Strike | command | D-151: Strike, as the key: a takedown in reach, else the ambush on the unaware group in range. | |
RSE.Studio.AbilityCapture | command | Saves pictures of the ability preview and Test ability (D-167). Args: <Directory> [Asset=/Path/DA_Ability_X] [Mode=Tactics|FreeTactics|ATB|Turn] [Preset=Id] [Prefix=Name] [Width=1920] [Height=1080] [Delay=0.3]. Needs a renderer and an on-screen editor. | |
RSE.Studio.ExportTemplateManifest | command | Writes the Studio's template manifest (D-090): the shipped state of every plugin data asset, used by Validate All Data to warn about plugin assets changed locally. Run after a deliberate change of the plugin's content. | |
RSE.Studio.PairCapture | command | Saves frames of a paired animation in the ability preview (D-172). Args: <Directory> Asset=/Path/DA_Pair_X [Prefix=Name] [Width=1920] [Height=1080] [WindUp=s] [After=s]. Needs a renderer. | |
RSE.Studio.Screenshot | command | Renders a Studio page offscreen to a PNG (D-090, D-098). Args: <Hub|NewCharacter|Sheet|AssetSheet|Page|PropagationDemo> <File.png> [Step=N] [Character=/Path/DA_Char_X] [Asset=/Path] [Id=PageId] [Tab=N] [Width=1600] [Height=1000]. Needs a renderer (-RenderOffscreen, not -nullrhi). | |
RSE.Tactics.BakeZones | command | Re-bakes the grid of every tactics zone in the world. | |
RSE.Tactics.Demo | command | Drives the active player unit through the director (presentation checks). Args: approach [Ability] | use [Ability] | wait | |
RSE.Tactics.Deploy | command | Fills the deployment of the Tactics battle being deployed (like Auto); 'start' also starts the battle. Args: [start] | |
RSE.Tactics.MoveUnit | command | Moves a unit to a tile if reachable. Args: <X> <Y> [UnitName] | |
RSE.Tactics.Preview | command | Ability target preview (D-064). Args: style Classic|Modern|Default | highlight <Ability> | aim <Ability> <X> <Y> | |
RSE.Tactics.ShowReach | command | Highlights the tiles a unit can reach. Args: [UnitName] | |
RSE.Time.Advance | command | RSE.Time.Advance <hours>: moves the clock forward. | |
RSE.Time.Dump | command | Logs the clock and the weather. | |
RSE.Time.HUD | command | RSE.Time.HUD 0|1: hides / shows the HUD clock. | |
RSE.Time.Scale | command | RSE.Time.Scale <x>: clock speed (1 = normal, 60 = a game day per real minute). | |
RSE.Time.Set | command | RSE.Time.Set <hour> [day] [same]: moves the clock to the hour (next occurrence; 'same' = that hour today) and optionally sets the day. | |
RSE.Time.Stop | command | RSE.Time.Stop [0|1]: stops (1, default) or starts (0) the clock. | |
RSE.Time.Trace | bool | false | Logs every hour, phase and day change, time skip and weather change. |
RSE.Toolkit.Demo | command | Ability Toolkit v2 in a Tactics battle (D-055). Args: give <Ability> [UnitId] | useat <Ability> <X> <Y> | place <UnitId> <X> <Y> | object <Object> <X> <Y> | zone <Zone> <X> <Y> [Radius] | |
RSE.Travel.Discover | command | RSE.Travel.Discover <destination name | all> [0]: discovers (or forgets) world map places. | |
RSE.Travel.Dump | command | Lists the areas and destinations, the current area and whether the world map can be used. | |
RSE.Travel.Map | command | Opens the world map screen (if the rules allow it now). | |
RSE.Travel.To | command | RSE.Travel.To <destination name | /Game/map/path> [arrival point]: travels there (fade, arrival, banner), ignoring discovery. | |
RSE.Traversal | command | Traversal dev commands (D-121). Args: state | goto <Link> [start|end] | use [Link] | place <X> <Y> <Z> | move <X> <Y> [Seconds] | battle | |
RSE.Tutorial.Close | command | Closes the open tutorial card (as its Close button does). | |
RSE.Tutorial.List | command | Lists every tutorial, its trigger and whether it was seen. | |
RSE.Tutorial.ResetSeen | command | Forgets which tutorials were seen (they show again). | |
RSE.Tutorial.Show | command | RSE.Tutorial.Show <asset name>: shows a tutorial now, seen or not, even with tutorials off. | |
RSE.Tutorial.Trigger | command | RSE.Tutorial.Trigger <Tutorial.Trigger.X>: reports a tutorial trigger as if the game event happened. | |
RSE.UI.Input | command | Menu input without keys for the top screen (main menu, options, save slots...). Args: confirm | back | up | down | left | right | next | prev | |
RSE.UI.Layout | command | RSE.UI.Layout <Dialog|PartyMenu|ATBHUD|GridHUD|LiveHUD> <Variant|ClassPath|Off>: forces a screen layout over the UI style's (P61); RSE.UI.Layout Off clears every override. Open screens rebuild. | |
RSE.UI.Phone.DPI | float | 0 | DPI of the simulated phone (0 = Phone UI -> Simulated DPI). |
RSE.UI.Phone.Info | command | Prints the phone UI state: phone mode, DPI, scale, safe area, minimum touch target. | |
RSE.UI.Phone.Resolution | string | Screen size used without a game viewport, e.g. 2400x1080 (empty = Phone UI -> Simulated Resolution). | |
RSE.UI.Phone.SafeArea | string | Safe-area insets of the simulated phone in pixels: "Left Top Right Bottom" (empty = Phone UI -> Simulated Safe Insets). | |
RSE.UI.Phone.Simulate | int | 0 | Phone UI simulation on PC (D-180): 0 = Project Settings -> Phone UI -> Simulate Phone, 1 = simulate a phone, 2 = off. |
RSE.UI.ProceduralFrames | bool | true | UI frames that need it use the procedural frame material (M_RSE_UIFrame). 0 = every frame is a flat rounded box. Applies at the next style resolve (RSE.UI.Style.Refresh). |
RSE.UI.Screens | command | Logs the open modal screens (what hides the exploration / battle HUD) and whether the input guard is active. | |
RSE.UI.Style.Accessibility | command | RSE.UI.Style.Accessibility <Off|Protanopia|Deuteranopia|Tritanopia> [HighContrast 0/1] [TextScale 0.8-1.5] [ReduceMotion 0/1]: the accessibility options of every local player (not saved). | |
RSE.UI.Style.Frame | command | RSE.UI.Style.Frame <CornerShape> [Pattern] [Ornament] [GlowWidth]: every frame of a live copy of the active style gets these (e.g. Chamfer HexGrid Bracket 6). | |
RSE.UI.Style.HueShift | command | RSE.UI.Style.HueShift <Degrees>: hue shift of a live copy of the active style. | |
RSE.UI.Style.Refresh | command | Resolves every UI style again (after changing RSE.UI.ProceduralFrames, the frame material or a style asset). | |
RSE.UI.Style.Seed | command | RSE.UI.Style.Seed <Token> <R> <G> <B>: sets a seed color (linear 0..1) of a live copy of the active style. | |
RSE.UI.Style.Set | command | RSE.UI.Style.Set <StyleId>: every local player switches to that UI style (empty = the project's default). | |
RSE.UI.TextEllipsis | bool | false | Themed texts end with an ellipsis when they overflow (UE 5.8 can assert on it, see RSEHUDWidgetBase.cpp). Applies to widgets built afterwards. |
RSE.UIStyle.CaptureEditor | command | Renders the Style Editor of a style to a PNG (1920x1080): <StyleId|Path> <File.png> [Hue] [Saturation] [Lightness]. The shift is put back after the capture. | |
RSE.UIStyle.CaptureWindow | command | Screenshot of the real Style Editor window (1920x1080): <StyleId|Path> <File.png> [Hue] [Saturation] [Lightness]; 'quit' closes the editor when the queue is done. | |
RSE.UIStyle.Preview | command | Plays the Style Editor's preview map with a style and its UI gallery: <StyleId|Path> [capture]. | |
RSE.Visual.DeckPreview | command | RSE.Visual.DeckPreview [0|1]: Steam Deck device profile + scalability Low + 1280x800 window, to judge the Deck target on a PC. 0 restores the profile and the user settings. | |
RSE.Visual.Dump | command | RSE.Visual.Dump: logs the active visual style, where it comes from and the preset list. | |
RSE.Visual.Style | command | RSE.Visual.Style <Name | Next | Prev | Default>: sets the visual style preset (D-037). No argument = Next. | |
RSE.Visual.Test.Value | int | 1 | Test-only variable of the RSE.Visual automation tests (a visual style sets and restores it). |
RSE.Weapons.Hold | int | -1 | D-185: weapon parts attach through the hold (hand socket per hold type, weapon grip, fine offset). -1 = Weapon Hold settings, 0 = raw part transform, 1 = on. |
RSE.Weapons.Hold.FineOffsets | bool | true | D-185: look parts' fine offsets apply in the hold frame (0 = the pure hold, to compare). |
RSE.Weapons.Hold.SkeletonSockets | int | -1 | D-185 addendum: a skeleton socket of the weapon's hold type (or the weapon's own) holds the weapon by its pivot. -1 = Weapon Hold settings, 0 = off (profile / generated holds), 1 = on. |
RSE.Weapons.Presentation | bool | true | D-184: attacks show their weapon presentation (animations, muzzle flashes, tracers, trails, impacts). 0 = the plain default timelines. |
RSE.Weapons.Recoil | int | -1 | D-185 addendum 2: guns without a fire clip kick with the procedural recoil. -1 = Weapon Hold settings, 0 = off, 1 = on. |
RSE.Weapons.SupportHandIK | int | -1 | D-185: the support (left) hand reaches two-handed weapons with IK. -1 = Weapon Hold settings, 0 = off, 1 = on. |
RSE.Weapons.SupportHandRotation | int | -1 | D-185 addendum 2: the support hand turns to the weapon's LeftHand socket rotation. -1 = Weapon Hold settings, 0 = off (position only), 1 = on. |
RSE.Weather.Lock | command | RSE.Weather.Lock [0|1]: locks (1, default) or unlocks (0) the current weather. | |
RSE.Weather.Roll | command | RSE.Weather.Roll [instant]: rolls the next weather from the table now. | |
RSE.Weather.Set | command | RSE.Weather.Set <Rain | Weather.Rain.Storm | DA_Weather_Fog> [seconds] [lock]: changes the weather (seconds: transition, 0 = at once). | |
RSE.Weather.Strike | command | Strikes lightning now (flash, then thunder). |
Appendix D. Data asset types
Generated from the plugin's data asset classes (UDataAsset and UPrimaryDataAsset subclasses). 127 types. Only properties you can edit on the asset are listed; inherited ones are listed under the parent class.
URSEAIProfile
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Behaviour profile of the utility AI (D-020, D-056).
| Property | Type | Category | Description |
|---|---|---|---|
Last Stand (LastStand) | FRSEAILastStand | Boss | |
Phases (Phases) | TArray<FRSEAIPhase> | Boss | Boss phases, entered in order. Read from the profile the unit started the battle with. |
Charge Interrupt (ChargeInterrupt) | FRSEAIScalar | Intelligence | ATB / CTB: share of the value of hitting a unit charging a big move. |
Danger Awareness (DangerAwareness) | FRSEAIScalar | Intelligence | Awareness of the danger of a position (0: AI settings' minimum awareness, 1: full). |
Decision Quality (DecisionQuality) | FRSEAIScalar | Intelligence | Picks the best option (1) or a softmax among the top options (0: plausible mistakes). Scales the AI temperature. |
Focus Fire (FocusFire) | FRSEAIScalar | Intelligence | Share of the AI settings' focus-fire value (finishing hurt targets). |
Gates (Gates) | FRSEAIBehaviourGates | Intelligence | Behaviours switched on only from an intelligence. |
Pact Awareness (PactAwareness) | FRSEAIScalar | Intelligence | Share of the Pact multipliers (hitting a unit about to summon, and summons). |
Resource Management (ResourceManagement) | FRSEAIScalar | Intelligence | Share of the "last item" penalty (keeping the team's last consumable). |
VIPFocus (VIPFocus) | FRSEAIScalar | Intelligence | Share of the AI settings' VIP damage multiplier (going for the enemy leader). |
Weakness Knowledge (WeaknessKnowledge) | FRSEAIScalar | Intelligence | Accounts for elemental weaknesses and immunities (0: judges every hit as neutral). |
Damage Weight (DamageWeight) | FRSEAIScalar | Offense | Value per point of expected damage dealt to enemies. |
Flank Weight (FlankWeight) | FRSEAIScalar | Offense | Bonus per extra positional damage multiplier (side, back, height). 10 = +10 value for a x2 hit. |
Fragile Target Weight (FragileTargetWeight) | FRSEAIScalar | Offense | Preference for fragile targets: scales damage value by the target's missing HP. |
Friendly Fire Weight (FriendlyFireWeight) | FRSEAIScalar | Offense | Penalty multiplier for damage dealt to allies. |
Isolated Target Weight (IsolatedTargetWeight) | FRSEAIScalar | Offense | Preference for targets with no allies near them (Tactics). |
Kill Bonus (KillBonus) | FRSEAIScalar | Offense | Bonus for an action that is expected to defeat a unit, scaled by the chance to do so. |
Status Weight (StatusWeight) | FRSEAIScalar | Offense | Value per applied status (times its chance). |
Approach Weight (ApproachWeight) | FRSEAIScalar | Positioning | Value for closing distance to the nearest enemy. |
Danger Weight (DangerWeight) | FRSEAIScalar | Positioning | Penalty per point of expected enemy damage that can reach the unit's end position next turn. |
Preferred Distance Weight (PreferredDistanceWeight) | FRSEAIScalar | Positioning | |
Preferred Enemy Distance (PreferredEnemyDistance) | FRSEAIScalar | Positioning | Preferred distance (tiles, rounded) from the nearest enemy. 0 = no preference. |
Protect Radius (ProtectRadius) | FRSEAIScalar | Positioning | Tiles (rounded, at least 1). |
Protect Weight (ProtectWeight) | FRSEAIScalar | Positioning | Value for staying within ProtectRadius of the team's VIP (leader / unit to protect). |
Retreat HPPercent (RetreatHPPercent) | FRSEAIScalar | Positioning | Below this HP percentage the unit prioritises getting away from enemies. 0 = never. |
Retreat Weight (RetreatWeight) | FRSEAIScalar | Positioning | |
Resource Cost Weight (ResourceCostWeight) | FRSEAIScalar | Resources | Penalty per point of resource (MP...) spent. |
Decision Policy (DecisionPolicy) | TObjectPtr<URSEAIDecisionPolicy> | Rules | D-168: a Blueprint (or C++) hook with the last word on each decision of a unit with this profile: override the target of the chosen ability and the final choice among the scored options. Empty = the utility decides. |
Rules (Rules) | TArray<FRSEAIRule> | Rules | Ordered rules (gambits). The first Force rule that finds a usable action decides; Bonus and Forbid add up. |
Scorers (Scorers) | TArray<TObjectPtr<URSEAIScorer> > | Rules | Custom considerations added to every ability option (C++ or Blueprint subclasses of URSEAIScorer). |
Boss Style (bBossStyle) | bool | Style | A boss style (listed under Boss in the wizards). |
Style Base (StyleBase) | TObjectPtr<URSEAIProfile> | Style | The style this profile was made from with the AI Style wizard (empty for hand-made profiles). |
Style Description (StyleDescription) | FText | Style | One line for the enemy wizard and the style lists ("Keeps its distance and shoots; runs from melee"). |
Style Sliders (StyleSliders) | FRSEAIStyleSliders | Style | The wizard's sliders this profile was made with (0.5 = as the base style). |
Heal Weight (HealWeight) | FRSEAIScalar | Support | Value per point of effective healing, scaled up the more hurt the ally is. |
Combo Payoff Bonus (ComboPayoffBonus) | FRSEAIScalar | Team | Bonus for using a combo's payoff element on a target with its setup status. |
Combo Setup Bonus (ComboSetupBonus) | FRSEAIScalar | Team | Bonus for applying a combo's setup status when a teammate can deliver its payoff (AI settings: Combos). |
Focus Target Bonus (FocusTargetBonus) | FRSEAIScalar | Team | Bonus for damaging the team's shared focus target (the first enemy the team committed to). |
Protect Support Weight (ProtectSupportWeight) | FRSEAIScalar | Team | Tactics: value per tile of staying close to allied Support-role units (bodyguard). |
Punish Threat Bonus (PunishThreatBonus) | FRSEAIScalar | Team | Bonus for hitting enemies that recently hurt an allied Support-role unit (per 10% of the Support's max HP). |
Role (Role) | ERSEAITeamRole | Team | The unit's role in its team; coordination bonuses of allies read it. |
Controller Area Bonus (ControllerAreaBonus) | FRSEAIScalar | Team Role | Controller: bonus per enemy hit beyond the first (areas). |
Controller Caster Bonus (ControllerCasterBonus) | FRSEAIScalar | Team Role | Controller: extra bonus when the disabled enemy is a caster or a healer. |
Controller Damage Scale (ControllerDamageScale) | FRSEAIScalar | Team Role | Controller: multiplies the value of raw damage (below 1: control first). |
Controller Disable Bonus (ControllerDisableBonus) | FRSEAIScalar | Team Role | Controller: bonus per expected disable or debuff on an enemy (debuff statuses, turn delays, Action Point losses). |
Damage High Value Bonus (DamageHighValueBonus) | FRSEAIScalar | Team Role | Damage: bonus for hitting high-value targets: times the target's threat (0-1 among its team), plus casters and healers. |
Damage Kill Focus (DamageKillFocus) | FRSEAIScalar | Team Role | Damage: extra share of the kill value (0.5 = a likely kill is worth 50% more). |
Support Buff Bonus (SupportBuffBonus) | FRSEAIScalar | Team Role | Support: bonus per buff on an ally that enemies can reach (on top of healing). |
Tank Guard Bonus (TankGuardBonus) | FRSEAIScalar | Team Role | Tank: bonus for guarding: a shield or a buff on an ally that enemies can reach, or a defensive buff on itself when engaged. |
Tank Interpose Weight (TankInterposeWeight) | FRSEAIScalar | Team Role | Tank, Tactics and Free Tactics: value for standing between an enemy and a fragile ally (Support, Controller, the VIP, a hurt ally): on the enemy's way, inside the Protect Radius of the ally. Body-blocks corridors (units block the grid). |
Tank Taunt Bonus (TankTauntBonus) | FRSEAIScalar | Team Role | Tank: bonus per expected taunt on an enemy (taunt abilities pull the attacks onto the tank). |
URSEAbilityData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. An ability: shared data (type, element, costs, effects) plus separate rules per battle mode (CLAUDE.md 2.3).
| Property | Type | Category | Description |
|---|---|---|---|
Ability Type (AbilityType) | FGameplayTag | Ability | Battle menu group (D-065): Attack = the basic weapon attack, Skill = class techniques, Magic = spells, Action = utility (guard, steal, summon); empty = Skills. The class's command menu layout (or Project Settings -> Command Menu) maps the types to commands. |
Costs (Costs) | TArray<FRSEResourceCost> | Ability | |
Description (Description) | FText | Ability | What the ability does, in a sentence: the battle menus show it for the highlighted command (D-065). Empty = only the facts (target, cost, element). |
Effects (Effects) | TArray<TObjectPtr<URSEAbilityEffect> > | Ability | Applied in order to every affected unit. |
Element (Element) | FGameplayTag | Ability | Element of the ability's damage. Empty = non-elemental. |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Ability | Icon in menus and battle lists (D-075). Empty = no icon (or the generated art library's); the Portrait & Icon Studio makes one from its element and type. |
Item Costs (ItemCosts) | TArray<FRSEItemCost> | Ability | Items consumed per use from the user's team items (ammunition: arrows, bombs). Without them the ability is disabled (D-082). |
Role Tags (RoleTags) | FGameplayTagContainer | Ability | D-147: what the ability is for, as the battle menus tell it ("Single-target damage", "Control", "Good vs flyers"): Ability.Role.* tags, labels in Project Settings -> Ability Info. Empty = derived from the effects (the role rules). |
Target Filter (TargetFilter) | ERSETargetFilter | Ability | |
Target State (TargetState) | ERSETargetState | Ability | Revive abilities target fallen units; everything else targets standing ones. |
Passive (bPassive) | bool | Passive | A passive: never offered as an action; only its reactions and modifiers work while the unit has it (class, equipment, Pact). |
Passive Modifiers (PassiveModifiers) | TArray<TObjectPtr<URSEPassiveModifier> > | Passive | Conditional stat bonuses (e.g. +20% Attack while HP is below 30%) of a unit that has this ability. |
Reactions (Reactions) | TArray<TObjectPtr<URSEAbilityReaction> > | Passive | Automatic responses (counterattack, overwatch, on-hit, on-death...) of a unit that has this ability. |
Action Command (ActionCommand) | FRSEActionCommandRules | Presentation | Optional timed press that grades the use (D-034). |
Presentation (Presentation) | FRSEAbilityPresentationRules | Presentation | How the ability is shown in battle (D-034): approach, moment and an optional timeline of cues. |
Action Rules (ActionRules) | FRSEAbilityActionRules | Rules | Action battles (D-171): timing (windup, active time, recovery), delivery (melee hitbox, projectile, hitscan, area, direct), cooldown, stamina and gauge costs, poise damage, cancel window. Without Override they are derived from the other rules (Project Settings -> Action Battle -> Derived Ability Rules). |
ATBRules (ATBRules) | FRSEAbilityATBRules | Rules | |
Field Rules (FieldRules) | FRSEAbilityFieldRules | Rules | |
Free Tactics Rules (FreeTacticsRules) | FRSEAbilityFreeTacticsRules | Rules | Free Tactics (D-091): ranges and areas in meters. Without Override they are derived from the Tactics rules. |
Tactics Rules (TacticsRules) | FRSEAbilityTacticsRules | Rules | |
Use Conditions (UseConditions) | TArray<TObjectPtr<URSEAICondition> > | Use Conditions | When the ability may be used in battle (D-082): every condition must hold for the user, in every battle mode, for the player's menus (disabled with a reason), the AI and the simulator. Battle conditions (Health, Resource, Has Status, Has Tag, Equipped, Row, Position, Identity, Battle Mode, Unit Count, Turn Number...) and story conditions (Story: flags, items, party members). Conditions about "the target" do not apply here (there is none yet). |
Use Conditions Text (UseConditionsText) | FText | Use Conditions | Why the ability is disabled when a use condition fails ("Only below 30% HP"). Empty = the failing condition's own text. |
Exclude from Use Growth (bExcludeFromUseGrowth) | bool | Use Growth | Never ranks up with use (summons, items' abilities, story actions). |
Use Growth (UseGrowth) | TObjectPtr<URSEUseGrowthCurve> | Use Growth | How this ability ranks up with battle uses, when use growth is on. Empty = Progression Systems -> Default Use Growth. |
URSEAbilityFamily
Module RSECore, parent URSEArchetype, primary asset. Ability family: "elemental attack", "healing", "status attack" (content: an Ability).
URSEAbilityPresentationBase
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. Base of battle presentation assets (defined in RSE).
URSEAbilityTierFamily
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A family of abilities in tiers (D-147): the base spell, a stronger one, the ultimate.
| Property | Type | Category | Description |
|---|---|---|---|
Description (Description) | FText | Family | |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Family | Empty = the icon of the highest tier the unit knows. |
Tiers (Tiers) | TArray<FRSEAbilityTierDef> | Family | From the base tier up. |
URSEActionComboData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A chain of attacks on one input (light or heavy), with timing windows (D-171).
| Property | Type | Category | Description |
|---|---|---|---|
Loop (bLoop) | bool | Combo | After the last step the chain starts again from the first (else the last step's input restarts it after its window). |
Steps (Steps) | TArray<FRSEActionComboStep> | Combo |
URSEActionWeaponData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. What a weapon does in action battles (D-171): its light and heavy combo chains and/or its fire modes.
| Property | Type | Category | Description |
|---|---|---|---|
Base Ability (BaseAbility) | TObjectPtr<URSEAbilityData> | Weapon | The ability combo steps and shots resolve with when they name none (empty = the unit's basic attack). |
Can Block (bCanBlock) | bool | Weapon|Guard | The wielder may block (when the rules allow guarding). |
Can Parry (bCanParry) | bool | Weapon|Guard | The wielder may parry (when the rules allow parrying). |
Block Damage Multiplier (BlockDamageMultiplier) | float | Weapon|Guard | Damage taken through this weapon's block (negative = the rules' Block Damage Multiplier). |
Heavy Combo (HeavyCombo) | TObjectPtr<URSEActionComboData> | Weapon|Melee | |
Light Combo (LightCombo) | TObjectPtr<URSEActionComboData> | Weapon|Melee | |
Melee Hitbox (MeleeHitbox) | FRSEActionHitbox | Weapon|Melee | The hitbox of combo steps without their own. |
Weapon Presentation (WeaponPresentation) | TSoftObjectPtr<URSEWeaponPresentationBase> | Weapon|Presentation | D-184: how the weapon looks when it swings or fires in action battles (muzzle flash, tracers, impacts per surface, trail, sounds). Empty = the wielder's held weapon's presentation, else the Weapon Presentation settings' default. |
Fire Modes (FireModes) | TArray<FRSEActionFireMode> | Weapon|Ranged | Ranged: the fire modes, switched in order. |
URSEAnimLibrary
Module RSEEditor, parent UDataAsset. The project's animation and effect library (D-087): the scanned folders, every animation and effect with its automatic and manual classification, the retargeted copies and what the library wrote into the project's data (provenance).
| Property | Type | Category | Description |
|---|---|---|---|
Animations (Animations) | TArray<FRSEAnimLibraryEntry> | Library | |
Effects (Effects) | TArray<FRSEFXLibraryEntry> | Library | |
Folders (Folders) | TArray<FDirectoryPath> | Library | Folders scanned (Rescan scans them again: new clips are added, automatic classifications refreshed, manual ones kept). |
Provenance (Provenance) | TArray<FRSEProvenanceRecord> | Library | |
Retarget Cache (RetargetCache) | TArray<FRSERetargetCacheEntry> | Library |
URSEAnimStyle
Module RSEEditor, parent UDataAsset. An animation style (D-087): which clips fill which animation set slots ("Sword & Shield", "Staff", "Bow", "Brawler"...) plus the style's ability animations, built from the library in one click and edited freely (hand-picked clips are never replaced by a rebuild).
| Property | Type | Category | Description |
|---|---|---|---|
Actions (Actions) | TArray<FRSEAnimStyleAction> | Abilities | |
Characters (Characters) | TArray<TSoftObjectPtr<URSECharacterData> > | Assignment | Characters that use this style. |
Classes (Classes) | TArray<TSoftObjectPtr<URSEClassData> > | Assignment | Every character of these classes uses this style (unless a style names the character itself). |
Outputs (Outputs) | TArray<FRSEAnimStyleOutput> | Output | The animation sets Apply wrote (one per skeleton). |
Slots (Slots) | TArray<FRSEAnimStyleSlot> | Slots | |
Description (Description) | FText | Style | |
Max Variants (MaxVariants) | int32 | Style | Clips per slot beyond the first (random variants). |
Source Folders (SourceFolders) | TArray<FDirectoryPath> | Style | Only clips from these folders (and their subfolders) are used when the style is built: one pack, or the packs made for this kind of body (humanoids, not the dragon pack). Empty = the whole library. |
Weapon (Weapon) | FGameplayTag | Style | The weapon it is for (clips of that weapon first). Empty = any. |
**Fill Action Anims (Action.Anim.*)** (bBuildActionAnims) | bool | Style|Build | A7: the Action.Anim.* slots (light and heavy combo steps, dodge, block, parry, fire, reload...) of the sets' Action Anims. |
Fill Ability Animations (bBuildActions) | bool | Style|Build | |
**Fill Idle (Idle.Anim.*)** (bBuildIdle) | bool | Style|Build | |
Fill Animation Slots (bBuildSlots) | bool | Style|Build | P32d: what Build / Rebuild fills. Off = that part is left as it is. A style that only adds idle clips to characters whose sets are already good (Fill Idle only) keeps their locomotion, combat poses and attacks: Apply writes only the slots the style holds. |
**Fill Traversal (Traversal.Anim.*)** (bBuildTraversal) | bool | Style|Build | |
Traversal (Traversal) | TArray<FRSEAnimStyleTraversal> | Traversal | D-121: traversal clips (climbing, swimming, jumping, vaulting), written to the sets' Traversal Anims; D-129: idle clips (Idle.Anim.*) to their Idle Anims. |
URSEAnimTaxonomy
Module RSEEditor, parent UDataAsset. The animation taxonomy (D-087): categories, the word rules that recognize them, weapons, sides, strengths and flags, and which categories fill which animation set slots.
| Property | Type | Category | Description |
|---|---|---|---|
In Place Flag (InPlaceFlag) | FGameplayTag | Flags | |
Loop Flag (LoopFlag) | FGameplayTag | Flags | Flags the measurements add (empty = none): a looping clip, an in-place clip, a clip whose root travels. |
Root Motion Flag (RootMotionFlag) | FGameplayTag | Flags | |
Ignore Patterns (IgnorePatterns) | TArray<FRSEPackNamePattern> | Rules | Animations never offered (additive poses, aim offsets, facial...): classified, flagged Ignored. |
Importer Profile (ImporterProfile) | TSoftObjectPtr<URSECharacterPackProfile> | Rules | Also asks a character pack importer profile (D-074): its animation rules vote for the categories their slots map to (Slot Mappings) with Importer Rule Weight, and its Ignore Animations mark clips ignored. Empty = only the rules here. |
Importer Rule Weight (ImporterRuleWeight) | float | Rules | |
Rules (Rules) | TArray<FRSELibraryWordRule> | Rules | Word rules for every dimension (category, weapon, side, strength, flags). |
Confidence Softness (ConfidenceSoftness) | float | Scoring | Confidence = best / (best + runner-up + Softness): larger values make the library more careful. |
Folder Weight (FolderWeight) | float | Scoring | Share of a rule's weight when it matches a folder name instead of the asset name. |
Loop Pose Tolerance (LoopPoseTolerance) | float | Scoring | A clip loops when every bone of its last pose is within this angle of its first pose. |
Min Root Speed (MinRootSpeed) | float | Scoring | Root speed (cm/s) under which a clip counts as in place. |
Review Threshold (ReviewThreshold) | float | Scoring | Below this confidence an animation is listed as "needs review". |
Action Categories (ActionCategories) | TArray<FGameplayTag> | Styles | Categories a style keeps as ability animations (attacks, spells by kind...): Dress My Abilities picks from them. |
Slot Mappings (SlotMappings) | TArray<FRSEAnimSlotMapping> | Styles | Which categories fill which animation set slots when a style is built (first mapping of a slot with clips wins). |
Style Avoid Flags (StyleAvoidFlags) | FGameplayTagContainer | Styles | Clips with these flags come last when a style is built (air attacks, starts and stops, crouched moves). |
Traversal Mappings (TraversalMappings) | TArray<FRSEAnimTraversalMapping> | Styles | D-121: which clips fill the traversal slots (Traversal.Anim.: climbing, swimming, jumping, vaulting) of a style's animation sets; D-129: and the idle slots (Idle.Anim.). Empty = the built-in mappings (RSEAnimLibrary::GetTraversalMappings). |
Weapons (Weapons) | TArray<FGameplayTag> | Styles | Weapons a style can be built for (Auto-build Style lists them). |
Categories (Categories) | TArray<FRSEAnimCategoryDef> | Taxonomy | The categories and their usual measurements. A category without an entry can still be voted for by rules. |
Description (Description) | FText | Taxonomy |
URSEAppearancePart
Module RSE, parent URSEAppearancePartBase, primary asset. A visible piece of equipment (D-046): URSEEquipmentData::AppearancePart.
| Property | Type | Category | Description |
|---|---|---|---|
Part (Part) | FRSEAppearancePartSpec | Part |
URSEAppearancePartBase
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. A visible piece a piece of equipment adds or swaps on its wearer (a sword, a helmet).
URSEArchetype
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. A template content is made from (D-095, docs/design/studio.md section 6): "Knight", "Goblin", "Merchant", "Healing spell".
| Property | Type | Category | Description |
|---|---|---|---|
Library Tags (LibraryTags) | FGameplayTagContainer | Archetype | Extra library filters (Archetype.*). |
Role (Role) | FGameplayTag | Archetype | Role in the library filters (Archetype.Role.*: tank, damage, support, merchant...). |
Sort Order (SortOrder) | int32 | Archetype | Order in the library (lower first; ties sort by name). |
Summary (Summary) | FText | Archetype | What it is, in words a beginner understands ("Sturdy front-liner who protects the party. Good first pick."). |
Thumbnail (Thumbnail) | TSoftObjectPtr<UTexture2D> | Archetype | Picture in the archetype library. Empty = the content's own portrait or icon, or a generic card. |
Content Class (ContentClass) | TSubclassOf<URSEPrimaryDataAsset> | Template | Class of the content made from this archetype (a subclass of the archetype kind's base class). |
Non Inherited Fields (NonInheritedFields) | TArray<FName> | Template | Fields content never inherits (identity: each class has its own Class Tag). They are copied once when content is created, then belong to the content. |
Template (Template) | TObjectPtr<URSEPrimaryDataAsset> | Template | The values content starts from and inherits. Its class is Content Class. |
URSEAreaData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A place of the world the player can be in (D-044, docs/design/zones-travel.md): a map, or a part of one when an ARSEAreaVolume links to it.
| Property | Type | Category | Description |
|---|---|---|---|
Default Arrival Point (DefaultArrivalPoint) | FName | Area | Arrival point used when a travel into this area names none (ARSEArrivalPoint id). None = the map's default arrival point or player start. |
Description (Description) | FText | Area | Short text under the name (world map details, banner caption). |
Map (Map) | TSoftObjectPtr<UWorld> | Area | The map of this area. An area without a map is a part of a map (linked from an ARSEAreaVolume). When several areas name the same map, the map-level area is the first one found; link the others through volumes. |
Show Banner (bShowBanner) | bool | Presentation | Show the area name when the player arrives (travel, load) or walks in (if the Travel UI setting allows it). |
Progression Zone (ProgressionZone) | TObjectPtr<URSEProgressionZoneData> | Progression | Progression zone of this area (D-051): regular encounters fought here scale their enemies within its level range, unless the encounter names its own zone. Empty = no scaling (authored levels). |
No Fast Travel (bNoFastTravel) | bool | Restrictions | The world map cannot be used to leave from here (dungeons, story sequences). |
No Save (bNoSave) | bool | Restrictions | The save item cannot be used here (like ARSENoSaveVolume, D-010). Save points still work. |
URSEArtLibrary
Module RSECore, parent UPrimaryDataAsset, primary asset. Generated art for content the project cannot edit (D-075): the Portrait & Icon Studio writes here the portraits and icons of assets outside /Game (the plugin's starter content, read-only when the plugin is installed from Fab).
| Property | Type | Category | Description |
|---|---|---|---|
Entries (Entries) | TMap<FSoftObjectPath,FRSEArtEntry> | Art | Content asset path -> its generated art. |
URSEAttributeRegistry
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The attributes and resources of a project (D-054, docs/design/attributes.md).
| Property | Type | Category | Description |
|---|---|---|---|
Attributes (Attributes) | TArray<FRSEAttributeDefinition> | Attributes | |
Resources (Resources) | TArray<FRSEResourceDefinition> | Resources |
URSEBarkPoolData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A pool of NPC lines (D-157): villagers' small talk, a town's rumours, guards, merchants.
| Property | Type | Category | Description |
|---|---|---|---|
Lines (Lines) | TArray<FRSEBarkLine> | Barks |
URSEBattleMenuConfig
Module RSECore, parent URSEPrimaryDataAsset, primary asset. What the battle menus offer (D-122, docs/design/battle-menus.md): the providers that fill the menu, in order, and how the categories look (label, icon, shape, hidden).
| Property | Type | Category | Description |
|---|---|---|---|
Use Default Groupings (bUseDefaultGroupings) | bool | Groups | |
Groupings (Groupings) | TArray<FRSEBattleMenuGrouping> | Groups | D-147: how categories group their entries (spells by element, skills by role; each group a sub-ring). Empty = Project Settings -> Ability Info -> Default Groupings, unless Use Default Groupings is off (no groups). |
Categories (Categories) | TArray<FRSEBattleMenuCategoryDef> | Menu | Labels, icons and shapes of categories (by id), and their order: listed categories come first, in this order. |
Providers (Providers) | TArray<TObjectPtr<URSEBattleMenuProvider> > | Menu | Fill the menu in this order; a provider skips abilities an earlier one already added. |
URSEBattleMenuStyle
Module RSE, parent URSEPrimaryDataAsset, primary asset. A battle menu style (D-122, docs/design/battle-menus.md): its id, the presenter widget that shows it and its look.
| Property | Type | Category | Description |
|---|---|---|---|
Rich Tooltip (bRichTooltip) | bool | Ability Info | The tooltip tells everything about an ability: role tags, target and range, element and power, effects with chances, known weaknesses. |
Show Target Badges (bShowTargetBadges) | bool | Ability Info | Each ability icon carries its targeting badge (one target, area, line, cone, self, ally): Battle Menus -> Target Badges. |
Tooltip Affinity Hints (bTooltipAffinityHints) | bool | Ability Info | The tooltip names the opponents on the field known (bestiary) to be weak to or resist the ability's element. |
Target Badge Back Color (TargetBadgeBackColor) | FRSEUIColor | Ability Info | |
Target Badge Color (TargetBadgeColor) | FRSEUIColor | Ability Info | |
Target Badge Scale (TargetBadgeScale) | float | Ability Info | Size of the badge (share of the icon), its disc and its glyph's tint. |
Tooltip Effect Lines (TooltipEffectLines) | int32 | Ability Info | Most effect lines the tooltip lists. |
Show Tooltip (bShowTooltip) | bool | Look | Show the highlighted entry's tooltip (name, cost, description, why it cannot be used). |
Corner Radius (CornerRadius) | float | Look | Corner radius of slots and slices. |
Disabled Opacity (DisabledOpacity) | float | Look | Opacity of entries that cannot be used now. |
Disabled Shade (DisabledShade) | FRSEUIColor | Look | |
Icon Size (IconSize) | float | Look | Size of entry icons (pixels at 1080p). |
Slot Color (SlotColor) | FRSEUIColor | Look | Fill of a slot / slice, highlighted, and the shade over one that cannot be used. |
Slot Highlight Color (SlotHighlightColor) | FRSEUIColor | Look | |
Steam Deck Scale (SteamDeckScale) | float | Look | Scale on a Steam Deck (readability on its 7" screen). |
Tooltip Width (TooltipWidth) | float | Look | Width of the tooltip (pixels at 1080p). |
Description (Description) | FText | Style | One line in the options menu. |
Presenter Class (PresenterClass) | TSoftClassPtr<URSEBattleMenuPresenter> | Style | The widget that shows the menu (C++ or Widget Blueprint). |
Style Id (StyleId) | FName | Style | Stable id: project settings and the player's option refer to it ("List", "Radial", "Hotbar"). |
URSEBattleMenuStyle_Hotbar
Module RSE, parent URSEBattleMenuStyle, primary asset. A bottom bar of ability slots in the style of modern CRPGs (D-122): hotkeys, pages, drag to reorder (saved per character).
| Property | Type | Category | Description |
|---|---|---|---|
Allow Reorder (bAllowReorder) | bool | Hotbar | Slots can be dragged onto each other with the mouse (the order is saved per character). |
Bottom Offset (BottomOffset) | float | Hotbar | Distance of the bar from the bottom of the screen (pixels at 1080p). |
Hotkey Keys (HotkeyKeys) | TArray<FKey> | Hotbar | Keys of the slots on the current page, in order (1-0 by default). |
Reorder Keys (ReorderKeys) | TArray<FKey> | Hotbar | Gamepad: picks up the highlighted slot, then drops it on the next one highlighted (reorder without a mouse). |
Slot Size (SlotSize) | float | Hotbar | Size of a slot and the gap between slots (pixels at 1080p). |
Slot Spacing (SlotSpacing) | float | Hotbar | |
Slots Per Page (SlotsPerPage) | int32 | Hotbar | Slots on one page of the bar (the hotkeys cover the first ones). |
Tooltip Reserve (TooltipReserve) | float | Hotbar | Room kept above the bar for its tooltip (pixels at 1080p): the HUD's message line sits above it. |
Turn Button Width (TurnButtonWidth) | float | Hotbar | Width of the turn buttons right of the bar (Move, Jump, Flee, End Turn). |
URSEBattleMenuStyle_List
Module RSE, parent URSEBattleMenuStyle, primary asset. The static list of D-106: the command panel on the left.
| Property | Type | Category | Description |
|---|---|---|---|
Panel Offset (PanelOffset) | FVector2D | List | Where the panel sits: offset from the left middle of the screen (pixels at 1080p). |
URSEBattleMenuStyle_Radial
Module RSE, parent URSEBattleMenuStyle, primary asset. A radial menu on the active unit: categories on the first ring, their entries on the second (D-122).
| Property | Type | Category | Description |
|---|---|---|---|
Anchor Height (AnchorHeight) | float | Radial | Height above the unit's feet the ring is placed from (cm). |
Anchor to Unit (bAnchorToUnit) | bool | Radial | The ring opens at the active unit (else at the screen's center). |
Open at Turn Start (bOpenAtTurnStart) | bool | Radial | The ring opens by itself at each decision of the player's unit; off = only on demand (a toggle key, an Open Key such as the right mouse button, Confirm, or the small button left beside the unit). Players can change it in Options -> Game. |
Closed Label (ClosedLabel) | FText | Radial | Label of the small button left on the unit while the ring is closed. |
Dead Zone (DeadZone) | float | Radial | Stick deflection (0..1) needed to pick a slice. The mouse picks only inside the ring's outer edge, outside the center disc. |
Max Slices (MaxSlices) | int32 | Radial | Most slices on a ring; more entries go on pages (mouse wheel, shoulder buttons). |
Open Keys (OpenKeys) | TArray<FKey> | Radial | D-128: keys or mouse buttons that only open a closed ring (right click); Cancel closes it. |
Screen Margin (ScreenMargin) | float | Radial | The ring stays this far inside the screen's edges (pixels at 1080p). |
Toggle Keys (ToggleKeys) | TArray<FKey> | Radial | Keys that open or close the ring (keyboard and gamepad). Confirm also opens a closed ring. |
Back Button Color (BackButtonColor) | FRSEUIColor | Radial|Back | D-152: the button's fill, and under the mouse. |
Back Button Hover Color (BackButtonHoverColor) | FRSEUIColor | Radial|Back | |
Back Label (BackLabel) | FText | Radial|Back | D-152: the button's label in a sub-ring and on the first ring. |
Back Prompt Keys (BackPromptKeys) | TArray<FKey> | Radial|Back | D-152: the keys the button names, those of the device in use (keyboard and mouse: Esc / right click; gamepad: B). |
Outside Click Backs (bOutsideClickBacks) | bool | Radial|Back | D-152: a click outside the ring backs out of a sub-ring (to the previous ring) and closes the first ring. A quick ring shown small (D-128) lets the click through to the world (walking, aiming). |
Right Click Backs (bRightClickBacks) | bool | Radial|Back | D-152: the right mouse button on an open ring is Back (a sub-ring to the previous ring; the first ring closes). |
Show Back Button (bShowBackButton) | bool | Radial|Back | D-152: a Back / Close button in the center disc, with its keys (clicking the center does the same). |
Close Label (CloseLabel) | FText | Radial|Back | |
Badge Color (BadgeColor) | FRSEUIColor | Radial|Look | The badge drawn when an entry has no icon (its initials on this fill). |
Category Labels (bCategoryLabels) | bool | Radial|Look | Names on the slices of the first ring (categories) and of the second (entries; long names: the tooltip shows them). |
Entry Labels (bEntryLabels) | bool | Radial|Look | |
Show Aura (bShowAura) | bool | Radial|Look | D-147: the transparent aura around the ring: the dark band behind the slices (showing in the gaps) and the glow fading out around the highlighted slice. Off (default): crisp slices, the highlighted one outlined. |
Slice Details (bSliceDetails) | bool | Radial|Look | The cost or the reason under each slice's name. |
Tier Details (bTierDetails) | bool | Radial|Look | D-147: rings of a tier family's tiers show each tier's name and cost on its slice. |
Center Color (CenterColor) | FRSEUIColor | Radial|Look | The center disc and its edge. |
Center Edge Color (CenterEdgeColor) | FRSEUIColor | Radial|Look | |
Description Lines (DescriptionLines) | int32 | Radial|Look | Lines of description the center disc shows at most. |
Edge Color (EdgeColor) | FRSEUIColor | Radial|Look | |
Glow Color (GlowColor) | FRSEUIColor | Radial|Look | The glow outside the highlighted slice (with the aura): its color (fading out) and width (pixels at 1080p). |
Glow Width (GlowWidth) | float | Radial|Look | |
Group Accent Width (GroupAccentWidth) | float | Radial|Look | D-147: width of the band in a group's accent color along the outer edge of group slices and their entries (pixels at 1080p; 0 = none). |
Highlight Edge Color (HighlightEdgeColor) | FRSEUIColor | Radial|Look | Without the aura: the outline of the highlighted slice (color, thickness in pixels at 1080p). |
Highlight Edge Thickness (HighlightEdgeThickness) | float | Radial|Look | |
Ring Color (RingColor) | FRSEUIColor | Radial|Look | Fill behind the slices (shows in the gaps), the separators between slices and the ring's edge lines. |
Separator Color (SeparatorColor) | FRSEUIColor | Radial|Look | |
Separator Thickness (SeparatorThickness) | float | Radial|Look | |
Tooltip Color (TooltipColor) | FRSEUIColor | Radial|Look | The tooltip panel's fill and edge. |
Tooltip Edge Color (TooltipEdgeColor) | FRSEUIColor | Radial|Look | |
Tooltip Gap (TooltipGap) | float | Radial|Look | Gap between the ring and its tooltip panel (pixels at 1080p). |
Tooltip Placement (TooltipPlacement) | ERSERadialTooltip | Radial|Look | Where the highlighted slice's tooltip shows (Beside: a panel, Tooltip Width wide, on the far side from the unit). |
Highlight Seconds (HighlightSeconds) | float | Radial|Motion | Seconds a slice takes to light up or fade back. |
Open Scale From (OpenScaleFrom) | float | Radial|Motion | |
Open Seconds (OpenSeconds) | float | Radial|Motion | Open / close: seconds, and the scale it grows from. |
Anchor (Anchor) | ERSERadialAnchor | Radial|Placement | D-128: beside the unit (default) or on it. |
Other Unit Clearance (OtherUnitClearance) | float | Radial|Placement | Other units the ring tries not to cover: their screen radius (pixels at 1080p). |
Placement Angles (PlacementAngles) | TArray<float> | Radial|Placement | Sides tried, in order of preference (degrees on screen: 0 = right, 90 = below, -90 = above, 180 = left). The first side that keeps the unit clear and covers the fewest other units wins; the side is kept while the ring is open. |
Placement Gap (PlacementGap) | float | Radial|Placement | Gap between the unit's clear area and the ring (pixels at 1080p). |
Unit Clearance (UnitClearance) | float | Radial|Placement | Beside the unit: the screen radius around the unit kept clear (pixels at 1080p); the unit's own projected size is used when larger (a close camera). |
Quick Ring (bQuickRing) | bool | Radial|Quick Ring | D-128: the quick ring. Until the mouse comes near it (or the stick / D-pad picks a slice, or a category opens) the ring stays small, icons only; it grows to its full size, with the names, while used. |
Expand Hold Seconds (ExpandHoldSeconds) | float | Radial|Quick Ring | After a stick, D-pad or keyboard choice the ring stays full for this long (no mouse to hover with). |
Expand Seconds (ExpandSeconds) | float | Radial|Quick Ring | Seconds to grow or shrink. |
Quick Ring Hover Margin (QuickRingHoverMargin) | float | Radial|Quick Ring | The ring grows when the mouse is within this distance of its edge (pixels at 1080p). |
Quick Ring Scale (QuickRingScale) | float | Radial|Quick Ring | Size of the quick ring (share of the full ring). |
Arc Steps (ArcSteps) | int32 | Radial|Ring | Arc steps per slice (smoothness of the curves; more = rounder, a few more vertices). |
Center Radius (CenterRadius) | float | Radial|Ring | Radius of the center disc (pixels at 1080p; at most the inner radius). |
Inner Radius (InnerRadius) | float | Radial|Ring | Radii of the ring of slices (pixels at 1080p): inner and outer edge. |
Outer Radius (OuterRadius) | float | Radial|Ring | |
Slice Gap Degrees (SliceGapDegrees) | float | Radial|Ring | Gap between two slices (degrees). |
URSEBattlePresentationData
Module RSE, parent URSEAbilityPresentationBase, primary asset. A battle presentation (D-034): a timeline of cues (movement, montages, VFX, sounds, camera shots, hit-stop, slow motion, flashes, banners, impacts).
| Property | Type | Category | Description |
|---|---|---|---|
Feel (Feel) | FRSEPresentationFeel | Feel | D-115: trails, cast and impact effects, the magic circle, the telegraph and the projectile around the timeline. |
Pacing (Pacing) | FRSEActionPacing | Feel | D-115: the pace of this presentation (wind-up, cast, hit-stop, slide, recovery). Override off = the ability's kind default. |
Skippable (bSkippable) | bool | Timeline | Confirm / Cancel skip it (cinematic moments). Ordinary actions follow the settings. |
Cues (Cues) | TArray<TObjectPtr<URSEBattleCue> > | Timeline |
URSECampaignProgressionData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The whole campaign for the Progression Designer (D-051, docs/design/progression-designer.md): the zones in order, the standard party and its classes, the targets and how to simulate.
| Property | Type | Category | Description |
|---|---|---|---|
Alternative Parties (AlternativeParties) | TArray<FRSEBalancePartyComposition> | Balance | Other party compositions "Balance My Campaign" plays next to the standard party (e.g. no area magic, all melee). They never get encounter proposals of their own; they reveal class outliers. |
Max Level (MaxLevel) | int32 | Campaign | Level cap the campaign is designed for (checked against Progression settings, MaxLevel). |
Optional Content (OptionalContent) | TArray<FRSEProgressionOptionalTarget> | Campaign | Optional challenges and their recommended levels. |
Zones (Zones) | TArray<TObjectPtr<URSEProgressionZoneData> > | Campaign | The zones in campaign order. Optional zones (post-game) are played after the critical ones. |
Optional Battle Share (OptionalBattleShare) | float | Party | Share of each zone's optional battles the standard player fights (0 = critical path only, 1 = everything). The grind index still compares with every battle the zone offers. |
Party (Party) | TArray<FRSEProgressionPartyMember> | Party | The standard party the projection plays (main characters with their fixed classes). |
Standard Classes (StandardClasses) | TArray<TObjectPtr<URSEClassData> > | Party | The project's standard main classes: the only classes whose stat growth the advisor may change. Enemies sharing one of these classes change with it (the advisor measures that too). |
Enemy Intelligence (EnemyIntelligence) | float | Simulation | AI intelligence of the enemies (0-1); negative = as a new game starts (adaptive difficulty's start value within each encounter's bounds). |
Grind Scenarios (GrindScenarios) | TArray<float> | Simulation | Extra-grind scenarios played next to the standard one: each value is the extra share of regular battles (0.3 = the player fights 30% more battles in every zone). |
Key Battle Retries (KeyBattleRetries) | int32 | Simulation | |
Player Intelligence (PlayerIntelligence) | float | Simulation | AI intelligence playing the party (0-1). |
Retry Grind Battles (RetryGrindBattles) | int32 | Simulation | A lost key battle is retried after this many extra regular battles of the zone, at most KeyBattleRetries times. |
Rules Profile (RulesProfile) | TObjectPtr<URSERulesProfile> | Simulation | Rules profile the campaign is played under (empty = the game's default profile). The advisor writes enemy rules here when it owns a Progression section. |
Seed (Seed) | int32 | Simulation | First seed: every run of the same data gives the same projection. |
Tactics Grid (TacticsGrid) | ERSEProgressionGridSource | Simulation | |
Targets (Targets) | FRSEProgressionTargets | Targets | --- Targets --- |
URSECaravanData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A merchant caravan (D-157).
| Property | Type | Category | Description |
|---|---|---|---|
Guard Barks (GuardBarks) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | Guards | Lines of guards without their own. |
Guards (Guards) | TArray<FRSECaravanGuard> | Guards | |
Wagon Mesh (WagonMesh) | TSoftObjectPtr<UStaticMesh> | Look | The wagon (empty = an engine cube). |
Wagon Scale (WagonScale) | FVector | Look | |
Merchant Appearance (MerchantAppearance) | TSoftObjectPtr<URSECharacterAppearanceBase> | Merchant | |
Merchant Barks (MerchantBarks) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | Merchant | The merchant's lines (calls on the road, rumours from the last town). |
Merchant Name (MerchantName) | FText | Merchant | |
Merchant Offset (MerchantOffset) | FVector2D | Merchant | Where the merchant walks relative to the wagon (X along the road, Y to the side, cm). |
Shop (Shop) | TSoftObjectPtr<URSEShopData> | Merchant | What the merchant sells (Open Shop). |
Trades Only at Stops (bTradesOnlyAtStops) | bool | Road | The merchant trades only at stops (off: also when hailed on the road). |
Catch Up Multiplier (CatchUpMultiplier) | float | Road | How much faster than its pace it walks to catch up after a halt. |
Halt Radius (HaltRadius) | float | Road | It halts while a player is this near on the road (they can trade), then catches up with its timetable (0 = never halts). |
Default Wait Hours (DefaultWaitHours) | float | Timetable | Game hours it waits at a stop without its own wait. |
Km Per Game Hour (KmPerGameHour) | float | Timetable | The pace on the road (km per game hour; the clock moves it, so a stopped clock stops it). |
Start Hour (StartHour) | float | Timetable | The game hour of day 1 at which it leaves the first stop (the timetable repeats from there). |
URSECardData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. One card of the War card game (D-028).
| Property | Type | Category | Description |
|---|---|---|---|
Description (Description) | FText | Card | Flavour text shown in the album. Localizable. |
Element (Element) | FGameplayTag | Card | Optional element, for flavour only (frame colour, album filter). No rule uses it. |
Rarity (Rarity) | FGameplayTag | Card | Rarity tier; its value range is in the Cards settings. |
Value (Value) | int32 | Card | The card's strength: the higher value wins a trick. |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Presentation | Card art, loaded on demand by the UI. |
URSECardOpponentData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. An NPC who plays cards (D-028).
| Property | Type | Category | Description |
|---|---|---|---|
Deck (Deck) | TArray<TObjectPtr<URSECardData> > | Deck | The opponent's deck (1 to MaxDeckSize cards, duplicates allowed). |
First Win Rewards (FirstWinRewards) | TArray<TObjectPtr<URSECardData> > | Rewards | Cards given once, on the player's first victory (the opponent's unique cards). |
Allow Rematch (bAllowRematch) | bool | Rules | False: the opponent refuses to play again once beaten. |
Play for Stake (bPlayForStake) | bool | Rules | Whether the winner takes a card from the loser's deck (the D-028 stake). Off for friendly or tutorial matches. |
Challenge Conditions (ChallengeConditions) | FRSEConditionSet | Rules | When the opponent accepts a challenge (empty = always), e.g. a story flag or a party member. |
URSECharacterAnimSet
Module RSE, parent UDataAsset. The animations of a character (D-046), shared by every character on the same skeleton and style.
| Property | Type | Category | Description |
|---|---|---|---|
Action Anims (ActionAnims) | FRSEActionAnims | Action | D-171 (A3): what this character plays in action battles when its weapon has no entry of its own in Weapon Action Anims (combo steps, shots, reload, dodge, parry, guard, stagger). Written by the animation library or by hand. |
Weapon Action Anims (WeaponActionAnims) | TArray<FRSEActionWeaponAnims> | Action | D-171 (A3): per action weapon (a sword, a rifle...): its own clips, over Action Anims. |
Loop Victory (bLoopVictory) | bool | Battle States | Victory loops until the battle is left; off = it plays once and holds. |
Casting (Casting) | FRSECharacterAnim | Battle States | Loops while casting (SetBattleState Casting). |
Charging (Charging) | FRSECharacterAnim | Battle States | Loops while an ATB action charges. |
Down (Down) | FRSECharacterAnim | Battle States | Knock-out (from the front, and for every side without its own animation): plays once and holds the last pose until revived. |
Down Back (DownBack) | FRSECharacterAnim | Battle States | Knock-out by a hit in the back. Empty = Down. |
Down Left (DownLeft) | FRSECharacterAnim | Battle States | Knock-out by a hit on the left side. Empty = Down. |
Down Right (DownRight) | FRSECharacterAnim | Battle States | Knock-out by a hit on the right side. Empty = Down. |
Get Up (GetUp) | FRSECharacterAnim | Battle States | Getting up when revived, from the knock-out's lying pose back to standing (D-067). Knock-outs listed in Recoveries use their own get-up; the others use GetUp. Empty = the knock-out blends back into the state. |
Guard (Guard) | FRSECharacterAnim | Battle States | Loops while a block window is open. |
Ready (Ready) | FRSECharacterAnim | Battle States | Combat idle while in battle and standing still (loops). Empty = the locomotion idle. |
Recoveries (Recoveries) | TArray<FRSEKnockOutRecovery> | Battle States | Get-ups that match particular knock-out animations (each lies differently). |
Victory (Victory) | FRSECharacterAnim | Battle States | Battle won. |
Pose Anims (PoseAnims) | TMap<ERSECuePose,FRSEPoseAnim> | Cues | Animations for the procedural pose cues (Lunge, Hop, Recoil...): the default timelines (no presentation asset) and Pose cues look animated on real characters. Poses without an entry stay procedural. |
Idle Anims (IdleAnims) | TMap<FGameplayTag,FRSECharacterAnim> | Idle | D-129: idle slot (Idle.Anim.*) -> clip, played by the visible party while the leader rests (stretch, look around, yawn, juggle, check the weapon, chat, sit, lean...; the profiles' behaviours name the slots). Written by the animation library's styles (D-087) or by hand. A missing slot falls back to its parent tag (Idle.Anim = any idle fidget), then to Project Settings -> Character Visuals -> Default Idle Anims; with nothing the behaviour is skipped. |
Interact Anims (InteractAnims) | TMap<FGameplayTag,FRSECharacterAnim> | Interact | D-157: world interaction slot (Interact.Anim.*) -> clip: the strike that breaks a barrel or a crate. A missing slot falls back to its parent tag, then to Project Settings -> Interaction Visibility -> Default Interact Anims, then to the Lunge pose anim; with nothing at all a short procedural lunge plays. |
Locomotion (Locomotion) | TSoftObjectPtr<UBlendSpace> | Locomotion | Idle / walk / run blend space (the UE mannequin's: X = direction in degrees, Y = speed in cm/s). The Anim Blueprint reads it. |
Locomotion Speed Axis (LocomotionSpeedAxis) | int32 | Locomotion | Axis of the locomotion blend space that carries the speed (0 = X, 1 = Y; the UE mannequin's is Y). Stride warping reads its maximum. |
Approach (Approach) | FRSECharacterAnim | Movement | Dash toward the target when a battle cue moves the character there (Move, To Target). Empty = locomotion. |
Turn 180 (Turn180) | FRSECharacterAnim | Movement | Turn in place for about-faces (135 degrees and more, either way). Empty = the 90 degree turn of that side. |
Turn Left 90 (TurnLeft90) | FRSECharacterAnim | Movement | Turn in place to the left, standing (a Tactics facing change, turning toward a target). An in-place clip: the mesh turns procedurally over the clip's length. Played for turns of at least Character Visuals -> Turn Anim Min Angle. Empty = only the procedural turn. |
Turn Right 90 (TurnRight90) | FRSECharacterAnim | Movement | Turn in place to the right (see TurnLeft90). Empty = only the procedural turn. |
Expressions (Expressions) | TMap<FGameplayTag,FRSECharacterAnim> | Portraits | Expression (Dialog.Expression.*) -> pose / animation for emotion portraits (studio) and live portraits. Missing = the portrait pose. |
Portrait Pose (PortraitPose) | FRSECharacterAnim | Portraits | Pose of generated portraits and idle of live dialog portraits. Empty = the locomotion idle (or the reference pose in the studio). |
Talk (Talk) | FRSECharacterAnim | Portraits | Looping talk animation of live dialog portraits. Empty = a small procedural sway and nod while the line types. |
Blocked (Blocked) | FRSECharacterAnim | Reactions | One-shot when a hit lands on a guarding character. Empty = Hit. |
Dodge (Dodge) | FRSECharacterAnim | Reactions | One-shot sidestep on a miss. Empty = only the procedural sidestep. |
Hit (Hit) | FRSECharacterAnim | Reactions | One-shot reaction to a hit (from the front, and for every side without its own animation). |
Hit Back (HitBack) | FRSECharacterAnim | Reactions | Hit in the back (a flank attack in Tactics). Empty = Hit. |
Hit Heavy (HitHeavy) | FRSECharacterAnim | Reactions | A critical hit from the front (a heavier stagger). Empty = Hit. |
Hit Left (HitLeft) | FRSECharacterAnim | Reactions | Hit on the left side. Empty = Hit. |
Hit Right (HitRight) | FRSECharacterAnim | Reactions | Hit on the right side. Empty = Hit. |
Action Slot (ActionSlot) | FName | Setup | Slot node of the Anim Blueprint where states, reactions and cue animations play. |
Traversal Anims (TraversalAnims) | TMap<FGameplayTag,FRSECharacterAnim> | Traversal | D-121: traversal slot (Traversal.Anim.*) -> clip: climbing, swimming, jumping, vaulting. Written by the animation library's styles (D-087) or by hand. A missing slot falls back to its parent tag, then to Project Settings -> Traversal -> Default Anims; with nothing at all the body moves along the traversal in its current pose. |
URSECharacterAppearance
Module RSE, parent URSECharacterAppearanceBase, primary asset. How a character looks (D-046): modular parts, material variants, the Anim Blueprint and the animation set.
| Property | Type | Category | Description |
|---|---|---|---|
Anim Class (AnimClass) | TSoftClassPtr<UAnimInstance> | Animation | Anim Blueprint of the leader (a thin child of URSECharacterAnimInstance). |
Anim Set (AnimSet) | TSoftObjectPtr<URSECharacterAnimSet> | Animation | Locomotion, battle states, reactions and cue animations. |
Weapon Hold Profile (WeaponHoldProfile) | TSoftObjectPtr<URSEWeaponHoldProfile> | Animation | D-185: how weapons sit in this look's hands (hand sockets per hold type, support hand IK, stance clips), over the body preset's. Empty = the body preset's, else Weapon Hold settings -> Profiles for the skeleton, else holds generated from the skeleton. |
Anchor Grips (AnchorGrips) | TMap<FGameplayTag,FTransform> | Parts | How item meshes are held at each anchor of this look (D-126 addendum), over the body preset's Anchor Grips: the transform, in the anchor socket's space, of an item mesh authored with its grip at the origin and its blade or shaft along +Z. An item's Worn Transform is applied in that frame. Missing = the socket's own frame. |
Anchors (Anchors) | TMap<FGameplayTag,FName> | Parts | Sockets (or bones) of the presentation anchors (Appearance.Anchor.*) on this look's leader mesh (D-074), over the body preset's. Battle cues that spawn at an anchor use them; an anchor without a socket uses the chest point. |
Body Preset (BodyPreset) | FName | Parts | A body of the project (Project Settings -> RPG Saga Engine -> Character Visuals -> Body Presets, D-070): its mesh fills the leader part when that part has no mesh (the part's materials and colors still apply), and its Anim Blueprint and animation set are used when Anim Class / Anim Set are empty. Lets looks shipped without meshes use whatever body the project has; a preset the project does not define leaves the placeholder shapes. |
Capsule Half Height (CapsuleHalfHeight) | float | Parts | Capsule half height of the exploration character wearing this look (cm), over the body preset's. 0 = the body preset's. |
Capsule Radius (CapsuleRadius) | float | Parts | Capsule radius of the exploration character wearing this look (cm), over the body preset's (D-074 addendum: the character pack importer stores the whole body on the look). 0 = the body preset's, else the character's own. |
Chest Height (ChestHeight) | float | Parts | Height (cm above the feet) of the chest: where prompts and battle shots aim. 0 = the placeholder value. |
Leader Slot (LeaderSlot) | FGameplayTag | Parts | Slot of the leader part (Appearance.Slot.Body). Unset = the first skeletal part. |
Melee Reach (MeleeReach) | float | Parts | Contact reach of this body's melee attacks (cm, D-079), over the body preset's. 0 = the body preset's. |
Mesh Transform (MeshTransform) | FTransform | Parts | Offset of the whole character from the actor's feet (UE mannequins face +Y: yaw -90). |
Modular Body (ModularBody) | ERSEModularBody | Parts | Whether worn armor can change this body (D-126). Rigid pieces (weapons, shields, hats on sockets) always show, and a piece for a slot the look already has always swaps it; a skeletal piece for a new slot shows only on a modular body. |
Parts (Parts) | TArray<FRSEAppearancePartSpec> | Parts | Parts; the first skeletal part with the body slot (or the first skeletal part) is the leader that animates. |
Unarmed Shot Anchor (UnarmedShotAnchor) | FGameplayTag | Parts | D-185 addendum 2: where this character fires ranged attacks from when it holds no gun (a creature's breath, a caster's palm): an anchor such as Appearance.Anchor.Chest or a hand. Empty = Weapon Presentation settings -> Unarmed Shot Anchor. |
Variants (Variants) | TArray<FRSEAppearanceVariant> | Variants | Alternative looks; the component picks one by name (none = the parts as they are). |
URSECharacterAppearanceBase
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. How a character looks (D-046): meshes, materials, animations.
URSECharacterData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A specific character or enemy type: its fixed class plus personal traits.
| Property | Type | Category | Description |
|---|---|---|---|
Battle Barks (BattleBarks) | FRSEBattleBarks | Battle | D-115: what this character shouts in live battles: when it turns toward the party at the start, and per intent on its turn. Empty lists use Project Settings -> RPG Saga Engine -> Battle Feel (Entry -> Alert Barks, Intent). |
Control (Control) | ERSEBattleControl | Battle | Player units are usually Player; guests can be either; enemies are AI. |
Default AIProfile (DefaultAIProfile) | TObjectPtr<URSEAIProfile> | Battle | Behaviour when controlled by the AI. Encounters may override it. |
Default ATBRow (DefaultATBRow) | ERSEATBRow | Battle | Preferred row in ATB battles (casters and archers usually stand in the back). |
Experience Reward (ExperienceReward) | int32 | Battle | Experience the party shares when this character is defeated as an enemy (D-030). 0 = the formula in Progression settings. |
Loot Table (LootTable) | TObjectPtr<URSELootTable> | Battle | Money and items the party may get when this character is defeated as an enemy (D-042). |
Bestiary Category (BestiaryCategory) | FGameplayTag | Bestiary | Bestiary group (Bestiary.Category.*): the list is sorted by it. Empty = uncategorized. |
Bestiary Description (BestiaryDescription) | FText | Bestiary | Bestiary text (D-047), shown once the enemy has been met. Empty = no description. |
Hide from Bestiary (bHideFromBestiary) | bool | Bestiary | Never recorded in the bestiary (story-only enemies, secret bosses, test units). |
Class (Class) | TObjectPtr<URSEClassData> | Character | Fixed class. Class data is lightweight, so a hard reference is fine. |
Personal Affinities (PersonalAffinities) | TArray<FRSEElementAffinityEntry> | Character | Personal elemental affinities, combined with the class ones. |
Personal Modifiers (PersonalModifiers) | TArray<FRSEStatModifier> | Character | Personal differences from the class (e.g. a sturdier knight). |
Personal Traits (PersonalTraits) | FGameplayTagContainer | Character | Personal traits (Trait.*), combined with the class ones. |
Roster (Roster) | ERSECharacterRoster | Character | |
Starting Level (StartingLevel) | int32 | Character | |
Bag Size (BagSize) | FIntPoint | Equipment | Per Character inventory (D-143): this character's bag size (columns x rows). 0 = its class's, else Inventory Rules -> Bag. |
Guest (bGuest) | bool | Equipment | Temporary party member: always wears its DefaultEquipment and the player cannot change it (D-011). |
Default Equipment (DefaultEquipment) | TArray<TObjectPtr<URSEEquipmentData> > | Equipment | Equipment the character starts with; fixed and locked for guests and enemies (D-011). |
Appearance (Appearance) | TSoftObjectPtr<URSECharacterAppearanceBase> | Presentation | How the character looks in the world and in battle (D-046): a URSECharacterAppearance (meshes, materials, animations). Empty = the placeholder shapes. Presentation only: battles and saves never read it. |
Attack Order (AttackOrder) | ERSEAttackOrder | Presentation | Order of the Attack Presentations: Sequential plays the combo A, B, C, A...; Random picks one each time. |
Attack Presentations (AttackPresentations) | TArray<TSoftObjectPtr<URSEAbilityPresentationBase> > | Presentation | Looks for this character's plain attacks (abilities typed Ability.Type.Attack without an override above), taken in turn so a basic attack plays the character's combo. Empty = the ability's own look. |
Follower Profile (FollowerProfile) | TSoftObjectPtr<URSEFollowerProfile> | Presentation | D-129: how this character follows the leader and lives while the party rests (its pace, its drift, its own idle behaviours). Empty = the party's (Project Settings -> Party Field -> Follower Profile). |
Portrait (Portrait) | TSoftObjectPtr<UTexture2D> | Presentation | Portrait for menus and battle cards (D-075): member cards, results, turn order chips, target card, bestiary; the dialog box uses it when the character's speaker has no portrait. Empty = the initial (or the generated art library's portrait). The Portrait & Icon Studio fills it (RPG Saga -> Content -> Generate Portraits & Icons). |
Portrait Variants (PortraitVariants) | TMap<FName,TSoftObjectPtr<UTexture2D> > | Presentation | Portraits of the appearance's variants (its Variants, by name), for units shown in another look. |
Presentation Overrides (PresentationOverrides) | TMap<TSoftObjectPtr<URSEAbilityData> ,TSoftObjectPtr<URSEAbilityPresentationBase> > | Presentation | Signature looks: this character's own presentation for an ability, used instead of the ability's (e.g. a hero from a character pack swinging its own staff with its own effects). Presentation only. |
Growth Plan (GrowthPlan) | TObjectPtr<URSEGrowthPlan> | Progression | This character's own Growth Plan (D-144), instead of its class's. Empty = the class's. |
URSECharacterPackProfile
Module RSEEditor, parent UDataAsset. How a family of third-party character packs maps onto the framework (D-074, docs/product/character-packs.md): which animations fill which slots, which sockets are which presentation anchors, which meshes are weapons, which effects and sounds do what, the color variants to make and the classes of the...
| Property | Type | Category | Description |
|---|---|---|---|
Anchor Rules (AnchorRules) | TArray<FRSEPackAnchorRule> | Anchors | Presentation anchors (hands, weapon tip, muzzle, chest, head, feet): the sockets or bones effects attach to. |
Animation Rules (AnimationRules) | TArray<FRSEPackAnimRule> | Animations | Animation rules, tried in order (the first rule that matches wins a slot). |
Animation Source Folders (AnimationSourceFolders) | TArray<FDirectoryPath> | Animations | Extra animation folders (D-079), e.g. an animation pack for a pack that has meshes only. Their clips are matched with the same rules, after the pack's own and before the fallback body, for the slots the pack leaves empty. Clips on another skeleton are retargeted onto the pack's (a skeletal mesh of their skeleton is the source), like the fallback. |
Borrowed Clips in Place (bBorrowedClipsInPlace) | bool | Animations | Clips taken from other folders and retargeted play in place (root motion enabled, the root's travel is extracted): attack packs often lunge metres forward through the root, which would pull the body away from the unit and snap it back. Battle presentations do the travel (Move cues, D-079); locomotion speeds are measured before. |
Measure Strikes (bMeasureStrikes) | bool | Animations | Attacks and abilities without a hit notify (D-079): the hit frame is measured from the clip, the moment the right hand (Appearance.Anchor.HandRight) is furthest forward, and melee attacks get their contact reach from it (the attacker then stops where the blow lands on the target's body). Off = Default Impact Fraction and the fixed melee stop distance. |
Strip Borrowed Effect Notifies (bStripBorrowedEffectNotifies) | bool | Animations | Clips taken from other folders (Animation Source Folders, the fallback body) and retargeted lose their particle and trail notifies: those effects belong to the other pack's look (and many loop). Sounds stay. |
Character Animation Folders (CharacterAnimationFolders) | TArray<FDirectoryPath> | Animations | Folders (D-081) whose clips only animation rules with Characters may use: another pack's idles and stances given to chosen characters (a staff idle for the mages, a bow stance for the ranger) without the general rules picking them for everyone. Retargeted like Animation Source Folders. |
Default Impact Fraction (DefaultImpactFraction) | float | Animations | Hit frame of attack clips without such a notify, as a share of the clip (when the strike cannot be measured). |
Fallback Body Preset (FallbackBodyPreset) | FName | Animations | Body preset (Character Visuals -> Body Presets) whose animation set fills the required slots the pack lacks. |
Ignore Animations (IgnoreAnimations) | TArray<FRSEPackNamePattern> | Animations | Animations never used (additive poses, aim offsets, facial...). |
Impact Notifies (ImpactNotifies) | TArray<FRSEPackNamePattern> | Animations | Anim notifies of attack clips that mark the hit frame (the built montages get an RSEImpact notify there). |
Jog Speed (JogSpeed) | float | Animations | |
Min Root Motion Speed (MinRootMotionSpeed) | float | Animations | Clips whose root moves slower than this count as in place (their speed comes from the values above). |
Required Slots (RequiredSlots) | TArray<ERSEPackAnimSlot> | Animations | Slots that must play something: unmatched ones take the fallback body's animation (retargeted when needed), with a warning. |
Run Speed (RunSpeed) | float | Animations | |
Strike Window (StrikeWindow) | FVector2D | Animations | Measured strikes: the part of the hand's search window, as shares of the clip (the wind-up and follow-through are skipped). |
Walk Speed (WalkSpeed) | float | Animations | Speed (cm/s) of walk / jog / run clips without root motion, for the generated blend space. |
Weapon Reach Share (WeaponReachShare) | float | Animations | Measured melee reach: the share of the held weapon's length added to the hand's reach (the blade meets the body). |
Character Classes (CharacterClasses) | TArray<FRSEPackCharacterClass> | Character Data | Pack characters that get a character data asset (a class and a role), ready for a party or an encounter. |
Body Slot (BodySlot) | FGameplayTag | Characters | Part slot of the body (the leader mesh) on the generated looks. |
Capsule Half Height Ratio (CapsuleHalfHeightRatio) | float | Characters | Capsule half height as a share of the height. |
Capsule Radius Ratio (CapsuleRadiusRatio) | float | Characters | Capsule radius as a share of the height (exploration character). |
Chest Height Ratio (ChestHeightRatio) | float | Characters | Chest height (where prompts and battle shots aim) as a share of the character's height. |
Default Skin Name (DefaultSkinName) | FString | Characters | Name of the skin whose mesh name is the character's name. |
Grouping (Grouping) | ERSEPackGrouping | Characters | --- Characters --- |
Ignore Meshes (IgnoreMeshes) | TArray<FRSEPackNamePattern> | Characters | Skeletal meshes that are not characters (proxies, LOD test meshes, cloth pieces). |
Mesh Yaw (MeshYaw) | float | Characters | Yaw of the mesh relative to the actor (meshes that face +Y, like the UE mannequin: -90). |
Name Affixes (NameAffixes) | TArray<FString> | Characters | Prefixes and suffixes removed from skeleton and mesh names to name characters and skins ("SK_", "_Skeleton"...). |
Target Height (TargetHeight) | float | Characters | Scales characters to this height (cm). 0 = keep the pack's size. |
Color Mode (ColorMode) | ERSEPackColorMode | Colors | |
Color Variants (ColorVariants) | TArray<FRSEPackColorVariant> | Colors | Color variants made for every skin (empty = none). |
Hue Parameters (HueParameters) | TArray<FName> | Colors | Scalar parameters that turn the hue (0..1 of a turn). |
Saturation Parameters (SaturationParameters) | TArray<FName> | Colors | Scalar parameters scaled by the variant's saturation. |
Tint Parameters (TintParameters) | TArray<FName> | Colors | Vector parameters that tint a material (their color is hue-shifted and multiplied). |
Animation Word Aliases (AnimationWordAliases) | TMap<FString,FString> | Effects | Extra words an animation word stands for when pairing effects, for packs whose effects are named after what an ability does while its animations are named after its key (e.g. "rmb" -> "StaffExtend Poke", "q" -> "GroundSlam"). Keys are lower-case animation words; values are words (any case, space or underscore separated). |
Use Character Default Effects (bUseCharacterDefaultEffects) | bool | Effects | An attack without paired effects takes the character's first effect of each role (impact, whoosh). |
Effect Rules (EffectRules) | TArray<FRSEPackEffectRule> | Effects | Roles of the pack's particle systems and sounds, tried in order. |
Generic Name Tokens (GenericNameTokens) | TArray<FString> | Effects | Name tokens ignored when pairing effects and sounds with an animation (words every asset has: Attack, Ability, FX, the prefixes...). What is left (e.g. "Q", "Primary", "Slam") must be shared for a pairing. |
Role Anchors (RoleAnchors) | TMap<ERSEPackEffectRole,FGameplayTag> | Effects | Anchor each role spawns at on the caster (impacts go on the target). |
Description (Description) | FText | Profile | |
Auto Grip (bAutoGrip) | bool | Weapons | Computes how each weapon is held (D-079), for packs whose skeletons have no weapon sockets: the grip (the handle end of the weapon's long axis) goes into the palm (between the hand bone and its finger bones, in the reference pose), the tip points forward out of the fist with the blade's flat side up; shields lie flat side out along the forearm. The result is the look part's attach transform (editable data). Off = the rule's Offset only. |
Grip Reference (GripReference) | FRSEPackGripReference | Weapons | Right-hand weapons point along this reference's weapon line (borrowed animations); unset = out of the fist, forward. |
Grip Share (GripShare) | float | Weapons | Weapons whose pivot is not at an end (staffs, spears): held at this share of their length from the handle end. |
Palm Share (PalmShare) | float | Weapons | The palm point: this share of the way from the hand bone to its finger bones. |
Weapon Rules (WeaponRules) | TArray<FRSEPackWeaponRule> | Weapons | Weapon and prop meshes (static or skeletal) attached to the looks. Characters whose weapon is in the body mesh need none. |
URSEClassData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A fixed character class (no job changes, see CLAUDE.md 2.2): stat growth, innate affinities, and later its ability list.
| Property | Type | Category | Description |
|---|---|---|---|
Abilities (Abilities) | TArray<FRSEClassAbility> | Abilities | Abilities learned by level. |
Command Menu (CommandMenu) | TSoftObjectPtr<URSECommandMenuLayout> | Abilities | Battle command menu of this class (D-065). Empty = Project Settings -> Command Menu -> Default Layout. |
Class Tag (ClassTag) | FGameplayTag | Class | |
Allowed Equipment Types (AllowedEquipmentTypes) | FGameplayTagContainer | Equipment | Kinds of equipment the class may use (Equip.Type.*; parent tags allow all children). |
Bag Size (BagSize) | FIntPoint | Equipment | Per Character inventory (D-143): the bag size of this class's characters (columns x rows). 0 = Inventory Rules -> Bag. |
Growth Plan (GrowthPlan) | TObjectPtr<URSEGrowthPlan> | Progression | How the class grows beyond its levels (D-144): point tables and ability catalog (Classic + Points), Growth Board, learning from enemies. Empty = Project Settings -> Progression Systems -> Default Plan. The level abilities above stay in every system. |
Affinities (Affinities) | TArray<FRSEElementAffinityEntry> | Stats | Innate elemental affinities of the class. |
Granted Tags (GrantedTags) | FGameplayTagContainer | Stats | Innate traits of the class (Trait.*, e.g. Trait.Move.Levitate for a flying class). |
Stat Growth (StatGrowth) | TMap<FGameplayTag,FRSEStatGrowth> | Stats | Stat values by level. Stats not listed are zero unless a modifier adds them. |
URSECodeLockData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A code lock (D-039): digits, symbols or clock hands.
| Property | Type | Category | Description |
|---|---|---|---|
Kind (Kind) | ERSECodeLockKind | Lock | |
Length (Length) | int32 | Lock | Number of wheels (Digits, Symbols). |
Max Attempts (MaxAttempts) | int32 | Lock | Wrong codes allowed each time the lock is opened (0 = unlimited). After the last one the lock closes (LockoutEffects). |
Minute Step (MinuteStep) | int32 | Lock | Minutes per step of the minute hand (ClockHands). |
Prompt (Prompt) | FText | Lock | Shown above the wheels ("Set the hands to the hour of the founding."). |
Solution (Solution) | TArray<int32> | Lock | The code, one value per wheel: Digits 0-9; Symbols = index in Symbols; ClockHands = { hour 1-12, minute 0-59 } (the minute must be a multiple of MinuteStep). |
Solved Puzzle (SolvedPuzzle) | FGameplayTag | Lock | Marked solved on success; a solved lock does not open again. Optional. |
Symbols (Symbols) | TArray<FText> | Lock | The alphabet of a Symbols lock (e.g. moon, sun, star). |
Failure Effects (FailureEffects) | FRSEEffectList | Outcome | Run on every wrong code. |
Failure Text (FailureText) | FText | Outcome | Shown in the lock screen after a wrong code. |
Lockout Effects (LockoutEffects) | FRSEEffectList | Outcome | Run when the last attempt fails (MaxAttempts). |
Lockout Lines (LockoutLines) | TArray<FText> | Outcome | Narrator lines after a lockout. |
Success Effects (SuccessEffects) | FRSEEffectList | Outcome | |
Success Lines (SuccessLines) | TArray<FText> | Outcome | Narrator lines after the lock opens. |
URSECombatRoleRegistry
Module RSECore, parent UPrimaryDataAsset, primary asset. Asset -> combat role, kept in the project (D-093).
| Property | Type | Category | Description |
|---|---|---|---|
Assignments (Assignments) | TMap<FSoftObjectPath,FRSECombatRoleAssignment> | Combat Roles | Asset path -> its role. |
URSECommandMenuLayout
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The battle command menu of classic battles (D-065): the top-level commands in order and how abilities are sorted into them.
| Property | Type | Category | Description |
|---|---|---|---|
Class Overrides (ClassOverrides) | TArray<FRSECommandMenuClassOverride> | Commands | Per-class renames and hidden commands (the first override whose class matches). |
Entries (Entries) | TArray<FRSECommandMenuEntry> | Commands |
URSECompanionRadialStyle
Module RSE, parent URSEBattleMenuStyle_Radial, primary asset. D-148: the companion radial's look: the battle radial (D-122 / D-128) at full size with the names on the slices (no quick ring: the game waits while it is open).
URSEConsumableData
Module RSECore, parent URSEItemData, primary asset. An item used up on use: potions, bombs, cures.
| Property | Type | Category | Description |
|---|---|---|---|
Usable in Battle (bUsableInBattle) | bool | Consumable | |
Use Ability (UseAbility) | TObjectPtr<URSEAbilityData> | Consumable | What using the item does, with its Tactics (range, area, AP cost) and ATB (scope) rules. |
URSEDialogData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A dialog (dialog-proposal.md 4.1): a graph of instanced nodes linked by NodeId.
| Property | Type | Category | Description |
|---|---|---|---|
Skippable (bSkippable) | bool | Dialog | The whole scene can be skipped (e.g. on a second viewing). Skipping stops at choices. |
Track History (bTrackHistory) | bool | Dialog | Save visited nodes and chosen options (needed by once-only / already-chosen options and history conditions). |
Entry Node (EntryNode) | FName | Dialog | The first node. |
Nodes (Nodes) | TArray<TObjectPtr<URSEDialogNode> > | Dialog | |
Participants (Participants) | FGameplayTagContainer | Dialog | Speakers of this dialog (validation and portrait preloading). |
Presentation (Presentation) | FGameplayTag | Dialog | Dialog.Presentation.* (empty = Box). Bark dialogs cannot have choices; Battle dialogs cannot start battles. |
Scene Title (SceneTitle) | FText | Dialog | Title card of a Cinematic scene ("Meanwhile, at the harbor..."). |
URSEDocumentData
Module RSECore, parent URSEItemData, primary asset. A readable note, letter or book.
| Property | Type | Category | Description |
|---|---|---|---|
Pages (Pages) | TArray<FText> | Document |
URSEEmoteSet
Module RSE, parent URSEPrimaryDataAsset, primary asset. Emotes of a speaker (dialog-proposal.md 6.6): Emote.* -> montage + optional balloon.
| Property | Type | Category | Description |
|---|---|---|---|
Emotes (Emotes) | TMap<FGameplayTag,FRSEEmoteEntry> | Emotes |
URSEEncounterData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. One battle: mode, enemies, player deployment (D-018), objectives and AI intelligence bounds.
| Property | Type | Category | Description |
|---|---|---|---|
Intelligence (Intelligence) | float | AI | Enemy intelligence used until adaptive difficulty exists (Phase 9). |
Max Intelligence (MaxIntelligence) | float | AI | |
Min Intelligence (MinIntelligence) | float | AI | Bounds for adaptive difficulty (e.g. bosses never below a floor). |
Balance Role (BalanceRole) | ERSEEncounterBalanceRole | Balance | Kind of battle for "Balance My Campaign" (D-077): its win-rate band and party level. Auto = derived from the campaign. |
Battle Events (BattleEvents) | TArray<FRSEScriptedBattleEvent> | Battle Script | Scripted moments of the battle, in order: at a trigger the battle pauses, a unit says a line, the camera shows it, effects apply (reinforcements, an AI profile, statuses, a surface, new objectives), then the battle goes on. |
Reinforcements (Reinforcements) | TObjectPtr<URSEReinforcementData> | Battle Script | The enemies call for help during the battle (who calls, when, the waves). Also usable from a dialog-started battle. A spawner's own Reinforcements override it for its groups. |
Coop Alternative (CoopAlternative) | TSoftObjectPtr<URSEEncounterData> | Co-op | The Free Tactics encounter fought instead in co-op (Co-op Conversion = Alternative Encounter). |
Coop Conversion (CoopConversion) | ERSECoopBattleConversion | Co-op | What this encounter becomes while a session has more than one player (D-142: co-op is played live). Default = Co-op Rules -> Default Encounter Conversion (Free Tactics). Free Tactics encounters never change. |
Deployment Tiles (DeploymentTiles) | TArray<FRSEGridCoord> | Deployment | Tiles where the player may place units before the battle. |
Field Objects (FieldObjects) | TArray<FRSEFieldObjectPlacement> | Deployment | Tactics: walls, obstacles and explosive objects on the grid when the battle starts (D-055). |
Max Deployed Units (MaxDeployedUnits) | int32 | Deployment | |
Required Characters (RequiredCharacters) | TArray<TObjectPtr<URSECharacterData> > | Deployment | Characters that must take part (story). They are pre-selected and cannot be removed. |
Battle Mode (BattleMode) | FGameplayTag | Encounter | Battle.Mode.Tactics, FreeTactics, ATB, Turn or Action (real-time, D-171). Decided by content, never by the player. |
Can Flee (bCanFlee) | bool | Encounter | ATB only: the party may try to flee (disable for bosses and story battles). |
Defeat Continues Story (bDefeatContinuesStory) | bool | Encounter | Story battles the party may lose (D-031): defeat shows no game over. Fallen members get back on their feet (Party settings, DefeatRecoveryHP*) and the game goes on. |
Fixed Level (FixedLevel) | int32 | Levels | Fixed mode: level of every enemy whose own Level is 0 (0 = the characters' starting levels). |
Keep Up with Party Gap (KeepUpWithPartyGap) | int32 | Levels | Fixed mode (D-120): with an overlevelled party, every enemy rises by the same amount (their gaps kept) so that Fixed Level (or the highest enemy level when it is 0) stays at least the party level minus this many levels. -1 = off: the fixed levels, whatever the party's level. For a boss that must stay a real fight however the party got there; at the intended level nothing changes. |
Level Mode (LevelMode) | ERSEEncounterLevelMode | Levels | Scaled (regular battles) or Fixed (story key battles, epic quest bosses, ultra bosses). |
Progression Zone (ProgressionZone) | TObjectPtr<URSEProgressionZoneData> | Levels | Scaled mode: the zone whose level range applies. Empty = the zone of the area the player is in (URSEAreaData::ProgressionZone). |
Scaled Level Offset (ScaledLevelOffset) | int32 | Levels | Scaled mode: levels added to the scaled level before the zone's range clamps it (e.g. +2 for an elite group). |
Allow Mode Override (bAllowModeOverride) | bool | Mode Override | A session's Battle Mode Override (demo menus, test tools, showcase captures) may fight this encounter in another mode. Turn it off for scripted battles that only work in their own mode. The encounter's mode report lists the modes its data can run in. |
Mode Rules Profiles (ModeRulesProfiles) | TMap<FGameplayTag,TObjectPtr<URSERulesProfile> > | Mode Override | Rules profile per battle mode (e.g. the real-time timing rules when it is fought in Action, a slower ATB): used instead of Rules Profile when the encounter is fought in that mode. Empty entries = Rules Profile. |
Override Modes (OverrideModes) | FGameplayTagContainer | Mode Override | The modes an override may fight it in. Empty = every mode its data supports. |
Defeat Conditions (DefeatConditions) | TArray<TObjectPtr<URSEBattleCondition> > | Objectives | Any of these met = defeat. Losing every player unit is always a defeat. |
Victory Conditions (VictoryConditions) | TArray<TObjectPtr<URSEBattleCondition> > | Objectives | Any of these met = victory. Empty = defeat every other team. |
Battle Music (BattleMusic) | TSoftObjectPtr<UObject> | Presentation | Music of this battle (a sound asset), instead of the mode / boss music of the Audio settings (D-036). Typed loosely because RSECore knows nothing about audio; the presentation plays it. |
Intro Text (IntroText) | FText | Presentation | Text of the battle's intro banner ("The Fortress Golem!", D-083). Empty = Battle Transition settings: Preemptive! / Back Attack! when someone struck first, else the encounter's name (Use Encounter Name) or "Battle!". |
Transition Style (TransitionStyle) | ERSEBattleTransitionStyle | Presentation | Screen transition into this battle (D-083). Default = Battle Transition settings, per battle mode. |
Encounter Loot (EncounterLoot) | FRSELoot | Rewards | Money and drops of the encounter itself (D-042), rolled on victory after the enemies' loot tables. |
Loot Rule (LootRule) | TSoftClassPtr<URSELootDistributionRule> | Rewards | Per Character inventory (D-143): who receives this encounter's rewards and drops (a boss whose loot goes to the stash, to the leader...). Empty = Inventory Rules -> Distribution Rule. |
Reward Items (RewardItems) | TMap<TObjectPtr<URSEItemData> ,int32> | Rewards | Items the party receives on victory (shown on the results screen). Experience comes from the enemies. |
Victory Effects (VictoryEffects) | FRSEEffectList | Rewards | Run when a battle of this encounter started from exploration is won (D-081), after the rewards: a story flag, a quest objective, an unlocked area. Not run on a defeat, a flight or in the battle simulator. |
Rules Profile (RulesProfile) | TObjectPtr<URSERulesProfile> | Rules | Rules profile of this battle (e.g. a boss profile). Empty = the game's active profile. The battle keeps the profile it started with, whatever the story switches meanwhile. |
Enemies from Scene (bEnemiesFromScene) | bool | Teams | The enemies come from the scene (a dialog's Start Battle with Scene NPCs Fight or Combatants, D-109), so the Enemies list may stay empty. |
Enemies (Enemies) | TArray<FRSEEncounterUnit> | Teams | |
Enemy Items (EnemyItems) | TMap<TObjectPtr<URSEConsumableData> ,int32> | Teams | The enemy team's item pouch (D-024): what its units may use, and how many. |
Enemy Team (EnemyTeam) | FGameplayTag | Teams | |
Player Team (PlayerTeam) | FGameplayTag | Teams |
URSEEncounterPoolData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The enemies a zone's random battles are made of (D-063, docs/design/random-encounters.md): every battle composes a new group from the weighted entries, with levels that follow the progression zone (D-051).
| Property | Type | Category | Description |
|---|---|---|---|
Battle Mode (BattleMode) | FGameplayTag | Battle | Battle.Mode.ATB (default when empty) or Battle.Mode.Turn. Classic modes only: Tactics battles are never random. |
Battle Music (BattleMusic) | TSoftObjectPtr<UObject> | Battle | Music of these battles (a sound asset); empty = the Audio settings' battle music. |
Can Flee (bCanFlee) | bool | Battle | |
Encounter Loot (EncounterLoot) | FRSELoot | Battle | Money and drops of every group of this pool, rolled on victory after the enemies' loot tables. |
Enemy Team (EnemyTeam) | FGameplayTag | Battle | |
Intelligence (Intelligence) | float | Battle | |
Max Intelligence (MaxIntelligence) | float | Battle | |
Min Intelligence (MinIntelligence) | float | Battle | |
Player Team (PlayerTeam) | FGameplayTag | Battle | Empty = the Encounters settings' Default Player Team / Default Enemy Team. |
Reinforcements (Reinforcements) | TObjectPtr<URSEReinforcementData> | Battle | D-117: the groups of this pool call for help in their battles (every composed encounter gets it). |
Rules Profile (RulesProfile) | TObjectPtr<URSERulesProfile> | Battle | Rules profile of these battles (empty = the game's active profile). |
Victory Effects (VictoryEffects) | FRSEEffectList | Battle | Run when a group of this pool is beaten (D-081): e.g. a flag for "the road's warband is gone". Every composed encounter gets them. |
Elite (Elite) | FRSEEncounterEliteRules | Pool | |
Entries (Entries) | TArray<FRSEEncounterPoolEntry> | Pool | |
Group Size Max (GroupSizeMax) | int32 | Pool | |
Group Size Min (GroupSizeMin) | int32 | Pool | Enemies per group (random between the two). |
Progression Zone (ProgressionZone) | TObjectPtr<URSEProgressionZoneData> | Pool | The zone whose level range applies. Empty = the zone of the area the player is in (URSEAreaData::ProgressionZone). |
URSEEndingSetData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The ending layer (D-027): which ending the story reaches.
| Property | Type | Category | Description |
|---|---|---|---|
Default Ending (DefaultEnding) | FGameplayTag | Endings | Reached when no ending's requirements pass. Must be one of Endings. |
Endings (Endings) | TArray<FRSEEndingDefinition> | Endings | Checked in order: put the most demanding ending first. |
Lock Ending at Point Of No Return (bLockEndingAtPointOfNoReturn) | bool | Point Of No Return | The ending is fixed when the point of no return is passed; later choices no longer change it. |
Point Of No Return Flag (PointOfNoReturnFlag) | FGameplayTag | Point Of No Return | Set when the player passes the point of no return (usually by confirming the warning). |
Point Of No Return Warning (PointOfNoReturnWarning) | FText | Point Of No Return | Shown by the confirmation the presentation opens before the point of no return. |
Key Choices (KeyChoices) | TArray<FRSEEndingKeyChoice> | Score | |
Score Variable (ScoreVariable) | FGameplayTag | Score | The hidden score (never shown to the player). |
URSEEnemyArchetype
Module RSECore, parent URSEArchetype, primary asset. Enemy type: its family class, AI profile, rewards and look (content: an enemy Character).
URSEEquipmentData
Module RSECore, parent URSEItemData, primary asset. Something a character wears or wields.
| Property | Type | Category | Description |
|---|---|---|---|
Action Weapon (ActionWeapon) | TObjectPtr<URSEActionWeaponData> | Action | Action battles (D-171): what the item does as a weapon there (combos, fire modes). Empty = not an action weapon. |
Two Handed (bTwoHanded) | bool | Equipment | Weapons only: also occupies the off-hand slot (bows, great staves). |
Equipment Type (EquipmentType) | FGameplayTag | Equipment | Kind of equipment (Equip.Type.*); classes list the kinds they may use. Worn, it is also a granted tag of the unit (e.g. shields let it block). |
Slot Type (SlotType) | FGameplayTag | Equipment | Which slots accept it (Equip.Slot.*). |
Appearance Part (AppearancePart) | TSoftObjectPtr<URSEAppearancePartBase> | Presentation | Optional visible piece while worn (D-046): a URSEAppearancePart that adds or replaces a part of the wearer's appearance (its slot decides which). Empty = the item does not change how the wearer looks. |
Weapon Presentation (WeaponPresentation) | TSoftObjectPtr<URSEWeaponPresentationBase> | Presentation | Weapons (D-184): how attacks with it look in every battle mode (a URSEWeaponPresentation: swing or fire animations, muzzle flash, tracers or projectiles, impacts per surface, trail, sounds, burst). Empty = the presentation of its Equipment Type (Project Settings -> RPG Saga Engine -> Weapon Presentation), else the default for the attack's approach. |
Worn Transform (WornTransform) | FTransform | Presentation | Adjustment of the Item Mesh when worn without an Appearance Part (D-126: grip, scale), in the wearer's grip frame at its slot's Attach Anchor (the body's Anchor Grips: grip at the origin, blade or shaft along +Z). Identity for meshes authored that way; a staff held part way up moves along Z. |
Affinities (Affinities) | TArray<FRSEElementAffinityEntry> | While Equipped | |
Bag Size Bonus (BagSizeBonus) | FIntPoint | While Equipped | Per Character inventory (D-143): extra bag columns (X) and rows (Y) while worn (a backpack, a belt with pouches). |
Carry Capacity Bonus (CarryCapacityBonus) | float | While Equipped | Per Character inventory with weight (D-143): extra carry capacity while worn. |
Granted Abilities (GrantedAbilities) | TArray<TObjectPtr<URSEAbilityData> > | While Equipped | Abilities usable while equipped. |
Granted Tags (GrantedTags) | FGameplayTagContainer | While Equipped | Traits such as status immunities. |
Mastery Abilities (MasteryAbilities) | TArray<FRSEMasteryAbility> | While Equipped | Equipment mastery (D-144): abilities usable while equipped that the wearer learns for good after earning their mastery points in won battles with the item (Progression Systems -> Mastery). Learned ones stay after the item is removed. |
Mastery Rate (MasteryRate) | float | While Equipped | Multiplies the mastery points earned with this item (1 = normal, 2 = learns twice as fast). |
Modifiers (Modifiers) | TArray<FRSEStatModifier> | While Equipped |
URSEEquipmentSlotSet
Module RSECore, parent UDataAsset. A preset of character equipment slots (D-126): the classic JRPG set (weapon, off-hand, head, body, two accessories) or the ARPG set (helmet, body armor, hands, legs, feet, main hand, off-hand, two accessories).
| Property | Type | Category | Description |
|---|---|---|---|
Description (Description) | FText | Slot Set | What the preset is for (shown in the Details panel). |
Off Hand Slot Id (OffHandSlotId) | FName | Slot Set | Slot a two-handed weapon also occupies (None = no off-hand). |
Slots (Slots) | TArray<FRSEEquipmentSlotDef> | Slot Set | The slots, in display order (the classic Equipment page lists them in this order). |
URSEExamineData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. What an object says when examined (D-039): a list of state-dependent responses (the first whose conditions pass) and an optional one-time pickup.
| Property | Type | Category | Description |
|---|---|---|---|
Pickup (Pickup) | FRSEExaminePickup | Examine | |
Responses (Responses) | TArray<FRSEExamineResponse> | Examine |
URSEFXTaxonomy
Module RSEEditor, parent UDataAsset. The effect taxonomy (D-087): elements and roles of particle systems and sounds, and the Dress My Abilities rules.
| Property | Type | Category | Description |
|---|---|---|---|
Attack Effects (AttackEffects) | TArray<FRSEDressFX> | Dress My Abilities | Dress My Abilities: effects of the characters' basic attack combos built from their style (impact, swing sound). |
Neutral Fallback (bNeutralFallback) | bool | Dress My Abilities | No effect of the ability's element for a role: take a neutral (element-less) one. |
Prefer Niagara (bPreferNiagara) | bool | Dress My Abilities | Prefer Niagara systems over legacy (Cascade) ones of the same confidence. |
Dress Rules (DressRules) | TArray<FRSEDressRule> | Dress My Abilities | Dress My Abilities: tried in order, the first rule an ability matches decides its effects and animation. |
Feel Roles (FeelRoles) | FRSEFeelRoles | Dress My Abilities | D-115: the roles that fill the battle feel slots of dressed looks (trail, cast, impact, projectile) and statuses. |
Min Pick Confidence (MinPickConfidence) | float | Dress My Abilities | Effects below this confidence are never picked automatically. |
Loop Flag (LoopFlag) | FGameplayTag | Flags | Flag a looping effect gets (empty = none). |
Include Sounds (bIncludeSounds) | bool | Rules | Scan sounds too (Sound Cues, MetaSounds, waves). |
Ignore Patterns (IgnorePatterns) | TArray<FRSEPackNamePattern> | Rules | Effects and sounds never offered (UI sounds, music, test systems). |
Rules (Rules) | TArray<FRSELibraryWordRule> | Rules | Word rules for elements, roles and flags. |
Confidence Softness (ConfidenceSoftness) | float | Scoring | |
Folder Weight (FolderWeight) | float | Scoring | |
Review Threshold (ReviewThreshold) | float | Scoring | |
Description (Description) | FText | Taxonomy | |
Roles (Roles) | TArray<FRSEFXRoleDef> | Taxonomy |
URSEFieldObjectData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A field object on the Tactics grid (D-055): a wall or barrier, a destructible obstacle, an explosive barrel.
| Property | Type | Category | Description |
|---|---|---|---|
Explodes when Destroyed (bExplodesWhenDestroyed) | bool | Explosion | --- Explosion --- |
Explosion Damage (ExplosionDamage) | float | Explosion | Fixed damage to every unit in the blast (before affinity). |
Explosion Damage Percent (ExplosionDamagePercent) | float | Explosion | Extra damage as a percent of each unit's max HP. |
Explosion Element (ExplosionElement) | FGameplayTag | Explosion | Element of the blast (affinities apply). |
Explosion Object Damage (ExplosionObjectDamage) | float | Explosion | Damage to other objects in the blast (chain reactions of barrels). |
Explosion Radius (ExplosionRadius) | int32 | Explosion | Tiles around the object (Manhattan) hit by the explosion. |
Explosion Status (ExplosionStatus) | TObjectPtr<URSEStatusData> | Explosion | Status applied to units in the blast (Burn...). |
Explosion Status Chance (ExplosionStatusChance) | float | Explosion | |
Leaves Zone (LeavesZone) | TObjectPtr<URSETileZoneData> | Explosion | Zone left on the blast's tiles (burning ground). Free Tactics: a surface on the blast's circle (D-108). |
Free Explosion Radius (FreeExplosionRadius) | float | Free Tactics | Free Tactics: blast radius in meters (0 = Explosion Radius tiles x Meters Per Tile, at least Free Tactics Field -> Min Explosion Radius). |
Free Height (FreeHeight) | float | Free Tactics | |
Free Radius (FreeRadius) | float | Free Tactics | Free Tactics: footprint radius and height when an ability places it (0 = Free Tactics Field -> Spawned Object Radius / Height). |
Blocks Line Of Sight (bBlocksLineOfSight) | bool | Object | |
Blocks Movement (bBlocksMovement) | bool | Object | |
Damage Taken Multiplier (DamageTakenMultiplier) | float | Object | Multiplies damage the object takes. |
Lifetime Turns (LifetimeTurns) | int32 | Object | Turns of the creator the object lasts (after it is gone: every unit's turn counts). 0 = permanent. |
Max HP (MaxHP) | float | Object | HP. 0 = indestructible. |
Object Tag (ObjectTag) | FGameplayTag | Object | |
Sight Height (SightHeight) | int32 | Object | How far above its tile the object blocks sight, in height steps. |
Color (Color) | FLinearColor | Presentation | Tint of the default look (when Visual is empty). |
Visual (Visual) | TSoftObjectPtr<URSEFieldVisualBase> | Presentation | How the object looks (soft; RSE's field visual asset). Empty = the Tactics presentation's default object look. |
URSEFieldVisualBase
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. How a zone or field object looks (D-055).
URSEFieldVisualData
Module RSE, parent URSEFieldVisualBase, primary asset. How a zone or field object looks on the Tactics grid (D-055).
| Property | Type | Category | Description |
|---|---|---|---|
Effect Scale (EffectScale) | float | Effects | Effect scale. |
End Effect (EndEffect) | TSoftObjectPtr<UNiagaraSystem> | Effects | One-shot effect when the zone ends / the object breaks (explosions). |
Loop Effect (LoopEffect) | TSoftObjectPtr<UNiagaraSystem> | Effects | Looping effect on each tile (fire, frost, poison fumes...). |
Spawn Effect (SpawnEffect) | TSoftObjectPtr<UNiagaraSystem> | Effects | One-shot effect when the zone appears / the object is placed. |
Material (Material) | TSoftObjectPtr<UMaterialInterface> | Look | Material of the mesh (a "Color" vector parameter is set to the zone / object color when present). |
Mesh (Mesh) | TSoftObjectPtr<UStaticMesh> | Look | Mesh per tile (zones: a flat plate; objects: the object). Empty = the settings' default. |
Mesh Scale (MeshScale) | FVector | Look | Mesh scale per tile (1 = the settings' tile-sized default). |
URSEFollowerProfile
Module RSECore, parent URSEPrimaryDataAsset, primary asset. How a party member follows and lives in exploration (D-129): its loose place in the formation and its idle behaviours.
| Property | Type | Category | Description |
|---|---|---|---|
Acceleration (Acceleration) | float | Feel | D-150: how quickly a member gets up to speed (cm/s², its movement's Max Acceleration while it follows). 0 = the character's own. |
Arrival Speed (ArrivalSpeed) | float | Feel | D-150: the slowest a braking member walks before it stands (cm/s). |
Braking Deceleration (BrakingDeceleration) | float | Feel | D-150: how gently a member stops (cm/s², its movement's walking braking deceleration and a light separate braking friction while it follows). 0 = the character's own. |
Braking Distance (BrakingDistance) | float | Feel | D-150: within this distance of its place (beyond the slack) a member slows down smoothly instead of stopping dead (cm). |
Member Spacing (MemberSpacing) | float | Feel | D-150: the least distance between two members (cm): their places are pushed apart to it, and they steer around each other's bodies (with Party Field -> Followers Avoid Each Other). Larger = a roomier party. |
Path Variation (PathVariation) | float | Feel | D-150: freer paths: a member far from its place aims up to this far to one side of the straight line (cm, its own side and amount), so the party does not file through the same line. |
Rank Start Delay (RankStartDelay) | float | Feel | D-150: each place further back in the formation starts this much later (seconds per place, on top of the member's own Reaction Delay): the party sets off one after another, never all on the leader's first step. |
Stop Slack (StopSlack) | FVector2D | Feel | D-150: once the leader stands, a member closer than this to its place stays where it is (cm, a new value in the range on every stop): no small shuffles to reach an exact spot. |
Trail Period (TrailPeriod) | float | Feel | D-150: how slowly a member's trailing distance changes (seconds per new value; longer = calmer). |
Trail Range (TrailRange) | FVector2D | Feel | D-150: while the leader walks each member trails its place by a distance of its own that changes slowly within this range (cm): some lag a little and catch up when the leader stops, nobody is glued to a slot. |
Urgent Distance (UrgentDistance) | float | Feel | D-150: farther than this from its place (cm) a member sets off at once, without its reaction delay (it was left far behind). Closer, even a member that has to catch up waits its delay first. |
Corridor Spread (CorridorSpread) | float | Formation | The formation's width in corridors (multiplies the slots' sideways offsets). |
Corridor Width (CorridorWidth) | float | Formation | Free width (cm) at and below which the formation is at its corridor width. |
Follow Lead Time (FollowLeadTime) | float | Formation | Members aim where their place will be this many seconds ahead while the leader walks (they keep up instead of reaching a place the leader already left; about two thinks). |
Leader Clearance (LeaderClearance) | float | Formation | Members never aim closer than this to the leader, nor into its path while it walks (cm). |
Leader Look Ahead (LeaderLookAhead) | float | Formation | How far ahead of a walking leader its path is kept clear (cm). |
Min Side Offset (MinSideOffset) | float | Formation | Members keep at least this sideways offset, alternating sides (cm): never a single-file line, even in corridors. |
Open Ground Spread (OpenGroundSpread) | float | Formation | The formation's width on open ground (multiplies the slots' sideways offsets). |
Open Ground Width (OpenGroundWidth) | float | Formation | Free width around the leader (cm, measured sideways) at which the formation is fully open. |
Reaction Delay (ReactionDelay) | FVector2D | Formation | Seconds before the member reacts when the leader starts walking (random between the two, per start and member). D-150: catching up waits too, unless the member is farther than Urgent Distance from its place. |
Slot Drift (SlotDrift) | float | Formation | How far the member's own place drifts around its formation slot (cm): followers never keep the exact slot. |
Slot Drift Period (SlotDriftPeriod) | float | Formation | How slowly the drift changes (seconds per new drift target; longer = calmer). |
Speed Variation (SpeedVariation) | float | Formation | The member's own pace: its walk and run speeds vary by up to this share (0.1 = 10% slower or faster, fixed per member). |
Spread Change Speed (SpreadChangeSpeed) | float | Formation | How quickly the formation widens or narrows when the space changes (higher = sooner). |
Also Party Behaviors (bAlsoPartyBehaviors) | bool | Idle | A character profile also uses the party profile's behaviours (after its own). Off: only its own. |
Behaviors (Behaviors) | TArray<TObjectPtr<URSEIdleBehavior> > | Idle | The idle behaviours and their weights. Order does not matter. |
Idle Life (bIdleLife) | bool | Idle | Members live while the leader stands still: stroll, look around, play idle animations (Behaviors). |
Idle Gap (IdleGap) | FVector2D | Idle | Seconds between two idle actions (random between the two). |
Idle Radius (IdleRadius) | float | Idle | Strolls and spots stay within this distance of the leader (cm). |
Idle Start Delay (IdleStartDelay) | FVector2D | Idle | Seconds the leader must stand still before a member starts its idle life (random between the two, per member). |
Repeat Weight (RepeatWeight) | float | Idle | The same behaviour twice in a row is this much less likely (1 = no penalty, 0 = never twice in a row when another can run). |
Stroll Speed (StrollSpeed) | float | Idle | Walking speed of strolls (cm/s; the member's pace applies). |
URSEFurnitureData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A piece of furniture (D-158): its mesh (or simple parts), its size and front, how it may be placed and what it does.
| Property | Type | Category | Description |
|---|---|---|---|
Furniture Tags (FurnitureTags) | FGameplayTagContainer | Furniture | What it is (Furniture.Bed, .Table, .Chair, .Light...): anchors, rules and the checker read them. |
Light (bLight) | bool | Light | A light of its own that is always on (a chandelier; interactable lights use their Interactable Data's look). |
Light Color (LightColor) | FLinearColor | Light | |
Light Intensity (LightIntensity) | float | Light | |
Light Offset (LightOffset) | FVector | Light | The light's place in the piece's space (cm). |
Light Radius (LightRadius) | float | Light | |
Fit Mesh to Size (bFitMeshToSize) | bool | Look | Mesh is fitted to Size (stretched to the footprint and height). Off: its own size, centred on the footprint. |
Symmetric (bSymmetric) | bool | Look | D-164: it looks the same whichever way it faces (a barrel, a round table, a candle): any facing is right. |
Front (Front) | ERSEFurnitureFront | Look | Which axis of Mesh is its front (beds: the foot end; wardrobes: their doors; chairs: where one sits facing). |
Mesh (Mesh) | TSoftObjectPtr<UStaticMesh> | Look | The prop (soft). Empty = Parts. |
Mesh Scale (MeshScale) | FVector | Look | Mesh's own scale (when not fitted). |
Parts (Parts) | TArray<FRSEFurniturePart> | Look | Placeholder look made of simple shapes (used when Mesh is empty). |
Anchor Tag (AnchorTag) | FGameplayTag | Placement | AroundAnchor / OnAnchor: the piece it goes with (Furniture.Table). |
Allowed at Windows (bAllowedAtWindows) | bool | Placement | D-164 / K4: it may stand in front of a window even when taller than the sill (a see-through screen, a plant stand). |
Blocks Movement (bBlocksMovement) | bool | Placement | It takes floor and blocks walking (off: rugs, things on walls and tables). |
Depth (Depth) | float | Placement | |
Front Clearance (FrontClearance) | float | Placement | Free floor kept in front of it (to stand at a bed, open a wardrobe, pull a chair out) (cm). |
Height (Height) | float | Placement | |
Mount Height (MountHeight) | float | Placement | WallMounted: the height of its bottom (cm). Ceiling: how far it hangs below the ceiling (cm). |
Placement (Placement) | ERSEFurniturePlacement | Placement | |
Side Clearance (SideClearance) | float | Placement | Free floor kept beside / around it (Center pieces: room for chairs and to walk around) (cm). |
Width (Width) | float | Placement | The footprint and height (cm): Width across its front, Depth from front to back, Height. |
Generated (bGenerated) | bool | Provenance | D-164: made by the Interior Kit Wizard (a re-run updates it; fields the designer changed are kept). |
Source Mesh (SourceMesh) | FSoftObjectPath | Provenance | D-164: the pack mesh this piece was made from (the kit scan's provenance; the wizard updates the asset while it still matches). |
Interactable (Interactable) | TObjectPtr<URSEInteractableData> | Use | What using it does (a chest, a bed to rest in, a book to read, a fireplace to light): it becomes an RSE World Interactable. Without a Mesh or Parts of its own it shows the interactable's look (a breakable pot keeps its broken look). |
Interactable Capacity (InteractableCapacity) | int32 | Use | D-161: how many interactables this spot holds: itself (when it is interactable) and whatever usable stands on it (a candle, a book on a table). 1 = one thing to use here; 0 = nothing usable on it. The generator respects it, the furniture checker reports more. |
Interaction Category (InteractionCategory) | FGameplayTag | Use | D-161: what kind of interaction it gives a house (Interior.Interaction.Read, .Loot, .Light, .Breakable, .Examine, .Rest, .Station, .QuestHook): interaction sets count and complete interiors by it. Empty = not counted. |
URSEGASAbilityMap
Module RSEGAS, parent UDataAsset. RSE abilities -> GAS triggers (D-169).
| Property | Type | Category | Description |
|---|---|---|---|
Rows (Rows) | TArray<FRSEGASAbilityRow> | Abilities |
URSEGASAttributeMap
Module RSEGAS, parent UDataAsset. RSE stats and resources <-> GAS attributes (D-169).
| Property | Type | Category | Description |
|---|---|---|---|
Rows (Rows) | TArray<FRSEGASAttributeRow> | Attributes |
URSEGASStatusMap
Module RSEGAS, parent UDataAsset. RSE statuses <-> GAS tags and Gameplay Effects (D-169).
| Property | Type | Category | Description |
|---|---|---|---|
Rows (Rows) | TArray<FRSEGASStatusRow> | Statuses |
URSEGameFoundation
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The Game Foundation (D-095, docs/design/studio.md section 5): the bottom layer of a game, built bottom-up in the Studio's foundation wizard.
| Property | Type | Category | Description |
|---|---|---|---|
Terms (Terms) | TArray<FRSEFoundationTerm> | 1. Vocabulary | --- 1. Vocabulary --- |
Starter Content (StarterContent) | FRSEFoundationStarterContent | 10. Starter Content | Content made for this foundation, offered when it is applied (D-100). Empty for Empty and for your own foundations. |
Attributes (Attributes) | TArray<FRSEAttributeDefinition> | 2. Stats and Resources | The attributes (written into the attribute registry). Stat.Speed is required; Tactics also needs Stat.ActionPoints and Stat.Jump. |
Resources (Resources) | TArray<FRSEResourceDefinition> | 2. Stats and Resources | The resources (Resource.HP, the life resource, is required). |
Formulas (Formulas) | FRSEFoundationFormulas | 3. Combat Formulas | --- 3. Combat formulas --- |
Affinity Multipliers (AffinityMultipliers) | TMap<ERSEElementAffinity,float> | 4. Elements | Damage multiplier per affinity (the weakness table). Empty = keep the current one. |
Elements (Elements) | TArray<FRSEFoundationTagEntry> | 4. Elements | Elements / damage types (Element.*). May be empty (no elemental damage). |
Equipment Slots (EquipmentSlots) | TArray<FRSEEquipmentSlotDef> | 5. Equipment and Items | --- 5. Equipment and items --- |
Equipment Types (EquipmentTypes) | TArray<FRSEFoundationTagEntry> | 5. Equipment and Items | Equipment kinds classes may use (Equip.Type.*): firearms, blades, implants... |
Inventory Mode (InventoryMode) | ERSEInventoryMode | 5. Equipment and Items | How the party carries its items (D-143), written into Inventory Rules -> Mode: Shared (one party grid: JRPG, ATB, Tactics) or Per Character (a bag per member, a stash at save points: live / Free Tactics games). It can be switched later both ways. |
Item Categories (ItemCategories) | TArray<FRSEFoundationTagEntry> | 5. Equipment and Items | Item categories (Item.Category.*) for inventory tabs. |
Off Hand Slot Id (OffHandSlotId) | FName | 5. Equipment and Items | Slot a two-handed weapon also occupies (None = no off-hand). |
Ability Categories (AbilityCategories) | TArray<FRSEFoundationTagEntry> | 6. Abilities and Command Menu | Ability categories (Ability.Type.*). |
Command Menu (CommandMenu) | TArray<FRSECommandMenuEntry> | 6. Abilities and Command Menu | The classic battle command menu (written into the project's default layout). |
Battle Modes (BattleModes) | FRSEFoundationBattleModes | 7. Battle Modes | --- 7. Battle modes --- |
Progression (Progression) | FRSEFoundationProgression | 8. Progression | --- 8. Progression --- |
Economy (Economy) | FRSEFoundationEconomy | 9. Economy | --- 9. Economy --- |
Suggested Replacements (SuggestedReplacements) | TMap<FGameplayTag,FGameplayTag> | Change Safety | Replacements proposed when content made for another foundation names tags this one drops (Resource.MP -> Resource.Energy, Element.Fire -> Element.Plasma). The breaking-change report uses them first. |
Description (Description) | FText | Info | What the preset is for, shown on its card in the Studio. |
Sort Order (SortOrder) | int32 | Info | Order among presets (lower first). |
Thumbnail (Thumbnail) | TSoftObjectPtr<UTexture2D> | Info | |
UIStyle Id (UIStyleId) | FName | Info | The UI Style (Style Id of a DA_UIStyle_*: Gothic, Holo, Brass, Tactical...) that fits this preset (D-162 P64). Applying the foundation in the Studio makes it the project's default UI style (UI Theme -> Default Style). None = leave the style alone. Just an id: RSECore does not know UI styles. |
URSEGrowthBoard
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A Growth Board (D-144): nodes and edges the player unlocks with board points, from a start node, each new node next to an open one.
| Property | Type | Category | Description |
|---|---|---|---|
Edges (Edges) | TArray<FRSEGrowthEdge> | Board | |
Nodes (Nodes) | TArray<FRSEGrowthNode> | Board | |
Generator Class (GeneratorClass) | TSoftObjectPtr<URSEClassData> | Generator | The class the board was last generated from (the editor's Layout menu regenerates from it). |
Generator Seed (GeneratorSeed) | int32 | Generator | Seed and inputs of the last Generate Board (re-runnable). |
Edge Shape (EdgeShape) | ERSEGrowthEdgeShape | Look | Straight or curved edges (FromStyle = the style's choice). The layout check uses the same shape. |
Layout Preset (LayoutPreset) | ERSEGrowthLayoutPreset | Look | The layout preset the board was generated with (the editor's Layout menu switches it). Informative for hand-made boards. |
Regions (Regions) | TArray<FRSEGrowthRegion> | Look | Themed regions (D-149): the screen tints their part of the board and writes their names. |
Style (Style) | TSoftObjectPtr<URSEGrowthBoardStyle> | Look | Look and vocabulary. Empty = Progression Systems -> Default Board Style. |
Character Start Nodes (CharacterStartNodes) | TMap<TSoftObjectPtr<URSECharacterData> ,FName> | Start | Start node per character (overrides the class). |
Class Start Nodes (ClassStartNodes) | TMap<FGameplayTag,FName> | Start | Start node per class tag (shared boards: each class enters from its own side). |
Default Start Node (DefaultStartNode) | FName | Start | Where characters start when nothing more specific applies. |
URSEGrowthBoardStyle
Module RSECore, parent URSEPrimaryDataAsset, primary asset. How a Growth Board looks in game (D-144): its vocabulary, colors and node art.
| Property | Type | Category | Description |
|---|---|---|---|
Backdrop (Backdrop) | TSoftObjectPtr<UTexture2D> | Art | Optional full-screen backdrop behind the board. |
Backdrop Layers (BackdropLayers) | TArray<FRSEGrowthBackdropLayer> | Art | Layers behind the board, back to front (parallax, starfields, textures). |
Center Light Color (CenterLightColor) | FLinearColor | Art | A soft light behind the board's center (vignette from Background Color). |
Nebula Clouds (NebulaClouds) | TArray<FRSEGrowthNebulaCloud> | Art | Soft colored clouds behind the board (depth). Empty = Growth UI -> Board -> Nebula Clouds. |
Node Icons (NodeIcons) | TMap<ERSEGrowthNodeKind,TSoftObjectPtr<UTexture2D> > | Art | Optional art per kind (drawn inside the node). |
Available Glow Color (AvailableGlowColor) | FLinearColor | Colors | Nodes the character can unlock now. |
Background Color (BackgroundColor) | FLinearColor | Colors | |
Color Mode (ColorMode) | ERSEGrowthBoardColorMode | Colors | P65: the colors below are the board in the reference UI style (Classic). Follow UI Style (default) moves them with the active UI style's tokens; Fixed keeps them exactly. |
Edge Closed Color (EdgeClosedColor) | FLinearColor | Colors | |
Edge Open Color (EdgeOpenColor) | FLinearColor | Colors | Edges between two unlocked nodes. |
Locked Node Color (LockedNodeColor) | FLinearColor | Colors | |
Node Colors (NodeColors) | TMap<ERSEGrowthNodeKind,FLinearColor> | Colors | Node fill per kind (missing kinds use Locked Node Color). |
Edge Flow Seconds (EdgeFlowSeconds) | float | Light | Light that runs along open paths (seconds per pass; 0 = none). |
Edge Glow Color (EdgeGlowColor) | FLinearColor | Light | Glow around open paths: color and width in pixels (0 = no glow). |
Edge Glow Width (EdgeGlowWidth) | float | Light | |
Edge Width (EdgeWidth) | float | Light | Edge thickness in pixels at zoom 1. |
Kind Halo Extent (KindHaloExtent) | float | Light | D-154: how far the kind halos reach, in node sizes beyond the node. |
Kind Halos (KindHalos) | TMap<ERSEGrowthNodeKind,FLinearColor> | Light | D-154: a soft, constant halo per node kind (the keystones' subtle gold glow), drawn behind the node whether open or not. Alpha = strength; missing or transparent = none. |
Open Node Glow (OpenNodeGlow) | float | Light | Unlocked nodes glow in their kind color (halo alpha). |
Pulse Scale (PulseScale) | float | Light | |
Pulse Seconds (PulseSeconds) | float | Light | "Available next" pulse: seconds per cycle and how far the halo grows (share of the node size). |
Marker Color (MarkerColor) | FLinearColor | Marker | Where the character stands (travel cost): marker color and optional icon. |
Marker Icon (MarkerIcon) | TSoftObjectPtr<UTexture2D> | Marker | |
Curved Edges (bCurvedEdges) | bool | Shape | Edges drawn as gentle curves (roots, vines) instead of straight lines (constellations, circuits). |
Round Nodes (bRoundNodes) | bool | Shape | Nodes drawn as circles (stars, knots) instead of rounded squares (sockets). |
Node Scales (NodeScales) | TMap<ERSEGrowthNodeKind,float> | Shape | Size multiplier per node kind. Missing = 1. D-154: the starter looks keep every kind at 1 (one base size at any zoom); shape, color and Kind Halos tell the kinds apart. |
Node Shapes (NodeShapes) | TMap<ERSEGrowthNodeKind,ERSEGrowthNodeShape> | Shape | Outline per node kind (missing kinds: circle when Round Nodes, else square). |
Node Size (NodeSize) | float | Shape | Node size in board units (1 unit = one grid step of the board's positions). |
Tier Ring Colors (TierRingColors) | TArray<FLinearColor> | Shape | Ring color per node tier (FRSEGrowthNode::Tier: 0 common .. 3 rare), like item rarity. Missing tiers: no ring. |
Board Term (BoardTerm) | FText | Vocabulary | What the board is called on screen ("Constellation", "Roots", "Circuit"). DisplayName names the style itself. |
Kind Names (KindNames) | TMap<ERSEGrowthNodeKind,FText> | Vocabulary | Names of the node kinds on screen (legend, tooltips). Missing = the engine's words. |
Node Term (NodeTerm) | FText | Vocabulary | What a node is called ("Star", "Knot", "Socket"). |
Points Term (PointsTerm) | FText | Vocabulary | What the board points are called ("Starlight", "Sap", "Charge"). |
Unlock Verb (UnlockVerb) | FText | Vocabulary | The verb on the unlock button ("Ignite", "Grow", "Wire"). |
URSEGrowthPlan
Module RSECore, parent URSEPrimaryDataAsset, primary asset. How one class grows beyond its levels (D-144): the point tables and ability catalog of Classic + Points, its Growth Board, and the optional ways it learns (from enemies).
| Property | Type | Category | Description |
|---|---|---|---|
Board (Board) | TObjectPtr<URSEGrowthBoard> | Board | This class's board. Empty = the shared board (Progression Systems -> Board Scope) or none. |
Generator Seed (GeneratorSeed) | int32 | Generator | Seed of the last Generate Point Tables (re-runnable). |
Enemy Learning (EnemyLearning) | TArray<FRSEEnemyLearningRule> | Learning | Learn abilities from enemies (blue magic style, in our own words: "Mimic"). Empty = never (unless a trait allows it). |
Ability Catalog (AbilityCatalog) | TArray<FRSEPointsAbility> | Points | Abilities bought with ability points (active and passive), with prerequisites. |
Attributes (Attributes) | TArray<FRSEAttributeAllocation> | Points | The key attributes the player may raise, with their price and caps. |
Point Grants (PointGrants) | TArray<FRSEPointsGrant> | Points | Points earned by level, per currency (attribute and ability points; board points for the board system). |
URSEHeroArchetype
Module RSECore, parent URSEArchetype, primary asset. Hero class archetype: role, stats and growth, abilities by level, allowed equipment, command menu (content: a Class).
URSEInteractableData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A kind of interactable (D-150): what it does (Behavior), who may use it (Use Conditions), what it also runs (Effects), its look, icon and prompt, and where the Populate Interactions tool may put it.
| Property | Type | Category | Description |
|---|---|---|---|
Behavior (Behavior) | TObjectPtr<URSEInteractableBehavior> | Interactable | |
Effects (Effects) | FRSEEffectList | Interactable | Run after every successful use (a flag, a quest objective, a tutorial). |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Interactable | The icon (map, prompt, Studio). |
Kind Tag (KindTag) | FGameplayTag | Interactable | The kind (Interactable.Kind.*): the map icon, the Populate tool and the Studio group by it. |
Prompt (Prompt) | FText | Interactable | The prompt's action; empty = the behaviour's ("Open", "Light", "Read"). |
Use Conditions (UseConditions) | FRSEConditionSet | Interactable | The prompt (and the use) is there only while these pass. |
Look (Look) | FRSEInteractableLook | Look | |
Placement (Placement) | FRSEInteractablePlacement | Placement | |
Reactive Tags (ReactiveTags) | FGameplayTagContainer | Reactions | D-157: what it reacts to when an ability is used on the world (World.Reactive.*: Light, Flammable, Water, Fog). The World Reactions rules (Project Settings -> RPG Saga Engine -> World Reactions) decide what an ability does to it. Empty = nothing. |
Visibility (Visibility) | FRSEInteractableVisibility | Visibility | D-157: how it shows itself before use (highlight, hint, sparkle, map icon). |
URSEInteractionData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A scripted interaction: conditions + effects.
| Property | Type | Category | Description |
|---|---|---|---|
One Shot (bOneShot) | bool | Interaction | Succeeds only once; the narrative state remembers it by this asset's path. When several level objects share one asset but each must be one-shot (e.g. identical chests), give each its own asset or gate it with its own flag instead. |
Completed Effects (CompletedEffects) | FRSEEffectList | Interaction | Runs on later attempts of a completed one-shot interaction. |
Conditions (Conditions) | FRSEConditionSet | Interaction | |
Effects (Effects) | FRSEEffectList | Interaction | |
Failed Effects (FailedEffects) | FRSEEffectList | Interaction | Runs when Conditions fail. |
Bark Pools (BarkPools) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | NPC | D-157: the lines of NPCs that use this interaction (an NPC Type's small talk, a guard's calls), after the NPC's own pools and before the project's default pools (Barks settings). |
Schedule (Schedule) | TSoftObjectPtr<URSENPCScheduleData> | NPC | Living NPCs (D-104): the day of an NPC that uses this interaction (a shopkeeper's hours, an innkeeper's evenings). NPC Types (archetypes) give it to every NPC made from them; an NPC's own Living NPC component schedule wins. |
URSEInteriorData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A separate interior (D-150): which map, where the party appears, when it is open and what it needs.
| Property | Type | Category | Description |
|---|---|---|---|
Closed Phases (ClosedPhases) | FGameplayTagContainer | Access | Closed during these phases of the day (Time.Phase.Night: a shop closed at night). Empty = always open. |
Closed Text (ClosedText) | FText | Access | Said when it is closed / locked (empty = the settings' texts). |
Conditions (Conditions) | FRSEConditionSet | Access | Story conditions to enter (a quest stage, a flag). |
Key (Key) | TObjectPtr<URSEItemData> | Access | The party needs this key to enter (kept, not used up). |
Locked Text (LockedText) | FText | Access | |
Generation (Generation) | FRSEInteriorGeneration | Generation | D-158: a generated interior: sized from the building, rooms from the program, a personality, a seed. |
Blackout Seconds (BlackoutSeconds) | float | Interior | Seconds of black between outside and inside (negative = Interiors -> Blackout Seconds, about 0.4). |
Override Rules (bOverrideRules) | bool | Interior | D-153: this interior's own rules (who goes in, battles, the shell) instead of its template's. |
Entry Point (EntryPoint) | FName | Interior | Where the party appears inside (an RSE Arrival Point id or an actor tag in the map). None = the map's first entry point. |
Map (Map) | TSoftObjectPtr<UWorld> | Interior | The interior's map (empty = the template's). Loaded as a level instance away from the playable area. |
Rules (Rules) | FRSEInteriorRules | Interior | |
Template (Template) | TObjectPtr<URSEInteriorTemplateData> | Interior | The template it was made from (its map when Map is empty; the analyzer and the Studio). |
Inhabitants (Inhabitants) | TArray<FRSEInteriorInhabitant> | Story | D-158: who lives or works here (the story's NPCs in the program's inhabitant roles). |
Lore (Lore) | TArray<FRSELoreEntry> | Story | D-158: texts for this interior's books, letters and notes (first; then Buildings -> Lore Libraries). |
Stations (Stations) | TArray<FRSEStationHook> | Story | D-158: what the workstations do here (the counter opens this town's shop, the altar blesses). |
URSEInteriorInteractionSetData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. What a kind of interior offers to do (D-161): 3 to 6 varied interactions in a home (something to examine, a note or a book, a small chest or drawer, a hearth or candle to light, a breakable, sometimes a quest hook), more at an inn.
| Property | Type | Category | Description |
|---|---|---|---|
Requirements (Requirements) | TArray<FRSEInteractionRequirement> | Interactions | |
Total Range (TotalRange) | FIntPoint | Interactions | The interactions counted by the requirements below, in all (the cap keeps the most wanted ones). |
URSEInteriorKitData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A modular interior kit (D-164): pieces of one pack that fit together on a module grid.
| Property | Type | Category | Description |
|---|---|---|---|
Use Kit Collision (bUseKitCollision) | bool | Kit | The pieces' own collision is used. Off (default): invisible boxes collide, the enclosure checks stay exact. |
Grid (Grid) | FRSEInteriorModuleGrid | Kit | |
Kit Id (KitId) | FName | Kit | A stable id (the wizard: the pack and kit name); None = the asset's name. |
Pieces (Pieces) | TArray<FRSEKitPiece> | Kit | |
Style Tags (StyleTags) | FGameplayTagContainer | Kit | Its style (Interior.Style.Medieval, .Rustic, .SciFi...): the Building Analyzer matches kits and themes by it. |
Thumbnail (Thumbnail) | TSoftObjectPtr<UTexture2D> | Kit | |
Material Overrides (MaterialOverrides) | TMap<FName,TSoftObjectPtr<UMaterialInterface> > | Look | Material overrides by material slot name (empty = each mesh's own materials). |
Kind Fallbacks (KindFallbacks) | TArray<FRSEKitKindFallback> | Rules | What a missing kind falls back to. A kind not listed uses the built-in table (Fill Default Fallbacks shows it). |
Kind Stretch (KindStretch) | TArray<FRSEKindStretch> | Rules | Larger stretch for some piece kinds of this kit (a kind not listed uses the project's Kit Build -> Kind Stretch, then the grid's Max Stretch). |
Slot Kinds (SlotKinds) | TArray<FRSEKitSlotKinds> | Rules | Which kinds fill each plan slot. A slot not listed uses the built-in table (Fill Default Slot Kinds shows it). |
URSEInteriorProgramData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A kind of interior's rooms (D-158): which rooms on which floor, how tall the floors are, whether there is a cellar, who lives there.
| Property | Type | Category | Description |
|---|---|---|---|
Interaction Set (InteractionSet) | TObjectPtr<URSEInteriorInteractionSetData> | Interactions | D-161: the interactions every interior of this kind offers (completed and capped after the furniture). |
Force Own Heights (bForceOwnHeights) | bool | Program | D-164 / K4: the floor heights above stay even with a modular kit (else the storey is the kit's Wall Height). |
Cellar Chance (CellarChance) | float | Program | Chance of a cellar when the building does not say (0..1; the interior's Generation can force it). |
Cellar Height (CellarHeight) | float | Program | |
Corridor Width (CorridorWidth) | float | Program | The width of an upper floor's corridor or landing (cm; the stairs and a walkway fit in it). |
Ground Floor Height (GroundFloorHeight) | float | Program | The ground floor's height and the upper floors' (cm, floor to floor). |
Inhabitants (Inhabitants) | TArray<FRSEInhabitantSlotSpec> | Program | Who lives or works here (spots or areas for NPCs and their routines). |
Min Room Depth (MinRoomDepth) | float | Program | The smallest depth of a band of rooms behind or in front of the hub (cm); a thinner band joins the hub. |
Rooms (Rooms) | TArray<FRSEInteriorRoomSpec> | Program | |
Single Room Area (SingleRoomArea) | float | Program | A floor smaller than this is one single room (m²). |
Upper Floor Height (UpperFloorHeight) | float | Program | |
Window Density (WindowDensity) | float | Program | D-164 / K4: the share of the possible windows its interiors get (0..1; a room spec may set its own). |
Resident Count (ResidentCount) | FIntPoint | Residents | D-161: how many live here (the story's inhabitants included; random between the two). 0 = only the inhabitant slots. |
Residents (Residents) | TObjectPtr<URSEInteriorResidentSetData> | Residents | D-161: who lives here when the interior does not say (resident profiles by role). |
Max Floors (MaxFloors) | int32 | Size | |
Min Floors (MinFloors) | int32 | Size | D-161: the floors this program is made for: a building with more is given MaxFloors (a cottage stays one storey, its loft left out), one with fewer gets MinFloors. 0 = no limit. |
URSEInteriorResidentSetData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Who lives in a settlement's interiors (D-161): resident profiles by role, picked by each interior's seed (names, looks, lines, schedules, the odd card player).
| Property | Type | Category | Description |
|---|---|---|---|
Household Role (HouseholdRole) | FGameplayTag | Residents | The household's role (Interior.Role.Resident): profiles of it (or under it) fill the interior up to its Resident Count, each in a spot of its own; the program's slots of this role are filled only while the count allows. Other roles fill their work places. |
Profiles (Profiles) | TArray<FRSEInteriorResidentProfile> | Residents |
URSEInteriorTemplateData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A kind of interior (D-150): a reusable small map with an entry point, an exit and slots (inn, house, shop, smithy, temple, cellar).
| Property | Type | Category | Description |
|---|---|---|---|
Default Floors (DefaultFloors) | int32 | Generation | D-158: floors above ground of a generated interior when its building does not say. |
Program (Program) | TObjectPtr<URSEInteriorProgramData> | Generation | D-158: the rooms of interiors generated from this template (an inn: common room, kitchen, bedrooms upstairs, cellar). |
Program Choices (ProgramChoices) | TArray<FRSEInteriorProgramChoice> | Generation | D-161: programs by building size (a cottage, a family house, a large house): the generator picks the one whose floor area and floors fit the interior (the seed decides between equal fits). Empty = Program for every size. |
Themes (Themes) | TArray<FRSEThemeChoice> | Generation | D-158: the personalities its generated interiors may get (the seed picks one by weight). |
Keywords (Keywords) | TArray<FString> | Template | Words in a building's name or mesh that suggest this template ("inn", "tavern"): the building analyzer. |
Map (Map) | TSoftObjectPtr<UWorld> | Template | The template's map (a small level: floor, walls, the entry point, the exit, the slots). Duplicate it to fill it. |
Rules (Rules) | FRSEInteriorRules | Template | D-153: who goes in, battles, the sealed shell and the world's lighting while inside (interiors made from it inherit it). |
Size (Size) | FVector | Template | The inside size (cm), for the designer and the analyzer's report. |
Slots (Slots) | TArray<FRSEInteriorSlotInfo> | Template | The slots of the map (what a buyer fills). |
Template Tag (TemplateTag) | FGameplayTag | Template | Interior.Template.Inn, .House, .Shop, .Smithy, .Temple, .Cellar (open set). |
URSEInteriorThemeData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A dwelling's personality (D-158): a craftsman's workshop, a hunter's lodge, a witch's hut, a merchant's or a noble's house.
| Property | Type | Category | Description |
|---|---|---|---|
Room Light Color (RoomLightColor) | FLinearColor | Light | The rooms' own light (a warm lamp light by default). |
Room Light Intensity Range (RoomLightIntensityRange) | FVector2D | Light | |
Room Light Jitter (RoomLightJitter) | float | Light | The seed varies the light's colour this much (0..1). |
Room Light Per Square Meter (RoomLightPerSquareMeter) | float | Light | The room light's intensity per square metre of floor (candela-like units), clamped below. |
Snap to Kit Grid (bSnapToKitGrid) | bool | Look | D-164 / K4: the layout snaps to the kit asset's module grid (off: the pieces are fitted to the free layout). |
Floor Materials (FloorMaterials) | TArray<TSoftObjectPtr<UMaterialInterface> > | Look | Materials picked by the seed: floors, walls, wood (door frames, stairs). |
Kit (Kit) | FRSEInteriorKit | Look | |
Kit Variants (KitVariants) | TArray<FRSEInteriorKit> | Look | D-161: other kits the seed may pick instead of Kit (other floor boards, other wall timbers): neighbours of one size differ. |
Trim Materials (TrimMaterials) | TArray<TSoftObjectPtr<UMaterialInterface> > | Look | |
Wall Materials (WallMaterials) | TArray<TSoftObjectPtr<UMaterialInterface> > | Look | |
Keywords (Keywords) | TArray<FString> | Theme | Words in a building's name that ask for this theme ("witch", "hunter"): the Building Analyzer. |
Room Furnishings (RoomFurnishings) | TArray<FRSEThemeRoomFurnishing> | Theme | |
Style Tags (StyleTags) | FGameplayTagContainer | Theme | D-164: its style (Interior.Style.Medieval, .SciFi...): kits and themes are matched by it. |
Substitutions (Substitutions) | TArray<FRSEFurnitureSubstitution> | Theme | D-164: pieces swapped by kind (the first substitution whose Furniture Tag the piece has wins). Programs, interaction sets and resident sets keep their own pieces and tags; the seed (its own stream) picks the replacement. |
Theme Tag (ThemeTag) | FGameplayTag | Theme | Interior.Theme.Workshop, .Hunter, .Witch... |
URSEItemData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Base item definition (D-024).
| Property | Type | Category | Description |
|---|---|---|---|
Sellable (bSellable) | bool | Economy | Shops may buy it. Key items and documents never sell, whatever this says. |
Buy Price (BuyPrice) | int32 | Economy | Price in shops, before the Economy BuyPriceMultiplier. 0 = no value (shops need a price override; it cannot be sold). |
Sell Price Override (SellPriceOverride) | int32 | Economy | What shops pay for one. -1 = BuyPrice x the sell ratio (the shop's or the Economy settings'). |
Category (Category) | FGameplayTag | Grid Inventory | Category (Item.Category.*), for inventory tab filters and sorting. Optional. |
Grid Size (GridSize) | FIntPoint | Grid Inventory | Cells the item takes in grid inventories (width x height). 1x1 for most items; at most Items -> Max Item Grid Size and never wider than the narrowest stash tab that shows it. |
Rarity (Rarity) | FGameplayTag | Grid Inventory | Rarity tier (Item.Rarity.*): name color, frame and sort order. Empty = Items -> Default Rarity. |
Weight (Weight) | float | Grid Inventory | Weight of one (D-143): counts against a member's carry capacity when Inventory Rules -> Use Weight is on. |
Description (Description) | FText | Item | |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Item | |
Icon Mesh Rotation (IconMeshRotation) | FRotator | Item | Turns the icon mesh before it is framed (packs model weapons along different axes; the studio's view does the rest). |
Item Mesh (ItemMesh) | TSoftObjectPtr<UStaticMesh> | Item | The item's mesh (D-126): the Portrait & Icon Studio renders Icon from it, and equipment without an Appearance Part shows it on its wearer at its slot's Attach Anchor (weapons in the hand). Empty: equipment uses its Appearance Part's mesh for the icon; items with neither get a template icon (a glyph of their kind). |
Max Stack (MaxStack) | int32 | Item | Maximum stack size. 0 = the default from Project Settings -> RPG Saga Engine -> Items. |
URSEItemFamily
Module RSECore, parent URSEArchetype, primary asset. Item family: "potion", "bomb", "melee weapon", "ranged weapon" (content: an Item of the family's item class).
URSEItemRecipeData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Two items combined into a third (D-039), e.g.
| Property | Type | Category | Description |
|---|---|---|---|
Consume First (bConsumeFirst) | bool | Recipe | |
Consume Second (bConsumeSecond) | bool | Recipe | |
Effects (Effects) | FRSEEffectList | Recipe | Extra effects of the combination (e.g. a story flag). |
First Ingredient (FirstIngredient) | TObjectPtr<URSEItemData> | Recipe | |
Result (Result) | TObjectPtr<URSEItemData> | Recipe | |
Result Count (ResultCount) | int32 | Recipe | |
Second Ingredient (SecondIngredient) | TObjectPtr<URSEItemData> | Recipe | |
Success Text (SuccessText) | FText | Recipe | Shown after combining. Empty = Project Settings -> RPG Saga Engine -> Puzzles -> Combine Success Format. |
URSEItemUseData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Items an object accepts (D-039): "Use the Minute Hand?" is asked automatically when the party holds one, and any key item can be tried on the object from the party menu (a wrong one gets the refusal lines).
| Property | Type | Category | Description |
|---|---|---|---|
Accepted Items (AcceptedItems) | TArray<FRSEItemUseRule> | Use | |
Offer Automatically (bOfferAutomatically) | bool | Use | Ask "Use ...?" on Interact when the party holds an accepted item. Off = only from the party menu. |
Conditions (Conditions) | FRSEConditionSet | Use | When items can be used on the object at all (e.g. the puzzle is not solved yet). Empty = always. |
Refusal Lines (RefusalLines) | TArray<FText> | Use | Said for a wrong item. Empty = Project Settings -> RPG Saga Engine -> Puzzles -> Default Refusal Lines. |
URSEKitLibrary
Module RSEEditor, parent UDataAsset. The interior kit library asset.
| Property | Type | Category | Description |
|---|---|---|---|
Entries (Entries) | TArray<FRSEKitLibraryEntry> | Library | |
Folders (Folders) | TArray<FDirectoryPath> | Library | Folders scanned (a rescan scans them again: changed meshes measured, everything reclassified, corrections kept). |
Grid Overrides (GridOverrides) | FRSEKitGridOverrides | Library | The buyer's kit corrections (typed grid values per kit; piece moves are taken from the entries' Kit corrections). |
Kits (Kits) | TArray<FRSEKitGroupInfo> | Library | |
Languages (Languages) | TArray<FName> | Library | Language packs used (ids); empty = the taxonomy's defaults. |
Last Report (LastReport) | FRSEKitScanReport | Library | |
Provenance (Provenance) | TArray<FRSEProvenanceRecord> | Library | What the Create step wrote into kit and furniture assets (a field is rewritten only while it still holds this). |
Taxonomy (Taxonomy) | TSoftObjectPtr<URSEKitTaxonomy> | Library | This library's taxonomy (empty = Project Settings -> Interior Kits -> Taxonomy). |
URSEKitTaxonomy
Module RSEEditor, parent UDataAsset. The kit classifier's rules (data asset, Project Settings -> RPG Saga Engine -> Interior Kits -> Taxonomy).
| Property | Type | Category | Description |
|---|---|---|---|
Front Axis Min Ratio (FrontAxisMinRatio) | float | Front | K11: Long Side / Short Side front rules apply when the footprint's long side is at least this many times its short side. |
Front Mirror Threshold (FrontMirrorThreshold) | float | Front | K11: an axis whose mirror symmetry reaches this looks the same from the front and the back: either front on it is right. |
Front Softness (FrontSoftness) | float | Front | K11: confidence of a front read through a front rule = evidence on the axis / (evidence + the other axis' evidence + this). |
Folder Only Max Confidence (FolderOnlyMaxConfidence) | float | Review | K11: the highest confidence of a kind named only by folder words (the mesh's own name says nothing). |
Front Review Threshold (FrontReviewThreshold) | float | Review | K11: furniture and props whose kind's front matters (Front Matters) need review when the front is less sure than this (and the piece is neither symmetric nor the same from the front and the back). |
Named Shape Veto (NamedShapeVeto) | float | Review | K11: the shape tests lower a named kind's score at most by this share of its word score, so a named piece that does not look the part stays a doubtful guess (low confidence, review) instead of becoming unclassified. 1 = the shape may veto the name entirely. |
Review Threshold (ReviewThreshold) | float | Review | Rows below this confidence are listed as needing review (a kind may set its own). |
Rival Word Share (RivalWordShare) | float | Review | K11, confidence calibration: a word naming an unrelated kind is a conflict even when that kind's shape tests ruled it out ("Workbench_Forge"): the runner-up counts at least this share of the best unrelated kind's word score. |
Shape Conflict Penalty (ShapeConflictPenalty) | float | Review | K11: when the shape tests of a named winner add up against it, the confidence is scaled by 1 - this x (shape against / word score), down to 1 - this: the name says one thing, the geometry another. |
Shape Only Max Confidence (ShapeOnlyMaxConfidence) | float | Review | K11: the highest confidence of a kind guessed from the shape alone (no word names any kind). Below Review Threshold by default: on a real pack shape-only guesses (a lily pad, a flag) passed as tables. |
Drop Single Letters (bDropSingleLetters) | bool | Rules | Drop one-letter words (variant tails: _A, _B; also the "S" of "S_Wall"). |
Group Words (GroupWords) | TArray<FString> | Rules | K11: words that make a name a group of pieces ("Barrel_Stack", "Crate_Pile", "Books"): one piece's size tests do not describe it, so the named kind's shape score counts at Group Shape Weight. |
Ignore Folder Words (IgnoreFolderWords) | TArray<FString> | Rules | Meshes under a folder with one of these words are ignored without being loaded (fx, vehicles, characters). |
Ignore Patterns (IgnorePatterns) | TArray<FRSEPackNamePattern> | Rules | Meshes whose name matches are ignored without being loaded (LODs, UCX_ collision, _Broken chunks...). |
Languages (Languages) | TArray<FRSEKitLanguagePack> | Rules | |
Rules (Rules) | TArray<FRSEKitWordRule> | Rules | |
Stop Words (StopWords) | TArray<FString> | Rules | Words dropped from names before matching (prefixes and filler: sm, mesh, prop, bld, env, geo, static). |
Confidence Softness (ConfidenceSoftness) | float | Scoring | Confidence = best / (best + runner-up + this). |
Folder Weight (FolderWeight) | float | Scoring | Folder words count this much of a name word. |
Group Shape Weight (GroupShapeWeight) | float | Scoring | K11: share of the shape score kept for a group (0 = the name alone decides). |
Max Reasons (MaxReasons) | int32 | Scoring | Reasons kept per classification (strongest first). |
Min Score (MinScore) | float | Scoring | A best score below this leaves the mesh unclassified. |
Shape Only Weight (ShapeOnlyWeight) | float | Scoring | Kinds guessed from shape alone count this much of their shape score. |
Description (Description) | FText | Taxonomy | |
Kinds (Kinds) | TArray<FRSEKitPieceKindDef> | Taxonomy |
URSELockData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A kind of lock (D-109): how hard it is to pick, who may pick it, which keys open it, what a failure costs.
| Property | Type | Category | Description |
|---|---|---|---|
Consume Key (bConsumeKey) | bool | Lock | The key is used up when it opens the lock. |
Pickable (bPickable) | bool | Lock | It can be picked at all (off = only a key or the story opens it). |
Breaks on Failure (BreaksOnFailure) | TObjectPtr<URSEItemData> | Lock | A failed attempt uses up one of this item (a lockpick breaks). Empty = nothing. |
Difficulty (Difficulty) | float | Lock | Lockpick score at which the chance is Chance At Equal Score (and the sweet spot has its base width). |
Failure Effects (FailureEffects) | FRSEEffectList | Lock | Story effects of a failed attempt. |
Failure Noise Radius (FailureNoiseRadius) | float | Lock | Visible enemies within this distance hear a failed attempt (cm; 0 = silent). |
Keys (Keys) | TArray<TObjectPtr<URSEItemData> > | Lock | Keys that open it at once (any one of them). |
Pick Requirements (PickRequirements) | FRSEExploreRequirements | Lock | Who may pick it (usually: the party carries Thieves' Tools). |
Pins Override (PinsOverride) | int32 | Lock | Pins of the minigame (0 = from the difficulty: Exploration RPG -> Base Pins, Difficulty Per Pin). |
URSELootTable
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A reusable loot table (D-042): what an enemy drops when defeated.
| Property | Type | Category | Description |
|---|---|---|---|
Loot (Loot) | FRSELoot | Loot |
URSELoreLibraryData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A library of lore texts (D-158): Buildings -> Lore Libraries, and an interior's own Lore.
| Property | Type | Category | Description |
|---|---|---|---|
Entries (Entries) | TArray<FRSELoreEntry> | Lore |
URSEMapData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The area map of one level (D-089): the top-down picture Generate Map made, where it lies in the world, and what the designers added by hand (name, regions, markers, hidden categories).
| Property | Type | Category | Description |
|---|---|---|---|
Show Minimap (bShowMinimap) | bool | Content | Show the minimap on this level (the area map stays available). |
Fog Of War (FogOfWar) | ERSEMapFogMode | Content | |
Hidden Categories (HiddenCategories) | FGameplayTagContainer | Content | Marker categories this map never shows (e.g. enemies on a town map). |
Markers (Markers) | TArray<FRSEMapManualMarker> | Content | Markers placed by hand (kept when the map is regenerated). |
Regions (Regions) | TArray<FRSEMapRegion> | Content | Named parts of the map. Regions made from the level's area volumes are marked Generated and refreshed each time. |
Generated Resolution (GeneratedResolution) | int32 | Generation | Picture size of the last generation. |
North Yaw (NorthYaw) | float | Generation | World yaw that points up on the map, used when the level has no Map Bounds Volume (0 = world +X up, 90 = world +Y up). |
Resolution (Resolution) | int32 | Generation | Picture size in pixels for this map (0 = Map Generator settings -> Resolution). |
Style (Style) | TSoftObjectPtr<URSEMapStyle> | Generation | The look Generate Map uses for this map (empty = Map Generator settings -> Default Style). |
Frame (Frame) | FRSEMapFrame | Map | Where the picture lies in the world (written by Generate Map). |
Level (Level) | TSoftObjectPtr<UWorld> | Map | The level this map shows. |
Playable Bounds (PlayableBounds) | FBox | Map | The playable part of the level (navmesh and gameplay actors; written by Generate Map). The area map opens fitted to it and does not pan far outside it. Invalid = the whole picture. |
Target Index (TargetIndex) | FString | Map | The target ids above as "|id|id|", searchable without loading the map (objectives on another level). |
Targets (Targets) | TArray<FRSEMapTargetLocation> | Map | Where the level's map target ids lie (written by Generate Map from Map Marker components). |
Texture (Texture) | TSoftObjectPtr<UTexture2D> | Map | The generated top-down picture. |
World Bounds (WorldBounds) | FBox | Map | The level content the picture was made from (written by Generate Map). |
URSEMapStyle
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The look of a generated area map (D-089): what Generate Map does to the top-down picture of the level.
| Property | Type | Category | Description |
|---|---|---|---|
Building Color (BuildingColor) | FLinearColor | Buildings | --- Buildings (Stylized) --- |
Building Edge Color (BuildingEdgeColor) | FLinearColor | Buildings | |
Building Roof Shade (BuildingRoofShade) | float | Buildings | Light and shade of the roof sides (0 = flat). |
Building Roof Tint (BuildingRoofTint) | float | Buildings | How much of the roofs' own color shows (0 = every building in Building Color). |
Building Shadow (BuildingShadow) | float | Buildings | The shadow buildings cast on the ground (0 = none). |
Shadow Offset (ShadowOffset) | float | Buildings | How far shadows fall, in pixels at 2048 (toward the bottom right). |
Exposure Bias (ExposureBias) | float | Capture | Exposure compensation of the capture, in stops. |
Post Process Material (PostProcessMaterial) | TSoftObjectPtr<UMaterialInterface> | Capture | Optional post-process material blended into the top-down capture (outlines, toon shading...). |
Brightness (Brightness) | float | Color | --- Color --- |
Contrast (Contrast) | float | Color | |
Posterize Levels (PosterizeLevels) | int32 | Color | Color steps per channel (0 = off): fewer steps give flat, painted areas. |
Saturation (Saturation) | float | Color | 0 = gray, 1 = as captured. |
Smooth Radius (SmoothRadius) | int32 | Color | Blur radius in pixels before the color steps (0 = off). |
Tint (Tint) | FLinearColor | Color | |
Tint Strength (TintStrength) | float | Color | How much the colors are multiplied by Tint (0 = not at all). |
Forest Canopy Shade (ForestCanopyShade) | float | Forests | Light and shade of the tree crowns inside forests (0 = flat color). |
Forest Color (ForestColor) | FLinearColor | Forests | --- Forests (Stylized) --- |
Forest Edge Color (ForestEdgeColor) | FLinearColor | Forests | |
Forest Merge Distance (ForestMergeDistance) | float | Forests | Trees closer than this merge into one forest shape. |
Forest Shadow (ForestShadow) | float | Forests | The shadow forests cast on the ground (0 = none). |
Border Color (BorderColor) | FLinearColor | Frame | |
Border Width (BorderWidth) | int32 | Frame | Border line width in pixels (at 2048; scaled with the resolution). 0 = none. |
Frame Texture (FrameTexture) | TSoftObjectPtr<UTexture2D> | Frame | Optional frame picture laid over the whole map (its alpha shows the map through). |
Edges Only (bEdgesOnly) | bool | Outlines | Only the outlines on the background color (plans, blueprints). |
Edge Color (EdgeColor) | FLinearColor | Outlines | |
Edge Strength (EdgeStrength) | float | Outlines | Outline strength (0 = none) along edges of shapes and height changes. |
Edge Threshold (EdgeThreshold) | float | Outlines | Brightness difference that counts as an edge (lower = more lines). |
Outside Desaturate (OutsideDesaturate) | float | Outside | Color loss outside the playable area (0 = none). |
Outside Dim (OutsideDim) | float | Outside | Darkening of what lies outside the playable area (0 = none). |
Outside Feather (OutsideFeather) | float | Outside | Softness of the playable area's edge, in pixels at 2048. |
Background Color (BackgroundColor) | FLinearColor | Paper | Where the level has nothing (outside the ground), and under the lines of an edges-only style. |
Grid Color (GridColor) | FLinearColor | Paper | Grid line color; alpha = opacity. |
Grid Spacing (GridSpacing) | int32 | Paper | Grid line every N pixels (0 = no grid). |
Paper Noise (PaperNoise) | float | Paper | Generated paper grain and blotches when there is no paper picture (0 = none). |
Paper Strength (PaperStrength) | float | Paper | How strongly the paper picture shows (0 = not at all). |
Paper Texture (PaperTexture) | TSoftObjectPtr<UTexture2D> | Paper | Optional paper picture multiplied over the map (tiled at its own size). |
Vignette (Vignette) | float | Paper | Darkening toward the corners (0 = none). |
Vignette Color (VignetteColor) | FLinearColor | Paper | |
Preset (Preset) | ERSEMapStylePreset | Preset | Preset Apply Preset writes. |
Contour Color (ContourColor) | FLinearColor | Relief | |
Contour Interval (ContourInterval) | float | Relief | Height between contour lines (0 = no contour lines). |
Contour Major Every (ContourMajorEvery) | int32 | Relief | Every Nth contour line is stronger (0 = all the same). |
Contour Strength (ContourStrength) | float | Relief | |
Hillshade Altitude (HillshadeAltitude) | float | Relief | Height of that light above the horizon (lower = longer, stronger shading). |
Hillshade Azimuth (HillshadeAzimuth) | float | Relief | Where the light of the hill shading comes from on the map (degrees clockwise from up; 315 = top left). |
Hillshade Exaggeration (HillshadeExaggeration) | float | Relief | Heights are multiplied by this for the shading (gentle levels need more). |
Hillshade Strength (HillshadeStrength) | float | Relief | Hill shading from the ground's height (0 = none). |
Road Color (RoadColor) | FLinearColor | Roads | Road and path meshes (Map Generator -> Road Keywords) in this color, with a thin edge. Alpha = how much. |
Road Edge Color (RoadEdgeColor) | FLinearColor | Roads | |
Rock Color (RockColor) | FLinearColor | Rocks | --- Rocks (Stylized) --- |
Source (Source) | ERSEMapSource | Source | What the picture is made from: a drawn map (Stylized) or a lit photo from above (Photo). |
Palette Strength (PaletteStrength) | float | Terrain | How strongly each terrain type takes its palette color (0 = the level's color, 1 = the palette's). |
Rock Slope (RockSlope) | float | Terrain | Shape terrain: slopes steeper than this are rock. |
Sand Distance (SandDistance) | float | Terrain | Shape terrain: ground this close to water (and at most Sand Height above it) is sand. |
Sand Height (SandHeight) | float | Terrain | |
Terrain Border Strength (TerrainBorderStrength) | float | Terrain | A thin line where two terrain types meet (0 = none). |
Terrain Clean Radius (TerrainCleanRadius) | int32 | Terrain | Speckle cleanup: a pixel takes the most common terrain type around it within this radius (pixels at 2048). |
Terrain Detail (TerrainDetail) | float | Terrain | How much of the ground's own light and dark detail is kept inside a terrain type (0 = flat color). |
Terrain Layer Colors (TerrainLayerColors) | TArray<FRSEMapTerrainLayerColor> | Terrain | Landscapes: the map color of each paint layer by a word of its name (first match wins). Layers without a match keep the color the landscape shows. The terrain types are then sorted from these colors. |
Terrain Max Lightness (TerrainMaxLightness) | float | Terrain | |
Terrain Min Lightness (TerrainMinLightness) | float | Terrain | Lightness range the terrain colors are brought into (maps read best light). |
Terrain Palette (TerrainPalette) | TArray<FLinearColor> | Terrain | Map colors the terrain types are pulled toward (nearest color wins). Empty = keep the level's own colors. |
Terrain Saturation (TerrainSaturation) | float | Terrain | Saturation of the terrain colors (1 = as sorted). |
Terrain Smooth Radius (TerrainSmoothRadius) | int32 | Terrain | Blur of the ground colors before they are sorted, in pixels at 2048 (removes texture noise). |
Terrain Source (TerrainSource) | ERSEMapTerrainSource | Terrain | Where the terrain colors come from: the ground's colors, or its shape (slopes, shores) when the colors say nothing. |
Terrain Types (TerrainTypes) | int32 | Terrain | How many terrain types the ground colors are sorted into (grass, road, sand, rock...). 0 or 1 = keep the colors. |
Water Color (WaterColor) | FLinearColor | Water | --- Water (Stylized) --- |
Water Edge Color (WaterEdgeColor) | FLinearColor | Water | |
Water Shore Color (WaterShoreColor) | FLinearColor | Water | The lighter band along the shore, inside the water. |
Water Shore Width (WaterShoreWidth) | float | Water | Width of the shore band in pixels at 2048. |
URSENPCArchetype
Module RSECore, parent URSEArchetype, primary asset. NPC type: merchant, quest giver, recruiter, innkeeper, card player, passer-by (content: the NPC's Interaction).
URSENPCReactionData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. How a living NPC reacts to danger (D-173, docs/product/living-npcs.md "Reactions"): a battle that starts near it (flee, watch, cower, help, or ignore) and the crimes it witnesses (guards: warn, chase, effects).
| Property | Type | Category | Description |
|---|---|---|---|
Battle Response (BattleResponse) | ERSENPCBattleResponse | Battle | --- Battles --- |
Reaction Activity (ReactionActivity) | FGameplayTag | Battle | The activity shown while it reacts (its animation: NPC.Activity.Cower, .Watch, .Flee). Empty = the response's default. |
Reaction Bark Kind (ReactionBarkKind) | FGameplayTag | Battle | The line it says when it reacts (Bark.Kind.Panic from its pools). Empty = none. |
Reaction Delay (ReactionDelay) | FVector2D | Battle | Seconds before it reacts (random between the two: a crowd never moves in unison). |
Return Delay (ReturnDelay) | FVector2D | Battle | Seconds it waits after the battle ended before it returns to its day (random between the two). |
Trigger Distance (TriggerDistance) | float | Battle | It reacts to a battle that starts within this distance of it (cm). |
Crimes (Crimes) | TArray<FRSENPCCrimeRule> | Crimes | The crimes it answers, the first rule that fits wins. Empty = it ignores crimes. |
Require Line Of Sight (bRequireLineOfSight) | bool | Crimes|Senses | Without a Senses asset: sight needs a clear line. |
Eye Height (EyeHeight) | float | Crimes|Senses | Height of its eyes above its feet (cm), for the line of sight. |
Hearing Radius (HearingRadius) | float | Crimes|Senses | Without a Senses asset: how far it hears all around (cm). |
Senses (Senses) | TSoftObjectPtr<URSERoamingBehaviorData> | Crimes|Senses | Its senses for crimes: a Roaming Behavior asset (sight cone and radius, hearing, line of sight; the time and weather rules scale them). Empty = the values below. |
Sight Half Angle (SightHalfAngle) | float | Crimes|Senses | Without a Senses asset: half the opening of its sight cone (degrees). |
Sight Radius (SightRadius) | float | Crimes|Senses | Without a Senses asset: how far it sees (cm). |
Hide at Flee Place (bHideAtFleePlace) | bool | Flee | It goes inside at the end of the run (hidden, like a night at home) until the battle is over. Off: it stays out and cowers there. |
Flee Distance (FleeDistance) | float | Flee | Flee without a place: how far from the fight it runs (cm). |
Flee Place (FleePlace) | FName | Flee | Flee: the NPC Place it runs to (its door, a cellar, the church). Empty = it runs away from the fight (Flee Distance). |
Flee Speed Scale (FleeSpeedScale) | float | Flee | Multiplies its walking speed while it flees. |
Help Distance (HelpDistance) | float | Help | Help: it stops this far from the fight, ready (cm). |
Help Effects (HelpEffects) | FRSEEffectList | Help | Help: run once when it answers the call (a flag, a story effect: "the guards joined the fight"). Reinforcements of the encounter itself are the encounter's. |
Help Speed Scale (HelpSpeedScale) | float | Help | Help: multiplies its walking speed on the way. |
Watch Distance (WatchDistance) | float | Watch | Watch: it keeps at least this far from the fight (cm). |
URSENPCScheduleData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A living NPC's day (D-104, docs/product/living-npcs.md): hour ranges (or phases of the day, weather, story conditions) -> an activity at a place (stay and work, wander, walk a route, or be away at home).
| Property | Type | Category | Description |
|---|---|---|---|
Reaction (Reaction) | TSoftObjectPtr<URSENPCReactionData> | Reaction | D-173: how an NPC with this schedule reacts to a battle nearby and to crimes (flee, watch, cower, help; guards warn and chase). The Living NPC component's own Reaction wins; empty = the project's default (Living NPCs -> Default Reaction). |
Default (Default) | FRSENPCActivity | Schedule | What it does when no line holds. |
Entries (Entries) | TArray<FRSENPCScheduleEntry> | Schedule | The day, first matching line wins (put the special cases first: "in the rain", "after the quest"). |
Seek Shelter (bSeekShelter) | bool | Weather | Reacts to bad weather: an outdoor activity (not Sheltered, not Away) becomes Shelter in the Shelter Weathers. |
Shelter (Shelter) | FRSENPCActivity | Weather | Where it goes in that weather: home (Away) or a spot under a roof (Stay, Sheltered). |
Shelter Weathers (ShelterWeathers) | FGameplayTagContainer | Weather |
URSENPCStyleData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. An NPC style (D-173, docs/product/living-npcs.md "Presets"): one pick for a kind of person: its day (schedule), how it reacts to battles and crimes (reaction), what it says (bark pools) and the places its day needs (Home, Field, Tavern...).
| Property | Type | Category | Description |
|---|---|---|---|
Bark Pools (BarkPools) | TArray<TSoftObjectPtr<URSEBarkPoolData> > | Style | What it says. Empty = the project's default pools. |
Names (Names) | TArray<FText> | Style | Names used in turn when the request gives none ("Old Hob", "Mara"). |
Places (Places) | TArray<FName> | Style | The NPC Place ids its schedule uses (Home, Field...). Populate NPCs puts an area place with each id over the populated area unless the level has one already (then the NPCs use yours: move the places where they belong). |
Reaction (Reaction) | TSoftObjectPtr<URSENPCReactionData> | Style | How it reacts to a battle nearby and to crimes. Empty = the project's default reaction. |
Schedule (Schedule) | TSoftObjectPtr<URSENPCScheduleData> | Style | Its day: hours / phases -> activities at places. |
Tags (Tags) | FGameplayTagContainer | Style | The roles this style covers (a Merchant style: Archetype.Role.NPC.Merchant), for search and the NPC Type presets. |
URSEOptionalSceneData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. An optional scene (D-039): what other characters are doing elsewhere.
| Property | Type | Category | Description |
|---|---|---|---|
Missed when Skipped (bMissedWhenSkipped) | bool | Scene | Walking away without viewing it skips it for good (marked seen, like a missed ATE). Off = offered again next time. |
Conditions (Conditions) | FRSEConditionSet | Scene | When the scene is offered (empty = always, until seen). |
Dialog (Dialog) | TSoftObjectPtr<URSEDialogData> | Scene | The scene itself. |
Effects (Effects) | FRSEEffectList | Scene | Run when the player chooses to view it. |
Event (Event) | FGameplayTag | Scene | Story id; seen = the scene is no longer offered. Required. |
URSEPactData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A Pact (D-013, docs/design/pacts.md): the customization layer of main characters.
| Property | Type | Category | Description |
|---|---|---|---|
Backlash Damage Percent (BacklashDamagePercent) | float | Backlash | Damage to the summoner, in percent of its maximum HP. |
Backlash Status (BacklashStatus) | TObjectPtr<URSEStatusData> | Backlash | |
Backlash Status Chance (BacklashStatusChance) | float | Backlash | Chance in percent to apply BacklashStatus. |
Abilities (Abilities) | TArray<FRSEPactAbility> | Holder | Abilities learned with Pact points. |
Affinities (Affinities) | TArray<FRSEElementAffinityEntry> | Holder | Elemental affinities of the holder, combined with class, equipment and statuses. |
Granted Tags (GrantedTags) | FGameplayTagContainer | Holder | Traits of the holder (e.g. a status immunity). |
Description (Description) | FText | Pact | |
Resonance on Act (ResonanceOnAct) | float | Resonance | Resonance the holder gains each time it uses an ability or item (not the summon itself). |
Resonance on Hit (ResonanceOnHit) | float | Resonance | Resonance the holder gains for each damaging hit it receives. |
Resonance Per Damage Percent (ResonancePerDamagePercent) | float | Resonance | Extra Resonance per percent of maximum HP lost to a hit. |
Summon Controlled by AI (bSummonControlledByAI) | bool | Summon | Player-commanded (default) or AI-commanded. A summon of an AI unit is always AI-commanded. |
Summon Ability (SummonAbility) | TObjectPtr<URSEAbilityData> | Summon | The summon command: an ability with a Summon effect, targeting Self. Always available to the holder. |
Summon AIProfile (SummonAIProfile) | TObjectPtr<URSEAIProfile> | Summon | Profile when the summon is AI-commanded. Empty = the summoner's profile, then the default one. |
Summon Character (SummonCharacter) | TObjectPtr<URSECharacterData> | Summon | The summoned creature: class, stats and abilities like any character. |
Summon Footprint Radius (SummonFootprintRadius) | float | Summon | Free Tactics (D-110): footprint radius of the summon in meters (a big creature takes more room). 0 = Free Tactics -> Default Summon Radius. |
Summon Level (SummonLevel) | int32 | Summon | Level of the summon. 0 = the summoner's level. |
Summon Turns ATB (SummonTurnsATB) | int32 | Summon | ATB: own turns (commands) the summon keeps the summoner's place. |
Summon Turns Tactics (SummonTurnsTactics) | int32 | Summon | Tactics: own turns the summon stays on the grid. |
URSEPairedAnimationData
Module RSE, parent URSEPrimaryDataAsset, primary asset. One paired animation (D-172): the attacker's and the victim's montages, where they stand, the sync point, when it may play, and its camera, slow motion and effects.
| Property | Type | Category | Description |
|---|---|---|---|
Align Mode (AlignMode) | ERSEPairedAlignMode | Alignment | |
Align Seconds (AlignSeconds) | float | Alignment | Seconds the alignment slide takes (negative = Paired Animations -> Align Seconds). Motion warping replaces it when available. |
Relative (Relative) | FRSEPairedRelativeTransform | Alignment | |
Warp Target Name (WarpTargetName) | FName | Alignment | Warp target name of the attacker montage's Motion Warping window (AnimationWarping / MotionWarping plugins): when the attacker has a motion warping component, its target is set to the aligned transform and the montage carries it there (no slide). |
Conditions (Conditions) | FRSEPairedConditions | Conditions | |
Weight (Weight) | float | Conditions | Relative chance among the pairs that fit (0 = never picked by chance; still usable by name from an ability's look). |
Attacker Montage (AttackerMontage) | TSoftObjectPtr<UAnimMontage> | Pair | Played on the unit acting. |
Kind (Kind) | ERSEPairedAnimationKind | Pair | |
Play Rate (PlayRate) | float | Pair | Speed of both montages. |
Victim Montage (VictimMontage) | TSoftObjectPtr<UAnimMontage> | Pair | Played on its primary target. Empty = the victim keeps its own reactions (a one-sided pair). |
Skippable (bSkippable) | bool | Presentation | Confirm / Cancel may skip it (Paired Animations -> Skippable decides when unset). |
Camera (Camera) | TObjectPtr<URSECue_Camera> | Presentation | The cinematic camera while the pair plays (when the battle allows camera shots). Empty = Paired Animations -> Default Camera. |
Slow Motion (SlowMotion) | FRuntimeFloatCurve | Presentation | Time dilation over real seconds from the sync point (empty = Paired Animations -> Default Slow Motion; flat 1 = none). |
Sync Cues (SyncCues) | TArray<TObjectPtr<URSEBattleCue> > | Presentation | Cues that start at the sync point (VFX, sounds, flashes, shakes...). |
Attacker Sync Time (AttackerSyncTime) | float | Sync | Seconds into the attacker montage where the two meet (the hit). Negative = its first RSEImpact notify, else half its length. |
Victim Sync Time (VictimSyncTime) | float | Sync | Seconds into the victim montage that match the attacker's sync point. Negative = its first RSEImpact notify, else its start. |
URSEPairedAnimationLibrary
Module RSE, parent URSEPrimaryDataAsset, primary asset. The pairs a project can pick from (D-172): finishers, counters, parries, grabs and phase moments, chosen by their conditions and weights.
| Property | Type | Category | Description |
|---|---|---|---|
Pairs (Pairs) | TArray<TObjectPtr<URSEPairedAnimationData> > | Library |
URSEPartyCommandData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A delegated party command (D-097): what it does, who may do it (class, abilities, items, story conditions) and its result (success chance, effects on success and failure, noise that draws enemies).
| Property | Type | Category | Description |
|---|---|---|---|
Behavior (Behavior) | ERSEPartyCommandBehavior | Command | |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Command | Icon of the radial menu entry (empty = the name only). |
Max Range (MaxRange) | float | Command | Farthest target from the leader (cm; 0 = no limit). |
Sort Order (SortOrder) | int32 | Command | Position of the entry in the radial menu (lower first). |
Target (Target) | ERSEPartyCommandTarget | Command | |
Conditions (Conditions) | FRSEConditionSet | Requirements | Story conditions (flags, items, members...). Empty = always. |
Required Abilities (RequiredAbilities) | TArray<TObjectPtr<URSEAbilityData> > | Requirements | The member must know one of these abilities (empty = none needed). |
Required Class Tags (RequiredClassTags) | FGameplayTagContainer | Requirements | The member's class tag must match one of these (empty = any class). |
Required Equipment Tags (RequiredEquipmentTags) | FGameplayTagContainer | Requirements | D-148: the member must wear equipment with one of these tags (its Equipment Type, Slot Type or Granted Tags: a lute, a grappling hook...). Empty = none needed. A member without it never sees the command on its radial. |
Required Items (RequiredItems) | TArray<TObjectPtr<URSEItemData> > | Requirements | The party must carry every one of these items ("only who has lockpicks"). |
Requirement Text (RequirementText) | FText | Requirements | Why nobody may do it now ("Needs lockpicks."), shown on the disabled entry. Empty = a generic text. |
Failure Effects (FailureEffects) | FRSEEffectList | Result | Effects when it fails. |
Failure Noise Radius (FailureNoiseRadius) | float | Result | A failure makes noise: visible enemies within this distance of the member notice the party (cm; 0 = silent). |
Failure Text (FailureText) | FText | Result | Line shown when it fails. {Member} = the member's name. |
Preferred Bonus (PreferredBonus) | float | Result | |
Preferred Class Tags (PreferredClassTags) | FGameplayTagContainer | Result | Classes that are good at it ("the thief opens locks more easily"): their chance rises by Preferred Bonus. |
Success Chance (SuccessChance) | float | Result | Chance (0..1) that it works. |
Success Effects (SuccessEffects) | FRSEEffectList | Result | Effects when it works (items found, a flag, a door unlocked). |
Success Text (SuccessText) | FText | Result | Line shown when it works ("{Member} found something."). {Member} = the member's name. Empty = none. |
URSEPickpocketData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. What an NPC carries and what happens when a thief is caught (D-109).
| Property | Type | Category | Description |
|---|---|---|---|
Alert Radius (AlertRadius) | float | Caught | Visible enemies (guards) within this distance are alerted when the thief is caught (cm; 0 = none). |
Wary After Caught (bWaryAfterCaught) | bool | Caught | After being caught once, the NPC cannot be robbed again. |
Caught Effects (CaughtEffects) | FRSEEffectList | Caught | When the thief is caught: the unified effects (flags, reputation, Start Battle, Alert Enemies, Start Dialog...). |
Conditions (Conditions) | FRSEConditionSet | Pickpocket | Stealing is possible only while these pass (not from a friend, not after the quest). Empty = always. |
Difficulty (Difficulty) | float | Pickpocket | Pickpocket score at which the chance is Chance At Equal Score. |
Loot (Loot) | TArray<FRSEPickpocketEntry> | Pickpocket | |
Stolen Effects (StolenEffects) | FRSEEffectList | Pickpocket | Effects after a successful theft (a quest flag, a reputation drop nobody sees yet). |
URSEPopulateRules
Module RSEEditor, parent UDataAsset. Rules of the Populate tool (D-076, docs/product/world-tools.md): how many of each kind, spacing, density, distances from the player start, and what the placed actors get (random battle rules, spawner behaviors, chest loot by level, the trader's shop).
| Property | Type | Category | Description |
|---|---|---|---|
Chest Level Follows Distance (bChestLevelFollowsDistance) | bool | Chests | Farther chests (path from the player start) get levels nearer the top of the zone's range. |
Chest Flag Root (ChestFlagRoot) | FString | Chests | Parent of the chests' Opened flags (a tag per chest is created under it). |
Chest Flag Tag File (ChestFlagTagFile) | FString | Chests | Tag file (Config/Tags) that receives the chests' flags. |
Chest Loot Tiers (ChestLootTiers) | TArray<FRSEPopulateLootTier> | Chests | Contents by chest level (sorted by Min Level when used). |
Chests (Chests) | FRSEPopulateKindRule | Kinds | |
Random Areas (RandomAreas) | FRSEPopulateKindRule | Kinds | --- Kinds --- |
Save Points (SavePoints) | FRSEPopulateKindRule | Kinds | |
Signposts (Signposts) | FRSEPopulateKindRule | Kinds | Placed only when the request asks for signposts. |
Spawners (Spawners) | FRSEPopulateKindRule | Kinds | |
Traders (Traders) | FRSEPopulateKindRule | Kinds | |
Zone Exits (ZoneExits) | FRSEPopulateKindRule | Kinds | Placed only when the request asks for zone exits (placeholders: set their destination afterwards). |
Pools Per Area (PoolsPerArea) | int32 | Random Areas | Pools of the zone offered by one area (picked by seed). |
Random Area Extent (RandomAreaExtent) | FVector | Random Areas | Half size of a random encounter area's volume. |
Random Area Rules (RandomAreaRules) | FRSERandomEncounterRules | Random Areas | |
Battle Site Margin (BattleSiteMargin) | float | Spacing | Kept free around Tactics zones and ATB stages. |
Candidate Spacing (CandidateSpacing) | float | Spacing | Distance between two candidate points (smaller = finer, slower). |
Max Placements Per 100Square Meters (MaxPlacementsPer100SquareMeters) | float | Spacing | All kinds together: at most this many per 100 m² (0 = no cap). |
Min Distance Between Kinds (MinDistanceBetweenKinds) | float | Spacing | Placements of different kinds stand at least this far apart. |
Nav Projection Extent (NavProjectionExtent) | float | Spacing | How far a candidate may move to reach the navmesh. |
Groups Per Spawner (GroupsPerSpawner) | int32 | Spawners | |
Patrol Points (PatrolPoints) | int32 | Spawners | Patrol points given to each spawner (walked by patrolling behaviors), on the navmesh around it. |
Patrol Radius (PatrolRadius) | float | Spawners | |
Spawner Behaviors (SpawnerBehaviors) | TArray<FRSEPopulateBehaviorChoice> | Spawners | Behaviors mixed over the spawners by weight. Empty = every roaming behavior of the project, equally. |
Spawn Radius (SpawnRadius) | float | Spawners | |
Default Shop (DefaultShop) | TSoftObjectPtr<URSEShopData> | Trader | Shop of the trader when the request names none. Empty = no trader. |
Trader Name (TraderName) | FText | Trader | Name shown on the trader's prompt. |
URSEPrimaryDataAsset
Module RSECore, parent UPrimaryDataAsset, abstract, primary asset. Base class for all game content definitions (classes, abilities, items, tactical maps...).
| Property | Type | Category | Description |
|---|---|---|---|
Archetype Link (ArchetypeLink) | FRSEArchetypeLink | Archetype | The archetype this asset was made from and the fields its author changed (D-095). Unset = no archetype. The fields always hold the resolved values; the RPG Saga Studio and URSEArchetypeLibrary edit this link (propagation, "Reset to archetype"). Editing an inherited field in the Details panel marks it overridden. Editor-only, stripped from cooked builds. |
Balance Locked (bBalanceLocked) | bool | Info | Balance tools never change this asset (D-077, "Balance My Campaign"): no proposal targets it, and Apply skips it. Editor-only, stripped from cooked builds. |
Dev Notes (DevNotes) | FString | Info | Design notes for the team. Editor-only, stripped from cooked builds. |
Display Name (DisplayName) | FText | Info | Player-facing name. Localizable. |
URSEProgressionZoneData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A progression zone (D-051, docs/design/progression-designer.md): one chapter of the campaign with the level range of its regular enemies, the battles a player is expected to fight there and the party levels the designer aims for.
| Property | Type | Category | Description |
|---|---|---|---|
Encounter Pool (EncounterPool) | TArray<FRSEProgressionEncounterEntry> | Battles | The zone's regular encounters (usually Level Mode "Scaled"), picked at random by weight by the projection. The game itself picks encounters through its triggers and random encounter areas; this list mirrors them. |
Key Encounters (KeyEncounters) | TArray<TSoftObjectPtr<URSEEncounterData> > | Battles | Story battles, bosses, epic quest bosses of the zone (usually Level Mode "Fixed"), fought in this order after the regular battles. |
Max Enemy Level (MaxEnemyLevel) | int32 | Enemy Levels | Highest level of a regular (scaled) enemy fought in this zone. |
Min Enemy Level (MinEnemyLevel) | int32 | Enemy Levels | Lowest level of a regular (scaled) enemy fought in this zone. |
Expected Battles (ExpectedBattles) | int32 | Expectations | Regular battles a player fights on the critical path through this zone. |
Expected Optional Battles (ExpectedOptionalBattles) | int32 | Expectations | Extra regular battles the zone offers off the critical path (side areas, optional fights). |
Target Entry Level (TargetEntryLevel) | int32 | Expectations | Party level the designer expects when the party enters the zone (0 = not set). |
Target Exit Level (TargetExitLevel) | int32 | Expectations | Party level the designer expects when the party leaves the zone, after its key battles (0 = not set). |
Optional Zone (bOptionalZone) | bool | Zone | Optional content (a post-game area, an epic quest region): not on the critical path. The campaign projection plays it after the story is complete and reports it separately (optional content targets). |
Order Index (OrderIndex) | int32 | Zone | Position of the zone in the campaign (informational; the campaign's Zones list decides the order). |
URSEQuestData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A quest (D-027): the main storyline, a side quest, a card challenge or an optional event.
| Property | Type | Category | Description |
|---|---|---|---|
Auto Start Maps (AutoStartMaps) | TArray<TSoftObjectPtr<UWorld> > | Availability | Auto Start only while one of these maps is loaded (D-081): a demo map, a chapter's maps, a parallel scenario's. Empty = on any map. Effects (Start Quest) start the quest anywhere; once started it stays active on every map. |
Available When (AvailableWhen) | FRSEConditionSet | Availability | The quest can be started only while these pass (empty = always). Also drives giver markers. |
Auto Start (bAutoStart) | bool | Availability | Starts by itself as soon as it is available (story beats, events), instead of from an effect. |
Can Abandon (bCanAbandon) | bool | Availability | The player may abandon it (it can then be started again). Only side quests (Quest.Category.Side, D-029). |
Can Retry After Fail (bCanRetryAfterFail) | bool | Availability | A failed quest can be taken again from the beginning (D-029). Auto-start quests are not restarted by themselves. |
Fails at Point Of No Return (bFailsAtPointOfNoReturn) | bool | Failure | Missed (default failure outcome runs) when the point of no return is passed while it is active; the warning lists it. With bMissable, a quest not started by then is listed as Missed too. |
Missable (bMissable) | bool | Failure | The quest can be missed (journal hint). Its missed rules (FailWhen with bMissed) and bFailsAtPointOfNoReturn then also apply before it starts: a quest never started whose window closes is listed as Missed. |
Fail When (FailWhen) | TArray<FRSEQuestFailureRule> | Failure | Checked while active, before objectives. The first rule that passes fails (or, with bMissed, misses) the quest. |
Outcomes (Outcomes) | TArray<FRSEQuestOutcome> | Outcomes | Success variants and failures. The first of each kind is the default. |
Characters (Characters) | TArray<TSoftObjectPtr<UObject> > | Presentation | D-155: who the journal shows with the quest (portraits): the giver first, then the others. Characters or speakers. |
Header Image (HeaderImage) | TSoftObjectPtr<UTexture2D> | Presentation | D-155: the picture at the top of the journal page. Made by RPG Saga Engine -> Content -> Capture Quest Images (a view of the quest's place, captured from the level), or any texture. Empty = the generated art library's, else the category's colors. |
Category (Category) | FGameplayTag | Quest | Journal category (presentation grouping). |
Description (Description) | FText | Quest | Journal summary shown under the title. |
Giver (Giver) | FGameplayTag | Quest | Giver id for world markers (the NPC actor carries the same tag). |
Giver Name (GiverName) | FText | Quest | Who gives the quest, as shown in the journal (may be empty). |
Region (Region) | FGameplayTag | Quest | Where the quest takes place (journal grouping, map markers). |
Stages (Stages) | TArray<FRSEQuestStage> | Stages | The first stage is where the quest starts. |
URSEReinforcementData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Reinforcements (D-117, docs/product/reinforcements.md): a group calls for help during a battle.
| Property | Type | Category | Description |
|---|---|---|---|
Announce Text (AnnounceText) | FText | Call | Banner when the help is called. Empty = Reinforcements (Presentation) -> Announce Text ("Reinforcements!"). |
Cancel if Caller Interrupted (bCancelIfCallerInterrupted) | bool | Call | A call in progress is lost when the caller falls or gets an interrupting status (Reinforcements -> Interrupting Statuses). |
Call Bark (CallBark) | FText | Call | What the caller shouts while calling ("To me!"). Empty = Reinforcements (Presentation) -> Default Call Bark. |
Caller (Caller) | ERSEReinforcementCaller | Call | Who calls. |
Call Sound (CallSound) | FGameplayTag | Call | Sound of the call (an Audio.* tag of the sound catalog; a wolf's howl). Empty = the presentation settings' default. |
Call Turns (CallTurns) | int32 | Call | How long the call takes, in the caller's turns: 0 = at once; 1 = it completes when the caller's next turn starts (the player has the turns in between to stop it). |
Leftover (Leftover) | ERSEReinforcementLeftover | Free Tactics | Free Tactics: units still on their way when the battle ends. |
Spawn Points (SpawnPoints) | ERSEReinforcementSpawnPoints | Free Tactics | Free Tactics: how the placed Reinforcement Spawn Points are used. |
Waves (Waves) | TArray<FRSEReinforcementWave> | Waves | The waves, in order. |
URSERewardFeedStyle
Module RSE, parent UDataAsset. The look and timing of the reward feed (D-128): a UI style asset (DA_RewardFeedStyle_*).
| Property | Type | Category | Description |
|---|---|---|---|
Skip Fade Seconds (SkipFadeSeconds) | float | Common | Seconds everything takes to leave after a skip. |
Skip Keys (SkipKeys) | TArray<FKey> | Common | Keys that hurry everything off the screen (empty = none). |
Steam Deck Scale (SteamDeckScale) | float | Common | Scale on a Steam Deck (its 7" screen). |
Experience Color (ExperienceColor) | FRSEUIColor | Floaters | |
Experience Format (ExperienceFormat) | FText | Floaters | {Amount}. |
Experience Role (ExperienceRole) | ERSETextRole | Floaters | |
Floater Fade Seconds (FloaterFadeSeconds) | float | Floaters | |
Floater Height (FloaterHeight) | float | Floaters | Height above the character's feet (cm) the texts start at. |
Floater Rise (FloaterRise) | float | Floaters | The experience text rises this far (pixels at 1080p) over its life. |
Floater Seconds (FloaterSeconds) | float | Floaters | |
Floater Stagger Seconds (FloaterStaggerSeconds) | float | Floaters | Delay between two characters' texts. |
Detail Color (DetailColor) | FRSEUIColor | Level Up | |
Level Up Color (LevelUpColor) | FRSEUIColor | Level Up | |
Level Up Delay (LevelUpDelay) | float | Level Up | After the experience text, before the level up appears. |
Level Up Glow Color (LevelUpGlowColor) | FRSEUIColor | Level Up | The glow behind it. |
Level Up Pop Scale (LevelUpPopScale) | float | Level Up | It grows from this scale and settles at 1. |
Level Up Pop Seconds (LevelUpPopSeconds) | float | Level Up | |
Level Up Role (LevelUpRole) | ERSETextRole | Level Up | |
Level Up Seconds (LevelUpSeconds) | float | Level Up | |
Level Up Text (LevelUpText) | FText | Level Up | The level up: its text, color, size, and the pop it makes. |
Max New Abilities Shown (MaxNewAbilitiesShown) | int32 | Level Up | |
More Abilities Format (MoreAbilitiesFormat) | FText | Level Up | |
New Ability Format (NewAbilityFormat) | FText | Level Up | |
New Level Format (NewLevelFormat) | FText | Level Up | Under it: {Level} and each new ability ({Ability}), at most Max New Abilities Shown (then "+N more"). |
Providers (Providers) | TArray<TObjectPtr<URSERewardToastProvider> > | Providers | What makes toasts, in order. Empty = the built-in list (items, money, Pact points, recruits, bestiary, quests). |
Avoid HUDElements (bAvoidHUDElements) | bool | Toasts|Layout | P32d: the stack starts below HUD elements that report their area in its column (the quest tracker; URSEHUDLayoutSubsystem). |
Icon Size (IconSize) | float | Toasts|Layout | |
Max Visible (MaxVisible) | int32 | Toasts|Layout | Toasts on screen at once; more wait their turn. |
Right Margin (RightMargin) | float | Toasts|Layout | Distance of the stack from the right edge, and its top as a share of the screen's height. |
Stack Top (StackTop) | float | Toasts|Layout | |
Toast Height (ToastHeight) | float | Toasts|Layout | |
Toast Spacing (ToastSpacing) | float | Toasts|Layout | |
Toast Width (ToastWidth) | float | Toasts|Layout | --- Toasts --- |
Accent Bar Width (AccentBarWidth) | float | Toasts|Look | The accent bar on the toast's left edge and the soft glow it casts. |
Accent Glow Opacity (AccentGlowOpacity) | float | Toasts|Look | |
Arrival Flash Opacity (ArrivalFlashOpacity) | float | Toasts|Look | A light flash over a toast as it arrives. |
Background Color (BackgroundColor) | FRSEUIColor | Toasts|Look | |
Corner Radius (CornerRadius) | float | Toasts|Look | |
Default Accent (DefaultAccent) | FRSEUIColor | Toasts|Look | Kinds without a color. |
Kind Colors (KindColors) | TMap<FName,FRSEUIColor> | Toasts|Look | Color of each kind of toast (items use their rarity). |
Subtitle Role (SubtitleRole) | ERSETextRole | Toasts|Look | |
Title Role (TitleRole) | ERSETextRole | Toasts|Look | |
Value Role (ValueRole) | ERSETextRole | Toasts|Look | |
Fade in Seconds (FadeInSeconds) | float | Toasts|Motion | |
Fade Out Seconds (FadeOutSeconds) | float | Toasts|Motion | |
Hold Seconds (HoldSeconds) | float | Toasts|Motion | |
Restack Speed (RestackSpeed) | float | Toasts|Motion | How fast the stack closes up when a toast leaves (per second, a share of the gap). |
Slide Distance (SlideDistance) | float | Toasts|Motion | A toast slides in from the right over this distance. |
Stagger Seconds (StaggerSeconds) | float | Toasts|Motion | Time between two toasts appearing. |
URSERoamingBehaviorData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Behavior profile of visible enemy groups (D-063, visible soldiers): attitude, speeds, detection, chase limits and the alert shown when they notice the party.
| Property | Type | Category | Description |
|---|---|---|---|
Alarm Radius (AlarmRadius) | float | Alarm | When it becomes aware of the party it raises the alarm this far: the groups inside join its battle, the others stay unaware. -1 = Stealth -> Alarm -> Default Alarm Radius; 0 = it never raises the alarm (a lone animal). |
Alert Seconds (AlertSeconds) | float | Alert | How long the alert stays. |
Alert Text (AlertText) | FText | Alert | The alert text. Empty = the default of the Encounter Presentation settings ("!"). |
Show Alert (bShowAlert) | bool | Alert | Shows an alert above the leader when it notices the party. |
Attitude (Attitude) | ERSERoamingAttitude | Behavior | |
Behavior Tags (BehaviorTags) | FGameplayTagContainer | Behavior | Tags the time and weather rules (Time & Weather Rules -> Behavior Rules -> Applies To, D-101 / D-104) target these enemies by, together with their character's traits and bestiary category ("Enemy.Nocturnal": wolves hunt at night). |
Idle (Idle) | ERSERoamingIdle | Behavior | |
Flee if Party Levels Above (FleeIfPartyLevelsAbove) | int32 | Chase | Any attitude runs away from a party this many levels above the group (0 = never). |
Give Up Distance (GiveUpDistance) | float | Chase | Gives up when it gets this far from its spawn point. |
Lose Sight Seconds (LoseSightSeconds) | float | Chase | Gives up after this long without seeing the party. |
Max Chase Seconds (MaxChaseSeconds) | float | Chase | Gives up after chasing this long in total (0 = no limit). |
Safe Distance (SafeDistance) | float | Chase | Cautious: runs until it is this far from the party. |
Contact Padding (ContactPadding) | float | Contact | Extra distance around the body that counts as touching the party. |
Require Line Of Sight (bRequireLineOfSight) | bool | Detection | Sight needs a clear line (a visibility trace). |
Detection Speed (DetectionSpeed) | float | Detection | How quickly this kind of enemy fills its detection meter (D-097, Stealth settings): 2 = twice as alert, 0.5 = half. 0 = it never notices the party by itself (it still joins a battle it is called to). |
Hearing Radius (HearingRadius) | float | Detection | Notices the party inside this distance whatever its facing (Aggressive: hearing; Cautious: the distance that scares it). |
Reaction Seconds (ReactionSeconds) | float | Detection | Seconds between noticing the party (the alert shows) and starting the chase. |
Sight Half Angle (SightHalfAngle) | float | Detection | ...and within this half angle of its facing. |
Sight Max Height Difference (SightMaxHeightDifference) | float | Detection | D-151: its eyes do not reach a party member this much higher or lower (a cliff, a roof, a ditch); hearing still does. 0 = any height. |
Sight Radius (SightRadius) | float | Detection | Aggressive: sees the party inside this distance... |
Chase Speed (ChaseSpeed) | float | Movement | Speed while chasing the party (Aggressive). |
Flee Speed (FleeSpeed) | float | Movement | Speed while running away (Cautious, or an overleveled party). |
Pause Max (PauseMax) | float | Movement | |
Pause Min (PauseMin) | float | Movement | Wander / Patrol: pause at each point (random between the two). |
Walk Speed (WalkSpeed) | float | Movement | --- Movement --- |
Wander Radius (WanderRadius) | float | Movement | Wander: how far from the spawn point the group walks. |
Reinforcements (Reinforcements) | TObjectPtr<URSEReinforcementData> | Reinforcements | Groups with this behavior call for help in their battles (a wolf alpha howling for the pack). Below the spawner's and the encounter's own. |
URSERulesProfile
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A set of gameplay-rule overrides (D-035, docs/design/rules-profiles.md): e.g.
| Property | Type | Category | Description |
|---|---|---|---|
Description (Description) | FText | Info | Designer-facing explanation (what this profile is for). |
Parent (Parent) | TObjectPtr<URSERulesProfile> | Rules | Optional base profile: sections missing here are looked up there (then in its parent, then globally). |
Sections (Sections) | TArray<TObjectPtr<URSEDeveloperSettings> > | Rules | Overridden settings sections, one per settings class. Add one with the "+" and pick a class. |
URSESaveItemData
Module RSE, parent URSEConsumableData, primary asset. The consumable save item (D-010): saves anywhere outside battles, dialogs, cutscenes and no-save zones.
URSESceneData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A story scene played with a Level Sequence (D-043, docs/design/scenes.md).
| Property | Type | Category | Description |
|---|---|---|---|
Auto Advance Lines (bAutoAdvanceLines) | bool | Line Sections | Lines go on by themselves when their spoken part ends (a film). Off = the player advances (the hold loops meanwhile). |
Dialog (Dialog) | TSoftObjectPtr<URSEDialogData> | Line Sections | Line Sections: the conversation. It starts when the sequence reaches Dialog Start. |
Dialog Start Marker (DialogStartMarker) | FName | Line Sections | Marked frame where the dialog starts (after the establishing shot). None or missing = Dialog Start Time. |
Dialog Start Time (DialogStartTime) | float | Line Sections | |
Line Sections (LineSections) | TArray<FRSESceneLineSection> | Line Sections | One section per line or choice of Dialog (made by Cinematic from Screenplay). Lines without one keep the current shot. |
Outro Marker (OutroMarker) | FName | Line Sections | Marked frame of the outro, played from there to the end when the dialog ends. None or missing = Outro Time. |
Outro Time (OutroTime) | float | Line Sections | Seconds of the outro start (negative = the dialog's end ends the scene at once). |
Restore Music at End (bRestoreMusicAtEnd) | bool | Music | The music from before the scene comes back at the end. Off = Music keeps playing until Restore Music. |
Music (Music) | TSoftObjectPtr<UObject> | Music | Story music while the scene plays (empty = the current music continues). |
Music Fade In (MusicFadeIn) | float | Music | Fade-in of Music. Negative = the audio default. |
Hide Player (bHidePlayer) | bool | Playback | Hides the player's pawn while the scene plays (when it is not bound in the sequence). |
Keep State at End (bKeepStateAtEnd) | bool | Playback | Actors keep what the scene did to them (the NPC stays turned). Off = everything is restored at the end. |
Blend Out Seconds (BlendOutSeconds) | float | Playback | Camera blend back to gameplay at the end. Negative = the Scenes settings' default. |
Skippable (bSkippable) | bool | Playback | The player may skip it (after a confirmation). |
Bindings (Bindings) | TArray<FRSESceneBinding> | Scene | Tagged Sequencer bindings played by real actors. |
Dialog Cues (DialogCues) | TArray<FRSESceneDialogCue> | Scene | Dialogs synced with the sequence (in time order or not; they are sorted when the scene starts). |
Dialog Sync (DialogSync) | ERSESceneDialogSync | Scene | Cues: dialogs started at moments of the sequence (D-043). Line Sections: the dialog drives the sequence line by line (D-078). |
End Effects (EndEffects) | FRSEEffectList | Scene | Run once when the scene ends or is skipped (not on theater replays). |
Seen Event (SeenEvent) | FGameplayTag | Scene | Marked seen when the scene ends or is skipped (saved; Event Seen condition; the theater lists seen scenes). |
Sequence (Sequence) | TSoftObjectPtr<UObject> | Scene | The Level Sequence. |
URSEShopData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A shop (D-042, docs/design/economy.md): its stock and whether it buys from the party.
| Property | Type | Category | Description |
|---|---|---|---|
Buys Items (bBuysItems) | bool | Shop | The shop buys items from the party (Sell tab). |
Greeting (Greeting) | FText | Shop | Line under the title ("Welcome! Take a look."). |
Sell Ratio Override (SellRatioOverride) | float | Shop | Sell ratio of this shop. Negative = the Economy settings' SellRatio. |
Stock (Stock) | TArray<FRSEShopEntry> | Shop |
URSESoundCatalog
Module RSE, parent URSEPrimaryDataAsset, primary asset. The sound effect library (D-036): GameplayTag -> sound.
| Property | Type | Category | Description |
|---|---|---|---|
Parent (Parent) | TObjectPtr<URSESoundCatalog> | Catalog | Fallback catalog (e.g. a project catalog over the framework's defaults). |
Sounds (Sounds) | TMap<FGameplayTag,FRSESoundCatalogEntry> | Catalog |
URSESpeakerData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. Someone who speaks in dialogs (dialog-proposal.md 4.4).
| Property | Type | Category | Description |
|---|---|---|---|
Blip Pitch Range (BlipPitchRange) | FVector2D | Presentation | Random pitch range of the blip. |
Default Portrait Side (DefaultPortraitSide) | ERSEDialogPortraitSide | Presentation | |
Emote Set (EmoteSet) | TSoftObjectPtr<UObject> | Presentation | Emote set (a data type of the RSE module: montages and balloons per Emote.* tag). |
Name Color (NameColor) | FLinearColor | Presentation | |
Portraits (Portraits) | TMap<FGameplayTag,TSoftObjectPtr<UTexture2D> > | Presentation | Expression (Dialog.Expression.*) -> portrait. Dialog.Expression.Neutral is required. |
Voice Blip (VoiceBlip) | TSoftObjectPtr<USoundBase> | Presentation | Typewriter sound for unvoiced lines. |
Appearance (Appearance) | TSoftObjectPtr<URSECharacterAppearanceBase> | Presentation|Portrait Mode | The look of the Live mode and of generated portraits for speakers without a Character (NPCs). Empty = the Character's appearance. |
Appearance Variant (AppearanceVariant) | FName | Presentation|Portrait Mode | One of the appearance's variants (None = its parts as they are). |
Portrait Mode (PortraitMode) | ERSEDialogPortraitMode | Presentation|Portrait Mode | How the portrait is shown (D-075): Image (Portraits), Video (Portrait Videos) or Live (a render of the appearance). Lines may override it. Missing clips / appearance, or modes turned off (settings, Steam Deck profile), fall back to Image. |
Portrait Videos (PortraitVideos) | TMap<FGameplayTag,TSoftObjectPtr<UObject> > | Presentation|Portrait Mode | Expression (Dialog.Expression.*) -> looping clip (a Media Source: talking / idle), for the Video mode. Neutral is the fallback. |
Character (Character) | TSoftObjectPtr<URSECharacterData> | Speaker | The playable character this speaker is, if any: "first available" speakers check it is in the party. |
Name Revealed Condition (NameRevealedCondition) | FRSEConditionSet | Speaker | When the player knows the real name. Empty = always known. |
Speaker Tag (SpeakerTag) | FGameplayTag | Speaker | Id used by cues and by speaker components on actors. |
Unknown Name (UnknownName) | FText | Speaker | Shown until NameRevealedCondition passes (empty = the dialog settings' DefaultUnknownName). |
URSEStatusData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A status effect (poison, haste, stun...).
| Property | Type | Category | Description |
|---|---|---|---|
AIValue Scale (AIValueScale) | float | AI | Multiplies what the AI thinks applying this status is worth. The AI measures stat changes against the threats around the unit (damage prevented or added) and gives a flat value to what it cannot measure (granted tags, other stats, affinities). 0 = the AI ignores the status, 2 = it values it twice. |
Behaviors (Behaviors) | TArray<TObjectPtr<URSEStatusBehavior> > | Control | How the status changes the way its bearer acts: Confuse (random targets, allies included), Charm (fights for the other side), Berserk (attacks only, on its own) or your own (Custom (Blueprint)). Every battle mode and the AI follow them. |
Periodic Percent Of Max HP (PeriodicPercentOfMaxHP) | float | Periodic | HP change per period as a percentage of max HP. Positive damages (poison), negative heals (regen). |
Periodic Timing (PeriodicTiming) | ERSEStatusTiming | Periodic | |
Persists After Battle (bPersistsAfterBattle) | bool | Status | The status stays on party members after battle, until cured (Poison, Blind...). Others end with the battle (D-025). |
Removed by Damage (bRemovedByDamage) | bool | Status | The status ends when the unit takes damage (e.g. Sleep). |
Duration Turns (DurationTurns) | int32 | Status | Turns of the afflicted unit before the status wears off. 0 = until removed. |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Status | Icon in menus and on battle cards (D-075). Empty = no icon (or the generated art library's); the Portrait & Icon Studio makes one from its polarity. |
Immunity Tag (ImmunityTag) | FGameplayTag | Status | Units with this tag (from equipment, class traits, Pacts...) cannot receive the status. |
Stacking (Stacking) | ERSEStatusStacking | Status | |
Status Tag (StatusTag) | FGameplayTag | Status | |
Effect Anchor (EffectAnchor) | FGameplayTag | Status|Visual | Where the loop effect sits on the body (Appearance.Anchor.*; empty = the feet). |
Effect Scale (EffectScale) | float | Status|Visual | |
Loop Effect (LoopEffect) | TSoftObjectPtr<UObject> | Status|Visual | D-115: a looping effect on the unit while the status lasts in battle (embers for a burn, bubbles for poison). A Niagara system or a legacy particle system. Empty = Battle Feel -> Status Visuals for this tag (or none). |
Dispellable (bDispellable) | bool | Toolkit | Dispel / Purge / Steal Buff may remove it (off for curses, transformations, story statuses). |
Taunt (bTaunt) | bool | Toolkit | A taunt: AI units with it strongly prefer (or must, see Ability Toolkit settings) to target the unit that applied it. |
Polarity (Polarity) | ERSEStatusPolarity | Toolkit | Buff or debuff: Dispel / Purge effects remove statuses by polarity, Steal Buff takes buffs. |
Shield Absorbs (ShieldAbsorbs) | ERSEShieldAbsorb | Toolkit | A shield (barrier): absorbs damage of this kind before HP, from a pool set by the Shield effect that applies it. The status ends when the pool is empty (or when its duration runs out). |
Affinities (Affinities) | TArray<FRSEElementAffinityEntry> | While Active | |
Granted Tags (GrantedTags) | FGameplayTagContainer | While Active | |
Modifiers (Modifiers) | TArray<FRSEStatModifier> | While Active |
URSESurfaceData
Module RSECore, parent URSETileZoneData, primary asset. A surface type for Free Tactics (D-108): a tile zone (URSETileZoneData: effects on enter and at turn start, who it touches, duration, the Tactics look) with the free-movement extras: movement cost, slipping, a tooltip and the look of its decal.
| Property | Type | Category | Description |
|---|---|---|---|
Look (Look) | ERSESurfaceLook | Presentation | How its ground decal looks (pattern and animation); the color is the zone's Color. |
Slip Ends Move (bSlipEndsMove) | bool | Surface | A unit that slips stops where it fell (its move ends). |
Description (Description) | FText | Surface | What the tooltip says about it ("Burns whoever stands in it. Water puts it out."). |
Move Cost Multiplier (MoveCostMultiplier) | float | Surface | Movement cost multiplier while walking through it (1 = normal, 2 = each meter costs two). |
Route Avoid Cost (RouteAvoidCost) | float | Surface | D-156: how hard routes avoid it, in meters of extra walking a route accepts to keep one meter out of it (the same for the player's paths and the AI's). Below 0 = automatic: Free Tactics Field -> Route Hazards (Harmful Avoid Cost for a surface that hurts, Slippery Avoid Cost for one that only makes units slip, nothing otherwise). 0 = routes walk through it freely. |
Slip Chance (SlipChance) | float | Surface | Chance (percent) that a unit walking onto it slips and falls (ice, oil). 0 = never. |
Slip Status (SlipStatus) | TObjectPtr<URSEStatusData> | Surface | Status of a unit that slips (prone). Empty = Free Tactics Field -> Default Slip Status. |
URSETargetingStyle
Module RSE, parent UDataAsset. D-146: how single-target aiming looks in the live mode (docs/design/free-tactics.md, "Targeting"): the rings on the units an ability can be aimed at (the chosen one highlighted, the others dimmed with their reason), the subtle arc of a projectile colored by the line of sight, the card at the target...
| Property | Type | Category | Description |
|---|---|---|---|
Arc Blocked (ArcBlocked) | FRSEUIColor | Arc | |
Arc Clear (ArcClear) | FRSEUIColor | Arc | |
Arc Dash (ArcDash) | float | Arc | Dash and gap of the arc (pixels). |
Arc Gap (ArcGap) | float | Arc | |
Arc Partial (ArcPartial) | FRSEUIColor | Arc | |
Arc Thickness (ArcThickness) | float | Arc | |
Projectile Arc (bProjectileArc) | bool | Arc | Projectiles (ranged abilities that need a line of sight) show a subtle dashed arc from the user to the target. |
Direct Arc Rise (DirectArcRise) | float | Arc | Rise of the arc of a straight shot (cm; lobbed attacks use their own arc height). |
Body Font Size (BodyFontSize) | int32 | Card | |
Card Background (CardBackground) | FRSEUIColor | Card | |
Card Offset (CardOffset) | float | Card | The card stands this far to the right of the target's head on screen (pixels). |
Card Subtle (CardSubtle) | FRSEUIColor | Card | |
Card Text (CardText) | FRSEUIColor | Card | |
Card Width (CardWidth) | float | Card | --- Card at the target --- |
Damage Color (DamageColor) | FRSEUIColor | Card | |
Heal Color (HealColor) | FRSEUIColor | Card | |
HPBack (HPBack) | FRSEUIColor | Card | |
HPFill (HPFill) | FRSEUIColor | Card | |
HPGain (HPGain) | FRSEUIColor | Card | |
HPLoss (HPLoss) | FRSEUIColor | Card | The part of the HP bar the hit would take (or the heal would add). |
Reason Color (ReasonColor) | FRSEUIColor | Card | The reason a target cannot be aimed at (out of range, no line of sight). |
Title Font Size (TitleFontSize) | int32 | Card | |
Ally Watch Color (AllyWatchColor) | FRSEUIColor | Overwatch | |
Enemy Watch Color (EnemyWatchColor) | FRSEUIColor | Overwatch | Rings of the units on Overwatch at their watch range (enemies' while you choose where to walk) and the label over them. |
Watch Callout (WatchCallout) | FText | Overwatch | |
Watch Label (WatchLabel) | FText | Overwatch | "Overwatch" over a watching unit, and the callout when it goes on watch. Empty = the built-in texts. |
Watch Ring Thickness (WatchRingThickness) | float | Overwatch | |
Gamepad Key Hints (GamepadKeyHints) | FText | Prompt | |
Key Hints (KeyHints) | FText | Prompt | Key hints under the prompt (keyboard and mouse; gamepad). Empty = the built-in texts. |
Prompt Font Size (PromptFontSize) | int32 | Prompt | |
Prompt Top (PromptTop) | float | Prompt | The prompt over the field while aiming (title and key hints), this far below the top of the screen (pixels). |
Candidate Opacity (CandidateOpacity) | float | Rings | Opacity of a valid candidate that is not chosen. |
Dimmed Color (DimmedColor) | FRSEUIColor | Rings | A unit that cannot be aimed at (out of range, hidden): its ring and reason in this color and opacity. |
Dimmed Opacity (DimmedOpacity) | float | Rings | |
Marker Height (MarkerHeight) | float | Rings | |
Marker Size (MarkerSize) | float | Rings | The marker over the chosen unit's head (pixels; 0 = none) and its height above the feet (cm). |
Pulse Amount (PulseAmount) | float | Rings | |
Pulse Speed (PulseSpeed) | float | Rings | The chosen ring breathes (cycles per second; 0 = still) by this fraction of its radius. |
Ring Min Radius (RingMinRadius) | float | Rings | |
Ring Radius Scale (RingRadiusScale) | float | Rings | A ring's radius around a unit: its footprint times this (cm), at least Ring Min Radius. |
Ring Segments (RingSegments) | int32 | Rings | Points of a ring (smoother = more). |
Ring Thickness (RingThickness) | float | Rings | Line width of a candidate's ring and of the chosen one's (pixels). |
Selected Ring Thickness (SelectedRingThickness) | float | Rings | |
Compact Below Height (CompactBelowHeight) | float | Small Screens | On screens at most this tall (pixels; the Steam Deck is 800), texts and lines grow by Compact Scale. |
Compact Scale (CompactScale) | float | Small Screens | |
Hostile (Hostile) | FRSETargetingTheme | Themes | Attacks and debuffs on enemies. |
Self (Self) | FRSETargetingTheme | Themes | Abilities used on the user alone (a stance, Overwatch). |
Support (Support) | FRSETargetingTheme | Themes | Heals and buffs on allies. |
URSETeacherData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. An NPC who teaches abilities (D-144): an "ability shop" opened from a dialog (effect Open Teacher) or a single lesson (effect Teach Ability).
| Property | Type | Category | Description |
|---|---|---|---|
Offers Respec (bOffersRespec) | bool | Respec | This teacher resets a character's points (used when Respec Mode is NPC; also offered in other modes). |
Respec Money (RespecMoney) | int32 | Respec | |
Greeting (Greeting) | FText | Teacher | Line shown at the top of the teacher screen. |
Offers (Offers) | TArray<FRSETeacherOffer> | Teacher |
URSETestRoomDefinition
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A test room (P55, D-179): a small map built to exercise one area of the framework, with a smoke script that proves it works.
| Property | Type | Category | Description |
|---|---|---|---|
Presets (Presets) | TArray<FRSEBattleLaunchPreset> | Launch | Battle setups the launcher offers in this room. |
Needs Network (bNeedsNetwork) | bool | Room | The room needs more than one player (a listen server and a client): the single-process smoke test skips it. |
Description (Description) | FText | Room | What the room shows and what its smoke test proves (one or two sentences, for the menu tooltip and the docs). |
Map (Map) | TSoftObjectPtr<UWorld> | Room | The room's map. |
Room Id (RoomId) | FName | Room | Stable name of the room (letters, digits, underscore): used by RSE.Rooms.Go and the test name RSE.Rooms.<RoomId>. |
Smoke Script (SmokeScript) | TArray<FString> | Smoke Test | The smoke test, one dev-script line each (the language of RSE.Dev.Script): console commands, "wait <seconds>", "waituntil <state> [timeout]" and "assert <state>" / "assertnot <state>" (states: battle, exploration, results, gameover, dialog, nodialog, scene, noscene, ready, action, noaction, freebattle, nofreebattle, playerturn). Lines starting with # are comments. Empty = the room has no scripted test (it only has to open and start play). |
Timeout Seconds (TimeoutSeconds) | float | Smoke Test | Seconds the test waits for the room to start play, and again for the script to finish (on top of the script's own waits). |
URSETileZoneData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A tile zone (D-055): fire, ice, poison, healing, blessed ground, or a trap.
| Property | Type | Category | Description |
|---|---|---|---|
Color (Color) | FLinearColor | Presentation | Tint of the default zone look (when Visual is empty). |
Visual (Visual) | TSoftObjectPtr<URSEFieldVisualBase> | Presentation | How the zone looks (soft; RSE's field visual asset). Empty = the Tactics presentation's default zone look. |
Hidden from Enemies (bHiddenFromEnemies) | bool | Zone | Only the creator's side sees it (traps). The presentation hides it from the others. |
Slippery (bSlippery) | bool | Zone | Slippery (ice): a unit ending its move here slides one more tile; knockbacks slide further (Ability Toolkit: Max Slide Tiles). |
Trap (bTrap) | bool | Zone | A trap: fires once, on the first unit that enters it and passes TriggerFilter, stops that unit's move, then disappears. |
Duration Turns (DurationTurns) | int32 | Zone | Turns of the creator the zone lasts (after it is gone: every unit's turn counts). 0 = until the battle ends. |
Effects on Enter (EffectsOnEnter) | TArray<TObjectPtr<URSEAbilityEffect> > | Zone | Applied once per move to a unit entering the zone (walking, pushed, landing), if it passes TriggerFilter. |
Effects on Turn Start (EffectsOnTurnStart) | TArray<TObjectPtr<URSEAbilityEffect> > | Zone | Applied to a unit that starts its turn inside the zone, if it passes TriggerFilter. |
Extra Move Cost (ExtraMoveCost) | int32 | Zone | Extra Action Points to walk into a tile of the zone (mud, thorns). |
Power Multiplier (PowerMultiplier) | float | Zone | Power of the zone's effects (like an ability's power multiplier). |
Removes Zones (RemovesZones) | FGameplayTagContainer | Zone | Creating this zone removes zones with these tags on the same tiles (fire melts ice). |
Trigger Filter (TriggerFilter) | ERSETargetFilter | Zone | Who the zone's effects touch, relative to its creator (Enemies: a trap never catches its owner's side). |
Zone Tag (ZoneTag) | FGameplayTag | Zone | Identifies the zone kind (Zone.Fire, Zone.Ice...): other zones cancel it by tag. |
URSETimeOfDayProfile
Module RSE, parent URSEPrimaryDataAsset, primary asset. The look of a whole day (D-101): hour keys (light, colors, fog, exposure, grading, stars) and the path of the sun and the moon.
| Property | Type | Category | Description |
|---|---|---|---|
Max EV100 (MaxEV100) | float | Exposure | |
Min EV100 (MinEV100) | float | Exposure | Eye adaptation range (EV100): the night never adapts brighter than MinEV100, so it stays night. |
Keys (Keys) | TArray<FRSESkyKey> | Keys | Hour keys, in any order (sorted when used). At least one. |
Horizon Fade Degrees (HorizonFadeDegrees) | float | Sun & Moon | The sun / moon light fades in over this many degrees above the horizon. |
Max Moon Elevation (MaxMoonElevation) | float | Sun & Moon | Moon height in the middle of the night (degrees). |
Max Sun Elevation (MaxSunElevation) | float | Sun & Moon | Sun height at midday (degrees). |
Min Moon Light Elevation (MinMoonLightElevation) | float | Sun & Moon | The moon light never comes lower than this (long night shadows stay readable). |
Moon Disc Brightness (MoonDiscBrightness) | float | Sun & Moon | Brightness of the moon disc. |
Moon Disc Scale (MoonDiscScale) | float | Sun & Moon | Size of the moon disc in the sky (multiplies the light's source angle). |
Sunrise Hour (SunriseHour) | float | Sun & Moon | The sun rises (crosses the horizon) at this hour. |
Sunrise Yaw (SunriseYaw) | float | Sun & Moon | World yaw of the sunrise (degrees). The sun crosses to the opposite side by sunset. |
Sunset Hour (SunsetHour) | float | Sun & Moon | The sun sets at this hour. |
URSETouchLayout
Module RSE, parent UPrimaryDataAsset, primary asset. "RSE Touch Layout" (D-180, docs/product/mobile.md): the on-screen controls and gestures of one moment of play (exploration, grid Tactics, live Tactics, classic battles, action battles).
| Property | Type | Category | Description |
|---|---|---|---|
Context (Context) | ERSETouchContext | Layout | The moment of play this layout is made for (validation, the Studio list). The settings decide where it is used. |
Controls (Controls) | TArray<FRSETouchControl> | Layout | |
Display Name (DisplayName) | FText | Layout | The name in tools and logs. |
Gestures (Gestures) | TArray<FRSETouchGestureBinding> | Layout |
URSETrapData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A kind of trap (D-109): a pressure plate, a tripwire, a gas vent, an arrow trap.
| Property | Type | Category | Description |
|---|---|---|---|
Battle Effects (BattleEffects) | TArray<TObjectPtr<URSEAbilityEffect> > | Battle | Extra battle effects on the unit that sets it off in a Free Tactics battle, run as the unit's own (a surface or zone once the battle supports it, a push, a debuff). Damage and Statuses above already apply; leave empty for most traps. |
Stops Movement (bStopsMovement) | bool | Battle | The unit stops on the trap when it goes off (its walk ends there). |
Area Radius (AreaRadius) | float | Effect | It hits every party member within Area Radius of the trap (a gas vent), not only the one who stepped on it. 0 = only the one who set it off. |
Damage (Damage) | FRSETrapDamage | Effect | --- When it goes off --- |
Disarm Effects (DisarmEffects) | FRSEEffectList | Effect | Effects on disarm (salvaged parts: Give Item). |
Noise Radius (NoiseRadius) | float | Effect | Visible enemies within this distance hear it and come running (cm; 0 = silent). |
Status Chance (StatusChance) | float | Effect | Chance of each status (percent). |
Statuses (Statuses) | TArray<TObjectPtr<URSEStatusData> > | Effect | Statuses it tries to give (lasting ones stay after battles, D-025). |
Trigger Effects (TriggerEffects) | FRSEEffectList | Effect | Story effects when it goes off in exploration (an alarm flag, a door slamming shut). |
Spotted Text (SpottedText) | FText | Texts | Shown when a member spots it ("{Member} spotted a {Trap}."). Empty = Exploration RPG UI default. |
Triggered Text (TriggeredText) | FText | Texts | Shown when it goes off ("Click! Arrows fly from the wall."). Empty = the default. |
Failure Triggers (bFailureTriggers) | bool | Trap | A failed disarm sets it off (off = the attempt only fails and may be tried again). |
Consumed Per Attempt (ConsumedPerAttempt) | TArray<TObjectPtr<URSEItemData> > | Trap | Items used up by each disarm attempt (a spare wire). Empty = nothing is used. |
Detect Difficulty (DetectDifficulty) | float | Trap | Perception needed to spot it (passive: a member whose score reaches it sees it). |
Disarm Difficulty (DisarmDifficulty) | float | Trap | Disarm score at which the chance is Exploration RPG -> Chance At Equal Score. |
Disarm Requirements (DisarmRequirements) | FRSEExploreRequirements | Trap | Who may try to disarm it. |
Kind (Kind) | FGameplayTag | Trap | What kind of trap it is (Trap.PressurePlate, Trap.Tripwire...): the world actor picks its look by it. |
Rearm Seconds (RearmSeconds) | float | Trap | It arms itself again this many seconds after going off (0 = once only). |
URSETravelDestinationData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A place of the world map (D-044, docs/design/zones-travel.md): where fast travel can take the party once the place is discovered.
| Property | Type | Category | Description |
|---|---|---|---|
Conditions (Conditions) | FRSEConditionSet | Availability | Travel there only while these pass (a discovered place may be closed by the story). Empty = always. |
Area (Area) | TSoftObjectPtr<URSEAreaData> | Destination | The area the party arrives in (its map is opened). Being in this area means "you are here". |
Arrival Point (ArrivalPoint) | FName | Destination | ARSEArrivalPoint id on the area's map. None = the area's default arrival point. |
Description (Description) | FText | Destination | Shown in the world map details. |
Discovered by Default (bDiscoveredByDefault) | bool | Discovery | Known from the start (the home town). |
Discover on Visit (bDiscoverOnVisit) | bool | Discovery | Discovered the first time the player is in Area (travel, load or walking in). |
Discovery Flag (DiscoveryFlag) | FGameplayTag | Discovery | Also discovered while this story flag is set (Set Flag effect in a dialog, a map bought in a shop...). |
Map Position (MapPosition) | FVector2D | World Map | Marker position on the world map, normalized (0,0 = top left, 1,1 = bottom right). |
Sort Order (SortOrder) | int32 | World Map | Order in the list (lower first; equal orders sort by name). |
URSETraversalKindData
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. A kind of traversal (D-121, docs/design/traversal.md): what every ladder, rope, swim area or jump of that kind shares.
| Property | Type | Category | Description |
|---|---|---|---|
Kind Tag (KindTag) | FGameplayTag | Kind | Identity for conditions, statistics and UI (Traversal.Kind.*). |
Prompt Backward (PromptBackward) | FText | Kind | Prompt at the end point, for links taken back ("Climb down"). Empty = Prompt Forward. |
Prompt Forward (PromptForward) | FText | Kind | Prompt at the start end ("Climb up", "Jump", "Swim"). |
Allow Save (bAllowSave) | bool | Rules | Saving is allowed while someone is on it (D-010). Off for ladders and ropes: a save never holds a body mid-climb. |
Blocked Tags (BlockedTags) | FGameplayTagContainer | Who | Units or characters with any of these tags may not (heavy armor that sinks, a status that roots). |
Required Tags (RequiredTags) | FGameplayTagContainer | Who | Only units or characters with all of these tags (traits, statuses) may use it. |
URSETraversalLinkKindData
Module RSECore, parent URSETraversalKindData, primary asset. A link between two standable points (D-121): ladders, ropes, jumps across gaps, vaults over low ledges, controlled drops, zip-lines, rope swings, rope bridges.
| Property | Type | Category | Description |
|---|---|---|---|
Backward Anims (BackwardAnims) | FRSETraversalLinkAnims | Animation | Animations when taken backward (end to start). Empty slots use the forward ones. |
Forward Anims (ForwardAnims) | FRSETraversalLinkAnims | Animation | Animations when taken forward (start to end). |
AIUses (bAIUses) | bool | Battle | The AI may route through it (off: only players use it, a secret passage). |
Battle Cost Multiplier (BattleCostMultiplier) | float | Battle | Movement cost per meter of the link's 3D length (at least 1: never cheaper than walking the same ground). |
Battle Extra Cost (BattleExtraCost) | float | Battle | Meters of movement added to every use (getting on and off). |
Usable in Battle (bUsableInBattle) | bool | Battle | The link exists in Free Tactics battles (a nav link with a movement cost). |
Face Movement (bFaceMovement) | bool | Motion | The body faces the link's horizontal direction while moving (off: it keeps facing the actor's wall side, as on a ladder). |
Dismount Seconds (DismountSeconds) | float | Motion | Seconds spent getting off after the motion ends. |
Motion (Motion) | TObjectPtr<URSETraversalMotion> | Motion | How the body moves along the link's points (along the path for a ladder, an arc for a jump). |
Mount Seconds (MountSeconds) | float | Motion | Seconds spent getting on before the motion starts (the mount animation plays meanwhile). |
Speed (Speed) | float | Motion | Speed along the motion (meters per second), in exploration and in battle playback. |
Bidirectional by Default (bBidirectionalByDefault) | bool | Rules | Taken both ways unless the placed actor says otherwise (a drop or a zip-line is one way). |
Followers Use (bFollowersUse) | bool | Rules | Party followers take the link after the leader; off = they are brought to the far end. |
URSETraversalVolumeKindData
Module RSECore, parent URSETraversalKindData, primary asset. An area where bodies move differently (D-121): deep water today (swimming), deep mud or snow later.
| Property | Type | Category | Description |
|---|---|---|---|
Anims (Anims) | FRSETraversalVolumeAnims | Animation | |
Allows Actions (bAllowsActions) | bool | Battle | Units inside may use abilities and items (off: no fighting while swimming). |
Battle Cost Multiplier (BattleCostMultiplier) | float | Battle | Movement cost multiplier on the volume's cells (2 = swimming costs double). |
Usable in Battle (bUsableInBattle) | bool | Battle | The volume exists in Free Tactics battles (its cells float at the surface with this kind's cost and rules). |
Exit Check Distance (ExitCheckDistance) | float | Volume | Exploration: a bank this close ahead (meters) is climbed onto when the body moves toward it. |
Exit Max Height (ExitMaxHeight) | float | Volume | Highest bank (meters above the surface) a body climbs out onto, in exploration and in battle. |
Exit Seconds (ExitSeconds) | float | Volume | Seconds the climb out takes (exploration). |
Min Depth (MinDepth) | float | Volume | Below this depth (meters of water above the ground) bodies walk (a ford), above it they swim. |
Move Speed (MoveSpeed) | float | Volume | Exploration speed inside (meters per second). |
Surface Offset (SurfaceOffset) | float | Volume | How far below the surface the body's feet hang (meters): the head stays above water. |
URSETutorialData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A contextual tutorial (D-047): a few pages shown once, the first time its trigger happens (Trigger) or when the story asks for it (the Show Tutorial effect).
| Property | Type | Category | Description |
|---|---|---|---|
Conditions (Conditions) | FRSEConditionSet | Tutorial | Optional gate checked when the trigger happens (e.g. only after a story flag). Empty = always. |
Pages (Pages) | TArray<FRSETutorialPage> | Tutorial | |
Sort Order (SortOrder) | int32 | Tutorial | When several tutorials share a trigger, the lowest value shows first. Also the order of the Help list. |
Trigger (Trigger) | FGameplayTag | Tutorial | Game event that shows it the first time (Tutorial.Trigger.*). Empty = only the Show Tutorial effect shows it. |
URSEUIStyle
Module RSE, parent URSEPrimaryDataAsset, primary asset. A UI style (D-162, docs/product/ui-styles.md): the colors, fonts, frames, rows, controls, gauges, key caps, icons, sounds and motion of every screen built on URSEHUDWidgetBase.
| Property | Type | Category | Description |
|---|---|---|---|
Ramp (Ramp) | FRSEUIRampSpec | Colors | How the shades S50..S900 are derived from each seed. |
Roles (Roles) | FRSEUIColorRoles | Colors | The roles every screen uses (surfaces, borders, selection, muted text...), each derived from a seed. |
Tokens (Tokens) | FRSEUIColorTokens | Colors | --- Colors --- |
Vision Overrides (VisionOverrides) | TMap<ERSEColorVision,FRSEUIVisionOverride> | Colors|Accessibility | Optional colors for the color vision modes (D-164): per mode, the tokens that change (Positive, Negative, Warning, Info, Charge...). A mode without an entry uses the global safe remap (UI Theme -> Accessibility): Positive blue, Negative orange. |
Hue Shift (HueShift) | float | Colors|Global Shift | Rotates the hue of every token that is not hue-locked (degrees). |
Lightness Scale (LightnessScale) | float | Colors|Global Shift | Lightness of every token times this. |
Saturation Scale (SaturationScale) | float | Colors|Global Shift | Saturation of every token times this. |
Buttons (Buttons) | FRSEUIControlStyle | Controls | |
Chips (Chips) | FRSEUIChipStyle | Controls | |
Key Caps (KeyCaps) | FRSEUIKeyCapStyle | Controls | |
Meters (Meters) | FRSEUIMeterStyle | Controls | |
Rows (Rows) | FRSEUIStyleRows | Controls | --- Controls --- |
Tabs (Tabs) | FRSEUIControlStyle | Controls | |
Backdrop (Backdrop) | FRSEUIBackdropStyle | Frames | |
Divider Color (DividerColor) | FRSEUIColor | Frames | Thin separator lines. |
Divider Thickness (DividerThickness) | float | Frames | |
Frames (Frames) | TMap<ERSEPanelKind,FRSEUIFrameStyle> | Frames | The panel looks (Window, Inset, Plate, Hud, Tooltip, Modal). A missing kind uses Window. |
Plain Panel Corner Radius (PlainPanelCornerRadius) | float | Frames | Plain one-color panels (rounded panels of screens). |
Plain Panel Outline (PlainPanelOutline) | FRSEUIColor | Frames | |
Plain Panel Outline Width (PlainPanelOutlineWidth) | float | Frames | |
Icon Overrides (IconOverrides) | TMap<FGameplayTag,TSoftObjectPtr<UTexture2D> > | Icons | Icons replaced by this style (by tag). Missing = the plugin's icons. |
Icon Tint (IconTint) | ERSEUIIconTint | Icons | |
Description (Description) | FText | Identity | One line in the options menu and the style editor. |
Style Id (StyleId) | FName | Identity | Stable id: the options menu and the player's saved choice refer to it. |
Thumbnail (Thumbnail) | TSoftObjectPtr<UTexture2D> | Identity | |
Default Battle Menu Style (DefaultBattleMenuStyle) | FName | Layout | Battle menu style (List, Radial, Hotbar...) this style suggests (P61). None = the project's (Battle Menus -> Free Tactics Style). The player's choice in the options wins. |
Layouts (Layouts) | FRSEUILayoutVariants | Layout | The arrangement of the dialog, the party menu and the battle HUDs, plus the inventory and Growth board this style suggests (P61). Every variant works with every style; switching styles at runtime rebuilds the screens. |
Motion (Motion) | FRSEUIMotion | Motion | |
Sounds (Sounds) | FRSEUISoundSet | Sounds | |
Typography (Typography) | FRSEUITypography | Typography | --- Typography --- |
URSEUseGrowthCurve
Module RSECore, parent URSEPrimaryDataAsset, primary asset. How abilities grow with use (D-144): ranks reached by battle uses, each with its power and cost.
| Property | Type | Category | Description |
|---|---|---|---|
Ranks (Ranks) | TArray<FRSEUseGrowthRank> | Ranks | Ranks above the base (rank 1), in increasing Uses Required. |
URSEVisualStyle
Module RSE, parent URSEPrimaryDataAsset, primary asset. A visual style preset (D-037): how the whole game looks, switchable live (Realistic, Stylized Realistic, Cel-shaded, Retro Low-poly...).
| Property | Type | Category | Description |
|---|---|---|---|
Console Variables (ConsoleVariables) | TMap<FString,FString> | Console Variables | Console variables set while the style is active (name -> value), e.g. r.ScreenPercentage for a low-resolution look or r.Tonemapper.Sharpen. Each one goes back to its previous value when the style changes. Prefer post-process materials and parameters: a console variable is global and also changes what scalability chose. |
Description (Description) | FText | Info | What the style is for (shown to the designer, not to the player). |
Scalar Parameters (ScalarParameters) | TMap<FName,float> | Material Parameters | Scalar values written to the style parameter collection (Project Settings -> RPG Saga Engine -> Visual Style) while the style is active, e.g. OutlineWidth, ShadeSteps, PixelSize, ColorLevels, Saturation. Parameters not listed return to the collection's defaults, so materials that read the collection follow the style. |
Vector Parameters (VectorParameters) | TMap<FName,FLinearColor> | Material Parameters | Vector values written to the style parameter collection, e.g. OutlineColor, ShadowTint. |
Post Process (PostProcess) | FPostProcessSettings | Post Process | Post-process overrides of the style (color grading, bloom, vignette, exposure, film grain...). Only the fields whose override box is ticked apply; the rest come from the level's own volumes and the engine defaults. Post-process materials go in PostProcessMaterials below (soft references), not in this struct's Blendables. |
Post Process Blend Weight (PostProcessBlendWeight) | float | Post Process | Weight of the whole post-process layer (0 = the style changes no post-process setting). |
Post Process Materials (PostProcessMaterials) | TArray<FRSEVisualStyleBlendable> | Post Process | Post-process materials of the style, in order. Loaded when the style becomes active. |
URSEWeaponHoldProfile
Module RSE, parent UDataAsset. How weapons sit in the hands of one skeleton (D-185, docs/product/weapons.md): one hand socket per weapon hold type (pistol, rifle, one / two-handed melee, polearm, bow, staff), the support hand IK and the stance animations.
| Property | Type | Category | Description |
|---|---|---|---|
Holds (Holds) | TArray<FRSEWeaponHold> | Holds | One entry per hold type (a missing one is generated from the reference pose). |
Left Hand Bone (LeftHandBone) | FName | Skeleton | Left hand bone (None = found by name). Its parent is the elbow joint of the support hand IK. |
Recoil Arm Bone (RecoilArmBone) | FName | Skeleton | The weapon arm bone the procedural recoil pitches up (None = Weapon Hold settings -> Recoil Arm Bone Names). |
Recoil Spine Bone (RecoilSpineBone) | FName | Skeleton | The bone the procedural recoil pitches back (None = Weapon Hold settings -> Recoil Spine Bone Names). |
Right Hand Bone (RightHandBone) | FName | Skeleton | Right hand bone (None = found by name: Weapon Hold settings -> Right Hand Bone Names). |
Skeleton (Skeleton) | TSoftObjectPtr<USkeleton> | Skeleton | The skeleton this profile is for (the settings' profile list is matched by it). |
Upper Body Bone (UpperBodyBone) | FName | Skeleton | First bone of the upper body (stance overlays layer from it; the procedural recoil bends the spine from it). None = found by name. |
Default Ready Mode (DefaultReadyMode) | ERSEStanceReadyMode | Stance | D-185 addendum 2: how stance Ready clips play when their hold says Profile Default (upper body or whole body). |
Disable Support Hand IKCurve (DisableSupportHandIKCurve) | FName | Support Hand IK | A curve of the playing animations that turns the support hand IK (position and rotation) off while it is 1 (reloads, melee bashes). |
URSEWeaponPresentation
Module RSE, parent URSEWeaponPresentationBase, primary asset. How attacks with a weapon look (D-184), in every battle mode (grid, live, ATB, turn-based through the cue timelines; action battles through the combat presentation): the stance's swing or fire animations, the muzzle flash and shell ejection, tracers or projectiles, impacts per surface with decals, t...
| Property | Type | Category | Description |
|---|---|---|---|
Stance Anims (StanceAnims) | TArray<FRSEWeaponStanceAnims> | Animation | Animations per stance (the light and heavy melee stances, the gun stances, the bow, the caster). |
Feel (Feel) | FRSEWeaponFeel | Feel | --- Feel --- |
Aim Time (AimTime) | float | Firing | Seconds aiming before the first shot (without an Aim animation, a still beat). |
Muzzle Flash (MuzzleFlash) | TSoftObjectPtr<UNiagaraSystem> | Firing | --- Firing --- |
Muzzle Flash Scale (MuzzleFlashScale) | float | Firing | |
Pellets Per Shot (PelletsPerShot) | int32 | Firing | Tracers per shot (shotgun pellets). |
Pellet Spread (PelletSpread) | float | Firing | Visual spread of pellets around the target (cm at the target). |
Recoil Distance (RecoilDistance) | float | Firing | Recoil of each shot on units without animations (cm). |
Shell Eject (ShellEject) | TSoftObjectPtr<UNiagaraSystem> | Firing | |
Shot (Shot) | FRSEWeaponShotVisual | Firing | The tracer or projectile of each shot. |
Shot Interval (ShotInterval) | float | Firing | Seconds between the shots of a burst. |
Shots Per Attack (ShotsPerAttack) | int32 | Firing | Shots per attack (a rifle burst, a pistol double tap): each fires, flies and lands with a hit reaction. |
Default Impact (DefaultImpact) | FRSEWeaponImpact | Impacts | Used when no entry matches the surface. |
Impacts (Impacts) | TArray<FRSEWeaponImpact> | Impacts | Impacts per surface (Surface.Flesh, Surface.Metal, Surface.Stone...); the first match wins. |
Lunge Distance (LungeDistance) | float | Melee | Swing length on units without animations (the procedural lunge, cm). |
Melee Trail (MeleeTrail) | TSoftObjectPtr<UNiagaraSystem> | Melee | The ribbon on the blade during a swing. |
Swing Impact Time (SwingImpactTime) | float | Melee | Seconds from the swing's start to the hit (units without hit-frame notifies). |
Trail Seconds (TrailSeconds) | float | Melee | Seconds the trail lasts (the swing). |
Muzzle Offset (MuzzleOffset) | FVector | Sockets | The muzzle in the weapon mesh's space (cm), when it has no socket (the classifier measures it). Zero = the measured tip. |
Muzzle Socket (MuzzleSocket) | FName | Sockets | Socket of the weapon mesh where shots leave (missing = Muzzle Offset, else the mesh's measured tip). |
Shell Eject Offset (ShellEjectOffset) | FVector | Sockets | |
Shell Eject Socket (ShellEjectSocket) | FName | Sockets | Socket where spent shells leave (missing = Shell Eject Offset, else the muzzle). |
Trail End Socket (TrailEndSocket) | FName | Sockets | |
Trail Start Socket (TrailStartSocket) | FName | Sockets | Melee trail: the sockets of the blade's base and tip (missing = the measured weapon tip). |
Fire Sound (FireSound) | TSoftObjectPtr<USoundBase> | Sounds | --- Sounds --- |
Reload Sound (ReloadSound) | TSoftObjectPtr<USoundBase> | Sounds | |
Swing Sound (SwingSound) | TSoftObjectPtr<USoundBase> | Sounds | |
Grip (Grip) | FRSEWeaponGrip | Weapon | D-185: how the weapon is held (hold type, grip and support points). |
Stance (Stance) | ERSEWeaponStance | Weapon | The stance its attacks use (Auto = from the kind). |
Weapon Kind (WeaponKind) | ERSEWeaponKind | Weapon | |
Weapon Mesh (WeaponMesh) | TSoftObjectPtr<UObject> | Weapon | The weapon mesh this presentation is for (a static or skeletal mesh; Dress My Abilities sets it): the Weapon Hold Editor previews it and the validation measures it. Presentations shared by a kind leave it empty. |
URSEWeaponPresentationBase
Module RSECore, parent URSEPrimaryDataAsset, abstract, primary asset. Base of weapon presentation assets (D-184; the asset itself, URSEWeaponPresentation, is defined in the RSE module): equipment (URSEEquipmentData::WeaponPresentation) and action weapons (URSEActionWeaponData::WeaponPresentation) reference it softly without RSECore knowing its contents.
URSEWeatherTableData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. The weather of a region (D-101): which weathers happen and how often, by phase of day and season.
| Property | Type | Category | Description |
|---|---|---|---|
Entries (Entries) | TArray<FRSEWeatherTableEntry> | Weather | |
Initial Weather (InitialWeather) | FGameplayTag | Weather | The weather of a new game (or when this table starts and the current weather is not in it). Empty = a roll. |
Repeat Weight (RepeatWeight) | float | Weather | Weight multiplier for rolling the weather that is already there (above 1: weather lasts longer; 0: always changes). |
URSEWeatherTypeData
Module RSECore, parent URSEPrimaryDataAsset, primary asset. A weather type (D-101): Clear, Cloudy, Rain, Storm, Fog, Snow...
| Property | Type | Category | Description |
|---|---|---|---|
Max Hours (MaxHours) | float | Duration | |
Min Hours (MinHours) | float | Duration | How long it lasts once it starts, in game hours (random in the range; a weather table entry can override). |
Transition Seconds (TransitionSeconds) | float | Duration | Real seconds this weather takes to come in (the previous one fades out meanwhile). |
Lightning (Lightning) | FRSEWeatherLightning | Look | |
Look (Look) | FRSEWeatherLook | Look | |
Ambient Loop (AmbientLoop) | TSoftObjectPtr<USoundBase> | Presentation | Looping ambience (rain, wind), faded with the weather (SFX channel of the Audio settings). |
Ambient Volume (AmbientVolume) | float | Presentation | |
Particles (Particles) | TSoftObjectPtr<UObject> | Presentation | Camera-attached precipitation (a Niagara system), for High and Epic quality. |
Particles Low (ParticlesLow) | TSoftObjectPtr<UObject> | Presentation | Cheaper precipitation for Low / Medium effects quality (Steam Deck). Empty = Particles. |
Thunder Sounds (ThunderSounds) | TArray<TSoftObjectPtr<USoundBase> > | Presentation | Thunder claps (one is picked per strike). |
Thunder Volume (ThunderVolume) | float | Presentation | |
Icon (Icon) | TSoftObjectPtr<UTexture2D> | Weather | HUD / menu icon (optional). |
Weather (Weather) | FGameplayTag | Weather | The weather's id (Weather.Rain, Weather.Rain.Storm, a project's Weather.Sandstorm...). |