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); } } } } }
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()); }
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); } } } }
public ITroopStub CreateTroopStub() { var stub = troopStubFactory.CreateTroopStub((byte)Troops.IdGen.GetNext()); Troops.Add(stub); return(stub); }
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"; } }
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(); } }
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(); } }
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 )); }
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); }
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 }); }
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; // } }
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); } }
public void Dead() { Troops troop = GetComponentInParent <Troops>(); if (troop) { troop.TroopsDead(); } if (!transform.CompareTag("Egon")) { Destroy(this.gameObject); } }
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); } }
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); }
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); } }
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); } }
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"); } }
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); }
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; } }
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); } } }
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"; }
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, });
public Context(Troops troop) { this.troop = troop; }
internal void RemoveTroop(MBGUID troopId) { Troops.Remove(Troops.Find(t => t.CharacterObject.Id == troopId)); }
public int GetTroopSteps() { return(Troops.Any() ? Troops.Max(x => x.Remaining) : 0); }
public void ClearMovedEntities() { Troops.Clear(); }
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); }
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); }
/// <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; // } }