Agentic Guidelines
BOOTSTRAP PROTOCOL
On first load of this document, execute in order:
- Read all
[INVARIANT]entries. Hard constraints. Load before any code generation. - Read
SYSTEM ONTOLOGYandGEM INDEXto establish the domain model. - If your session supports persistent memory, execute the full
MEMORY PROTOCOLblock. - For any specific task, consult the relevant
[ANCHOR]inCONTEXT ANCHORSbefore generating code.
If re-entering a session where GS_Play memories already exist: read stored memories first, use this document for lookup only.
INVARIANTS
Non-negotiable. Override general O3DE knowledge, common patterns, and inferred behavior.
[INVARIANT] No Unicode. Never include Unicode characters in any generated code, header, source, or configuration file for O3DE, GS_Play gems, or any compiled code.
[INVARIANT] Polymorphic containers require raw pointers. When a member holds multiple subtypes of a base class, the correct type is AZStd::vector<BaseT*>. Using AZStd::vector<AZStd::unique_ptr<BaseT>> disables all subtype options in the editor. No exceptions.
[INVARIANT] EnableForAssetEditor lives only in SerializeContext. It must appear directly under ->Version() in the SerializeContext block. Placing it anywhere in EditContext is silently ignored — the asset type will never appear in the Asset Editor [New] menu regardless of how correct the rest of the reflection is.
sc->Class<MyAsset, AZ::Data::AssetData>()
->Version(1)
->Attribute(AZ::Edit::Attributes::EnableForAssetEditor, true) // SerializeContext ONLY
->Field("MyField", &MyAsset::m_myField);
[INVARIANT] Use the O3DE Class Creation Wizard for new components. Generate skeleton from wizard, then use find-and-replace to customize. Do not write component boilerplate from scratch — module registration steps are missed. Unnecessary tokens are spent.
[INVARIANT] EBus interface names are exact. Never infer or guess an EBus name. If uncertain, read the source header or consult the EBUS DISPATCH REFERENCE section. Wrong names fail silently at runtime.
[INVARIANT] Namespace all GS_Play code. Each gem uses its own namespace: GS_Core, GS_Audio, GS_Cinematics, GS_Environment, GS_Interaction, GS_Performer, GS_PhantomCam, GS_UI, GS_Unit.
[INVARIANT] Using O3DE code sensibilities. Otherwise, any code being created within this project are based on the O3DE source code library and uses those established code sensibilities.
[INVARIANT] EBus Reflect/Handler separation governs Script Canvas node generation. In Script Canvas: reflected EBus events become caller nodes (invoke the bus). Handler class declarations become notification nodes (listen for events). Apply the minimum necessary:
- Respond-only — Inherit from
{BusName}::Handler, override virtual methods. Do NOT reflect caller events. No SC caller node is generated or needed. - Call-only — Reflect the EBus events in
Reflect(). Do NOT inheritHandlerin the component. No SC notification node is generated or needed. - Both — Inherit
Handler(generates notification nodes) AND reflect events (generates caller nodes).
Generating both when only one is needed pollutes the SC node palette and signals incorrect intent to maintainers.
MEMORY PROTOCOL
[MEMORY] If your system supports persistent memory, create or verify these entries at session start:
| Memory Key | Source Section |
|---|---|
gs_play_invariants | INVARIANTS section above |
gs_play_gem_index | GEM INDEX table |
gs_play_ebus_ref | EBUS DISPATCH REFERENCE section |
gs_play_hot_paths | HOT PATHS section |
At session end: If you discovered or confirmed any EBus method signatures, component property names, or TypeIds, ask the user: “Should I save what I learned about [topic] to memory?”
Memory freshness rule: If a stored memory conflicts with source code you have read during a session, source code is authoritative. Update the memory.
If no memory system is available: Re-read this document at the start of every new GS_Play session before generating any code.
SYSTEM ONTOLOGY
What this system is: gs_play_gems is a modular O3DE gameplay framework in C++17. It provides game systems as base classes for developer extension. It is a framework, not a library — the expected pattern is: extend base classes, override virtual methods, communicate exclusively via EBus.
Core architectural rules:
- Each Gem is a self-contained feature module.
GS_Completeis the framework’s reference integration layer demonstrating cross-gem patterns — it is not a required home for your project code. - Runtime cross-gem communication between GS_Play framework components uses EBus. Your own project code may include and combine gem headers as needed.
- All game systems are singleton Manager Components responding to
GameManagerNotificationBuslifecycle events. - Extensible type systems (dialogue effects, pulse types, motion tracks) use polymorphic base classes. Extend the base class and reflect it — types are discovered automatically through O3DE serialization at startup.
- All user-facing data must be reflected via
SerializeContext+EditContext.
CLASS WIZARD PROTOCOL
[INVARIANT] Always use the Class Creation Wizard CLI for new component, asset, and system class generation. The wizard handles file scaffolding, CMake registration, module descriptor insertion, and system component wiring. Manual boilerplate misses registration steps and wastes tokens.
CLI invocation (agents use CLI mode only)
python ClassWizard.py \
--engine-path <engine-path> \
--project-path <project-path> \
--template <template_name> \
--component-name <Name> \
--namespace <GemNamespace> \
--automatic-register \
[<template-specific flags>]
--automatic-register is required for build integration (CMake file lists, module descriptors, system component entries). Omitting it generates files only.
Available templates — O3DE base
| Template | --template value | Suffix | What it creates | Template-specific flags |
|---|---|---|---|---|
| Basic Component | default_component | Component | Standard game component | --skip-interface, --include-editor (requires editor module) |
| Level Component | level_component | Component | Component on the level entity | --skip-interface |
| System Component | system_component | Component | Global system entity component, auto-activates | --skip-interface |
| LyShine Component | lyshine_component | Component | UI component, adds Gem::LyShine.API dependency | (none) |
| Data Asset | data_asset | Asset | Asset class + system component + .setreg config | --file-extension <ext> (required), --asset-group <group> |
| Attimage | attimage | Attimage | Render pipeline attachment image | (none) |
Available templates — GS_Play extensions
GS_Play provides gem-specific templates that extend the above. These handle GS_ base class wiring, EBus interface generation, and framework-specific registration steps automatically. Full reference: Templates List.
| Template | Gem | Generates | Use For |
|---|---|---|---|
GS_ManagerComponent | GS_Core | ${Name}ManagerComponent + optional bus | GS_Play manager with startup lifecycle hooks |
SaverComponent | GS_Core | ${Name}SaverComponent | Custom save/load handler for GS_Save |
GS_InputReaderComponent | GS_Core | ${Name}InputReaderComponent | Controller-side hardware input reader |
PhysicsTriggerComponent | GS_Core | ${Name}PhysicsTriggerComponent | PhysX trigger volume with enter/hold/exit callbacks |
PulsorPulse | GS_Interaction | ${Name}_Pulse | New pulse type for Pulsor emitter/reactor system |
PulsorReactor | GS_Interaction | ${Name}_Reactor | New reactor type responding to a named channel |
WorldTrigger | GS_Interaction | ${Name}_WorldTrigger | New world trigger response type |
TriggerSensor | GS_Interaction | ${Name}_TriggerSensor | New trigger sensor condition type |
UnitController | GS_Unit | ${Name}ControllerComponent | Custom player or AI controller |
InputReactor | GS_Unit | ${Name}InputReactorComponent | Unit-side input translation to bus calls |
Mover | GS_Unit | ${Name}MoverComponent | Custom locomotion mode |
Grounder | GS_Unit | ${Name}GrounderComponent | Custom ground detection |
PhantomCamera | GS_PhantomCam | ${Name}PhantomCamComponent | Custom camera behaviour type |
UiMotionTrack | GS_UI | ${Name}Track | New LyShine property animation track |
FeedbackMotionTrack | GS_Juice | ${Name}Track | New world-space entity property animation track |
DialogueCondition | GS_Cinematics | ${Name}_DialogueCondition | Dialogue branch gate — return true to allow |
DialogueEffect | GS_Cinematics | ${Name}_DialogueEffect | World event from Effects node; optionally reversible |
DialoguePerformance | GS_Cinematics | ${Name}_DialoguePerformance | Async NPC action; sequencer waits for completion |
[ANCHOR] Registration requirements per template (some require a manual Reflect() call after generation) → Templates List: Registration Quick Reference
What the wizard generates
The wizard output for --template default_component --component-name PlayerHealth --namespace GS_Core produces:
Source/PlayerHealthComponent.h/.cpp— component withReflect(),Activate(),Deactivate(),AZ_COMPONENT_IMPLInclude/GS_Core/PlayerHealthInterface.h— EBus interface header (unless--skip-interface)- CMake file list entries, module descriptor registration (with
--automatic-register)
Post-wizard agent workflow
After the wizard runs:
- Add GS_ base class to the inheritance list alongside
AZ::Component. - Add EBus handler inheritance for any buses this component listens to.
- Wire
BusConnect()/BusDisconnect()inActivate()/Deactivate(). - Override virtual methods from the GS_ base class.
- Add reflected fields in
SerializeContext→EditContext. - Add gem dependency if the component depends on another GS_ gem:
add_gem_dependencyis automatic for some templates (e.g., LyShine), but cross-GS-gem dependencies must be added manually to CMake.
[ANCHOR] Before customizing wizard output → read the target base class API at /docs/framework/{gem}/.
Discovery commands
--list-templates # Print all available templates
--template-help <template_name> # Print full command shape, all flags, and command list
Use --template-help to discover template-specific flags before invoking.
GEM INDEX
| Gem | Namespace | Role | Manager Component | Primary Incoming Bus | Doc Path |
|---|---|---|---|---|---|
| GS_Core | GS_Core | Foundation — managers, save, stages, input, actions, utilities | GS_GameManagerComponent | GameManagerRequestBus | /docs/framework/core/ |
| GS_Audio | GS_Audio | Audio engine, mixing, events, Klatt voice synthesis | GS_AudioManagerComponent | AudioManagerRequestBus | /docs/framework/audio/ |
| GS_Cinematics | GS_Cinematics | Dialogue system, cinematics control, stage/performer markers | GS_DialogueManagerComponent GS_CinematicsManagerComponent | DialogueManagerRequestBus | /docs/framework/cinematics/ |
| GS_Environment | GS_Environment | Time of day, sky, world tick | GS_TimeManagerComponent | TimeManagerRequestBus | /docs/framework/environment/ |
| GS_Interaction | GS_Interaction | Pulsors, targeting, world triggers, cursor | (none) | — | /docs/framework/interaction/ |
| GS_Performer | GS_Performer | Character skins, paper-facing, locomotion visuals | GS_PerformerManagerComponent | PerformerManagerRequestBus | /docs/framework/performer/ |
| GS_PhantomCam | GS_PhantomCam | Virtual cameras, blending, influence fields | GS_CamManagerComponent | CamManagerRequestBus | /docs/framework/phantomcam/ |
| GS_UI | GS_UI | UI framework — single-tier Manager/Page navigation, GS_Motion animations, input interception, load screen | GS_UIManagerComponent | UIManagerRequestBus | /docs/framework/ui/ |
| GS_Unit | GS_Unit | Unit/character controllers, movers, input, AI | GS_UnitManagerComponent | UnitManagerRequestBus | /docs/framework/unit/ |
| GS_Complete | GS_Complete | Integration layer — cross-gem components, proves patterns | (none) | GS_CompleteRequestBus | — |
EBUS DISPATCH REFERENCE
Dispatch syntax
// Broadcast (no address, singleton bus)
GS_Core::GameManagerRequestBus::Broadcast(
&GS_Core::GameManagerRequestBus::Events::NewGame);
// Entity-addressed
GS_Unit::UnitRequestBus::Event(
entityId, &GS_Unit::UnitRequestBus::Events::Possess, controllerEntityId);
// Broadcast with return value
bool isStarted = false;
GS_Core::GameManagerRequestBus::BroadcastResult(
isStarted, &GS_Core::GameManagerRequestBus::Events::IsStarted);
Bus naming convention
| Suffix | Direction | Handler policy | Typical use |
|---|---|---|---|
RequestBus | Caller → Handler | Single (singleton) or ById (entity) | Commands and queries |
NotificationBus | Broadcaster → Listeners | Multiple | State change notifications |
GS_Core buses
| Bus | Dispatch | Key Methods |
|---|---|---|
GameManagerRequestBus | Broadcast | IsInDebug, IsStarted, NewGame, LoadGame, ContinueGame, EnterStandby, ExitStandby, ReturnToTitle, ExitGame |
GameManagerNotificationBus | Listen | OnSetupManagers, OnStartupComplete, OnShutdownManagers, OnBeginGame, OnEnterStandby, OnExitStandby |
SaveManagerRequestBus | Broadcast | NewGameSave, LoadGame, SaveData, LoadData, GetOrderedSaveList |
SaveManagerNotificationBus | Listen | OnSaveAll, OnLoadAll |
RecordKeeperRequestBus | ById | HasRecord, SetRecord, GetRecord, DeleteRecord |
RecordKeeperNotificationBus | ById Listen | RecordChanged |
StageManagerRequestBus | Broadcast | ChangeStageRequest, LoadDefaultStage, RegisterExitPoint, GetExitPoint |
StageManagerNotificationBus | Listen | BeginLoadStage, LoadStageComplete, StageLoadProgress |
OptionsManagerRequestBus | Broadcast | GetActiveInputProfile |
ActionRequestBus | ById | DoAction |
ActionNotificationBus | ById Listen | OnActionComplete |
GS_Cinematics buses
| Bus | Dispatch | Key Methods |
|---|---|---|
CinematicsManagerRequestBus | Broadcast | BeginCinematic, EndCinematic, RegisterStageMarker, GetStageMarker |
DialogueManagerRequestBus | Broadcast | StartDialogueSequenceByName, ChangeDialogueDatabase, RegisterPerformerMarker, GetPerformer |
DialogueSequencerRequestBus | Broadcast | StartDialogueBySequence, OnPerformanceComplete |
DialogueSequencerNotificationBus | Listen | OnDialogueTextBegin, OnDialogueSequenceComplete |
DialogueUIBridgeRequestBus | ById | RunDialogue, RunSelection, RegisterDialogueUI, CloseDialogue |
TypewriterRequestBus | ById | StartTypewriter, ForceComplete, ClearTypewriter |
GS_Interaction buses
| Bus | Dispatch | Key Methods |
|---|---|---|
PulseReactorRequestBus | ById | ReceivePulses, IsReactor |
GS_TargetingHandlerRequestBus | ById | RegisterTarget, UnregisterTarget, GetInteractTarget |
GS_TargetingHandlerNotificationBus | ById Listen | OnUpdateInteractTarget, OnEnterStandby, OnExitStandby |
WorldTriggerRequestBus | ById | Trigger, Reset |
GS_CursorRequestBus | Broadcast | RegisterCursorCanvas, HideCursor, SetCursorOffset, SetCursorVisuals, SetCursorPosition |
GS_PhantomCam buses
| Bus | Dispatch | Key Methods |
|---|---|---|
CamManagerRequestBus | Broadcast | Camera system lifecycle |
CamManagerNotificationBus | Listen | EnableCameraSystem, DisableCameraSystem, SettingNewCam |
CamCoreNotificationBus | Listen | UpdateCameraPosition |
PhantomCameraRequestBus | ById | Per-camera control |
GS_UI buses
| Bus | Dispatch | Key Methods |
|---|---|---|
UIManagerRequestBus | Broadcast | LoadGSUI, UnloadGSUI, FocusUI, NavLastUI, RegisterPage |
UIPageRequestBus | ById | ShowPage, HidePage, FocusPage, ToggleShow |
LoadScreenRequestBus | Broadcast | StartLoadScreen, EndLoadScreen |
PauseMenuRequestBus | Broadcast | PauseGame, UnPauseGame |
Removed / Deprecated (do not use): GS_UIHubComponent, GS_UIHubBus, GS_UIWindowComponent — these were part of a removed three-tier Hub/Window/Page hierarchy. The current architecture is single-tier: Manager → Page.
GS_Unit buses
| Bus | Dispatch | Key Methods |
|---|---|---|
UnitManagerRequestBus | Broadcast | RequestSpawnNewUnit, RegisterPlayerController, CheckIsUnit |
UnitManagerNotificationBus | Listen | ReturnNewUnit, EnterStandby, ExitStandby |
UnitRequestBus | ById | Possess, DePossess, GetController, GetUniqueName |
UnitNotificationBus | ById Listen | UnitPossessed, UnitEnteringStandby, UnitExitingStandby |
GS_Environment buses
| Bus | Dispatch | Key Methods |
|---|---|---|
TimeManagerRequestBus | Broadcast | SetMainCam, Set/GetTimeOfDay, SetTimePassageSpeed, GetWorldTime, IsDay |
TimeManagerNotificationBus | Listen | WorldTick, DayNightChanged |
GS_Audio buses
| Bus | Dispatch | Key Methods |
|---|---|---|
AudioManagerRequestBus | Broadcast | Audio engine control |
KlattVoiceRequestBus | ById | Voice synthesis control per-entity |
KlattVoiceSystemRequestBus | Broadcast | System-level voice engine |
HOT PATHS
Canonical patterns for the most common agent tasks. Follow exactly.
HOT PATH 1 — Create a component extending a GS_ base
(Incorrect - Templates satisfy much of this.)
- Identify target gem namespace and base class.
- Generate skeleton via O3DE Class Creation Wizard.
- Replace generated names. Add GS_ base class alongside
AZ::Componentin inheritance list. - In
Activate(): callBusConnect()for all buses this component handles. - In
Deactivate(): callBusDisconnect()for all buses. - In
Reflect():SerializeContextfirst,EditContextnested inside it.EnableForAssetEditorin SerializeContext only, directly under->Version().
[ANCHOR] For any specific gem’s base class API → read /docs/framework/{gem}/ before writing the override body.
HOT PATH 2 — Dispatch an EBus command
(Incorrect - BusInterfaceName)
// Fire and forget, singleton bus
GS_{Gem}::{BusName}::Broadcast(
&GS_{Gem}::{BusName}::Events::{MethodName},
arg1, arg2);
// Entity-addressed bus
GS_{Gem}::{BusName}::Event(
targetEntityId, &GS_{Gem}::{BusName}::Events::{MethodName}, arg1);
// With return value
ReturnType result{};
GS_{Gem}::{BusName}::BroadcastResult(
result, &GS_{Gem}::{BusName}::Events::{MethodName});
HOT PATH 3 — Listen to an EBus notification
- Inherit from
{BusName}::Handler(protected inheritance). - In
Activate():{BusName}::Handler::BusConnect();- For entity-addressed buses:
{BusName}::Handler::BusConnect(GetEntityId());
- For entity-addressed buses:
- In
Deactivate():{BusName}::Handler::BusDisconnect(); - Override the virtual notification methods.
HOT PATH 4 — Create a new Manager Component
- Inherit from
GS_Core::GS_ManagerComponent. - Connect to
GameManagerNotificationBusinActivate(). - Implement lifecycle hooks:
OnSetupManagers,OnShutdownManagers,OnEnterStandby,OnExitStandby. - Define
{Name}RequestBus(Single/Single policy) for commands. - Define
{Name}NotificationBus(Multiple policy) for notifications. - Register descriptor in your gem’s module constructor.
[ANCHOR] Manager lifecycle and initialization order → /docs/framework/core/gs_managers/manager/
HOT PATH 5 — Create a Generic Data Asset
- Inherit from
AZ::Data::AssetData. - Include GS_Core Utility:
GS_AssetReflectionIncludes.h - In
Reflect(), SerializeContext block:sc->Class<MyAsset, AZ::Data::AssetData>() ->Version(1) ->Attribute(AZ::Edit::Attributes::EnableForAssetEditor, true) ->Field("Field", &MyAsset::m_field); - Register asset type in a system component’s
Reflect(). EnableForAssetEditorgoes only in SerializeContext. Never in EditContext.
HOT PATH 6 — Polymorphic container of subtypes
// CORRECT — all subtypes selectable in editor
AZStd::vector<BaseClass*> m_items;
// WRONG — disables all subtype options in editor
AZStd::vector<AZStd::unique_ptr<BaseClass>> m_items;
Reflect with ->Field("Items", &MyClass::m_items). O3DE handles subtype selection automatically with raw pointers.
HOT PATH 7 — Create a custom Trigger Sensor or World Trigger
Two distinct extension points. Choose the correct base:
Custom Trigger Sensor (condition side — detects when to fire):
- Inherit from
GS_Interaction::TriggerSensorComponent. - Override
EvaluateSensor()— callTrigger()on allWorldTriggerRequestBushandlers on the same entity when your condition is met. - Reflect with
SerializeContextandEditContext. - Register descriptor in your gem’s module.
Custom World Trigger (response side — what happens when fired):
- Inherit from
GS_Interaction::WorldTriggerComponent. - Override
DoTrigger()— implement the response behavior. - Override
DoReset()if the trigger should re-arm. - Reflect with
SerializeContextandEditContext. - Register descriptor in your gem’s module.
[ANCHOR] Full WorldTrigger architecture → /docs/framework/interaction/world_triggers/
HOT PATH 8 — Add a custom Dialogue type (effect, condition, performance)
- Inherit from the appropriate base:
DialogueEffect,DialogueCondition, orDialoguePerformance. - Reflect the class using
SerializeContextandEditContext. The system discovers it automatically at startup — no manual registration step. GS_Completedemonstrates this pattern for cross-gem types (e.g., a dialogue effect controlling a PhantomCam). Use it as a reference, not a required location.
[ANCHOR] Dialogue type system → /docs/framework/cinematics/dialogue_system/
ANTIPATTERN CATALOG
[ANTIPATTERN] EnableForAssetEditor in EditContext. Silent failure — asset never appears in Asset Editor [New] menu. See INVARIANTS.
[ANTIPATTERN] unique_ptr in polymorphic AZStd containers. Disables all subtype selection in the editor. Use BaseT*. See INVARIANTS.
[ANTIPATTERN] Guessing EBus method names. O3DE EBus dispatches fail silently on wrong method names. Always verify against source headers or the EBUS DISPATCH REFERENCE in this document.
[ANTIPATTERN] Dispatching to entity-addressed buses before target entity is active. Buses are not connected before Activate() or after Deactivate(). Sending events before activation is silently dropped.
[ANTIPATTERN] Omitting AZ_COMPONENT_IMPL in the .cpp file. Component will not be reflectable. Causes subtle reflection failures that appear unrelated to the missing macro.
[ANTIPATTERN] Using "Editor" service in AppearsInAddComponentMenu. GS_Play components use AZ_CRC_CE("Game"). The "Editor" category makes components invisible in standard game entity contexts.
[ANTIPATTERN] Writing component boilerplate manually. Module registration steps are reliably missed. Always start from the O3DE Class Creation Wizard output.
CONFIDENCE THRESHOLDS
Proceed without reading source or docs:
- Standard O3DE component lifecycle:
Init,Activate,Deactivate,BusConnect,BusDisconnect AZStdcontainer usage (with the raw pointer rule applied for polymorphic types)- CMake target aliases:
Gem::{Name}.API,Gem::{Name}.Private.Object,Gem::{Name}.Clients SerializeContext→EditContextnesting order inReflect()AZ_CRC_CE()for compile-time CRC valuesazrtti_cast<>for safe type casting in reflection code
Stop and read documentation or ask the user before proceeding:
- Any EBus method signature you are not 100% certain of
- Any virtual method signature on a GS_ base class
- Whether a specific GS_ gem is present in the target project
- Initialization order requirements for a new Manager component
- Any TypeId UUID value — never generate a UUID, ask the user or read the TypeIds header
CONTEXT ANCHORS
Conditions that require reading deeper documentation before generating code.
[ANCHOR] Before writing any unit movement or controller code:
→ Read /docs/framework/unit/ for mover types (3DFree, Strafe, Grid, SideScroller, Slide, Physics), grounder types, and controller hierarchy (Player vs AI).
→ [ASK] Which mover type does this movement context require?
[ANCHOR] Before configuring any virtual camera:
→ Read /docs/framework/phantomcam/ for camera types (PhantomCamera, StaticOrbit, Track, ClampedLook) and influence field setup.
[ANCHOR] Before wiring any dialogue sequence:
→ Read /docs/framework/cinematics/dialogue_system/ for the full chain: Sequencer → UIBridge → DialogueUI component.
[ANCHOR] Before implementing targeting or interaction:
→ Read /docs/framework/interaction/targeting/ for the TargetingHandler, Target, TargetField setup order and registration timing.
[ANCHOR] Before building any UI screen or menu:
→ Read /docs/framework/ui/ for the Manager → Page architecture, navigation return policies, companion component pattern, and UIManager registration sequence. The Hub/Window layer has been removed — do not use GS_UIHubComponent or GS_UIWindowComponent.
[ANCHOR] Before integrating save or persistence:
→ Read /docs/framework/core/gs_save/ for the SaveManager, RecordKeeper, and Saver component chain.
[ANCHOR] Before setting up project physics layers or collision groups:
→ Read /docs/get_started/configure_project/setup_environment/ for required engine-level physics configuration.
[ANCHOR] Before implementing behavior that combines two or more GS_ gems:
→ Review GS_Complete — it provides reference implementations of common cross-gem patterns. Reuse or adapt them rather than reimplementing from scratch.
CLARIFICATION TRIGGERS
[ASK] At the start of any GS_Play session, identify the user context:
Designer / Scripter — Working in the O3DE editor with components, Script Canvas, or Lua. No C++ generation needed.
- Guidance: component configuration, property setup, EBus Script Canvas nodes.
- Documentation: The Basics → /docs/the_basics/
- Gem-specific: /docs/the_basics/{gem}/ (e.g., /docs/the_basics/unit/ for unit questions)
Engineer — Writing C++ to extend the framework with new components, gems, or systems.
- Guidance: follows HOT PATHS and code patterns in this document.
- Documentation: Framework API → /docs/framework/
- Gem-specific: /docs/framework/{gem}/ (e.g., /docs/framework/unit/ for unit questions)
Both sections cover identical gem featuresets. The Basics covers component usage and scripting; Framework API covers C++ interfaces, EBus signatures, and base class architecture. Available gems in both: core, audio, cinematics, environment, interaction, juice, performer, phantomcam, ui, unit.
When answering any gem-specific question, include a link to the appropriate documentation section alongside your response. If the context is not stated, ask before generating any code or providing documentation links.
[ASK] Before creating any new component: Confirm which gem’s namespace and base class this component should use.
[ASK] Before generating any TypeId UUID: Always request the UUID from the user or confirm they want one generated. Never silently generate a UUID.
[ASK] If the task references a system with no memory or documentation coverage: Ask before inferring behavior. GS_Play base class APIs are not reliably guessable from generic O3DE patterns.
[ASK] If a Manager initialization order is being modified: The sequence of OnSetupManagers calls is load-order dependent. Confirm the intended position in the sequence before writing.
[ASK] If asked to implement a new Dialogue type: Extend the appropriate base class (DialogueEffect, DialogueCondition, or DialoguePerformance) and reflect it. Confirm which gem or module owns the new class before writing.
UPCOMING: AGENTIC SITE FEATURES (Post v1)
The GS_Play documentation site will implement formal agent-friendly features after the v1 documentation release. These are not yet live.
Planned additions follow the emerging specifications at:
- Making a Hugo Site Agent-Friendly — structured metadata, machine-readable page indexes, and LLM-optimized content formatting for Hugo-based docs sites.
- Agent Docs Spec — emerging open specification for agent-accessible documentation.
What this means for agents using this document now:
Until those features are live, this bootstrap document (/docs/get_started/agentic_guidelines/) is the primary machine-readable entry point. Treat it as authoritative. Do not rely on inferred site structure or navigated page discovery — navigate the docs via explicit paths from the GEM INDEX and CONTEXT ANCHORS sections above.
When the agent-friendly site features are released, this section will be updated with the new entry points and structured access patterns.