Beispiel #1
0
        /// <summary>
        /// Apply action-related changes to the world.
        /// Returns set of changed Regions if everything worked, otherwise null
        /// </summary>
        /// <returns>all affected (changed) regions</returns>
        public override ConcurrentBag <Core.Models.Region> Do()
        {
            var action        = (Core.Models.Action)Model;
            var startPosition = (PositionI)action.Parameters[START_POSITION];
            var endPosition   = (PositionI)action.Parameters[END_POSITION];

            var regionStartPos = Controller.Instance.RegionManagerController.GetRegion(startPosition.RegionPosition);
            var regionEndPos   = Controller.Instance.RegionManagerController.GetRegion(endPosition.RegionPosition);
            var bag            = new ConcurrentBag <Core.Models.Region>();

            var entity = regionStartPos.GetEntity(startPosition.CellPosition);

            if (m_fight)
            {
                var enemyEntity = regionEndPos.GetEntity(endPosition.CellPosition);

                // Ranged attack units deal only 1 dmg to buildings
                if (((UnitDefinition)entity.Definition).AttackRange > 1 && enemyEntity.Definition.Category == Category.Building)
                {
                    enemyEntity.Health -= 1;
                }
                else if (((UnitDefinition)entity.Definition).AttackRange - m_fightDistance < 0)
                {
                    // iterate trough all methods to modifie the attack
                    LogicRules.AllAttackModifierRangedInMeele(entity);

                    enemyEntity.Health -= entity.ModfiedAttackValue - enemyEntity.ModifiedDefenseValue;

                    if (((UnitDefinition)enemyEntity.Definition).AttackRange >= m_fightDistance)
                    {
                        entity.Health -= enemyEntity.ModfiedAttackValue - entity.ModifiedDefenseValue;
                    }
                }
                else
                {
                    // iterate trough all methods to modifie the attack
                    LogicRules.AllAttackModifier(entity);
                    LogicRules.AllDefenseModifier(enemyEntity);

                    enemyEntity.Health -= entity.ModfiedAttackValue - enemyEntity.ModifiedDefenseValue;

                    if (((UnitDefinition)enemyEntity.Definition).AttackRange >= m_fightDistance)
                    {
                        LogicRules.AllAttackModifier(enemyEntity);
                        LogicRules.AllDefenseModifier(entity);
                        entity.Health -= enemyEntity.ModfiedAttackValue - entity.ModifiedDefenseValue;
                    }
                }

                if (enemyEntity.Health <= 0)
                {
                    LogicRules.DestroyBuilding(enemyEntity, regionEndPos, action, Controller.Instance.RegionManagerController);
                    regionEndPos.RemoveEntity(action.ActionTime, enemyEntity);
                    enemyEntity.Owner.Units.Remove(enemyEntity.Position);
                }
                else if (entity.Health <= 0)
                {
                    LogicRules.DestroyBuilding(entity, regionStartPos, action, Controller.Instance.RegionManagerController);
                    regionStartPos.RemoveEntity(action.ActionTime, entity);
                    entity.Owner.Units.Remove(entity.Position);
                }
            }
            else
            {
                regionStartPos.RemoveEntity(action.ActionTime, entity);
                regionEndPos.AddEntity(action.ActionTime, entity);
                entity.Position = endPosition;
            }

            bag.Add(regionStartPos);

            if (startPosition.RegionPosition != endPosition.RegionPosition)
            {
                bag.Add(regionEndPos);
            }

            action.Parameters[CLIENT_UNIT_INFOS] = entity;

            return(bag);
        }