user3220962
user3220962

Reputation: 371

Screeps access 'main' variable from another file?

in the game screeps i try to call an variable from another file. Thats my main file:

var roleHarvester = require('role.harvester');
var roleUpgrader = require('role.upgrader');
var roleBuilder = require('role.builder');
var roleVoyager = require('role.voyager');
var roleAttacker = require('role.attacker');
var roleTransporter = require('role.transporter');
var roleHealer = require('role.healer');
var roleRepairer = require('role.repairer');

module.exports.loop = function () {

    for(var name in Memory.creeps) {
        if(!Game.creeps[name]) {
            delete Memory.creeps[name];
            console.log('Clearing non-existing creep memory:', name);
        }
    }

    var harvesters = _.filter(Game.creeps, (creep) => creep.memory.role == 'harvester');
    console.log('Harvesters: ' + harvesters.length);

    var upgraders = _.filter(Game.creeps, (creep) => creep.memory.role == 'upgrader');
    console.log('Upgraders: ' + upgraders.length);

    var builders = _.filter(Game.creeps, (creep) => creep.memory.role == 'builder');
    console.log('Builders: ' + builders.length);

    var voyagers = _.filter(Game.creeps, (creep) => creep.memory.role == 'voyager');
    console.log('Voyagers: ' + voyagers.length);

    var attackers = _.filter(Game.creeps, (creep) => creep.memory.role == 'attacker');
    console.log('Attackers: ' + attackers.length);

    var transporters = _.filter(Game.creeps, (creep) => creep.memory.role == 'transporter');
    console.log('Transporters: ' + transporters.length);

    var healers = _.filter(Game.creeps, (creep) => creep.memory.role == 'healer');
    console.log('Healers: ' + healers.length);

    var repairers = _.filter(Game.creeps, (creep) => creep.memory.role == 'repairer');
    console.log('Repairers: ' + repairers.length);


    if(harvesters.length < 3) {
        var newName = Game.spawns['SpawnZone'].createCreep([WORK,WORK,CARRY,CARRY,CARRY,CARRY,MOVE],  creepName = Creep.getRandomName("[Harvester]"), {role: 'harvester'});
        console.log('Spawning new harvester: ' + newName);
    }

    if(upgraders.length < 3 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([WORK,CARRY,CARRY,CARRY,MOVE,MOVE], creepName = Creep.getRandomName("[Upgrader]"), {role: 'upgrader'});
        console.log('Spawning new upgrader: ' + newName);
    }

    if(builders.length < 2 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([WORK,CARRY,CARRY,MOVE,MOVE], creepName = Creep.getRandomName("[Builder]"), {role: 'builder'});
        console.log('Spawning new builder: ' + newName);
    }

    if(voyagers.length < 0 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([MOVE], creepName = Creep.getRandomName("[Voyager]"), {role: 'voyager'});
        console.log('Spawning new voyager: ' + newName);
    }

    if(attackers.length < 0 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([ATTACK,ATTACK,MOVE], creepName = Creep.getRandomName("[Attacker]"), {role: 'attacker'});
        console.log('Spawning new Attacker: ' + newName);
    }

    if(transporters.length < 0 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([WORK,CARRY,MOVE], creepName = Creep.getRandomName("[Transporter]"), {role: 'transporter'});
        console.log('Spawning new Transporter: ' + newName);
    }

    if(healers.length < 0 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([HEAL,MOVE,MOVE], creepName = Creep.getRandomName("[Healer]"), {role: 'healer'});
        console.log('Spawning new Healer: ' + newName);
    }

    if(repairers.length < 0 && harvesters.length > 2) {
        var newName = Game.spawns['SpawnZone'].createCreep([CARRY,CARRY,WORK,MOVE,MOVE], creepName = Creep.getRandomName("[Repairer]"), {role: 'repairer'});
        console.log('Spawning new Repairer: ' + newName);
    }




    for(var name in Game.creeps) {
        var creep = Game.creeps[name];
        if(creep.memory.role == 'harvester') { roleHarvester.run(creep); }
        if(creep.memory.role == 'upgrader') { roleUpgrader.run(creep); }
        if(creep.memory.role == 'builder') { roleBuilder.run(creep); }
        if(creep.memory.role == 'voyager') { roleVoyager.run(creep); }
        if(creep.memory.role == 'attacker') { roleAttacker.run(creep); }
        if(creep.memory.role == 'transporter') { roleTransporter.run(creep); }
        if(creep.memory.role == 'healer') { roleHealer.run(creep); }
        if(creep.memory.role == 'repairer') { roleRepairer.run(creep); }
    }
}

Now from my role.builder file i try to write an IF-Else statement that has to check a variable from the main:

if (main.harvesters.length > 2){...}

But i get the error 'main os not defined' How do i call te main file otherwise?

Upvotes: 0

Views: 588

Answers (2)

Toolmaker
Toolmaker

Reputation: 564

What you're trying to do is highly inefficient: You iterate over the Game.creeps collection multiple times (I counted 8 times at least). If you wish to count creeps in roles I suggest you use

var groups = _.groupBy(Game.creeps, (c) => { return c.memory.role; });

This will return an object with each role as a key with behind the key a collection of all creeps in that specific role:

{
    harvester: [Creep, Creep, Creep],
    builder: [Creep],
    upgrader: [Creep, Creep, Creep]
}

I suppose you would want to have this information on a per room basis instead of globally, since a low level room should behave differently than a high level room(in the sense that higher level rooms probably have less creeps).

No idea about the lifetime of Game objects, but if you loop over Game.rooms in the beginning of your creep update routine, like below, you would have this information immediately available when needed and only need to loop through it once:

for (var name in Game.rooms) {
    var room = Game.rooms[name];
    room.roles = _.groupBy(room.find(FIND_MY_CREEPS), (c) => { return c.memory.role; });
}

Upvotes: 3

user3220962
user3220962

Reputation: 371

Found it out myself just now. If i make something liek this:

var count = _.filter(Game.creeps, (creep) => creep.memory.role == 'harvester');

I can make an if-else easily with the 'count.length' var :)

Upvotes: 0

Related Questions