私はあなたがそうのような近くの情報源を確認するためにあなたの最初のフィルタを更新することができると思います。
let containers = creep.room.find(FIND_STRUCTURES, {
filter: (s) => s.structureType === STRUCTURE_CONTAINER && s.pos.findInRange(FIND_SOURCES, 2).length === 0
});
(または非常に遠く離れて)私は範囲のために2を使用しますが、あなたのコンテナは常にあなたの源に隣接している場合それを1に変更することができます。
その結果をMemoryに保存すると、CPUを節約できます。あなたはそれをする方法を知りたいなら、私はより多くの情報を与えることができます。
EDIT:キャッシングのために、あなたは(この上で行われ、いくつかのデバッグを必要とするかもしれない - 私はそれを書いたが、それをテストしていない)、このようなルームオブジェクトのプロパティを作成することができます。
Object.defineProperty(Room.prototype, 'nonSourceContainers', {
get: function() {
if (this === Room.prototype || this === undefined) return undefined;
const room = this;
// If any containers have been constructed that don't have isNearSource defined, fix that first.
let newContainers = room.find(FIND_STRUCTURES, {
filter: (s) => s.structureType === STRUCTURE_CONTAINER && s.memory.isNearSource === undefined
});
// Found some new containers?
if (newContainers.length) {
for (let i = 0; i < newContainers.length; ++i) {
newContainers[i].memory.isNearSource = newContainers[i].pos.findInRange(FIND_SOURCES, 2).length > 0;
}
// Set the list of non-source container ids in the room's memory. This lasts forever.
room.memory.nonSourceContainerIds = room.find(FIND_STRUCTURES, {filter: {isNearSource: false}});
// Reset the cached set of containers.
room._nonSourceContainers = undefined;
}
// If there is no cached list, create it. Caching will mean the following runs once per tick or less.
if (!room._nonSourceContainers) {
if (!room.memory.nonSourceContainerIds) {
room.memory.nonSourceContainerIds = [];
}
// Get the containers by their ids.
room._nonSourceContainers = room.memory.nonSourceContainerIds.map(id => Game.getObjectById(id));
}
return room._nonSourceContainers;
},
enumerable: false,
configurable: true
});
これは素晴らしいです - 私はメモリを考えていましたが、フィルタを操作していて、メモリを保存するためのdocs.screepsの例を使用するつもりでしたが、それは私が信じているすべてのダミーを実行するでしょうか? (編集:私は終わっていないし、新しい行を開始したい:() – Bergzwerg
申し訳ありません - プログラミングに新しい - これは新しいプロトタイプになるのですか?メモリはまだ関連していますが、基本的なスポーン動作は – Bergzwerg
@Bergzwergこれはあなたがデバッグして修正する必要があるかもしれないので、後で元に戻したいことかもしれません。 *クリーププロトタイプの*メインコードで "必要"となるjsファイルに置くことができます。そうすれば、creep.room.nonSourceContainersのように参照することができます。 – jfren484