RTA in Japan Summer 2024にStardew Valley のRTAで参加したレポート

RTA in Japan Summer 2024に、Stardew Valley のRTAで参加したレポート、というよりRTAの技術的な解説記事です。手品の種明かしみたいなものだと思ってください。

Stardew Valleyとは

Stardew Valleyは2016年にConcernedApeによって開発されたカントリーライフRPGで、牧場物語ライクないわゆる「スローライフ系ゲーム」です。
明確なゴールは設定されておらず、思い思いの田舎暮らしをすることができるため、ついつい時間を忘れていつまでも遊んでしまうような良いゲームです。
2024年3月に行われたバージョン1.6へのアップデートで新イベントが多数追加されましたので、久しく遊んでない人もこの機会にまた遊んでみるのはいかがでしょうか。
オンラインで最大8人で協力プレイをすることもできます。(バージョン1.6で4人から8人に増えました!)

Stardew ValleyのRTAとは

エンディングらしいエンディングの無いゲームでRTAってどうやるんだ?と思われそうですが、このゲームには公民館の修復や、鉱山の探索、結婚などといったやり込み要素が豊富にあり、SRC上ではそれらの実績を達成するまでの速さを競うカテゴリが多数存在します。
拡張カテゴリも豊富で、最速でウニを取得する「ウニ%」、ルイス町長の幸運のむらさきパンツをルアウパーティのスープ鍋に放り込む「パンツスープ%」、終わるのに24時間以上もかかる「パーフェクション」(100%クリアみたいなもの)などもあります。

公民館修復カテゴリについて

「スタデューバレー」にある田舎町「ペリカンタウン」には、とても長い間使われず廃墟となってしまった公民館があります。
ゲーム内の実績の1つとして、この公民館を完全に修復して町に活気を取り戻すというものがあり、公民館修復(Restoration, Community Center) カテゴリのRTAではその完了までの速さを競います。
寂れきって半ば自然と一体化してしまった公民館にいつしか住み着いた森の精霊「ジュニモ」に対して、「谷の恵み」すなわちゲーム内で取得できる様々なアイテムをプレゼントすることで、見返りとして公民館を修復してもらうという流れでストーリーは進行しますが、要するにやることとしては 「特定の数十種類のアイテムをすべて集めるRTA」 となります。
さらに今回はバグありということなので、使えるバグは何でも使います。

今回使用したテキスト

https://pastebin.com/FMhux87e

厳密にはこれをベースに少しだけ改変を加えています。

バグ・テクニック・環境構築など

下準備

まず、ディスプレイを2台用意します。一方にゲーム画面を表示し、もう一方にテキストを書いたメモ帳を表示しておくとやりやすいからです。
ゲーム画面を表示する方のディスプレイはFHD解像度のものを推奨します。4K以上だとゲーム画面が何故かうまく表示できません。(バージョン1.2における症状で、最新の1.6では4Kディスプレイでも問題なく遊べます。)
そしてStardew Valleyのバージョン1.2を入手します。Steamでは過去バージョンのゲームも入手できるようになっていますが、詳しいやり方はここでは割愛します。「Stardew Valley  Speedruns」Discordサーバーでは簡単なやり方を説明してくれています。

キーリバインディング

Animation Canceling (AC)とWindow Shift Cancel (WSC)というテクニックを行うため、離れた位置にあるキーボードのキーを別のキーに集約するという作業が必要です。AC用にR + 右Shift + Deleteキーをスペースキーに割り当て、WSC用に左Alt + Enterキーをゲームで使用しないキーのどれかに割り当てておきます。キーの再割り当てには「Auto Hotkey」というソフトウェアを使うと便利で、それ用のスクリプトも「Stardew Valley  Speedruns」Discordサーバーで紹介してくれています。
ちなみに私はキーボード+マウスでの操作ではなくゲームパッド+マウスという特殊な形態で操作しているので、別の方法でキー割り当てをしています。
Switch用ホリパッドを愛用しており、左手側に以下のような割り当てをしています。

  • 左スティック:WASD

  • 十字キー上:Y

  • 十字キー右:Esc

  • 十字キー下:左Alt + Enter(バグ無しカテゴリではTabのみ)

  • 十字キー左:F

  • Lボタン:R + 右Shift + Delete

  • ZLボタン:左Shift

  • マイナスボタン:Ctrl

画面調整

このRTAではゲームのウィンドウ化とフルスクリーン化を頻繁に切り替えるため、ウィンドウ時の画面サイズと解像度をフルスクリーン時のものに合わせる必要があります。
まず適当なセーブデータでゲームを開始し、画面設定をフルスクリーンにしてから解像度を1920x1080に選択します。画面設定をウィンドウに戻すと1920x1080サイズのウィンドウになるので、ディスプレイの解像度も1920x1080であればWSCを行った際の画面サイズの変化が低減します。そしてタイトル画面に戻ってからゲームを新規に開始します。

テキストボックスのバグ

このRTAにおいて最も重要なものです。
簡単に言えば、テキストボックス内にゲーム内で使用されているコードを書くと、設定したテキストが表示された際にそのコードが実行されてしまうというというものです。 プレイヤー名や農場の名前、動物の名前などを悪い文字列にすることで、その文字列が表示された瞬間に世界が書き換わります。
任意コード実行とまではいきませんが、アイテム取得やフラグ書き換えなどはこのバグによって簡単に行えてしまいます。
ただしテキストが表示されればいつでもコードが実行されるわけではなく、NPCとの会話ダイヤログ内で、テキストボックスで設定したテキストが表示されたときにそのコードが実行されます 。(メニュー画面のプレイヤー名などを表示しても何も起こりません)
また、プレイヤー名に記述されておりかつプレイヤーのHPが0になって診療所に搬送された場合にのみ実行されるコードというものもあります。
しかし、テキストボックスに入れられる文字数は高々十数文字程度でしかありません。
ところが予め別のところで用意しておいたテキストをコピーしておき、テキストボックス上でCtrl+Vとするとその入力制限を突破できてしまいます。(厳密には改行文字が挿入できてしまう)
この脆弱性を利用すれば(なおいくらか制限はあるものの)いくらでもコードを仕込めてしまいます。

言語について

現在では、ゲームの言語は英語以外であれば問題なくバグの仕込みを行えるようにはなっているはずです。
テキストボックスの1行に入る文字数は実はバイト数ではなく文字がテキストボックスの右端に達するかどうか、つまりフォントのピクセルで決まっています。
このため最もフォントが小さい中国語に設定すると1行に入れられる文字数が増えて有利になりますが、私の考案したテキストでは日本語に設定しても問題なく収まるように調整しています。(2行目から先についても1行に入る文字数はテキストボックスの右端の位置まで)
また英語版に限り、テキストをコピペしたときに改行文字が自動で省かれるという処理が働くため入力制限を突破するバグができなくなっています。

主人公の名前について

主人公の名前はたびたびNPCから呼ばれるためここに大量の文字列を仕込みたいのですが、そういうわけにもいかない事情が存在します。
Stardew Valleyは主人公の名前をセーブファイルの名前に利用しており(バージョン1.5からは牧場名を利用に仕様変更された)、主人公の名前が長すぎるとセーブファイルのパスが255文字を超えてしまい、セーブファイルの作成に失敗してゲームが落ちてしまいます。
(※パスの255文字制限はゲームの仕様ではなくWindowsの仕様)
そこで、ちょっと工夫を凝らすことで比較的少ない文字数でも大量のコードを仕込めるようにしています。
上記紹介したテキストの2行目にある%farmですが、これは牧場名を参照する文字列です。
つまり%farmの5文字は12行目から2464行目までのテキストとして展開されて処理されることになります。
同様に%pet%favoriteという文字列が6行目にありますが、これもそれぞれペットの名前とお気に入りのものの名前を参照させるようにして文字数を圧縮しています。

フラグ処理

と の間にフラグ名を書くと、NPCとの会話でその部分が読まれたときに該当するフラグが書き変わります。
canReadJunimoText」、「ccDoorUnlock」、「ccPantry」の3つのフラグ書き換え処理をこのRTAでは使っています。
canReadJunimoText」は精霊の言葉が読める状態のフラグで、通常であればはじめて魔術師の塔を訪れた際に起こるイベントで立つフラグとなっています。
このフラグが立っていると公民館にバンドルアイテムをプレゼント可能な状態になります。
注目してほしいのは、主人公の名前の最初は「}can%farm」となっていて、牧場名の最初は「ReadJunimoText}」と書かれているところです。
実はcanReadJunimoTextという文字列が一行の中に収まりきらないため(途中で改行文字が入ると無効になる)、canの後に%farmと書いて牧場名を呼び出すことによって、}canReadJunimoText}と一続きにつながるようにしています。
ccDoorUnlock」は公民館の入り口を開けるフラグで、通常であれば春の5日目以降の晴れた日の午前8時以降にペリカンタウンに入った時に発生する、ルイス町長に頼まれて公民館の中を見に行くイベントが発生したときに立つフラグです。
このフラグを立てておかないとそもそも公民館の中に入ることができません。

ccPantry」は食料室のバンドルが完成した後に立つフラグで、これが立っていると農場にある壊れた温室が直っている状態になります。
ただしこのフラグを直接書き換えてもバンドルそのものが完成した状態にはなりません(アイテムが未提供の状態のまま)。

アイテムコード

] の間にアイテムIDを書くと、NPCが読み上げたときにそのIDに対応したアイテムの入手処理が走ります。持ち物がいっぱいのときは何も起こらず、この方法で入手したアイテムはすべて通常品質のものとなります。
同じアイテムを複数入手したい場合、例えば[123][123][123]... と書いても無効で、[123][0123][00123]... というように先頭に"0"を順次足していく必要があります。
2年程前まではこの方法を用いても文字数の制限に達してしまうため同じアイテムの入手数には限りがあると考えられていましたが、[\n123][\n\n123]のように、[の直後に改行文字を挟んでもアイテムコードとして認識されることが判明し、個数の制限が無くなるとともに大幅なチャートの変革につながりました。

イベント発生コマンド

/コマンド名 .を主人公の名前に記述すると、HPが0になって診療所に搬送されたときに起きるイベントがそのコマンドに変更されます。
このRTAで仕込んでいるのは以下の3つです。

  • /speak Harvey "%pet%favorite"

  • /catQuestion .

  • /end warpOut .

/speak 人物名 “会話文” で、””で囲った部分を会話文としたNPCの会話イベントが発生します。
会話文を%pet%favoriteとしているのがミソで、このRTAでは2回病院送りになることでそのどちらも同じイベントが発生しますが、1回目と2回目では喋る会話文の中身が変わります。
%petはペットの名前を参照する文字列で、1回目の時はまだペットを飼っていないので%petはダミーテキストとして用意されている”牧場”という文字列を参照します。
そのため取得できるアイテムはお気に入りのものの名前に仕込んだアイテムコードのものとなります。
この直後に/catQuestion .でペットを飼うかどうかのイベントを発生させ、ペットの名前をpet:から先に書いた文字列(2483行目~)にすることで、2回目の病院送りではペットの名前に書いたアイテムコードのアイテムが手に入るようにしています。
/speakコマンドは単純に任意の会話文を発生させるだけなので、お気に入りのものの名前の後ろの方にメッセージを仕込んでおくことでRiJでやったような演出もできます。
最後の/end warpOut .は、イベント処理を終了して建物の外から再開するというコマンドです。これで少しだけ移動距離を短縮しています。

Animation Canceling (AC)

R + 右Shift + Deleteキーを同時押しすると、道具などを使った際のアニメーションやカットシーン中の硬直を途中でキャンセルすることができます。(恐らく、隠しコマンドとして用意されたものです)
これをうまく利用すると通常の2~3倍の速さで木を切るなどの動作が可能になりますが、このRTAではバンドル解放のカットシーン中に動く目的でのみ使用しています。

Window Shift Cancel (WSC)

Stardew Valleyは左Alt + Enterでいつでもゲームのウィンドウ化とフルスクリーンの切り替えができますが、バージョン1.3までは切り替えを行った際にメニュー画面が開いてポーズがかかるという仕様でした。これを悪用し、カットシーン中でもメニュー画面を開くという技がWSCですが、このRTAでは別の目的で使用することが多いです。
NPCとの会話で取得できるアイテムは、実はどれだけアイテムコードを記述しても最初の3~4つ程度しか入手できないような仕様になっています。しかし会話の途中でWSCを行うとアイテム取得処理がアイテムコードの続く限り無限に走るようです。(詳しい原理はちゃんと理解していないです)
仕込んだアイテムを全て入手できるようになるため、WSCもこのRTAにおいては非常に重要です。

本走の解説

ゲーム開始時の設定

キャラクターエディット画面で、「名前(プレイヤー名)」、「牧場名」、「お気に入りのもの」の各テキストボックスに所定のテキストを貼り付けます。さらに猫の名前をあらかじめクリップボードにコピーしておきます。
牧場のレイアウトは「ヒルトップ」にします。主人公の家と温室の間に、石ころや雑草などがスポーンしない領域がこのレイアウトでは多く、移動が楽になるため有利になります。
「イントロをスキップ」にチェックを "入れない" で「OK」を押してゲームと計測を開始します。イントロムービー中の会話でプレイヤー名が表示されるためです。

イントロ

冒頭のシーン2つをESCキーでスキップします。
暗転したらWSCでカットシーン中でも強制的にメニューを開きます。
農具をクリックして掴んだ状態で再びWSCをすると、本来は捨てることができないはずの農具を消滅させられます。これを5回繰り返して農具を全てインベントリから消滅させます。
農具を捨てる理由は2つあります。一つはインベントリの容量を確保すること、もう一つはゲーム開始初日に自宅にルイスからの手紙が届くようにすることです。
メニューを閉じ、大工のロビンさんとの会話が始まったらWSCでメニューを開き、インベントリにアイテムが補充されていることを確認したらメニューを閉じて画面端にある「>>」ボタンを押してイントロムービーを終了します。

1日目・家の中

朝起きると消滅させたはずの農具が復活しますが、インベントリが一杯なので床に転がった状態になります。これは捨てられた農具の怨念ではなくて実はゲームの仕様です。
このゲームではオートセーブがかかるときにインベントリや全てのチェストの中身、クリントに農具のアップグレードを頼んだかどうかを全部チェックし、もし農具がなければベッドの脇に補充されるという仕様があります。
通常プレイの範疇では農具が無くなることはありませんが、万が一バグか何かで農具を無くしてしまった際の措置としてこのような機構が働くようになっています。
さらにこの農具の補充は「ルイスさんが夜中にこっそり来て農具を置いてくれた」という体になっているため、そのことを伝えるお手紙も一緒に届きます。
ゲーム開始1日目はメールボックスは必ず空のはずですが、農具を捨てることによって手紙が届き、さらにその手紙を後で悪用します。
起きたら最初に揚げトウガラシを食べてスピード+1のバフを得ます。足が速くなる食べ物は他にもありますが、揚げトウガラシには農業+2のバフもあるので後々これが活躍します。

1日目・温室

外に出て温室へ向かい、温室の中をメガボムで耕します。メガボムを使う理由は、耕す効率が良いこと、そもそも農具がなくこれしか手がないこと、そしてHPを減らすことです。
一見すると適当にメガボムを設置しているように見えますが、ここでしっかりHPを管理しないと最悪HPが0になってしまって詰みますし、HPを残しすぎても後々死ねなくて詰みます。
耕し終わったら所定の位置にイリジウム製スプリンクラーを設置します。
高級な肥料をまき、パースニップ、メロン、カボチャのタネを植えます。

1日目・外出

手紙が来ているのでチェックしますが、先述の通りこの手紙は本来存在するものではなく、農具を消滅させることで無理やり発生させたものです。
主人公の名前に%item money 1000000 %%という文字列を仕込んでいますが、%item ~ %%が手紙に同封されているアイテムを変更するための文字列で、money 1000000とすることで1000000Gが同封された手紙となります。
こんなに大金でなくてもいいのですが、買い物と金庫バンドルのために100000G以上には設定した方が良いです。
ピエールの商店が開くまでの時間を使い、公民館へブドウ、スパイスベリー、スイートピーの3つを納品して夏の採集バンドルを完成させておきます。フラグは書き換え済みなので最初からアイテムを納品できる状態となっています。
ここでバンドルを1つ完成させる目的は、空き時間のうちに新規バンドル解放のカットシーンを1つ消化させたいからです。(詳しい理由は後述)
ピエールの商店の前でチェリーボムを爆破させHPをさらに調整します。メガボムのダメージは乱数で決まり、メガボムだけでHPを削ろうとすると運次第でギリギリ残ってしまうこともあるのですが、チェリーボムを1発食らうことによって主人公のHPをメガボムの確定圏内に調整することができます。
店に入る前にコーヒーを飲んでスピード+1のバフをさらに付加します。
起きがけにコーヒーまで飲んでしまうと移動スピードが上がりすぎて種まきがしにくくなるのでこのタイミングで飲みます。
開店ダッシュで店に入り、バックパックと特大バックパックを購入してインベントリ容量を最大まで拡張します。
残りのメガボムを設置し、HPを0にして病院送りにします。

1日目・病院送り1回目

ハーヴィーがお気に入りのものの名前を読み上げてくれるので、WSCでアイテム取得処理を発生させます。これでお気に入りのものの名前に仕込んだアイテムが手に入ります。
続いてペットを飼うかどうかのイベントが発生するので「はい」を選択してペットの名前欄にコピーしておいたテキストを貼り付けます。
イベント終了後に建物の外に移動する処理がなされるので、そのまま公民館へ行きアイテムを納品します。
この際気を付けなければならないのが、バンドルを一気に連続して完成させてしまうと、新規バンドル解放のカットシーンが本来の回数よりも遥かに多く再生されてしまうという不利益にしかならないバグが発生しまうことです。このバグはバージョン1.5でようやく修正されたもので、通常プレイの範疇でも十分に起こる可能性のある厄介なものでした。カットシーンのスタックバグが発生しないよう、一つバンドルを完成させたら納品画面を抜けてカットシーンを発生させて、またすぐに納品画面に戻ってアイテムを納品するという手順を繰り返すことでスタックを防ぎます。
納品し終わったらメガボムを設置して再度病院送りになります。

1日目・病院送り2回目

今度はハーヴィーがペットの名前から読み上げるので、WSCでアイテム取得処理を発生させます。これでペットの名前に仕込んだアイテムが手に入ります。
ペットを飼うかどうかは「はい」を選択します。「いいえ」を選択してしまうと、仕込んでおいた/end warpOut .イベントがマーニーとの会話イベントで上書きされてしまうためです。
手に入ったアイテムを納品し、ワープトーテムで農場へと戻ります。
農場に戻るとディメトリウスとの会話イベントが発生し、そこで牧場名が読み上げられるのでWSCでアイテム取得処理を発生させます。(累計収入25000G以上で農場のマップに入ったときに発生するイベント)
インベントリ1段目の不要なアイテム(タネなど)にマウスホイールでフォーカスを合わせてからそのアイテムを捨て、頭上に何もアイテムを掲げていない状態にしてからベッドで寝ます。現行のバージョンでこそユーザビリティ・アクセシビリティが大いに改善されているStardew Valleyですが、バージョン1.2の段階では頭上に何かアイテムを持っている状態だとベッドで寝ることができない仕様でした。

2日目~14日目

ひたすら寝ます。
「もう寝ますか?」のメッセージはクリックではなくYキーを押すほうが速く「はい」を選択できます。さらにバージョン1.2ではYキーの連打でさらに寝るのが速くなるという謎の仕様があるためYキーは連打します。
寝たらすぐに今度はEscキーを連打すると次の日に移行するのが速くなります。これもバージョン1.2に見られる謎の仕様です。フレームパーフェクトだと日をまたぐときのオートセーブすらスキップできます。
ちなみに寝ている間も床元に農具がどんどん増殖し続けますが、農具が手持ちのアイテムとして入らない限りは農具が存在しない判定になっているので、日をまたぐごとに農具の補充処理が行われます。

15日目

起きたら揚げトウガラシとコーヒーを食します。
温室へ行きゴールド品質のパースニップ、メロン、カボチャをそれぞれ5個ずつ収穫します。
ゴールド品質の作物はアイテム生成バグで生み出すことのできないアイテムなので、ここだけは真面目に農業する必要があります。
揚げトウガラシを食べていることで農業レベル+2のバフがかかり、ゴールド品質の作物の収穫確率が上がります。
農業レベルアップによるゴールド品質収穫確率アップが即座に適用されるため、経験値の多いカボチャから優先的に収穫すると良いです。
収穫し終えたらワープトーテムで山へワープし、公民館へ行って残りの全てのアイテムを納品します。
これで全行程は終わりです。


いいなと思ったら応援しよう!