Exemplo n.º 1
0
        // Execute build bridge
        private void executeBuildBridge(int entityId, ExecuteBuildBridgeSkill executeBuildBridgeSkill)
        {
            PerformingSkillsComponent performSkillsComponent = EntityManager.getPerformingSkillsComponent(entityId);
            IsProxyComponent isProxyComponent = EntityManager.getIsProxyComponent(entityId);
            GroupComponent groupComponent;

            // Handle proxies
            if (isProxyComponent != null)
            {
                groupComponent = SystemManager.groupSystem.getGroupComponentContaining(isProxyComponent.proxyForId);
            }
            else
            {
                groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId);
            }

            EntityFactory.createBridge(executeBuildBridgeSkill.anchorA, executeBuildBridgeSkill.anchorB);
            EntityManager.removeComponent(entityId, ComponentType.PositionTarget);

            if (groupComponent != null)
            {
                // Update the default formation position to the limited range formation's position, then remove the limited range formation.
                float currentPosition = groupComponent.getFormation(FormationType.LimitedRange).position;

                groupComponent.removeFormation(executeBuildBridgeSkill.formationToRemove);
                groupComponent.getFormation(FormationType.Default).position = currentPosition;
            }

            removeExecutedSkill(entityId, executeBuildBridgeSkill);
        }
Exemplo n.º 2
0
        // Perform build bridge skill
        public void performBuildBridgeSkill(int entityId, BuildBridgeSkill buildBridgeSkill, Vector2 anchorA, Vector2 anchorB)
        {
            PerformingSkillsComponent performingSkillsComponent = EntityManager.getPerformingSkillsComponent(entityId);
            HasProxyComponent hasProxyComponent = EntityManager.getHasProxyComponent(entityId);
            IsProxyComponent isProxyComponent = EntityManager.getIsProxyComponent(entityId);
            ExecuteBuildBridgeSkill executeSkill;
            GroupComponent groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId);
            PositionComponent positionComponent = EntityManager.getPositionComponent(entityId);
            float distanceA = Math.Abs(anchorA.X - positionComponent.position.X);
            float distanceB = Math.Abs(anchorB.X - positionComponent.position.X);
            Vector2 closestAnchor = distanceA > distanceB ? anchorB : anchorA;

            // Find group
            if (isProxyComponent != null)
            {
                groupComponent = SystemManager.groupSystem.getGroupComponentContaining(isProxyComponent.proxyForId);
            }
            else
            {
                groupComponent = SystemManager.groupSystem.getGroupComponentContaining(entityId);
            }

            // Handle proxy
            if (hasProxyComponent != null)
            {
                EntityManager.removeComponent(hasProxyComponent.proxyId, ComponentType.PositionTarget);
                performBuildBridgeSkill(hasProxyComponent.proxyId, buildBridgeSkill, anchorA, anchorB);
                return;
            }

            // Create execute skill object
            executeSkill = new ExecuteBuildBridgeSkill(
                buildBridgeSkill,
                anchorA,
                anchorB,
                () =>
                {
                    PositionComponent futurePositionComponent = EntityManager.getPositionComponent(entityId);
                    PositionTargetComponent positionTargetComponent = EntityManager.getPositionTargetComponent(entityId);
                    float distance = Math.Abs(positionTargetComponent.position - futurePositionComponent.position.X);

                    return distance <= positionTargetComponent.tolerance + SKILL_RANGE_TOLERANCE;
                });

            if (groupComponent != null)
            {
                LimitedRangeFormation formation = new LimitedRangeFormation(groupComponent.entities, groupComponent.activeFormation.position, groupComponent.activeFormation.speed, float.MinValue, closestAnchor.X - 2f);

                executeSkill.formationToRemove = formation;
                groupComponent.addFormation(formation);
            }

            EntityManager.addComponent(entityId, new PositionTargetComponent(entityId, closestAnchor.X, buildBridgeSkill.range));
            performingSkillsComponent.executingSkills.Add(executeSkill);
        }