Mirroar/hivemind

View on GitHub
src/process/creeps.ts

Summary

Maintainability
A
0 mins
Test Coverage
import container from 'utils/container';
import CreepManager from 'creep-manager';
import hivemind from 'hivemind';
import Process from 'process/process';
import TrafficManager from 'creep/traffic-manager';
import utilities from 'utilities';

import brawlerRole from 'role/brawler';
import builderRole from 'role/builder';
import claimerRole from 'role/claimer';
import depositHarvesterRole from 'role/harvester.deposit';
import dismantlerRole from 'role/dismantler';
import guardianRole from 'role/guardian';
import harvesterRole from 'role/harvester';
import helperRole from 'role/helper';
import mineBuilderRole from 'role/builder.mines';
import muleRole from 'role/mule';
import poweHarvesterRole from 'role/power/harvester';
import powerHaulerRole from 'role/power/hauler';
import relayHaulerRole from 'role/hauler.relay';
import remoteBuilderRole from 'role/builder.remote';
import remoteHarvesterRole from 'role/harvester.remote';
import scoutRole from 'role/scout';
import skKillerRole from 'role/sk-killer';
import transporterRole from 'role/transporter';
import unassignedRole from 'role/unassigned';
import upgraderRole from 'role/upgrader';

// Power creep roles.
import OperatorRole from 'role/power-creep/operator';

// Normal creep roles.
const creepRoles = {
    brawler: brawlerRole,
    builder: builderRole,
    'builder.mines': mineBuilderRole,
    'builder.remote': remoteBuilderRole,
    claimer: claimerRole,
    dismantler: dismantlerRole,
    guardian: guardianRole,
    harvester: harvesterRole,
    'harvester.deposit': depositHarvesterRole,
    'harvester.power': poweHarvesterRole,
    'harvester.remote': remoteHarvesterRole,
    'hauler.power': powerHaulerRole,
    'hauler.relay': relayHaulerRole,
    helper: helperRole,
    mule: muleRole,
    scout: scoutRole,
    skKiller: skKillerRole,
    transporter: transporterRole,
    unassigned: unassignedRole,
    upgrader: upgraderRole,
};

export default class CreepsProcess extends Process {
    creepManager: CreepManager;
    powerCreepManager: CreepManager;
    trafficManager: TrafficManager;

    /**
     * Runs logic for all creeps and power creeps.
     * @constructor
     *
     * @param {object} parameters
     *   Options on how to run this process.
     */
    constructor(parameters: ProcessParameters) {
        super(parameters);

        this.creepManager = new CreepManager();
        for (const roleName in creepRoles) {
            const RoleClass = creepRoles[roleName];
            this.creepManager.registerCreepRole(roleName, new RoleClass());
        }

        this.powerCreepManager = new CreepManager();
        this.powerCreepManager.registerCreepRole('operator', new OperatorRole());

        this.trafficManager = container.get('TrafficManager');
    }

    /**
     * Runs logic for all creeps.
     */
    run() {
        // Run normal creeps.
        this.creepManager.onTickStart();
        _.each(Game.creepsByRole, (creeps, role) => {
            hivemind.runSubProcess('creeps_' + role, () => {
                utilities.bubbleWrap(() => {
                    this.creepManager.manageCreeps(creeps);
                });
            });
        });
        this.creepManager.report();

        // Run power creeps.
        const powerCreeps = _.filter(Game.powerCreeps, creep => (creep.ticksToLive || 0) > 0);
        this.powerCreepManager.onTickStart();
        utilities.bubbleWrap(() => {
            this.powerCreepManager.manageCreeps(powerCreeps);
        });
        this.powerCreepManager.report();

        // Resolve traffic jams.
        this.trafficManager.manageTraffic();
    }
}