public void CalcTurnResources() { // Get resources from region list ItemArrayList res = new ItemArrayList(); foreach (Item itm in Resources) { res.Add(new Item(itm.Type, itm.Amount)); } // Apply temperature factor int tempr = this.Temperature; for (int i = res.Count - 1; i >= 0; i--) { Item itm = res[i]; int danger = (itm.Type.TemperatureFrom - tempr) * itm.Type.TemperatureEffect; if (danger > 0) { int died = itm.Amount * Math.Min(100, danger) / 100; res.RemoveItems(itm.Type, died); } } // Add resources added by production buildings foreach (Building b in Buildings) { if (b.Type.Resource != null && b.IsComplete) { res.AddItems(b.Type.Resource.Type, b.Type.Resource.Amount); } } // Apply radiation factor int radiation = this.Radiation; for (int i = res.Count - 1; i >= 0; i--) { Item itm = res[i]; int danger = (radiation - itm.Type.RadiationTo) * itm.Type.RadiationEffect; if (danger > 0) { // Mutate some resource int amt = itm.Amount * Math.Min(100, danger) / 100; res.RemoveItems(itm.Type, amt); int amt_mutated = amt * itm.Type.MutatePercent / 100; if (itm.Type.MutateTo != null && amt_mutated > 0) { res.AddItems(itm.Type.MutateTo, amt_mutated); } } } TurnResources = res; }
public void AddItems(ItemType it, int amount) { Items.AddItems(it, amount); if (Faction != null) { Faction.ShowItem(it); } }
public void CalcTurnJunk() { // Add new junk // Get dying resources from region list ItemArrayList res = new ItemArrayList(); foreach (Item itm in Resources) { if (itm.Type.Dead != null) { res.Add(new Item(itm.Type, itm.Amount)); } } // Apply temperature factor int tempr = this.Temperature; for (int i = res.Count - 1; i >= 0; i--) { Item itm = res[i]; int danger = (itm.Type.TemperatureFrom - tempr) * itm.Type.TemperatureEffect; if (danger > 0) { int died = itm.Amount * Math.Min(100, danger) / 100; res.RemoveItems(itm.Type, died); Junk.AddItems(itm.Type.Dead, died); } } // Add resources added by production buildings foreach (Building b in Buildings) { if (b.Type.Resource != null && b.Type.Resource.Type.Dead != null && b.IsComplete) { res.AddItems(b.Type.Resource.Type, b.Type.Resource.Amount); } } // Apply radiation factor int radiation = this.Radiation; for (int i = res.Count - 1; i >= 0; i--) { Item itm = res[i]; int danger = Math.Max(radiation - itm.Type.RadiationTo, itm.Type.RadiationFrom - radiation) * itm.Type.RadiationEffect; if (danger > 0) { int amt = itm.Amount * Math.Min(100, danger) / 100; int amt_mutated = amt * itm.Type.MutatePercent / 100; int amt_dead = amt - amt_mutated; if (amt_dead > 0) { Junk.AddItems(itm.Type.Dead, amt_dead); } } } // Decompose junk for (int i = Junk.Count - 1; i >= 0; i--) { Item itm = Junk[i]; if (itm.Type.DecomposeChance > 0) { int decomposed = itm.Amount * itm.Type.DecomposeChance / 100; if (decomposed == 0 && Constants.Random(100) < itm.Type.DecomposeChance * itm.Amount) { decomposed = 1; } Junk.RemoveItems(itm.Type, decomposed); } } }
private void MoveSoldier(Soldier s, int round) { if (s.Weapon == null || s.SkillLevel == 0 || s.Person.Avoiding) { s.Flee = true; } if (s.Flee) { OOASoldier(s); s.FleedAway = true; BattleReport.Add(String.Format("{0} ran away from combat.|{1} убегает из боя.", s.Person.ToString(Lang.En), s.Person.ToString(Lang.Ru))); return; } // First turn is for ranged weapon only if shooters on field if (round == 1 && ShootersPresent() && !s.Weapon.Ranged) { return; } for (int i = 0; i < s.Weapon.Attacks; i++) { if (OutOfAmmo(s)) { break; } for (int j = 0; j < s.Weapon.Targets; j++) { MakeHit(s); if (BattleEnded()) { break; } } if (s.Ammo > 0) { s.Ammo--; } if (s.Weapon.Ammo != null) { if (s.Weapon.Ammo.Case != null) { Spoils.AddItems(s.Weapon.Ammo.Case, 1); } s.Person.Items.RemoveItems(s.Weapon.Ammo, 1); } if (OutOfAmmo(s)) { break; } if (BattleEnded()) { break; } } }