Su_cstrakmのヒント置き場

答えはないけどヒントならあります

AGDQ2022で行われるStardew Valley - Glitched Community Center Restoration speedrun(バグあり公民館修復RTA)の解説資料

はじめに

2022年1月に行われるAGDQ2022にて、「Stardew Valley」のRTAがついに披露されます!
日本時間では1月14日の18時過ぎに開始される予定で、Japanese RestreamチャンネルにおいてRTAの解説を私が担当致します。
ただひとつ残念なことは、今回行われるRTAはバグ技を用いて20分足らずで終わってしまう内容で、一目見ただけではStardew Valleyというゲームについても、RTA中に何が行われているのかについてもまるで分からないということです。
そこで、このStardew Valleyというゲームについてのごく簡単な紹介と、RTA中に行われるであろう内容についての解説をしたいと思います。 f:id:su_cstrakm:20220106203537p:plain

Stardew Valleyとは

Stardew Valleyは2016年にConcernedApeによって開発されたカントリーライフRPGで、牧場物語ライクないわゆる「スローライフ系ゲーム」です。
明確なゴールは設定されておらず、思い思いの田舎暮らしをすることができるため、ついつい時間を忘れていつまでも遊んでしまうような良いゲームです。
2020年に行われたバージョン1.5へのアップデートで大幅にマップも拡張されましたので、久しく遊んでない人もこの機会にまた遊んでみるのはいかがでしょうか。
オンラインで最大4人で協力プレイをすることもできます(MODを入れるとさらに人数の上限を増やせます)。私はいつでも遊び相手を募集しています。

Stardew ValleyのRTAとは

エンディングらしいエンディングの無いゲームでRTAってどうやるんだ?と思われそうですが、このゲームには公民館の修復や、鉱山の探索、結婚などといったやり込み要素が豊富にあり、SRC上ではそれらの実績を達成するまでの速さを競うカテゴリが多数存在します。
他にも最近ではゲーム内にあるミニゲームをクリアするタイムを競うカテゴリや、魚を全種類釣るカテゴリなどを、拡張カテゴリとして追加することが検討されているようです。

Community Center Restorationカテゴリについて

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

Glitchedカテゴリについて

今回行われるGlitchedカテゴリではすべてのバグの使用が許可されています。
このゲームには重大な2つのバグもとい脆弱性が存在していて、主にそれらを悪用するRTAとなっています。 ちなみにGlitchedカテゴリ以外では、Glitchless(完全バグ無し)、No Major Glitches(テキストボックスバグ禁止)、No Paste(テキストボックスバグをしてもよいが、テキストデータのコピペは禁止)が存在します。

重大なバグ

テキストボックスバグ

簡単に言えば、テキストボックス内にゲーム内で使用されているコードを書くと、設定したテキストが表示された際にそのコードが実行されてしまうというというものです。 プレイヤー名や農場の名前、動物の名前などを悪い文字列することで、その文字列が表示された瞬間に世界が書き換わります。
任意コード実行とまではいきませんが、アイテム取得やフラグ書き換えなどはこのバグによって簡単に行えてしまいます。
ただしテキストが表示されればいつでもコードが実行されるわけではなく、NPCとの会話ダイヤログ内で、テキストボックスで設定したテキストが表示されたときにそのコードが実行されます (メニュー画面のプレイヤー名などを表示しても何も起こりません)。
また、プレイヤー名に記述されておりかつプレイヤーのHPが0になって診療所に搬送された場合にのみ実行されるコードというものもあります。(HP0になった際のイベント処理がプレイヤー名でオーバーライド云々みたいな原理らしいのですが、詳しいことはよく理解できませんでした。)
このバグと後述の制限突破バグを組み合わせて大量のコードを実行することができます。

制限突破バグ

このゲームのテキストボックスにはやや特殊な文字数制限が設定されていて、文字数そのものやバイト数で制限が課せられているのではなく、テキストの見た目の長さで入力が制限されています。そのため、言語が変わる=ゲーム内で使用されるフォントが変わると入力できる文字数が変化します
最も文字が詰め詰めで表示されるフォントであれば最も入力可能な文字数が多く、このゲームでは中国語がそれに相当します。
さて肝心の制限突破バグですが、これは通常であればテキストボックスには1行分の文字列しか入力できないところを、あらかじめメモ帳等に書いておいた複数行のテキストをコピーしてテキストボックスに貼り付けると複数行分入力できてしまうというものです。
ただし文字数もとい見た目の文字の長さの制限自体はちゃんと課せられており、各行の文字列の見た目の長さはそれぞれ上限内に収める必要があります。
この複数行の文字列を書いてもよいというのがGlitchedカテゴリであって、No Pasteカテゴリでは文字列のコピペ禁止、すなわち複数行の文字列の入力は禁止となっています。

その他のバグなど

WSC

WSC(Window Shift Cancel)はバージョン1.3まで使用可能で、厳密にはバグではなくテクニック扱いとなっています。
このゲームでは「左Alt + Enter」で画面の最大化とウインドウ化を切り替えられますが、バージョン1.3まではそれを実行した際に自動でメニューが開く(ポーズがかかる)仕様となっていました。
ところがこの仕様はどんな場面でも適用されており、イベントムービー中であってもメニュー画面を開くことができてしまいました。
この仕様の穴をついて一部のアニメーションをスキップしたり、イベント中に好き勝手に動き回ることができます。

スタードロップをインベントリに入れる

「スタードロップ」はこのゲームのキーアイテムの1つで、取得した瞬間にスタードロップを食べてプレイヤーのエナジーの最大値が上昇するイベントが発生します。
通常プレイではインベントリには絶対に入らないアイテムですが、バージョン1.2までであればテキストボックスバグでスタードロップのアイテムコードを指定することにより、インベントリに入った状態でスタードロップを入手できます。
このスタードロップは本来インベントリに入らない、すなわち売却できないにもかかわらず7777Gもの売値が律儀に設定されています。
インベントリに入れることで売却もできるので、テキストボックスバグを利用してゲーム開始数秒で大金を手に入れることができます。

今回行われるRTAの流れ

※あくまで現行のチャートに沿ってプレイされた場合の解説となっています。もしかしたら本番では以下に記す通りのチャートではない可能性もあることをご了承ください。

使用する文字列

各テキストボックスに設定する文字列は以下の通り。
名前(プレイヤー名):

}can%farm
%favorite
%item object 
369 999 %%
/mail mom1 .
/addTool Wand .
/end position 10 19 .

牧場名:

ReadJunimoText}
}ccDoorUnlock}
}ccPantry}
[472][0472][00472]
[000472][0000472]
[00000472]
[000000472]
[0000000472]
[00000000472]
[000000000472]
[0000000000472]
[00000000000472]
[000000000000472]
[479][0479][00479]
[000479][0000479]
[00000479]
[000000479]
[0000000479]
[00000000479]
[000000000479]
[0000000000479]
[00000000000479]
[000000000000479]
[487][0487][00487]
[000487][0000487]
[00000487]
[000000487]
[0000000487]
[00000000487]
[000000000487]
[0000000000487]
[00000000000487]
[000000000000487]
[288][0288][00288]
[000288][0000288]
[00000288]
[000000288]
[0000000288]
[00000000288]
[000000000288]
[0000000000288]
[00000000000288]
[000000000000288]

お気に入りのもの:

[288][0288][00288]
[000288][0000288]
[00000288]
[000000288]
[0000000288]
[00000000288]
[000000000288]
[0000000000288]
[00000000000288]
[000000000000288]
[395][0395][00395]
[215][0215][00215]
[689][0689][00689]
[000689]
[434][0434][00434]
[000434][0000434]
[00000434]
[000000434]
[0000000434]
[00000000434]
[000000000434]
[0000000000434]
[00000000000434]
[000000000000434]
[645][0645][00645]
[240][0240]
[00240]
[472][0472][00472]
[000472][0000472]
[00000472]
[000000472]
[0000000472]
[00000000472]
[000000000472]
[0000000000472]
[00000000000472]
[000000000000472]
[479][0479][00479]
[000479][0000479]
[00000479]
[000000479]
[0000000479]
[00000000479]
[000000000479]
[0000000000479]
[00000000000479]
[000000000000479]
[487][0487][00487]
[000487][0000487]
[00000487]
[000000487]
[0000000487]
[00000000487]
[000000000487]
[0000000000487]
[00000000000487]
[000000000000487]

猫の名前:

[16][18][20]
[22][412][414]
[416][418][396]
[398][402][88]
[724][90][725]
[78][404][406]
[408][410][709]
[0709][00709]
[000709][0000709]
[00000709]
[000000709]
[0000000709]
[00000000709]
[000000000709]
[24][188][190]
[192][256][260]
[258][254][270]
[272][276][280]
[186]

ニワトリの名前1:

[174][182][438]
[440][432][428]
[426][424][340]
[344][145][143]
[706][699][136]
[142][700][698]
[131][130][150]
[701][140][132]
[148][128][156]
[164][734][716]
[715][718][720]
[719]

ニワトリの名前2:

[334][335][336]
[80][86][84][82]
[768][769][724]
[259][430][376]
[228][194][420]
[397][421][444]
[62][266][422]
[392][702][536]
[262][0262][00262]
[000262][0000262]
[00000262]
[000000262]
[0000000262]
[00000000262]
[000000000262]
[178][0178][00178]
[000178][0000178]
[00000178]
[000000178]
[0000000178]
[00000000178]
[000000000178]
[613][0613][00613]
[725][348][446]
[637]

%farm
「牧場名」に設定した文字列を表示します。
今回のRTAではこの文字列をプレイヤー名に仕込むことで牧場名に設定したテキストも表示させています。

%favorite
「お気に入りのもの」に設定した文字列を表示します。
牧場名と同様にプレイヤー名に仕込むことでお気に入りのものに設定したテキストも表示させています。

%item object ID 数量 %%
対応するIDのアイテムが指定の数量分ついた手紙が郵便受けに投函されている状態になります。スペースの後に改行を挟んでも問題なく実行されます。
今回は「%item object 369 999 %%」と書くことで、高級な肥料が999個ついた手紙が投函されます。

}フラグ名}
対応するフラグが立ち、「canReadJunimoText」、「ccDoorUnlock」、「ccPantry」のフラグが今回使われます。

「canReadJunimoText」は精霊の言葉が読める状態のフラグで、通常であればはじめて魔術師の塔を訪れた際に起こるイベントで立つフラグとなっています。
このフラグが立っていると公民館にバンドルアイテムをプレゼント可能な状態になります。
注目してほしいのは、プレイヤー名の1行目は「}can%farm」となっていて、牧場名の1行目は「ReadJunimoText}」と書かれているところです。
実はcanReadJunimoTextという文字列が一行の中に収まりきらないため(途中で改行文字が入ると無効になる)、canの後に%farmと書いて牧場名を呼び出すことによって、}canReadJunimoText}と一続きに繋がるようにしています。

「ccDoorUnlock」は公民館の入り口を開けるフラグで、通常であれば春の5日目以降の晴れた日の午前8時以降にペリカンタウンに入った時に発生する、ルイス町長に頼まれて公民館の中を見に行くイベントが発生したときに立つフラグです。
このフラグを立てておかないとそもそも公民館の中に入ることができません。

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

[ID]
対応するIDのアイテムがインベントリの中に入ります。
持ち物がいっぱいのときは何も起こりません。
同じアイテムを複数入手したい場合、例えば[123][123][123]... と書いても無効で、[123][0123][00123]... というように先頭に"0"を順次足していく必要があります。
また、この方法で入手したアイテムはすべて通常品質のものとなります。 シルバー(良)品質やゴールド(高)品質、イリジウム(最高)品質のアイテムは入手できません。

/コマンド名 .
これは特殊なコードで、プレイヤーのHPが0になって診療所に搬送されたときだけ実行されます。またこのコードは必ずプレイヤー名の中に書かなければなりません。
今回は、「/mail mom1 .」、「/addTool Wand .」、「/end position 10 19 .」の3つのコマンドが用いられます。

「/mail mom1 .」は、翌日なると「母からの手紙その1」が届くコマンドですが、コマンド実行後に手紙を読む過程がないので実際にはこの行は不要のはずです。 母からの手紙を読むとプレイヤー名が表示されるので、万が一の時のリカバリー策として用意しているのかもしれません。

「/addTool Wand .」は、「帰還の杖」というアイテム(使うと一瞬で自宅に戻れ、何回でも使用可能)を入手するコマンドです。
帰還の杖は通常のアイテムとは異なり、農具などと同様にイベントによって入手が管理されています。

「/end position 10 19 .」は、現在のイベントを終了し座標(10, 19)にプレイヤーを移動させるというコマンドです。
これが実行されると、診療所に搬送された後のハーヴィーとの会話が強制終了したうえで座標(10, 19)、すなわち診療所の入り口にプレイヤーが移動します。

ゲーム開始前の設定

キャラクターエディット画面で、「名前(プレイヤー名)」、「牧場名」、「お気に入りのもの」の各テキストボックスに所定のテキストを貼り付けます。さらに猫の名前をあらかじめクリップボードにコピーしておき、ニワトリの名前1をすぐコピーできるように全選択状態にしておきます。

牧場のレイアウトは「フォレスト」にします。このレイアウトは牧場敷地内に採取アイテム(タンポポなどの野草)がランダムで自生するほか、ミックスシードが取れる草が生えていたり、堅い木が取れる切り株が毎日生え変わったりします。
これらの恩恵は今回のRTAでは全く必要のないもので、正直なところ「スタンダード」のレイアウトでも変わらない気がします。フォレストのレイアウトは草地が多くその上には邪魔な石ころがスポーンしないので、移動しやすさの観点からわずかに有利になると思われます。

「イントロをスキップ」にチェックを "入れない" で「OK」を押してゲームと計測を開始します。イントロムービー中の会話でプレイヤー名が表示されるためです。

イントロ

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

1日目

朝起きると消滅させたはずの農具が復活しますが、インベントリが一杯なので床に転がった状態になります。
外に出て玄関先にメガボムを1つ設置し、荒れ果てた農地を綺麗に片づけます。
出荷箱をチェックしてからスタードロップを選択して、スタードロップを全て出荷します。 先にスタードロップを選択してしまうとスタードロップ取得イベントが発生してしまい、7777Gのお金が消滅してしまいます。 家に帰って寝ると出荷のリザルト画面が表示されるので、WSCでスキップします。
2日目と3日目は何もせずに寝ます。

4日目

外に出るとディメトリウスさんが訪れるイベントが発生します。このイベントは収入の累計が一定金額以上になった場合に発生するため、今回用いるチャートではこのタイミングで必ず起こります。
ディメトリウスが開口一番にプレイヤー名を呼んだ瞬間にWSCをし、手持ちのアイテムが増えていることを確認したらメニューを閉じてメッセージを読み飛ばします。途中で出てくるの選択肢はどちらでもOKです。
インベントリに入ってしまっている繊維や石などを処分して空きを作り、郵便受けの手紙を読んで高級な肥料999個を入手します。
揚げトウガラシを食べてからコーヒーを飲んで、歩行スピードを2段階上昇させます。
ガボムを使いながら南下し、シンダーサップの森へ通じる道を綺麗にします。
自宅の方へ引き返したら、今度はメガボムを使いつつ西の方にある温室へ行きます。フラグが既に書き換わっているので温室は使える状態になっています。
温室の中の土をメガボムで耕し、所定の位置にスプリンクラーを設置し、肥料を撒いた後でパースニップのタネとメロンのタネとトウモロコシのタネを撒きます。
ワープトーテムで山へワープし、ロビンの家で木材550個と石200個を購入、さらにトリ小屋を建築してもらったら、メガボムで自害します。
診療所に搬送されると、帰還の杖がインベントリに追加された後、ハーヴィーの会話が強制終了して診療所の入り口にワープされます。
外に出て隣のピエールの商店に入り、バッグを購入してインベントリの上限を最大まで増やします。バッグ購入時のアニメーションはWSCでスキップします。
帰還の杖で帰宅し箱を1つクラフトして家の前に設置、家の中に散らかった農具を回収し、インベントリのアイテムを全て箱の中に収納します。

5日目

晴れている場合は外に出ると南の牧場に住むマーニーさんが訪れます。
会話をWSCせずに選択肢が出るまで読み飛ばします。WSCをするとテキスト内に仕込んだアイテムをすべて入手してしまいますが、普通に会話文を読み進めた場合は高々2種類のアイテムだけがインベントリ内に入るという特性があります。
選択肢は「はい」を選び、猫の名前をあらかじめクリップボードにコピーしておいたテキストに変更します。
マーニーが猫の名前を復唱した瞬間にWSCをし、インベントリがアイテムで埋まったことを確認してからメニューを閉じ、会話を終えます。
インベントリの先頭2つの不要なアイテムを箱に収納し、帰還の杖を引き出してから、19日になるまで寝続けます。(バージョン1.2xでは手に物を持っている状態でベッドで寝ることができないため、帰還の杖を引き出す必要があります。)
もし5日目に雨が降っていた場合は、次の水曜日か金曜日(10日目、12日目、17日目)に晴れていればイベントが発生します。ここが数少ない運要素の一つです。

19日目

コーヒーと揚げトウガラシを食べ、ワープトーテムで山へワープし、インベントリ内のバンドルアイテムを公民館に提供します。
帰還の杖で帰宅したら、箱から木材、石、牧場主のランチを取り出し、牧場主のランチを食べて農業レベルを+3にします。農業レベルアップのバフをかけることでゴールド品質の作物を収穫できる確率が上がります。
温室でゴールド品質のパースニップ、メロンおよびトウモロコシをそれぞれ5個以上収穫できたら、コーヒーと揚げトウガラシを食べてワープトーテムで山へワープします。ここも数少ない運要素の一つです。
木材、石、ゴールド品質の作物を公民館に提供したら帰還の杖で帰宅、シンダーサップの森へ行ってマーニーの家が開くまで待機します。
ニワトリを購入し、名前を「ニワトリの名前1」の文字列に設定、マーニーがニワトリの名前を復唱したらWSCでメニューを開いてインベントリがバンドルアイテムで埋まっていることを確認します。
ワープトーテムで山へワープし、公民館にバンドルアイテムを提供したら、今度は「ニワトリの名前2」の文字列を用いて同様の行動を繰り返します。
これで全てのアイテムとお金42500Gの提供が完了して、無事に公民館が修復されます。