/// <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); }