// Called by the host's player creation code public void Activate(Player p) { Player = p; IsEnabled = true; playerPower = p.PlayerActor.TraitOrDefault <PowerManager>(); playerResource = p.PlayerActor.Trait <PlayerResources>(); harvManager = new AIHarvesterManager(this, p); supportPowerManager = new AISupportPowerManager(this, p); foreach (var building in Info.BuildingQueues) { builders.Add(new BaseBuilder(this, building, p, playerPower, playerResource)); } foreach (var defense in Info.DefenseQueues) { builders.Add(new BaseBuilder(this, defense, p, playerPower, playerResource)); } Random = new MersenneTwister(Game.CosmeticRandom.Next()); // Avoid all AIs trying to rush in the same tick, randomize their initial rush a little. var smallFractionOfRushInterval = Info.RushInterval / 20; rushTicks = Random.Next(Info.RushInterval - smallFractionOfRushInterval, Info.RushInterval + smallFractionOfRushInterval); // Avoid all AIs reevaluating assignments on the same tick, randomize their initial evaluation delay. assignRolesTicks = Random.Next(0, Info.AssignRolesInterval); attackForceTicks = Random.Next(0, Info.AttackForceInterval); minAttackForceDelayTicks = Random.Next(0, Info.MinimumAttackForceDelay); minCaptureDelayTicks = Random.Next(0, Info.MinimumCaptureDelay); var tileset = World.Map.Rules.TileSet; resourceTypeIndices = new BitArray(tileset.TerrainInfo.Length); // Big enough foreach (var t in Map.Rules.Actors["world"].TraitInfos <ResourceTypeInfo>()) { resourceTypeIndices.Set(tileset.GetTerrainIndex(t.TerrainType), true); } }