private void OrderSpawnLiceArmies_TicketRaised(object sender, TicketRaisedEventArgs args) { if (args.Result != PostOrderResponse.Processed) { return; } OrderSpawnArmies orderSpawnArmies = (OrderSpawnArmies)args.Order; this.liceArmies.UnionWith(orderSpawnArmies.ArmiesGUIDs); this.liceArmiesCache = null; global::Game game = this.gameService.Game as global::Game; this.lastLiceArmySpawnTurn = game.Turn; }
protected void SpawnArmies(QuestBehaviour questBehaviour) { if (!string.IsNullOrEmpty(this.ArmyDroplist)) { IGameService service = Services.GetService <IGameService>(); if (service == null || service.Game == null) { Diagnostics.LogError("Failed to retrieve the game service."); return; } global::Game game = service.Game as global::Game; if (game == null) { Diagnostics.LogError("Failed to cast gameService.Game to Game."); return; } IDatabase <Droplist> database = Databases.GetDatabase <Droplist>(false); if (database == null) { return; } string armyDroplist = this.ArmyDroplist; Droplist droplist; if (!database.TryGetValue(armyDroplist, out droplist)) { Diagnostics.LogError("Cannot retrieve drop list '{0}' in quest definition '{1}'", new object[] { armyDroplist, questBehaviour.Quest.QuestDefinition.Name }); return; } global::Empire empire = this.EmpireArmyOwner; if (empire == null || empire is LesserEmpire || this.UseBehaviorInitiatorEmpire) { empire = questBehaviour.Initiator; } if (this.UseBehaviorInitiatorEmpire) { this.EmpireArmyOwner = questBehaviour.Initiator; } if (this.EmpireArmyOwner is MajorEmpire && (this.EmpireArmyOwner as MajorEmpire).ELCPIsEliminated) { return; } Droplist droplist2; DroppableArmyDefinition droppableArmyDefinition = droplist.Pick(empire, out droplist2, new object[0]) as DroppableArmyDefinition; if (droppableArmyDefinition != null) { int num = 0; IDatabase <AnimationCurve> database2 = Databases.GetDatabase <AnimationCurve>(false); AnimationCurve animationCurve; if (database2 != null && database2.TryGetValue(QuestBehaviourTreeNode_Action_SpawnArmies.questUnitLevelEvolution, out animationCurve)) { float propertyValue = questBehaviour.Initiator.GetPropertyValue(SimulationProperties.GameSpeedMultiplier); num = (int)animationCurve.EvaluateWithScaledAxis((float)game.Turn, propertyValue, 1f); num = Math.Max(0, Math.Min(100, num)); } StaticString[] unitDesignsNames = Array.ConvertAll <string, StaticString>(droppableArmyDefinition.UnitDesigns, (string input) => input); StaticString[] armyTags = new StaticString[] { this.ArmyTag }; StaticString[] unitsTags = new StaticString[] { this.ArmyUnitTag }; int val = 1; if (this.ScaleWithMaxEra) { val = DepartmentOfScience.GetMaxEraNumber() - 1; } num = Math.Max(num, val); OrderSpawnArmies orderSpawnArmies = new OrderSpawnArmies(this.EmpireArmyOwner.Index, this.SpawnLocations.ToList <WorldPosition>().ToArray(), unitDesignsNames, 1, armyTags, unitsTags, num, QuestArmyObjective.QuestBehaviourType.Roaming); Diagnostics.Log("Posting order: {0}.", new object[] { orderSpawnArmies.ToString() }); this.EmpireArmyOwner.PlayerControllers.Server.PostOrder(orderSpawnArmies); } } }
private void Server_TurnBegin_CheckLiceArmySpawn() { global::Game game = this.gameService.Game as global::Game; Diagnostics.Assert(game != null); ISessionService service = Services.GetService <ISessionService>(); Diagnostics.Assert(service != null); global::Session session = service.Session as global::Session; Diagnostics.Assert(session != null); KaijuCouncil.WildLiceArmyPreferences.LoadRegistryValues(session); if (this.LiceArmies.Length >= KaijuCouncil.WildLiceArmyPreferences.MaxArmiesAlive) { return; } int turn = game.Turn; int num = (int)Math.Ceiling((double)((float)KaijuCouncil.WildLiceArmyPreferences.SpawningCooldown * base.Empire.GetPropertyValue(SimulationProperties.GameSpeedMultiplier))); if (turn < this.lastLiceArmySpawnTurn + num) { return; } int num2 = this.Kaiju.OnGarrisonMode() ? KaijuCouncil.WildLiceArmyPreferences.ArmiesToSpawnCount : 0; if (num2 <= 0) { return; } List <WorldPosition> list = new List <WorldPosition>(); for (int i = 0; i < this.Kaiju.Region.WorldPositions.Length; i++) { WorldPosition worldPosition = this.Kaiju.Region.WorldPositions[i]; if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(worldPosition, PathfindingMovementCapacity.Ground) && worldPosition != this.Kaiju.WorldPosition) { list.Add(worldPosition); } } if (list.Count == 0) { return; } System.Random randomizer = new System.Random(World.Seed + turn); list = (from position in list orderby this.worldPositionningService.GetDistance(this.Kaiju.WorldPosition, position), randomizer.NextDouble() select position).ToList <WorldPosition>(); WorldPosition[] worldPositions; if (list.Count > num2) { worldPositions = list.Take(Math.Min(list.Count, num2)).ToArray <WorldPosition>(); } else { worldPositions = list.ToArray(); } List <StaticString> list2 = new List <StaticString>(); StaticString name = this.KaijuEmpire.FindLiceDesign(true).Name; int unitsPerArmy = KaijuCouncil.WildLiceArmyPreferences.UnitsPerArmy; for (int j = 0; j < unitsPerArmy; j++) { list2.Add(name); } List <StaticString> list3 = new List <StaticString>(); list3.Add(KaijuCouncil.WildLiceArmyPreferences.ArmyTag); List <StaticString> list4 = new List <StaticString>(); list4.Add(KaijuCouncil.WildLiceArmyPreferences.UnitTag); List <MajorEmpire> list5 = new List <MajorEmpire>(); int k = 0; while (k < game.Empires.Length) { if (game.Empires[k] is MajorEmpire && !(game.Empires[k] as MajorEmpire).ELCPIsEliminated) { if (game.Empires[k].GetAgency <DepartmentOfTheInterior>().NonInfectedCities.Count > 0) { list5.Add(game.Empires[k] as MajorEmpire); break; } break; } else { k++; } } DepartmentOfTheInterior agency = list5[game.Turn % list5.Count].GetAgency <DepartmentOfTheInterior>(); MinorEmpire minorEmpire = agency.Cities[game.Turn % agency.Cities.Count].Region.MinorEmpire; OrderSpawnArmies order = new OrderSpawnArmies(minorEmpire.Index, worldPositions, list2.ToArray(), KaijuCouncil.WildLiceArmyPreferences.ArmiesToSpawnCount, list3.ToArray(), list4.ToArray(), Math.Max(0, DepartmentOfScience.GetMaxEraNumber()), QuestArmyObjective.QuestBehaviourType.Undefined); Ticket ticket = null; minorEmpire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderSpawnLiceArmies_TicketRaised)); }