↓ 若干重いから新しいページ作った
Stonescript おべんきょう 2 - Stone Story RPGを機械翻訳 + 備忘録
モンテスちゃんの旧学び場です
…勝手に引用しちゃうもんね👶!!
可愛いモンテスに免じて許してください
名前:モンモンモンテス
(:зꇤ )ニ キュ
JavaScriptとpythonの講座。とても安眠効果がある。
2023/11/22 もはやスクリプトは一切追記してない
developer.mozilla
python.jp
東京大学Pythonプログラミング入門教材
- 色々
- 多方向に対応したスワイプを作ってみよう
- 小さい四角を移動させてみよう
- 正方形に近くなるマス目
- canvasで座標の補助線を表示するスクリプトを直してもらった
- Stonescriptが反映されない原因?
- 可愛いフォントがおったそうな
- 2024/03/02 イベント
- canvasの計算
- ボタン押下でblend変更
- canvas色々保存
- ポーションボタン(擬似透過)
- 行動の誤作動
- ログ表示に背景色をつけてサイバーチックにしてみる
- ログ書き込み修正
- コンポーネントの枠線を色々変えてみる
- スキル発動中に台詞を追加してみる
- プレイヤー/敵のバフ/デバフ数をintで取得
- 1つのボタンに複数の役割を持たせる
- if文でreturn
- スライド表示
- 特定の条件でキャンバス追加(多重追加)
- スクリプトでマスクを発動しよう
- 配列の要素を画面の高さ分追加(それ以上は追加しない)
- スキル分岐
- 円を描く演算いじいじ
- 配列とtime関連の認識改め
- 指定地点に近付くほど減速
- string.Formatで右寄せ左寄せ
- ブックマークレット
- 配列の概念
- this.でグローバル変数呼び出し
- varの一時的なデッドゾーン
- 4次元配列を試す
- Lambdaにもう一度触れてみる
- uiのCanvasが難しい
- FPS表示その2
- 指定座標へアニメーション表示
- hpとアーマー値を合わせる
- 処理の使い分け
- 実行関数を関数で判定
- ラムダ式(Lambda)
- Stone Story RPGの知識階級
- コネコネタイム
- 親コンポーネント設定
- 敵のchill数だけ数字として取り出す
- 演算でプレイヤー周りに星をクルクル表示
- アニメーション表示
- varを書いてみる
- 使える文字(一部)
- モバイル版でマインドストーンを途中で開く
- FPSチェッカー
- 文字列の数字を数値として扱うにはどうすればいいですか?
- 東京大学の教材"Pythonプログラミング入門"をみてみる
- for (ループ)
- func
色々
多方向に対応したスワイプを作ってみよう
スワイプの話題がdiscordで挙がっていたので、
多方向(斜め検出可能な8方向とか)に対応したスワイプを実現する為に、必要なものを揃えてみまする
今回必要なものはタッチ開始を基点とした角度と距離としておきます
ゲームを作るにしても、これらを用意しておけばスワイプでキャラクター操作の速度を調節できたり、斜め移動も可能になったりと、なんだか楽しそうですね
スワイプの角度処理は面倒で作ってないけど、必要な物は用意できたと思ふ👶タブン
もはやスワイプと名乗ってはいけないんだと思いますが、まぁおいといて(おいとくぬぁ)
今まで使ってこなかったネイティブ関数を活用してみたのだ
今回初めて登場する子達
↓ Manualまとめの項目にジャンプ
math.Sqrt(num)
math.ToDeg(num)
math.Atan2(y, x)
math.pi
math.RoundToInt(num)
公式(英語)のmanualはこっち
わかりやすい解説があったのでぺたぺた
外部リンク
2点の座標(線分)からラジアンを求める
2点の座標(線分)から距離を求める
直角三角形の斜辺を求める
var touch_enabled = false touch_start() // タッチ開始 func touch_start() ?key = "Begin" & ! loc.begin touch_enabled = true return true return false // テンプレ 配列の値2つ書き換え func update_array(arr,val_1,val_2) ?arr.Count() = 1 arr.Emplace(0,[val_1,val_2]) ?arr.Count() = 0 arr.Add([val_1,val_2]) // 斜辺の長さを求める func hypot(dx, dy) return math.RoundToInt( ^ math.Sqrt(dx * dx + dy * dy)) var swipe_inp_1 = [] var swipe_inp_2 = [] var swipe_inp_3 = [] var swipe_toggle = 0.0 var swipe_length = 0.0 var swipe_rad = 0.0 var swipe_deg = 0.0 func update_swipe() // タッチ開始 ?key = "Begin" & ! loc.begin update_array(swipe_inp_1,input.x,input.y) // タッチ移動中 ?key = "primary" ^& key ! "Begin" ^& key ! "End" update_array(swipe_inp_2,input.x,input.y) swipe_toggle = hypot( ^ swipe_inp_2[0][0] - swipe_inp_1[0][0] ^,swipe_inp_2[0][1] - swipe_inp_1[0][1]) return true // タッチ終了 ?key = "End" update_array(swipe_inp_3, input.x, input.y) swipe_length = hypot( ^ swipe_inp_3[0][0] - swipe_inp_1[0][0] ^,swipe_inp_3[0][1] - swipe_inp_1[0][1]) swipe_rad = math.Atan2( ^ swipe_inp_3[0][1] - swipe_inp_1[0][1] ^,swipe_inp_3[0][0] - swipe_inp_1[0][0]) // + math.piがない場合、-180(付近)〜180° swipe_deg = math.RoundToInt( ^ math.ToDeg(swipe_rad + math.pi)) touch_enabled = false return true : return false // 実行 スワイプに必要なものたち ?touch_enabled update_swipe() // 動作テスト >`1,1,ascii touch_enabled @touch_enabled@ swipe_toggle @swipe_toggle@ swipe_length @swipe_length@ swipe_rad @swipe_rad@ swipe_deg @swipe_deg@ asciiend // タッチ位置を見やすく draw.BG(0,0,#222222,screen.w,screen.h)
追加でswipe_enabledとか作ったり、もう少しまとめてみたりなんだりとしたいですが、とりあえずしうりょう◦<(:3[▓]
見慣れないradianと馴染みのあるdegree表記はわけておきまんた
どんなものかちょっと見たかった
小さい四角を移動させてみよう
チラつきが目に悪い
▼ 小さい四角を画面下に移動
var y = 0 var text = "▀" ?totaltime % 2 = 1 text = "▀" text = "▄" ?totaltime % 2 = 0 y++ ?y = screen.h-1 y = 0 >`1,@y@,@text@
正方形に近くなるマス目
8×9マスが1番正方形に近いなりね👶
画面表示のマス目でいうと8×4.5
4.5マスゥ?
uiAdd.styleに使用する記号を入れておけば微妙な位置に記号を配置できるという裏技が(´ω`)
あとは"▄"、"▀"、canvas.SetBG(color)を駆使すれば表現出来る…?凹〇 コテッ
Vector…ワカリマシェン
気が向いたらなにかドット絵で作ってみるかもしれない
折角だから、やたら発光させてみたり
…それはまぁおいといて
座標の補助線を表示するスクリプトの流れ(とうとつぅ)
縦軸はフレーム経過
横軸は内部処理の順番を意識したもの…を少し整形
またいつかこんな事をするかもしれなひ
▼ 作る前はこんな感じで大雑把にカキカキ
皆はどういう手順で書いてるんだろう?
いきなりガリガリ書き始められるのかな
canvasで座標の補助線を表示するスクリプトを直してもらった
自分は何を作ったか知ってるけど、相手は何をどんな流れで作ったか知らない状況でスクリプトを読むということが抜けてた👶ソーリー
ありがとうございめす!
プリント座標位置の補助線-修正してもらったもの
var inp_x var inp_y var root_children var sh = screen.h var sw = screen.w var s_size = string.Size inp_x = input.x inp_y = input.y root_children = ui.root.children var cnvs_ruler_arr = [] // テンプレ キャンバス設定 func set_cnvs_arr(arr,idx,x,y,w,h,blend,color) ?arr.Count() ! 0 arr[idx].x = x arr[idx].y = y arr[idx].w = w arr[idx].h = h arr[idx].blend = blend arr[idx].SetFG(color) arr[idx].SetBG(color) arr[idx].anchor = "top_left" arr[idx].dock = "top_left" // まとめ ルーラー設定 func set_cnvs_ruler() var arr = cnvs_ruler_arr ?arr.Count() = 6 // set_cnvs_arr(arr,idx,x,y,w,h,blend,color) set_cnvs_arr(arr,0,0,inp_y,sw,1,"Multiply","#8873E8") set_cnvs_arr(arr,1,0,inp_y,sw,1,"Divide","#778A08") set_cnvs_arr(arr,2,0,inp_y,sw,1,"Add","#070537") set_cnvs_arr(arr,3,inp_x,0,1,sh,"Multiply","#8873E8") set_cnvs_arr(arr,4,inp_x,0,1,sh,"Divide","#778A08") set_cnvs_arr(arr,5,inp_x,0,1,sh,"Add","#070537") var ruler_enabled = false var prev_ruler_enabled=false var ruler_recycle_duration = 0 // 画面タッチ検出 func detect_touch_start() ?key = "primary" ^& key ! "primaryEnd" ^& ! loc.begin ^& ! loc.loop ruler_enabled = true ruler_recycle_duration = 0 return true return false var ruler_duration_toggle = false detect_touch_end() // 画面タッチ検出終了 func detect_touch_end() ?key = "primaryEnd" ^& ! loc.begin ^& ! loc.loop ruler_duration_toggle = true ruler_recycle_duration = 0 // タッチした位置の座標表示(後で手直し) func show_ruler_pos() var color = "#996FFF" var x = s_size("Y " + inp_y) / - 2 ?ruler_enabled >`@1+inp_x+x@,1,@color@,Y @inp_y@ >`1,@inp_y@,@color@,X @inp_x@ // キャンバス追加〜設定あれこれ更新 func update_cnvs_ruler() ?detect_touch_start() ?ruler_enabled&!prev_ruler_enabled ^& cnvs_ruler_arr.Count() = 6 for i = 0..5 cnvs_ruler_arr.Emplace(i,ui.AddCanvas()) ?cnvs_ruler_arr.Count() = 0 for i = 0..5 cnvs_ruler_arr.Add(ui.AddCanvas()) ?ruler_duration_toggle ruler_recycle_duration++ ?ruler_recycle_duration = 60 for i = 0..cnvs_ruler_arr.Count()-1 cnvs_ruler_arr[i].Recycle() ruler_duration_toggle = false ruler_enabled = false ruler_recycle_duration = 0 set_cnvs_ruler() show_ruler_pos() prev_ruler_enabled=ruler_enabled // 動作確認 //////////////////////////////////// >`1,6,ascii key @key@ time @time@ totaltime @totaltime@ ruler_enabled @ruler_enabled@ ruler_duration_toggle @ruler_duration_toggle@ ruler_recycle_duration @ruler_recycle_duration@ cnvs_ruler_arr.Count() @cnvs_ruler_arr.Count()@ root_children.Count() @root_children.Count()@ asciiend // main //////////////////////////////////////// ?loc.begin | loc.loop disable hud br update_cnvs_ruler()
Stonescriptが反映されない原因?
ホームでも変数が残ってる
画面表示の>h
基準使って表示させたからかな
Cosmetics(等)をホームでも反映させる仕様がバグを引き起こしてるのかな?そんな事はなかった
変数が残ってるわけじゃなかった
でも、そんな感じの挙動はほかの場面であるなぁ
コンポーネント弄ってる時は再起動しないと直らない事が殆どだったから(コピペでは直らなかった)、再起動で全ての変数が一度初期化されてるのかなぁ
一度ステージを出入りしないと反映されない変数も(変数というかコンポーネントというか)あったし
ちゃんとした書き方を学んだ方がいいんだろうなん
やらぬのだけど👩
本格的なプログラムのドキュメント見ると眠くなるんだよなぁ
(パイパイとは)
可愛いフォントがおったそうな
なんとなしにネットサーフィンしてたらこんなに可愛いフォントと巡り合ってしまった
なんで巡り合ったんだろう
{ }
波括弧が可愛すぎる
フォントは🔎
色々他のフォントと組み合わせて補ってるんだね
IBMのオリジナルフォントなんだ👶
というわけで、google fontsにあったので使ってみる
文字化けもフワフワしてきゃわっ꒰ ꒱
weight 300は目がチカチカする
weight 300 {}{}()[] item.CanActivate() item.GetCooldown("") <= 0 1234567890Oo○、。?!/#+×÷¥$<=>:*^|\~&・☆
対応文字が少なくてよく化けるけど かわ
weight 400 {}{}()[] item.CanActivate() item.GetCooldown("") <= 0 1234567890Oo○、。?!/#+×÷¥$<=>:*^|\~&・☆
ストーンスクリプト関係で検索してたはずなんだけどな〜?
2024/03/02 イベント
ポーション飲むクエスト 手動でいいんだけどしゃ
// アーマーポーションを飲んで退出(3回) ?loc.begin brew stone + tar activate potion ?item.potion = "Empty" loc.leave()
ポーション調合表
/*********************************************** コメントアウト item.potion Berserk wood + bronze Cleansing wood + tar Defensive stone + tar Experience wood Healing tar Invisibility stone + wood Lightning bronze Lucky stone + bronze Strength stone Vampiric tar + bronze ***********************************************/
石ころのアイテムのみを使って枯木の渓谷をクリアする
// 枯木3 func LR(itemL,itemR) equipL @itemL@ equipR @itemR@ func can_dash(itemR,dist) ?foe.distance <= dist ^& foe.distance > 10 ^& item.GetCooldown(itemR) <= 0 ^& item.CanActivate() ^& foe ! "immune_to_ranged" return true return false ?can_dash("bash",16) LR("triskelion","bash") :?can_dash("dash",16) LR("triskelion","dash") :?foe.distance <= 16 ?foe = "immune_to_ranged" ?foe.distance <= 9 & foe.distance > 5 equip skeleton_arm : LR("Stone sword","compound") : equip repeating :?pickup.distance <= 14 LR("triskelion","star") : LR("triskelion","compound") >`1,1,#999999,ascii L @item.left@ R @item.right@ asciiend
両手専用装備だと左手に武器表示されないからアウトかな〜と思ったら、クエスト達成出来るんですね
捨て台詞を吐かれつつ...(星3)
使い捨てのスクリプトでも長くなっちゃう...欲がね
でる( ◜ω◝ )
↓ せっかくなのでスクリプトを再利用
丈夫な盾でボスをスタンする(20回)
// 洞窟5 func LR(itemL,itemR) equipL @itemL@ equipR @itemR@ func can_dash(itemR,dist) ?foe.distance <= dist ^& foe.distance > 10 ^& item.GetCooldown(itemR) <= 0 ^& item.CanActivate() ^& foe ! "immune_to_ranged" return true return false ?can_dash("bash",16) LR("triskelion","bash") :?can_dash("dash",16) LR("triskelion","dash") :?foe.distance <= 16 ?foe = "phase" LR("quest","wand dP") ?foe.debuffs.string = ":debuff_damage:" LR("quest","compound") :?foe = "immune_to_ranged" ?foe.distance <= 9 & foe.distance > 5 equip skeleton_arm : LR("Stone sword","compound") : equip repeating :?pickup.distance <= 14 LR("triskelion","star") : LR("triskelion","compound") >`1,1,#999999,ascii L @item.left@ R @item.right@ @foe.debuffs.string@ asciiend
canvasの計算
ただしフィルターを複数通ると…ソレハシラナイ
ボタン押下でblend変更
加算、減算、乗算、除算の順に変更
( 'ࠔ')ノ 凸ポティ
var xxx = [] var blend_ = [ "add","subtract","multiply","divide"] func change_canvas_blend() var text_ = ["◀","▶"] var blend_c = "#4499EE" ?loc.begin | loc.loop xxx.Add(ui.AddButton()) // 0 xxx.Add(ui.AddButton()) // 1 xxx.Add(ui.AddCanvas()) // 2 for i = 0..1 // ボタン設定 xxx[i].x = 6 * i xxx[i].y = 6 xxx[i].text = text_[i] xxx[i].w = string.Size(xxx[i].text) + 4 xxx[i].h = 3 xxx[i].style = -1 xxx[i].SetPressed(change_blend) // キャンバス設定 xxx[2].w = screen.w xxx[2].h = screen.h xxx[2].blend = blend_[0] xxx[2].SetFG(blend_c) xxx[2].SetBG(blend_c) var blend_idx = 0 func change_blend(btn) ?btn = xxx[0] blend_idx-- ?blend_idx <= -1 blend_idx = blend_.Count()-1 ?btn = xxx[1] blend_idx++ ?blend_idx >= blend_.Count() blend_idx = 0 xxx[2].blend = blend_[blend_idx] change_canvas_blend() >o4,0,@blend_[blend_idx]@
canvas色々保存
色が壊れてしまう時あるけど…保存!特に青紫👶
▼ 青紫 線画反転
var xxx = [] ?loc.begin | loc.loop xxx.Add(ui.AddCanvas()) // 0 xxx.Add(ui.AddCanvas()) // 1 xxx[0].blend = "Multiply" xxx[0].SetFG(#9E20FF) xxx[0].SetBG(#9E20FF) xxx[1].blend = "Add" xxx[1].SetFG(#010022) xxx[1].SetBG(#010022)
▼ 紫 線画反転
var xxx = [] ?loc.begin | loc.loop xxx.Add(ui.AddCanvas()) // 0 xxx.Add(ui.AddCanvas()) // 1 xxx[0].blend = "Multiply" xxx[0].SetFG(#FF03F2) xxx[0].SetBG(#FF03F2) xxx[1].blend = "Add" xxx[1].SetFG(#0E0323) xxx[1].SetBG(#0E0323)
ポーションボタン(擬似透過)
あれだ >
とか他のものがcanvasの背景にあるとblendがアレ 色の予測が立てづらい
色相自体まるっきり変わるのはなんなんだろう
あと、ui系いじると再起動しないと反映されてない事が結構あるなぁ
アプリ起動してから1回、ステージの出入りしないと反応しないvarとか
これが本当に意味不ぅ
線の反転色を決めたいが為にまた長くなってしまわれた
var style_ = [ui.AddStyle("#########")] var purple_c = [ ["Add","#080808"] ,["Add","#01001C"] ,["Subtract","#00FF00"] ] var itemP_slct itemP_slct = string.Split(item.potion)[0] var itemP_obj = [] func set_potion_btn() // itemP_obj[idx[i]].blend var idx = [1,2,3] ?loc.begin | loc.loop disable hud ab itemP_obj.Add(ui.AddButton()) // 0 itemP_obj.Add(ui.AddCanvas()) // 1 itemP_obj.Add(ui.AddCanvas()) // 2 itemP_obj.Add(ui.AddCanvas()) // 3 // 共通設定 for i = 0..itemP_obj.Count()-1 itemP_obj[i].x = 1 itemP_obj[i].y = 2 itemP_obj[i].w = string.Size(itemP_slct) + 2 itemP_obj[i].h = 3 itemP_obj[i].anchor = top_left itemP_obj[i].dock = top_left // ボタン個別設定 itemP_obj[0].tcolor = #8873E8 itemP_obj[0].style = style_[0] itemP_obj[0].text = itemP_slct itemP_obj[0].SetPressed(push_potion) // キャンバス個別設定 for i = 0..purple_c.Count()-1 itemP_obj[idx[i]].blend = purple_c[i][0] itemP_obj[idx[i]].SetFG(purple_c[i][1]) itemP_obj[idx[i]].SetBG(purple_c[i][1]) func push_potion(btn) ?btn = itemP_obj[0] activate potion set_potion_btn() itemP_obj[0].text = itemP_slct for i = 0..itemP_obj.Count()-1 itemP_obj[i].w = string.Size(itemP_slct) + 2
行動の誤作動
画面表示でも実行しちゃうんだ
起動しちゃうんだきみぃ(:3 _ )=
コマンド系は除外されるかと思った
func test(item) ?item.CanActivate() equip @item@ activate R return true return false // @で計算してスキル起動しちゃう >@test("mask")@
ログ表示に背景色をつけてサイバーチックにしてみる
ちょっと暗い
画像が圧縮されてるのか、実際の色より暗く見える
▼ 氷の尾根 紫に怪しく光る月
▼ 枯木の渓谷 敵の色によって重なった部分が変色
黄色線が蛍光ピンク
水色線が青
明度によって紫系に変化
スクリプトは長いので折りたたみဗီူဗီူどうしてこんな事に
スクリプト表示
var size_ = string.Size // ログ取得 // [] = 0 | [[]] = 1 var iR_state_time = [] var iL_state_time = [] var f_id_dist = [] var f_state_time = [] var style_transparent = ui.AddStyle("#########") var style_fslash_1 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄") var style_fslash_2 = ui.AddStyle("⁄⁄⁄⁄#⁄⁄⁄⁄") var style_sun = ui.AddStyle("☼〜☼┊#┊☼〜☼") var style_dline = ui.AddStyle("╥–╥║#║╨–╨") var style_mul = ui.AddStyle("×××┊#┊×××") var style_cyrl_zhe = ui.AddStyle("жжж┊#┊жжж") // ボタン表示切り替え(未実装) var info_visibility = true // #ひな形-コンポーネント-基本設定-パーツ func set_base(name,x,y,w,h,doc_anc) name.x = x name.y = y name.w = w name.h = h name.dock = doc_anc name.anchor = doc_anc // #ひな形-キャンバス-設定-パーツ func set_blend(name,blend,BG_FG,color) name.blend = blend ?string.Equals(BG_FG,"FG") name.SetFG(color) ?string.Equals(BG_FG,"BG") name.SetBG(color) ?string.Equals(BG_FG,"BGFG") name.SetBG(color) name.SetFG(color) // #ひな形-キャンバス-設定-まとめ func set_canvas(name,parent,blend,BG_FG,color) set_base(name,0,0,parent.w,parent.h,left_top) set_blend(name,blend,BG_FG,color) // 画面表示-上 /////////////////////////////// // #ひな形-ログ-記録 func write_logs(arr,ins_val,max_row) ?arr.Count() arr.Insert(0,ins_val) ?arr.Count() = 0 arr.Add(ins_val) ?arr.Count() > 1 & (arr[0][0] = arr[1][0]) arr.RemoveAt(1) ?arr.Count() > max_row arr.RemoveAt(max_row) // #ひな形-ログ-表示 func show_logs( arr,topic,x,y,color_1,color_2,color_3) ?arr.Count() for i = 0..arr.Count()-1 >`@2+x@,@y@,@color_1@,@topic@ >`@2+x@,@1+y+i@,@color_2@,@arr[i][0]@.@arr[i][1]@ >`@2+x@,@1+y@,@color_3@,@arr[0][0]@.@arr[0][1]@ // &まとめ // ログ-記録---表示 // コンポーネント-追加---設定 func show_logs_top() var arr = [ iL_state_time ^ ,iR_state_time ^ ,f_state_time ^ ,f_id_dist ] var topics = [ "Ls.Lt" ^ ,"Rs.Rt" ^ ,"Fs.Ft" ^ ,"Fid.Fd" ] var logs = [ [item.left.state,item.left.time] ,[item.right.state,item.right.time] ,[foe.state,foe.time] ,[foe.id,foe.distance] ] var x = [1,11,21,31] var y = 1 var w = [10,10,10,30] var col = [10,20,30,60] var row = 5 var color = [ // (ログ見出し // ["#FFB520","#FFB520","#75FECF","#75FECF"] ["#A867D5","#A867D5","#D85696","#D85696"] // (キャンバス ,["#080808","#01001C","#00ff00" ,"#E363BF","#733B7D"] // (枠線 ,["#9957C4"] ] // (コンポーネント-追加-設定 var panel_top var canvas_top_0 var canvas_top_1 var canvas_top_2 ?loc.begin | loc.loop // (コンポーネント-追加 panel_top = ui.AddPanel() canvas_top_0 = ui.AddCanvas() canvas_top_1 = ui.AddCanvas() canvas_top_2 = ui.AddCanvas() // (コンポーネント-設定 // (パネル-設定 set_base(panel_top ^ ,x[0],y,col[col.Count()-1],row+2,top_left) panel_top.style = style_transparent panel_top.visible = false // (キャンバス-設定 // canvas_top_0 不要っぽい メモ set_canvas(canvas_top_0 ^ ,panel_top,"add","BGFG",color[1][0]) set_canvas(canvas_top_1 ^ ,panel_top,"add","BGFG",color[1][1]) set_canvas(canvas_top_2 ^ ,panel_top,"subtract","BGFG",color[1][2]) // (親設定 panel_top.Add(canvas_top_0) panel_top.Add(canvas_top_1) panel_top.Add(canvas_top_2) // (ログ-初期化 for i = 0..arr.Count()-1 arr[i].Clear() // (ログ-記録-表示-枠線表示 for i = 0..arr.Count()-1 // (ログ-記録 write_logs(arr[i] ^ ,[logs[i][0],logs[i][1]],row) // (ログ-表示 show_logs(arr[i],topics[i],x[i],y ^ ,color[0][i],color[1][4],color[1][3]) // (枠線-表示 draw.Box(x[i],y,w[i],row+2,color[2][0],style_fslash_2) // ログ表示 ///////////////////////////////// // 後で切り替えボタン実装 // 今は意味なしお ?info_visibility show_logs_top() : panel_top.visible = false // メモ ///////////////////////////////////// /* パネル(コンポーネント)の枠線はキャンバスで色が上乗せされるので、色変したい場合はdraw.Box // キャンバス設定お気に入り色 // 080808 暗め 加算 add 不要っぽい // 01001C 青紫 加算 add // 00ff00 原色緑 減算 subtract */
…こんな長いのメインスクリプトに入れたくないよ👶(?!)
っていうか 色もっと抑えた方がいいなぁ
ファンシーな色合いにしつつ
自然な配色 う〜ん
追記:キャンバスレイヤーの枚数によっては1枚目のブレンドモードが不透明のような扱いに変わってると思い、アイビスで色確認しやすいレイヤー3枚で確認していた…が!レイヤー2枚にしても同じだった
canvas_top_0いらないね…👀
どうしてこんな勘違いを起こしたんだろう?謎のcolもいるし(?)
手直し手直し
修正版
var equals_ = string.Equals var size_ = string.Size var iR_state_time = [] var iL_state_time = [] var f_id_dist = [] var f_state_time = [] var style_00 = ui.AddStyle("#########") var style_01 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄") var style_02 = ui.AddStyle("☼〜☼┊#┊☼〜☼") var info_visibility = true var iR iR = item.right var iL iL = item.left var iRs iRs = item.right.state var iLs iLs = item.left.state var iRt iRt = item.right.time var iLt iLt = item.left.time // #ひな形-コンポーネント-基本設定-パーツ func set_base(name,x,y,w,h,doc_anc) name.x = x name.y = y name.w = w name.h = h name.dock = doc_anc name.anchor = doc_anc // #ひな形-キャンバス-設定-パーツ func set_blend(name,blend,color) name.blend = blend name.SetBG(color) name.SetFG(color) // #ひな形-キャンバス-設定-まとめ func set_base_canvas(name,parent,blend,color) set_base(name,0,0,parent.w,parent.h,left_top) set_blend(name,blend,color) // ログ記録 func write_logs(logs,ins_val,max_row) ?logs.Count() logs.Insert(0,ins_val) ?logs.Count() = 0 logs.Add(ins_val) ?logs.Count() > 1 & (logs[0][0] = logs[1][0]) logs.RemoveAt(1) ?logs.Count() > max_row logs.RemoveAt(max_row) // ログ表示 func show_logs( logs,topic,x,y,color_1,color_2,color_3) ?logs.Count() for i = 0..logs.Count()-1 >`@x@,@y@,@color_1@,@topic@ >`@x@,@y+i+1@,@color_2@,@logs[i][0]@.@logs[i][1]@ >`@x@,@y+1@,@color_3@,@logs[0][0]@.@logs[0][1]@ // ログ-記録---表示 // & コンポーネント-追加---設定 func show_logs_top() var logs = [[iLs,iLt],[iRs,iRt] ,[foe.state,foe.time],[foe.id,foe.distance] ] var logs_arr = [iL_state_time,iR_state_time ,f_state_time,f_id_dist ] var topics = [ "Ls.Lt","Rs.Rt","Fs.Ft","Fid.Fd" ] var x = [1,11,21,31] var y = 1 var w = [11,11,11,30] var row = 5 var color = [ // 0(ログ見出し ["#A867D5","#A867D5","#D85696","#D85696"] // 1(キャンバス ,["#01001C","#00ff00"] // 2(トピック ,["#E363BF","#733B7D"] // (枠線 ,["#9957C4"] ] ?loc.begin | loc.loop // コンポーネント設定 set_base(panel_top ^ ,x[0],y,w[(w.Count()-1)]*2,row+2,top_left) panel_top.visible = false // 親設定 panel_top.Add(canvas_purple_1) panel_top.Add(canvas_purple_2) set_base_canvas(canvas_purple_1 ^ ,panel_top,"add",color[1][0]) set_base_canvas(canvas_purple_2 ^ ,panel_top,"subtract",color[1][1]) // ログクリア for i = 0..logs_arr.Count()-1 logs_arr[i].Clear() for i = 0..logs_arr.Count()-1 write_logs(logs_arr[i] ^ ,[logs[i][0],logs[i][1]],row) show_logs(logs_arr[i],topics[i],x[i]+2,y ^ ,color[0][i],color[2][1],color[2][0]) draw.Box(x[i],y,w[i],row+2 ^ ,color[2][0],style_02) ?loc.begin | loc.loop // 青紫キャンバスカラー変更 var panel_top = ui.AddPanel() var canvas_purple_1 = ui.AddCanvas() var canvas_purple_2 = ui.AddCanvas() ?info_visibility show_logs_top() : panel_top.visible = false
ログ書き込み修正
値が何もない(?)時に上書きされる問題を修正/.:°+╰( ˘ω˘ )╯;。:*\これできっと平気だよねっ
// [] = 0 | [[]] = 1 var a = [] // ログ記録 func write_logs(arr,ins_val,max_row) ?arr.Count() arr.Insert(0,ins_val) ?arr.Count() = 0 arr.Add(ins_val) ?arr.Count() > 1 & (arr[0][0] = arr[1][0]) arr.RemoveAt(1) ?arr.Count() > max_row arr.RemoveAt(max_row) // 確認用_ログ記録表示 func confirm_logs(arr) ?arr.Count() for i = 0..arr.Count()-1 >`1,1,arr.Count() = @arr.Count()@ >`2,@i+2@,[@i@] @arr[i][0]@.@arr[i][1]@ ?loc.begin | loc.loop a.Clear() // write_logs(arr,ins_val,max_row) write_logs(a,[foe.id,foe.distance],10) // confirm_logs(arr) confirm_logs(a)
コンポーネントの枠線を色々変えてみる
▼ コンポーネントの枠線色々
var style_01 = ui.AddStyle("#_#(#)#¯#") var style_02 = ui.AddStyle("#_#[#]#¯#") var style_03 = ui.AddStyle("◘≡◘┊#┊◘≡◘") var style_04 = ui.AddStyle("*•*┊#┊*•*") var style_05 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄") var style_06 = ui.AddStyle("⁄⁄⁄⁄#⁄⁄⁄⁄") var style_07 = ui.AddStyle("☼〜☼┊#┊☼〜☼") var style_08 = ui.AddStyle("╥–╥║#║╨–╨") var style_09 = ui.AddStyle("╥÷╥┊#┊╨÷╨") var style_10 = ui.AddStyle("×××┊#┊×××") var style_11 = ui.AddStyle("₪₪₪┊#┊₪₪₪") var style_12 = ui.AddStyle("╔═╗⏹#⏹╚═╝")
▼ パネルオブジェクトの枠線を変えてみる
?loc.begin | loc.loop var panel = ui.AddPanel() // パネル枠線確認(花っぽい) panel.style = ui.AddStyle("☼〜☼┊#┊☼〜☼")
▼ Styleをvarにいれて使ってみる
var custom_style = ui.AddStyle("☼〜☼┊#┊☼〜☼") ?loc.begin | loc.loop var panel = ui.AddPanel() // パネル枠線確認(花っぽい) panel.style = custom_style
▼ 敵情報をパネルに表示してみる(表示のガタつきに目を瞑りつつ)
var panel var text var custom_style = ui.AddStyle(" ^⁄⁄⁄ ^┊#┊ ^⁄⁄⁄ ^") // オブジェクト基本設定_パーツ func set_base(name,x,y,w,h,doc_anc) name.x = x name.y = y name.w = w name.h = h name.dock = doc_anc name.anchor = doc_anc ?loc.begin | loc.loop // オブジェクト追加 ///// panel = ui.AddPanel() text = ui.AddText() // オブジェクト設定 ///// panel.style = custom_style panel.visible = false text.x = 0 text.y = 1 // 親設定 /////////////// panel.Add(text) ?foe // オブジェクト設定 ///// // 親パネル set_base(panel,0,1,20,text.h,left_top) panel.visible = true // 子テキスト text.w = panel.w - 4 text.h = text.lines.Count() + 2 text.text = foe : panel.visible = false
スキル発動中に台詞を追加してみる
>
で表示させる情報は停止系の処理が挟まれると表示が消える(見えない?)ので、テキストオブジェクトを置いてみまする
追記: t.w,t.h(幅,高さ)プロパティ追加
というか >`
の画面表示はオブジェクトより表示の優先順位高いから、一時的に優先順位下がってるだけなのかな
▼ blade発動中に"台詞表示確認...etc"表示
?loc.begin | loc.loop // オブジェクト追加 var p = ui.AddPanel() var t = ui.AddText("[color=#red]台詞表示確認\nああああああああああ\n[/color]いいいいいいいいいい") // オブジェクト設定 p.visible = false t.w = string.Size(t.text) t.h = t.lines.Count() // 親子設定 p.Add(t) // オブジェクト設定_可視性変更 ?foe.distance <= 16 ^& item.GetCooldown("blade") <= 0 t.visible = true : t.visible = false // 以降テキスト表示確認 ?foe.distance <= 16 ^& item.GetCooldown("blade") <= 0 equip blade activate R : equipL triskelion equipR star
オブジェクトの種類(Panel,Text,Button...etc)によってウィンドウサイズのデフォルト値は異なるので、テキストの表示位置や幅はプロパティをいじる✍️👶
台詞の位置調整は相対座標("親.x = x",親.y = y")に
var x var y x = screen.FromWorldX(pos.x) y = screen.FromWorldZ(pos.z - pos.y)
あたりをつかう…のだと思う
絶対座標を使いたい場合はxxx.absoluteX
xxx.absoluteY
テキスト幅はテキストオブジェクトのプロパティでいじるんだね✍️情報アリガタイー
プレイヤー/敵のバフ/デバフ数をintで取得
おべんり╰(ˇωˇ )╯;。:*保存
関数に少し付け足してしまったけど
バフデバフの記号表示可愛いからさ(:3 _ )=
▼ プレイヤーのバフ取得で使ってみる
var buff_arr buff_arr = string.Split(buffs.string,",",":") var smite_i = [] var pickp_i = [] smite_i = extract_arr(buff_arr,"smite") pickp_i = extract_arr(buff_arr,"pick_pocket") // バフ/ デバフ取得 func extract_arr(arr,name) var index ?arr.Contains(name) index = arr.IndexOf(name) return [arr[index - 1] ^, int.Parse(arr[index + 1]) ^, int.Parse(arr[index + 2])] return ["",0,0] // カウントテスト ?smite_i[1] > 10 >`1,1,smiteが11以上になった ?pickp_i[1] = 5 >`1,2,pick_pocketが5になった // 表示テスト >o-3,-4,@smite_i[0]@ @smite_i[1]@.@smite_i[2]@ >o-3,-5,@pickp_i[0]@ @pickp_i[1]@.@pickp_i[2]@
1つのボタンに複数の役割を持たせる
ミントさんとポティさんの会話を見つつ
イベント終わってから色々試してみよう
(って何回も思ってるはずなんですけど!!)
イベント全然進んでにゃい🦥*̣̩⋆フェーン
▼ "退出"と"ログ非表示"⇔"ログ表示" 切り替えボタン
var parent_btn var loc_leave var info // 雛形_パネル設定 func set_panel(name,x,y,w,h,doc_anc) name.x = x name.y = y name.w = w name.h = h name.dock = doc_anc name.anchor = doc_anc name.style = -1 name.visible = false // 雛形_ボタン設定 func set_button(name,x,doc_anc,txt) name.x = x name.y = 0 name.h = parent_btn.h name.w = string.Size(txt) + 4 name.dock = doc_anc name.anchor = doc_anc name.style = -3 name.text = txt name.visible = true name.SetPressed(push) // 工程_ボタン設定 func process_set_property() var x = 0 var add = 1 // 親パネル set_panel(parent_btn,1,6,20,3,left_top) // 退出 set_button(loc_leave,x,left_top,"退出") x += loc_leave.w + add // ログ表示/非表示 set_button(info,x,left_top,"ログ非表示") // 雛形_ボタン幅/テキスト変更 func change_set_button(name,txt) name.text = txt name.w = string.Size(txt) + 4 var visible_info = false // ボタン押下分岐 func push(btn) ?btn = loc_leave loc.leave() >ボタン1が押されました :?btn = info & !visible_info visible_info = true change_set_button(info,"ログ表示") >ボタン2が押されました :?btn = info & visible_info visible_info = false change_set_button(info,"ログ非表示") >ボタン3が押されました ?loc.begin | loc.loop // パネル/ボタン追加 parent_btn = ui.AddPanel() loc_leave = ui.AddButton() info = ui.AddButton() // パネル/ボタン設定 process_set_property() // ボタンの親設定 parent_btn.Add(loc_leave) parent_btn.Add(info) // 表示切り替えテスト ?visible_info >`1,1,フレーム = @totaltime@ >`1,2,ログ表示 = @visible_info@
if文でreturn
2画面ブレードでの使用例
ifの後にreturn書くだけのがスクリプトがちょこちょこあったけど、なんとなく意味がわかった👶
スクリーン指定の方は例の使用法だと動かないので、return
をBlade()
に置換
真偽判定ちゃんとしておけばifの後にreturn書くだけでも良いんだなぁ
func BladeAt(i) return screen.i = i ^& foe.distance <= 16 & Blade() var waitToBlade = 0 func Blade() ?item.GetCooldown("blade") <= 0 waitToBlade++ screen.Next() ?waitToBlade > 30 equip blade activate R screen.ResetOffset() waitToBlade = 0 return true return false // 関数使用例1_敵の数指定: ?foe.count > 10 & Blade() return // 関数使用例2_スクリーン指定: ?BladeAt(2) Blade()
スライド表示
GIF変換ミスってアス比がおかしな事になってお〜るよ
,
(👀 )
var test_0 = 0.0 var test_1 = 0.0 var test_2 = 0.0 var test_3 = 0.0 var test_4 = 0.0 var floor_i = math.FloorToInt var lerp = math.Lerp ?key = "Begin" test_0 = 0.0 test_1 = 0.0 test_2 = 0.0 test_3 = 0.0 test_4 = 0.0 test_0 = lerp(test_0,screen.w*0.2,0.2) test_1 = lerp(test_1,screen.w*0.4,0.2) test_2 = lerp(test_2,screen.w*0.6,0.2) test_3 = lerp(test_3,screen.w*0.8,0.2) test_4 = lerp(test_4,screen.w*1.0,0.2) >`@floor_i(test_0)@,1,#ff0000,@test_0@\n█ >`@floor_i(test_1)@,3,#00ff00,@test_1@\n█ >`@floor_i(test_2)@,5,#0000ff,@test_2@\n█ >`@floor_i(test_3)@,7,#ffff00,@test_3@\n█ >`@floor_i(test_4)@,9,#00ffff,@test_4@\n█
特定の条件でキャンバス追加(多重追加)
returnすればui.Addxxx()とプロパティを同時に定義出来たんだね…シラナカッタヨ👉🏻👈🏻ツムツム
(いつもヒントありがとだっぴ)
こういう事ではないかもしれないけど!!!()
func change_display_color(FGBG,blend,color) var filter filter = ui.AddCanvas() filter.w = screen.w filter.h = screen.h filter.blend = blend ?FGBG = FG filter.SetFG(color) ?FGBG = BG filter.SetBG(color) return filter // 30フレーム毎にキャンバス追加 ?time%30 = 0 change_display_color(FG,"add","#220011") >FGフィルター追加〜 /* BGお試し版 ****************** FG,BGの同時適用とFG,BGを個別で適用する機会を儲けた方がFGとBGの関係が見えやすい…🦆フォン ?time%30 = 0 change_display_color(BG,"add","#220011") >BGフィルター追加〜 ******************************/
スクリプトでマスクを発動しよう
というクエストが出た
.:° 🌾🌾╰(ˇωˇ )╯🌾🌾;。:*
発動したらすぐ帰るのだ
?item.CanActivate() equipR mask activate R
配列の要素を画面の高さ分追加(それ以上は追加しない)
戦闘スクリプトォ?(・∀・`)シラヌヨ
▼ 画面左上に縦書きで"0 False" "1 False"...
var arr = [] // arrの要素1以上 // かつarrの要素数が画面の高さ未満 ?arr.Count() > 0 ^& arr.Count() < screen.h arr.Insert(0,false) :?arr.Count() = 0 arr.Add(false) for i = 0..arr.Count()-1 >`1,@i@,@i@ @arr[i]@ >`20,1,@arr.Count()@
特段見出しなしでシレッと動画を混ぜ込む おもちろい
▼ 再生リスト
スキル分岐
色々書いておかないと忘れちゃう
func can_sp_atk(dist,itemGC,itemR) return foe.distance <= dist & foe.hp > 0 ^& item.GetCooldown(itemGC) <= 0 ^& item.CanActivate() ^|(item.right = itemR ^& item.right.state = 2) func act(item) equip @item@ activate R func test() ?can_sp_atk(16,"hammer","heavy_hammer") act("heavy_hammer") return 1 :?can_sp_atk(10,"bardiche","bardiche") act("bardiche") return 2 :?can_sp_atk(16,"mask","mask") act("mask") return 3 : return 0 // 判定テスト >`1,1,ascii hammer @can_sp_atk(16,"hammer",heavy_hammer)@ bardiche @can_sp_atk(10,"bardiche",bardiche)@ mask @can_sp_atk(16,"mask",mask)@ asciiend >`1,5,#yellow,test @test()@
test()の使い道
True判定
?test()
?test() = 1〜3
?test() = true
False判定
:?(else if)
:(else)
?!test()
?test() = 0
?test() = false
!はクリアタイムを気にするならあまり使わないようにする…(👀 )
円を描く演算いじいじ
novaSwirl / novaSwirl.txt
written: Henry Thompson
↑ 演算の値を変えて挙動を変えてみ〜る
圧縮したGIFで見るとカクカクだぁ(•︠ˍ•︡)
imgur: なめらか版リンク
ビデオ → GIF変換
サイズ大きいGIFが貼れなひ
配列とtime関連の認識改め
discordの日本語チャンネルを見るとtime関連の話題が目に入った
timeとtotaltimeが1の時にloc.beginなんだね!
スクリプト共有スレッドもよきよき
…マニュアル直すのは気が向いたらဗီူメンドクチャイ…
item.xxx.timeは停止でフレームに差が出るのか〜
ほぇ〜👶
ていうか配列の書き換え方法とか色々知れて良かったε( c 'ω')モヤモヤが少し消えた
▼ "Poison","Vigor"と"",""が交互に表示
var arr = [[]] func write_arr(itemLR) arr[0] = itemLR return arr ?time%30 <= 16 write_arr([Poison,Vigor]) : arr[0] = ["",""] >`1,1,ascii Count() @arr.Count()@ arr[0][0] @arr[0][0]@ arr[0][1] @arr[0][1]@ asciiend
フレーム差確認
手動で停止すると差が出ない時もあった(内部的なものはちらぬ)
loc.Pause() >`1,1,ascii loc.begin @loc.begin@ time @time@ totaltime @totaltime@ Rs:Rt @item.right.state@:@item.right.time@ asciiend
指定地点に近付くほど減速
var n = 0.0 var ceil_i = math.CeilToInt ?key = Begin n = 0.0 n = math.Lerp(n,screen.w-1,0.02) // 画面表示 >`@ceil_i(n)@,1,#FE1F6D,▄ >`1,2,ascii key#=#@key@ n###=#@n@ asciiend
string.Formatで右寄せ左寄せ
https://learn.microsoft.com/ja-jp/dotnet/api/system.string.format?view=net-5.0 string.Format
// {0,10} -> {要素位置的なもの?,文字幅} // {0,10} 右寄せ(正) / {0,-10} 左寄せ(負) // {0,x} x文字を超える場合、優先フィールドの幅は無視 var str = "{0,10}{1,10}\n{2,-10}{3,-10}" var result = string.Format( ^ str ^,player.name// -> ^,player.name// -> ^,player.name// <- ^,player.name// <- ^) >@result@
ブックマークレット
javascript:(function()%20%7B%20%20%20%20%20var%20urls%20=%20%5B%5D;%20%20%20%20%20var%20links%20=%20document.getElementsByTagName('a');%20%20%20%20%20for%20(var%20i%20=%200;%20i%20%3C%20links.length;%20i++)%20%7B%20%20%20%20%20%20%20%20%20var%20link%20=%20links%5Bi%5D;%20%20%20%20%20%20%20%20%20var%20href%20=%20link.getAttribute('href');%20%20%20%20%20%20%20%20%20if%20(href%20&&%20href.startsWith('http'))%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20urls.push(href);%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%7D%20%20%20%20%20%20var%20newWindow%20=%20window.open();%20%20%20%20%20newWindow.document.write('%3Chtml%3E%3Chead%3E%3Ctitle%3EURL一覧%3C/title%3E%3C/head%3E%3Cbody%3E');%20%20%20%20%20newWindow.document.write('%3Ch1%3EURL一覧%3C/h1%3E');%20%20%20%20%20newWindow.document.write('%3Cul%3E');%20%20%20%20%20urls.forEach(function(url)%20%7B%20%20%20%20%20%20%20%20%20newWindow.document.write('%3Cli%3E%3Ca%20href=%22'%20+%20url%20+%20'%22%3E'%20+%20url%20+%20'%3C/a%3E%3C/li%3E');%20%20%20%20%20%7D);%20%20%20%20%20newWindow.document.write('%3C/ul%3E');%20%20%20%20%20newWindow.document.write('%3C/body%3E%3C/html%3E');%20%7D)();
▼ 公式manualでブックマークレットを使用した画面(iPhone)
どこで拾ったかは忘れたよ
html編集で使いまみた 情報検索としても
【Web制作の効率UP】時短になるブックマークレット一覧と作り方 - もぐもぐ食べるおいしいWebデザイン。 - もぐでざ
配列の概念
フィルター検索というか
階層みたいだね
画像の図はフォルダで表すと上下逆なんだけれども
三次元配列 スクリプト
画面左上に縦書きで"あ" "い" "う"..."D"
var a = [ [// 0 ["あ","い"], ["う","え"] ], [// 1 ["A","B"], ["C","D"] ] ] >`1,1,@a[0][0][0]@ >`1,2,@a[0][0][1]@ >`1,3,@a[0][1][0]@ >`1,4,@a[0][1][1]@ >`1,5,@a[1][0][0]@ >`1,6,@a[1][0][1]@ >`1,7,@a[1][1][0]@ >`1,8,@a[1][1][1]@
四次元配列 スクリプト
画面左上に縦書きで"あ" "い" "う"..."D"
var a = [ [// 0 [["あ"],["い"]], [["う"],["え"]] ], [// 1 [["A"],["B"]], [["C"],["D"]] ] ] >`1,1,@a[0][0][0][0]@ >`1,2,@a[0][0][1][0]@ >`1,3,@a[0][1][0][0]@ >`1,4,@a[0][1][1][0]@ >`1,5,@a[1][0][0][0]@ >`1,6,@a[1][0][1][0]@ >`1,7,@a[1][1][0][0]@ >`1,8,@a[1][1][1][0]@
this.でグローバル変数呼び出し
▼ "1" → "2" → "1" ...
var a = 2 func A() var a = 1 ?time%30 <= 16 return a return this.a >@A()@
varの一時的なデッドゾーン
一時的なデッドゾーン (TDZ) let または const 変数は、ブロックの始まりからコードが実行されて変数が宣言され初期化される行に到達するまでは、「一時的なデッドゾーン」(TDZ) 内にあると言います。
Stonescriptだとvarがこれに該当しまつね
JavaScriptではこういう仕様が元々letとconstにあるんだ。知らなかった!(読むとクークー寝るからね)
string.Breakとstring.Splitで沼にハマりまくったなぁ
プログラミング講座を見るとやっぱり眠くなってしまうので、あまり見れない
4次元配列を試す
4次元配列を試してみようと思い、コピペさせていただきまんした୧⍢⃝୨
多次元配列のイメージ。4次元以降がわからなかったのでメモ。 - CRAFT TIME
何次元まで利用可能かは知りませぬが
ていうか、Stonescriptではconstがvar扱いなんですかね
const a = 0 ?time%30 = 0 a += 1 >`1,1,@a@ // aくん どんどん増えるじゃん
constの説明少し見ただけだから理解が違うかもしれないけど
1本の棒を伝えるだけの伝達ゲーム。総人数500人
人を介する度に線は歪む
ふと思い出した 多分また何年か後に見たくなる
ただのブクマなのだ🦌⸝⋆
Lambdaにもう一度触れてみる
2024/01/14
戦闘のスクリプトをどうしていくか 未だに悩む
書くのをやめるか(え``)書くか
パターンを色々見たり、書いてみたり
色々分からないことだらけで、実現に必要な事がいまいち掴めない
追記: 今回のacceptは全く必要がないじゃあないか!!いい加減にしろ!!
全ての判定を1箇所に帰結させて承認する役がほしい
集結すると長くなる うーん 短くするにはどうしたらいいんだろう?
func act(item,LR) ?LR = L equipL @item@ activate L ?LR = R equip @item@ activate R func can_sp_atk(dist,itemGC,itemR) return foe.distance <= dist ^& item.GetCooldown(itemGC) <= 0 ^& item.CanActivate() ^|(item.right = itemR ^& item.right.state = 2) func exec_sp_atk() // エラー吐かないようにacceptこっちに持ってきた // can_sp_atkに置いてエラーを吐いておったそうな // コメントもなおちた var accept = func(a,b,c,d) return a(b,c,d) // (can_sp_atk,dist,itemGC,itemR) ?accept(can_sp_atk,16,"hammer",heavy_hammer) act("heavy_hammer",R) return true :?accept(can_sp_atk,10,"bardiche",bardiche) act("bardiche",R) return true :?accept(can_sp_atk,16,"mask",mask) act("mask",R) return true : return false >SP ATK @exec_sp_atk()@
uiのCanvasが難しい
dockは親に対してくっつける位置
anchorはdockに対してくっつける位置
とか説明見て思ってたけど〜なんかおかしいから違うんだろうな それとも、なにか見落としているか
dock,anchorだけで相対的な位置を指定したいけど、
anchor設定で親の外側へ配置すると、どうも上手くいかない
子の数が少なければ問題ないけれどみょ
panelはclipでどうにかなるそうな気もする
パネルを親にすればいいのかな?もはや試す気力はないのである
こういう使い方をしたいんじゃないんだよなん👶
そもそも今回は親設定してませんが…設定しようとするとエラーでる
var ceil_i = math.CeilToInt var canvas_blend = [ "opaque" // 0 不透明 ,"multiply" // 1 乗算 ,"divide" // 2 除算 ,"add" // 3 加算 ,"subtract" // 4 減算 ] var color = [// #rrggbb 16進数 0〜9,a〜f "#111111" // 0 ,"#777777" // 1 ,"#dddddd" // 2 ,"#red" // 3 ,"#green" // 4 ,"#blue" // 5 ,"#yellow" // 6 ,"#cyan" // 7 ,"#blue" // 8 ,"#magenta" // 9 ] var canvas1 var canvas2 var canvas3 var canvas4 var canvas5 func change_screenColor(name, doc,anc,x,w,blend,color) name.dock = doc name.anchor = anc name.x = x name.w = w name.h = ceil_i((screen.h/10)*3) name.blend = blend name.SetBG(color) name.SetFG(color) name.visible = true ?loc.begin | loc.loop // キャンバス追加 canvas1 = ui.AddCanvas() canvas2 = ui.AddCanvas() canvas3 = ui.AddCanvas() canvas4 = ui.AddCanvas() canvas5 = ui.AddCanvas() // キャンバスプロパティ // キャンバス1のblendを変更で他のCanvasに影響する(キャンバス1の幅がscreen.wだから) // (name,doc,anc,x,w,blend,BG,FG) // キャンバス1 change_screenColor(canvas1 ^,left_center,left_center ^,0,screen.w ^,canvas_blend[0],color[6]) // キャンバス2 change_screenColor(canvas2 ^,left_center,right_center ^,(screen.w/5)*2,screen.w/5 ^,canvas_blend[1],color[6]) // キャンバス3 change_screenColor(canvas3 ^,left_center,right_center ^,(screen.w/5)*3,screen.w/5 ^,canvas_blend[2],color[6]) // キャンバス4 change_screenColor(canvas4 ^,left_center,right_center ^,(screen.w/5)*4,screen.w/5 ^,canvas_blend[3],color[6]) // キャンバス5 change_screenColor(canvas5 ^,left_center,right_center ^,(screen.w/5)*5,screen.w/5 ^,canvas_blend[4],color[6]) // 各blendモード表示 >`@canvas1.absoluteX+5@,10,opaque >`@canvas2.absoluteX+5@,10,multiply >`@canvas3.absoluteX+5@,10,divide >`@canvas4.absoluteX+5@,10,add >`@canvas5.absoluteX+5@,10,subtract
FPS表示その2
var oldtime = 0 var newtime newtime = time.msbn newtime.Sub(oldtime) >@newtime.ToString()@ oldtime = time.msbn //code here
指定座標へアニメーション表示
引用元 discord: ket.6226
rateの数字を小さくするとアニメーション切り替えが速くなる
var asciiart = [ascii > asciiend,ascii #> asciiend,ascii ##> asciiend,ascii ###> asciiend] var framecount = asciiart.Count() //how much to divide time with, slows animation var rate = 2 //calculate what frame to show at current time var currentframe currentframe = (time/rate)%framecount //display current frame relative to player >o-2,-2,@asciiart[currentframe]@
hpとアーマー値を合わせる
2024/01/06
アーマーの小数点以下も合わせて合算。
どこかの条件で使う予定があったような気がするような…しないような
var hp_arm hp_arm = hp+armor+armor.f*0.1 >@hp_arm@
処理の使い分け
できたらいいな👶
1
var y = 1 ?time%30 <= 16 >`1,@y@,@["僕は要素位置0","私は要素位置1"][0]@ : >`1,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
2
var y = 1 ?time%30 <= 16 >`0,@y@,@["僕は要素位置0","私は要素位置1"][0]@ >`0,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
3
var y = 1 ?time%30 <= 16 >`0,@y@,@["僕は要素位置0","私は要素位置1"][0]@ >`0,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
実行関数を関数で判定
引用元 discord: fruloo
翻訳機: それを数値にする必要があるため、ブール値を0または1に変換する必要がありますが、それ以外は機能します
var test = true func btoi(x) ?x return 1 return 0 func foo() >`10,10,"hello" func bar() >`10,10,"goodbye" [foo,bar][btoi(test)]()
ふむ👶なんだか面白い書き方
"[配列1][配列2]()"
配列1に実行関数
配列2に実行関数選択の関数
配列2が配列1の実行位置(要素位置)を指定してるっぽい
()
つければ実行してくれるのかな
変数test
は?x
のreturn 1
をtrue判定にする為に必要
return 0は配列1の要素位置0へnullまたはfalse
またはその他の判定、もしくは判定直入れでよさそう
とりあえずotherという関数を作ってみる。
▼ 例に当てはめてステージ選択をしてみる
var run = true func select_loc(run) ?run = loc.isQuest return 1 :?run = (loc = "rocky_plateau") return 2 :?run = (loc = "deadwood_valley") return 3 :?run = (loc = "caustic_caves") return 4 :?run = (loc = "Deadwood Waterfall") return 5 :?run = (loc = "fungus_forest") return 6 :?run = (loc = "uulaa_shop") return 7 :?run = (loc = "tid_crypt_0") return 8 :?run = (loc = "Haunted Halls") return 9 :?run = (loc = "cross_deadwood_river") return 10 :?run = (loc = "bronze_mine") return 11 :?run = (loc = "icy_ridge") return 12 :?run = (loc = "cross_bridge") return 13 :?run = (loc = "temple") return 14 return 0 func other() >`10,10,"other" func quest() >`10,10,"quest" func rocky_plateau() >`10,10,"rocky_plateau" func deadwood_valley() >`10,10,"deadwood_valley" func caustic_caves() >`10,10,"caustic_caves" func deadwood_waterfall() >`10,10,"Deadwood Waterfall" func fungus_forest() >`10,10,"fungus_forest" func uulaa_shop() >`10,10,"uulaa_shop" func haunted_gate() >`10,10,"tid_crypt_0" func haunted_halls() >`10,10,"Haunted Halls" func cross_deadwood_river() >`10,10,"cross_deadwood_river" func bronze_mine() >`10,10,"bronze_mine" func icy_ridge() >`10,10,"icy_ridge" func cross_bridge() >`10,10,"cross_bridge" func temple() >`10,10,"temple" [other ,quest ,rocky_plateau ,deadwood_valley ,caustic_caves ,deadwood_waterfall ,fungus_forest ,uulaa_shop ,haunted_gate ,haunted_halls ,cross_deadwood_river ,bronze_mine ,icy_ridge ,cross_bridge ,temple][select_loc(run)]()
このスクリプトを使うかどうかはシラヌケド( ◔‿ゝ◔) loc判定をしたら関数()をそのままぶち込みたくなるけど、他の場面若しくはなにかしらの理由で使うかもしれない 色んなやり方を知りたいな 今は戦闘スクリプトを書き直してる
ラムダ式(Lambda)
2024/01/02
引用元 discord: fruloo
画面表示の`
を追加
無名関数(匿名関数)
var squareFn = func(x) return x*x func apply(fn, arg) return fn(arg) >`1,7,apply(squareFn, 5) = @apply(squareFn, 5)@
Stone Story RPGの知識階級
2024/01/02
あけおめす
引用元 discord: a_lol0273
面白かったので保存。この氷塊はダークウェブを説明する時によく用いられますね
コネコネタイム
スクリプトの書き方を展開・模索する為に
様々な考え方を受容しなければ 思考はトマト...
というわけで forっぽい代替を描き留めてオキュ
ほや...?
こうだっ けども120の順だからなん
式をどうにかすればいいのでつか
いや、0はloc.beginにとられてるからいいのかな?
var arr = ["a","b","c"] >@arr[time%3]@
親コンポーネント設定
12/20
スクリプトれんしうのお題
soundプレイヤー(SSRでは効果音)
必要そうな機能は実験出来たので、UIだけ先にちまちま作ってる
12/19
親コンポーネントを設定し、anchorとdockで子の位置を相対的にしゅる👶
期待通りになったら親(container)の可視性をfalse、子の可視性をtrueに変更container_btn.visible = false
var container_btn var btn1 var btn2 var btn3 // ボタンプロパティ雛形 func set_btn(name,w,anc,dock,txt) name.w = w name.h = container_btn.h name.anchor = anc name.dock = dock name.style = -3 name.text = txt ?loc.begin // パネル追加 container_btn = ui.AddPanel() // ボタン追加 btn1 = ui.AddButton() btn2 = ui.AddButton() btn3 = ui.AddButton() // ボタンの親設定 container_btn.Add(btn1) container_btn.Add(btn2) container_btn.Add(btn3) // パネルプロパティ container_btn.w = screen.w/3 container_btn.h = 3 container_btn.anchor = center_center container_btn.dock = center_center container_btn.style = -1 // ボタンプロパティ // (name,w,anc,dock,txt) set_btn(btn1,1+4,left_center,left_center,"左") set_btn(btn2,2+4,center_top,top_center,"中央") set_btn(btn3,1+4,right_center,right_center,"右")
敵のchill数だけ数字として取り出す
2023/12/08
fds_chill_int
にchill数をいれたのだ chill数が同期しない時もあるかもしれない
気付いたらシレッと修正する
var fds_arr var fds_chill_get var fds_chill_arr var fds_chill_int fds_chill_int = 0 ?foe.debuffs.string fds_arr = string.Split(foe.debuffs.string,",") for v : fds_arr ?v = "debuff_chill" fds_chill_get = v fds_chill_arr = string.Split(fds_chill_get,":") fds_chill_int = int.Parse(fds_chill_arr[2])
演算でプレイヤー周りに星をクルクル表示
novaSwirl /
novaSwirl.txt
written: _smallbear
あとで見る
アニメーション表示
とても楽しげな画面(discord要ログイン)を見たのでアニメーション系を試してみる
Anim > Componentをお試し
Manualのanim.Play()
でスクリプト例が誤って出力されていたので修正
修正したので一応試してみる
グラフィックアート文字作成ツール
"枯木の滝"でグラフィックアート(文字)表示
>@totaltime@ var test ?loc = waterfall // ステージ開始直後のバナー表示を消す disable hud b test = ui.AddAnim(ascii ▄▄▄█████▓ ▓##██▒#▓▒ ▒#▓██░#▒░ ░#▓██▓#░# ##▒██▒#░# ##▒#░░### ####░#### ##░###### %% ▄▄▄█████▓▓█████# ▓##██▒#▓▒▓█###▀# ▒#▓██░#▒░▒███### ░#▓██▓#░#▒▓█##▄# ##▒██▒#░#░▒████▒ ##▒#░░###░░#▒░#░ ####░#####░#░##░ ##░#########░### ############░##░ %% ▄▄▄█████▓▓█████###██████# ▓##██▒#▓▒▓█###▀#▒██####▒# ▒#▓██░#▒░▒███###░#▓██▄### ░#▓██▓#░#▒▓█##▄###▒###██▒ ##▒██▒#░#░▒████▒▒██████▒▒ ##▒#░░###░░#▒░#░▒#▒▓▒#▒#░ ####░#####░#░##░░#░▒##░#░ ##░#########░###░##░##░## ############░##░######░## %% ▄▄▄█████▓▓█████###██████#▄▄▄█████▓ ▓##██▒#▓▒▓█###▀#▒██####▒#▓##██▒#▓▒ ▒#▓██░#▒░▒███###░#▓██▄###▒#▓██░#▒░ ░#▓██▓#░#▒▓█##▄###▒###██▒░#▓██▓#░# ##▒██▒#░#░▒████▒▒██████▒▒##▒██▒#░# ##▒#░░###░░#▒░#░▒#▒▓▒#▒#░##▒#░░### ####░#####░#░##░░#░▒##░#░####░#### ##░#########░###░##░##░####░###### ############░##░######░########### asciiend) test.duration = 90 test.loop = false test.Play()
anim.Play()
のanim
はアニメーションの変数を入れるところなんだね(仮)
varを書いてみる
2023/11/16
モンテスちゃん
やっとpython.jpを読みすすめたみたい
Python基礎の基礎 > 変数
"太郎くんは、一つ100円のももを5つ、一つ40円のみかんを8つ、80円のなしを5つ、60円のキウイを10、 90円のスイカを20、110円のかきを10買いました。全部でいくらになったでしょう?"momo = 100 * 5 mikan = 40 * 8 nashi = 80 * 5 kiwi = 60 * 10 suika = 90 * 20 kaki = 110 * 10 momo + mikan + nashi + kiwi + suika + kaki
Stonescriptに置き換え
var momo var mikan var nashi var kiwi var suika var kaki var sum momo = 100 * 5 mikan = 40 * 8 nashi = 80 * 5 kiwi = 60 * 10 suika = 90 * 20 kaki = 110 * 10 sum = momo + mikan + nashi + kiwi + suika + kaki >@sum@円
画面左上に"4720円"と表示されました。
Discordでvarについて質問したのが2023/10/17
varのマニュアルページを読むまで1ヶ月かかった
とんでもないやつですねぇ…?
今回の例題は毎秒書き換える必要はないので、アドバイス通り
var momo momo = 100 * 5
の形式にしました
使える文字(一部)
ASCII-art Tutorial
Fonts
- Mono-spaced
- 1:1 VS 1:2 (16:29)
- Courier, Verdana, FixedSys
- Custom font
Discord
テキストコピー
☆☺ʘ❤♦♣♠•◘⏹◙♂♀♪♫☼ ▶◀À⚿œ§≠¿↑↓→←¯¡▲▼ !"#$%&'()*+,-./ 0123456789:;<=>? @ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ `abcdefghijklmno pqrstuvwxyz{|}~´ ÇüéâäàåçêëèïîìÄÅ ÉæÆôöòûùýÖÜ€£¥₩Á áíóúñÑãõζηξλψέ«» ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐ └┴┬├─┼╞╟╚╔╩╦╠═╬╧ ╨╤╥╙╘╒╓╫╪┘┌█▄▀ρι αβγπΣσμτΦΘΩδ∞φεω ≡±≥≤⌐¬÷≈°…·†☤∆❄┊
モバイル版でマインドストーンを途中で開く
key list
Mouse0
The Left (or primary) mouse button.
keyアクション
Action | Default Key | Default Key 2 |
---|---|---|
Pause |
P |
Space |
Leave |
L |
|
Inventory |
I |
|
Mindstone |
M |
|
Potion |
Q |
|
ItemLeft |
E |
|
ItemRight |
R |
|
Up |
W |
UpArrow |
Down |
S |
DownArrow |
Left |
A |
LeftArrow |
Right |
D |
RightArrow |
Primary |
Return |
KeypadEnter |
Back |
X |
|
Ability1 |
LeftShift |
RightShift |
Ability2 |
LeftControl |
RightControl |
BumpL |
Z |
|
BumpR |
C |
|
Dynamic1 |
F |
|
Dynamic2 |
T |
|
Dynamic3 |
G |
|
Dynamic4 |
V |
|
Dynamic5 |
B |
// 素早くダブルタップしてマインドストーンを開く var mind_timer = 0 ?key.GetKeyAct("Mouse0") = "Mindstone" mind_timer-- ?!mind_timer key.ResetBinds() :?key = primaryEnd mind_timer = 2 key.Bind("Mindstone", "Mouse0")
FPSチェッカー
引用元discord
FPSチェッカーを持っている人はいますか?
というのも、現状では、私はアステロイド V2.0.3(自作ゲームスクリプト)が V2.0.2b よりも遅いように感じていますが、その違いは微妙で、私は直感的に判断しているだけなので、より確かな結果が必要ですxD
回答
以下は簡易的なものです。
現在のフレーム時間と最高フレーム時間を表示します。ほとんどの場合、数値は約33になることを望んでいます。
// フレームタイムの追跡 var high = math.BigNumber() var cur = math.BigNumber() var t1 = time.msbn cur = (time.msbn).Sub(t1) ?cur.Gt(high) high = cur >`1,5,@cur@, @high@ t1 = time.msbn
このスクリプトは、現在のフレーム時間と最高フレーム時間を追跡し、現在のフレーム時間が最高フレーム時間を上回る場合にそれを更新します。
そして、現在のフレーム時間と最高フレーム時間を表示します。
通常、数値は約33に近いことを示すでしょう。
文字列の数字を数値として扱うにはどうすればいいですか?
回答
バフ、デバフを分解してほしいやつの重複、残り時間を得るにはこんなの使ってます
//ラッキーポーション var aibfs //バフの分割 var criti //クリティカルの文字列が何番目か var critt = 0 //クリティカルの重複がいくつか var critc = 0 //クリティカルの残り時間 ?buffs.string = lucky_crit aibfs = string.split(buffs.string,":",",") criti = aibfs.IndexOf(lucky_crit) critt = int.parse(aibfs[criti + 1]) critc = int.parse(aibfs[criti + 2]) ?buffs.string ! lucky_crit critt = 0 critc = 0 >@criti@
あとは文字列を欲しいのに置き換えてみてください🫠
東京大学の教材"Pythonプログラミング入門"をみてみる
東大の教材が公開されてる👶 ワーイ
GitHub一応Issuesを見てから実践
関数の定義と返値
BMI(ボディマス指数)の式を関数定義
BMIの求め方は[体重(kg)]÷[身長(m)の2乗]
▼ PythonでBMIの式を関数定義
def bmi(height, weight): return weight / (height/100.0) ** 2
▼ Stonescriptに置き換え
func bmi(height, weight) return weight / math.Pow((height/100.0), 2) >`1,1,@bmi(170.0,77.0)@
画面左上に"26.6436"と表示
BMIの評価では肥満(1度)
横川尚隆さんの身長とオン体重(多分コンテスト中の事)を入力しました
Discordこの時もらった回答と同じ事だ〜👶(時が経つの早い)
BMIの体型評価云々についてはしょーりゃく
▼ べき乗の書き方
3 ** 2 // Pythonのべき乗 math.Pow(3, 2) // Stonescriptのべき乗
for (ループ)
·:·:· ループ ·:·:·についてみてゆく
今ループ処理(for)してるものはfoe改行表示とヒットダメージ表示
とりあえず、サンプルスクリプトを使用してみます
var min = 1 var max = 4 var sum sum = 0 for j = min..max sum = sum + j >sum = @sum@
画面左上に"sum = 10"と表示されたので
sum = sum + j
は
"sum = 0+1+2+3+4"
の処理がされたとみなします
負の数へ進む事も出来る
var g g = "" for k = 5..-2 g = g + k >g = @g@
画面左上に"g = 543210-1-2"と表示されました
今回は文字列の結合をする為に変数gは""と宣言してるのかな?この変数は文字列として扱われます…的な
まぁまぁまぁ そういう事にしておきます👶
今回は文字列を結合した結果が返ってきたので、とりあえずそう捉えておきましゅよ
ループを入れ子にして複雑なアルゴリズムを形成
for x = 1..9 for y = x/2 .. x/2 + 6 >`@x@,@y@,*
画面左上に
* *** ***** ******* ********* ********* ********* ******** ****** **** **
と表示されました👶ナナメノダイヤー
ループを早期に抜け出す
var n n = "" for i = 1..5 ?i = 3 i = -1 n = n + i >n = @n@
画面左上に"n = 12-1"と表示されました
iが3になるとiは-1されてしまうので
1+2+2+2…etcと延々と続く
そこでn = n + i
を反復処理(4〜5行目)の範囲外に置いたんですね
変数nは文字列として認識されるので今回も文字の結合となり
n = "1"+"2"+"-1"
n = 12-1となったと👶タブンサァ
breakコマンドでループを抜ける
▼ breakコマンドを使用してループから抜け出す事も出来るようです
for i = 1..5 ?i = 3 break
continueコマンドでスキップ
▼ continueコマンドでスキップ、ループが続行
var n n = "" for i = 1..5 ?i = 3 continue n = n + i >n = @n@
画面左上に"n = 1245"と表示されました
?i = 3
でcontinue
コマンドを挿入した事により、3の処理がスキップされたようです
配列の要素をループ処理
var a = [1, 2, 3] var n n = "" for value : a n = n + value >n = @n@
画面左上に"n = 123"と表示されました
"for (ループ変数) : (配列)"にすれば配列を順に参照してくれるのかな👶
全てManualのサンプルスクリプトを貼付しただけですが、少し理解が深まったきがしゅるね
追記
apocryphic(discord)さんのスクリプトで同じ形式"for (ループ変数) : (配列)"があったので、試してみます
最後の2行は画面表示用に追加
var foephase for i : string.Split(foe) ?i = phase foephase = i break ?foe >@foephase@
ボス対峙で画面左上に"phase(数字)"と表示されました
この場合もfor (ループ変数) : (配列)
の形式になってますね👶
func
returnはどんな時に使う?
2023/10/25
(funcのreturnって、どういうときに使うんですか?…👶)
回答1
うーん原理的には何か返してほしいとき、なんですけど
たとえばこんな感じに整数の乱数を作りたいときに、いくつまでを作るか、を関数に入れてやって、returnでその値を返してやると
func int_rnd(bins) return math.FloorToInt(rngf*bins) var rand=int_rnd(10)
とかすれば0-9の10種類のランダムな値が返ってくる!みたいな便利機能を作れる
funcってあるひとまとめの手続きをしてほしいってこともあるんですが、↑の例みたいに手続きの結果が欲しい!ってこともあるのでそういう時に便利です
回答2
funcに投げてreturnを使うと、コード全体が見やすくなる
★returnを使う場合
func isBossFight() return foe = boss func isGhost() return foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon() :?isBossFight() normalWeapon(bardiche,true) : normalWeapon(heavy,false)
★returnを使わない場合
//main ? foe = ghost | foe = large_ghost ghostWeapon() :? foe = boss normalWeapon(bardiche,true) : normalWeapon(heavy,false)
👶ghostがいる会館で実験
○ return有り
func ghostWeapon() loadout 1 func isGhost() return foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon()
× return無し(赤字エラー)
func ghostWeapon() loadout 1 func isGhost() foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon()
回答3
(今更になりますが)returnを使うのと使わないのでは主に汎用性が違います 下記の例では"ふたつの数字を足した数を画面に出力するもの"を書いてます
func Add(a,b) return a + b >@Add(3,5)@
func Add(c,d) >@c + d@ Add(3,5)
どちらも動作は同じですが
前者は画面に出力する以外の用途でも使えるのに対して、 (例えば
?foe.hp + foe.armor < 100
という条件を書きたい場合
?Add(foe.hp,foe.armor) < 100
のように使えます)後者は画面出力にしか使えない上に座標指定も出来ません
とにかくreturnはすごいです!!(語彙力)
returnの扱い
return true,false処理1
2023/10/26
discord
func castWisp() ? gc(fire_talisman) <= 0 ^ | IR = "fire talisman" & IRS = 2 // required eqL("tri") eqR("fire talisman") actR = 1 return 1 return and then // wisp ? summonCount = 0 ? lo ! "deadwood" ? castWisp() return 1
func castWisp()
のreturn 1
,return
はtrue,falseのような扱いですか?
? castWisp()
にはtrue文を返すみたいな
回答
returnのみでfalse相当の何かが返されてますね
たぶん普通の言語で言うnullみたいなものが返されていて、空白文にした時と動作は違うみたいです
あと、普通の言語同様数字の0
もfalseとして扱われているみたいです
言語的な仕様としてnullと同じかもわかりませんが、
長さ0の文字列""もfalseですね
長さ0の配列[]はtrueと…へぇ~…
return true,false処理2
2023/10/28
funcのreturn true,return falseの使用について
func TriStar() equipL tri equipR star func Quarter() ?item.GetCooldown("quarterstaff") <= 0 & ^item.CanActivate() & ^harvest.distance > 7 & ^pickup.distance > 7 equip quarterstaff activate R return true : return false func QuarterToTriStar() ?Quarter() Quarter() : TriStar() ?loc.begin new_stone = 0 QuarterToTriStar() ?loc = rocky ?loc.stars = 5 new_stone = res.stone - res_stone ?screen.i = 1 & ^harvest ! Boulder & ^pickup ! Stone loc.leave() :?pickup & pickup.distance <= 10 TriStar() :?harvest.distance <= 6 ?item.right.state = 3 equipR xi equip shovel : QuarterToTriStar()
return true
return falseはこんな感じで使うのが標準的ですか?
冗長になってますか?
回答1
うーーーん、冗長な気がしてしまいます
?Quarter()を評価した時点で、もし条件を満たしていればequipもactivateもされてしまうので
func QuarterToTriStar() ?Quarter() Quarter() : TriStar()
のifがtrueの場合のQuarterがいらないので、
func QuarterToTriStar() ?!Quarter() TriStar()
で同様に作用すると思います
funcの定義でtrueは返される?
この場合、funcの定義でtrue結果は条件文に組み込まれてるようなものなのでしょうか?👀trueとfalse処理を理解してなすびです
回答2
funcの定義で、true時に恐らくしたい処理
equip quarterstaff activate R
が条件を満たしたときには行われるようになっているため、何かで(→?Quarter()
などで)Quarter()
を呼び出すとすでに条件を満たすときにはこれが行われるようになってしまう、という感じです
解決
そういう事なんですね!!
だからifで組み込む場合は!
(?!Quarter()
)を使用するんですね
わかりました!いつもありがとうございます🦉