チュートリアル「Store and transfer」(その5)でエネルギーの貯蔵と転送についての説明がありましたが、今回のチュートリアルではエネルギーの採掘(摂取)についてです。
チュートリアルの全記事は以下になります。
- Loop and import(ループとインポート)
- Simple move(単純な移動)
- First attack(初めての攻撃)
- Creeps bodies(クリープの各パーツ)
- Store and transfer(エネルギーのストアと転送)
- Terrain(地形)
- Spawn creeps(クリープを生成)
- Harvest energy(エネルギーの採取)
- Construction(工事・建築)
- Final test(最終試験)
Harvest energy(エネルギーの収穫)
エネルギー資源はさまざまな形で利用できます。コンテナに保管できますが、Sources
(ソース・資源)から収穫することもできます。クリープにWORK
ボディパーツがある場合、Harvest()
メソッドを使用してソース(資源)からエネルギーを抽出できます。
creep.harvest(source);
このアクションを呼び出すには、クリープをソースの近くに配置する必要があります(著者注:サンプルコードを読む限りではERR_NOT_IN_RANGE
で判別するみたいです)。 WORK
ボディパーツが多いほど、ティック(著者注:loop()
内の実行数、ターン数?のことをこのゲームではティックと呼んでいます)ごとにソースから抽出できるエネルギー量が多くなります。ソース内のエネルギーの蓄えは無限であり、労働者のクリープが可能な限り抽出することができます。
目的:1000のエネルギーを収穫してスポーンに転送します
サンプルコード
import { prototypes, utils, constants } from '/game';
export function loop() {
var creep = utils.getObjectsByPrototype(prototypes.Creep).find(i => i.my);
var source = utils.getObjectsByPrototype(prototypes.Source)[0];
var spawn = utils.getObjectsByPrototype(prototypes.StructureSpawn).find(i => i.my);
if(creep.store.getFreeCapacity(constants.RESOURCE_ENERGY)) {
if(creep.harvest(source) == constants.ERR_NOT_IN_RANGE) {
creep.moveTo(source);
}
} else {
if(creep.transfer(spawn, constants.RESOURCE_ENERGY) == constants.ERR_NOT_IN_RANGE) {
creep.moveTo(spawn);
}
}
}
まとめ
ちょっとサンプルコードがややこしいかもしれませんが、落ち着いて一行一行見ればそんなに難しくはないはずです。
creep.store.getFreeCapacity(constants.RESOURCE_ENERGY)
が0より多ければ(trueであれば)、harvest()
でエネルギーを抽出し、0以下であれば(falseであれば)transfer()
でエネルギーを転送していますね。さらにその中のif文では、ERR_NOT_IN_RANGE
で近くに対象があるか判別して、なければmoveTo()
で近づくという処理をしているようです。