Mirroar/hivemind

View on GitHub
src/dispatcher/resource-destination/structure.ts

Summary

Maintainability
C
1 day
Test Coverage
import TaskProvider from 'dispatcher/task-provider';

declare global {
    interface StructureDestinationTask extends ResourceDestinationTask {
        target: Id<AnyStoreStructure>;
    }
}

export default class StructureDestination<TaskType extends StructureDestinationTask> extends TaskProvider<TaskType, ResourceDestinationContext> {
    constructor(readonly room: Room) {
        super();
    }

    getType() {
        return 'structure';
    }

    getHighestPriority() {
        return 0;
    }

    getTasks(context?: ResourceDestinationContext) {
        return [];
    }

    isValid(task: TaskType, context: ResourceDestinationContext) {
        const structure = Game.getObjectById(task.target);
        if (!structure) return false;
        if (!structure.isOperational()) return false;
        if (context.creep.memory.singleRoom && structure.pos.roomName !== context.creep.memory.singleRoom) return false;
        if (structure.store.getFreeCapacity(task.resourceType) === 0) return false;
        if (context.creep.store.getUsedCapacity(task.resourceType) === 0) return false;

        return true;
    }

    execute(task: TaskType, context: ResourceDestinationContext) {
        const creep = context.creep;
        const target = Game.getObjectById(task.target);

        creep.whenInRange(1, target, () => {
            if (task.amount) {
                creep.transfer(target, task.resourceType, Math.min(task.amount, creep.store.getUsedCapacity(task.resourceType), target.store.getFreeCapacity(task.resourceType)));
            }
            else {
                creep.transfer(target, task.resourceType);
            }

            delete creep.memory.order;
        });
    }
}