init: sl, infodump, controller

This commit is contained in:
sup39 2022-03-01 20:17:14 +09:00
commit 4eb91bf33f
5 changed files with 323 additions and 0 deletions

22
LICENSE Normal file
View file

@ -0,0 +1,22 @@
Copyright (c) 2022 sup39[サポミク]
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

18
README.md Normal file
View file

@ -0,0 +1,18 @@
# supSunScript
サポミクのSunScriptサンプルコードの置き場
## 準備
- [ssc v1.2.1-sup39-0.2](https://github.com/sup39/ssc/releases/tag/v1.2.1-sup39-0.2)
- 必要なGeckoコード([ドキュメント](https://sms.sup39.dev/SunScript/doc/)を参照)
## ファイル
- [sl.sun](sl.sun):赤コイン数とアイテムの状態保存
- [draw2d-infodump.sun](draw2d-infodump.sun):情報表示
- [top2d-controller.sun](top2d-controller.sun):コントローラ入力の描画
## リンク
- [ドキュメント](https://sms.sup39.dev/SunScript/doc/)
- [SunScriptのチュートリアル](https://sms.sup39.dev/SunScript/tutorial/)
- [SunScriptの文法](https://github.com/sup39/ssc/blob/master/language.md)
- [ssc](https://github.com/sup39/ssc/releases/tag/v1.2.1-sup39-0.2)
- [SSC Builtin and standard utility](https://docs.google.com/document/d/1pagfgljMZ2ca6e7VMPSl3PCQCii6ycvsAnCCur46lu4/edit)

65
draw2d-infodump.sun Normal file
View file

@ -0,0 +1,65 @@
import "ssc/common.sun";
import "ssc-sup39/common.sun";
// 描画の関数をインポート(対応するGeckoコードも忘れずに)
import "ssc-sup39/draw-lite.sun";
builtin setMTX(x);
// ポインタの準備
var ptrMario = readRAM(gpMarioOriginal);
while (1) {
/**** 情報表示 ****/
drawText(
// (x, y) = (16, 200)
16, 200,
// フォントサイズ = 20(デフォルト)
20,
// 文字の色: #ffffff(不透明度ff)=白 単色
$ffffffff, $ffffffff,
// 文字のフォーマット
// 参考https://ja.wikipedia.org/wiki/Printf#%E6%9B%B8%E5%BC%8F%E5%8C%96%E6%96%87%E5%AD%97%E5%88%97
// 注意:ひらがなとカタカナは使えるが、漢字は基本的には使えない
"X %.3f\nY %.3f\nZ %.3f\nかくど %hu\nHそくど %.2f\nVそくど %.2f",
// TMario構造体https://docs.google.com/spreadsheets/d/1ElTW-akaTUF9OC2pIFR9-7aVPwpJ54AdEVJyJ_jvg0E/edit#gid=1550544746
// x (float): %.3f (小数点以下3桁まで)
readRAM(ptrMario+0x10, TYPE_FLOAT),
// y (float): %.3f (小数点以下3桁まで)
readRAM(ptrMario+0x14, TYPE_FLOAT),
// z (float): %.3f (小数点以下3桁まで)
readRAM(ptrMario+0x18, TYPE_FLOAT),
// 角度 (uint16/ushort): %hu (h=16bit, u=符号なし)
readRAM(ptrMario+0x96, 16),
// H速度 (float): %.2f (小数点以下2桁まで)
readRAM(ptrMario+0xB0, TYPE_FLOAT),
// V速度 (float): %.2f (小数点以下2桁まで)
readRAM(ptrMario+0xA8, TYPE_FLOAT)
);
/**** その他の文字の表示 ****/
// 欲しくない場合は以下を【コメントアウト(comment out)】する
// (すなわち、各行の前に「//」を追加するか「/* */」で囲むことでコメントにして実行しないようにする)
// --------
// 長方形の描画
drawRect(
// 塗りつぶしの色: #00ffff(不透明度1a)=不透明度10%の水色
$00ffff1a,
// (x0, y0) = (232, 438)
232, 438,
// (x1, y1) = (362, 462)
362, 462
);
// 文字の描画
drawText(
// (x, y) = (234, 460): 文字の左下端の座標。長方形の(x0, y1)に対応
234, 460,
// フォントサイズ = 20
20,
// 文字の色: #de4977~#f6f6f6(不透明度100%)のグラデーション
$de4977ff, $f6f6f6ff,
// 表示する文字
"ミファーxシド"
);
// 各フレームの描画はここまで
yield;
}

73
sl.sun Normal file
View file

@ -0,0 +1,73 @@
/**** [1] インポート ****/
import "ssc/common.sun";
import "ssc-sup39/common.sun";
/**** [2] 変数宣言 ****/
// ポインタの準備
var itemManager = readRAM(gpItemManager);
var const slotBase = $817d1000;
// 赤コイン数のフラグID
var const SYSF_REDCOINNUM = 0x60000;
// セーブした状態があるかどうか(初期化を確保)
var ready = 0;
// 前のQFに押されたボタン
var btn0 = 0;
// 局所変数
var slot, var itemCount, var ptrItem;
/**** [3] メイン関数 ****/
while (1) {
// 押されたボタン(16 bitの整数)
var btn = readRAM(addrButton, 16);
if (btn == PRESS_DL && !(btn0 & PRESS_DL)) {
/** セーブ **/
/*
押されたボタンは十字キー左であり、
前に押されたボタンに十字キー左が含まれない
(押された瞬間だけ考える。押しっぱなしは無視)
*/
// 準備
ready = 1; // これでセーブした状態がある
slot = slotBase; // セーブする状態へのポインタをリセット
// 赤コイン数
writeRAM(slot, getSystemFlag(SYSF_REDCOINNUM));
slot += 4;
// アイテムの状態
itemCount = readRAM(itemManager+0x14);
ptrItem = readRAM(itemManager+0x18);
while (itemCount--) { // 各アイテムに対して
// セーブ
writeRAM(slot, readRAM(readRAM(ptrItem)+0xf0));
// 次へ
ptrItem += 4;
slot += 4;
}
} else if (btn == PRESS_DR && !(btn0 & PRESS_DR) && ready) {
/* ロード */
/*
押されたボタンは十字キー右であり、
前に押されたボタンに十字キー右が含まれない
かつ既にセーブした状態がある
*/
slot = slotBase; // セーブした状態へのポインタをリセット
// 赤コイン数
setSystemFlag(SYSF_REDCOINNUM, readRAM(slot));
slot += 4;
// アイテムの状態
itemCount = readRAM(itemManager+0x14);
ptrItem = readRAM(itemManager+0x18);
while (itemCount--) { // 各アイテムに対して
// ロード
writeRAM(readRAM(ptrItem)+0xf0, readRAM(slot));
// 次へ
ptrItem += 4;
slot += 4;
}
}
// 前のQFに押されたボタンはこのQFに押されたボタンとなる
btn0 = btn;
// このQFの実行はここまで
yield;
}

145
top2d-controller.sun Normal file
View file

@ -0,0 +1,145 @@
import "ssc/common.sun";
import "ssc-sup39/common.sun";
// 描画の関数をインポート(対応するGeckoコードも忘れずに)
import "ssc-sup39/draw.sun";
// 平行移動のための行列(48 byte: 817d0000~817d002f)
var const mtx = $817d0000;
// mtxを(dx, dy)=(210, 324)の平行移動行列にする
setMTX(mtx, MTX_NEW, 210.0, 324.0);
while (1) {
// 線の太さを16にする
setLineWidth(16);
// 描画の座標にmtxを適用する
setMTX(MTX_LOADIMM, mtx);
// コントローラ入力の背景となる長方形の描画(描画行列をリセットしない)
drawRect($0000003f, STROKE_NONE, -8.0, -8.0, 182.0, 112.0, false);
/**** メインスティックとCスティックの描画 ****/
// メインスティック
var const MStickX = 28.0; // 中心のx座標
var const MStickY = 42.0; // 中心のy座標
var const MStickCS = $eeeeeebf; // 輪郭(線)の色
var const MStickCF = $eeeeeedf; // スティック本体の円(塗りつぶし)の色
// Cスティック
var const CStickX = 60.0;
var const CStickY = 82.0;
var const CStickCS = $ffd300bf;
var const CStickCF = $ffd300df;
// スティック共通
var const StickRS = 20.0; // (輪郭の)半径
var const StickRF = 13.0; // (スティック本体の円の)半径
var const StickRO = 12.0; // スティックの最大移動
// メインスティックの輪郭(8角形)
// 描画の変換表列を【mtx * (半径=StickRS, x座標=MStickX, y座標=MStickY)の行列】にする
setMTX(MTX_LOADIMM, mtx, StickRS, MStickX, MStickY);
// mtx*(MStickX, MStickY)で半径StickRSの8角形・MStickCS色の輪郭(stroke)が描画される
drawNgon(FILL_NONE, MStickCS, 8);
// Cスティックの輪郭(8角形)
setMTX(MTX_LOADIMM, mtx, StickRS, CStickX, CStickY);
drawNgon(FILL_NONE, CStickCS, 8);
// メインスティック本体(円->32角形で近似)
setMTX(MTX_LOADIMM, mtx, StickRF,
// readRAM(addrMStickX, TYPE_FLOAT)でメインスティック入力(0.0~1.0)を読み込む
// 入力が1.0の時に中心(MStickX)からStickROだけ平行移動させる
MStickX+readRAM(addrMStickX, TYPE_FLOAT)*StickRO,
// 上が負であることに注意
MStickY-readRAM(addrMStickY, TYPE_FLOAT)*StickRO
);
drawNgon(MStickCF, STROKE_NONE, 32);
// Cスティック本体(円->32角形で近似)
setMTX(MTX_LOADIMM, mtx, StickRF,
CStickX+readRAM(addrCStickX, TYPE_FLOAT)*StickRO,
CStickY-readRAM(addrCStickY, TYPE_FLOAT)*StickRO
);
drawNgon(CStickCF, STROKE_NONE, 32);
/**** ボタンの描画 ****/
// ボタン入力(16bit)
var btn = readRAM(addrButton, 16);
var const AButtonX = 134.0;
var const AButtonY = 56.0;
var const AButtonR = 18.0;
var const AButtonC = $2ee5b8bf;
var const BButtonX = 109.0;
var const BButtonY = 79.0;
var const BButtonR = 9.0;
var const BButtonC = $ff1a1abf;
// Aボタンの輪郭と本体(24角形で円を近似)
setMTX(MTX_LOADIMM, mtx, AButtonR, AButtonX, AButtonY);
// [Aが押された場合 ? AButtonC色で塗りつぶす : 塗りつぶしなし]
drawNgon([btn&PRESS_A ? AButtonC : FILL_NONE], AButtonC, 24);
// Bボタンの輪郭と本体(16角形で円を近似)
setMTX(MTX_LOADIMM, mtx, BButtonR, BButtonX, BButtonY);
drawNgon([btn&PRESS_B ? BButtonC : FILL_NONE], BButtonC, 16);
var const XButtonX = 160.0;
var const XButtonY = 40.0;
var const XButtonR = 8.0;
var const XButtonC = $eeeeeebf;
var const YButtonX = 115.0;
var const YButtonY = 31.0;
var const YButtonR = 8.0;
var const YButtonC = $eeeeeebf;
var const ZButtonX = 140.0;
var const ZButtonY = 21.0;
var const ZButtonR = 5.0;
var const ZButtonC = $9494ffbf;
var const SButtonX = 87.0; // スタート
var const SButtonY = 54.0;
var const SButtonR = 5.0;
var const SButtonC = $eeeeeebf;
// Xボタンの輪郭と本体(16角形で円を近似)
setMTX(MTX_LOADIMM, mtx, XButtonR, XButtonX, XButtonY);
drawNgon([btn&PRESS_X ? XButtonC : FILL_NONE], XButtonC, 16);
// Yボタンの輪郭と本体(16角形で円を近似)
setMTX(MTX_LOADIMM, mtx, YButtonR, YButtonX, YButtonY);
drawNgon([btn&PRESS_Y ? YButtonC : FILL_NONE], YButtonC, 16);
// Zボタンの輪郭と本体(16角形で円を近似)
setMTX(MTX_LOADIMM, mtx, ZButtonR, ZButtonX, ZButtonY);
drawNgon([btn&PRESS_Z ? ZButtonC : FILL_NONE], ZButtonC, 16);
// スタートボタンの輪郭と本体(16角形で円を近似)
setMTX(MTX_LOADIMM, mtx, SButtonR, SButtonX, SButtonY);
drawNgon([btn&PRESS_S ? SButtonC : FILL_NONE], SButtonC, 16);
/**** トリガーの描画 ****/
var const LTriggerX0 = 8.0;
var const RTriggerX1 = 166.0;
var const TriggerW = 64.0;
var const TriggerY0 = 0.0;
var const TriggerH = 8.0;
var const TriggerFill = $dfdfdfbf;
var const TriggerStroke = $eeeeeebf;
// Lトリガーの輪郭
setMTX(MTX_LOADIMM, mtx, TriggerW, TriggerH, LTriggerX0, TriggerY0);
drawRect(FILL_NONE, TriggerStroke, 0, 0, 1, 1, false);
// Lトリガーの塗りつぶし
setMTX(MTX_LOADIMM, mtx,
// Lが押された ? 1.0倍 : 0.9倍の入力(0.0~1.0)
TriggerW * [btn&PRESS_L ? 1.0 : 0.9*readRAM(addrLTrig, TYPE_FLOAT)],
TriggerH, LTriggerX0, TriggerY0);
drawRect(TriggerFill, STROKE_NONE, 0, 0, 1, 1, false);
// Rトリガーの輪郭
setMTX(MTX_LOADIMM, mtx, -TriggerW, TriggerH, RTriggerX1, TriggerY0);
drawRect(FILL_NONE, TriggerStroke, 0, 0, 1, 1, false);
// Rトリガーの塗りつぶし
setMTX(MTX_LOADIMM, mtx,
// 左側に延びることに注意
TriggerW*[btn&PRESS_R ? -1.0 : -0.9*readRAM(addrRTrig, TYPE_FLOAT)],
TriggerH, RTriggerX1, TriggerY0);
drawRect(TriggerFill, STROKE_NONE, 0, 0, 1, 1, false);
/**** その他(常に)描画したものがあれば ****/
drawRect($00ffff1a, 232, 438, 362, 462); // (描画の行列をリセット)
drawText(234, 460, 20, $de4977ff, $f6f6f6ff, "ミファーxシド");
// 各フレームの描画はここまで
yield;
}