//проверяет возможность переброски
        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);
        }
Example #2
0
        //получает территорию
        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);
        }
Example #7
0
        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);
        }