//проверяет возможность переброски private bool rCheckTransfer(ExtTerrain startTerrain, ExtTerrain endTerrain, List <ExtTerrain> checkedTerrain, ExtGameUser holder) { //цикл по своим соседним морям foreach (var item in startTerrain.JoinTerrainCol.Where(p => p.WCFTerrain.TerrainType == "Море" && p.ExtHolderUser == holder)) { //игнорируем ранее проверенные моря if (checkedTerrain.Contains(item)) { continue; } //граничит? if (item.JoinTerrainCol.Contains(endTerrain)) { return(true); } //добавляем в игнор checkedTerrain.Add(item); //рекурсия if (rCheckTransfer(item, endTerrain, checkedTerrain, holder)) { return(true); } } return(false); }
//получает территорию static public ExtTerrain ExtTerrain(this WCFGameUserTerrain o) { ExtTerrain result = MainWindow.ClientInfo.WorldData.Terrain .Single(p => p.WCFTerrain.Name == o.Terrain); return(result); }
private bool TerrainDrop(DragEventArgs e) { if (TerrainView.UpdateGamePoint(e, this)) { return(false); } ExtTerrain dropTerrain = e.Data.GetData(typeof(ExtTerrain)) as ExtTerrain; if (dropTerrain == null) { return(false); } _Terrain.Game.ClientStep.ExtMarch.WCFMarch.MarchUnit.Clear(); foreach (var item in dropTerrain.Unit) { ExtTerrain moveTerrain = null; if (item.TempTerrain != item.ExtTerrain) { moveTerrain = item.TempTerrain; } if (item.IsSelected) { moveTerrain = _Terrain; } if (moveTerrain == null) { continue; } if (CheckMove(item, moveTerrain)) { WCFMarchUnit _WCFMarchUnit = new WCFMarchUnit(); _WCFMarchUnit.Terrain = moveTerrain.WCFTerrain.Name; _WCFMarchUnit.Unit = item.WCFUnit.Id; _WCFMarchUnit.UnitType = item.WCFUnit.UnitType; _Terrain.Game.ClientStep.ExtMarch.WCFMarch.MarchUnit.Add(_WCFMarchUnit); item.TempTerrain = moveTerrain; } else { item.TempTerrain = null; } item.IsSelected = false; } if (!HoldTerrain(dropTerrain)) { _Terrain.Game.ClientStep.ExtGameUserInfo.ExtPowerCounter.Remove(dropTerrain.PowerCounter); _Terrain.Game.ClientStep.ExtMarch.WCFMarch.IsTerrainHold = false; _Terrain.Game.OnPropertyChanged("ViewPowerCounter"); } return(true); }
//установить жетон власти private bool HoldTerrain(ExtTerrain dropTerrain) { //жетон власти установлен if (dropTerrain.PowerCounter != null && !dropTerrain.PowerCounter.IsTemp) { return(true); } if (dropTerrain.WCFTerrain.TerrainType != "Земля") { return(false); } //является родовой землёй //if (dropTerrain.ExtHomeType != null) if (dropTerrain.ExtHomeType == _Terrain.Game.ClientGameUser.ExtHomeType) { return(false); } //Не своя территория if (dropTerrain.ExtHolderUser != _Terrain.Game.ClientGameUser) { return(false); } //нет доступной власти if (_Terrain.Game.ClientStep.ExtGameUserInfo.WCFGameUserInfo.Power == 0) { return(false); } //не все юниты ушли if (dropTerrain.TempUnit.Count != 0) { return(false); } if (dropTerrain.PowerCounter != null) { return(true); } //создаём временный знак власти WCFPowerCounter wcfPowerCounter = new WCFPowerCounter(); wcfPowerCounter.Step = dropTerrain.ExtHolderUser.LastStep.WCFStep.Id; wcfPowerCounter.Terrain = dropTerrain.WCFTerrain.Name; wcfPowerCounter.TokenType = "Жетон_власти"; ExtPowerCounter powerCounter = new ExtPowerCounter(dropTerrain.ExtHolderUser.LastStep, wcfPowerCounter); powerCounter.IsTemp = true; powerCounter.IsSelected = false; dropTerrain.ExtHolderUser.LastStep.ExtGameUserInfo.ExtPowerCounter.Add(powerCounter); _Terrain.Game.OnPropertyChanged("ViewPowerCounter"); return(true); }
void TerrainView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { _Terrain = (ExtTerrain)e.NewValue; }
//Проверка марша private bool CheckMove(ExtUnit unit, ExtTerrain toTerrain) { if (!_Terrain.Game.ClientStep.WCFStep.StepType.Contains("Усиление_власти")) { //запрет движение в никуда if (unit.ExtTerrain == toTerrain) { return(false); } if (unit.WCFUnit.UnitType == "Корабль" && toTerrain.WCFTerrain.TerrainType == "Земля") { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move1")); return(false); } if (unit.WCFUnit.UnitType != "Корабль" && toTerrain.WCFTerrain.TerrainType != "Земля") { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move2")); return(false); } if (!toTerrain.JoinTerrainCol.Contains(unit.ExtTerrain)) { if (unit.WCFUnit.UnitType == "Корабль") { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move3")); return(false); } else { if (!rCheckTransfer(unit.ExtTerrain, toTerrain, new List <ExtTerrain>(), unit.Step.ExtGameUser)) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move4")); return(false); } } } } if (toTerrain.WCFTerrain.TerrainType == "Порт") { if (toTerrain.TempUnit.Count(p => p != unit) == 3) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move5")); return(false); } if (toTerrain.ExtHolderUser != unit.Step.ExtGameUser) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move6")); return(false); } } if (toTerrain.TempUnit.Count(p => p.Step == unit.Step && p != unit) == 4) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move7")); return(false); } if (_Terrain.Game.ClientStep.WCFStep.StepType == "Отступление" || _Terrain.Game.ClientStep.WCFStep.StepType == "Робб_Старк") { if (_Terrain.Game.ClientStep.WCFStep.March.MarchUnit.Any(p => p.Terrain != toTerrain.WCFTerrain.Name)) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move8")); return(false); } if (_Terrain.Game.ViewGameInfo.ExtBattle.AttackUser.LastStep.WCFStep.StepType != "Робб_Старк" && toTerrain.WCFTerrain.Name == _Terrain.Game.ViewGameInfo.ExtBattle.WCFBattle.AttackTerrain) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move9")); return(false); } if ((toTerrain.ExtHolderUser != null && unit.Step.ExtGameUser != toTerrain.ExtHolderUser) || (toTerrain.ExtHolderUser == null && _Terrain.ExtGarrison != null)) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_move10")); return(false); } } return(true); }
public bool CheckStep() { switch (WCFStep.StepType) { case "Событие_Вестероса": if (WCFStep.VesterosAction.ActionNumber == null) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), Name); return(false); } break; case "Доран_Мартелл": if (WCFStep.BattleUser.AdditionalEffect == null) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_Track")); return(false); } break; case "Набег": case "Усиление_власти": case "Усиление_власти_Вестерос": case "Поход": if (Game.SelectedOrder == null) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_order")); return(false); } break; case "Сражение": if (string.IsNullOrEmpty(WCFStep.BattleUser.HomeCardType)) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_homeCard")); return(false); } break; } if (WCFStep.StepType == "Поход") { //Количество нападений IEnumerable <ExtTerrain> tempTerrain = ExtMarch.ExtMarchUnit.Select(p => p.ExtUnit.TempTerrain).Distinct(); AttackTerrain = tempTerrain.Where(p => (p.ExtHolderUser != this.ExtGameUser && (p.Unit.Count() > 0 || p.ExtGarrison != null)) || (p.ExtHolderUser == null && p.ExtGarrison != null)); switch (AttackTerrain.Count()) { case 0: break; case 1: //Нейтральные лорды ExtTerrain garrisonTerrain = AttackTerrain.SingleOrDefault(p => p.ExtHolderUser == null && p.ExtGarrison != null); if (garrisonTerrain != null) { int resultStrength = garrisonTerrain.TempUnit.Sum(p => p.WCFUnit.IsWounded ? 0 : p.ExtUnitType.WCFUnitType.Strength); resultStrength += Game.SelectedOrder.ExtOrderType.WCFOrderType.Strength; foreach (ExtTerrain item in garrisonTerrain.JoinTerrainCol) { if (item.ExtHolderUser != this.ExtGameUser) { continue; } ExtOrder order = item.Order; if (order == null) { continue; } if (order.ExtOrderType.WCFOrderType.DoType == "Подмога") { resultStrength += order.ExtOrderType.WCFOrderType.Strength; resultStrength += item.TempUnit.Sum(p => p.WCFUnit.IsWounded ? 0 : p.ExtUnitType.WCFUnitType.Strength); } } if (resultStrength < garrisonTerrain.ExtGarrison.WCFGarrison.Strength) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), string.Format(App.GetResources("validation_lordFalse"), resultStrength, garrisonTerrain.ExtGarrison.WCFGarrison.Strength)); return(false); } App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), string.Format(App.GetResources("validation_lordTrue"), resultStrength, garrisonTerrain.ExtGarrison.WCFGarrison.Strength)); } break; default: App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_march")); return(false); } } //снабжение List <int> supplyArmy = null; switch (WCFStep.GameUserInfo.Supply) { case 0: supplyArmy = new List <int>() { 2, 2 }; break; case 1: supplyArmy = new List <int>() { 2, 3 }; break; case 2: supplyArmy = new List <int>() { 2, 2, 3 }; break; case 3: supplyArmy = new List <int>() { 2, 2, 2, 3 }; break; case 4: supplyArmy = new List <int>() { 2, 2, 3, 3 }; break; case 5: supplyArmy = new List <int>() { 2, 2, 3, 4 }; break; case 6: supplyArmy = new List <int>() { 2, 2, 2, 3, 4 }; break; } foreach (ExtTerrain terrain in ExtGameUserInfo.ExtUnit.Select(p => p.TempTerrain).Distinct()) { int unitCount = terrain.TempUnit.Count(p => p.Step == this && (p.Step.WCFStep.StepType != "Роспуск_войск" || !p.IsSelected)); if (unitCount < 2) { continue; } int supply = supplyArmy.FirstOrDefault(p => (p - unitCount) >= 0); if (supplyArmy.Count == 0 || supply == 0) { App.Agot2.errorView.ShowByDispatcher(App.GetResources("text_notify"), App.GetResources("validation_supply")); return(false); } supplyArmy.Remove(supply); } return(true); }