Stone Story RPGメインメニュー

 サイト更新履歴
 12/9
ページ追加
string(文字列) [解読 / 実践編] string

 12/01
ページ追加
ループ [解読 / 実践編] Loops
配列 [解読 / 実践編] Arrays

外部リンクを移動
移動先はこちら
 テキスト差分比較
 色コード確認

 11/30
用語追加
Manualまとめ - Stone Story RPGを機械翻訳 + 備忘録
ui.OpenInv()
ui.OpenMind()
Manualまとめ修正
・ 戻り値:'型'を原文表記にしました。
・ 用語括弧内に存在するstr、string、int、integer等の表記を、原文表記にしました。
・ 異なるスクリプト例を修正。
※ いずれも気付いた範囲内での修正となります。

 11/01
用語追加
Manualまとめ - Stone Story RPGを機械翻訳 + 備忘録
?bighead

 10/31
用語追加
Manualまとめ - Stone Story RPGを機械翻訳 + 備忘録
time.msは非推奨(公式manualから削除)になりました。

time.msbn
BigNumber b.Add(num) / b.Add(BigNumber)
b.Sub(num) / b.Add(BigNumber)
b.Mul(num) / b.Mul(BigNumber)
b.Div(num) / b.Div(BigNumber)
b.Eq(num) / b.Eq(BigNumber)
b.Gt(num) / b.Gt(BigNumber)
b.Ge(num) / b.Ge(BigNumber)
b.Lt(num) / b.Lt(BigNumber)
b.Le(num) / b.Le(BigNumber)
b.ToString()
b.ToUI()
math.Atan2(y, x)
math.BigNumber() / math.BigNumber(number) / math.BigNumber(str)
math.e
math.Exp(num)

 10/18
Manualを1ページにまとめました。
Manualまとめ - Stone Story RPGを機械翻訳 + 備忘録

  10/11
ページ追加
キャラクター装飾 - Stone Story RPGを機械翻訳 + 備忘録
用語追加
10. ·:·:· ネイティブfunction(関数) ·:·:· - Stone Story RPGを機械翻訳 + 備忘録
sys.os
sys.isMobile
sys.isPC
sys.isConsole

  10/7
用語追加
3. ·:·:· ゲームの状態 ·:·:· - Stone Story RPGを機械翻訳 + 備忘録
?foe.GetCount(int)
10. ·:·:· ネイティブfunction(関数) ·:·:· - Stone Story RPGを機械翻訳 + 備忘録
item.GetLoadoutL(int)
item.GetLoadoutR(int)


Stone Story RPGの公式サイトを翻訳(機械翻訳) + αのページ一覧をまとめたメインメニューページです。
(v3.44.1 - 2023/09/20時点版)

ChatGPTで翻訳&htmlテキスト整形出力をしたので表記揺れやコード改変、短縮、加筆が含まれている可能性があります。
修正や改善点があればコメントにてお知らせください。

コードエリア(スクリプト)にはコピー機能があります。
copy test_1 エリア右上ワンタップコピー
copy test_2 エリアタップ→Copy codeタップ
copy test_1

copy test_2

公式へ翻訳ページを追加する意志がある方へ

有志がいれば翻訳を公式サイトに追加してくれるかもしれません。手伝う意志がある場合はDiscordの@standardcomboにアクションしてください。
公式マニュアルhtmlファイル
運営の為になる事がユーザーの為にもなるので、遠慮なく挙手していただければと思います。

当サイトは互換性がないテキスト形式で出力した事と、スクリプトのコード改変、短縮、加筆が含まれる可能性があるので協力できません。


Mind Stone入門 / 翻訳元

Stonescriptを書く前に、まずはこちらからお読みください。
スペースの重要性や基本的な事、つまづくポイントまで、チュートリアル形式で学べます。

Manual / 翻訳元

Mind Stone入門を読み終えた方向けです。 Stonescriptの概念を理解出来たらManualを読んでいきましょう。

Manualをよみとく

ループ [解読 / 実践編] Loops
配列 [解読 / 実践編] Arrays
string(文字列) [解読 / 実践編] string

FAQ 質問と回答 / 翻訳元

よくある質問(公式FAQ)

色々

ポーション調合表
キャラクター装飾
テキスト差分比較
色コード確認

TID
 discord引用元
 EN_Items.txt
 EN_Characters.txt
 EN_General.txt

まとめwiki

英語まとめwiki
韓国まとめwiki(ja自動翻訳URL)

公式

index
index/gifs
index/devlog
index/ascii_test
index/ascii_tutorial
index/stonescript/Components
index/stonescript/Cosmetics
index/stonescript/Games
index/stonescript/UI
index/stonescript/Fishing

ダウンロード
 Steam
 Android
 iOS
コミュニティ
 Discord
デベロッパーSNS
 Twitter

▲ 上に戻る


Manualまとめ

> Stone Story RPGの案内へ戻る


      _ ______________________ _            
  ,:´      \____        __.---,. `.         
 :.!  __________\_______\__`--`´__ \        
 :' \ \--------------------------.\ \       
 ':' · \ ·:. :'· :.:·             \\ \      
  ':' \ \ :·' :·:.                 \\ \     
   ':' · \ .: ·:: '.:. ':'··:.      \\ \    
    ':' \ \ · :..                    \\ \   
     ':' · \ :·: ..': :·:. ·:: '.     \\ \  
      ':' \ \__________________________\\ \ 
       ':' `     .         \         .     )
        ':' . . . \ . . . . ' . . . . \ . .;
          `·.;,;,;,;,;,;,;,;,;,;,;,;,;,;,:' 

Mind Stoneを使用して装備の選択を自動化するために使用されるStonescriptは、Stone Story RPG内で利用できるミニマリスティックでありながら強力な言語です。
Stonescriptを初めて使う場合は、「Mind Stone入門」チュートリアルから始めることを検討してみてください。

ヘルプが必要ですか?スクリプトの共同作業を希望しますか?Discordを訪れてください。

このマニュアルは、利用可能なすべてのStonescript機能に関する包括的なリファレンスです。
ほとんどの例はMind Stoneに直接コピー/ペーストできます。これはそれらがどのように動作するかを学ぶ素晴らしい方法です。

▲ 上に戻る


·:·:· 例 ·:·:·

// 岩の高原でシャベルを装備します。
// 恐怖の洞窟では、ロードアウト1を装備します。
// ボスに対しては、
// グラップリングフックと7つ星のウォーハンマーを代わりに使用します。
// 幽霊の間では、2つの杖を使用し、
// 左手に毒を、右手に活力を指定します。
// ただし、難易度が5つ星を超える場合は、
// 魔法付き+13の活力スタッフを使用します。
// ポーションは、ヒットポイントが10未満になった場合にアクティブ化しますか?

?loc=rocky
 equip shovel
?loc=cave
 loadout 1
 ?foe=bolesh
  equip grap
  equip hammer *7 D
?loc=halls
 equipL poison wand
 equipR vigor wand
 ?loc.stars > 5
  equip vigor staff +13
?hp < 10
 activate potion

▲ 上に戻る


·:·:· 基本事項 ·:·:·

?

論理条件を評価します。true の場合、インデントされた行を実行します(if)。

?loc = caves
  loadout 1

:

'?'条件が偽の場合の代替論理分岐。

?loc = caves
  loadout 1
:
  loadout 2

:?

追加の条件を持つ代替の論理分岐(else-if)。

?loc = caves
  loadout 1
:?loc = deadwood
  loadout 2
:
  loadout 3

//

コメント。スクリプトが実行される際、 '//' の右側のすべてのテキストは論理効果がありません。

?loc = caves
  loadout 1
// このスクリプト行は何も行いません。

/* */

ブロックコメント。シンボル間のすべてのテキストはスクリプトが実行される際に論理効果がありません。

/*
?loc = caves
  loadout 1
このスクリプトは何も行いません。すべてがブロックコメント内にあります。
*/

^

前の行を続けます。

?loc=caves |
^loc = mine
  equip repeating

上記は次と同じです:

?loc=caves|loc=mine
  equip repeating

▲ 上に戻る


·:·:· ゲームの状態 ·:·:·

これらの質問は、プレイヤーの前で何が起こっているか、何が正しいかを教えてくれます。

?loc

プレイヤーが訪れている現在の場所。

?loc = caves
  loadout 1

?loc.id

現在の場所のユニークな識別子。

var id
id = loc.id
>探検中 @id@

?loc.name

現在の場所のローカライズされた名前。

>探検中 @loc.name@

?loc.stars

現在の場所の難易度。

?loc = caves
  ?loc.stars=4
    loadout 1
  ?loc.stars=5
    loadout 2

?loc.begin

場所の最初のフレームでのみ true で、time = 0 のとき、ゲームシミュレーションが実行される前に true になります。
Ouroboros ループの後に true ではありません。
変数をリセットするのに便利です。

var i
?loc.begin
  i = 0
  ?loc = caves
    i = -100

?loc.loop

Ouroboros ループの後に実行されるランの最初のフレームで true です。

var loopCount = 0
?loc.loop
  loopCount++

?loc.isQuest

現在の場所が伝説やカスタムクエストからの特別な場所の場合、true です。
それ以外の場合は false です。

?loc.isQuest
  >`0,1,特別なクエストの場所にいます

loc.averageTime

現在の場所の平均クリア時間。
場所の平均時間は、最新のクリア時間が最も価値があり、古い時間ほど段階的に価値が低くなる重みつきで計算されます。

>`0,2,平均時間 =
^ @loc.averageTime@ フレーム

loc.bestTime

現在の場所の最高クリア時間(あなたの記録、ハイスコア)。

>`0,1,最高時間 =
^ @loc.bestTime@ フレーム

?foe

プレイヤーが対象としている現在の敵。

?foe = boo
  equip vigor staff

?foe.id

プレイヤーが対象としている敵のユニークなID(またはタイプ)。

>敵ID: @foe.id@

?foe.name

プレイヤーが対象としている敵のローカライズされた名前。

>敵: @foe.name@

?foe.damage

プレイヤーが対象としている敵の攻撃ごとのダメージ。

>`0,1,敵のダメージ = @foe.damage@

?foe.distance

プレイヤーと対象の敵との距離。

>プレイヤーと敵の距離: @foe.distance@

?foe.count

46ユニット以内の敵の数。

>46ユニット以内の敵の数: @foe.count@

?foe.GetCount(int)

特定の単位数以内に存在する敵の数を取得します。

?foe.hp

プレイヤーが対象としている敵の現在の体力。

>敵の現在の体力: @foe.hp@

?foe.maxhp

プレイヤーが対象としている敵の最大体力。

>敵の最大体力: @foe.maxhp@

?foe.armor

プレイヤーが対象としている敵の現在の防御力。

>敵の現在の防御力: @foe.armor@

?foe.maxarmor

プレイヤーが対象としている敵の最大防御力。

>敵の最大防御力: @foe.maxarmor@

?foe.buffs.count

対象の敵にかかっているバフ(正の効果)の数。

?foe.buffs.count > 0
  >`0,3,敵のバフ = @foe.buffs.string@

?foe.debuffs.count

対象の敵にかかっているデバフ(負の効果)の数。

?foe.debuffs.count > 0
  >`0,4,敵のデバフ = @foe.debuffs.string@

?foe.debuffs.string

対象の敵に関するデバフ情報。

?foe.debuffs.count > 0
  >`0,4,Foe debuffs = @foe.debuffs.string@
  

?foe.state

対象の敵の現在の状態を表す数値。

?foe.state = 0
  >`0,0,敵は眠っています

?foe.time

対象の敵の現在の状態で経過したフレーム数。

>`0,0,敵 = @foe.name@:@foe.state@,@foe.time@

?foe.level

対象の敵のレベル番号。

>`0,0,@foe.name@のレベルは @foe.level@

?item.left.id / ?item.right.id

左手または右手に装備されているアイテムのID。

>`0,1,左のID:@item.left.id@
>`0,2,右のID:@item.right.id@

?item.left.state / ?item.left.time / ?item.right.state / ?item.right.time

装備された武器の現在の状態と、その状態で経過したフレーム数の数値表現。

>`0,1,@item.left.state@:@item.left.time@
>`0,2,@item.right.state@:@item.right.time@

?item.potion

現在調合されているポーション。大釜で自動補充が有効な場合、"auto" を含みます。

?item.potion ! empty & item.potion = auto
  activate potion

?pickup

プレイヤーが対象としている現在のアイテム回収。

?pickup
  equip star stone
:
  loadout 1

?pickup.distance

プレイヤーと対象のアイテム回収との距離。

?pickup.distance < 5
  equipL star stone

?armor

プレイヤーの現在の防具。小数点以下を切り捨てた値です。

?armor.fが[2.4]なら、?armorは2に評価されます。

?armor.f

プレイヤーの現在の防具の小数部分の値です。

?armor.fが[2.4]なら、?armor.fは4に評価されます。

?buffs.count / ?buffs.string

プレイヤーにかかっているバフ(正の効果)の数およびそれらの情報をまとめたもの。

?buffs.count > 0
  >`0,1,プレイヤーのバフ = @buffs.string@

?buffs.oldest

プレイヤーにかかっている最も古いバフのID。

>`0,1,最も古いバフ: @buffs.oldest@

?debuffs.count / ?debuffs.string

プレイヤーにかかっているデバフ(負の効果)の数およびそれらの情報をまとめたもの。

?debuffs.count > 0
  >`0,2,プレイヤーのデバフ = @debuffs.string@

?debuffs.oldest

プレイヤーにかかっている最も古いデバフのID。

>`0,1,最も古いデバフ: @debuffs.oldest@

?hp

プレイヤーの現在のヒットポイント。

>現在のヒットポイント: @hp@

?maxhp

プレイヤーの最大ヒットポイント。

>最大ヒットポイント: @maxhp@

?maxarmor

プレイヤーの最大防具。小数点以下を切り捨てた値です。

?maxarmorが[2.4]なら、?maxarmorは2に評価されます。

?pos.x / ?pos.y / ?pos.z

プレイヤーの現在のX座標、Y座標、Z座標。

> (@pos.x@, @pos.y@)

?ai.enabled

AIがオンの場合はTrue、AIがオフの場合はFalse(たとえばシネマティックな瞬間中など)。

?ai.paused

AIが一時的に中断されている場合、例えば宝物がドロップするのを待っている場合はTrue。

?ai.idle

プレイヤーがアクションの完了を待っているなど、アイドル状態の場合はTrue。

?ai.walking

プレイヤーが移動中の場合はTrue。

?bighead

プレイヤーがビッグヘッド(月時計...の石)を有効にしている場合にTrueとなります。

?face

プレイヤーの現在の表情。

?face = "^^"
  >ハッピー

?key

カスタムゲーム入力の状態。 現在の入力を表示します:

>@key@

?res.stone / ?res.wood / ?res.tar / ?res.ki / ?res.bronze / ?res.crystals

プレイヤーのインベントリ内のリソースの現在の量。

// 例:
?loc = Deadwood
  >Wood = @res.wood@
// 例2:
>`0,1,#magenta, ♦ @res.crystals@

?player.direction

プレイヤーが向いている方向を示します。右の場合は1、左の場合は-1を返します。

?player.direction = 1
  >`0,0,右に歩いています
:
  >`0,0,左に歩いています

player.name

プレイヤーが選んだ名前。プレイヤーの名前をその頭上に表示します。

var name
var x
name = player.name
x = string.Size(name) / -2
>o@x@,-2,@name@

?rng

0から9999までのランダムな整数を返します。

?rng < 5000
  >表!
:
  >裏!
// 例2:5から24までのランダムな整数を生成します:
var min = 5
var max = 24
var n = min + rng % (max - min + 1)

?rngf

0から1までのランダムな浮動小数点数を返します。

// 例:
>ランダムな浮動小数点数 = @rngf@
// 例2: 5.0から24.0までのランダムな浮動小数点数を生成します
var min = 5.0
var max = 24.0
var n = min + (max - min) * rngf

?screen.i

ゲーム内の画面の位置、右側に到達したときに増加するインデックスとして示します。

>`0,0,画面のインデックス = @screen.i@

?screen.x

ゲーム内の画面のX座標を示します。

>`0,0,画面のX座標 = @screen.x@

?screen.w

画面のASCIIグリッドの幅を示します。

var sw = screen.w
>画面の幅 = @sw@

?screen.h

画面のASCIIグリッドの高さを示します。

var sh = screen.h
>画面の高さ = @sh@

?summon.count

現在ゲーム内に存在する召喚された仲間の数。

?summon.count = 0
  equipL talisman
  activate L

summon.GetId(index = 0)

指定したインデックスの召喚のIDを返します。

indexパラメータはオプションで、デフォルトはゼロです(最初の召喚)。該当のインデックスに召喚が存在しない場合、nullを返します。

?summon.GetId() ! "cinderwisp"
  equipR fire talisman
  activate R

summon.GetName(index = 0)

指定したインデックスの召喚のローカライズされた名前を返します。

indexパラメータはオプションで、デフォルトはゼロです(最初の召喚)。該当のインデックスに召喚が存在しない場合、nullを返します。

>`0,1,召喚:@summon.GetName()@

summon.GetVar(varName, index = 0)

召喚に関するカスタム変数の値を返します。

異なる種類の召喚は、それぞれ独自の能力に基づいて異なる変数を公開します。
indexパラメータはオプションで、デフォルトはゼロです(最初の召喚)。varNameが有効な変数に対応していない場合、エラーが表示されます。

?summon.GetId() = cinderwisp &
^summon.GetVar("ignition") > 2
  activate cinderwisp

summon.GetState(index = 0)

指定したインデックスの召喚の現在の状態を表す数値を返します。

indexパラメータはオプションで、デフォルトはゼロです(最初の召喚)。該当のインデックスに召喚が存在しない場合、-1を返します。

>`0,1,召喚の状態:@summon.GetState()@

summon.GetTime(index = 0)

指定したインデックスの召喚の現在の状態で経過したフレーム数を返します。

indexパラメータはオプションで、デフォルトはゼロです(最初の召喚)。該当のインデックスに召喚が存在しない場合、-1を返します。

>`0,1,召喚の経過時間:@summon.GetTime()@

?totalgp

インベントリのアイテムスターレベルとエンチャントボーナスから計算される、"Gear Points" の合計。

>私のギアポイント = @totalgp@

?time

場所の現在のフレーム番号。

?time % 300 = 0
  >10秒ごとにこのメッセージが表示されます

?totaltime

ボスのサブロケーションの場合も含め、場所の現在のフレーム番号の累積。

>`0,0,現在の時間 = @totaltime@ フレーム

time.msbn

Unix時間は、1970年01月01日午前00:00:00Z(協定世界時での1970年01月01日午前00:00:00)から経過したミリ秒数を表します。閏秒は考慮されません。
これはBigNumberを返します。

>@time.msbn@

time.year / time.month / time.day / time.hour / time.minute / time.second

プレイヤーのコンピュータ上のローカルシステム時刻。

>`0,0,@time.year@/@time.month@/@time.day@
^ @time.hour@:@time.minute@:@time.second@

utc.year / utc.month / utc.day / utc.hour / utc.minute / utc.second

現在のUTC時刻。

var utcZ = utc.year * 356 * 12 * 24 * 30 +
^utc.month * 12 * 24 + utc.day * 24 + utc.hour
var timeZ = time.year * 356 * 12 * 24 * 30 +
^time.month * 12 * 24 + time.day * 24 + time.hour
var timeZone = timeZ - utcZ
?timeZone < 0
  >`0,0,タイムゾーン: UTC@timeZone@
:
  >`0,0,タイムゾーン: UTC+@timeZone@

▲ 上に戻る


·:·:· コマンド ·:·:·

これらはゲームに何かを実行するよう指示するものです。

activate (ability)

アイテムの能力をアクティブ化します。"(ability)" の値として、potionPleftLrightR が使用できます。

activate R
// (右手に装備されたアイテムの能力をアクティブ化します。例: Hatchetのような)

brew (ingredients)

ポーションボトルを指定された材料の組み合わせで補充します。実行はランの開始時、time 0 でのみ実行されます。材料には stonewoodtarbronze が含まれ、+ で区切る必要があります。
材料名は英語または設定で選択した言語で書くことができます。

?loc.begin
  brew bronze + tar

equip (str)

アイテムを装備します。
"(str)" には7つまでの基準があります。両手持ちのアイテムはこの形式の装備コマンドを使用する必要があります。

equip vigor crossbow *8 +5

equipL (str)

指定された基準に最適に合うアイテムを左手に装備します。

equipL poison d_sword

equipR (str)

指定された基準に最適に合うアイテムを右手に装備します。

equipR vigor shield

equip @var@

文字列変数から基準に基づいてアイテムを装備します。装備および他のアイテム検索コマンドは減算基準をサポートしています。

var weaponName = "poison sword *10 -big"
equipR @weaponName@

loadout (n)

特定のロードアウト番号を装備します。

?loc = caves
  loadout 1
?loc = deadwood
  loadout 2

> (str)

画面の上部に文字列を表示します。

>Hello World!

> @varName@

変数の値を挿入した文字列を表示します。
複数の変数を単一の表示に挿入するには、変数名を@ で囲みます。
以下の例では、現在の対象の敵に関する情報を表示します。

var foeInfo
foeInfo = foe
>敵 = @foeInfo@

>(abcd

プレイヤーにカスタムの表情を表示します。Big Headが必要です。

>( OwO

>oX,Y,#rrggbb,

プレイヤーの位置に対する高度な印刷方法です。
XおよびYは座標のオフセットです。
#rrggbb16進数表記でのテキストの色です。

色は次の定数で設定することもできます:
#white#cyan#yellow#green#blue#red

虹色で印刷するには#rainFFを使用し、最後の2文字(FF)で明るさを定義します。

補足:
0〜9、a〜fで生成されるコード
0に近づくほど暗く、fに近づくほど明るい

以下の例では、プレイヤーの位置に対して、左に6、下に3の位置に赤いフォントで "Let's go!" と表示します:

>o-6,3,#red,Let's go!

>hX,Y,#rrggbb,

">o" に類似していますが、Big Headと同じレイヤーに描画します。帽子などのアクセサリに最適です。 以下は、プレイヤーに黄色の帽子を描画する例です。Big Headが有効な場合に最適です。

>h-2,-3,#yellow,ascii
##_
#| |
_|_|_
asciiend

>`X,Y,#rrggbb,

画面の左上隅に対する高度な印刷方法です。 以下の例では、座標と色に変数を使用して "Hello World!" を表示します。

var posX = 10
var posY = 5
var color = rainE1
>`@posX@,@posY@,#@color@,Hello World!

>cX,Y,#rrggbb,

画面の中央に対する高度な印刷方法です。">`" と似ていますが、これらのすべての場合で色はオプションです。 以下の例は、色がオプションで、デフォルトが白であることを示しています。

>c0,0,Hello World!

>fX,Y,#rrggbb,

対象の敵の頭の位置に対する高度な印刷方法です。 以下の例では、対象の敵に赤い十字線を描画します。

>f-2,0,#ff0000,ascii
##!
-#·#-
##¡
asciiend

var (variable)

数学、論理、文字列操作で使用できる変数を宣言します。変数のライフサイクルと挙動についての詳細は、他の言語と異なることがあるため、変数のセクションを参照してください。 以下は例です:

var message = Hello World!
>@message@

func (function)

後で呼び出すことができる関数を宣言します。 以下は例です:

func Print(message)
    >@message@

Print(Hello World!)

for v = a..b

変数 'v' を 'a' から 'b' までの値で繰り返すループを作成します。ループのスコープ内に表示されるコードは複数回実行されます。 以下は例です:

var a
a = 0
for i = 1..5
  a = a + i
>a = @a@

import (script)

外部スクリプトの単一のコピーを読み込み、実行します。 以下の例は、Fishing.txt という名前の釣りミニゲームをインポートするものです。 (save-fileフォルダ)/Stonescript/Fishing.txt

import Fishing

new (script)

'import' と類似して、外部スクリプトを読み込み、実行します。ただし、'new' で読み込まれたオブジェクトは各々個別のコピーであり、そのスクリプト本体は一度だけ実行されます。 以下の例では、ベクトルオブジェクトを作成して表示します:

var v = new Components/Vector
v.Init(10, 5)
>Vector = @v@

disable abilities

ポーションおよび武器のアビリティの起動を防止します。また、HUDボタンをグレーアウトします。

enable abilities

以前の「disable abilities」呼び出しによって無効にされたアビリティの起動を復元します。

disable banner

場所の名前が表示される水平バナーのレンダリングを防止します。場所の開始と終了時に表示されます。

enable banner

場所名とともに表示される水平バナーのレンダリングを復元します。

disable hud (opts)

ゲームプレイのユーザーインターフェース要素を非表示および無効にします。オプションのパラメータを受け入れ、無効にする要素のセットを指定できます。

p = プレイヤーの体力とデバフ
f = 敵の体力とデバフ
a = アビリティボタン
r = リソース
b = バナー
u = ユーティリティベルト

// 例:
disable hud // すべてのhud要素を無効にします

// 例2:
disable hud ru // リソース (r) とユーティリティベルト (u) のみを無効にします

enable hud (opts)

以前の "disable hud" コマンドによって非表示にされたユーザーインターフェース要素を表示します。
無効にした要素のセットを指定するために、disable コマンドと同じオプションパラメータを受け入れます。

disable loadout input

武器のロードアウトを入力キーで保存または呼び出すのを防止します。

enable loadout input

以前の "disable loadout input" コマンドによって無効にされた入力キーによる武器のロードアウトの保存または呼び出しを復元します。

disable loadout print

ロードアウトが呼び出されたときに表示されるメッセージを非表示にします。

enable loadout print

以前の "disable loadout print" コマンドによって非表示にされたロードアウトメッセージを表示します。

disable pause

ポーズボタンのユーザーインターフェースを非表示にします。[P] ショートカットでポーズはまだ利用可能です。

enable pause

以前の "disable pause" コマンドによって非表示にされたポーズボタンを表示します。

disable player

プレイヤーを非表示にします。これは戦闘に影響しません。単なる外見上の操作です。

enable player

以前の "disable player" コマンドによって非表示にされたプレイヤーのレンダリングを表示します。

play (sound) (pitch)

オプションのピッチ値を持つサウンドエフェクトを再生します。
ピッチのデフォルト値は100で、大きな数値でピッチが上がり、小さな数値で下がります。

// 例:
?key = primary
  play buy
?key = up
  play buy 200
// 例2:
var pitch
?time%30 = 0
  pitch = rng/100 + 50
  >@pitch@
  play buy @pitch@

▲ 上に戻る


·:·:· 検索フィルター ·:·:·

これらは敵、場所、アイテムを評価する際に使用されます。

▼ 敵が昆虫または毒の場合 ロードアウト3装備

?foe = insect | foe = poison
  loadout 3

評価リスト

poison
vigor
aether
fire
air
ice
arachnid
serpent
insect
machine
humanoid
elemental
boss
phase1
phase2
phase3
spawner
flying
slow
ranged
explode
swarm
unpushable
undamageable
magic_resist
magic_vulnerability
immune_to_stun
immune_to_ranged
immune_to_debuff_damage
immune_to_physical
*[number]  star level (location or item)
+[number]  enchantment bonus (item only)(())

poison

vigor

活力

aether

エーテル

fire

air

空気

ice

arachnid

クモ類

serpent

ヘビ

insect

昆虫

machine

機械

humanoid

ヒューマノイド

elemental

エレメンタル

boss

ボス

phase1

フェーズ1

phase2

フェーズ2

phase3

フェーズ3

spawner

スポーンポイント

flying

飛行

slow

遅くする

ranged

遠距離

explode

爆発

swarm

群れ

unpushable

押せない

undamageable

ダメージを受けない

magic_resist

魔法耐性

magic_vulnerability

魔法への脆弱性

immune_to_stun

スタン無効

immune_to_ranged

遠距離攻撃無効

immune_to_debuff_damage

デバフダメージ無効

immune_to_physical

物理攻撃無効

*[number] star level (location or item)

*[数字] 星レベル(場所またはアイテムに関連)以下の例は左手に☆5の剣を装備equipL sword *5

+[number] enchantment bonus (item only)

+[数字] エンチャントボーナス(アイテムのみ)以下の例は左手にエンチャント+5の剣を装備
equipL sword +5

▲ 上に戻る


·:·:· 比較 ·:·:·

これらはゲームの状態と組み合わせて意思決定を行うために使用されます。

=

値を比較し、等しいか文字列が含まれているかを判定します。

// 例:
?hp = maxhp
  loadout 2

!

値が等しくないか、文字列が含まれていないかを判定します。

// 例:
?foe ! poison
  equipL sword

&

論理積(AND)演算子です。

// 例:
?loc=caves & foe=boss

|

論理和(OR)演算子です。複雑な式に &| が混在している場合、全ての & が最初に評価されます。

// 例:
?foe=slow | foe.count>3
  activate potion

>

大なり比較です。場所の難易度、敵の数、体力などと組み合わせて使用できます。

// 例:
?foe.count > 10
  equip shiny bardiche

<

小なり比較です。

// 例:
?hp < 6
  activate potion

>=

大なりまたは等しい比較です。>= を一つの比較に組み合わせたものです。次の2つの例は等価です:

// 例:
?loc.stars >= 6
  equipR vigor shield
?loc.stars > 6 | loc.stars = 6
  equipR vigor shield

<=

小なりまたは等しい比較です。<= を一つの比較に組み合わせたものです。

// 例:
?hp <= 6
  activate potion

▲ 上に戻る


·:·:· variables(変数) ·:·:·

変数は値を後で使用するための方法です。新しい変数はキーワード var を使用して宣言します。

// 例:
var myVar = 10
// (myVar は変数の名前で、値 10 で初期化されています)

myVar = myVar + 5
// (myVar は今、15 に等しいです)

var secondVar = 3
myVar = myVar - secondVar
// (多くの変数は数学の操作で組み合わせることができます。myVar は今、12 に等しいです)

変数が宣言されると、最初に var が実行されるときにのみ初期化されます。

// 例:
var i = 0
i++
>i = @i@

この例では、変数 i が宣言され、値が 0 で始まります。実行の各フレームで i の値が 1 ずつ増加し、画面に表示。
変数は、場所を離れて新しい実行を手動で開始するときのみ、初期値にリセット。

Ouroborosがループする場合や、Mind Stoneが開かれてから再び閉じられる場合でも、リセットされません。文字列変数はオプションと引用符で宣言できます。これにより、特殊な記号と末尾の空白が許可されます。

// 例:
var a = 10
var b = 5
var myVar = a + " x " + b + " = " + (a * b)
>@myVar@

(この例は、文字列を + 演算子で結合する方法も示しています)

インポートされたスクリプト内の変数は、それらのスクリプト内に含まれ、他のスクリプト内の変数や関数と名前が衝突しません。

▲ 上に戻る


·:·:· 数学演算 ·:·:·

演算子は数値を変更します。変数と組み合わせて使用するか、ゲームの状態式内で直接使用できます。

+

2つの数値または変数を加算します。

// 例:
var a = 2 + 3
(a equals 5)

-

2つの数値または変数を減算します。

// 例:
?hp < maxhp - 5
  equip vigor sword dL

*

2つの数値または変数を乗算します。

// 例:
var a = 2
var b = 5
a = a * b
// a = 10
// 例2:
var a = 2 * 0.4
// a = 0.8

/

1つの数値または変数を別の数値または変数で除算します。整数の場合、結果は切り捨てられます。

// 例:
var a = 8
a = a / 4
// a = 2
// 例2:
var a = 5.0
a = a / 2
// a = 2.5

++

変数を増加させます。

// 例:
var a = 3
a++
// a = 4

--

変数を減少させます。

// 例:
var a = 3
a--
// a = 2

%

モジュロ。1つの数値を別の数値で割った余りを取得します。

// 例:
var a = 5 % 4
(a = 1)
// 例2:
?time % 8 < 4
  > \O)
?time % 8 > 3
  > (O/
// これはアニメーション絵文字を描画します

( )

括弧は演算の優先順位を指定するために使用できます。

// 例:
var a = 2 * (3 - 1)
// a = 4

!

否定。ブール式の前に使用すると値を反転させます。

// 例:
? !ai.enabled
  > AIが有効ではありません。

▲ 上に戻る


·:·:· functions(関数) ·:·:·

カスタム関数は、スクリプトが複雑になるにつれて重要な整理の役割を果たします。

スクリプトを読みやすくし、繰り返しを減らすのに役立ちます。関数が宣言されると、その内容はすぐに実行されません。代わりに、関数内のスクリプト行は、後で関数が呼び出されたときに実行されます。

この例では、1フレームごとに1ずつ増加するカウンターが作成されています。
カスタム入力キーが押されると、ResetCounter() が呼び出され、カウンターの値がゼロに戻ります:

var count = 0
count++
>Counter = @count@

func ResetCounter()
  count = 0

?key=begin
  ResetCounter()

関数の別の側面は、値を返すことができることです。 この例では、メインロケーション(ボスエリアではない場所)の期間を計算する単純な関数を宣言しています:

func NonBossDuration()
  return totalTime - time

var duration
duration = NonBossDuration()
>Time was: @duration@

関数は任意の数の引数/パラメータを受け入れることもでき、より強力になります。

ここでは、範囲内のランダムな数値を生成するユーティリティ関数を宣言し、それを使用して5から10の間のランダムな数値を生成しています:

func RandomRange(min, max)
  ?min >= max
    return min
  return min + rng % (max - min + 1)

var randomValue
randomValue = RandomRange(5, 10)
>RNG: @randomValue@

関数内で外部スクリプトに属する変数を参照する際に、プレフィックス 'this' を使用できます。 'this' の使用は任意であり、スクリプト変数はプレフィックスなしで関数からアクセスできます。ただし、次の例では変数 'a' が関数内外の両方に現れるため、区別のために 'this.a' が使用されています:

var a = 1
func TestScope(a)
  >Script var = @this.a@, function var = @a@
TestScope(3)

関数が他の関数を呼び出すか、それ自体を呼び出すと、実行スタックが構築され、アプリケーションがクラッシュするまでサイズが増加する可能性があります。

コンピューターリソースを保護するために、Stonescript にはスタック制限が215あり、制限を超えるとエラーが発生します。

▲ 上に戻る


·:·:· ネイティブfunctions(関数) ·:·:·

スクリプトは独自の関数を定義できますがStonescriptには予め定義されたネイティブ関数が付属しており、コマンドのように振る舞います。

主題ごとに明確にグループ化され、パラメータを受け入れ時には値を返す点が異なります。

ambient(環境音)

?ambient

文字列型を返します
すべてのアクティブな環境音のIDをコンマ区切りのリストで返します。

// 例:
>`0,0,Ambient Layers = @ambient@

ambient.Add(str)

戻り値:なし
指定されたサウンドIDで環境音のレイヤーを追加します。最大4つのレイヤーまで追加できます。5番目のレイヤーが追加されると、最も古いレイヤーが削除されます。

// 例:
?loc.begin
  ambient.Add(ambient_crypt)

ambient.Stop()

戻り値:なし
すべての環境音レイヤーをクリアします。

// 例:
?time = 3
  ambient.Stop()
  ambient.Add(ambient_mines)

▲ 上に戻る


BigNumber

「BigNumbers」は、32ビットを超える大きな整数を扱う特別なオブジェクトで、正の整数と負の整数の値を保持できます。
彼らの算術演算と比較操作は整数だけでなく、浮動小数点数や他のBigNumbersとも連携できます。

b.Add(num) / b.Add(BigNumber)

戻り値:自分自身
BigNumberに数値を追加します (+)

var bn = math.BigNumber(12)
bn.Add(5)
>@bn@
// 17

b.Sub(num) / b.Sub(BigNumber)

戻り値:自分自身
BigNumberから数値を減算します (-)

var bn = math.BigNumber(12)
bn.Sub(5)
>@bn@
// 7

b.Mul(num) / b.Mul(BigNumber)

戻り値:自分自身
BigNumberを数値で乗算します (*)

var myBigNum1 = math.BigNumber(12)
var myBigNum2 = math.BigNumber(12)
myBigNum1.Mul(5)
myBigNum2.Mul(1.5)
>@myBigNum1@ @myBigNum2@
// 60 18

b.Div(num) / b.Div(BigNumber)

戻り値:自分自身
BigNumberを数値で除算します (/)

var myBigNum1 = math.BigNumber(12)
var myBigNum2 = math.BigNumber(12)
myBigNum1.Div(5)
myBigNum2.Div(1.5)
>@myBigNum1@ @myBigNum2@
// 2 8

b.Eq(num) / b.Eq(BigNumber)

戻り値:bool
BigNumberが数値と等しいかを判定します (=)

var bn = math.BigNumber(5)
>@bn.Eq(5)@ @bn.Eq(3)@
// true false

b.Gt(num) / b.Gt(BigNumber)

戻り値:bool
BigNumberが数値より大きいかを判定します (>)

var bn = math.BigNumber(5)
>@bn.Gt(3)@ @bn.Gt(10)@
// true false

b.Ge(num) / b.Ge(BigNumber)

戻り値:bool
BigNumberが数値以上かを判定します (>=)

var bn = math.BigNumber(5)
>@bn.Ge(3)@ @bn.Ge(5)@
// true true

b.Lt(num) / b.Lt(BigNumber)

戻り値:bool
BigNumberが数値より小さいかを判定します (<)

var bn = math.BigNumber(5)
>@bn.Lt(3)@ @bn.Lt(10)@
// false true

b.Le(num) / b.Le(BigNumber)

戻り値:bool
BigNumberが数値以下かを判定します (<=)

var bn = math.BigNumber(5)
>@bn.Le(10)@ @bn.Le(5)@
// true true

b.ToString()

戻り値:string
BigNumberの文字列表現を取得します。保存のためにシリアル化するのに使用できます。

var myBigNum = math.BigNumber("123456789123456789")
storage.Set("myBN", myBigNum.ToString())
// ---
var bnStr = storage.Get("myBN")
var myBigNum = math.BigNumber(bnStr)

b.ToUI()

戻り値:string
ユーザーインターフェースで使用するための数値の短縮文字列表現を取得します。

var myBigNum = math.BigNumber("123456789123456789")
>@myBigNum.ToUI()@
// 123.5Qa

▲ 上に戻る


color(色)

Stonescriptでは、カラーが16進数表記の文字列(Hex color codes)で表現されます。
例えば、#ff0000のような表記や、#redのような簡略化されたプリセットを使用します。

色見本(#FFFFFF = 白)
#000000 #FF0000
#7F7F7F #00FF00
#FFFF00 #0000FF

Picker(外部リンク)で様々なHex color codesを確認できます。

color.FromRGB(r, g, b)

戻り値:string
三つの整数(0から255)からカラーを文字列に変換します。

// 例:
var c = color.FromRGB(255, 0, 128)
>`0,0,@c@, @c@

color.ToRGB(string)

戻り値:int[3]
カラーを文字列から三つの整数(0から255)に変換します。

// 例:
var c = color.Random()
var rgb = color.ToRGB(c)
var r = rgb[0]
var g = rgb[1]
var b = rgb[2]
>`0,0,@c@, @c@ \n @r@ \n @g@ \n @b@

color.Lerp(c1, c2, t)

戻り値:string
時間(パーセンテージ)tにおいて、カラーc1からカラーc2に線形補間します。

// 例:
var c1 = "#ff4400"
var c2 = "#8888ff"
var t = 0.5
var c
t = math.sin(time*0.1) / 2 + 0.5
c = color.Lerp(c1, c2, t)
>`0,1,@c@,@c@\n ██████

color.Random()

戻り値:string
ランダムなカラーを返します。

// 例:
var c
c = color.Random()
>`0,0,@c@,@c@\n ██████

▲ 上に戻る


draw(描画)

draw.Bg(x, y, color)

戻り値:なし
指定した画面位置の背景色を設定します。

// 例:
draw.Bg(5, 4, #red)

draw.Bg(x, y, color, w, h)

戻り値:なし
画面上の長方形領域の背景色を設定します。

// 例:
draw.Bg(5, 4, #cyan, 10, 6)

draw.Box(x, y, w, h, color, style)

戻り値:なし
指定した位置とサイズで四角形を描画します。
四角形の境界は色とスタイル番号で定義されます。負のスタイル番号は四角形の中央を透明にします。

注意:
現時点では、高度な印刷は常にボックスの上に描画されます。 この例を使用して、左/右を押して異なるスタイルを試すことができます。

var style = 1
?key = leftBegin
  style--
?key = rightBegin
  style++
draw.Box(10, 5, 30, 15, #333333, style)
>`12,6,#ffffff,Style = @style@
>`12,8,#888888,Press Left/Right\nto change style

draw.Clear()

戻り値:なし
画面全体をクリアします。

draw.GetSymbol(x, y)

戻り値:string
画面位置(x,y)のグリフを返します。 この例では、画面座標を選択し、その場所にあるシンボルを左上に描画します。プレイヤーが[ ]を移動させることができます。

var s
var x = 20
var y = 10
var drawX
?key=leftBegin
  x--
?key=rightBegin
  x++
?key=upBegin
  y--
?key=downBegin
  y++
s = draw.GetSymbol(x, y)
>`0,1,Symbol = @s@
drawX = x - 1
>`@drawX@,@y@,[#]

draw.Player() / draw.Player(x,y)

戻り値:なし
プレイヤーキャラクターを、スクリプト内の特定のポイントに装備とアドオンを一緒に描画します。

オプションのオフセット値x,y
絶対的な画面位置に描画するには、screen namespaceを参照し、プレーヤーのローカル位置から画面位置に変換するオフセットを導出します。

▲ 上に戻る


int(整数)

int.Parse(str)

戻り値:integer
数値の文字列を整数値に変換します。
指定された文字列が数値でない場合、エラーが発生します。

// 例:
var s = "999"
var i = int.Parse(s)
i++

▲ 上に戻る


item(アイテム)

クールダウン IDリスト

すべての利用可能なアビリティ文字列に関する詳細については、以下の表を参照してください。

注意:
無効なアビリティ文字列は-1を返します。
まだ使用されていない武器の一部のアビリティは-1を返すことがあります。

Item Cooldown ID
Æther Talisman "aether_talisman"
Bardiche "bardiche"
Bashing Shield "bash"
Blade of the Fallen God "blade"
Cinderwisp Devour "cinderwisp"
Cultist Mask "mask"
Dashing Shield "dash"
Fire Talisman "fire_talisman"
Hatchet "hatchet"
Heavy Hammer "hammer"
Mind Stone "mind"
Quarterstaff "quarterstaff"
Skeleton Arm "skeleton_arm"
Voidweaver Devour "voidweaver"

item.CanActivate()

戻り値:boolean
アイテムのアビリティをアクティベートできる場合はtrueを返し、それ以外の場合はfalseを返します。

ボス戦前やシネマティック中など、一部のゲームプレイ状況ではアビリティのアクティベーションが無効になることがあります(クールダウン中でなくても)。

// 例:
?item.CanActivate()
  equip Bardiche
  activate R

item.CanActivate(str)

戻り値:boolean
特定のアイテムをアクティベートできる場合はtrueを返します。

この条件はアイテムが装備されている場合にのみtrueになります。一部のアイテムは、特定の条件を満たさない限りアクティベートできない場合があります。
これはitem.GetCooldown()の一部であり、アイテムのクールダウンがゼロであってもアクティベートできないことがあります。

ただし、クールダウン中のアイテムは常にアクティベート不可能です。

// 例:
equip bardiche
?item.GetCooldown("skeleton_arm") <= 0
  equip skeleton arm
  ?item.CanActivate("skeleton_arm")
    activate R

item.GetCooldown(str)

戻り値:integer
指定されたアビリティの残りのクールダウン時間(フレーム単位)を返します。

// 例:
?foe = boss & item.GetCooldown("bardiche") <= 0
  equip bardiche
  activate R

item.GetCount(str)

戻り値:integer
インベントリ内のアイテムのコピー数を返します。
アイテムが見つからない場合は0を返します。

// 例:
var searchCriteria = "sword *0 -big -socket"
var swordCount = item.GetCount(searchCriteria)
>私は@swordCount@本の基本的な剣を持っています

item.GetLoadoutL(int) /
item.GetLoadoutR(int)

戻り値:string
特定の装備セット内のアイテムを返します。
整数パラメータは質問する装備セット番号です。そのスロット内にアイテムがない場合、空白の文字列を返します。

// 例:
>`0,1,左: @item.GetLoadoutL(1)@
>`0,2,右: @item.GetLoadoutR(1)@

▲ 上に戻る


key(キー)

key(key namespace)は、標準のゲーム入力とショートカットのカスタマイズを可能にします。
このシステムはアクション(略して "act" と表記)とキーに基づいており、各アクションは入力またはショートカットの種類を表し、各キーは物理的なキー押下に対応します。

アクションに割り当てることができるすべての可能なキーのリストはこちらで確認できます。
アクションのバインディングを変更すると、実行間で変更が維持されます(現在はストレージに保存されません)。
最適化の観点から、バインディングをフレームごとに変更しないことをお勧めします。

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

key.Bind(act, key1)

戻り値:なし
特定のアクションに新しいキーのセットを割り当てます。

他のアクションがすでにこれらのキーのいずれかを持っている場合、既に使用されているキーは元のアクションに対して放棄されます。
アクションには最大で2つのキーが割り当てられます。

// 例:
?loc.begin
  key.Bind("Potion", "P")

この例では、元々一時停止に割り当てられていた "P" キーはもはやゲームを一時停止させず、代わりにポーションをアクティブにします。

また、ポーションの元の "Q" キーはもはや機能しません。 "Q" はアクションにはバインドされていません。

key.Bind(act, key1, key2)

戻り値:なし
特定のアクションに新しいキーのセットを割り当てます。

他のアクションがすでにこれらのキーのいずれかを持っている場合、既に使用されているキーは元のアクションに対して放棄されます。
アクションには最大で2つのキーが割り当てられます。

key.GetKeyAct(key)

戻り値:string
指定されたキーにバインドされているアクションを返します。
指定されたキーがアクションにバインドされていない場合は "None" を返します。

key.GetActKey(act)

戻り値:string
指定されたアクションにバインドされている最初のキーを返します。
指定されたアクションにキーがバインドされていない場合は "None" を返します。

key.GetActKey2(act)

戻り値:string
指定されたアクションにバインドされている2番目のキーを返します。
指定されたアクションに2番目のキーがバインドされていない場合は "None" を返します。

key.GetActLabel(act)

戻り値:string
指定されたアクションにバインドされている最初のキーを表すユーザー向けのラベルを返します。

現在の実装では、バインドされたキーの最初の文字を返します。これは "LeftShift" などの場合に混乱の原因となる可能性があります。

key.ResetBinds()

戻り値:なし
すべてのアクションをデフォルトのキー割り当てにリセットします。

▲ 上に戻る


loc(場所)

loc.Leave()

戻り値:なし
プレイヤーが手動で離れるボタンを押したかのように、退出を実行します。

loc.Pause()

戻り値:なし
プレイヤーが手動で一時停止ボタンを押したかのように、一時停止を実行します。

▲ 上に戻る


math(数学)

数学APIは整数と浮動小数点数(float)の両方で動作します。
数値が小数点を持つ形で宣言される場合、それは浮動小数点数とみなされます(例:var a = 0.5)。
小数部分が存在しない場合、それは整数として扱われます(例:var a = 2)。

math.Abs(num)

戻り値:number
指定された数値の絶対値を返します。

var number = -2
number = math.Abs(number)
// 数値は 2 になります

math.Acos(num)

戻り値:number
数値の逆余弦(アークコサイン)をラジアン単位で返します。入力の範囲は -1 から 1 です。入力値が範囲外の場合、"NaN" が返されます。

var number = math.Acos(-1)
// number は π になります

math.Asin(num)

戻り値:number
数値の逆正弦(アークサイン)をラジアン単位で返します。入力の範囲は -1 から 1 です。入力値が範囲外の場合、"NaN" が返されます。

var number = math.Asin(1)
// number は π/2 になります

math.Atan(num)

戻り値:number
指定された数値の逆正接(アークタンジェント)をラジアン単位で計算します。

var number = math.Atan(2)
// numberは約1.107149です

math.Atan2(y, x)

戻り値:number
原点から点(x, y)までの線とx軸との間の角度をラジアン単位で計算します。

var number = math.Atan2(3, 2)
// numberは約0.9827937です

math.Ceil(num)

戻り値:number
数値を切り上げ、それより大きい最初の整数に丸めます。

var number = math.Ceil(4.2)
// number は 5.0 になります

math.CeilToInt(num)

戻り値:integer
数値を切り上げ、それより大きい最初の整数に丸めます。

var number = math.CeilToInt(4.2)
// number は 5 になります

math.Clamp(num, min, max)

戻り値:number
数値を 'min' から 'max' の範囲内に制約します。数値がすでに範囲内にある場合、変更せずにそのまま返されます。

var number = 50
number = math.Clamp(number, 0, 10)
// number は制約され、10 になります

math.Cos(num)

戻り値:number
指定されたラジアン単位の角度の余弦を返します。

var number = math.Cos(0)
// number は 1 になります

math.e

戻り値:float
定数e、またの名をオイラー数とも呼ばれ、おおよそ2.71828です。

E = @math.e@
// 定数eの値を画面に表示します

math.Exp(num)

戻り値:number
指定された累乗でeを計算します。

var number = math.Exp(3)
// numberは約20.08554です

math.Floor(num)

戻り値:number
数値を切り捨て、それより小さい最初の整数に丸めます。

var number = math.Floor(2.7)
// number は 2.0 になります

math.FloorToInt(num)

戻り値:integer
数値を切り捨て、それより小さい最初の整数に丸めます。

var number = math.FloorToInt(2.7)
// number は 2 になります

math.Lerp(a, b, t)

戻り値:number
指定した時間(割合)t における値 a から b への線形補間を実行します。

// 例:
var number = math.Lerp(0.0, 20.0, 0.75)
// number は 15.0 になります

// 例2:
var n = 0.0
?key = Begin
  n = 0.0
n = math.Lerp(n, 100, 0.02)
>n = @n@
// 変数nは100に向かって緩和し、1フレームごとに2%ずつ変化します。キーが押されるとリセットされます

math.Log(num, base)

戻り値:number
指定された基数での数値の対数を返します。

var number = math.Log(5, 2)
// number は 2.321928 になります

math.Max(num1, num2)

戻り値:number
2つの数値のうち大きい方を返します。

var number = math.Max(3, 10)
// number は 10 になります

math.Min(num1, num2)

戻り値:number
2つの数値のうち小さい方を返します。

var number = math.Min(3, 10)
// number は 3 になります

math.pi

戻り値:float
定数 π、約 3.1415926

>PI = @math.pi@
// π の値を画面に表示します

math.Pow(num, p)

戻り値:number
数値を指定されたべき乗で返します。

var number = math.Pow(3, 2)
// number は 9 になります

math.Round(num)

戻り値:number
数値を最も近い整数に丸めます。

var number = math.Round(2.7)
// number は 3.0 になります

math.RoundToInt(num)

戻り値:integer
数値を最も近い整数に丸めます。

var number = math.RoundToInt(2.7)
// number は 3 になります

math.Sign(num)

戻り値:number
指定された数値が負数の場合、-1 を返します。それ以外の場合は 1 を返します。

var sign = math.Sign(-21)
var n = 10 * sign
// n は -10 になります

math.Sin(num)

戻り値:number
指定されたラジアン単位の角度の正弦を返します。

var number = math.Sin(math.pi / 2)
// number は 1 になります

math.Sqrt(num)

戻り値:number
数値の平方根を返します。

var number = math.Sqrt(9)
// number は 3 になります

math.Tan(num)

戻り値:number
指定されたラジアン単位の角度の正接を返します。

var number = math.Tan(2)
// number は -2.18504 になります

math.ToDeg(num)

戻り値:number
ラジアン単位の数値を度に変換します。

var number = math.ToDeg(2 * math.pi)
// number は 360 になります

math.ToRad(num)

戻り値:number
度数の数値をラジアンに変換します。

var number = math.ToRad(360)
// number は 2π になります

math.BigNumber() / math.BigNumber(number) / math.BigNumber(str)

BigNumberオブジェクトを作成します。
浮動小数点数または整数から新しいBigNumberオブジェクトを作成するか、文字列をBigNumberオブジェクトに解析します。

var myBigNum = math.BigNumber("500")
myBigNum.Add(500).Mul(1000).Mul(1000).Mul(1000)
>@myBigNum@
// 1000000000000

▲ 上に戻る


music(音楽)

?music

戻り値:string
現在再生中の音楽のIDを返します。

// 例:
>`0,0,現在の音楽 = @music@

music.Play(str)

戻り値:なし
指定された音声IDで音楽を再生します。同時に再生できる音楽は1つだけです。

// 例:
?loc.begin | loc.loop
  music.Play(temple_0)

music.Stop()

戻り値:なし
すべての音楽を停止します。

// 例:
?!string.Equals(music, "")
  music.Stop()

▲ 上に戻る


player(プレイヤー)

player.ShowScaredFace(num)

戻り値:なし
プレイヤーがビッグヘッドを有効にしている場合、指定された時間の間、彼らの表情が怖がったものに変わります。

// 例:
?key = primaryBegin
  player.ShowScaredFace(1)

▲ 上に戻る


screen(画面)

screen.FromWorldX(int)

戻り値:integer
X軸上の値をワールド空間からスクリーン空間に変換します。

screen.FromWorldZ(int)

戻り値:integer
ワールド空間のZ軸からスクリーン空間のY軸に値を変換します。

// 例:
var x
var y
x = screen.FromWorldX(pos.x)
y = screen.FromWorldZ(pos.z - pos.y)
>`0,1,画面上のプレーヤーの位置: @x@,@y@

screen.ToWorldX(int)

戻り値:integer
X軸上の値をスクリーン空間からワールド空間に変換します。

screen.ToWorldZ(int)

戻り値:integer
スクリーン空間のY軸からワールド空間のZ軸に値を変換します。

// 例:
var x
var y
var z
x = input.x
y = input.y
>`0,1,画面上のカーソル位置: @x@,@y@

x = screen.ToWorldX(input.x)
z = screen.ToWorldZ(input.y)
>`0,2,ワールド上のカーソル位置: @x@,@z@

screen.Next()

戻り値:なし
マルチスクリーンの場所のために、プレイヤーに対してカメラを前方に1つスクリーン移動させます。

// 例:
?key = rightBegin
  screen.Next()

screen.Previous()

戻り値:なし
マルチスクリーンの場所のために、プレイヤーに対してカメラを後方に1つスクリーン移動させます。

// 例:
?key = leftBegin
  screen.Previous()

screen.ResetOffset()

戻り値:なし
カメラをプレイヤーに再び追従させ、screen.Next() および screen.Previous() によって行われた変更を元に戻します。

// 例:
var lastScreenI = -1
?lastScreenI ! screen.i
  screen.ResetOffset()
lastScreenI = screen.i

▲ 上に戻る


storage(記憶域)

永続的な保存領域に保存された値は、ロケーションを離れたとき、およびゲームがシャットダウンしたときにも保持されます。

これらの値は主要な保存データ(primary_save)の一部ではなく、代わりにStonescriptフォルダ内の一連の別々のファイルに存在します。

インポートされたスクリプトは、互いに分離された状態で保存領域にアクセスし、異なるモジュールが同じキーを使用しても、互いのデータを変更せずに使用できます。

storage.Delete(string)

戻り値:なし
指定されたキーに存在する可能性のある値を削除します。

// 例:
storage.Delete("highscore")

storage.Get(string)

戻り値:value
指定されたキーに格納された永続的な値を取得します。

// 例:
var value = storage.Get("highscore")
?value
  >最高得点 = @value@
:
  >最高得点は見つかりませんでした。

storage.Get(string, value)

戻り値:value
指定されたキーに格納された永続的な値を取得します。 見つからない場合、デフォルト値として第二パラメーターが返されます。

// 例:
var value = storage.Get("highscore", 0)
>最高得点 = @value@

storage.Has(string)

戻り値:boolean
永続ストレージに指定されたキーが存在する場合は true を返し、それ以外の場合は false を返します。

// 例:
?storage.Has("highscore")
  var value = storage.Get("highscore")
  >最高得点 = @value@
:
  >最高得点は見つかりませんでした。

storage.Incr(string)

戻り値:integer
指定されたキーに格納された値を1増やし、新しい値を返します。

// 例:
?gameOver
  storage.Incr("stat_TimesPlayed")

storage.Keys()

戻り値:array
現在のコンテキストで利用可能なすべてのストレージキーを含む文字列の配列を取得します。

// 例:
var a
?time % 30 = 0
  a = storage.Keys()
  for i = 0 .. a.Count()-1
    >キー @i@ = @a[i]@

storage.Incr(string, integer)

戻り値:integer
指定されたキーに格納された値を指定された量だけ増やし、新しい値を返します。

// 例:
var amount
?foundCoins
  amount = rng%5 + 5
  storage.Incr("coins", amount)

storage.Set(string, value)

戻り値:なし
指定されたキーに値を永続的なストレージに保存します。

// 例:
var score = 1000
storage.Set("highscore", score)

▲ 上に戻る


string(文字列)

string.Break(string, integer)

戻り値:array
最大幅を指定して文字列を複数の文字列に分割します。

// 例:
var s = "The brown fox jumps over the lazy dog"
var a = string.Break(s, 14)
for i = 0 .. a.Count()-1
  >`0,@i@,@a[i]@

string.Capitalize(str)

戻り値:string
文字列の最初の文字を大文字に変更します。

// 例:
var a = "foo"
a = string.Capitalize(a)
>@a@

string.Equals(str1, str2)

戻り値:boolean
2つの文字列パラメータを受け取り、それらが完全に同じ場合にtrueを返します。
そうでない場合はfalseを返します。大文字と小文字を区別します。

// 例:
var a = "foo"
?string.Equals(a, "foo")
  >文字列は等しいです
:
  >等しくありません
// この場合、文字列は等しいため、string.Equals() はtrueを評価します

string.Format(str1, ...)

戻り値:string
文字列を修正し、フォーマットテンプレートを他のパラメータの値で置き換えてから、最終的な構成済み文字列を返します。

多くのフォーマットオプションをサポートする強力な関数です。

// 例:
var str = "My name is {0} and I have {1} power!"
var result = string.Format(
^  str,
^  player.name,
^  totalgp
^)
>@result@

string.IndexOf(str, criteria)

戻り値:integer
文字列変数と文字列基準をパラメータとして受け取り、基準の位置を文字列内で見つけます。
見つからない場合は-1を返します。

// 例:
var a = "Hello World!"
var index = string.IndexOf(a, "llo")
// index は 2 です

string.IndexOf(str, criteria, startAt)

戻り値:integer
文字列変数、文字列基準、開始インデックスをパラメータとして受け取ります。
基準を文字列内で検索しますが、検索を開始する位置は 'startAt' です。見つからない場合は-1を返します。

// 例:
var a = "Hello World!"
var index = string.IndexOf(a, "llo", 4)
// index は -1 です。検索は位置4から始まったため、'llo'は見つかりませんでした。

string.Join(s, []) / string.Join(s, [], int) / string.Join(s, [], int, int)

戻り値:string
文字列の配列 [] を受け取り、区切り文字 "s" でそれを1つの文字列に結合します。開始インデックスと結合する要素の数を指定するオプションの整数パラメータを渡すことができます。インデックスのパラメータが提供されていない場合、配列全体が結合されます。

// 例:
var a = ["Hello", "World", "!"]
var b = string.Join(";", a)
>`0,0,@b@
// "Hello;World;!" を表示します。

// 例2:
var a = ["Hello", "World", "!"]
var b = string.Join(";", a, 1)
>`0,0,@b@
// "World;!" を表示します。

// 例3:
var a = ["Hello", "World", "!"]
var b = string.Join(";", a, 0, 2)
>`0,0,@b@
// "Hello;World" を表示します。

string.Size(str)

戻り値:integer
文字列変数をパラメータとして受け取り、グリフの数で長さを計算します。

// 例:
var a = "Hello World!"
var size = string.Size(a)
>size = @size@

string.Split(str) / string.Split(str, s…) / string.Split(str, s…, bool) / string.Split(str, bool)

戻り値:array
文字列を受け取り、それを文字列の配列に分解する。区切り文字が与えられない場合、文字列はスペースがあるところで分割される。
オプションのbooleanパラメータは、空のエントリを破棄するかどうかを指定します。

// 例:
var a = string.Split("Hello World !")
for i = 0 .. a.Count()-1
  >`0,@i@,[@i@] = @a[i]@
// 文字列を次のように分割します: "Hello", "World", "!"

// 例2:
var a = string.Split("Hello World !", " ", "l")
for i = 0 .. a.Count()-1
  >`0,@i@,[@i@] = @a[i]@
// 文字列を次のように分割します: "He", " ", "o", "Wor", "d", "!"

// 例3:
var a
a = string.Split("Hello World !","l","r",true)
for i = 0 .. a.Count()-1
  >`0,@i@,[@i@] = @a[i]@
// 文字列を次のように分割します: "He", "o Wo", "d !"

string.Sub(str, startAt)

戻り値:string
文字列変数と開始インデックスをパラメータとして受け取り、その点から文字列を分割します。

// 例:
var a = Hello World!
var subString = string.Sub(a, 6)
>substring = @subString@
// subStringは "World!" に等しいです。

string.Sub(str, startAt, length)

戻り値:string
指定された文字列変数、開始インデックス、および長さをパラメータとして受け取り、その開始地点から指定された長さで文字列を分割します。

// 例:
var a = "Hello World!"
var subString = string.Sub(a, 6, 3)
>substring = @subString@
// subString は "Wor" に等しいです。

string.ToLower(str)

戻り値:string
文字列内のすべての文字を小文字に変更します。

// 例:
var a = "Foo"
a = string.ToLower(a)
>@a@
// 画面に "foo" が表示されます。

string.ToUpper(str)

戻り値:string
文字列内のすべての文字を大文字に変更します。

// 例:
var a = "Foo"
a = string.ToUpper(a)
>@a@
// 画面に "FOO" が表示されます。

▲ 上に戻る


sys(システム)

(現在、sys namespaceは意図した通りに機能していません)

sys.cacheRemoteFiles

boolean
リモートからインポートされたファイルが実行間でキャッシュされるかどうかを示します。
デフォルトはtrueです。falseに設定すると、ロケーション画面からプレイを開始する際にリモートスクリプトが再ダウンロードされます。

開発中や新しいスクリプトの反復中にこれを変更すると便利です。このグローバルプロパティは実行間で保持されます。

// 例:
// "up" キーを入力として切り替え
// リモートキャッシュをオン/オフにする
?key = upBegin
  sys.cacheRemoteFiles = !sys.cacheRemoteFiles
  ?sys.cacheRemoteFiles
    >リモートキャッシング 有効
  :
    >リモートキャッシング 無効

sys.fileUrl

string (読み取り専用)
スクリプトをインポートする際に使用される現在のファイルパスのゲッターです。

デフォルト値はデバイスによって異なります。
PCの場合、デフォルト値はlocalです。
モバイルの場合、デフォルトはhttps://StonestoryRPG.com/stonescript/です。

>`0,1,ファイルurl = @sys.fileUrl@

sys.SetFileUrl(str)

戻り値:なし
importまたはnewコマンドを使用する際にインポートする元の場所を変更します。
Mind Stoneでのみ呼び出すことができ、インポートされたスクリプトに書かれている場合はエラーになります。

任意のURLをリモート場所として受け入れますが、ローカルドライブを指す "local" および公式 Stone Story RPG リポジトリを指す "remote" の値も受け入れます。
パラメータとして null が渡されると、ファイルURLはデバイスに応じたデフォルト値にリセットされます。このグローバルプロパティは実行間で保持されます。

// 例:
sys.SetFileUrl(
^"https://MyCoolDomain.com/scripts/")
import MyCombatScript

sys.os

戻り値:string
ユーザーのオペレーティングシステムを取得します。例:"Android"、"iOS"、"Linux"、"OSX"、または"Windows"などがあります。

sys.isMobile

戻り値:bool
ユーザーがAndroidまたはiOS上にいる場合、trueを返します。

sys.isPC

戻り値:bool
ユーザーがWin/Mac/Linux上にいる場合、trueを返します。

sys.isConsole

(公式manual,beta未掲載) 〜の場合、trueを返します。

▲ 上に戻る


Text Localization(テキストのローカリゼーション(地域化))

この文書執筆時点では、Stonescriptは12の言語をサポートしています。
いくつかの操作を使用して、カスタムスクリプトをプレイヤーが選択した言語に適応させることができます。

te.language

string
プレイヤーが設定で選択した言語のコードです。可能な値:

コード
EN English
PT-BR Portuguese (Brazil)
ZH-CN Chinese (Simplified)
ZH-TW Chinese (Traditional)
FR French
DE German
RU Russian
ES-LA Spanish (Latin America)
ES-EU Spanish (Spain)
JP Japanese
KR Korean
TK Turkish
// 例:
var lang = te.language
>言語 = @lang@

te.xt(str)

戻り値:string
指定された英語のテキストをプレイヤーが選択した言語に翻訳します。
翻訳バージョンが見つからない場合、代わりに入力テキストが返されます。
代わりにテキスト識別子(TID)を使用できる場合がありますが、TIDの網羅的なリストはこのマニュアルの範囲外です。

// 例:
var button = ui.AddButton()
button.text = te.xt(Play)
// この例を機能させるには設定で言語を変更します

te.GetTID(str)

戻り値:string
指定されたテキストのテキスト識別子(TID)を返します。
入力テキストは、プレイヤーが選択した言語を想定しています。

// 例:
var tid = te.GetTID("Play")
>`0,1,@tid@
// tid_button_play が画面に表示されます

te.ToEnglish(str)

戻り値:string
指定されたテキストをプレイヤーが選択した言語から元の英語テキストに翻訳します。
翻訳バージョンが見つからない場合、代わりに入力テキストが返されます。

>`0,1,@te.ToEnglish("Jogar")@
// 設定でポルトガル語が選択されている場合、"Play" が表示されます
// それ以外の場合、"Jogar" が表示されます

▲ 上に戻る


time(時間)

time.FormatCasual(int) / time.FormatCasual(int,bool)

戻り値:string
フレーム数を人間が読みやすい文字列(時間)に変換。 例: "1m 23s"。第2パラメータ(bool)はオプションです。'true' の場合、結果の精度が最大化されます。

// 例:
>`0,0,現在の時間 =
^ @time.FormatCasual(totaltime, true)@

time.FormatDigital(int) / time.FormatDigital(int,bool)

戻り値:string
フレーム数を人間に読みやすい文字列(時間)に変換。
例: "1:23"。第2パラメータ(bool)はオプションです。'true' の場合、結果の精度が最大化されます。

// 例:
>`0,0,現在の時間 =
^ @time.FormatDigital(totaltime, true)@

▲ 上に戻る


UI(ユーザーインターフェース)

Stonescriptの高度なUIシステムに関する詳細は、ユーザーインターフェースセクションを参照してください。
ui namespaceのその他の機能には、以下が含まれます。

ui.OpenInv()

戻り値:なし
インベントリ画面を開く。

ui.OpenMind()

戻り値:なし
マインドストーン画面を開く。

ui.ShowBanner(str) / ui.ShowBanner(str, str)

戻り値:なし
最大2つのメッセージを持つアニメーションバナーを表示します。
ui.ShowBanner() が呼び出されるたびにバナーアニメーションが再起動します。

// 例:
?key = timeBegin
  ui.ShowBanner("Hello World!")

▲ 上に戻る


Other(その他)

Type(var)

戻り値:string
変数の型を評価し、文字列表現を返します。
可能な型には 'string'、'int'、'bool'、'function'、'object'、および 'null' が含まれます。

// 例:
var a = 0
?Type(a) = int
  >変数 'a' は整数型です。

▲ 上に戻る


·:·:· 外部スクリプトのインポート ·:·:·

あなたのスクリプトはすべてMind Stoneにある必要はありません。
Stonescriptは 'import' および 'new' キーワードを使用して外部ファイルの読み込みをサポートしています。

外部スクリプトが機能するためには、セーブファイルのフォルダ内にある /Stonescript フォルダ内に配置され、'.txt' で終わる必要があります。

最も基本的な例では、外部スクリプトがインポートされ、それがMind Stone内に直接あるかのように実行されます。
これはスクリプトを整理する便利な方法です。

import Rocky
import Deadwood
import Caves
import Forest

スクリプトがインポートされると、それが独自のコンテナにコピーされ、参照として返されます。
外部スクリプトで宣言された変数は分離され、他のスクリプトの変数とは干渉しません。

この例では、印刷ユーティリティスクリプトが簡略化されたサービスを提供しています:

// PrintUtil.txt
func LowerLeft(x, y, color, message)
  y = y + screen.h
  >`@x@,@y@,@color@,@message@

func LowerRight(x, y, color, message)
  x = x + screen.w
  y = y + screen.h
  >`@x@,@y@,@color@,@message@

Mind Stone内のメインスクリプトでは、このように使用できます:

var print = import PrintUtil
disable hud
print.LowerLeft(0,-1,#ffffff,"Health: " + hp)

高度なソリューションでは、コンポーネンティゼーションまたはオブジェクト指向パラダイムを実装するために、同じスクリプトを複数回 'new' コマンドを使用してインポートできます:

// Vector.txt
var x = 0
var y = 0

func init(_x, _y)
  x = _x
  y = _y

func subtract(otherVect)
  x = x - otherVect.x
  y = y - otherVect.y

Mind Stone内のメインスクリプトでは、このように使用できます:

var vectFrom = new Components/Vector
var vectTo = new Components/Vector

vectFrom.init(5, 4)
vectTo.init(8, 2)
vectTo.subtract(vectFrom)

>x = @vectTo.x@, y = @vectTo.y@

外部スクリプトは 'ToString()' 関数を実装でき、高度な印刷コマンドで直接使用できるようになります:

// Vector.txt
var x = 0
var y = 0

func init(_x, _y)
  x = _x
  y = _y

func ToString()
  return "(" + x + ", " + y + ")"

Mind Stone内のメインスクリプトでは、このように使用できます:

var v = import Components/Vector
v.init(3,5)
>Vector = @v@

外部スクリプトはサブフォルダからインポートできます:

import Games/Blackjack
import Cosmetics/PetFrog
import Cosmetics/Hats

'import' と 'new' の間には似ている点がありますが、2つの重要な違いがあります。 'import' では同じオブジェクトが毎回返されます。

同じスクリプトを複数の場所からインポートすると、それらはすべて同じオブジェクトを使用します。 'new' でインポートされたスクリプトは一意のコピーですが、そのスクリプト本体は1回だけ実行され、毎フレームでは実行されません。

▲ 上に戻る


·:·:· ASCIIアート ·:·:·

Stonescriptでは、カスタムASCIIアートをスクリプト内に埋め込み、高度な印刷コマンドで画面上に描画することができます。
これを行うためのいくつかの方法があり、一部の文字は特別な動作を持っています:

#

空白。透明。描画しません。

\n

改行。描画を次の行に続けます。

注意:
これはコストのかかる演算子であり、大規模な図形で行を分割するために使用すべきではありません。代わりに、ascii/asciiend ブロックを使用してください。

メソッド1 - 高度なプリント

この例では、画面の左上に緑の円を描画します。

>`1,0,#green,ascii
#.-.
(   )
#`-´
asciiend

メソッド2 - 変数

この例では、おどろおどろしい魚のアートを変数に保存し、それを赤い色で画面の左上に描画します。

var fishSprite
fishSprite = ascii
###(°_##
#_/_ o\#
#´  `'"#
asciiend

>`0,3,#red,@fishSprite@

▲ 上に戻る


·:·:· ループ ·:·:·

ループは、コードの一部を複数回実行することを可能にします。ループを作成するには、'for'キーワードを使用します。形式は以下の通りです:

for v = a..b

ループ変数 'v' は値 'a' でループを開始し、値 'b' に達するまで値が増加し、その後ループが終了します:

for i = 1..5
  >`0,@i@,i = @i@

ループ変数 'v' は 'for' の前に宣言されていてはいけず、ループのスコープに含まれています。ただし、開始値と終了値 'a' と 'b' はループの前に宣言できます:

var min = 1
var max = 4
var sum
sum = 0
for j = min..max
  sum = sum + j
>sum = @sum@

ループは逆方向に進むことも、負の数を使用することもできます:

var g
g = ""
for k = 5..-2
  g = g + k
>g = @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@

同様に、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@

この形式を使用して配列の要素をループ処理することも可能です:

var a = [1, 2, 3]
var n
n = ""
for value : a
  n = n + value
>n = @n@

▲ 上に戻る


·:·:· 配列 ·:·:·

配列は特別な種類の変数です。
値やオブジェクトを順次に整理し、1つの変数に割り当てるための手段を提供します。

a = []

新しい配列を初期化します。詳細は以下を参照してください。

a[integer]

指定された位置の値を読み取ります。

// 例:
var myArray = [10, 3]
?myArray[1] = 3
  >はい、[1] の位置の値は 3 です

a.Add(value)

新しい値/オブジェクトを配列の末尾に追加します。

// 例:
var myArray = []
myArray.Add(10)

a.Clear()

配列からすべての要素を削除し、配列を空にします。これは配列を [] で再宣言するよりも効率的です。

// 例:
var myArray = [10, 3]
myArray.Clear()

a.Contains(value)

指定された値が配列内に存在するかどうかを判断します。
見つかった場合は true を返し、それ以外の場合は false を返します。

// 例:
var myArray = [10, 3]
?myArray.Contains(3)
  >はい

a.Count()

配列内の要素数を返します。

// 例:
var myArray = ["apple", "banana"]
var size = myArray.Count()
>配列のサイズ = @size@

a.Emplace(integer, value)

指定された位置の値を新しい値で置き換えます。

// 例:
var myArray = [10, 3]
myArray.Emplace(0, 4)
var value = myArray[0]
>[0] の位置の値は今や @value@ です

a.IndexOf(value)

配列内で指定された値を検索します。最初に値が見つかった位置を示す整数を返します。値が見つからない場合は -1 を返します。

// 例:
var myArray = [10, 3]
var index = myArray.IndexOf(3)
>位置 @index@ で見つかりました

a.Insert(integer, value)

新しい値/オブジェクトを配列の特定の位置に追加します。
右側の要素は次の位置にシフトされます。

// 例:
var myArray = [10, 3]
myArray.Insert(1, "apple")
// 配列は [10, "apple", 3] になります

a.RemoveAt(integer)

特定の位置の配列内の要素を削除します。
削除された値が返されます。 ゼロベース: myArray.RemoveAt(0) は最初の要素を削除します。右側の要素は前の位置にシフトされます。

// 例:
var myArray = [1, 2, 3]
myArray.RemoveAt(1)
// 配列は [1, 3] になります

a.Sort()

配列の要素を昇順に整理します。
配列に異なる型のオブジェクトが含まれている場合、ソートされますが、期待される結果が定義されず、要素が型別にグループ化される保証はありません。

// 例:
var myArray = ["Cherry", 2, "Apple", 1, true, false, "Banana", 3]
var value

myArray.Sort()

for i = 0 .. myArray.Count() - 1
  value = myArray[i]
  >`0,@i@,@value@

以下は、配列を初期化および使用するさまざまな方法のいくつかです:

配列の初期化:

var emptyCollection = []

var magicNumbers = [10, 3, 0, 15, -7]

var someStrings = ["apple", "banana", "cherry"]

var sameButMultiLine = [
  "apple",
  "banana",
  "cherry",
]

var redeclaredEachFrame
redeclaredEachFrame = [] // PCに適していません

var clearedEachFrame = []
clearedEachFrame.Clear() // CPUとメモリにやさしい

var clearedEachLoop = []
?loc.begin | loc.loop
  clearedEachLoop.Clear()

var multiDimensional = [[], [], []]

var objectCollection = [
  new Components/Float,
  new Components/Float,
  new Components/Vector,
]

var animationFrames = [ascii
───┼
  O/
 /|
 / \
asciiend
^,ascii
   ---.
  O    \
 /|\┼───
 / \
asciiend
^]

配列のループ:

var myArray = ["Apple", "Banana", "Cherry"]
var count
var value

count = myArray.Count()
?count > 0
  for i = 0 .. count - 1
    value = myArray[i]
    >`0,@i@,@value@
// この例は画面の左側にフルーツの名前を表示します

多次元配列へのアクセス:

var a = [[1,2], [3,4]]
var value

value = a[1][0]
>位置(1, 0)で値@value@を見つけました

▲ 上に戻る


·:·:· カスタム入力 ·:·:·

Stonescriptは、?key game stateを使用してプレイヤーの入力を読み取ることができます。
これはAIの異なるモードなど、高度な動作を制御するのに使用できますが、カスタム入力を使用するとStone Storyの上に完全に新しい体験を作成することができます。

この例では、@記号をクラシックなRogue-likeゲームの主人公のように画面上を移動できます。
キーコード(leftBeginなど)はボタンの初回の押下を指します。

var x = 0
var y = 0

?key = leftBegin
  x--
  ?x < 0
    x = 0
?key = rightBegin
  x++

?key = upBegin
  y--
  ?y < 0
    y = 0
?key = downBegin
  y++

>`@x@,@y@,#ffffff,@

利用可能なすべてのキーコードを含む表

Held Pressed Released Default PC
left leftBegin leftEnd A or ←
right rightBegin rightEnd D or →
up upBegin upEnd W or ↑
down downBegin downEnd S or ↓
primary primaryBegin primaryEnd LMB, Return
back backBegin backEnd X
ability1 ability1Begin ability1End Shift
ability2 ability2Begin ability2End Control
bumpL bumpLBegin bumpLEnd Z
bumpR bumpRBegin bumpREnd C
単語説明

ゲームのキーボードやコントローラーの入力状態を示すものです。それぞれの役割は以下の通りです

Held

キーが押された状態を表します。
プレイヤーが特定のキーを押し続けている場合、そのキーの名前がここに表示されます。

Pressed

キーが瞬間的に押された状態を表します。
プレイヤーが特定のキーを一度だけ押した場合、そのキーの名前がここに表示されます。

Released

キーが離された状態を表します。
プレイヤーが特定のキーを離した瞬間、そのキーの名前がここに表示されます。

Default PC

この列には、PCプラットフォームでのデフォルトのキーボード入力が示されます。
例えば、"A or ←" は、「Aキーまたは左矢印キー」という意味です。

▲ 上に戻る


·:·:· ユーザーインターフェース ·:·:·

ボタン、テキスト、アニメーション...
Stonescriptは、複雑なレイアウトと高性能なユーザーインターフェースを構築するためのシステムを提供します。

不可視の "root" パネルがシステムの基盤にデフォルトで存在します。
さまざまな他のUI要素をルートパネルに追加でき、追加された順序ですべての要素が一度に描画されます。
これには、追加のパネルなどが含まれ、ツリー構造を形成します。

root
│
├─ Panel
│  ├─ Text
│  ├─ ASCII-art
│  └─ Button
│
├─ Panel
│  ├─ Panel
│  │  └─ Text
...

UI(ユーザーインターフェース)

ui namespace内の関数を呼び出してインターフェースを構築します。

ui.root

Panel
ツリー全体の上に構築される基本的なUIオブジェクト。

// 例:
disable hud
ui.root.visible = true

ui.AddAnim(string)

戻り値:Anim
ルートパネルにAnimオブジェクトを追加します。
アニメーションスプライトシートをパラメータとして受け入れます。

// 例:
?loc.begin
  ui.AddAnim(ascii
\o)
%%
(o/
asciiend)

ui.AddButton()

戻り値:Button
ルートパネルにButtonオブジェクトを追加します。

// 例:
func OnPressed()
  > こんにちは、世界!

?loc.begin
  var button = ui.AddButton()
  button.y = 1
  button.text = "押してください"
  button.SetPressed(OnPressed)

ui.AddPanel()

戻り値:Panel
ルートパネルにPanelオブジェクトを追加します。
パネルは他の要素のコンテナとして重要なオブジェクトです。

// 例:
?loc.begin
  var p = ui.AddPanel()
  p.color = #red

ui.AddStyle()

戻り値:int
四角形のコンポーネント(パネルやボタンなど)の描画に使用できる新しいスタイルを追加します。
新しいスタイルのID番号を返します。
同じスタイルが複数回追加されるのを防ぎます。

異なるスクリプトがui.AddStyle()を呼び出す可能性があるため、スクリプトにスタイル番号をハードコーディングする代わりにIDを変数として保存することをお勧めします。

// 例:
var customStyle = ui.AddStyle("
^123
^456
^789")
?loc.begin
  var p = ui.AddPanel()
  p.style = customStyle

ui.AddText() / ui.AddText(string)

戻り値:Text
ルートパネルにTextオブジェクトを追加します。

// 例:
?loc.begin
  var t = ui.AddText()
  t.text = "こんにちは、世界!"

ui.Clear()

戻り値:なし
メインコンテナからすべてのUI要素を削除します。

// 例:
?key = backBegin
  ui.Clear()

▲ 上に戻る


Component(コンポーネント)

Componentは他のすべてのUIタイプの基本型です。 つまり、他の要素(パネル、テキスト、ボタン、およびアニメーション)はすべて次のプロパティを持っています。

component.x

integer
コンポーネントのX座標。
ドッキング位置を基準とした相対位置です。

component.y

integer
コンポーネントのY座標。
ドッキング位置を基準とした相対位置です。

component.w

integer
コンポーネントの幅。
オブジェクトの種類によってデフォルト値が異なります。

// 例:
button.w = string.Size(button.text) + 4
// ボタンの幅を現在のテキストに合わせて調整します(両側に+2)

component.h

integer
コンポーネントの高さ。
デフォルト値は5です。

// 例:
panel.h = panel.parent.h
// パネルの高さを親パネルの高さに合わせます

component.absoluteX / component.absoluteY

integer
読み取り専用
コンポーネントの画面に対する位置です。

// 例:
var t
?loc.begin
  var p = ui.AddPanel()
  p.anchor = bottom_right
  p.dock = bottom_right
  t = ui.AddText("Foo")
  p.Add(t)
>`0,1,相対座標 = @t.x@,@t.y@
>`0,2,絶対座標 = @t.absoluteX@,@t.absoluteY@

component.anchor

string
コンポーネントの内部ピボットを表す自動レイアウトプロパティ。
これはコンポーネントを自身に対してどのように配置するかをUIシステムに指示します。
デフォルト値は "center_center" です。

可能な値:
top_left top_center top_right
center_left center_center center_right
bottom_left bottom_center bottom_right

component.dock

string
anchorに似た自動レイアウトプロパティです。
ただし、dockは外部ピボット、またはコンポーネントを配置する親内の位置を表します。
疑念がある場合、anchorとdockに同じ値を使用することが一般的です。

// 例:
?loc.begin
  var p = ui.AddPanel()
  p.anchor = top_right
  p.dock = top_right
  p.w = 20
  p.h = 9
  var t = ui.AddText("HelloWorld!")
  t.anchor = left_bottom
  t.dock = bottom_left
  t.x = 2
  t.h = t.lines.Count() + 1
  p.Add(t)

component.ax

string
anchorのX部分。

可能な値:
left center right

component.ay

string
anchorのY部分。

可能な値:
top center bottom

component.dx

string
dockのX部分。

可能な値:
left center right

component.dy

string
dockのY部分。

可能な値:
top center bottom

// 例:
var p
?loc.begin
  p = ui.AddPanel()
  p.ax = right
  p.ay = top
  p.dx = right
  p.dy = top

component.parent

Panel
読み取り専用
コンポーネントの親パネルへの参照。
コンポーネントが別のパネルに追加されなかった場合、ルートパネルを指します。 panel.Add(component)が呼び出されると、コンポーネントの親が変更されます。

component.visible

マルチタイプ
bool/string
コンポーネントの可視性。
デフォルト値は "inherit" です。

可能な値:
true false inherit

'true'に設定すると、コンポーネントは常に表示され、親の状態に関係なく可視です。
'false'に設定すると、コンポーネントは親に関係なく不可視になります。
ただし、'inherit'に設定すると、コンポーネントは親の可視性に従います。

component.Recycle()

戻り値:なし
コンポーネントを親パネルから削除します。
将来のui.Add_()呼び出しで再利用されます。

リサイクルされた要素への変数参照はバグを避けるためにnullにするか再割り当てする必要があります。

▲ 上に戻る


Panel > Component(パネル > コンポーネント)

「Panel」は、他のコンポーネントを格納するコンテナとして機能する四角形のコンポーネントです。
お互いに追加されたパネルの連鎖は、ツリー構造を形成します。

panel.children

Component[]
Panelに追加されたすべての子コンポーネントを含む配列です。

panel.clip

bool
Panelの境界が子コンポーネントの描画を制限するかどうかを示します。
trueの場合、Panelの境界外にある子コンポーネントの一部は描画されません。

例:
var p
?loc.begin
  p = ui.AddPanel()
  p.w = 4
  p.h = 3
  var t = ui.AddText("The quick brown fox jumps
^ over the lazy dog.")
  p.Add(t)

?time%30 < 15
  p.clip = true
:
  p.clip = false

panel.color

string
Panelの色です。RGBの16進数形式で表現されます。

panel.style

int
Panelの現在のスタイルのID番号です。
デフォルト値は1です。
-8から8までの可能な値があります。

追加のスタイルはui.AddStyle()を使用して追加できます。

panel.Add(Component) / panel.Add(Component, int)

戻り値:なし
ComponentをPanelに追加します。
ComponentはPanelの子になり、PanelはComponentの親になります。

要素がPanelに追加される順序は、描画順に影響します。
オプションの整数パラメータを使用して特定のソート位置に要素を挿入できます。
整数パラメータが指定されない場合、ComponentはPanelの最後の子として追加されます。

この関数は、すでにPanelの子であるComponentの描画順序を変更するためにも使用できます。

panel.Clear()

戻り値:なし
PanelからすべてのUI要素を削除します。
この方法で削除されたComponentはUIシステムに再利用され、将来のui.Add_()呼び出しで再利用されます。

これらの要素への変数参照は、バグを回避するためにnullにしたり再割り当てしたりする必要があります。

panel.Remove(Component) / panel.Remove(int)

戻り値:なし
Panelから特定のComponentを削除するか、指定されたインデックス番号のComponentを削除します。
この方法で削除されたComponentはUIシステムに再利用され、将来のui.Add_()呼び出しで再利用されます。

これらの要素への変数参照は、バグを回避するためにnullにしたり再割り当てしたりする必要があります。

▲ 上に戻る


Text > Component(テキスト > コンポーネント)

「Text」は、複数行のテキストボックスを表すコンポーネントです。
カラーメタデータをサポートします。

text.align

string
ボックス内のテキストの配置/整列設定。
デフォルト値は "left" です。

可能な値:
left center right

text.color

string
テキストの色、RGB 16進数形式で指定します。

text.lines

string[]
Text ボックスが内容をフォーマットした後の、改行されたテキストの配列です。
カラー メタデータは除外されます。

text.text

string
Text ボックスの全内容です。
テキストの一部にはメタデータ [color=#rrggbb][/color] で色が付けられていることがあります。

?loc.begin
  var t = ui.AddText()
  t.text = "こんにちは [color=#red]世界[/color]!"

▲ 上に戻る


Button > Component(ボタン > コンポーネント)

button.text

string
ボタン内に表示されるテキストです。

button.tcolor

string
ボタン内のテキストの色です。
RGB 16進数形式で指定します。

button.bcolor

string
ボタンの境界線の色です。
RGB 16進数形式で指定します。

button.hcolor

string
ボタンが押されたときのハイライト色です。
RGB 16進数形式で指定します。

button.sound

string
ボタンが押されたときに再生される効果音です。
デフォルトは "confirm" です。

button.style

int
ボタンの現在のスタイルのID番号です。
デフォルト値は 1 です。
-8から8までの値が可能です。

ui.AddStyle()で追加のスタイルを設定できます。

button.SetPressed(f)

function callaback
ボタンが押されたときに呼び出される関数を割り当てます。
関数は任意の数のパラメータを持つことができます(パラメータがない場合も含む)。
関数が呼び出されると、最初のパラメータはボタンへの参照になります。

button.SetDown(f)

function callaback
ボタンが押された瞬間(最初のユーザーコンタクト)に呼び出される関数を割り当てます。

button.SetUp(f)

function callaback
ボタンの上での押し上げが終了したときに呼び出される関数を割り当てます。

例:
var button1
var button2
func OnPressed(btn)
  ?btn = button1
    >ボタン1が押されました
  :
    >ボタン2が押されました

?loc.begin
  button1 = ui.AddButton()
  button1.y = 1
  button1.SetPressed(OnPressed)

  button2 = ui.AddButton()
  button2.y = 6
  button2.SetPressed(OnPressed)

▲ 上に戻る


Anim > Component(アニメ > コンポーネント)

UIに追加できるASCIIスプライトシートアニメーション。

anim.color

string
アニメーションの色をRGBの16進数形式で表します。

anim.duration

int
アニメーションの時間長(フレーム単位)です。

anim.flipX

bool
true の場合、アートを水平に反転させ、そのピボットを中心にします。

anim.flipY

bool
true の場合、アートを垂直に反転させ、そのピボットを中心にします。

anim.frame

int
描画中の現在のアニメーションフレームです。アニメーションを特定のフレームに設定するために変更できます。

anim.gamePause

bool
true の場合、プレイヤーがゲームを一時停止した場合、アニメーションは自動的に一時停止し、プレイヤーが一時停止画面から復帰した際に再生が再開されます。

anim.loop

bool true の場合、アニメーションは持続時間の終わりに達した直後に最初から再スタートします。

anim.playing

bool
読み取り専用
アニメーションが現在再生中である場合にtrueです。

anim.paused

bool 読み取り専用
アニメーションが再生中であり、anim.Pause() を呼び出して一時停止されている場合にtrueです。

anim.pivotX / anim.pivotY

int
ASCIIアートが描かれる位置に関連して微調整に使用できる追加のピボットオフセットです。

anim.playOnStart

bool
trueの場合、アニメーションはできるだけ早く再生を開始します。

anim.AddLayer(string)

戻り値:Anim
新しいASCIIスプライトをこのアニメーションの上に追加します。

アニメーションが再生されると(またはanim.frameでフレームが変更されるか)、すべてのレイヤーが同期します。

各レイヤーには、色、ピボットなどのプロパティがあります。複雑なASCIIアートにアニメーションレイヤーを使用する利点は、パフォーマンスの向上とコードの品質向上です。

アニメーションがリサイクルされると、すべてのレイヤーが同時にクリーンアップされます。

// 例:
var a = ui.AddAnim(asciiArtA)
var layer2 = a.AddLayer(asciiArtB)
layer2.color = #bbbbbb

anim.Load(string)

戻り値:なし
新しいASCIIスプライトシートを割り当てます。

anim.Pause()

戻り値:なし
アニメーションの再生を現在のフレームで一時停止します。
anim.Play()を呼び出して再生を再開します。

anim.Play()

戻り値:なし
アニメーションの再生を開始します。または一時停止されていた場合、再生が再開します

var dance
?loc.begin
  dance = ui.AddAnim(ascii
(O/
%%
\O)
asciiend)
  dance.duration = 20
  dance.loop = true
  dance.Play()

anim.Stop()

戻り値:なし
再生を一時停止し、アニメーションを最初のフレームに戻します。

Canvas > Component(キャンバス > コンポーネント)

任意のグリフと色を描画するために最適化されたコンテナ。

canvas.blend

string
キャンバスのブレンドモード。
キャンバスが背後の要素と合成される際のブレンドモード。
デフォルト値は"opaque"です。

可能な値:
Opaque = 不透明
Multiply = 乗算
Divide = 除算
Add = 加算
Subtract = 減算

// 例:
var filter1 = ui.AddCanvas()
var filter2 = ui.AddCanvas()
filter1.w = screen.w
filter1.h = screen.h
filter2.w = screen.w
filter2.h = screen.h

filter1.blend = "multiply"

filter1.SetFG(#aa5555)
filter1.SetBG(#dddddd)

filter2.blend = "add"

filter2.SetFG(#aa6600)
filter2.SetBG(#662200)

canvas.Get(int,int)

戻り値:string
キャンバス上の特定の位置 x, y にあるグリフを返します。

canvas.Set(str)

戻り値:なし
指定されたグリフでキャンバス全体を塗りつぶします。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set("X")

canvas.Set(int,int,str)

戻り値:なし
キャンバス上の特定の位置 x, y を指定したグリフに変更します。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set(0, 0, "A")

canvas.Set(int,int,fg,str) / canvas.Set(int,int,fg,bg,str)

戻り値:なし
特定の位置のキャンバスを変更し、同時に前景色と背景色を設定するためのオーバーロードです。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  for x = 0..canvas.w
    for y = 0..canvas.h
      var fg = color.Random()
      var bg = color.Random()
      canvas.Set(x, y, fg, bg, "▄")

canvas.SetFG(color)

戻り値:なし
キャンバス全体に前景色を設定します。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set("R")
  canvas.SetFG(#red)

canvas.SetFG(int,int, color)

戻り値:なし
特定の位置 x, y で前景色を変更します。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set("X")
  canvas.SetFG(2, 1, #ff00ff)

canvas.SetBG(color)

戻り値:なし
キャンバス全体に背景色を設定します。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set("g")
  canvas.SetBG(#00aa00)

canvas.SetBG(int,int,color)

戻り値:なし
特定の位置 x, y で背景色を変更します。

// 例:
?loc.begin
  var canvas = ui.AddCanvas()
  canvas.Set("X")
  canvas.SetBG(2, 1, #yellow)

▲ 上に戻る


·:·:· ヒント ·:·:·

スペース(インデント)*1は、'?'の比較(スコープ)の結果として何が起こるかを定義する際に重要です。

実行中にスクリプトを変更するには、キーボードの 'M' キーを押します。
Mind Stoneの右上にある電源ボタンは、スクリプトをON/OFFに切り替えます。

複数のequipコマンドが呼び出された場合、最後に呼び出されたものが実行されます。
スクリプトは1秒あたり30回実行されます(1フレームごとに1回)。

異なるスクリプトを試すには、それらをNotepadなどの外部テキストエディタにコピーすることをお勧めします。
Ctrl+A(全選択)、Ctrl+C(コピー)、Ctrl+V(貼付)などの一般的なショートカットが役立ちます。

ゲーム内でTabキーを押すと、ゲームの状態に関する多くの情報が表示され、最近のStonescriptエラーのリストも表示されます。
テキスト内でのprintコマンドを複数行に分割するには、テキスト内で '\n' を使用します。


·:·:· デフォルトスクリプト ·:·:·

import Fishing

?hp < 7
  activate potion
?loc = caves
  equipL sword
  equipR shield
  ?foe = boss
    equip crossbow

スクリプトの翻訳

'Fishing'をインポート
(川でフィッシングゲームをプレイ出来るようになります)

プレイヤーhpが7未満の場合、
  ポーション発動
場所が洞窟の場合、
  swordを左に装備
  shieldを右に装備
  場所が洞窟かつ敵がボスの場合
      crossbowを装備
      (両手武器はequipにL,Rをつけません)

▲ 上に戻る


·:·:· ロードマップ ·:·:·

計画中でまだゲームに実装されていない機能:

  • ラインの描画
  • Find()を使用して敵や装飾物の参照を取得
  • 敵、装飾物、武器のネイティブなモッディング
  • ユーザー生成のサイドクエストで使用するための拡張API
  • パーティクルエミッション
  • equipF (str) - アイテムをフェアリーに装備
  • foes - 46ユニット以内の敵のリスト

▲ 上に戻る


·:·:· 付録 A - 効果音 ·:·:·

Stonescriptは、カスタムロジックに基づいてゲームからサウンドエフェクトを再生できます。この例では、プレイヤーが体力を失うたびに'unequip'のサウンドが再生されます。

var lasthp = hp
?hp < lasthp
  play unequip
lasthp = hp

ほとんどのサウンドには、ランダムまたは連続的に再生するバリエーションがあります。
同じサウンドが1フレーム内で複数回再生されると、無視されます。1秒間に5つ以上のサウンドが再生される場合、サウンドは制限されます。

以下はStone Story RPGで利用可能なサウンドの完全なリストです:

効果音リスト

buy
click
confirm
soul_stone
sword_cast
sword_hit
wand_cast
wand_hit
player_kick
player_punch
stone_throw_cast
stone_throw_hit
grappling_cast
grappling_hit
grappling_idle
hatchet_cast
hatchet_hit
shovel_cast
torch_cast
torch_hit
torch_idle
pickup_stone
pickup_wood
pickup_tar
pickup_success
soul_stone_drop
wand_drop
key_drop
cross_deadwood_bump
cross_deadwood_row
cross_deadwood_splash
ui_starfirst
ui_starnew
ui_starold1
ui_starold2
ui_starold3
ui_starold4
bronze_gate_open
prompt_choice
waterfall_hook_hit
waterfall_splash
haunted_gate_key_bounce_1
haunted_gate_key_bounce_2
haunted_gate_key_bounce_3
haunted_gate_opening
haunted_gate_point_lost
haunted_gate_key_into_gate
haunted_gate_shuffle
haunted_gate_shuffle_fast
haunted_gate_torch_off
haunted_gate_torch_on
haunted_gate_try_to_open
paint_splat
waterfall_land
waterfall_rope_grab
waterfall_rope_swing
skeleton_boss_death
skeleton_boss_legs_die
spider_boss_death
tree_boss_death
mushroom_boss_death
tree_boss_attack
tree_boss_awake
tree_boss_idle
tree_boss_spike
spider_boss_attack
player_hit
mushroom_boss_awake
mushroom_boss_punch
mushroom_boss_shoot
skeleton_boss_arm1
skeleton_boss_arm2
skeleton_boss_attack
skeleton_boss_idle
skeleton_boss_bone_bounce
skeleton_boss_arm_woosh
equip
unequip
bat_attack_small
bat_death_small
bat_wing
bat_wing_small
spider_attack
spider_death
spider_death_small
spider_eggs_spawn
spider_walk
scarab_awake
scarab_bite
scarab_death
scarab_horn
scarab_wings
mosquito_attack
mosquito_death
mosquito_loop
bronze_gate_locked
bat_attack
bat_death
progress_1
progress_2
progress_3
progress_4
progress_5
progress_6
progress_7
progress_8
progress_9
life_gain
player_death
logo_full
logo_short
smithy_hammer
sightstone_cast
error
ranting_tree_halt
treasure_close
treasure_item_pop
treasure_item_show
treasure_open
skeleton_boss_awake
skeleton_boss_hand_slam
level_up
insta_kill
spider_boss_awake
metal_drop
treasure_drop
smithy_hammer_fail
xp_tick
crossbow_cast
crossbow_hit
wand_aether_cast
wand_aether_hit
wand_air_cast
wand_air_hit
wand_fire_cast
wand_fire_hit
wand_ice_cast
wand_ice_hit
wand_poison_cast
wand_poison_hit
wand_vigor_cast
wand_vigor_hit
skeleton_boss_arm_reconnect
skeleton_boss_summon_minions
mushroom_boss_fat_slam
pickup_bronze
temple_npc_chant
temple_npc_clear_throat
temple_npc_talk
first_controller
slave_npc
slave_outro_chatter
slave_outro_voice
haunted_gate_npc_voice
slave_outro_transition
bronze_guardian_attack1
bronze_guardian_attack2
bronze_guardian_attack3
bronze_guardian_death
bronze_guardian_helmet
bronze_guardian_power_up
bronze_guardian_steps
ant_attack
ant_death
ant_walk
snail_attack
snail_attack_small
snail_death
snail_death_small
snail_walk
ghost_death
ghost_death_small
skeletimmy_death
skeletony_death
skeletimmy_attack
skeletony_attack
skeletony_awake_a
skeletony_awake_b
skeletony_walk
ghost_loop
ghost_loop_small
ghost_attack
ghost_attack_small
controller_death
controller_whip_attack
controller_whip_hit
dominotaur_death
dominotaur_whip_attack
dominotaur_whip_hit
mine_walker_death
mine_walker_attack_a
mine_walker_attack_b
mine_walker_attack_hit
mine_walker_awake
mine_walker_step
fire_elemental_attack
fire_elemental_attack_hit
fire_elemental_awake
fire_elemental_death
mine_walker_helmet_break
ice_elemental_attack
ice_elemental_attack_hit
ice_elemental_awake
ice_elemental_death
ki_eater_attack
ki_eater_attack_hit
ki_eater_awake
ki_eater_death
ki_gobbler_attack
ki_gobbler_attack_hit
ki_gobbler_awake
ki_gobbler_death
ki_slerper_attack
ki_slerper_attack_hit
ki_slerper_awake
ki_slerper_death
ki_slerper_walk
mindstone_found
ghost_tomb_death
perfected_fly_start
perfected_fly_loop
perfected_fly_end
shop_door_open
shop_door_enter
scorpion_death
bomb_cart_explosion
bomb_cart_fuse
bomb_cart_move
bronze_gate_close
poison_powerup
acronian_cultist_power_up
giant_ice_elemental_attack
scout_dialog
morel_punch
falling_stonefolk
scout_arrives
scout_leaves
scout_wing
scout_focus
dog_bark
frog
lost_item_boost
treasure_item_lost
blade_glow
blade_pallas_attack
blade_raise
blade_drag
auggie_voice
pallas_voice
quest_stone_jump
quest_stone_unlock
bardiche_cast
boo_voice
quarterstaff_cast
air_hiss
bang_go_forward
fire_orbs
open_note
talisman_reveal
fire_beast_1
fire_beast_2
uulaa_voice
mask_summon_1
mask_summon_2

▲ 上に戻る


·:·:· 付録 B - 音楽 ·:·:·

Stonescriptは、カスタムロジックに基づいてゲームの音楽トラックを再生することができます。
利用可能なトラックはプラットフォームに依存します。

?loc.begin | loc.loop
  music.Play(temple_0)

以下はStone Story RPGで利用可能な音楽の完全なリストです:

Boiling Mine
bronze_guardian_3
bronze_guardian_4
bronze_guardian_5
bronze_guardian_cyan
bronze_mine_0
bronze_mine_1
bronze_mine_2
bronze_mine_3
bronze_mine_4
bronze_mine_5
bronze_mine_cyan
slave_outro_climb
slave_outro_loop

Caves of Fear
caustic_caves
spider_boss

Deadwood
cross_deadwood_river
cross_deadwood_wind
deadwood_0
deadwood_1
deadwood_2
deadwood_3
deadwood_4
deadwood_5
deadwood_cyan
tree_boss
waterfall_descent
poena

Haunted Halls
skeleton_boss
undead_crypt_0
undead_crypt_1
undead_crypt_2
undead_crypt_3
undead_crypt_4
undead_crypt_5
undead_crypt_cyan
undead_crypt_intro

Icy Ridge
bridge_broken
bridge_crossing
icy_ridge_0
icy_ridge_1
icy_ridge_2
icy_ridge_3
icy_ridge_4
icy_ridge_5
icy_ridge_cyan
yeti

Mushroom Forest
fire_loop
fungus_forest_0
fungus_forest_1
fungus_forest_2
fungus_forest_3
fungus_forest_4
fungus_forest_5
fungus_forest_cyan
mushroom_boss
mushroom_boss_cyan
shop

Rocky Plateau
rocky_plateau_0
rocky_plateau_1
rocky_plateau_2
rocky_plateau_3
rocky_plateau_4
rocky_plateau_5
rocky_plateau_epilogue
rocky_plateau_fight
rocky_plateau_talk

Temple
nagaraja
temple_0
temple_1
temple_2
temple_3
temple_4
temple_5
temple_cyan

Events
event_fall
event_hamartia
event_spring
event_stonejam
event_summer
event_winter

Other credits
main_menu
bone_factory
osteophone
uulaa

▲ 上に戻る


·:·:· 付録 C - 環境音 ループ ·:·:·

Stonescriptは、カスタムロジックに基づいて複数の背景アンビエントオーディオレイヤーを再生することができます。

?loc.begin
  ambient.Stop()
  ambient.Add(ambient_crypt)

以下はStone Story RPGで利用可能なアンビエントオーディオの完全なリストです:

ambient_mines  
ambient_caves  
ambient_bronze_gate  
ambient_deadwood  
ambient_mushroom  
ambient_bridge  
ambient_icy  
ambient_cave  
ambient_rocky  
ambient_temple  
ambient_crypt  
ambient_haunted_gate  
ambient_pallas  
waterfall_a  
waterfall_b  
waterfall_c  

▲ 上に戻る


> Stone Story RPGの案内へ戻る

*1:全角スペースはエラーになります

Stonescript おべんきょう 2

> Stone Story RPGの案内へ戻る


↓ 旧ページ
SSR_自分用おべんきょ - Stone Story RPGを機械翻訳 + 備忘録

モンテスちゃんの学び舎その2👶

(:зꇤ )ニ キュ

ふとした時に見るリンク
ja.javascript.info
mozilla.org/ja
docs.python.org/ja
utokyo-ipp.github

内部的な処理の流れが分からない時

とにかくログをとる

var record = []

func write_logs(arr,cont)
  var arr_count = arr.Count()
  ?arr_count = 0
    arr.Add(cont)
  ?arr_count <= screen.h-3 & arr_count > 0
    arr.Insert(0,cont)
  
  /* 記録をし続けたい場合にこれも使う ***********
  ?arr_count > screen.h-3
    arr.RemoveAt(1,cont)
  **********************************************/

// 読み込み順テスト
?a
  write_logs(record,a+time)
  ?b
    write_logs(record,b+time)
?d
  write_logs(record,d+time)

// 読み込み順を表示
?record.Count()
  for i = 0..record.Count()-1
    >`1,@1+i@,[@i@] @record[i]@

▲ 上に戻る

全ての要素が真もしくは、iterable が空ならtrue

組み込み関数 — Python 3.12.3 ドキュメント
allちょろ確認(:зꇤ)ニ

var f_state_time
f_state_time = [foe.state,foe.time]

func all(iterable)
    for element : iterable
        ?!element
            return false
    return true

>`1,1,ascii
all       @all(f_state_time)@

foe.state @f_state_time[0]@
foe.time  @f_state_time[1]@
asciiend

▲ 上に戻る

foeの中身を被りなく保存する

スクショ用に(👀 )

var foe_arr
var foes_data = ""
var foe_id_name
foe_arr = string.Split(foe)
foe_id_name = string.Join(" ",foe_arr,0,2)

// 敵の情報を結合して1つの文字列にする
func combine_foes_data()
    var print_w = (screen.w - 2)
    var data_size = string.Size(foe)
    // foeの中身が指定サイズ以下
    ?data_size <= print_w
        foes_data = foes_data + "\n" + foe
    // ※ foeの中身が指定サイズ超過
    ?data_size > print_w
        var foe_arr = string.Break(foe,print_w)
        for i = 0..foe_arr.Count()-1
            foes_data = foes_data + "\n" + foe_arr[i]

// foe_id_nameはユニークに近い文字列にする
// ※ 長い文字列を使わない(結合のループ防止)
?foes_data ! foe_id_name
    combine_foes_data()

// 敵データの表示
?foes_data
    >`1,0,@foes_data@

▲ 上に戻る

再帰処理

4. 関数の再帰呼び出しの動作原理 プログラミング2
Recursive -Slide-

func sum_natural_numbers(n)
    ?n <= 0
        return n
    return n + sum_natural_numbers(n-1)

>`1,6,@sum_natural_numbers(9)@
// 45

Stone Story RPGって以前体験した事あるような独特な世界だな〜と思っていたけど、パタポンだ👶(RATATANっていう精神的続編が出るみたいだね)

おちゃらけた世界のようで敵の苦悩も見えるし、無邪気な残酷さも相まってダークファンタジーとしても楽しめる
ベルセルク好きにも刺さるん

▲ 上に戻る

if文の型や真偽結果を色々表示すると

意外な所でfalseになっていたり

Manual 機械翻訳のコードをブックマークレットで一括取得し、一部コピーしたものをAIでテキスト整形しますた ChatGPT

ChatGPT指示文 配列のカンマ区切り

# 指示 テキスト変換
変換前:
a
b
c
変換後:
a
,b
,c


ChatGPT指示文 配列のコメントアウト連番

# 指示 テキスト変換
変換前:
a
,b
,c
変換後:
a  // 0
,b // 1
,c // 2


Manualページのコードを取得するブックマークレット

javascript:(function()%7Bvar%20newWindow=window.open('about:blank','_blank');newWindow.document.write('%3Chtml%3E%3Chead%3E%3Ctitle%3EExtracted%20Content%3C/title%3E%3C/head%3E%3Cbody%3E%3Cpre%3E');var%20h4IdElements=document.querySelectorAll('h4%5Bid%5D');var%20extractedText='';h4IdElements.forEach(function(element)%7Bvar%20textContent%20=%20element.textContent.trim();%20var%20codeTags%20=%20element.querySelectorAll('code');%20if%20(textContent.toLowerCase()%20!==%20'copy%20code'%20&&%20codeTags.length%20%3E%200)%20%7B%20codeTags.forEach(function(codeTag)%20%7B%20var%20copyButton%20=%20codeTag.querySelector('.copy-button');%20if%20(copyButton)%20%7B%20copyButton.parentNode.removeChild(copyButton);%20%7D%20if%20(!textContent.startsWith('?')%20&&%20!textContent.includes('?%20'))%20%7B%20extractedText%20+=%20codeTag.textContent%20+%20'%5Cn';%20%7D%20else%20%7B%20extractedText%20+=%20codeTag.textContent.replace(/%5E%5C%3F%5Cs*/mg,%20'')%20+%20'%5Cn';%20%7D%20%7D);%20%7D%7D);newWindow.document.write(extractedText);newWindow.document.write('%3C/pre%3E%3C/body%3E%3C/html%3E');%7D)();


なんて楽なんだぁ AI開発ありがたう

▼ 色々型チェック
表示が画面下部に達したら列を変えて表示

var test
test = [
    ((0*0)+"")                // 0
    ,-0                       // 1
    ,math.Pow(0,0)            // 2
    ,test                     // 3
    ,time.msbn                // 4
    ,true                     // 5
    ,fn                       // 6
    ,cnvs                     // 7
    ,summon.GetId()           // 8
    ,loc.stars                // 9
    ,item.left.id             // 10
    ,item.right.id            // 11
    ,item.left.state          // 12
    ,item.left.time           // 13
    ,item.right.state         // 14
    ,item.right.time          // 15
    ,item.potion              // 16
    ,item.CanActivate()       // 17
    ,item.GetCooldown("mask") // 18
    ,item.GetCount("socket sword +21") // 19
    ,item.GetLoadoutL(1)      // 20
    ,item.GetLoadoutR(1)      // 21
    ,foe                      // 22
    ,foe.id                   // 23
    ,foe.name                 // 24
    ,foe.damage               // 25
    ,foe.distance             // 26
    ,foe.count                // 27
    ,foe.GetCount(90)         // 28
    ,foe.hp                   // 29
    ,foe.maxhp                // 30
    ,foe.armor                // 31
    ,foe.maxarmor             // 32
    ,foe.buffs.count          // 33
    ,foe.debuffs.count        // 34
    ,foe.debuffs.string       // 35
    ,foe.state                // 36
    ,foe.time                 // 37
    ,foe.level                // 38
    ,foe.distance             // 39
    ,pickup                   // 40
    ,pickup.distance          // 41
    ,harvest                  // 42
    ,harvest.distance         // 43
    ,armor                    // 44
    ,armor.f                  // 45
    ,maxarmor                 // 46
    ,buffs.count              // 47
    ,buffs.string             // 48
    ,debuffs.count            // 49
    ,debuffs.string           // 50
    ,hp                       // 51
    ,maxhp                    // 52
    ,pos.x                    // 53
    ,pos.y                    // 54
    ,pos.z                    // 55
    ,ai.enabled               // 56
    ,ai.paused                // 57
    ,ai.idle                  // 58
    ,ai.walking               // 59
    ,player.direction         // 60
    ,player.name              // 61
    ,bighead                  // 62
    ,face                     // 63
    ,key                      // 64
    ,player.ShowScaredFace(5) // 65
]

// 画面表示 型/真偽の色分け
func show_types(arr)
    // 型判定の比較に使用するキーワード
    var search_types = [
        "string"    // 0
        ,"int"      // 1
        ,"float"    // 2
        ,"array"    // 3
        ,"bignumber"// 4
        ,"bool"     // 5
        ,"function" // 6
        ,"object"   // 7
        ,"null"     // 8
    ]
    // 型別の文字色
    var type_colors = [
        "#E5384D"  // 0
        ,"#38A8E5" // 1
        ,"#37E5D3" // 2
        ,"#F4BB54" // 3
        ,"#E55F36" // 4
        ,"#36E56B" // 5
        ,"#C454F4" // 6
        ,"#DDDDDD" // 7
        ,"#808080" // 8
    ]
    
    ?arr.Count()
        // _x x座標
        // _y y座標
        // _w ブロック幅
        var type_x  = 1
        var index_x = 11
        var bool_x  = 15
        var _y = 0
        var block_w = 25
        for i = 0..arr.Count()-1
            // 調整 xy座標
            ?_y = screen.h - 3
                type_x  += block_w
                index_x += block_w
                bool_x  += block_w
                _y = 0
            _y++
            // 表示 true/false判定
            ?arr[i]
                >`@index_x@,@_y@,#green,[@i@]
                >`@bool_x@,@_y@,#green,@arr[i]@
            ?!arr[i]
                >`@index_x@,@_y@,#red,[@i@]
                >`@bool_x@,@_y@,#red,@arr[i]@
            for j = 0..search_types.Count()-1
                // 表示 型判定
                ?Type(arr[i]) = search_types[j]
                    >`@type_x@,@_y@
                    ^,@type_colors[j]@,█@search_types[j]@
                    break

// component/functionの表示確認用に用意
?loc.begin
    var cnvs = ui.AddCanvas()
var fn = func()
    return

// 実行 型判定
show_types(test)

型/真偽判定の関数だけ

// 画面表示 型/真偽の色分け
func show_types(arr)
    // 型判定の比較に使用するキーワード
    var search_types = [
        "string"    // 0
        ,"int"      // 1
        ,"float"    // 2
        ,"array"    // 3
        ,"bignumber"// 4
        ,"bool"     // 5
        ,"function" // 6
        ,"object"   // 7
        ,"null"     // 8
    ]
    // 型別の文字色
    var type_colors = [
        "#E5384D"  // 0
        ,"#38A8E5" // 1
        ,"#37E5D3" // 2
        ,"#F4BB54" // 3
        ,"#E55F36" // 4
        ,"#36E56B" // 5
        ,"#C454F4" // 6
        ,"#DDDDDD" // 7
        ,"#808080" // 8
    ]
    
    ?arr.Count()
        // _x x座標
        // _y y座標
        // _w ブロック幅
        var type_x  = 1
        var index_x = 11
        var bool_x  = 15
        var _y = 0
        var block_w = 25
        for i = 0..arr.Count()-1
            // 調整 xy座標
            ?_y = screen.h - 3
                type_x  += block_w
                index_x += block_w
                bool_x  += block_w
                _y = 0
            _y++
            // 表示 true/false判定
            ?arr[i]
                >`@index_x@,@_y@,#green,[@i@]
                >`@bool_x@,@_y@,#green,@arr[i]@
            ?!arr[i]
                >`@index_x@,@_y@,#red,[@i@]
                >`@bool_x@,@_y@,#red,@arr[i]@
            for j = 0..search_types.Count()-1
                // 表示 型判定
                ?Type(arr[i]) = search_types[j]
                    >`@type_x@,@_y@
                    ^,@type_colors[j]@,█@search_types[j]@
                    break

PCのコーディングソフト使えばテキストの列で整形とかも楽にできるのかな?
テキスト整形といえば…というわけではないですが、今はKNIMEでExcelのデータ操作を簡単に出来ちゃうみたいだね👶
ノード操作って楽だからいいよねい

▲ 上に戻る

セクション区切り string.Format

microsoft C#
+値, -値, 0で書式指定文字列の変化する
セミコロン(;)で区切ったセクションは最大3つまで

セクション1つ 書式指定文字列は全ての値に適用
セクション2つ 最初のセクションが正の値とゼロに適用
2 番目のセクションが負の値に適用
セクション3つ 最初のセクションが正の値
2 番目のセクションが負の値
3 番目のセクションがゼロに適用

…(ぇぇゃん👶)

▼ セクション3つ その1

>`1,1,@string.Format("{0:正;負;ゼロ}", 10)@
>`1,2,@string.Format("{0:正;負;ゼロ}", -10)@
>`1,3,@string.Format("{0:正;負;ゼロ}", 0)@
// 正
// 負
// ゼロ

▼ セクション3つ その2

>`1,1,@string.Format("{0:+#;-#;0}", 10)@
>`1,2,@string.Format("{0:+#;-#;0}", -10)@
>`1,3,@string.Format("{0:+#;-#;0}", 0)@
// "+10"
// "-10"
// "0"

▲ 上に戻る

if文の&をマスターしよう

比較は両辺の型に注意が必要だけど、&で繋いだものはそれぞれtrueであればOK✍️👶たまに意味不になる

例1:

var int_ = 1
var str_ = "あ"
var null_
// var null_ = nullのようなもの

?int_ & str_ & null_ = null
^& 今半のすき焼きを食べたい
    >true
    // true

▼ 処理のイメージ

?int_ & str_ & null_ = null
^& 今半のすき焼きを食べたい
↓
?true & true & true
^& true
↓
true

例2:

var int_ = 1
var str_ = ""
var null_

?int_ & str_ & null_ = null
    >true
    // 表示なし

▼ 処理のイメージ

?int_ & str_ & null_ = null
↓
?true & false & true
↓
false
↓
1つでもfalseの場合false

ifで比較を使用せず、単体使用でfalseになるもの
false, null, 0, 0.0, ""

if文の判定結果を可視化してみよう

▲ 上に戻る

if文に使うものを型判別して処理の理解を深める

if文の判定結果を可視化してみよう
👆🏻true,false判定したものを型判別してみる
型判別の色がキツかったから画像は色変した👶

var arr_ = [
    1       // 0
    , 0     // 1
    , -1    // 2
    , 1.0   // 3
    , 0.1   // 4
    , 0.0   // 5
    , -0.1  // 6
    , -1.0  // 7
    , "0"   // 8
    , a     // 9
    , "あ"  // 10
    , " "   // 11
    , " "  // 12
    , ""    // 13
    , True  // 14
    , true  // 15
    , False // 16
    , false // 17
    , null  // 18
    , NaN   // 19
    , []    // 20
    , [a][0] // 21
    , item.left // 22
    , totaltime     // 23
    , totaltime = 0 // 24
    , foe           // 25
    , foe.distance <= 16 & foe = "Ice" // 26
]

for i = 0..arr_.Count()-1
    ?Type(arr_[i]) = string
        >`1,@i@,#dd0000,[@i@] @Type(arr_[i])@
    ?Type(arr_[i]) = int
        >`1,@i@,#0000dd,[@i@] @Type(arr_[i])@
    ?Type(arr_[i]) = float
        >`1,@i@,#00dddd,[@i@] @Type(arr_[i])@
    ?Type(arr_[i]) = bool
        >`1,@i@,#dd00dd,[@i@] @Type(arr_[i])@
    ?Type(arr_[i]) = array
        >`1,@i@,#dddd00,[@i@] @Type(arr_[i])@
    // ※ Typeの戻り値はstring型なので
    // 両辺の型を合わせて比較する
    ?Type(arr_[i]) = "null"
        >`1,@i@,#999999,[@i@] @Type(arr_[i])@

※ こんなイメージ👀
?Type(null) = "null"

?"null" = "null"

true

?Type(null) = null

?"null" = null

false

=,<=など比較を使う場合は両辺の型を意識する✍️(˘ω˘ )
string,int,floatくらいしか意識してなかったけど
同じ文字に見えても型に相違があれば期待した結果にならないし ifを扱いきるって結構難しいですね
そして未だに扱いきれない

▲ 上に戻る

if文の判定結果を可視化してみよう

>@foe.distance <= 16 & foe = " Poison "@
// 条件を満たす場合"True"
// 満たさない場合  "False"

↑ これでもいいですが、他にも色々見てみまっしゅ

if文に入れたものはTrue, Falseの2択で評価されるという事もはじめの頃は分からず、苦戦した思い出があります

test()

func test()
    var text = [
        1       // 0
        , 0     // 1 False
        , -1    // 2
        , 1.0   // 3
        , 0.1   // 4
        , 0.0   // 5 False
        , -0.1  // 6
        , -1.0  // 7
        , "0"   // 8
        , a     // 9
        , "あ"  // 10
        , " "   // 11
        , " "  // 12
        , ""    // 13 False
        , True  // 14
        , true  // 15
        , False // 16
        , false // 17 False
        , null  // 18 False
        , NaN   // 19
        , []    // 20
        , [a][0] // 21
        , item.left // 22 両手武器含め
                    // 左手に持ち物がなければFalse
        , totaltime     // 23 totaltime = 0でFalse
        , totaltime = 0 // 24 totaltime = 0は常にFalse
        , foe           // 25 敵情報が無ければFalse
        , foe.distance <= 16 & foe = "Ice" // 26
        // それぞれ条件式を満たさなければFalse
    ]
    for i = 0..text.Count()-1
        ?text[i]
            >`1,@1+i@,#green,True  [@i@] @text[i]@
        ?!text[i]
            >`1,@1+i@,#red,False [@i@] @text[i]@

まとめてみよう
ざっくり言うと特定の文字を除き、文字が存在する場合にTrueって事だねい
頭文字大文字のFalseがTrue判定になるのは予想外

判定 if文
True 英字 ※1
日本語 ※1
他言語 ※1
文字化け
記号 ※2
True
true
False
0(0.0など0のみの数)以外の数字
文字列の"0"
半角スペース
全角スペース
False
false
0
0.0 ※3
null
"" ※1のようなもの…ではなかった
エラー
用途が定められた記号を文頭に配置(一部除外)。文末も注意

※1 非初期化の変数として使用した文字列は値が代入される迄null相当(というかnull)になるので、nullの期間はif文で使うとFalseとして処理される
※2 用途が定められた記号は一部を除きエラー
※3 小数点以下に0以外があればTrue

▲ 上に戻る

ステージの敵名一覧を取得

discord: p3lb0x
string.Format便利だなぁ(👀 )

var foesAdded = ""

// 新しいfoe.idであればfoesAddedに追加
?foe & (foesAdded ! foe.id)
    foesAdded = string.Format(
    ^"{0}\n{1}",foesAdded,foe.id)

?foesAdded
    >`1,5,@foesAdded@
    // 敵名
    // 敵名
    // 敵名etc...

▲ 上に戻る

自動で属性選択

1番上がいいかな…?👶

手堅く完全一致検索

// 連結情報(immune_to_属性)を拾わない
var f_arr
f_arr = s_split(foe)
var s_equals = string.Equals

var auto_attr = ""
?s_equals(f_arr,"Perfected")
    auto_attr = ""
:?s_equals(f_arr,"Poison")
    auto_attr = "Ice"
:?s_equals(f_arr,"Vigor")
    auto_attr = "Poison"
:?s_equals(f_arr,"AEther")
    auto_attr = "Vigor"
:?s_equals(f_arr,"Fire")
    auto_attr = "AEther"
:?s_equals(f_arr,"Ice")
    auto_attr = "Fire"

>`1,6,auto_attr = @auto_attr@

半角スペース込みで小文字/大文字を区別

// 連結情報(immune_to_属性)を拾わない
// ある程度柔軟な検索が可能
// 注意点: foe情報の行頭か行末に非連結の属性情報が配置されると機能しない(たぶん)
var f_arr
f_arr = s_split(foe)
var auto_attr = ""

// ?foe = " Perfected "でも🙆‍♀️
?foe = " Poison Vigor AEther Fire Ice "
    auto_attr = ""
:?foe = " Poison "
    auto_attr = "Ice"
:?foe = " Vigor "
    auto_attr = "Poison"
:?foe = " AEther "
    auto_attr = "Vigor"
:?foe = " Fire "
    auto_attr = "AEther"
:?foe = " Ice "
    auto_attr = "Fire"

>`1,6,auto_attr = @auto_attr@

データを元に完全一致検索

// 連結情報(immune_to_属性)を拾わない
var f_arr
f_arr = string.Split(foe)

var auto_attr
auto_attr = get_player_attr()

func get_player_attr()
    var attr_list = [
        ["Perfected",""]
        ,["Poison","Ice"]
        ,["Vigor","Poison"]
        ,["AEther","Vigor"]
        ,["Fire","AEther"]
        ,["Ice","Fire"]
    ]
    var result = ""
    for i = 0..attr_list.Count()-1
        for j = 0..f_arr.Count()-1
            ?string.Equals(f_arr[j],attr_list[i][0])
                result = attr_list[i][1]
                return result
    return result

>`1,6,auto_attr = @auto_attr@

▲ 上に戻る

string.Formatの書式指定子を色々お試し

久々に見ませう
microsoft 書式指定子

▼ 標準書式指定子

var s_format = string.Format
var test = [
    "{0:G4}"  // General
    , "{0:N}" // Number
    , "{0:F}" // Fixed-point
    , "{0:E}" // Exponential(scientific)
    , "{0:P}" // Percent
    , "{0:D}" // Decimal
    , "{0:X}" // Hexadecimal
    , "{0:x}" // Hexadecimal
    , "{0:C}" // Currency
]

for i = 0..test.Count()-1
    >`1,@1+i@,@s_format(test[i], 123456789)@
    // 1.235E+08
    // 123,456,789.00
    // 123456789.00
    // 1234568E+008
    // 12,345,678,900.00%
    // 123456789
    // 75BCD15
    // 75bcd15
    // ¥123,456,789

追加チラリ sejuku.net

▼ 0埋め

>`1,1,@string.Format("{0:00000}",10)@
// 00010

>1,2,@string.Format("{0:D5}",10)@
// 00010

▼ 小数点以下の桁数を指定

>@string.Format("{0:#},{0:#.##}",math.pi)@
// 3,3.14

▼ 3桁区切り

>@string.Format("{0:#,0}",123456789)@
// 123,456,789

▼ 複数の文字列を連結

>@string.Format("{0} Story {1}","Stone","RPG")@
// Stone Story RPG

▲ 上に戻る

右揃えの九九表を作ってみよう

そろそろイベンツやりますかぁ👶
x3だと詰まって見えるからx4にちた

// 2文字を上限に右寄せ
var alignR_s2 = "{0,2}"

// 九九表
for x = 1..9
  for y = 1..9
    >`@x*4@,@y@,@string.Format(alignR_s2,x*y)@

いや…こっちでいっか!

// 九九表
for x = 1..9
  for y = 1..9
    >`@x*4@,@y@,@string.Format("{0,2}",x*y)@

▲ 上に戻る

アプリ再起動まで消した関数定義を使える

アプリ再起動までエラーを吐かず、働き続ける関数

▼ まずは定義名を一致させて使う

func test(a, b)
    return a + b

>`1,6,@test(1, 2)@
// 3

▼ アプリを再起動せず、定義を消す
もしくは定義名をデタラメにする

>`1,6,@test(1, 2)@
// 3

アプリを再起動してようやくエラー
変数も似たような件が起きてた気がする
そっちはまた別問題な気もするけど エラーにはならなかったから

今回はキャッシュというやつ?
重い関数を1回読み込んだら2回目以降は軽い表示になった事あるし
コンボちゃんが貼ってたfillなんかがそうだなぁ Discord

// Fills the screen with UI panels
var y = -1
func AddRow()
  y++
  for x = 0..screen.w-1
    var p = ui.AddPanel()
    p.style = 8
    p.x = x
    p.y = y
    p.w = 1
    p.h = 1
    p.dock = top_left
    p.color = #808080
?y < screen.h
  AddRow()
  AddRow()

▲ 上に戻る

bladeでより多くの敵を巻き込むscreen.iを取得

ダッシュ判定の距離以下で敵の最大数が更新された場合、screen.i保存

追記: foe.GetCountは多分1ベースでpos.xは0ベースなので5行目のrelative_2scrn_w = screen.w - scrn_posx末尾に + 1を足しておいた

var scrn_posx
var relative_2scrn_w
var f_count_2scrn
scrn_posx = screen.FromWorldX(pos.x)
relative_2scrn_w = screen.w - scrn_posx + 1
f_count_2scrn = foe.GetCount(relative_2scrn_w)

// screen.Next()使用
?scrn_posx > -1
    screen.Next()

// f_count_storeはscrn_i_store格納の判定に使用
var f_count_store = 0
var scrn_i_store = 0

?foe.distance <= 16
^& f_count_store <= f_count_2scrn
    f_count_store = f_count_2scrn
    scrn_i_store = screen.i

// 二画面分の最大敵数となるscreen.iを確認
>`1,6,ascii
scrn_i_store    @scrn_i_store@
f_count_store   @f_count_store@

relative_2scrn_w @relative_2scrn_w@
f_count_2scrn    @f_count_2scrn@

screen.i  @screen.i@
screen.w  @screen.w@
scrn_posx @scrn_posx@
asciiend

各ステージを数回まわして保存された値

ステージ 難易度 screen.i
scrn_i_store
二画面分の敵数
f_count_store
枯木の渓谷 ☆14 1 23
恐怖の洞窟 ☆15 4 20
キノコの森 ☆15 3 34
呪われた会館 ☆15 4 44
地獄の鉱山 ☆15 3 37
氷の尾根 ☆15 2 35
神殿 ☆15 12 41

画像のa - bの理由はマイナス値をマイナスするとプラスになるから…👶

// 例
var a = 10
var b = -5
var c = 0

?time <= 30
    c = a + b
:
    c = a - b

>@c@
// time30以下で5
// time30超で15

manualのstorage使って色々やってみたいけど、弄った事を忘れて(?!)色々ポイポイしちゃいそう
そんなもんで、弄りづらいっぴ
storage.Set(string, value)いつか使ってみたいね

▲ 上に戻る

エーテルのお守り

新しいお守りが追加されたね👶

ID
武器 aether_talisman
召喚 voidweaver
デバフ unstable

IDはmanualのクールダウン IDリストとスクリプトで確認出来るのだ
公式manual(英語)Cooldown IDで検索して1ヒットに絞りまする

▼ ID確認

// 召喚
?item.GetCooldown("aether_talisman") <= 0
^& item.CanActivate()
^& summon.count = 0
^| item.right = "aether_talisman"
^& item.right.state = 2
  equipR aether_talisman
  activate R

?summon.GetId() ! null
  >`0,1,召喚: @summon.GetId()@
  //    召喚: voidweaver

?foe
  >f0,0,デバフ: @foe.debuffs.string@
  //    デバフ: unstable

▼ voidweaverの能力発動例

?item.GetCooldown("voidweaver") <= 0
^& item.CanActivate()
^& summon.GetId() = "voidweaver"
^& foe.count > 18
  activate voidweaver

▼ cinderwispの能力発動例

?item.GetCooldown("cinderwisp") <= 0
^& item.CanActivate()
^& summon.GetId() = "cinderwisp"
^& summon.GetVar("ignition") = 10
  activate cinderwisp

▲ 上に戻る

指定size分、行(列)移動したら次の行(列)へ

var size = 10

>`@time % size@,@time / size@,#ffaa00,█
>`@time / size@,@time % size@,#ff00aa,█

フラッとBARへ入店
メニューにシガーがあるじゃあ〜りませんか
シガーといえばTar
折角だから頼むよね

ゲホゴホッこれは高尚な嗜み いい体験になりました
一度吸ってみたかったんだ
▲ 上に戻る

draw_circle

👶
https://retu27.com/enun_xyjiku.html

var m_floor = math.Floor
var tt
tt = totaltime

func draw_circle(x,y,dia,speed)
  var p_x = m_floor(math.Cos(tt/speed)*dia)
  var p_y = m_floor(math.Sin(tt/speed)*(dia/2))-1
  >`@x+p_x+dia@,@y+p_y+(dia/2)+1@,#ff0088,█

// draw_circle(x,y,dia,speed)
draw_circle(0,0,screen.h,15.0)
draw_circle(0,0,screen.w/2,20.0)
draw_circle(0,0,10,30.0)

▲ 上に戻る


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())を使用するんですね
わかりました!いつもありがとうございます🦉

▲ 上に戻る


2024/02/10 イベント終わらん問題

イベントがもうすぐ終わるというのに 深夜帰宅
まるで進まないぞ!!!
お酒飲んでるせいなのだけど!!
なんかね〜すんごいとぐろまいたお肉が出てきたんですよね 。見た目💩みたいだった
とりあーえず!
せっかくのイベントなので、スクリプトを書いてクリアしてゆく!

スクリプトでマスクを発動しよう

?item.CanActivate()
  equipR mask
  activate R

毒アイテムのみを使用してロケーションをクリアする

equipL Poison *1
equipR Poison 

敵に毒属性のデバフを適用する

func LR(itemL,itemR)
    equipL @itemL@
    equipR @itemR@

?loc.begin | loc.loop
    LR("triskelion","compound")
?foe.distance <= 16
    ?foe.debuffs.count <= 0
        LR("dP","shield ap")
    :?foe.debuffs.count = 1
        LR("Vigor","shield ah")
:?pickup.distance <= 13
    LR("triskelion","star")
:
    LR("triskelion","compound")

蛇の敵を倒す

// 神殿
func LR(itemL,itemR)
    equipL @itemL@
    equipR @itemR@

?loc.begin | loc.loop
    LR("triskelion","compound")
?foe.distance <= 16
    ?foe.debuffs.count < 6
        LR("wand dI","shield Ice")
    :?foe.debuffs.count = 6
        LR("Vigor","shield Ice")
:?pickup.distance <= 13
    LR("triskelion","star")
:
    LR("triskelion","compound")

毒のデバフを利用して攻撃の威力を弱める

// 神殿
func LR(itemL,itemR)
    equipL @itemL@
    equipR @itemR@

?loc.begin | loc.loop
    LR("triskelion","compound")
?foe.distance <= 16
    ?foe.debuffs.string = "damage"
        LR("quest","shield ah")
    :
        ?hp <= maxhp - 2
            LR("dL","shield ai")
        ?hp > maxhp - 2
            LR("wand Poison","shield ap")
:?pickup.distance <= 13
    LR("triskelion","star")
:
    LR("triskelion","compound")

毒属性のアイテムでダメージを与える

// 神殿で試した
func LR(itemL,itemR)
    equipL @itemL@
    equipR @itemR@

?loc.begin | loc.loop
    LR("triskelion","compound")
?foe.distance <= 16
    ?hp <= maxhp - 2
        LR("wand dL","shield ai")
    ?hp > maxhp - 2
        LR("wand Poison","shield ai")
:?pickup.distance <= 13
    LR("triskelion","star")
:
    LR("triskelion","compound")

カルト教団のマスクを使用している間、ボスにデバフをかける

// 神殿
var fds_arr
fds_arr = string.Split(
^foe.debuffs.string,",",":")
var foe_chill_i = []
var foe_damage_i = []
var foe_dot_i = []
foe_chill_i = extract_arr(fds_arr,"chill")
foe_damage_i = extract_arr(fds_arr,"damage")
foe_dot_i = extract_arr(fds_arr,"dot")

// バフ/ デバフ取得
// 参考 bitty45
// https://discord.com/channels/423242655498240000/597668520888762388/1169675696679960707
func extract_arr(arr,name)
    var index
    ?arr.Contains(name)
        index = arr.IndexOf(name)
        return [int.Parse(arr[index + 1])]
    return [0]

// 参考 fruloo(旧GitHubリンク消滅)
func LR(itemL,itemR)
    equipL @itemL@
    equipR @itemR@

?loc.begin | loc.loop
    LR("triskelion","compound")
?foe.distance <= 16
    ?foe = boss
        ?foe_chill_i[0] = 6
            ?foe_damage_i[0] = 0
                LR("wand dP","mask")
            :?foe_dot_i[0] = 0
                LR("wand dF","mask")
        :?foe_chill_i[0] < 6
            LR("wand dI","mask")
    :
        ?foe = " Poison "
            LR("wand Ice","shield ap")
        :?hp <= maxhp - 2
            LR("wand dL","shield ai")
        :
            LR("wand Ice","shield au")
:?pickup.distance <= 13
    LR("triskelion","star")
:
    LR("triskelion","compound")

途中からコピペの嵐! あともうすこ…プルプル…し(パタ

▲ 上に戻る


foe,itemのstate,timeログ表示

> Stone Story RPGの案内へ戻る


[[]](二重角括弧内)のスクリプトが表示されなかったので、半角スペースを挿入しました🐥⸒⸒一応そのまま使ってもエラーにはなりません

テキスト差分比較 webツール
Mergely - Compare files and find differences online

▼ 索引"6"の使用画面(ペットは入れてない)

使用した動画

表示したいログの項目

 foe.state
 foe.time
 item.right.state
 item.right.time
 item.left.state
 item.left.time

学習した事

 配列で変数の命名が少なく済む。データ比較にも良い
 関数定義の()内は^が不要
 関数使用の()内は^が必要

1. foe.state情報ログの取得の為Insertサンプルを使用

// マニュアル例を表示させる
var myArray = [10, 3]
myArray.Insert(1, "apple")

for i = 0..myArray.Count()-1
  >`1,@i@,@myArray[i]@
// 配列は [10, "apple", 3] になります

▲ 上に戻る

2. 条件をつけてInsertを1回実行してみる

var myArray = ["開始","終了"]

?myArray.Count() = 2
  myArray.Insert(1,"割り込んじゃいますか")

for i = 0..myArray.Count()-1
  >`1,@1+i@,@i@ @myArray[i]@

▲ 上に戻る

3. フレームごとにfoe.state,foe.timeを記録

var myArray = ["foe","start"]

?myArray.Count() <= 10
  myArray.Insert(1,foe.state+"."+foe.time)
?myArray.Count() > 10
  myArray.RemoveAt(10)
for i = 0..myArray.Count()-1
  >`10,@1+i@,@myArray[i]@

▲ 上に戻る

4. 見出しにカラー適用

var myArray = ["foe","start"]
var rows = 10

?myArray.Count() <= rows
  myArray.Insert(1,foe.state+"."+foe.time)
?myArray.Count() > rows
  myArray.RemoveAt(rows)
for i = 0..myArray.Count()-1
  >`10,@1@,#51b9aa,@myArray[0]@
  >`10,@1+i@,#999999,@myArray[i]@

▲ 上に戻る

5. プロセスを関数にまとめる。ハイライト表示

var fst_logs = [ ["start",""]]

// 定義
func process_st_logs(
x,y,rows,color,logs,state_time,txt)
  var rmv_rows = rows
  // ログ記録
  ?logs.Count()
    logs.Insert(0,state_time)
  ?logs.Count() & logs[0][0] = logs[1][0]
    logs.RemoveAt(1)
  ?logs.Count() > rmv_rows
    logs.RemoveAt(rmv_rows)
  // ログ表示
  for i = 0..logs.Count()-1
    >`@x@,@y@,@color@,@txt@
    >`@x@,@1+y+i@,#999999,
    ^@logs[i][0]+"."+logs[i][1]@
    >`@x@,@1+y@,#dddddd,
    ^@state_time[0]+"."+state_time[1]@

// 関数使用
//           (x,y,rows,color,logs,state_time)
process_st_logs(10,1,10,"#51b9aa",fst_logs,
^[foe.state,foe.time],"Fs.Ft")

▲ 上に戻る

6. itemログも追加。座標調整の変数をローカルにしたいので、ログ表示の関数を作成

// variables ///////////////////////////////////

var foe_st_logs = [ ["start",""]]
var itemL_st_logs = [ ["start",""]]
var itemR_st_logs = [ ["start",""]]
var rows = 10 // 合計行数

// functions ///////////////////////////////////

// 定義_ログ処理プロセス
func process_st_logs(
x,y,rows,color,logs,state_time,txt)
  // ログ記録
  ?logs.Count()
    logs.Insert(0,state_time)
  ?logs.Count() > 1 & logs[1][0] = logs[0][0]
    logs.RemoveAt(1)
  ?logs.Count() > rows
    logs.RemoveAt(rows)
  // ログ表示
  for i = 0..logs.Count()-1
    >`@x@,@y@,@color@,@txt@
    >`@x@,@1+y+i@,#999999,
    ^@logs[i][0]+"."+logs[i][1]@
    >`@x@,@1+y@,#dddddd,
    ^@state_time[0]+"."+state_time[1]@

// 定義_ログ表示まとめ
func show_st_logs(x_origin,y,rows)
  var x = x_origin
  // (x,y,rows,color,logs,state_time,txt)
  // ログ_アイテムL_item.right(left).state(time)
  process_st_logs(x,y,rows,"#dc8146",
  ^itemL_st_logs,
  ^[item.left.state,item.left.time],"Ls.Lt")

  // xで見かけた座標の調整方法 明解でいいですね!
  x += 8

  // ログ_アイテムR_item.right(left).state(time)
  process_st_logs(x,y,rows,"#dc8146",
  ^itemR_st_logs,
  ^[item.right.state,item.right.time],"Rs.Rt")

  x += 8

  // ログ_敵_foe.state(time)
  process_st_logs(x,y,rows,"#51b9aa",
  ^foe_st_logs,
  ^[foe.state,foe.time],"Fs.Ft")
  
// main ////////////////////////////////////////
  
// ログリセット(なくてもいい)
?loc.begin | loc.loop
  foe_st_logs = [ ["start",""]]
  itemL_st_logs = [ ["start",""]]
  itemR_st_logs = [ ["start",""]]
// ログ表示 (x_origin,y,rows)
show_st_logs(10,1,10)

▲ 上に戻る

コンボちゃんが作ったワンコ追加

import Cosmetics/PetDog

▲ 上に戻る


UI配置用にランダムカラー出力

> Stone Story RPGの案内へ戻る


イラストアプリでUIの配置を決めるのにほしかった
計3枚


Full Blockでfg,bgランダムカラー

disable hud
ui.AddCanvas()

?loc.begin
  var canvas = ui.AddCanvas()
  canvas.w = screen.w
  canvas.h = screen.h
  for x = 0..canvas.w -1
    for y = 0..canvas.h -1
      var fg = color.Random()
      var bg = color.Random()
      canvas.Set(x, y, fg, bg, "█")


Lower Half Blockでfg,bgランダムカラー

disable hud
ui.AddCanvas()

?loc.begin
  var canvas = ui.AddCanvas()
  canvas.w = screen.w
  canvas.h = screen.h
  for x = 0..canvas.w -1
    for y = 0..canvas.h -1
      var fg = color.Random()
      var bg = color.Random()
      canvas.Set(x, y, fg, bg, "▄")


Lower Half Blockでfgランダムカラー

disable hud
ui.AddCanvas()

?loc.begin
  var canvas = ui.AddCanvas()
  canvas.w = screen.w
  canvas.h = screen.h
  for x = 0..canvas.w -1
    for y = 0..canvas.h -1
      var fg = color.Random()
      canvas.Set(x, y, fg, "▄")

▲ 上に戻る


すこしのストレスはひつようかも

> Stone Story RPGの案内へ戻る


2048 / 2048.txt

//2048
//written by ArtificialPotato
//v0.9
//
//Description: Stonescript implementation of 2048 by Gabriele Cirulli

プレイデモ画面 https://media.discordapp.net/attachments/1165084075426586734/1171111596890787900/image.png?ex=655b7daa&is=654908aa&hm=5e06af031133bc2a1ee3e5eafad2bd344323395485d51734deac3edab773b83a&

ちまちまとやるものの、プレイ後半はミスに気をつけて集中力を保つ必要がありゅ

良い流れを断ち切ってしまい、一気にゲームオーバーへ

ちなみにこの時はトイレに行きました。
そのお陰でスッキリ爽快。
楽園にいるかのごとくα波を感じます。

そう。
リフレッシュしてしまったんです。
こんなに爽やかな気分じゃダメなんですきっと。

▲ 上に戻る


テスト

> Stone Story RPGの案内へ戻る


Bestiary / Bestiary.zip

written: Incoherent_Toast
Incoherent_Toastによる敵図鑑

Chisel_v0_3 / Chisel_v0_3.txt

written: fruloo
描画ツール https://media.discordapp.net/attachments/1165084075426586734/1170968848057503794/image.png?ex=655af8b8&is=654883b8&hm=24ff9b900800a6435e735a61e5fff29ce43f94d1ac27c9ee77e69662a733bba8&

Firehead / Firehead.txt

written: electr0nic

Mobile_Mindstone_Button / Mobile_Mindstone_Button.txt

written: Sven
https://cdn.discordapp.com/attachments/1165084075426586734/1167586218926673920/RPReplay_Final1698440443.mov?ex=654eaa67&is=653c3567&hm=67ce2d644c155a1538ab21b1ab80fe2679f9a30675229b45e71d86c52fa6b8ab&

MiniMap / MiniMap.txt

written: fwzuw
画面下にミニマップ表示
https://cdn.discordapp.com/attachments/1165084075426586734/1168963756622090300/MiniMap.gif?ex=6553ad55&is=65413855&hm=3bd3f9b7b04417344939c6fcfcc1e905e33784b6bf7772d2edf6d3dea64fec93&

MindstoneButton / MindstoneButton.txt

written: Ket
https://media.discordapp.net/attachments/1165084075426586734/1167865999110979715/mindstoneButton.mp4?ex=654faef8&is=653d39f8&hm=905f4e1cbf47d8b598cf283f8a018dbd06af3b07b60b5f4c71d40a8163be8c90&

scottyEyeTracker / scottyEyeTracker.txt

written: MaxMinMedian
"呪いの門"で宝箱追跡。精度高いver
今の所100%

wisp / wisp.txt

written: Night
宝箱追跡も兼ね備えたペット

▲ 上に戻る


ロッキー高原☆5石掘り

> Stone Story RPGの案内へ戻る


YouTube使用スクリプト

石掘りスクリプト使用(YouTube)

AA使用
Lower Half Block
Full Block
ι Greek Small Letter Iota

使用可能な記号リスト
https://stonestoryrpg.com/ascii_test.html

var OldStone = res.stone
var NewStone = 0
?res.stone ! OldStone
    NewStone = OldStone + res.stone

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()
        TriStar()

// ゲームシミュレーション開始前time = 0
?loc.begin
    NewStone = 0
    QuarterToTriStar()
// ロッキー高原
?loc = rocky
    ?loc.stars = 5
        NewStone = res.stone - OldStone
        ?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()

// 以下画面表示
// プレイヤー装飾.茶色帽子
// ▄ Lower Half Block
// █ Full Block
>h-2,-2,#9e5008,ascii
#▄▄▄#
_███_
asciiend
// 汗
>h-2,0,#69BBBE,ascii
#ι
asciiend

// 画面タッチ位置
>`@screen.w-10@,0,X@input.x@,Y@input.y@

// プレイヤー左側に表示
>o-15,-2,ascii
石ころ####:@NewStone@
time###:@time@
R.state:@item.right.state@
R.time#:@item.right.time@
asciiend

▲ 上に戻る


> Stone Story RPGの案内へ戻る