示例#1
0
    protected override void OnUpdate()
    {
        List <EntityOnVision> unitsOnVisionTeam_0 = SightSystem.GetUnitsOnVisionOfTeam(0);
        List <EntityOnVision> unitsOnVisionTeam_1 = SightSystem.GetUnitsOnVisionOfTeam(1);
        List <EntityOnVision> unitsOnVisionTeam_2 = SightSystem.GetUnitsOnVisionOfTeam(2);
        List <EntityOnVision> unitsOnVisionTeam_3 = SightSystem.GetUnitsOnVisionOfTeam(3);
        List <EntityOnVision> unitsOnVisionTeam_4 = SightSystem.GetUnitsOnVisionOfTeam(4);
        List <EntityOnVision> unitsOnVisionTeam_5 = SightSystem.GetUnitsOnVisionOfTeam(5);
        List <EntityOnVision> unitsOnVisionTeam_6 = SightSystem.GetUnitsOnVisionOfTeam(6);
        List <EntityOnVision> unitsOnVisionTeam_7 = SightSystem.GetUnitsOnVisionOfTeam(7);


        var sortedByHex_UnitsOnVisionTeam_0 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_0);
        var sortedByHex_UnitsOnVisionTeam_1 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_1);
        var sortedByHex_UnitsOnVisionTeam_2 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_2);
        var sortedByHex_UnitsOnVisionTeam_3 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_3);
        var sortedByHex_UnitsOnVisionTeam_4 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_4);
        var sortedByHex_UnitsOnVisionTeam_5 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_5);
        var sortedByHex_UnitsOnVisionTeam_6 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_6);
        var sortedByHex_UnitsOnVisionTeam_7 = SpartialSortUtils.GetHexToPointsDictionary(unitsOnVisionTeam_7);



        var buildingsOnVisionTeam_0 = SightSystem.GetBuildingsOnVisionOfTeam(0);
        var buildingsOnVisionTeam_1 = SightSystem.GetBuildingsOnVisionOfTeam(1);
        var buildingsOnVisionTeam_2 = SightSystem.GetBuildingsOnVisionOfTeam(2);
        var buildingsOnVisionTeam_3 = SightSystem.GetBuildingsOnVisionOfTeam(3);
        var buildingsOnVisionTeam_4 = SightSystem.GetBuildingsOnVisionOfTeam(4);
        var buildingsOnVisionTeam_5 = SightSystem.GetBuildingsOnVisionOfTeam(5);
        var buildingsOnVisionTeam_6 = SightSystem.GetBuildingsOnVisionOfTeam(6);
        var buildingsOnVisionTeam_7 = SightSystem.GetBuildingsOnVisionOfTeam(7);



        //normal group entities.
        #region Group that targets entities on vision.

        Entities.WithAll <Group, BEPosibleTarget>().WithNone <GroupOnGather>().ForEach((Entity entity, ref HexPosition hexPosition, ref SightRange sightRange, ref GroupBehaviour behaviour, ref ActTargetFilters filters, ref Team team, ref MovementState movementState) =>
        {
            var buffer = EntityManager.GetBuffer <BEPosibleTarget>(entity);
            buffer.Clear();

            var sortedByHex_UnitsOnTeamVision = GetSortedUnitsOnTeamVision(team.Number,
                                                                           sortedByHex_UnitsOnVisionTeam_0, sortedByHex_UnitsOnVisionTeam_1, sortedByHex_UnitsOnVisionTeam_2, sortedByHex_UnitsOnVisionTeam_3,
                                                                           sortedByHex_UnitsOnVisionTeam_4, sortedByHex_UnitsOnVisionTeam_5, sortedByHex_UnitsOnVisionTeam_6, sortedByHex_UnitsOnVisionTeam_7);
            var buildingsOnTeamVision = GetBuildingOnTeamVision(team.Number,
                                                                buildingsOnVisionTeam_0, buildingsOnVisionTeam_1, buildingsOnVisionTeam_2, buildingsOnVisionTeam_3,
                                                                buildingsOnVisionTeam_4, buildingsOnVisionTeam_5, buildingsOnVisionTeam_6, buildingsOnVisionTeam_7);

            switch (behaviour.Value)
            {
            case Behaviour.PASSIVE:

                if (EntityManager.HasComponent <PriorityGroupTarget>(entity))
                {
                    PostUpdateCommands.RemoveComponent <PriorityGroupTarget>(entity);
                }
                if (!movementState.DestinationReached)
                {
                    break;
                }
                FindAndAddPosibleTargetsToBuffer(hexPosition.HexCoordinates, sightRange.Value, filters, team, sortedByHex_UnitsOnTeamVision, buildingsOnTeamVision, buffer);
                break;

            case Behaviour.DEFAULT:

                if (EntityManager.HasComponent <PriorityGroupTarget>(entity))
                {
                    PostUpdateCommands.RemoveComponent <PriorityGroupTarget>(entity);
                }
                if (!movementState.DestinationReached)
                {
                    break;
                }
                FindAndAddPosibleTargetsToBuffer(hexPosition.HexCoordinates, sightRange.Value, filters, team, sortedByHex_UnitsOnTeamVision, buildingsOnTeamVision, buffer);
                break;



            case Behaviour.AGRESIVE:    //este modo agrega la entidad más cercana no bloqueada, como blanco prioritario. agrega a todas las entidades cercanas como posibles targets.

                PriorityGroupTarget priorityTarget;
                if (GetPriorityTargetAndAddPosibleTargets(out priorityTarget, hexPosition.HexCoordinates, sightRange.Value, team, filters, sortedByHex_UnitsOnTeamVision, buildingsOnTeamVision, buffer))
                {
                    // 1° if there isn´t a priorityTarget component we add one.
                    if (!EntityManager.HasComponent <PriorityGroupTarget>(entity))
                    {
                        PostUpdateCommands.AddComponent <PriorityGroupTarget>(entity, priorityTarget);
                    }
                    else
                    {
                        PostUpdateCommands.SetComponent <PriorityGroupTarget>(entity, priorityTarget);
                    }
                }
                else
                {
                    // 1° if there is a priorityTarget component we remove it.
                    if (EntityManager.HasComponent <PriorityGroupTarget>(entity))
                    {
                        PostUpdateCommands.RemoveComponent <PriorityGroupTarget>(entity);
                    }
                }
                break;

            default:
                throw new System.NotImplementedException();
            }
        });
        #endregion

        #region Groups that are gathering

        Entities.WithAll <Group, BEPosibleTarget, BEResourceSource>().ForEach((Entity entity, ref GroupOnGather onGather, ref HexPosition hexPosition, ref SightRange sightRange, ref Team team, ref MovementState movementState) =>
        {
            //UnityEngine.Debug.Log($"Group on gather. Entity: {entity.Index}. Gather resource: {onGather.GatheringResourceType}.");
            //Los targets son: todos los elementos del BEResourceSource + todos los elementos de los droppoints
            var posTargetBuffer = EntityManager.GetBuffer <BEPosibleTarget>(entity);

            posTargetBuffer.Clear();
            if (!movementState.DestinationReached)
            {
                return;
            }


            var resSourceBuffer     = EntityManager.GetBuffer <BEResourceSource>(entity);
            var allDropPointsOfTeam = DropPointSystem.GetAllDropPointsOfTeam(onGather.GatheringResourceType, team.Number);

            foreach (var resSource in resSourceBuffer)
            {
                if (resSource.currentGatherers >= resSource.maxGatherers)
                {
                    continue;
                }

                var posTarget = new BEPosibleTarget()
                {
                    Entity          = resSource.entity,
                    Position        = (FractionalHex)resSource.position,
                    Radius          = Fix64.Zero,
                    IsUnit          = false,
                    GatherTarget    = true,
                    IsResource      = true,
                    OccupiesFullHex = true,
                    OccupyingHex    = resSource.position,
                    ActTypeTarget   = ActType.GATHER,
                };
                posTargetBuffer.Add(posTarget);
            }


            foreach (var dropPoint in allDropPointsOfTeam)
            {
                var posTarget = new BEPosibleTarget()
                {
                    Entity          = dropPoint.Value,
                    Position        = (FractionalHex)dropPoint.Key,
                    Radius          = Fix64.Zero,
                    IsUnit          = false,
                    GatherTarget    = true,
                    IsResource      = false,
                    OccupiesFullHex = true,
                    OccupyingHex    = dropPoint.Key,
                    ActTypeTarget   = ActType.STORE
                };
                posTargetBuffer.Add(posTarget);
            }
        });

        #endregion
    }
示例#2
0
    protected override void OnCreate()
    {
        inputSystem     = World.GetOrCreateSystem <InputSystem>();
        selectionSystem = World.GetOrCreateSystem <SelectionSystem>();

        lockstepSystemGroup = World.GetOrCreateSystem <LockstepSystemGroup>();
        lockstepSystemGroup.AddSystemToUpdateList(World.GetOrCreateSystem <CommandExecutionSystem>());
        lockstepSystemGroup.AddSystemToUpdateList(World.GetOrCreateSystem <VolatileCommandSystem>());
        lockstepSystemGroup.AddSystemToUpdateList(World.GetOrCreateSystem <CommandableSafetySystem>());

        blockMovementSystem = World.GetOrCreateSystem <BlockMovementSystem>();

        onGroupCheckSystem = World.GetOrCreateSystem <OnGroupCheckSystem>();

        updateReachableHexListSystem = World.GetOrCreateSystem <UpdateReachableHexListSystem>();

        resourceSourceManagerSystem = World.GetOrCreateSystem <ResourceSourceManagerSystem>();
        triggerGatherSystem         = World.GetOrCreateSystem <TriggerGatherSystem>();

        dropPointSystem = World.GetOrCreateSystem <DropPointSystem>();

        triggerUpdateResBufferSystem = World.GetOrCreateSystem <TriggerUpdateResBufferSystem>();
        updateResourceBufferSystem   = World.GetOrCreateSystem <UpdateResourceBufferSystem>();


        updateOcupationMapSystem = World.GetOrCreateSystem <UpdateOcupationMapSystem>();
        updateDestinationSystem  = World.GetOrCreateSystem <UpdateDestinationSystem>();

        sightSystem = World.GetOrCreateSystem <SightSystem>();

        pathRefreshSystem     = World.GetOrCreateSystem <PathRefreshSystem>();
        pathFindingSystem     = World.GetOrCreateSystem <PathFindingSystem>();
        pathChangeIndexSystem = World.GetOrCreateSystem <PathChangeIndexSystem>();

        findPosibleTargetsSystem = World.GetOrCreateSystem <FindPosibleTargetsSystem>();
        findActionTargetSystem   = World.GetOrCreateSystem <FindActionTargetSystem>();

        findMovementTargetSystem = World.GetOrCreateSystem <FindMovementTargetSystem>();
        steeringSystem           = World.GetOrCreateSystem <SteeringSystem>();
        translationSystem        = World.GetOrCreateSystem <TranslationSystem>();
        movementFinisherSystem   = World.GetOrCreateSystem <MovementFinisherSystem>();



        collisionSystem = World.GetOrCreateSystem <CollisionSystem>();
        directionSystem = World.GetOrCreateSystem <DirectionSystem>();


        startActSystem = World.GetOrCreateSystem <StartActSystem>();
        removeReceivingActComponentsSystem = World.GetOrCreateSystem <RemoveReceivingActComponentsSystem>();
        initReceivingActComponentsSystem   = World.GetOrCreateSystem <InitReceivingActComponentsSystem>();
        attackSystem                = World.GetOrCreateSystem <AttackSystem>();
        receiveDamageSystem         = World.GetOrCreateSystem <ReceiveDamageSystem>();
        gatherSystem                = World.GetOrCreateSystem <GatherSystem>();
        extractResourceSystem       = World.GetOrCreateSystem <ExtractResourceSystem>();
        updateGathererAmmountSystem = World.GetOrCreateSystem <UpdateGathererAmmountSystem>();
        endActionSystem             = World.GetOrCreateSystem <EndActionSystem>();


        resourceSystem = World.GetOrCreateSystem <ResourceSystem>();


        deathSystem = World.GetOrCreateSystem <DeathSystem>();
        //simulationSystemGroup = World.GetOrCreateSystem<SimulationSystemGroup>();
        //simulationSystemGroup.AddSystemToUpdateList(World.GetOrCreateSystem<PathFindingSystem>());
        //simulationSystemGroup.AddSystemToUpdateList(World.GetOrCreateSystem<PathFollowSystem>());

        //lateSimulationSystemGroup = World.GetOrCreateSystem<LateSimulationSystemGroup>();

        //applicationSystemGroup = World.GetOrCreateSystem<ApplicationSystemGroup>();
    }