Example #1
0
        // 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);
            }
        }