導入

作成日時:2022/02/11(金) 14:08:58
更新日時:2022/03/01(火) 20:06:30

SunScriptとは

サンシャインでは、状況(シャインの数など)によって異なる処理を行うためには、スクリプトが使われます。例えば、サングラスのモンテはシャインの数とクッパを倒したかどうかによって発話が異なりますが、これはまさにスクリプトで実現されました。

SunScriptとは

ゲーム内で実行できるスクリプトを作成するためには、SunScriptというJavaScriptっぽい言語が使われます。作成したスクリプトをゲーム内で実行するためには、sscを用いて機械が読むバイトコードに変換(コンパイル)し、さらにWiiExplorerを用いてサンシャインのゲームディスクに入れる必要があります。

本チュートリアルはSunScriptによるゲーム内機能の実装方法及びゲーム内で実行するまでの手順を解説します。

必要なソフトウェア

ssc

SunScriptをゲーム内で実行できるバイトコードにコンパイルするためにはsscが必要です。Releaseの圧縮ファイルをダウンロードして解凍すれば準備完了です。

SunScript(.sun)のスクリプトファイルをCompileSun.batにドラッグ&ドロップすればコンパイルできます。練習としてこのSunScriptファイルをダウンロードしてコンパイルしてみましょう。

test.sunCompileSun.batにドラッグ&ドロップします。
drag
そうしたらこのウィンドウが出てくるはずです。これでコンパイルが完了し、test.sbというファイルが生成されます。
compile
sb

WiiExplorer

生成したtest.sbをゲーム内で実行するために、WiiExplorerを使ってサンシャインの<SMS>/files/data/common.szsというファイルを編集します。念のためにこのファイルをバックアップすることをお勧めします。また、まだサンシャインのISOを吸い出してディスクのファイルを抽出していない場合はこちらの記事を参照して準備してください。

Releaseの圧縮ファイルをダウンロードして解凍してWiiExplorer.exeを実行します。ファイル > 開くをクリックして<SMS>/files/data/common.szsを選択します。szsファイルを開いたら、spというフォルダを展開します。

sp

このフォルダに.sbファイルを入れればゲーム内で自動的にQF毎に実行されます。編集 > ファイルを追加test.sbを追加するか、test.sbをこのフォルダにドラッグ&ドロップして追加します。

sp2

追加したらファイル > 保存で保存します。これでスクリプトをサンシャインのディスクに入れることができました。

動作確認のために、Dolphinを実行します。いくつかコインを集めてみて、test.sunはどのようなスクリプトか推測してみましょう。

答え合わせ

test.sunはコインを取得する度にノズルを変えるスクリプトです。

var const SYSF_GOLDCOINNUM = 0x40002; // コイン数のFlag ID
builtin getSystemFlag(flag); // コイン数などの情報を返すの関数
builtin changeNozzle(nozzle); // ノズルを変える関数

// 前のQFのコイン数
var local coinCount0 = getSystemFlag(SYSF_GOLDCOINNUM);
// 無限ループ
while (1) {
  // コイン数を取得
  var coinCount = getSystemFlag(SYSF_GOLDCOINNUM);
  // コイン数が変化した時
  if (coinCount != coinCount0) {
    // ノズルを変える
    changeNozzle(coinCount % 6);
    // 前のQFのコイン数を更新
    coinCount0 = coinCount;
  }
  // 次のQFまで待つ
  yield;
}

Geckoコードによる拡張

SunScript/SPCは元々NPCや赤コインスイッチを処理するためのスクリプトなので、実現できる機能が限られています。幸い、Geckoコードと組み合わせて使えば、一部の状態のロードセーブや文字と図形の描画もできるようになります。

本チュートリアルは次のGeckoコードを使うことを想定します。

実行命令数の上限の引き上げ

デフォルトでは一回の実行(yieldまで)で最大32個の命令しか実行できません。このコードを使うことで、最大32767個の命令を実行できるようになります。

020dc6d2 00007FFF

メモリアクセス関数

このコードを使うことで、SunScriptでメモリの読み込み(readRAM)・書き込み(writeRAM)・コピー(memcpy)ができるようになります。メモリのアクセスができれば、マリオの状態のロードセーブ、QFタイマーの操作、押したボタンの判断といった、多くの機能を実現できるようになります。

コード
C20DCF1C 00000053
9421FFF0 93A10008
48000239 2C040000
8123001C 40A20010
3D40FFFF 39000001
48000084 81430020
7D244850 9123001C
55291838 7D0A482E
7CEA4A14 2C080000
40A2FFD8 28040001
81470004 418200A0
8127000C 28090010
4182007C 41810028
28090001 41820080
28090008 41A20034
69290001 814A0000
7D290034 5528D97E
48000024 2C09FFF0
41820054 2C09FFF8
40A2FFE0 894A0000
7D4A0774 48000008
894A0000 8123001C
80E30018 7C093800
4C800020 80C30020
55271838 39290001
7CA63A14 7D06392E
91450004 9123001C
4E800020 A14A0000
4BFFFFCC A94A0000
4BFFFFC4 814A0000
4BFFFF34 39200000
4BFFFF80 28040001
8123001C 40810054
81430020 7D244850
9123001C 55291838
7D0A4A14 7D2A482E
2C090000 40820034
28040002 81280004
8148000C 41820018
81080014 2C080008
41820014 2C080010
41820048 91490000
48000008 99490000
8123001C 81430018
7C095000 4C800020
81030020 552A1838
38C00000 39290001
7CC8512E 7CE85214
3940FFFF 91470004
9123001C 4E800020
B1490000 4BFFFFC4
28040003 8123001C
38E0FFFF 7D244850
9123001C 40820034
80C30020 55281838
7D464214 7D06402E
2C080000 4082001C
810A0008 2C080000
40820010 810A0010
21080000 7CE73910
81030018 7C094000
40800024 80C30020
55281838 38800000
39290001 7CA64214
7C86412E 90E50004
9123001C 2C070000
4CA20020 80AA0014
808A000C 806A0004
3D808000 398C31F4
7D8903A6 4E800420
72656164 52414D00
77726974 6552414D
006D656D 63707900
7FC802A6 3FA08012
3BBDBA08 38BE0000
389E021C 7FE3FB78
7FA803A6 4E800021
38BE00E8 389E0224
7FE3FB78 7FA803A6
4E800021 38BE0184
389E022D 7FE3FB78
7FA803A6 4E800021
83A10008 38210010
8001001C 00000000

画面の描画

spフォルダに入れた.sbファイルはQF毎に実行されるため、画面の描画に向いていません。このコードを使えば、HUDが描画される度に描画用のスクリプト(ss/draw2d.sb)が実行されます。これを使ってフルーツの位置やタイマーといった文字の描画(drawText)ができます。

コード
077F0238 00000114
9421FED8 7C0802A6
BF810118 7C7F1B78
9001012C 7C9E2378
90C100B8 7CBD2B78
90E100BC 7D1C4378
912100C0 914100C4
40860024 D82100C8
D84100D0 D86100D8
D88100E0 D8A100E8
D8C100F0 D8E100F8
D9010100 39200600
390100BC B12100A0
39210130 912100A4
392100A8 912100A8
808D97F8 38E100B8
7FA6EB78 38A00000
38610008 6FDE8000
4A826AF5 3D204330
91210108 3D40817F
93C1010C 6FFF8000
C00A0348 38610070
C9810108 91210110
3D20817F 93E10114
FC4C0028 C0690344
C9810110 93A10064
FC2C0028 93A10060
4A8A43E9 38800000
38610070 4A8BD419
38C100A0 7F85E378
388000FF 38610008
4A826951 38610008
38210128 BB81FFF0
80010004 7C0803A6
4A826AEC 00000000
59800004 00000000

040DCF18 49716451
0410DA80 496E58AD
04206770 495ECB41
077F3000 00000418
28040006 8123001C
9421FF98 7C0802A6
7D244850 BFC10060
7C7E1B78 9001006C
9123001C 40A20084
81430020 55291838
38610008 7FEA4A14
813F0004 3BFF0010
91210048 4A8A126D
38610008 38800000
4A8BA6DD 39010038
39200004 7D034378
7D2903A6 80FF0000
39080004 815F0004
2C070001 40A2001C
9141005C 39210058
C001005C FC00001E
7C004FAE 81410058
9148FFFC 3BFF0008
4200FFCC 38810048
4CC63182 4AA0EE05
813E001C 815E0018
7C095000 4080000C
39290001 913E001C
39610068 48000300
28040005 8123001C
9421FF68 7C0802A6
7D444850 81630020
BFA1008C 7C7F1B78
9001009C 9143001C
408100F0 55291838
54841838 7D6B4A14
7D245850 81090000
81490004 2C080001
40A200F0 91410080
3941007C C0010080
FC00001E 7C0057AE
8061007C 81090008
8149000C 2C080001
40A20100 91410080
39410074 C0010080
FC00001E 7C0057AE
80810074 80A90014
39490030 80C9001C
39810020 80E90024
3BC10060 8109002C
39210040 7D204B78
7C0A5840 41A000F4
8121005C C101003C
9121001C 81210058
C0E10038 91210018
81210054 C0C10034
91210014 81210050
C0A10030 91210010
8121004C C081002C
9121000C 81210048
C0610028 91210008
C0410024 C0210020
81410044 81210040
4CC63242 4BFFD05D
813F001C 815F0018
7C095000 4080000C
39290001 913F001C
39610098 480001C4
6D4A8000 91410064
3D404330 91410060
3D40817F C00A3410
39410078 C9810060
FC0C0028 FC000018
FC00001E 7C0057AE
80610078 4BFFFEF8
6D4A8000 9141006C
3D404330 91410068
3D40817F C00A3410
39410070 C9810068
FC0C0028 FC000018
FC00001E 7C0057AE
80810070 4BFFFEE8
83AA0000 2C1D0001
40A20020 7C0C0040
40A0FEF8 C00A0004
398C0004 D00CFFFC
394A0008 4BFFFEE4
7C09F040 40A0FEDC
83AA0004 39290004
93A9FFFC 4BFFFFE4
9421FFF0 7C0802A6
BFC10008 3FE0817F
3BFF3414 90010014
7CDE3378 4CC63182
4A825B95 813F0014
2C090000 41820048
7FC3F378 4A841F45
38800000 38600018
4A8B5731 38600001
38C0000F 38A00005
38800004 4A8B93ED
80010014 807F0014
83C10008 7C0803A6
83E1000C 38210010
4A923BF4 39610010
4800009C 9421FFF8
7C0802A6 9001000C
4CC63182 4A904E59
8001000C 3CA0817F
3C80817F 3C60817F
38A533DC 388433F1
38633414 7C0803A6
38210008 4A8E93AC
9421FFF0 7C0802A6
90010014 93E1000C
7C7F1B78 4A97FD61
3CA0817F 3C80817F
7FE3FB78 38A530C8
388433FC 4A928675
80010014 3CA0817F
3C80817F 7FE3FB78
83E1000C 38A53000
38843405 7C0803A6
38210010 4A92864C
83ABFFF4 83CBFFF8
800B0004 83EBFFFC
7C0803A6 7D615B78
4E800020 2F636F6D
6D6F6E2F 73732F64
72617732 642E7362
00647261 7732642E
73756E00 64726177
54657874 00647261
77526563 74000000
59800004 00000000

練習:QFの表示

早速ゲーム内の描画を試してみましょう。例としてずらしたQFを表示してみます。

draw2d.sunというファイルを作成し、次のコードをファイルに追加します。

// 準備
builtin readRAM(addr, ...);
builtin writeRAM(addr, value, ...);
builtin drawText(x, y, size, col1, col2, fmt, ...);
var const gpMarDirector = $8040A2A8;
var ptr = readRAM(gpMarDirector)+0x58; // Game QFのメモリアドレス

// 無限ループ
while (1) {
  // QFを取得
  var qf = readRAM(ptr)%4;
  // "QF 1"といった文字を表示
  drawText(
    // x=24, y=350, フォントサイズ=25
    24, 350, 25,
    // 色: #2ee5b8(不透明度ff) 単色
    0x2ee5b8ff, 0x2ee5b8ff,
    // フォーマット
    "QF %d", qf
  );
  yield;
}

sscでコンパイルし、WiiExplorerでssというフォルダを作成してdraw2d.sbを入れます。draw2d.sb

保存してDolphinを実行します。このように左側にQF Xといった文字が表示されれば成功です。QF Preview

余力があればdraw2d.sunを少し変えてみて、文字の位置、サイズ、色などを変えてみましょう。

SunScriptの文法などは次回から解説していきます。

付録

リソース