init: sl, infodump, controller
This commit is contained in:
commit
4eb91bf33f
5 changed files with 323 additions and 0 deletions
22
LICENSE
Normal file
22
LICENSE
Normal 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
18
README.md
Normal 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
65
draw2d-infodump.sun
Normal 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
73
sl.sun
Normal 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
145
top2d-controller.sun
Normal 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;
|
||||||
|
}
|
Loading…
Reference in a new issue