【PCゲーム】Screeps: Arenaの遊び方(チュートリアル「Creeps bodies」)を日本語に!和訳して解説!(その4)

Screeps:Arena開始画面JavaScript

ここまでのバックナンバーは下記の記事を参照してください。

それでは、今回はCreeps bodies(機体パーツ)チュートリアルを翻訳してご紹介します。

各チュートリアルは別途記事にしてありますので、他のチュートリアルは下記を参考にしてください。

  1. Loop and import(ループとインポート)
  2. Simple move(単純な移動)
  3. First attack(初めての攻撃)
  4. Creeps bodies(クリープの各パーツ)
  5. Store and transfer(エネルギーのストアと転送)
  6. Terrain(地形)
  7. Spawn creeps(クリープを生成)
  8. Harvest energy(エネルギーの採取)
  9. Construction(工事・建築)
  10. Final test(最終試験)

Creeps bodies

さまざまなクリープ関数を呼び出すことができますが、すべてのクリープですべての関数を使用できるわけではありません。 クリープが実行できることは、クリープが持つ体の部分によって異なります。 その本体が適切であるかどうかを確認できます。配列では、各要素が特定のタイプの1つの本体部分を表します。

  • MOVE…クリープの移動を可能にします
  • ATTACK…近接範囲での攻撃を可能にします
  • RANGED_ATTACK…3タイル離れたターゲットを攻撃できるようにします
  • HEAL…それ自体または別のクリープを癒すことができます
  • WORK…労働クリープは構造物を構築したり、エネルギーを収穫したりできます
  • CARRY…リソースを運ぶクリープの能力を高めます
  • TOUGH…効果はありません
if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {
    // this creep has ATTACK body parts
}
著者
著者

some()メソッドを知らない人は調べてくださいね。配列の内容の判定に用いるJavaScriptのメソッドです。

ボディパーツごとにクリープのhits(ヒット数)が100増加します。クリープがダメージを受けると、ボディパーツもダメージを受け、パーツのヒットカウンターが0になると機能しなくなります。同じタイプのボディが多いほど強くなります。

さて、このチュートリアルのステップでは、3つの異なるクリープがあります:ATTACKRANGED_ATTACK、およびHEALパーツを使用します。 相手の行動を調整した場合にのみ、相手を倒すことができます。

これを行うには、前のチュートリアルステップと同じアプローチを使用しますが、体の部分に基づいてアクションを区別します。ダメージディーラーはさまざまな方法(attackrangedAttack)でダメージを与え、ヒーラーはダメージを受けたクリープをhealメソッドで回復する必要があります。

目的:敵のクリープを倒します。

サンプルコード

import { getObjectsByPrototype } from '/game/utils';
import { Creep } from '/game/prototypes';
import { ERR_NOT_IN_RANGE, ATTACK, RANGED_ATTACK, HEAL } from '/game/constants';

export function loop() {
    var myCreeps = getObjectsByPrototype(Creep).filter(creep => creep.my);
    var enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);

    for(var creep of myCreeps) {
        if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {
            if(creep.attack(enemyCreep) == ERR_NOT_IN_RANGE) {
                creep.moveTo(enemyCreep);
            }
        }
        if(creep.body.some(bodyPart => bodyPart.type == RANGED_ATTACK)) {
            if(creep.rangedAttack(enemyCreep) == ERR_NOT_IN_RANGE) {
                creep.moveTo(enemyCreep);
            }
        }
        if(creep.body.some(bodyPart => bodyPart.type == HEAL)) {
            var myDamagedCreeps = myCreeps.filter(i => i.hits < i.hitsMax);
            if(myDamagedCreeps.length > 0) {
                if(creep.heal(myDamagedCreeps[0]) == ERR_NOT_IN_RANGE) {
                    creep.moveTo(myDamagedCreeps[0]);
                }
            }
        }
    }
}

まとめ

  • ATTACKRANGED_ATTACKHEALなどのパーツ定数は/game/constantsからimport
  • for(var creep of myCreeps)のようにfor...of...でループさせて各機体を参照すると良い
  • パーツの判別にはsome()メソッドで判定させると良い。if(creep.body.some(bodyPart => bodyPart.type == ATTACK)) {のように、ATTCKHEALなどの役割を判別する
  • ヒーラーはmyCreeps.filter(i => i.hits < i.hitsMax)のようにダメージを受けた機体を選定して、heal()メソッドで回復。サンプルコードを見る限り、隣接していないと回復できない

creep.bodyが配列オブジェクトになるので、creep.body.some()で配列の存在をチェックするのがポイントでしょうか。some()メソッド内のbodyPart => bodyPart.type == ATTACKの形も覚えておいたほうが良さそうです。

また、ダメージを受けているかどうかにはmyCreeps.filter(i => i.hits < i.hitsMax)にあるように、hitsプロパティ、hitsMaxプロパティを用いることも重要ですね。

タイトルとURLをコピーしました