2025/05/26 20:06 Porting Terraria and Celeste to the Browser with WebAssembly

ロボ子、TerrariaとCelesteがWebAssemblyに移植されたってニュースは聞いたかのじゃ?

はい、博士。ブラウザ上で動作するようになったそうですね。すごいことです。

そうじゃろ!C#で書かれたTerrariaをFNAエンジンを使って移植したらしいぞ。オリジナルのTerraria.exeから必要なライブラリを抽出して、WASMをターゲットに再コンパイルしたらしいのじゃ。

FNAエンジンですか。知りませんでした。OpenGLの呼び出しをメインスレッドにプロキシするFNA Proxyも実装したんですね。

.NET 9.0のWasmEnableThreadsオプションとAOTコンパイルでパフォーマンスを向上させたらしいぞ。賢いのじゃ!

ゲームアセットはOrigin Private File System APIを使ってユーザーに選択させるんですね。セキュリティも考慮されている。

AES暗号化が.NET wasmでサポートされなくなったから、Emscripten OpenSSLを使ったらしいぞ。なかなかやるのじゃ。

Celesteも同様にWebAssemblyに移植されたんですね。SDL3にアップグレードして、OffscreenCanvasを利用することでプロキシハックが不要になったと。

FMODのemscriptenビルドを使ったけど、workerで動作しない問題があったらしい。FMODの.oファイルを抽出して、コード生成されたCオブジェクトとして挿入したらしいぞ。力技じゃな!

Strawberry Jam modのロードを目標に、Everest mod loaderの移植にも挑戦したんですね。

WebAssemblyではJITコンパイルが制限されているから、ILバイトコードを直接修正する方式を採用したらしいぞ。MethodBase.GetFunctionPointer()で取得したアドレスからInterpMethod構造体にアクセスして、コード領域を取得したとか。

mono_method_get_header_internal関数を利用して、メソッドのコード領域を取得したんですね。MSILドキュメントを参考に、ldarg.i、ldc.i4、calliなどの命令を挿入して制御フローをオーバーライドしたと。

動的に生成されたメソッドのメタデータトークンをクローンして、Monoのハッシュテーブルに挿入したらしいぞ。すごい技術じゃ!

Celesteのバイナリをランタイムにロードし、パッチを適用する方式を採用したんですね。Hookクラスを使って、動的にロードされたアセンブリ内の関数をパッチしたと。

EverestのDLLをGitHubから直接ダウンロードして、Celeste.exeにパッチを適用したらしいぞ。大胆じゃな!

Strawberry Jam modの依存関係を解決するために、多数のMonoランタイムのバグを修正したんですね。System.Reflection.Module.GetTypesの実装を修正したり、静的イニシャライザの順序に関する問題を修正したり。

Celesteのマルチプレイヤーmodをブラウザで動作させることにも成功したらしいぞ。MonoModRelinkFrom属性を使用して、System.Net.Socketの作成をインターセプトし、wispプロトコル経由でTCP接続を確立したとか。

Chromebookでの動作と、技術的な挑戦を楽しむため、というのが動機なんですね。素晴らしい成果です。

まさに技術の勝利じゃな!しかしロボ子よ、これだけのことを成し遂げた開発者たちは、きっと徹夜続きで目がTerrariaみたいに真っ赤だったに違いないぞ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。