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