Diagrams

1. Game Board Creation Pipeline

Full sequence from Blueprint to game-ready state.

sequenceDiagram
    participant BP as Blueprint
    participant GM as UCGameManager
    participant CO as ACCoordinator
    participant SP as Spawners

    BP ->> GM: storeNewGameBoard(name, gameCommon,<br/>players, biome, world, rooms,<br/>tiles, skills, inventory, quests)
    activate GM
    GM ->> GM: init FCBP_GameStruct<br/>create all DataTables
    GM ->> GM: convert BP structs<br/>to DT rows per section
    GM ->> GM: store in gameStructMap
    deactivate GM

    BP ->> CO: cleanAllThenSpawnGameBoard<br/>(seed, boardName, playerTag)
    activate CO
    CO ->> CO: clean all spawners
    CO ->> GM: gameStructMap.Find(boardName)
    GM -->> CO: FCBP_GameStruct
    CO ->> CO: assign RH handles<br/>+ resource/skill DT
    CO ->> CO: QuestManager.clearAll<br/>+ defineQuests.Execute
    CO ->> SP: spawnAll(location)
    activate SP
    SP -->> CO: all spawners created
    deactivate SP
    CO ->> CO: onAllInstanciated.Broadcast
    CO ->> CO: playermaker.finishSpawning
    CO ->> CO: doAsSoonAs(navReady<br/>&& roomReady && worldReady)
    CO -->> BP: onGameBoardReady
    deactivate CO

2. Class Architecture

Module classes, inheritance, interfaces, and spawner references.

2a. UCGameManager

How UCGameManager stores game board configurations and provides factory methods for player creation.

flowchart TB
    GM_type["UCGameManager / UGameInstanceSubsystem"]
    GM_type --> GM_singleton["singleton via CGameInstance<br/>storeSingleton CNAME_Singleton_GameManager"]
    GM_type --> GM_map["gameStructMap<br/>TMap FName to FCBP_GameStruct"]
    GM_type --> GM_store["storeNewGameBoard<br/>converts all BP structs to DT rows"]
    GM_type --> GM_fly["createFlyViewPlayer, pure"]
    GM_type --> GM_fps["create1StViewPlayer, pure"]
    GM_type --> GM_internal["internal templates:<br/>storeCharacter, staticCreateCharacter<br/>acpAssignNPCToRoom<br/>mappingCompletionForPlayer<br/>mappingCompletionForAIPawnAndChar<br/>mappingCompletionForPawnAndChar"]

2b. ACCoordinator

Properties, spawner references, core functions, navigation functions, events, and the ICCoordinatorData interface implemented by ACCoordinator.

flowchart TB
    CO_type["ACCoordinator<br/>inherits ACAbstractSpawner<br/>implements ICCoordinatorData"]
    CO_type --> CO_props["properties:<br/>gameBoardName, playerTag<br/>boardBreadcrumb TArray FCBoardBreadcrumb<br/>resourceDatatable, skillDatatable<br/>biomeNoiseDataAsset"]
    CO_type --> CO_rh["DataTable row handles:<br/>gameMakerRH, playerMakerRH<br/>worldMakerRH, roomClusterRH<br/>hexaMakerRH, actorMakerRH<br/>fowMakerRH, mapMakerRH"]
    CO_type --> CO_spawners["spawner references:<br/>playerSpawner / ACPlayerSpawner<br/>worldSpawner / ACWorldSpawner<br/>roomSpawner / ACRoomSpawner<br/>hexaSpawner / ACHexaSpawner<br/>fowSpawner / ACFOWSpawner<br/>actorSpawner / ACActorSpawner<br/>mapSpawner / ACMapSpawner"]
    CO_type --> CO_core["core functions:<br/>cleanAllThenSpawnGameBoard<br/>innerCleanAllThenSpawnGameBoard<br/>spawnAll, clean, precheck<br/>changeTrackPawn, reset"]
    CO_type --> CO_nav["navigation functions:<br/>enterLevel, enterLevelSamePlayer<br/>exitLevel, switchPlayer<br/>showOrHideMap"]
    CO_type --> CO_events["events:<br/>onGameBoardReady / BlueprintImplementableEvent<br/>onAllInstanciated / dynamic multicast delegate"]
    CO_type --> CO_interface["ICCoordinatorData interface:<br/>retrieveBoardName<br/>retrieveResourceDataTable<br/>retrieveSkillDataTable<br/>retrieveWidget, retrieveObject<br/>retrieveSkillMetadata<br/>retrieveResourceMetadata<br/>retrieveCharacterMetadata<br/>retrieveRoomMetadata<br/>boundToOnAllSpawnerInstanciated"]

2c. UCGameBPLibrary and UCToggleTemporarySelect

Blueprint function library for player switching, skill creation helpers, and animation conversion, plus the UCToggleTemporarySelect preset skill.

flowchart TB
    BPL_type["UCGameBPLibrary / UBlueprintFunctionLibrary"]
    BPL_type --> BPL_player["player switching:<br/>switchPlayerTo<br/>switchPlayerToWithSameLocation"]
    BPL_type --> BPL_skill["skill creation:<br/>createSkillOnActorBeginOverlap<br/>createSkillOnActorEndOverlap<br/>createSkillOnActorInteraction<br/>createSkillOnActorCauseDamage<br/>createSkillOnActorReceiveDamage<br/>createSkillOnActorDeath<br/>createSkillOnRoomBeginOverlap<br/>createSkillOnRoomEndOverlap<br/>createSkillOnWidgetClick<br/>createSkillOnResourceCollect"]
    BPL_type --> BPL_anim["animation conversion:<br/>createMontageForEachSlot<br/>createMontage<br/>convertSequenceToMontage<br/>auto-generates notifiers:<br/>CHit, CCanCombo, CNoMoreCombo,<br/>CStartRange, CShotRange, CEndRange,<br/>CStartBlock, CEndBlock, CInterrupted"]
    BPL_type --> BPL_info["retrieveActorInformation"]
    BPL_type --> BPL_concat["array concat utilities:<br/>concatCBPSkill, concatCBPRoomDescription<br/>concatCBPCharacterRoom, concatCBPPawnRoom<br/>concatCBPActorRoom"]

    SK_type["UCToggleTemporarySelect / UCAbstractSkill"]
    SK_type --> SK_desc["preset skill auto-registered<br/>by storeNewGameBoard"]
    SK_type --> SK_logic["tick loop via doForever:<br/>find closest interactable<br/>toggle UCSelectComponent<br/>stops when no overlap"]

2d. FCBP_GameStruct / Runtime DataTable Container

The runtime container created by storeNewGameBoard, holding all DataTable references organized by subsystem.

flowchart TB
    GS["FCBP_GameStruct<br/>created by storeNewGameBoard"]
    GS --> GS_game["gameMakerDT / FCGameMakerStruct<br/>widgets, metadata DTs, objects"]
    GS --> GS_world["worldSpawnerDT / FCWorldSpawnerDataStruct"]
    GS --> GS_room["roomClusterDT / FCRoomClusterStruct<br/>roomMakerDT / FCRoomMakerStruct<br/>roomDetailDT / FCRoomDetailStruct"]
    GS --> GS_hexa["hexaSpawnerDT / FCHexaSpawnerDataStruct<br/>hexaMakerDT / FCHexaMakerStruct<br/>hexaMeshDT / FCMeshStruct"]
    GS --> GS_fow["fowMakerDT / FCFOWMakerStruct"]
    GS --> GS_map["mapMakerDT / FCMapMakerStruct"]
    GS --> GS_char["npcMakerDT / FCNPCMaker<br/>characterDetailMakerDT / FCCharacterDetailMaker<br/>playerMakerDT / FCPlayerMakerStruct<br/>aiStructDT / FCAIStruct"]
    GS --> GS_skill["skillDT / FCSkillDataStruct"]
    GS --> GS_res["resourceDT / FCResourceStruct"]
    GS --> GS_quest["defineQuests / FCBP_defineQuests delegate"]
    GS --> GS_biome["biome / FCBP_Biome"]

3. ACCoordinator Full Lifecycle

Detailed flow of innerCleanAllThenSpawnGameBoard: validation, cleanup, RH assignment, quest setup, precheck, spawn order, and ready condition.

flowchart TB
    entry["cleanAllThenSpawnGameBoard / enterLevel / exitLevel / reset<br/>all call innerCleanAllThenSpawnGameBoard"]
    entry --> navReset["navigationSystemReady = false"]
    navReset --> checkNames{{"gameBoardName or playerTag is None?"}}
    checkNames -->|"YES"| warnEmpty["WARN and return"]
    checkNames -->|"NO"| getGM["retrieveSingleton UCGameManager"]
    getGM --> findBoard{{"gameStructMap.Find boardName"}}
    findBoard -->|"not found"| warnBoard["WARN and return"]
    findBoard -->|"found"| cleanAll["clean: destroy all 7 spawners<br/>player, world, hexa, room, FOW, actor, map"]
    cleanAll --> initSeed["stream.Initialize seed"]
    initSeed --> assignRH["assign all RH from FCBP_GameStruct<br/>gameMakerRH, playerMakerRH for tag<br/>roomClusterRH, hexaMakerRH<br/>worldMakerRH, actorMakerRH<br/>fowMakerRH, mapMakerRH<br/>resourceDT, skillDT, biomeNoiseDataAsset"]
    assignRH --> quests["QuestManager.clearAll<br/>defineQuests.Execute if bound"]
    quests --> spawnAll["spawnAll with optional location"]
    spawnAll --> precheck{{"precheck"}}
    precheck -->|"CGameInstance missing"| warnGI["WARN and return"]
    precheck -->|"CPlayerController missing"| warnPC["WARN and return"]
    precheck -->|"CHUD missing"| warnHUD["WARN and return"]
    precheck -->|"all OK"| spawnPlayer["spawn ACPlayerSpawner<br/>createPlayerMaker"]
    spawnPlayer --> checkPM{{"playermaker created?"}}
    checkPM -->|"NO"| warnPM["WARN and return"]
    checkPM -->|"YES"| trackPawn["changeTrackPawn playermaker.pawn"]
    trackPawn --> biomeNoise{{"biomeNoiseDataAsset?"}}
    biomeNoise -->|"YES"| instBiome["UCNoisator instanciate biomeNoisator"]
    biomeNoise -->|"NO"| spawnFOW
    instBiome --> spawnFOW["spawn ACFOWSpawner<br/>fog before room and actor for fogAgent"]
    spawnFOW --> spawnRoom["spawn ACRoomSpawner"]
    spawnRoom --> spawnWorld["spawn ACWorldSpawner"]
    spawnWorld --> spawnHexa["spawn ACHexaSpawner"]
    spawnHexa --> spawnActor["spawn ACActorSpawner"]
    spawnActor --> broadcast["onAllInstanciated.Broadcast"]
    broadcast --> finishPawn["playermaker.finishSpawning optional location"]
    finishPawn --> waitReady["doAsSoonAs<br/>navigationSystemReady<br/>and roomSpawner<br/>and worldSpawner<br/>and roomSpawner.roomReady<br/>and worldSpawner.worldReady"]
    waitReady --> ready["onGameBoardReady<br/>BlueprintImplementableEvent"]

4. Level Transition and Runtime Operations

Breadcrumb stack for level transitions, player switching, and map toggle.

4a. Enter Level

How enterLevel and enterLevelSamePlayer push a breadcrumb onto the stack and rebuild the game board.

flowchart TB
    A["enterLevel<br/>enterLevelSamePlayer"]
    A --> B["PUSH breadcrumb<br/>gameBoardName + playerTag + location"]
    B --> C["innerCleanAllThenSpawnGameBoard<br/>seed, boardName, playerTag"]

4b. exitLevel

How exitLevel pops the last breadcrumb from the stack and rebuilds the game board at the saved location.

flowchart TB
    exitCall["exitLevel"]
    exitCall --> checkStack{{"boardBreadcrumb.Num > 0?"}}
    checkStack -->|"NO"| warnPop["WARN no more board to pop, return"]
    checkStack -->|"YES"| pop["POP from breadcrumb stack<br/>FCBoardBreadcrumb boardData = boardBreadcrumb.Pop"]
    pop --> extract["extract<br/>boardData.gameBoardName<br/>boardData.playerTag<br/>boardData.playerLocation"]
    extract --> rebuildExit["innerCleanAllThenSpawnGameBoard<br/>with this.seed<br/>boardData.gameBoardName<br/>boardData.playerTag<br/>boardData.playerLocation<br/>player teleported to saved location"]

4c. switchPlayer

How switchPlayer delegates to ACPlayerSpawner, updates the tracked pawn on all spawners except mapSpawner.

flowchart TB
    swCall["switchPlayer with playerTag, newLocation,<br/>retrievePreviousLocation, blendTime,<br/>whatToDoWhenPawnReady"]
    swCall --> swExec["playerSpawner.switchPlayer<br/>with playerTag, newLocation,<br/>retrievePreviousLocation,<br/>blendTime, whatToDoWhenPawnReady"]
    swExec --> updateTag["this.playerTag = playerTag"]
    updateTag --> getPawn["get new pawn from<br/>ACPlayerSpawner fromPlayerMakerOfCurrentPlayer"]
    getPawn --> track["changeTrackPawn with new pawn"]
    track --> trackList["update pawnToTrack on<br/>roomSpawner.pawnToTrack = pawn<br/>worldSpawner.pawnToTrack = pawn<br/>hexaSpawner.pawnToTrack = pawn<br/>fowSpawner.pawnToTrack = pawn<br/>actorSpawner.pawnToTrack = pawn<br/>mapSpawner excluded, not tracked"]

4d. showOrHideMap

How showOrHideMap toggles the ACMapSpawner creation and destruction.

flowchart TB
    mapCall["showOrHideMap / ICCoordinatorData interface"]
    mapCall --> mapCheck{{"mapSpawner != nullptr?"}}
    mapCheck -->|"YES, hide map"| mapClean["mapSpawner.clean<br/>mapSpawner.Destroy<br/>mapSpawner = nullptr"]
    mapCheck -->|"NO, show map"| mapSpawn["spawnActorSingletonAtRuntime<br/>ACMapSpawner with<br/>seed = this.seed<br/>mapMakerRH = this.mapMakerRH"]