SSR_自分用おべんきょ

> Stone Story RPGの案内へ戻る


↓ 若干重いから新しいページ作った
Stonescript おべんきょう 2 - Stone Story RPGを機械翻訳 + 備忘録

モンテスちゃんの旧学び場です
…勝手に引用しちゃうもんね👶!!
可愛いモンテスに免じて許してください

名前:モンモンモンテス
(:зꇤ )ニ キュ

JavaScriptとpythonの講座。とても安眠効果がある。
2023/11/22 もはやスクリプトは一切追記してない

developer.mozilla
python.jp
東京大学Pythonプログラミング入門教材

色々

多方向に対応したスワイプを作ってみよう

スワイプの話題が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.absoluteXxxx.absoluteY
テキスト幅はテキストオブジェクトのプロパティでいじるんだね✍️情報アリガタイー

パラスの元ネタらしきもの

▲ 上に戻る

プレイヤー/敵のバフ/デバフ数をintで取得

引用 discord: bitty45

おべんり╰(ˇωˇ )╯;。:*保存
関数に少し付け足してしまったけど
バフデバフの記号表示可愛いからさ(: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

引用 discord: arcane_scrivlox

2画面ブレードでの使用例
ifの後にreturn書くだけのがスクリプトがちょこちょこあったけど、なんとなく意味がわかった👶
スクリーン指定の方は例の使用法だと動かないので、returnBlade()に置換
真偽判定ちゃんとしておけば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█

fotolife記法

▲ 上に戻る

特定の条件でキャンバス追加(多重追加)

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の一時的なデッドゾーン

let - JavaScript | MDN

一時的なデッドゾーン (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

引用元 discord: ket.6226
FPS

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?xreturn 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をお試し
Manualanim.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{|}~´
ÇüéâäàåçêëèïîìÄÅ
ÉæÆôöòûùýÖÜ€£¥₩Á
áíóúñÑãõζηξλψέ«»
░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
└┴┬├─┼╞╟╚╔╩╦╠═╬╧
╨╤╥╙╘╒╓╫╪┘┌█▄▀ρι
αβγπΣσμτΦΘΩδ∞φεω
≡±≥≤⌐¬÷≈°…·†☤∆❄┊

https://cdn.discordapp.com/attachments/1165083910774997103/1167945718850400366/tex_ascii_table_22x40.png?ex=655933b6&is=6546beb6&hm=7307cb7e230ee843e7dd6a344981dafe9ab7cf7a1b826ad2117173a64b2cfa62&https://cdn.discordapp.com/attachments/1165083910774997103/1167945719236280500/image.png?ex=655933b6&is=6546beb6&hm=4c4a93b0edba206097e8ffa3c1463bf5547d1bb67904b2448c1e4750e66b17dc&

▲ 上に戻る

モバイル版でマインドストーンを途中で開く

Discord

key list
Mouse0The 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を見てから実践

HTML版 / Colab版

関数の定義と返値

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 = 3continueコマンドを挿入した事により、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())を使用するんですね
わかりました!いつもありがとうございます🦉

▲ 上に戻る