commit 4eb91bf33f57733821da5f5e37820f7eca4e3c0c Author: sup39 Date: Tue Mar 1 20:17:14 2022 +0900 init: sl, infodump, controller diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..af788f7 --- /dev/null +++ b/LICENSE @@ -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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8335aa1 --- /dev/null +++ b/README.md @@ -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) diff --git a/draw2d-infodump.sun b/draw2d-infodump.sun new file mode 100644 index 0000000..d154580 --- /dev/null +++ b/draw2d-infodump.sun @@ -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; +} diff --git a/sl.sun b/sl.sun new file mode 100644 index 0000000..2928a89 --- /dev/null +++ b/sl.sun @@ -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; +} diff --git a/top2d-controller.sun b/top2d-controller.sun new file mode 100644 index 0000000..89c3342 --- /dev/null +++ b/top2d-controller.sun @@ -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; +}