YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

Screeps: Arenaのチュートリアルをやりました。Rustでのやり方が難しいです。【JavaScript】

はじめに

www.itmedia.co.jp
Twitterでニュースが流れてきました。

Rustプログラミングで対戦ゲームができると理解して、それは面白そう!ということで手を出しました。しかし、多分現状(2022/04時点)Steam配信での環境においては、JavaScript以外はサポートされていないと思います。という記事です。
Rustでも実行はできましたが、私の能力不足で自在にRustからは遊べていません。詳細は下記ツイートスレッドを参照ください。(2022/4/23更新)

なぜJavaScript以外でも実行できると記載されたのか

JavaScriptに加え、Webブラウザ上でプログラミング言語を実行するためのフォーマット「WebAssembly」を通じてC、C++、TypeScript、Go、C#、F#、Swift、D、Pascal、Zig、Rust、Kotlinでの操作にも対応する。

文字通り「WebAssembly」を通じて操作ができるからでした。誤解失礼しました。
また、リポジトリの紹介をしていただいた、@vespidさんありがとうございました!

私の理解では、Screepsというブラウザ上でできる既存のゲームがあって、そちらでは上記の通り「WebAssembly」から多言語でもプレイできるのだと思います。Rustのリポジトリをよく見るとブラウザ上にアップロードするような形式の利用方法になっています。そして、今回のScreeps, LLCからのニュースは「このScreepsがSteam用にカスタマイズしてPvPで配信されました!」「Steam向けはScreeps: Arenaです!」という理解です。ブラウザゲーとSteam版の情報が混ざって、上記のような記載になったのかと推測します。もし、Steam版でも多言語で動かす方法があれば教えてください。

チュートリアルをやりました

結局Screeps: ArenaをRustでプレイすることはできていませんが、普通にチュートリアルをやりました。面白かったです。

1. Loop and import

このゲームの解説とログ出力のサンプルを入力します。VSCodeとか使って、フォルダが生成されているので、そこにサンプルコード入力しましょう。

2. Simple move

creepというユニットを動かします。いろいろimportしてフィールドの情報を取得して、指示する感じです。最後以外全て、Sample code見ないと実装は無理だと思いました。

3. First attack

敵creepへ攻撃します。importできる情報は結構いろいろあるようで、どういう構造、制約になっているの気になりました。マップにある情報が無条件に全部取得できてしまうのでしょうか?など疑問がありつつも、対戦ゲームができそうなクエストで面白かったです。

4. Creeps bodies

creepはいろいろな機能を持ちます。攻撃、長距離攻撃、回復などです。ワクワクしてきました。HEALのサンプルコード見ると、とりあえず被弾しているcreepを回復しているコードのようで、最も被弾しているcreepを対象にHEALするとかしたいですね。

5. Store and transfer

フィールドにリソースが落ちててそれを利用できます。タワーに攻撃させたりできます。敵とリソース取り合いになって、相手に横取りされるようなことがあるのでしょうか?所有権みたいなのがあるのでしょうか?

6. Terrain

地勢が5種類あります。swampという湿地では移動速度が遅くなります。

7. Spawn creeps

creepを生成するクエストです。4.で学んだようにcreepには種々機能がありますが、どの機能を実装するか生成時に指定します。そして機能搭載にはenergyというリソースを消費します。つまり必要最低限の機能搭載したcreepを生成する必要があるということです。だいぶ複雑ですが、なるほどなるほどという感じで面白そうです。

8. Harvest energy

energyの収集です。Sourceという資源源がフィールドにあって、そこにcreepを送ってharvestするとenergyを回収できます(ただし、creepはWORK機能が必要)。それを基地(StructureSpawn)に持っていくことで、energyを溜めることができます。おそらく、これが十分に溜まったらcreepをspawnする、というようなコードを実装するのでしょう。

9. Construction

タワーを建設します。creepはタワーを建設することもできます。多分TerrainにRoadsというのもあったので、これも作れたりするのでしょう。

10. Final test

9.まではSample codeがあって、それをコピペするだけでクリアになりました。しかし、Final testはすべて自分でコードを書く必要があります。と言っても、これまでのコードから必要なものをコピペしたら、クリアできました。自陣を要塞化できるとスマートな気がしましたが、脳筋creep2体生成したらOKでした。

import { } from '/game/utils';
import { } from '/game/prototypes';
import { } from '/game/constants';
import { } from '/arena';

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


var creep1, creep2;

export function loop() {
    var mySpawn = getObjectsByPrototype(StructureSpawn)[0];
    var enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);

    if(!creep1) {
        creep1 = mySpawn.spawnCreep([MOVE, ATTACK]).object;
    } else {
        if(creep1.attack(enemyCreep) == ERR_NOT_IN_RANGE){
            creep1.moveTo(enemyCreep);
        }
    
        if(!creep2) {
            creep2 = mySpawn.spawnCreep([MOVE, ATTACK]).object;
        } else {
            if(creep2.attack(enemyCreep) == ERR_NOT_IN_RANGE){
                creep2.moveTo(enemyCreep);
            }
        }
    }
}

おわりに

PvP用にいろいろ練られた機能があって、これで対戦したら面白そうだなと思いました。Rustでできる(能力が自分に備わったら(2022/4/23更新))ようになったら、製品版買ってやりたいなと思います。または一緒にやってくれる方がいれば。
store.steampowered.com