見出し画像

Screepsのはじめかた

Screepsというコードを書いて遊ぶゲームがあります。
文字通りプログラミングをしないといけないため、面白さがわかってくるまでに挫折しないよう、始め方と情報の集め方をまとめます。

どんなゲーム?

多くのゲームはゲームのキャラクターを手動で動かしてプレイしますが、Screepsはゲームのキャラクターを動かすコードを書いてプレイするゲームです。
ジャンルとしてはリアルタイムストラテジーゲームで、経済を発展させて軍事ユニットをつくり、隣人と協力もしくは競争しながら勢力を伸ばしていきます。コードはサーバー上にデプロイされ、24時間365日動作し続けます。

このゲームの魅力はなんといっても、リアルな世界で動くbotをつくるところにあります。ゲームの中ではありますが、単純なルールのみが与えられた場で、さまざまなプレイヤーがそれぞれに試行錯誤している、そのような世界でコード動かすのはかけた労力以上の楽しさがあります。
最初はゲームの仕組みを扱えるようになることすら十分に挑戦的ですが、実装が進むにつれ世界を思うのままに操作できるようになり、最終的には他のプレイヤーのbotと戦争ができるようになります。
当然ながら戦争には最適戦略がないので、相手の実装の穴を突くようなコードを書く必要があります。
兵站を破壊して持久戦にもちこんだり、隊列を組んでいない敵に奇襲をかけたりといった、現実世界と同様の戦術を取ることもありますし、敵の迎撃順計算を解析して囮を送り込んだり、攻撃部隊と認識されないユニットを送り込んで破壊活動をしたりといった、相手のロジックを解析したうえでその穴をつくハッキングも重要です。

ゲームをはじめるには

課金の仕組み

Screepsは書いたコードをサーバー上にデプロイ(アップロード)して実行されるのを眺めるゲームです。
参加プレイヤーがCPUの実行時間を食い尽くさないように、各プレイヤーが利用できるCPU時間には上限が設けられています。

Screeps運営に対する課金は、サーバーにデプロイするアクセス権の購入と、CPU時間の購入という形で行われます。

ゲームの購入

SteamからScreeps Worldを購入します。これによって公式サーバーにデプロイできるようになります。
購入したらSteamライブラリからScreepsのクライアントアプリを実行します。

チュートリアル

Screepsクライアントアプリからチュートリアルを始めてみましょう。
リアルタイムストラテジーゲームの、ユニット生成/エネルギー採掘/レベルアップ/防衛などの基本的な操作および、JavaScriptを使ってどのようにゲーム内のユニットを動かしていくかを学ぶことができます。

ゲームをはじめる

チュートリアルが終わったら、実際のMMO世界でゲームを始めましょう。
マップから適当な部屋を選んで最初のspawnを設置します。

ヒント

  • マップには"Shard"という区分があります。まずはshard3にスポーンするのがいいでしょう

  • マップ上に緑色に塗られている領域があります。この初心者専用エリアにスポーンしましょう。一定期間の間、弱肉強食の外界と隔てられています

  • エネルギーの収集ができずに、あるいは隣人に攻撃されて死んでしまったり、あるいは最初からやり直してみたい場合は、緑色の初心者エリアか青色のリスポーンエリアでスポーンしなおしましょう

初心者専用エリア


実装する

無事世界に踏み出せたら、いよいよ実装です。

序盤の目標

序盤は upgradeController() で controller にエネルギーを与えて RCL (Room Controller Level)を上げることを目標にします。
RCLが上がると建築できる建物が増え、それによって行動の幅が大きく広がります。
安定してエネルギーを採掘しつつRCLを上げる実装をし、実装している間にRCLが上がるので新たにアンロックされた機能を試し…というサイクルをまわして、このゲームで何ができるのか学びましょう。

ヒント

  • RCL3に達したらtowerを建て、敵(とは味方以外の全てのことです)のcreepが部屋に侵入したら撃ち落とすコードを書きましょう。無防備な拠点は長持ちしません

  • Controllerはsafe modeという機能をもっています。どうしようもなくなったら、safe modeを有効化して部屋を守りましょう。部屋の中での全ての攻撃行動を一定期間防いでくれます

  • Getting Started - Screeps Wiki を読んで序盤の目標を確認しましょう

情報を集める

DocumentationAPI Referenceを参照してScreepsのゲーム仕様を学びます。
特にDocumentationは有益な情報が載っているので、introduction, creeps, controlの項目を読んでおくとゲームの理解が捗ります。

公式チャットとしてDiscordサーバーが用意されているので参加しましょう。
一般的な質問ができるヘルプチャンネル、各プログラミング言語とアーキテクチャのトピックに関するチャンネルや、非英語話者向けのチャンネルもあります。
ゲーム上では敵対していてもあくまで戦っているのはbotであるためか、皆親切に質問に答えてくれます。

計算機科学ではなくゲームのチャットです
日本語を盛り上げていきましょう

また、ゲームサーバーを監視しているbotが侵略行動を通知するチャンネルがあるので、他人の戦略を観察したり戦闘記録を見返したりするのに役立ちます。

Rest in Peace

開発環境を整える

ScreepsのコードはJavaScriptかWeb Assemblyで動きます。つまりそれらの言語に変換できるのであれば、自分の好きなIDEで、好きな言語で開発することができます。
各言語ごとにScreepsの実装に必要な環境とサーバーへのデプロイ処理を含めたスターターキットが作られているので、それを使うと便利です。
Discordの言語チャットで "is there a starter kit for this language?" などと聞いてみると教えてもらえます。

わたしも元々使っていたscreeps-typescript-starter

試合に参加する

Screepsは常時動いているMMO世界の他に、定期的に短期間の試合が開かれています。

公式マッチのSeasonはゲームの仕組み自体が改変される試合で、各シーズンごとに得点方法とルールが変わり、上位にはMMO世界で使える商品が出ます。
現在はSeason4が始まるところです。
Season3, Season4はMMO世界のエンドコンテンツがテーマに据えられていて、今まで触れていなかったプレイヤーには絶好の実装の機会になっています。
わたしもSeason3でpower harvesting/processingの実装ができました。

有志で開く試合も行われており、デスマッチのSWC (Screeps Warfare Championship)や完全自動試合のBotarenaが定期的に行われています。
それぞれDiscordにチャンネルが立っているので参加したい場合はチャンネル通知を入れておきましょう。

Screepsのサーバーの実装は公開されているため、仲間内でプライベートサーバーを立てることもできます。
本番サーバーにデプロイする前にテストをしたり、modを入れて独自ルールで試合をしたりといったことです。

Allianceに参加する

MMO世界には有力なalliance(チーム)が存在し、実装およびゲーム上で協力して領土を確保しており、ときおりalliance間での衝突が起きて地図が変わります。
Allianceに参加すれば強力な後ろ盾とコミュニティを得ることができます。

わたしの参加しているOverlords allianceのメンバーは米国、オーストラリア、韓国などの出身で、メンバーチャットは趣味や各国の時事の話題が流れています。

"I'm expecting 2 hobbits to turn up and drop a ring in my toilet or something anytime soon"

オーストラリアのメンバー

南半球の1月はクソ暑いらしい

過去にはalliance間での大規模な戦争が何度も起こっており、公式ブログが解説する"世界大戦"の様子を読むのも面白いです。

高度な実装

実装を進めていくとさまざまな困難が出てきます。これを解決するのにゲームプログラミングやロボット制御などの知識が使えます。

エージェントの動作を決定するbehavior treeやプロセスの動的管理を行うoperating systemなどはDiscordにチャットがありますし、以下のような書籍も参考になります。

三宅 陽一郎「戦略ゲームAI 解体新書」
タイトル通り、ストラテジーゲームに関わる各種自動処理について解説する本です。豊富な参考文献が載っているので、情報そのものとしても、目次としても有用でした。

青木 峰郎 「ふつうのLinuxプログラミング」
Linuxの解説本ですが、OSをつくる際にLinuxの実装を参考にすることができました。シェルコマンドとその実体であるCのAPIを、実際に確認しながら挙動を調べていける良書です。

これからはじめる人に向けて

自動でゲームプレイできるなんて素晴らしい。やりましょう 💪

この記事が気に入ったらサポートをしてみませんか?