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 CO2. 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"]