GameWorldEcsComposer

Anonymous
csharp
07/18/2026 10:34 AM
13.7 KB
23
No Index
using System;
using Leopotam.EcsProto;
using Leopotam.EcsProto.Parenting;
using Leopotam.EcsProto.QoL;
using Leopotam.EcsProto.Unity;
using ShiftedRealms.IsoRift.GameWorld.Scene;
using VContainer;

namespace ShiftedRealms.IsoRift.GameWorld
{
    public class GameWorldEcsComposer :
        IStartSystem,
        IFixedUpdateSystem,
        IUpdateSystem,
        IDisposable
    {
        private readonly EntityGameObjectsRegistry entityGameObjectsRegistry;
        private readonly SceneRefs sceneRefs;
        private readonly InputSystem inputSystem;
        private readonly CharacterDefinitionsLibrary characterDefinitionsLibrary;
        private readonly ItemSlotDefinitionsLibrary itemSlotDefinitionsLibrary;
        private readonly ItemDefinitionsLibrary itemDefinitionsLibrary;
        private readonly RangedWeaponShotPresentationEventQueue shotPresentationEventQueue;

        private ItemPlacementService itemPlacementService;

        private ProtoWorld world;
        private ProtoSystems updateSystems;
        private ProtoSystems fixedSystems;

        public int UpdatePriority => UpdatePriorityList.ECS;
        public int StartPriority => StartPriorityList.ECS;
        public int FixedUpdatePriority => FixedUpdatePriorityList.ECS;
        public ProtoWorld World => world;

        [Inject]
        public GameWorldEcsComposer(
            EntityGameObjectsRegistry entityGameObjectsRegistry,
            SceneRefs sceneRefs,
            InputSystem inputSystem,
            CharacterDefinitionsLibrary characterDefinitionsLibrary,
            ItemSlotDefinitionsLibrary itemSlotDefinitionsLibrary,
            ItemDefinitionsLibrary itemDefinitionsLibrary,
            RangedWeaponShotPresentationEventQueue shotPresentationEventQueue)
        {
            this.entityGameObjectsRegistry = entityGameObjectsRegistry;
            this.sceneRefs = sceneRefs;
            this.inputSystem = inputSystem;
            this.characterDefinitionsLibrary = characterDefinitionsLibrary;
            this.itemSlotDefinitionsLibrary = itemSlotDefinitionsLibrary;
            this.itemDefinitionsLibrary = itemDefinitionsLibrary;
            this.shotPresentationEventQueue = shotPresentationEventQueue;
        }

        public void Start()
        {
            var rootAspect = new GameWorldRootAspect();
            world = new ProtoWorld(rootAspect);

            var characterNavigationService = new CharacterNavigationService();
            var visionObservationRelationsIndex = new VisionObservationRelationIndex();

            itemPlacementService = new ItemPlacementService(
                rootAspect.ItemPlacementAspect,
                rootAspect.ItemAspect,
                itemDefinitionsLibrary,
                itemSlotDefinitionsLibrary);

            var itemVisualAnchorService = new ItemVisualAnchorService(
                rootAspect.ItemPlacementAspect,
                rootAspect.GameObjectAspect,
                entityGameObjectsRegistry);

            var characterArchetypeFactory = new CharacterArchetypeFactory(
                new CharacterArchetypeFactory.Dependencies(
                    rootAspect.NamingAspect,
                    rootAspect.SpatialAspect,
                    rootAspect.PhysicsAspect,
                    rootAspect.CharacterAspect,
                    rootAspect.CombatReadinessAspect,
                    rootAspect.MovementAspect,
                    rootAspect.VisionFocusAspect,
                    rootAspect.LosAspect,
                    rootAspect.VisionPerceptionAspect,
                    rootAspect.FacingAspect,
                    rootAspect.AimingAspect,
                    rootAspect.RangedWeaponShootingAspect,
                    rootAspect.ItemPlacementAspect,
                    itemSlotDefinitionsLibrary,
                    characterDefinitionsLibrary));

            updateSystems = new ProtoSystems(world);
            updateSystems
                // Modules
                .AddModule(new AutoInjectModule())
                .AddModule(new UnityModule())

                // Services and configs
                .AddService(entityGameObjectsRegistry)
                .AddService(sceneRefs)
                .AddService(inputSystem)
                .AddService(characterDefinitionsLibrary)
                .AddService(itemSlotDefinitionsLibrary)
                .AddService(itemDefinitionsLibrary)
                .AddService(itemPlacementService)
                .AddService(itemVisualAnchorService)
                .AddService(characterArchetypeFactory)
                .AddService(characterNavigationService)

                // Systems
                .AddSystem(new CharacterSpawnSystem())
                .AddSystem(new PlayerCharacterSetupSystem())
                .AddSystem(new NpcSetupSystem())
                .AddSystem(new PlayerCharacterInitialEquipmentSetSystem())
                .AddSystem(new DemoNpcInitialEquipmentSetSystem())
                .AddSystem(new CharacterEntityGameObjectSpawnSystem())
                .AddSystem(new ItemEntityGameObjectSpawnSystem())
                .AddSystem(new ItemTransferVisualApplySystem())
                .AddSystem(new ItemGameObjectPlacementApplySystem())
                .Init();

            fixedSystems = new ProtoSystems(world);
            fixedSystems
                // Modules
                .AddModule(new AutoInjectModule())

                // Services and configs
                .AddService(entityGameObjectsRegistry)
                .AddService(characterDefinitionsLibrary)
                .AddService(itemDefinitionsLibrary)
                .AddService(itemSlotDefinitionsLibrary)
                .AddService(itemPlacementService)
                .AddService(shotPresentationEventQueue)
                .AddService(characterNavigationService)
                .AddService(visionObservationRelationsIndex)

                // Vision
                .AddSystem(new VisionObservableShapeResolveSystem())
                .AddSystem(new VisionInvalidObservationRelationCleanupSystem())
                .AddSystem(new VisionObservationResolveSystem())
                .AddSystem(new VisionRecognitionUpdateSystem())

                // Perception
                .AddSystem(new AiVisionRecognitionApplySystem())
                .AddSystem(new AiCombatStateDecisionSystem())

                // AI behaviours
                .AddSystem(new AiCombatBehaviourSystem())
                .AddSystem(new AiPointOfInterestPatrolSystem())

                // AI planning
                .AddSystem(new AiOperationPlanningSystem())
                .AddSystem(new AiOperationCandidateCancelSystem())

                // Operation's starts
                .AddSystem(new EquipmentRoleStateSetOperationStartSystem())
                .AddSystem(new MoveToPointOperationStartSystem())
                .AddSystem(new CombatReadinessOperationStartSystem())
                .AddSystem(new VisionFocusOperationStartSystem())
                .AddSystem(new RangedWeaponFireOperationStartSystem())

                // Sub-operations starts
                .AddSystem(new ItemTransferOperationStartSystem())

                // Operation cancellation
                .AddSystem(new EquipmentRoleStateSetOperationCancelPropagationSystem())
                .AddSystem(new OperationCancelSystem())

                // Process progress
                .AddSystem(new OperationProgressSystem())

                // Operation execution
                .AddSystem(new MoveToPointOperationExecuteSystem())
                .AddSystem(new CombatReadinessOperationExecuteSystem())
                .AddSystem(new VisionFocusOperationExecuteSystem())
                .AddSystem(new RangedWeaponFireOperationExecuteSystem())

                // AI behaviour results
                .AddSystem(new AiPointOfInterestPatrolResultSystem())

                // Sub-operations execution
                .AddSystem(new ItemTransferOperationExecuteSystem())
                .AddSystem(new EquipmentAssignmentStateSyncFromItemTransferSystem())
                .AddSystem(new EquipmentRoleStateSetOperationExecuteSystem())

                // Velocity simulation
                .AddSystem(new ClearAccelerationSystem())
                .AddSystem(new GravityApplySystem())
                .AddSystem(new ApplyForceSystem())

                // Execution layers
                .AddSystem(new MovementVisionFocusCommandBuildSystem())
                .AddSystem(new VisionFocusUpdateSystem())
                .AddSystem(new VisionFocusEntityPointResolveSystem())
                .AddSystem(new FacingCommandFromVisionFocusBuildSystem())
                .AddSystem(new MoveSystem())
                .AddSystem(new FacingRotationUpdateSystem())
                .AddSystem(new AimingSystem())

                // Unity scene resolve
                .AddSystem(new CharacterControllerPoseResolveSystem())

                // Derived character state
                .AddSystem(new LosShapeUpdateSystem())

                // TODO make this system independent from muzzle transform 
                .AddSystem(new RangedWeaponShootingSystem())

                // Fixed pose history
                .AddSystem(new WorldPoseFixedHistoryUpdateSystem())

                // Post tick events
                .AddSystem(new RangedWeaponShotResultBuildSystem())
                .AddSystem(new RangedWeaponShotPresentationEventsPublishSystem())

                // Cleanup systems
                .AddSystem(new VisionObservationCleanupSystem())
                .AddSystem(new RangedWeaponShotEventsCleanupSystem())
                .AddSystem(new OperationCleanupSystem())
                .AddSystem(new ProcessDeadParentsSystem())
                .Init();
        }

        public void FixedUpdate(float fixedDeltaTime)
        {
            fixedSystems.Run();
        }

        public void Update(float deltaTime)
        {
            updateSystems.Run();
        }

        public void Dispose()
        {
            fixedSystems?.Destroy();
            fixedSystems = null;

            updateSystems?.Destroy();
            updateSystems = null;

            world?.Destroy();
            world = null;

            itemPlacementService = null;
        }
    }
}
Editor is loading...
Leave a Comment