2016-11-15 6 views
2

Ich habe ein bisschen von meiner Rolle.builders.js Datei geändert, um meine Creeps zuerst überprüfen zu sehen, ob der Spawn Energie hat, wenn es nicht geht Ernteenergie zu bauen, sonst bekomme es von der laichen. Hier ist, was ich habe:Screeps Builders Keine Energie sammeln

var roleBuilder = { 

    /** @param {Creep} creep **/ 
    run: function(creep) { 

     if(creep.memory.building && creep.carry.energy == 0) { 
      creep.memory.building = false; 
      creep.say('harvesting'); 
     } 
     if(!creep.memory.building && creep.carry.energy == creep.carryCapacity) { 
      creep.memory.building = true; 
      creep.say('building'); 
     } 

     if(creep.memory.building) { 
      var targets = creep.room.find(FIND_CONSTRUCTION_SITES); 
      if(targets.length) { 
       if(creep.build(targets[0]) == ERR_NOT_IN_RANGE) { 
        creep.moveTo(targets[0]); 
       } 
      } 
     } 
     else 
     { 
      if(!Game.spawns['MySpawn'].energy) 
      { 
       var sources = creep.room.find(FIND_SOURCES); 
       if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) 
       { 
        creep.moveTo(sources[0]); 
       } 
      } 
      else 
      { 
       if(creep.withdraw(Game.spawns['MySpawn'],RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) 
       { 
        creep.moveTo(Game.spawns['MySpawn']); 
       } 
      } 
     } 
    } 
}; 

module.exports = roleBuilder; 

Irgendwelche Vorschläge, was ich vermisse? Die Erbauer sind an Ort und Stelle eingefroren, obwohl sie sagen, dass sie zum Spawn ziehen.

+1

Ok, also habe ich meinen Fix gefunden: '\t var spns = creep.room.find (FIND_MY_SPAWNS); \t if (creep.withdraw (SPN [0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) \t { \t creep.moveTo (SPN [0]); \t} \t sonst \t { \t creep.withdraw (SPN [0], RESOURCE_ENERGY); \t} ' – user1971240

Antwort

2

Wie Sie bereits bemerkt haben, funktioniert so etwas besser, wenn Sie eine voreingestellte Variable dafür verwenden.
Der Vollständigkeit halber wiederhole ich Ihre Lösung. Aber Sie brauchen nicht die else Teil:

var spns = creep.room.find(FIND_MY_SPAWNS); 
if(creep.withdraw(spns[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { 
    creep.moveTo(spns[0]); 
} 

Wenn Sie Ihre Bauherren nur eine bestimmte Laich zu verwenden, können Sie auch für die die ID verwenden:

var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23"); 
if(creep.withdraw(spwn, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) { 
    creep.moveTo(spwn); 
} 

Aber irgendwie Es gibt noch eine Sache, die ich in deinem Code bemerkt habe! Du sagst deinen Erbauern, dass sie zum Bergbau gehen sollen, wenn es momentan NO Energie im Spawn gibt.

if(!Game.spawns['MySpawn'].energy) { ... } 

Das Problem dabei ist, gibt es fast immer etwas Energie drin sein, denn solange Sie unter 300 Energie insgesamt sind, Ihre Laich 1 Energie tick jede einzelne erzeugt! Also werden eure Erbauer höchstens ein Tick ernten und dann werden sie umkehren, um es vom Spawn zu holen - weil dort jetzt mindestens 1 Energie ist.
Das nächste Problem dabei ist, dass du ein Problem hast, bei dem du keine neuen Creeps bauen kannst, weil deine Erbauer immer deine ganze Energie abholen, bevor man sie hervorbringen kann!

für beide Probleme zu kompensieren, versuchen, etwas wie folgt aus:

var spwn = Game.getObjectById("42ef9e3288f108fe6e60ef23"); 
var secureEnergy = 300; 
if(spwn.energy > secureEnergy) { ... } 

die secureEnergy auf einen höheren Betrag setzen als das durchschnittliche Kriechen muss hervorgebracht werden (zumindest höher ist als Ihre wichtigste Mähdrescher kriecht brauchen!). Zum Beispiel braucht ein Grundstein [WORK,CARRY,MOVE] 250 Energie und dein Erbauer kann 50 Energie tragen, also möchtest du vielleicht, dass dein Erbauer nur seine 50 Energie zurückzieht, wenn es mindestens 300 secureEnergy im Spawn gibt. Auf diese Weise können Sie immer einen neuen Creep erzeugen. Macht das für Sie einen Sinn?

Ich hoffe ich konnte dir ein bisschen helfen ... und viel Spaß in Screeps! ;)

Verwandte Themen