Ejemplo n.º 1
0
        private async void GridTroopsOrders_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (e.RowIndex >= 0)
                {
                    var troopsOrderName = GridTroopsOrders.Rows[e.RowIndex].Cells[1].Value.ToString();

                    var troopsOrder = _plemionaToolLocalData.TroopsOrders.Single(ta => ta.Name == troopsOrderName);

                    SetReady(false);

                    try
                    {
                        _ownTroops = await Task.Run(() =>
                        {
                            return(_plemionaFeaturesDiagnostics.GetTroops());
                        });
                    }
                    catch (BotCheckException)
                    {
                        MessageBox.Show("Bot check detected, order stopped.", "Bot check", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                    catch (FeatureException fe)
                    {
                        MessageBox.Show(fe.PlemionaErrorMessage, $"{(fe.PlemionaError ? "Plemiona" : "Unexpected")} Error", MessageBoxButtons.OK, fe.PlemionaError ? MessageBoxIcon.Warning : MessageBoxIcon.Error);
                        return;
                    }
                    finally
                    {
                        SetReady(true);
                    }

                    using (var frmTroopsOrder = new FrmTroopsOrder(_plemionaToolLocalData.TroopsOrders.Select(tt => tt.Name), _plemionaToolLocalData.TroopsTemplates, _ownTroops, troopsOrder))
                    {
                        var dialogResult = frmTroopsOrder.ShowDialog();

                        if (dialogResult == DialogResult.OK)
                        {
                            if (frmTroopsOrder.Deletetion)
                            {
                                _plemionaToolLocalData.TroopsOrders.Remove(troopsOrder);
                                GridTroopsOrders.Rows.RemoveAt(e.RowIndex);
                                FixGridNumbers(GridTroopsOrders);
                            }
                            else
                            {
                                GridTroopsOrders.Rows[e.RowIndex].Cells[1].Value = troopsOrder.Name;
                                GridTroopsOrders.Rows[e.RowIndex].Cells[2].Value = string.Join("..", troopsOrder.VillagesCoordinates.Select(vc => $"{vc.X}|{vc.Y}"));
                                GridTroopsOrders.Rows[e.RowIndex].Cells[3].Value = troopsOrder.ExecutionDate.ToLongDateString();
                                GridTroopsOrders.Rows[e.RowIndex].Cells[4].Value = troopsOrder.Everyday;
                            }

                            _plemionaToolLocalDataService.Save(_plemionaToolLocalData);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public IEnumerable <ILockable> LockList()
        {
            var locks = new List <ILockable> {
                this
            };

            if (Tribe != null)
            {
                locks.Add(Tribe);
            }

            if (GateBattle != null)
            {
                locks.AddRange(GateBattle.LockList);
            }

            if (MainBattle != null)
            {
                locks.AddRange(MainBattle.LockList);
            }

            locks.AddRange(Troops.StationedHere());

            return(locks.Distinct());
        }
Ejemplo n.º 3
0
        private async void BtnAddTroopsOrder_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (!_featureIsBeingExecuted)
                {
                    SetReady(false);

                    _ownTroops = await Task.Run(() =>
                    {
                        return(_plemionaFeaturesDiagnostics.GetTroops());
                    });

                    SetReady(true);
                }

                using (var frmTroopsOrder = new FrmTroopsOrder(_plemionaToolLocalData.TroopsOrders.Select(tt => tt.Name), _plemionaToolLocalData.TroopsTemplates, _ownTroops))
                {
                    var dialogResult = frmTroopsOrder.ShowDialog();

                    if (dialogResult == DialogResult.OK)
                    {
                        var troopsOrder = frmTroopsOrder.TroopsOrder;

                        _plemionaToolLocalData.TroopsOrders.Add(troopsOrder);

                        GridTroopsOrders.Rows.Add(GridTroopsOrders.RowCount + 1, troopsOrder.Name, string.Join("..", troopsOrder.VillagesCoordinates.Select(vc => $"{vc.X}|{vc.Y}")), troopsOrder.ExecutionDate, troopsOrder.Everyday);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public ITroopStub CreateTroopStub()
        {
            var stub = troopStubFactory.CreateTroopStub((byte)Troops.IdGen.GetNext());

            Troops.Add(stub);
            return(stub);
        }
Ejemplo n.º 5
0
        private void UpdateRequiredTroops()
        {
            var villageTargets = GetCoordinates();

            int villageTargetCount = villageTargets.Count();

            var activeTroops = TroopsOrder.TroopsTemplate.Troops;

            _requiredTroops = new Troops();

            for (int i = 0; i < villageTargetCount; i++)
            {
                _requiredTroops += activeTroops;
            }

            if ((_requiredTroops.Spearmen > _ownTroops.Spearmen) || (_requiredTroops.Swordmen > _ownTroops.Swordmen) || (_requiredTroops.Axemen > _ownTroops.Axemen) || (_requiredTroops.Bowmen > _ownTroops.Bowmen) ||
                (_requiredTroops.Scouts > _ownTroops.Scouts) || (_requiredTroops.LightCavalary > _ownTroops.LightCavalary) || (_requiredTroops.HorseArchers > _ownTroops.HorseArchers) || (_requiredTroops.HeavyCavalary > _ownTroops.HeavyCavalary) ||
                (_requiredTroops.Rams > _ownTroops.Rams) || (_requiredTroops.Catapultes > _ownTroops.Catapultes) ||
                (_requiredTroops.Knights > _ownTroops.Knights) || (_requiredTroops.Noblemen > _ownTroops.Noblemen))
            {
                LblRequiredTroopsStatus.ForeColor = Color.Red;
                LblRequiredTroopsStatus.Text      = "Not enough troops";
            }
            else
            {
                LblRequiredTroopsStatus.ForeColor = Color.LimeGreen;
                LblRequiredTroopsStatus.Text      = "Enough troops";
            }
        }
Ejemplo n.º 6
0
        public void SendTroops(Troops troops, int coordinateX, int coordinateY, TroopsIntentions troopsIntentions, SendingTroopsInfo sendingTroopsInfo = null)
        {
            var stopwatch      = Stopwatch.StartNew();
            var featureResults = FeatureResults.Success;

            try
            {
                OnFeatureStart?.Invoke(MethodBase.GetCurrentMethod().Name, DateTime.Now);
                _plemionaDefaultFeatures.SendTroops(troops, coordinateX, coordinateY, troopsIntentions, sendingTroopsInfo);
            }
            catch (BotCheckException)
            {
                featureResults = FeatureResults.BotCheck;
                throw;
            }
            catch (FeatureException fe)
            {
                featureResults = fe.PlemionaError ? FeatureResults.PlemionaError : FeatureResults.UnexpectedError;
                throw;
            }
            finally
            {
                OnFeatureEnd?.Invoke(MethodBase.GetCurrentMethod().Name, DateTime.Now, stopwatch.ElapsedMilliseconds, featureResults);
                stopwatch.Stop();
            }
        }
Ejemplo n.º 7
0
        public void RecruitTroops(Troops troops)
        {
            var stopwatch      = Stopwatch.StartNew();
            var featureResults = FeatureResults.Success;

            try
            {
                OnFeatureStart?.Invoke(MethodBase.GetCurrentMethod().Name, DateTime.Now);
                _plemionaDefaultFeatures.RecruitTroops(troops);
            }
            catch (BotCheckException)
            {
                featureResults = FeatureResults.BotCheck;
                throw;
            }
            catch (FeatureException fe)
            {
                featureResults = fe.PlemionaError ? FeatureResults.PlemionaError : FeatureResults.UnexpectedError;
                throw;
            }
            finally
            {
                OnFeatureEnd?.Invoke(MethodBase.GetCurrentMethod().Name, DateTime.Now, stopwatch.ElapsedMilliseconds, featureResults);
                stopwatch.Stop();
            }
        }
Ejemplo n.º 8
0
 public int GetMaxCountSteps()
 {
     return
         (Math.Max(
              Troops.Any() ? Troops.Max(x => x.Remaining) : 0,
              Bombs.Any() ? Bombs.Max(x => x.Remaining) + Constants.BOMB_EXPLODE_DURATION : 0
              ));
 }
Ejemplo n.º 9
0
        public void TroopsToGoCantBeLessThen25AttackForce()
        {
            var attacker   = new Village(new Troops());
            var defensor   = new Village(new Troops());
            var troopsToGo = new Troops();

            IAttackService service = new AttackService();

            service.SendAttack(attacker, defensor);
        }
Ejemplo n.º 10
0
 public void AddTroop(Side side, int size, int src, int dst, int remaining)
 {
     Troops.Add(new Troop {
         Side      = side,
         Dst       = dst,
         Remaining = remaining,
         Size      = size,
         Src       = src
     });
 }
Ejemplo n.º 11
0
 public void DoNextMove()
 {
     foreach (var factory in Factories.Where(x => x.Side != Side.Neutral))
     {
         if (factory.InactivityDaysLeft <= 0)
         {
             factory.TroopsCount += factory.Income;
         }
         else
         {
             factory.InactivityDaysLeft--;
         }
     }
     foreach (var troop in Troops)
     {
         troop.Remaining--;
     }
     foreach (var troopGroup in Troops.Where(x => x.Remaining == 0).GroupBy(x => x.Dst))
     {
         var factory        = Factories[troopGroup.First().Dst];
         int troopToFactory =
             troopGroup.Where(x => x.Side == Side.MyOwn).Sum(x => x.Size) -
             troopGroup.Where(x => x.Side == Side.Enemy).Sum(x => x.Size);
         if (troopToFactory == 0)
         {
             continue;
         }
         Side troopRestSide = troopToFactory > 0 ? Side.MyOwn : Side.Enemy;
         troopToFactory = Math.Abs(troopToFactory);
         var sign = 1;
         //            if (factory.Side == Side.Neutral  ? troopRestSide == Side.Enemy : (factory.Side != troopRestSide))
         if (factory.Side != troopRestSide)
         {
             sign = -1;
         }
         factory.TroopsCount += troopToFactory * sign;
         if (factory.TroopsCount < 0)
         {
             factory.Side        = troopRestSide;
             factory.TroopsCount = Math.Abs(factory.TroopsCount);
         }
     }
     Troops = Troops.Where(x => x.Remaining > 0).ToList();
     CurrentGameTick++;
     //        foreach (var factory in Factories) {
     //            if (factory.Side == Side.Neutral) {
     //                if (factory.TroopsCount != 0)
     //                    factory.Side = factory.TroopsCount > 0 ? Side.MyOwn : Side.Enemy;
     //            }
     //            else if (factory.TroopsCount < 0)
     //                factory.Side = factory.Side == Side.Enemy ? Side.MyOwn : Side.Enemy;
     //        }
 }
Ejemplo n.º 12
0
 public void CheckSurvivors()
 {
     for (int i = Troops.Count - 1; i > 0; i--)
     {
         var deathChance = Random.Range(0f, 1f);
         if (deathChance > Troops[i].SurvivalChance)
         {
             Troops.RemoveAt(i);
         }
         Debug.Log(Troops.Count);
     }
 }
Ejemplo n.º 13
0
    public void Dead()
    {
        Troops troop = GetComponentInParent <Troops>();

        if (troop)
        {
            troop.TroopsDead();
        }

        if (!transform.CompareTag("Egon"))
        {
            Destroy(this.gameObject);
        }
    }
Ejemplo n.º 14
0
        public Troops GetTroops()
        {
            try
            {
                var troops = new Troops
                {
                    Spearmen      = _stepExecutionService.Execute <int>("GetOwnSpearmen"),
                    Swordmen      = _stepExecutionService.Execute <int>("GetOwnSwordmen"),
                    Axemen        = _stepExecutionService.Execute <int>("GetOwnAxemen"),
                    Bowmen        = _stepExecutionService.Execute <int>("GetOwnBowmen"),
                    Scouts        = _stepExecutionService.Execute <int>("GetOwnScouts"),
                    LightCavalary = _stepExecutionService.Execute <int>("GetOwnLightCavalary"),
                    HorseArchers  = _stepExecutionService.Execute <int>("GetOwnHorseArchers"),
                    HeavyCavalary = _stepExecutionService.Execute <int>("GetOwnHeavyCavalary"),
                    Rams          = _stepExecutionService.Execute <int>("GetOwnRams"),
                    Catapultes    = _stepExecutionService.Execute <int>("GetOwnCatapultes"),
                    Knights       = _stepExecutionService.Execute <int>("GetOwnKnights"),
                    Noblemen      = _stepExecutionService.Execute <int>("GetOwnNoblemen"),
                    Peasants      = _stepExecutionService.Execute <int>("GetOwnPeasants"),
                };

                return(troops);
            }
            catch (BotCheckException bce)
            {
                _featureLoggingService.LogBotCheck(MethodBase.GetCurrentMethod().Name, bce.CurrentStep);
                throw;
            }
            catch (Exception e)
            {
                string errorMessage  = string.Empty;
                bool   plemionaError = false;

                if (_stepExecutionService.Execute <bool>("IsErrorMessagePresent"))
                {
                    plemionaError = true;
                    errorMessage  = _stepExecutionService.Execute <string>("GetErrorMessage");
                }
                else
                {
                    errorMessage = e.Message;
                    _featureLoggingService.LogException(e, MethodBase.GetCurrentMethod().Name);
                }

                TryToReturnToVillageView();

                throw new FeatureException(plemionaError, errorMessage);
            }
        }
Ejemplo n.º 15
0
        public void SendAttack()
        {
            var attacker   = new Village(new Troops());
            var defensor   = new Village(new Troops());
            var troopsToGo = new Troops
            {
                Barbarians    = 1000,
                LightCavalary = 1500,
                Rams          = 190
            };

            IAttackService service = new AttackService();


            service.SendAttack(attacker, defensor);
        }
Ejemplo n.º 16
0
        public void CreateUnitGizmo(Troops troops)
        {
            var unitGizmo = DomEdit.I.Ui.Create <UnitGizmo>(rosterGroup);

            unitGizmo.SetData(troops);
            _monsterGizmos.Add(unitGizmo);

            var ownerCommander = Province.Monsters.OfType <Commander>().SingleOrDefault(x => x.UnitsUnderCommand.Contains(troops));

            if (ownerCommander != null)
            {
                var ownerCommanderGizmo = _monsterGizmos.OfType <CommanderGizmo>().Single(x => x.Data == ownerCommander);
                int commanderIdx        = ownerCommanderGizmo.transform.GetSiblingIndex();
                unitGizmo.transform.SetSiblingIndex(commanderIdx + 1);
            }
        }
Ejemplo n.º 17
0
        private void AddTroop(UnitData unitData)
        {
            RaycastGizmos(out var gizmo);

            if (gizmo is ProvinceGizmo provinceGizmo)
            {
                var province = provinceGizmo.Province;
                var unit     = Troops.Create(unitData.id, 1, province.Owner);

                province.Monsters.Add(unit);
                provinceGizmo.CreateUnitGizmo(unit);
            }
            else if (gizmo is CommanderGizmo commanderGizmo)
            {
                var unit = Troops.Create(unitData.id, 1, commanderGizmo.OwnerProvince.Province.Owner);

                commanderGizmo.Data.UnitsUnderCommand.Add(unit);
                commanderGizmo.OwnerProvince.CreateUnitGizmo(unit);
            }
        }
Ejemplo n.º 18
0
        protected override void SetChildrenProperties()
        {
            base.SetChildrenProperties();

            background.Location   = Location;
            background.Size       = Size;
            background.TintColour = BackgroundColour;

            provincesItem.ForegroundColour = ForegroundColour;
            provincesItem.Location         = new Point2D(Location.X + Spacing, Location.Y + (Size.Height - provincesItem.ClientRectangle.Height) / 2);
            provincesItem.Size             = new Size2D((Size.Width - Spacing * 3) / 4, 16);
            provincesItem.Text             = Provinces.ToString();

            holdingsItem.ForegroundColour = ForegroundColour;
            holdingsItem.Location         = new Point2D(provincesItem.ClientRectangle.Right + Spacing, provincesItem.Location.Y);
            holdingsItem.Size             = new Size2D((Size.Width - Spacing * 3) / 4, 16);
            holdingsItem.Text             = Holdings.ToString();

            wealthItem.ForegroundColour = ForegroundColour;
            wealthItem.Location         = new Point2D(holdingsItem.ClientRectangle.Right + Spacing, holdingsItem.Location.Y);
            wealthItem.Size             = new Size2D((Size.Width - Spacing * 3) / 4, 16);
            wealthItem.Text             = Wealth.ToString();

            troopsItem.ForegroundColour = ForegroundColour;
            troopsItem.Location         = new Point2D(wealthItem.ClientRectangle.Right + Spacing, wealthItem.Location.Y);
            troopsItem.Size             = new Size2D((Size.Width - Spacing * 3) / 4, 16);
            troopsItem.Text             = "0";

            provincesTooltip.Location = new Point2D(provincesItem.Location.X, ClientRectangle.Bottom);
            holdingsTooltip.Location  = new Point2D(holdingsItem.Location.X, ClientRectangle.Bottom);
            wealthTooltip.Location    = new Point2D(wealthItem.Location.X, ClientRectangle.Bottom);
            troopsTooltip.Location    = new Point2D(troopsItem.Location.X, ClientRectangle.Bottom);

            troopsTooltip.Text = string.Empty;

            if (Troops != null && Troops.Count > 0)
            {
                troopsItem.Text = Troops.Values.Sum().ToString();
                Troops.ToList().ForEach(t => troopsTooltip.Text += $"{t.Key}: {t.Value}\n");
            }
        }
Ejemplo n.º 19
0
        private async void FrmMain_Shown(object sender, EventArgs e)
        {
            foreach (var troopsTemplate in _plemionaToolLocalData.TroopsTemplates)
            {
                GridTroopsTemplates.Rows.Add(GridTroopsTemplates.RowCount + 1, troopsTemplate.Name);
            }

            GridTroopsTemplates.ClearSelection();

            foreach (var troopsOrder in _plemionaToolLocalData.TroopsOrders)
            {
                GridTroopsOrders.Rows.Add(GridTroopsOrders.RowCount + 1, troopsOrder.Name, string.Join("..", troopsOrder.VillagesCoordinates.Select(vc => $"{vc.X}|{vc.Y}")), troopsOrder.ExecutionDate, troopsOrder.Everyday);
            }

            GridTroopsOrders.ClearSelection();

            SetReady(false);

            try
            {
                await Task.Run(() =>
                {
                    _plemionaSettingsInitializationService.Initialize();

                    _plemionaFeaturesDiagnostics.SignIn(_plemionaSettings.Url, _plemionaSettings.Username, _plemionaSettings.Password, _plemionaSettings.WorldNumber);
                });
            }
            catch
            {
                MessageBox.Show($"Initialization failed. Happens once in a while, try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                _webDriver.Quit();
                Environment.Exit(0);
            }

            _ownTroops = await Task.Run(() =>
            {
                return(_plemionaFeaturesDiagnostics.GetTroops());
            });

            SetReady(true);
        }
Ejemplo n.º 20
0
        private void UpdateVillageTroops(CocApi cocApi, VillageApiModel downloadedVillage)
        {
            List <TroopApiModel> newTroops = new List <TroopApiModel>();

            foreach (TroopApiModel troop in downloadedVillage.Troops.EmptyIfNull())
            {
                TroopApiModel?oldTroop = Troops.FirstOrDefault(t => t.Name == troop.Name);

                if (oldTroop == null || oldTroop.Level < troop.Level)
                {
                    newTroops.Add(troop);
                }
            }

            if (newTroops.Count() > 0)
            {
                cocApi.VillageTroopsChangedEvent(this, newTroops);

                //Troops = downloadedVillage.Troops;
            }
        }
Ejemplo n.º 21
0
        internal void AddTroopsFromParty(PartyBase party)
        {
            var troops = party.MemberRoster;

            foreach (var troop in troops)
            {
                int totalNumber = troop.Number - troop.WoundedNumber;
                var troopType   = troop.Character.DecideTroopType();

                while (totalNumber-- > 0)
                {
                    Troops.Add(new Troop(troop.Character, this, troopType));
                }
            }
            if (party.MobileParty != null && party.MobileParty.AttachedParties != null)
            {
                foreach (var attachedParty in party.MobileParty.AttachedParties)
                {
                    AddTroopsFromParty(attachedParty.Party);
                }
            }
        }
Ejemplo n.º 22
0
        public FrmTroopsOrder(IEnumerable <string> invalidNames, IEnumerable <TroopsTemplate> troopsTemplates, Troops ownTroops, TroopsOrder troopsOrderToEdition = null)
        {
            InitializeComponent();

            _invalidNames    = invalidNames;
            _troopsTemplates = troopsTemplates;
            _ownTroops       = ownTroops;

            _editionMode = troopsOrderToEdition != null;

            TroopsOrder = _editionMode ? troopsOrderToEdition : new TroopsOrder();

            CbxTroopsTemplate.Items.AddRange(_troopsTemplates.Select(tt => tt.Name).ToArray());

            if (_editionMode)
            {
                BtnDeletion.Visible = true;

                TbxName.Text = troopsOrderToEdition.Name;

                CbxTroopsTemplate.SelectedItem = troopsOrderToEdition.TroopsTemplate.Name;

                LbxCoordinates.Items.AddRange(troopsOrderToEdition.VillagesCoordinates.Select(vc => $"{vc.X}|{vc.Y}").ToArray());

                DtpckExecutionDate.Value = troopsOrderToEdition.ExecutionDate;

                CkbxEveryday.Checked = troopsOrderToEdition.Everyday;

                UpdateRequiredTroops();
            }
            else
            {
                CbxTroopsTemplate.SelectedIndex = 0;
            }

            BtnOk.Text = troopsOrderToEdition != null ? "Edit" : "Add";
        }
Ejemplo n.º 23
0
        public string GetParameter(int index, string s)
        {
            var b = ulong.TryParse(s, out var t);

            if (!b)
            {
                return(s);
            }

            //maybe t is common param?
            if (t > 0x00FFFFFFFFFFFFFF)
            {
                return(Common.GetParam(t));
            }

            if (!Parameters.ContainsKey(index))
            {
                return(s);
            }

            return(Parameters[index] switch
            {
                Parameter.None => s,
                Parameter.FaceKeyRegister => Common.GetFaceKey(t),
                Parameter.FloatRegister => "fp" + s,
                Parameter.GameKeyCode => Common.GetGameKey(t),
                Parameter.KeyCode => Common.GetKey(t),
                Parameter.Position => "pos" + s,
                Parameter.String => "s" + s,
                Parameter.InventorySlot => Common.GetInventorySlot(t),
                Parameter.Tooltip => Common.GetTooltip(t),
                Parameter.Color => Common.GetColor(t),
                Parameter.TextFlags => Common.DecompileTextFlags((uint)t),
                Parameter.Alpha => Common.GetAlpha(t),
                Parameter.MenuFlags => Menus.DecompileFlags(t),
                Parameter.TroopFlags => Troops.DecompileFlags((uint)t),
                Parameter.WeaponProficiency => Common.GetWeaponProficiency(t),
                Parameter.CharacterAttribute => Common.GetCharacterAttribute(t),
                Parameter.PartyFlags => Parties.DecompileFlags((uint)t),
                Parameter.AiBehavior => Parties.GetAiBehavior(t),
                Parameter.ItemProperty => Items.DecompileFlags(t),
                Parameter.ItemCapability => Items.DecompileCapabilities(t),
                Parameter.TroopIdentifier => Common.GetCommonIdentifier("trp", Common.Troops, t),
                Parameter.ItemIdentifier => Common.GetCommonIdentifier("itm", Common.Items, t),
                Parameter.PartyIdentifier => Common.GetCommonIdentifier("p", Common.Parties, t),
                Parameter.AnimationIdentifier => Common.GetCommonIdentifier("anim", Common.Animations, t),
                Parameter.ScenePropIdentifier => Common.GetCommonIdentifier("spr", Common.SceneProps, t),
                Parameter.SceneIdentifier => Common.GetCommonIdentifier("scn", Common.Scenes, t),
                Parameter.FactionIdentifier => Common.GetCommonIdentifier("fac", Common.Factions, t),
                Parameter.TableauMaterialIdentifier => Common.GetCommonIdentifier("tableau", Common.Tableaus, t),
                Parameter.QuestIdentifier => Common.GetCommonIdentifier("qst", Common.Factions, t),
                Parameter.PartyTemplateIdentifier => Common.GetCommonIdentifier("pt", Common.Factions, t),
                Parameter.InfoPageIdentifier => Common.GetCommonIdentifier("ip", Common.InfoPages, t),
                Parameter.SkillIdentifier => Common.GetCommonIdentifier("skl", Common.Skills, t),
                Parameter.MapIconIdentifier => Common.GetCommonIdentifier("icon", Common.MapIcons, t),
                Parameter.MeshIdentifier => Common.GetCommonIdentifier("mesh", Common.Meshes, t),
                Parameter.ItemType => Items.DecompileType(t),
                Parameter.SoundIdentifier => Common.GetCommonIdentifier("snd", Common.Sounds, t),
                Parameter.SoundFlags => Sounds.DecompileFlags((uint)t),
                Parameter.ScriptIdentifier => Common.GetCommonIdentifier("script", Common.Procedures, t),
                Parameter.ParticleSystemIdentifier => Common.GetCommonIdentifier("psys", Common.ParticleSystems, t),
                Parameter.AttributeIdentifier => Troops.DecompileCharacterAttribute((uint)t),
                Parameter.ItemModifier => Items.DecompileModifier((uint)t),
                Parameter.MenuIdentifier => Common.GetCommonIdentifier("mnu", Common.Menus, t),
                Parameter.PresentationIdentifier => Common.GetCommonIdentifier("prsnt", Common.Presentations, t),
                Parameter.TrackIdentifier => Common.GetCommonIdentifier("track", Common.Music, t),
                Parameter.MusicFlags => Music.DecompileFlags((uint)t),
                Parameter.EquipmentOverrideFlags => MissionTemplates.DecompileAlterFlags((uint)t),
                Parameter.MissionTemplateIdentifier => Common.GetCommonIdentifier("mt", Common.MissionTemplates, t),
                Parameter.SceneFlags => Scenes.DecompileFlags((uint)t),
                Parameter.SortMode => Common.DecompileSortMode(t),
                Parameter.SkinIdentifier => Common.GetCommonIdentifier("tf_", Common.Skins, t),
                _ => s,
            });
Ejemplo n.º 24
0
 public Context(Troops troop)
 {
     this.troop = troop;
 }
Ejemplo n.º 25
0
 internal void RemoveTroop(MBGUID troopId)
 {
     Troops.Remove(Troops.Find(t => t.CharacterObject.Id == troopId));
 }
Ejemplo n.º 26
0
 public int GetTroopSteps()
 {
     return(Troops.Any() ? Troops.Max(x => x.Remaining) : 0);
 }
Ejemplo n.º 27
0
 public void ClearMovedEntities()
 {
     Troops.Clear();
 }
Ejemplo n.º 28
0
        public static Dictionary <int, Province> LoadProvinces(Map map)
        {
            var mapElements = map.AllElements;

            //Find province points (white pixels)
            var provincePoints = new List <Vector2>();

            for (int y = 0; y < map.MapTexture.height; y++)
            {
                for (int x = 0; x < map.MapTexture.width; x++)
                {
                    var pixel = map.MapTexture.GetPixel(x, y);
                    if (pixel == Color.white)
                    {
                        provincePoints.Add(new Vector2(x, y));
                    }
                }
            }

            //Create all provinces
            var provinces     = new Dictionary <int, Province>();
            int provinceCount = mapElements.OfType <Terrain>().Max(x => x.ProvinceNum);

            for (int num = 1; num <= provinceCount; num++)
            {
                var provinceBorders = mapElements.OfType <ProvinceBorders>().Where(x => x.ProvinceNum == num).ToList();
                if (provinceBorders.Count == 0)
                {
                    continue;
                }

                var provincePoint = provincePoints[num - 1];
                // var centerPos = Vector2.zero;
                // foreach (var pb in provinceBorders)
                // {
                //  centerPos.x += pb.X;
                //  centerPos.y += pb.Y;
                // }
                // centerPos /= provinceBorders.Count();

                var province = new Province(num, provincePoint);
                province.ProvinceBorders = provinceBorders;
                provinces.Add(num, province);
            }

            //Set owner of provinces
            foreach (var provinceOwner in mapElements.OfType <ProvinceOwner>())
            {
                if (provinces.ContainsKey(provinceOwner.ProvinceNum))
                {
                    var nation = DomEdit.I.Nations.GetNationById(provinceOwner.NationNum);
                    provinces[provinceOwner.ProvinceNum].Owner = nation;
                }
            }

            foreach (var startLocation in mapElements.OfType <StartLocation>())
            {
                if (provinces.ContainsKey(startLocation.ProvinceNum))
                {
                    var nation = DomEdit.I.Nations.GetNationById(startLocation.NationNum);
                    provinces[startLocation.ProvinceNum].Owner = nation;
                }
            }

            //Create commanders
            foreach (var commanderElement in mapElements.OfType <CommanderElement>())
            {
                var province  = provinces[commanderElement.ProvinceNum];
                var commander = Commander.Create(commanderElement.MonsterId, province.Owner);
                commander.Nationality = province.Owner;
                province.Monsters.Add(commander);

                //Create owned-be-commander objects
                foreach (var ownedByCommander in mapElements.OfType <IOwnedByCommander>().Where(x => x.Commander == commanderElement))
                {
                    switch (ownedByCommander)
                    {
                    case BodyguardsElement bodyguardsElement:
                        var bodyguard = Troops.Create(bodyguardsElement.MonsterId, bodyguardsElement.Amount, commander.Nationality);
                        commander.Bodyguards.Add(bodyguard);
                        break;

                    case ItemElement itemElement:
                        var item = Item.Create(itemElement.ItemName);
                        commander.Items.Add(item);
                        break;

                    case UnitsElement unitsElement:
                        var unit = Troops.Create(unitsElement.MonsterId, unitsElement.Amount, commander.Nationality);
                        commander.UnitsUnderCommand.Add(unit);
                        break;

                    case Experience _:
                        //TODO
                        break;

                    case Magic magic:
                        var path = magic switch
                        {
                            AirMagic _ => MagicPath.Air,
                            AstralMagic _ => MagicPath.Astral,
                            BloodMagic _ => MagicPath.Blood,
                            DeathMagic _ => MagicPath.Death,
                            EarthMagic _ => MagicPath.Earth,
                            FireMagic _ => MagicPath.Fire,
                            HolyMagic _ => MagicPath.Holy,
                            NatureMagic _ => MagicPath.Nature,
                            WaterMagic _ => MagicPath.Water,
                            _ => throw new ArgumentOutOfRangeException(nameof(magic))
                        };
                        var magicOverride = new MagicOverride(path, magic.MagicLevel);
                        commander.MagicOverrides.Add(magicOverride);
                        break;

                    case ClearMagic _:
                        //TODO
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(ownedByCommander));
                    }
                }
            }

            return(provinces);
        }
Ejemplo n.º 29
0
 public bool DoWeHaveTheseTroops(Troops otherTroops)
 {
     return(spears >= otherTroops.spears && swords >= otherTroops.swords && axes >= otherTroops.axes && archers >= otherTroops.archers && cats >= otherTroops.cats && rams >= otherTroops.rams && scouts >= otherTroops.scouts && lc >= otherTroops.lc && hc >= otherTroops.hc && ma >= otherTroops.ma && nobles >= otherTroops.nobles);
 }
Ejemplo n.º 30
0
 /// <summary>
 /// Game Turn
 ///     One game turn is computed as follows:
 ///          Move existing troops and bombs
 ///          Execute user orders
 ///          Produce new cyborgs in all factories
 ///          Solve battles
 ///          Make the bombs explode
 ///          Check end conditions
 /// </summary>
 public void DoNextMove()
 {
     foreach (var factory in Factories.Where(x => x.Side != Side.Neutral))
     {
         if (factory.InactivityDaysLeft <= 0)
         {
             factory.TroopsCount += factory.Income;
         }
         else
         {
             factory.InactivityDaysLeft--;
         }
     }
     foreach (var troop in Troops)
     {
         troop.Remaining--;
     }
     foreach (var bomb in Bombs)
     {
         bomb.Remaining--;
     }
     //Solve battles
     foreach (var troopGroup in Troops.Where(x => x.Remaining == 0).GroupBy(x => x.Dst))
     {
         var factory        = Factories[troopGroup.First().Dst];
         int troopToFactory =
             troopGroup.Where(x => x.Side == Side.MyOwn).Sum(x => x.Size) -
             troopGroup.Where(x => x.Side == Side.Enemy).Sum(x => x.Size);
         if (troopToFactory == 0)
         {
             continue;
         }
         Side troopRestSide = troopToFactory > 0 ? Side.MyOwn : Side.Enemy;
         troopToFactory = Math.Abs(troopToFactory);
         var sign = 1;
         //            if (factory.Side == Side.Neutral  ? troopRestSide == Side.Enemy : (factory.Side != troopRestSide))
         if (factory.Side != troopRestSide)
         {
             sign = -1;
         }
         factory.TroopsCount += troopToFactory * sign;
         if (factory.TroopsCount < 0)
         {
             factory.Side        = troopRestSide;
             factory.TroopsCount = Math.Abs(factory.TroopsCount);
         }
     }
     //Bomb explode
     foreach (var bomb in Bombs.Where(x => x.Remaining == 0))
     {
         var factory = Factories[bomb.Dst];
         factory.TroopsCount -= Math.Max(10, factory.TroopsCount / 2);
     }
     Bombs.RemoveAll(bomb => {
         if (bomb.Remaining > 0)
         {
             return(false);
         }
         var factory                = Factories[bomb.Dst];
         factory.TroopsCount       -= Math.Min(factory.TroopsCount, Math.Max(10, factory.TroopsCount / 2));
         factory.InactivityDaysLeft = Constants.BOMB_EXPLODE_DURATION;
         return(true);
     });
     //
     Troops = Troops.Where(x => x.Remaining > 0).ToList();
     CurrentGameTick++;
     //        foreach (var factory in Factories) {
     //            if (factory.Side == Side.Neutral) {
     //                if (factory.TroopsCount != 0)
     //                    factory.Side = factory.TroopsCount > 0 ? Side.MyOwn : Side.Enemy;
     //            }
     //            else if (factory.TroopsCount < 0)
     //                factory.Side = factory.Side == Side.Enemy ? Side.MyOwn : Side.Enemy;
     //        }
 }