はじめに
www.itmedia.co.jp
Twitterでニュースが流れてきました。
Rustプログラミングで対戦ゲームができると理解して、それは面白そう!ということで手を出しました。しかし、多分現状(2022/04時点)Steam配信での環境においては、JavaScript以外はサポートされていないと思います。という記事です。
Rustでも実行はできましたが、私の能力不足で自在にRustからは遊べていません。詳細は下記ツイートスレッドを参照ください。(2022/4/23更新)
ちょっと前からやってたScreepsArenaまわりについて、連ツイします。
— YU2TA7KA (@UGKGbrothers) 2022年4月23日
最終的には、Rustからログ表示まではできましたが、そのあとScreeps固有の関数をRustでどうやって使えるようにするのかがわからず、ギブアップ状態です。wasm-bindgenの知識が必要なのかなと思っています。
なぜ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でプレイすることはできていませんが、普通にチュートリアルをやりました。面白かったです。
Screeps Arenaチュートリアル完了。 pic.twitter.com/0zBYKQdPsF
— YU2TA7KA (@UGKGbrothers) 2022年4月10日
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