Stone Story RPGメインメニュー
2024/06/09
用語追加
item.GetTreasureCount()
item.GetTreasureLimit()
encounter.isElite
encounter.eliteMod
テキスト修正
敵図鑑 loc・foeデータ(高難易度のみ)
2024/06/06
用語追加
event.GetObjectiveId()
event.GetObjectiveProgress()
event.GetObjectiveGoal()
item.left.gp
item.right.gp
抜けていた用語を追加
harvest
harvest.distance
input.x / input.y
item.left
item.right
2024/5/6
ページ追加
敵図鑑 loc・foeデータ(高難易度のみ)
ページ更新
効果音をアップデートしました
·:·:· 付録 A - 効果音 ·:·:·
ページ修正
行末に挿入された半角スペースを削除しました
·:·:· 付録 C - 環境音 ループ ·:·:·
・ Stone Story RPGメインメニュー > 色々(本ページ)に敵図鑑 loc・foeデータ(高難易度のみ)のリンクを追加しました。
・ 古いManualページを非公開にしました。
・ 混乱の元になりえるリンク(Manualをよみとく)を非公開にしました。
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.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を機械翻訳 + 備忘録
用語追加
https://stonestoryrpg.hatenablog.com/entry/Manual_10#sysos
sys.os
sys.isMobile
sys.isPC
sys.isConsole
10/7
用語追加
https://stonestoryrpg.hatenablog.com/entry/Manual_03#foeGetCountint
?foe.GetCount(int)
https://stonestoryrpg.hatenablog.com/entry/Manual_10#itemGetLoadoutLint--itemGetLoadoutRint
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を読んでいきましょう。
FAQ 質問と回答 / 翻訳元
よくある質問(公式FAQ)
色々
敵図鑑 loc・foeデータ(高難易度のみ)
ポーション調合表
キャラクター装飾
テキスト差分比較
色コード確認
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まとめ
_ ______________________ _
,:´ \____ __.---,. `.
:.! __________\_______\__`--`´__ \
:' \ \--------------------------.\ \
':' · \ ·:. :'· :.:· \\ \
':' \ \ :·' :·:. \\ \
':' · \ .: ·:: '.:. ':'··:. \\ \
':' \ \ · :.. \\ \
':' · \ :·: ..': :·:. ·:: '. \\ \
':' \ \__________________________\\ \
':' ` . \ . )
':' . . . \ . . . . ' . . . . \ . .;
`·.;,;,;,;,;,;,;,;,;,;,;,;,;,;,:'
Mind Stoneを使用して装備の選択を自動化するために使用されるStonescriptは、Stone Story RPG内で利用できるミニマリスティックでありながら強力な言語です。
Stonescriptを初めて使う場合は、「Mind Stone入門」チュートリアルから始めることを検討してみてください。
ヘルプが必要ですか?スクリプトの共同作業を希望しますか?Discordを訪れてください。
このマニュアルは、利用可能なすべてのStonescript機能に関する包括的なリファレンスです。
ほとんどの例はMind Stoneに直接コピー/ペーストできます。これはそれらがどのように動作するかを学ぶ素晴らしい方法です。
- ·:·:· 例 ·:·:·
- ·:·:· 基本事項 ·:·:·
- ·:·:· ゲームの状態 ·:·:·
- ·:·:· コマンド ·:·:·
- ·:·:· 検索フィルター ·:·:·
- ·:·:· 比較 ·:·:·
- ·:·:· variables(変数) ·:·:·
- ·:·:· 数学演算 ·:·:·
- ·:·:· function(関数) ·:·:·
- ·:·:· ネイティブfunction(関数) ·:·:·
- ·:·:· 外部スクリプトのインポート ·:·:·
- ·:·:· ASCIIアート ·:·:·
- ·:·:· ループ ·:·:·
- ·:·:· 配列 ·:·:·
- ·:·:· カスタム入力 ·:·:·
- ·:·:· ユーザーインターフェース ·:·:·
- ·:·:· ヒント ·:·:·
- ·:·:· デフォルトスクリプト ·:·:·
- ·:·:· ロードマップ ·:·:·
- ·:·:· 付録 A - 効果音 ·:·:·
- ·:·:· 付録 B - 音楽 ·:·:·
- ·:·:· 付録 C - 環境音 ループ ·:·:·
·:·:· 例 ·:·:·
// 岩の高原でシャベルを装備します。
// 恐怖の洞窟では、ロードアウト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@ フレーム
encounter.isElite
現在の遭遇がエリート遭遇かどうかを示します。
>`0,1,Elite = @encounter.isElite@
encounter.eliteModTells
現在の遭遇で変更がある場合、その変更を示します。
>`0,2,Modifier = @encounter.eliteMod@
?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@
harvest
次に収穫可能なオブジェクト、例えば木や岩。
?harvest=Boulder equip shovel
harvest.distance
プレイヤーと最も近い収穫可能オブジェクトとの距離。
?loc=Rocky & harvest.distance < 7 equip shovel
input.x / input.y
入力デバイス(マウス/タッチ)のASCIIグリッド上のX, Y位置。
> (@input.x@, @input.y@)
item.left
左手に装備されたアイテム。
>`0,1,左手:@item.left@ >`0,2,右手:@item.right@
item.right
右手に装備されたアイテム。
?item.right = quarterstaff activate R
item.left.gp / item.right.gp
左手または右手に装備されたアイテムのギアパワー値。
>`0,1,左手 GP:@item.left.gp@ >`0,2,右手 GP:@item.right.gp@
?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)" の値として、potion、P、left、L、right、R が使用できます。
activate R // (右手に装備されたアイテムの能力をアクティブ化します。例: Hatchetのような)
brew (ingredients)
ポーションボトルを指定された材料の組み合わせで補充します。実行はランの開始時、time 0 でのみ実行されます。材料には stone、wood、tar、bronze が含まれ、+ で区切る必要があります。
材料名は英語または設定で選択した言語で書くことができます。
?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は座標のオフセットです。
#rrggbbは16進数表記でのテキストの色です。
色は次の定数で設定することもできます:
#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++
event(イベント)
event.GetObjectiveId(int) ,
event.GetObjectiveProgress(int) / event.GetObjectiveGoal(int)
〜Id
戻り値:string
コミュニティや季節イベントのアクティブな目標に関する情報を取得します。
〜Progress / 〜Goal
戻り値:int
望ましい目標のインデックスを渡します。イベントは通常、最大3つのアクティブな目標に制限されているため、最初のパラメーターは0、1、または2になります。
var id var p var g id = event.GetObjectiveId(0) p = event.GetObjectiveProgress(0) g = event.GetObjectiveGoal(0) >`0,1,@id@:@p@/@g@
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)@
item.GetTreasureCount()
戻り値:integer
現在のインベントリにある宝箱の数を返します。
item.GetTreasureLimit()
戻り値:integer
インベントリにある宝箱の総容量を返します。つまり、最大容量です。
var trs var max trs = item.GetTreasureCount() max = item.GetTreasureLimit() >`0,2,宝箱: @trs@/@max@
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_lefttop_centertop_right
center_leftcenter_centercenter_right
bottom_leftbottom_centerbottom_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部分。
可能な値:
leftcenterright
component.ay
string
anchorのY部分。
可能な値:
topcenterbottom
component.dx
string
dockのX部分。
可能な値:
leftcenterright
component.dy
string
dockのY部分。
可能な値:
topcenterbottom
// 例: 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" です。
可能な値:
truefalseinherit
'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 bell_ringer_attack bell_ringer_attack_hit cult_guard_attack cult_guard_attack_hit cult_marksman_attack cult_marksman_attack_hit cult_sorcerer_attack cult_sorcerer_attack_hit cultist_death flying_serpent_loop poison_adept_attack poison_adept_attack_hit serpent_attack serpent_death serpent_handler_release serpent_hiss serpent_slither worm_rider_hop booklet_open booklet_turn_page booklet_close hammer_cast hammer_hit shield_dash fissure_break_apart fissure_unmake mindstone_off mindstone_on triskelion_fuse potion_berserk potion_cleansing potion_defensive potion_experience potion_healing potion_invisibility potion_lightning potion_lucky potion_strength potion_vampiric bronze_guardian_pulling_hammer bronze_guardian_removing_hammer bronze_guardian_turbine bronze_guardian_ears_ring bronze_guardian_fuse bronze_guardian_attack4 yeti_attack yeti_attack_flick yeti_attack_hit yeti_awake_blow yeti_awake_explosion yeti_awake_inhale yeti_awake_lick yeti_blow yeti_blow_ice_wall yeti_death yeti_inhale yeti_inhale_lick nagaraja_awake_roar nagaraja_awake_swallow nagaraja_awake_tongue_1 nagaraja_awake_tongue_2 nagaraja_dead nagaraja_poison_attack nagaraja_poison_attack_hit nagaraja_wail nagaraja_wail_brick nagaraja_attack_eat nagaraja_attack_lick nagaraja_attack_swallow nagaraja_tongue_damaged nagaraja_tongue_lift nagaraja_tongue_smell nagaraja_tongue_wrap bearer3_talk bearer_attack bearer_attack_hit bearer_death bearer_stealing bearer_super_attack bearer_scream bearer4_talk bearer4_talk_evolving bearer_evolving elementalist_aether_attack elementalist_aether_attack_hit elementalist_aether_blink elementalist_death elementalist_fire_attack elementalist_fire_attack_hit elementalist_fire_blink elementalist_ice_attack elementalist_ice_attack_hit elementalist_ice_blink elementalist_poison_attack elementalist_poison_attack_hit elementalist_poison_blink elementalist_vigor_attack elementalist_vigor_attack_hit elementalist_vigor_blink bearer5_talk elementalist_evolving perfected_attack perfected_attack_hit perfected_death perfected_defense perfected_energy_ball perfected_energy_ball_hit perfected_summon perfected_talk epilogue_devolving epliogue_player_evolves epilogue_talk devolved_talk dysangelos_guidance dysangelos_guidance_1 dysangelos_guidance_2 dysangelos_guidance_3 dysangelos_intro_talk ranting_tree_talk_halt ranting_tree_talk_again ranting_tree_talk_how_dare ranting_tree_talk_avenge ranting_tree_talk_get_out ranting_tree_talk_impressive ranting_tree_talk_very_well ranting_tree_talk_extra hans_talk_intro hans_talk_reward scotty_a_pleasure scotty_a_worthy_opponent scotty_deuced scotty_failte_back scotty_getting_good scotty_grr scotty_guess_which scotty_intro scotty_lets_harden scotty_make_ye_guess scotty_noo_jist scotty_perhaps_the_rules scotty_pick_some_treasure scotty_shall_we_up scotty_we_have_wee_use scotty_well_met scotty_well_then scotty_wizard scotty_wrong_choice scotty_hell_be_back scotty_out_of_treasure scotty_there_he_is nagaraja_choir mushroom_boss_split ant_hill treasure_drop_common treasure_drop_epic treasure_drop_giant treasure_drop_humble treasure_drop_rare dominotaur_awake fire_geyser ice_pillar treasure_item_cyan treasure_item_yellow treasure_item_green treasure_item_blue treasure_item_red treasure_item_rainbow 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
*1:全角スペースはエラーになります
敵図鑑 loc・foeデータ(高難易度のみ)

| 取得データ・図鑑の画像 | |
|---|---|
| OS | iOS |
| app v | 3.59.1 |
| loc.stars | 枯木の渓谷☆14。それ以外は☆15です。図鑑表記の値は敵lvやその他の要因によって変動します。 |
追記・変更
情報提供: sssさん
◆ 誤字・脱字
テキストデータまとめ(コピー用) > loc > loc.name(en)
誤 "Hotspring Shop"
正 " Hotspring Shop"
テキストデータまとめ(コピー用) > foe > foe
誤 "rangedfire_geyser"
正 "ranged[改行]fire_geyser"
誤 "magic vulnerability"
正 "magic_vulnerability"
地獄の鉱山 > 銅のガーディアン > foe.name(en)
誤 "Bronze Guardia"
正 "Bronze Guardian"
◆ ゲーム内テキスト変更
氷の尾根 > 幹部クラスの氷の精霊 > foe.name(en)
氷の尾根 > 幹部クラスの氷の精霊 > foe
foe.name(en)
iOS 3.59.1 "Elite Ice Elemental"
iOS 3.62.1 "Elder Ice Elemental"
foe
// iOS 3.59.1 ice_elemental_elite Elite Ice Elemental Ice elemental ranged
// iOS 3.62.1 ice_elemental_elite tid_icy_ridge_enemy_01 Ice elemental ranged
テキストデータまとめ(コピー用)
loc
loc
// loc rocky_plateau Rocky Plateau deadwood_valley Deadwood Canyon caustlc_caves Caves of Fear waterfall Deadwood Waterfall fungus_forest Mushroom Forest uulaa_shop tid_uulaa_shop_name undead_crypt_intro tid_crypt_0 undead_crypt Haunted Halls cross_deadwood_river Cross Deadwood River bronze_mine Boiling Mine icy_ridge Icy Ridge cross_bridge Cross the Bridge temple Temple
loc.id
// loc.id rocky_plateau deadwood_valley caustlc_caves waterfall fungus_forest uulaa_shop undead_crypt_intro undead_crypt cross_deadwood_river bronze_mine icy_ridge cross_bridge temple
loc.name(en)
// te.ToEnglish(loc.name) Rocky Plateau Deadwood Canyon Caves of Fear Deadwood Waterfall Mushroom Forest Hotspring Shop Haunted Gate Haunted Halls Cross Deadwood River Boiling Mine Icy Ridge Cross the Bridge Temple
loc.name(jp)
// loc.name ロッキー高原 枯木の渓谷 恐怖の洞窟 枯木の滝 キノコの森 温泉地の売店 呪われた門 呪われた会館 枯木の川を渡る 地獄の鉱山 氷の尾根 橋渡り 神殿
loc.name(tid)
// te.GetTID(loc.name) tid_ftue_01 tid_ftue_09 tid_ftue_19 tid_ftue_11 tid_mushroom_2 tid_uulaa_shop_name tid_crypt_0 tid_crypt_1 tid_ftue_21 tid_boiling_mine_0 tid_icy_ridge_0 tid_brige_2 tid_temple_0
foe
foe
// foe acronian_scout Acronian Scout boss humanoid unpushable dysangelos_bearer Dysangelos, Bearer of Stones boss Ice unpushable phase1 immune_to_stun dysangelos_elementalist One With the Elements boss unpushable Stone phase2 immune_to_stun dysangelos_perfected Dysangelos Perfected boss unpushable Poison Vigor AEther Fire Ice phase3 immune_to_stun huge_mosquito Huge Mosquito stone insect flying flesh_scarab Stone Scarab stone insect immune_to_ranged wasp Wasp insect flying stone wasp_nest Wasp Nest unpushable spawner stone immune_to_stun tree_boss_harder Xyloalgia, Residue of Leuce stone boss unpushable phase1 immune_to_stun poena Poena, Mistress of Punishment stone boss unpushable phase2 humanoid small_spider Skin Peeler Poison arachnid medlum_bat Neck Warmer Poison flying tiny_spider Neil Biter Poison arachnid small_bat Wound Licker Poison flying scorpion Knee Chopper Poison arachnid spider_eggs Not Caviar Poison arachnid unpushable spawner immune_to_stun cool_bat Ceiling Decorator Poison flying boss ranged spider_boss_harder Bolesh, the Cunning boss Poison arachnid unpushable phase1 immune_to_stun collossal_snail Huge Snail Vigor snail epic_snail Big A** Snail Vigor slow snail ant Ant Vigor insect ant ant_hill Ant Hill Vigor insect unpushable spawner ant immune_to_stun fluff Mr. Puff Vigor melee unpushable slow boss explode mushroom_boss_harder Angry Shroom boss Vigor unpushable phase1 immune_to_stun mushroom_boss_fat Morel, the Sporeadic boss Vigor unpushable phase2 mushroom_boss_skinny Enoki, Fungi to be with boss Vigor unpushable phase2 large_skeleton Skeletony AEther magic_vulnerability skeleton ghost Booo AEther immune_to_physical large_ghost Big Booo AEther immune_to_physical small_skeleton Skeletimmy AEther magic_vulnerability skeleton ghost_tomb R.I.P. AEther unpushable spawner immune_to_stun big_tomb tid_crypt_enemy_10 AEther unpushable spawner boss immune_to_stun skeleton_boss_harder Pallas, the Skinless boss AEther unpushable phase1 skeleton immune_to_stun skeleton_boss_stage_2_harder Pallas, the Legless boss AEther unpushable phase2 skeleton immune_to_stun small_skeleton_minion Skeletimmy AEther magic_vulnerability skeleton fire_elemental Fire Elemental Fire elemental ranged mine_walker Mine Walker machine Fire magic_resist slave_master Whip Controller humanoid Fire magic_resist ranged big_slave_master Dominotaur humanoid Fire magic_resist ranged fire_geyser Flame Geyser Fire unpushable spawner immune_to_stun bomb_cart Bomb Cart humanoid Fire magic_resist melee unpushable slow boss explode bronze_guardian Bronze Guardian boss Fire unpushable machine phase1 immune_to_stun immune_to_debuff_chill ki_slerper Ki Slurper Ice ki_eater Ki Eater Ice slow ki_gobbler Ki Gobbler Ice slow ice_elemental Ice Elemental Ice elemental ranged /* 旧 幹部クラスの氷の精霊 ice_elemental_elite Elite Ice Elemental Ice elemental ranged */ ice_elemental_elite tid_icy_ridge_enemy_01 Ice elemental ranged// 新 幹部クラスの氷の精霊 ice_pillar Ice Pillar Ice unpushable spawner immune_to_stun ice_elemental_elite Giant Ice Elemental Ice elemental ranged unpushable boss immune_to_debuff_chill yeti Hrímnir boss Ice unpushable humanoid phase1 immune_to_stun immune_to_debuff_damage ice_wall Ice Wall Ice unpushable immune_to_stun worm_rider Worm Rider humanoid Poison cult ground_serpent Ground Serpent Poison serpent cult flying_serpent Toupée Snatcher Poison serpent cult heavy_hitter The Bell Ringer humanoid Poison slow cult cult_guard Cult Guard humanoid Poison cult poison_adept Poison Adept humanoid Poison ranged cult cult_sorcerer Cult Sorcerer humanoid ranged cult cult_marksman Cult Marksman humanoid ranged cult serpent_handler Serpent Handler Poison unpushable spawner humanoid cult immune_to_stun acronian_cultist Acronian Cultist boss Poison humanoid unpushable immune_to_Vigor nagaraja Nagaraja, Eater of the Torch boss Poison unpushable serpent phase1 immune_to_stun
foe.id
// foe.id acronian_scout dysangelos_bearer dysangelos_elementalist dysangelos_perfected huge_mosquito flesh_scarab wasp wasp_nest tree_boss_harder poena small_spider medlum_bat tiny_spider small_bat scorpion spider_eggs cool_bat spider_boss_harder collossal_snail epic_snail ant ant_hill fluff mushroom_boss_harder mushroom_boss_fat mushroom_boss_skinny large_skeleton ghost large_ghost small_skeleton ghost_tomb big_tomb skeleton_boss_harder skeleton_boss_stage_2_harder small_skeleton_minion fire_elemental mine_walker slave_master big_slave_master fire_geyser bomb_cart bronze_guardian ki_slerper ki_eater ki_gobbler ice_elemental ice_elemental_elite// 幹部クラスの氷の精霊 ice_pillar ice_elemental_elite// ガリガリさん yeti ice_wall worm_rider ground_serpent flying_serpent heavy_hitter cult_guard poison_adept cult_sorcerer cult_marksman serpent_handler acronian_cultist nagaraja
foe.name(en)
// te.ToEnglish(foe.name) Acronian Scout Dysangelos, Bearer of Stones One With the Elements Dysangelos Perfected Huge Mosquito Stone Scarab Wasp Wasp Nest Xyloalgia, Residue of Leuce Poena, Mistress of Punishment Skin Peeler Neck Warmer Neil Biter Wound Licker Knee Chopper Not Caviar Ceiling Decorator Bolesh, the Cunning Huge Snail Big A** Snail Ant Ant Hill Mr. Puff Angry Shroom Morel, the Sporeadic Enoki, Fungi to be with Skeletony Booo Big Booo Skeletimmy// 非召喚 R.I.P. R.I.Pieces Pallas, the Skinless Pallas, the Legless Skeletimmy// Pallasが召喚 Fire Elemental Mine Walker Whip Controller Dominotaur Flame Geyser Bomb Cart Bronze Guardian Ki Slurper Ki Eater Ki Gobbler Ice Elemental Elder Ice Elemental// 旧 Elite Ice Elemental Ice Pillar Giant Ice Elemental Hrímnir Ice Wall Worm Rider Ground Serpent Toupée Snatcher The Bell Ringer Cult Guard Poison Adept Cult Sorcerer Cult Marksman Serpent Handler Acronian Cultist Nagaraja, Eater of the Torch
foe.name(jp)
// foe.name アルカディアの偵察隊 コレクター「ワルアンジェロ」 全てを受け入れた者 ワルアンジェロ(完全体) 大きな吸血蚊 石虫 ハチ ハチの巣 レウケの残余、「怒木」 おしおき女王、「ペンペン」 タルタル パタパタ ドキドキ ナメナメ 前歩きするカニっぽいやつ マルマル ◘コウモリーズ 悪賢い「ギハカツヤ」 デカイカタツムリ マジでデカイカタツムリ アリ アリの群れ ぱふぱふ 怒りキノコ ジメジメしめじ DJエノキ ガイコスケ ブー ビッグブー ガイコージ// 非召喚 ナムアミダブツ バラバラ〜 皮なしの「ハイハイ」 足なしの「ハイハイ」 ガイコージ// ボス召喚 火の精霊 鉱山の浮浪者 カチョウ ブチョウ ヒバシラ ボンバーカート 銅のガーディアン キビュッフェ キショク キグイ 氷の精霊 幹部クラスの氷の精霊 ツララ ガリガリさん 霜の巨人 氷の壁 ミミズ乗り オロチーッス カツラ泥棒 鐘鳴らし カルトのガードマン 毒使い カルトの魔導師 カルトの狙撃者 蛇使い アルカディアのカルト団員 侵食の「ナーガラージャ」
foe.name(tid)
// te.GetTID(foe.name) tid_rocky_enemy_01 tid_final_boss_00 tid_final_boss_01 tid_final_boss_02 tid_deadwood_enemy_0 tid_deadwood_enemy_2 tid_deadwood_enemy_7 tid_deadwood_enemy_6 tid_deadwood_enemy_4 tid_deadwood_enemy_8 tid_caves_enemy_02 tid_caves_enemy_00 tid_caves_enemy_06 tid_caves_enemy_12 tid_caves_enemy_08 tid_caves_enemy_04 tid_caves_enemy_14 tid_caves_enemy_10 tid_mushroom_enemy_4 tid_mushroom_enemy_0 tid_mushroom_enemy_6 tid_mushroom_enemy_2 tid_mushroom_enemy_13 tid_mushroom_5 tid_mushroom_enemy_11 tid_mushroom_enemy_9 tid_crypt_enemy_04 tid_crypt_enemy_01 tid_crypt_enemy_03// 非召喚 tid_crypt_enemy_00 tid_crypt_enemy_06 tid_crypt_enemy_10 tid_crypt_04 tid_crypt_enemy_09 tid_crypt_enemy_03// ボスから召喚 tid_boiling_mine_enemy_04 tid_boiling_mine_enemy_02 tid_boiling_mine_enemy_08 tid_boiling_mine_enemy_00 tid_boiling_mine_enemy_06 tid_boiling_mine_enemy_13 tid_boiling_mine_enemy_10 tid_icy_ridge_enemy_00 tid_icy_ridge_enemy_09 tid_icy_ridge_enemy_01 tid_icy_ridge_enemy_06 tid_icy_ridge_enemy_08 tid_icy_ridge_enemy_03 tid_icy_ridge_enemy_13 tid_icy_ridge_enemy_11 tid_icy_ridge_enemy_05 tid_temple_enemy_02 tid_temple_enemy_06 tid_temple_enemy_12 tid_temple_enemy_14 tid_temple_enemy_04 tid_temple_enemy_08 tid_temple_enemy_00 tid_temple_enemy_20 tid_temple_enemy_10 tid_temple_enemy_18 tid_temple_enemy_16
取得データの画像
loc loc.stars loc.id loc.name(en) loc.name(jp) loc.name(tid)

foe.id foe.name(en) foe.name(jp) ----------- 水色線 ------------- foe

foe.name(tid) foe.name(jp) foe.id

ロッキー高原
| loc | rocky_plateau Rocky Plateau |
| loc.id | rocky_plateau |
| loc.name(en) | Rocky Plateau |
| loc.name(jp) | ロッキー高原 |
| tid | tid_ftue_01 |
アルカディアの偵察隊

| foe.id | acronian_scout |
| foe.name(en) | Acronian Scout |
| foe.name(ja) | アルカディアの偵察隊 |
| foe.name(tid) | tid_rocky_enemy_01 |
acronian_scout Acronian Scout boss humanoid unpushable
コレクター「ワルアンジェロ」

| foe.id | dysangelos_bearer |
| foe.name(en) | Dysangelos, Bearer of Stones |
| foe.name(ja) | コレクター「ワルアンジェロ」 |
| foe.name(tid) | tid_final_boss_00 |
dysangelos_bearer Dysangelos, Bearer of Stones boss Ice unpushable phase1 immune_to_stun
全てを受け入れた者
"全てを受け入れた者"のfoe属性は"Stone"が一瞬表示された後に、任意の属性へ変化します。

| foe.id | dysangelos_elementalist |
| foe.name(en) | One With the Elements |
| foe.name(ja) | 全てを受け入れた者 |
| foe.name(tid) | tid_final_boss_01 |
dysangelos_elementalist One With the Elements boss unpushable Stone phase2 immune_to_stun
ワルアンジェロ(完全体)

| foe.id | dysangelos_perfected |
| foe.name(en) | Dysangelos Perfected |
| foe.name(ja) | ワルアンジェロ(完全体) |
| foe.name(tid) | tid_final_boss_02 |
dysangelos_perfected Dysangelos Perfected boss unpushable Poison Vigor AEther Fire Ice phase3 immune_to_stun
枯木の渓谷
| loc | deadwood_valley Deadwood Canyon |
| loc.id | deadwood_valley |
| lco.name(en) | Deadwood Canyon |
| loc.name(jp) | 枯木の渓谷 |
| loc.name(tid) | tid_ftue_09 |
大きな吸血蚊

| foe.id | huge_mosquito |
| foe.name(en) | Huge Mosquito |
| foe.name(ja) | 大きな吸血蚊 |
| foe.name(tid) | tid_deadwood_enemy_0 |
huge_mosquito Huge Mosquito stone insect flying
石虫

| foe.id | flesh_scarab |
| foe.name(en) | Stone Scarab |
| foe.name(ja) | 石虫 |
| foe.name(tid) | tid_deadwood_enemy_2 |
flesh_scarab Stone Scarab stone insect immune_to_ranged
ハチ

| foe.id | wasp |
| foe.name(en) | Wasp |
| foe.name(ja) | ハチ |
| foe.name(tid) | tid_deadwood_enemy_6 |
wasp Wasp insect flying stone
ハチの巣

| foe.id | wasp_nest |
| foe.name(en) | Wasp Nest |
| foe.name(ja) | ハチの巣 |
| foe.name(tid) | tid_deadwood_enemy_7 |
wasp_nest Wasp Nest unpushable spawner stone immune_to_stun
レウケの残余、「怒木」

| foe.id | tree_boss_harder |
| foe.name(en) | Xyloalgia, Residue of Leuce |
| foe.name(ja) | レウケの残余、「怒木」 |
| foe.name(tid) | tid_deadwood_enemy_4 |
tree_boss_harder Xyloalgia, Residue of Leuce stone boss unpushable phase1 immune_to_stun
おしおき女王、「ペンペン」

| foe.id | poena |
| foe.name(en) | Poena, Mistress of Punishment |
| foe.name(ja) | おしおき女王、「ペンペン」 |
| foe.name(tid) | tid_deadwood_enemy_8 |
poena Poena, Mistress of Punishment stone boss unpushable phase2 humanoid
恐怖の洞窟
| loc | caustlc_caves Caves of Fear |
| loc.id | caustlc_caves |
| lco.name(en) | Caves of Fear |
| loc.name(jp) | 恐怖の洞窟 |
| loc.name(tid) | tid_ftue_19 |
タルタル

| foe.id | small_spider |
| foe.name(en) | Skin Peeler |
| foe.name(ja) | タルタル |
| foe.name(tid) | tid_caves_enemy_02 |
small_spider Skin Peeler Poison arachnid
パタパタ

| foe.id | medlum_bat |
| foe.name(en) | Neck Warmer |
| foe.name(ja) | パタパタ |
| foe.name(tid) | tid_caves_enemy_08 |
medlum_bat Neck Warmer Poison flying
ドキドキ

| foe.id | tiny_spider |
| foe.name(en) | Neil Biter |
| foe.name(ja) | ドキドキ |
| foe.name(tid) | tid_caves_enemy_00 |
tiny_spider Neil Biter Poison arachnid
ナメナメ

| foe.id | small_bat |
| foe.name(en) | Wound Licker |
| foe.name(ja) | ナメナメ |
| foe.name(tid) | tid_caves_enemy_06 |
small_bat Wound Licker Poison flying
前歩きするカニっぽいやつ

| foe.id | scorpion |
| foe.name(en) | Knee Chopper |
| foe.name(ja) | 前歩きするカニっぽいやつ |
| foe.name(tid) | tid_caves_enemy_12 |
scorpion Knee Chopper Poison arachnid
マルマル

| foe.id | spider_eggs |
| foe.name(en) | Not Caviar |
| foe.name(ja) | マルマル |
| foe.name(tid) | tid_caves_enemy_04 |
spider_eggs Not Caviar Poison arachnid unpushable spawner immune_to_stun
◘コウモリーズ

| foe.id | cool_bat |
| foe.name(en) | Ceiling Decorator |
| foe.name(ja) | ◘コウモリーズ |
| foe.name(tid) | tid_caves_enemy_14 |
cool_bat Ceiling Decorator Poison flying boss ranged
悪賢い「ギハカツヤ」

| foe.id | spider_boss_harder |
| foe.name(en) | Bolesh, the Cunning |
| foe.name(ja) | 悪賢い「ギハカツヤ」 |
| foe.name(tid) | tid_caves_enemy_10 |
spider_boss_harder Bolesh, the Cunning boss Poison arachnid unpushable phase1 immune_to_stun
枯木の滝
| loc | waterfall Deadwood Waterfall |
| loc.id | waterfall |
| lco.name(en) | Deadwood Waterfall |
| loc.name(jp) | 枯木の滝 |
| loc.name(tid) | tid_ftue_11 |
キノコの森
| loc | fungus_forest Mushroom Forest |
| loc.id | fungus_forest |
| lco.name(en) | Mushroom Forest |
| loc.name(jp) | キノコの森 |
| loc.name(tid) | tid_mushroom_2 |
デカイカタツムリ

| foe.id | collossal_snail |
| foe.name(en) | Huge Snail |
| foe.name(ja) | デカイカタツムリ |
| foe.name(tid) | tid_mushroom_enemy_4 |
collossal_snail Huge Snail Vigor snail
マジでデカイカタツムリ

| foe.id | epic_snail |
| foe.name(en) | Big A** Snail |
| foe.name(ja) | マジでデカイカタツムリ |
| foe.name(tid) | tid_mushroom_enemy_6 |
epic_snail Big A** Snail Vigor slow snail
アリ

| foe.id | ant |
| foe.name(en) | Ant |
| foe.name(ja) | アリ |
| foe.name(tid) | tid_mushroom_enemy_0 |
ant Ant Vigor insect ant
アリの群れ

| foe.id | ant_hill |
| foe.name(en) | Ant Hill |
| foe.name(ja) | アリの群れ |
| foe.name(tid) | tid_mushroom_enemy_2 |
ant_hill Ant Hill Vigor insect unpushable spawner ant immune_to_stun
ぱふぱふ

| foe.id | fluff |
| foe.name(en) | Mr. Puff |
| foe.name(ja) | ぱふぱふ |
| foe.name(tid) | tid_mushroom_enemy_13 |
fluff Mr. Puff Vigor melee unpushable slow boss explode
怒りキノコ

| foe.id | mushroom_boss_harder |
| foe.name(en) | Angry Shroom |
| foe.name(ja) | 怒りキノコ |
| foe.name(tid) | tid_mushroom_5 |
mushroom_boss_harder Angry Shroom boss Vigor unpushable phase1 immune_to_stun
ジメジメしめじ

| foe.id | mushroom_boss_fat |
| foe.name(en) | Morel, the Sporeadic |
| foe.name(ja) | ジメジメしめじ |
| foe.name(tid) | tid_mushroom_enemy_9 |
mushroom_boss_fat Morel, the Sporeadic boss Vigor unpushable phase2
DJエノキ

| foe.id | mushroom_boss_skinny |
| foe.name(en) | Enoki, Fungi to be with |
| foe.name(ja) | DJエノキ |
| foe.name(tid) | tid_mushroom_enemy_11 |
mushroom_boss_skinny Enoki, Fungi to be with boss Vigor unpushable phase2
温泉地の売店
| loc | uulaa_shop tid_uulaa_shop_name |
| loc.id | uulaa_shop |
| lco.name(en) | Hotspring Shop |
| loc.name(jp) | 温泉地の売店 |
| loc.name(tid) | tid_uulaa_shop_name |
呪われた門
| loc | undead_crypt_intro tid_crypt_0 |
| loc.id | undead_crypt_intro |
| lco.name(en) | Haunted Gate |
| loc.name(jp) | 呪われた門 |
| loc.name(tid) | tid_crypt_0 |
呪われた会館
| loc | undead_crypt Haunted Halls |
| loc.id | undead_crypt |
| lco.name(en) | Haunted Halls |
| loc.name(jp) | 呪われた会館 |
| loc.name(tid) | tid_crypt_1 |
ガイコスケ

| foe.id | large_skeleton |
| foe.name(en) | Skeletony |
| foe.name(ja) | ガイコスケ |
| foe.name(tid) | tid_crypt_enemy_04 |
large_skeleton Skeletony AEther magic_vulnerability skeleton
ブー

| foe.id | ghost |
| foe.name(en) | Booo |
| foe.name(ja) | ブー |
| foe.name(tid) | tid_crypt_enemy_00 |
ghost Booo AEther immune_to_physical
ビッグブー

| foe.id | large_ghost |
| foe.name(en) | Big Booo |
| foe.name(ja) | ビッグブー |
| foe.name(tid) | tid_crypt_enemy_01 |
large_ghost Big Booo AEther immune_to_physical
ガイコージ
非召喚。ボス召喚のガイコージはfoe.idが異なります。

| foe.id | small_skeleton |
| foe.name(en) | Skeletimmy |
| foe.name(ja) | ガイコージ |
| foe.name(tid) | tid_crypt_enemy_03 |
small_skeleton Skeletimmy AEther magic_vulnerability skeleton
ナムアミダブツ

| foe.id | ghost_tomb |
| foe.name(en) | R.I.P. |
| foe.name(ja) | ナムアミダブツ |
| foe.name(tid) | tid_crypt_enemy_06 |
ghost_tomb R.I.P. AEther unpushable spawner immune_to_stun
バラバラ〜
バラバラ〜のfoeは 'foe.name' 欄がtid(テキスト識別子)です。

| foe.id | big_tomb |
| foe.name(en) | R.I.Pieces |
| foe.name(ja) | バラバラ〜 |
| foe.name(tid) | tid_crypt_enemy_10 |
big_tomb tid_crypt_enemy_10 AEther unpushable spawner boss immune_to_stun
皮なしの「ハイハイ」

| foe.id | skeleton_boss_harder |
| foe.name(en) | Pallas, the Skinless |
| foe.name(ja) | 皮なしの「ハイハイ」 |
| foe.name(tid) | tid_crypt_04 |
skeleton_boss_harder Pallas, the Skinless boss AEther unpushable phase1 skeleton immune_to_stun
足なしの「ハイハイ」

| foe.id | skeleton_boss_stage_2_harder |
| foe.name(en) | Pallas, the Legless |
| foe.name(ja) | 足なしの「ハイハイ」 |
| foe.name(tid) | tid_crypt_enemy_09 |
skeleton_boss_stage_2_harder Pallas, the Legless boss AEther unpushable phase2 skeleton immune_to_stun
ガイコージ
ボスから召喚されるガイコージ。非召喚とはfoe.idが異なる。

| foe.id | small_skeleton_minion |
| foe.name(en) | Skeletimmy |
| foe.name(ja) | ガイコージ |
| foe.name(tid) | tid_crypt_enemy_03 |
small_skeleton_minion Skeletimmy AEther magic_vulnerability skeleton
枯木の川を渡る
| loc | cross_deadwood_river Cross Deadwood River |
| loc.id | cross_deadwood_river |
| lco.name(en) | Cross Deadwood River |
| loc.name(jp) | 枯木の川を渡る |
| loc.name(tid) | tid_ftue_21 |
地獄の鉱山
| loc | bronze_mine Boiling Mine |
| loc.id | bronze_mine |
| lco.name(en) | Boiling Mine |
| loc.name(jp) | 地獄の鉱山 |
| loc.name(tid) | tid_boiling_mine_0 |
火の精霊

| foe.id | fire_elemental |
| foe.name(en) | Fire Elemental |
| foe.name(ja) | 火の精霊 |
| foe.name(tid) | tid_boiling_mine_enemy_04 |
fire_elemental Fire Elemental Fire elemental ranged
鉱山の浮浪者

| foe.id | mine_walker |
| foe.name(en) | Mine Walker |
| foe.name(ja) | 鉱山の浮浪者 |
| foe.name(tid) | tid_boiling_mine_enemy_08 |
mine_walker Mine Walker machine Fire magic_resist
カチョウ

| foe.id | slave_master |
| foe.name(en) | Whip Controller |
| foe.name(ja) | カチョウ |
| foe.name(tid) | tid_boiling_mine_enemy_02 |
slave_master Whip Controller humanoid Fire magic_resist ranged
ブチョウ

| foe.id | big_slave_master |
| foe.name(en) | Dominotaur |
| foe.name(ja) | ブチョウ |
| foe.name(tid) | tid_boiling_mine_enemy_00 |
big_slave_master Dominotaur humanoid Fire magic_resist ranged
ヒバシラ

| foe.id | fire_geyser |
| foe.name(en) | Flame Geyser |
| foe.name(ja) | ヒバシラ |
| foe.name(tid) | tid_boiling_mine_enemy_06 |
fire_geyser Flame Geyser Fire unpushable spawner immune_to_stun
ボンバーカート

| foe.id | ボンバーカート |
| foe.name(en) | bomb_cart |
| foe.name(ja) | Bomb Cart |
| foe.name(tid) | tid_boiling_mine_enemy_13 |
bomb_cart Bomb Cart humanoid Fire magic_resist melee unpushable slow boss explode
銅のガーディアン

| foe.id | bronze_guardian |
| foe.name(en) | Bronze Guardian |
| foe.name(ja) | 銅のガーディアン |
| foe.name(tid) | tid_boiling_mine_enemy_10 |
bronze_guardian Bronze Guardian boss Fire unpushable machine phase1 immune_to_stun immune_to_debuff_chill
氷の尾根
| loc | icy_ridge Icy Ridge |
| loc.id | icy_ridge |
| lco.name(en) | Icy Ridge |
| loc.name(jp) | 氷の尾根 |
| loc.name(tid) | tid_icy_ridge_0 |
キビュッフェ

| foe.id | ki_slerper |
| foe.name(en) | Ki Slurper |
| foe.name(ja) | キビュッフェ |
| foe.name(tid) | tid_icy_ridge_enemy_09 |
ki_slerper Ki Slurper Ice
キショク

| foe.id | ki_eater |
| foe.name(en) | Ki Eater |
| foe.name(ja) | キショク |
| foe.name(tid) | tid_icy_ridge_enemy_06 |
ki_eater Ki Eater Ice slow
キグイ

| foe.id | ki_gobbler |
| foe.name(en) | Ki Gobbler |
| foe.name(ja) | キグイ |
| foe.name(tid) | tid_icy_ridge_enemy_08 |
ki_gobbler Ki Gobbler Ice slow
氷の精霊

| foe.id | ice_elemental |
| foe.name(en) | Ice Elemental |
| foe.name(ja) | 氷の精霊 |
| foe.name(tid) | tid_icy_ridge_enemy_00 |
ice_elemental Ice Elemental Ice elemental ranged
幹部クラスの氷の精霊
幹部クラスの氷の精霊のfoeは 'foe.name' 欄がtid(テキスト識別子)になりました。

旧 iOS 3.59.1
| iOS 3.59.1 | |
|---|---|
| foe.id | ice_elemental_elite |
| foe.name(en) | Elite Ice Elemental |
| foe.name(ja) | 幹部クラスの氷の精霊 |
| foe.name(tid) | tid_icy_ridge_enemy_01 |
ice_elemental_elite Elite Ice Elemental Ice elemental ranged
| iOS 3.62.1 | |
|---|---|
| foe.id | ice_elemental_elite |
| foe.name(en) | Elder Ice Elemental |
| foe.name(ja) | 幹部クラスの氷の精霊 |
| foe.name(tid) | tid_icy_ridge_enemy_01 |
ice_elemental_elite tid_icy_ridge_enemy_01 Ice elemental ranged
ツララ

| foe.id | ice_pillar |
| foe.name(en) | Ice Pillar |
| foe.name(ja) | ツララ |
| foe.name(tid) | tid_icy_ridge_enemy_03 |
ice_pillar Ice Pillar Ice unpushable spawner immune_to_stun
ガリガリさん

| foe.id | ice_elemental_elite |
| foe.name(en) | Giant Ice Elemental |
| foe.name(ja) | ガリガリさん |
| foe.name(tid) | tid_icy_ridge_enemy_13 |
ice_elemental_elite Giant Ice Elemental Ice elemental ranged unpushable boss immune_to_debuff_chill
霜の巨人

| foe.id | yeti |
| foe.name(en) | Hrímnir |
| foe.name(ja) | 霜の巨人 |
| foe.name(tid) | tid_icy_ridge_enemy_11 |
yeti Hrímnir boss Ice unpushable humanoid phase1 immune_to_stun immune_to_debuff_damage
氷の壁

| foe.id | ice_wall |
| foe.name(en) | Ice Wall |
| foe.name(ja) | 氷の壁 |
| foe.name(tid) | tid_icy_ridge_enemy_05 |
ice_wall Ice Wall Ice unpushable immune_to_stun
橋渡り
| loc | cross_bridge Cross the Bridge |
| loc.id | cross_bridge |
| lco.name(en) | Cross the Bridge |
| loc.name(jp) | 橋渡り |
| loc.name(tid) | tid_brige_2 |
神殿
| loc | temple Temple |
| loc.id | temple |
| lco.name(en) | Temple |
| loc.name(jp) | 神殿 |
| loc.name(tid) | tid_temple_0 |
ミミズ乗り

| foe.id | worm_rider |
| foe.name(en) | Worm Rider |
| foe.name(ja) | ミミズ乗り |
| foe.name(tid) | tid_temple_enemy_14 |
worm_rider Worm Rider humanoid Poison cult
オロチーッス

| foe.id | ground_serpent |
| foe.name(en) | Ground Serpent |
| foe.name(ja) | オロチーッス |
| foe.name(tid) | tid_temple_enemy_08 |
ground_serpent Ground Serpent Poison serpent cult
カツラ泥棒

| foe.id | flying_serpent |
| foe.name(en) | Toupée Snatcher |
| foe.name(ja) | カツラ泥棒 |
| foe.name(tid) | tid_temple_enemy_12 |
flying_serpent Toupée Snatcher Poison serpent cult
鐘鳴らし

| foe.id | heavy_hitter |
| foe.name(en) | The Bell Ringer |
| foe.name(ja) | 鐘鳴らし |
| foe.name(tid) | tid_temple_enemy_06 |
heavy_hitter The Bell Ringer humanoid Poison slow cult
カルトのガードマン

| foe.id | cult_guard |
| foe.name(en) | Cult Guard |
| foe.name(ja) | カルトのガードマン |
| foe.name(tid) | tid_temple_enemy_04 |
cult_guard Cult Guard humanoid Poison cult
毒使い

| foe.id | poison_adept |
| foe.name(en) | Poison Adept |
| foe.name(ja) | 毒使い |
| foe.name(tid) | tid_temple_enemy_02 |
poison_adept Poison Adept humanoid Poison ranged cult
カルトの魔導師

| foe.id | cult_sorcerer |
| foe.name(en) | Cult Sorcerer |
| foe.name(ja) | カルトの魔導師 |
| foe.name(tid) | tid_temple_enemy_00 |
cult_sorcerer Cult Sorcerer humanoid ranged cult
カルトの狙撃者

| foe.id | cult_marksman |
| foe.name(en) | Cult Marksman |
| foe.name(ja) | カルトの狙撃者 |
| foe.name(tid) | tid_temple_enemy_20 |
cult_marksman Cult Marksman humanoid ranged cult
蛇使い

| foe.id | serpent_handler |
| foe.name(en) | Serpent Handler |
| foe.name(ja) | 蛇使い |
| foe.name(tid) | tid_temple_enemy_10 |
serpent_handler Serpent Handler Poison unpushable spawner humanoid cult immune_to_stun
アルカディアのカルト団員

| foe.id | acronian_cultist |
| foe.name(en) | Acronian Cultist |
| foe.name(ja) | アルカディアのカルト団員 |
| foe.name(tid) | tid_temple_enemy_18 |
acronian_cultist Acronian Cultist boss Poison humanoid unpushable immune_to_Vigor
侵食の「ナーガラージャ」

| foe.id | nagaraja |
| foe.name(en) | Nagaraja, Eater of the Torch |
| foe.name(ja) | 侵食の「ナーガラージャ」 |
| foe.name(tid) | tid_temple_enemy_16 |
nagaraja Nagaraja, Eater of the Torch boss Poison unpushable serpent phase1 immune_to_stun
Stonescript おべんきょう 2
↓ 旧ページ
SSR_自分用おべんきょ - Stone Story RPGを機械翻訳 + 備忘録
モンテスちゃんの学び舎その2👶
(:зꇤ )ニ キュ
- 真夏の月光クエスト
- gen_foe_key
- スクリプト編集中の時にキャッシュを無効にする
- 敵の名前を完全なユニークとして扱う為に
- 内部的な処理の流れが分からない時
- 全てのiterableが真、またはiterable が空ならtrue
- foeの中身を被りなく保存する
- 再帰処理
- if文の型や真偽結果を色々表示すると
- セクション区切り string.Format
- if文の&をマスターしよう
- if文に使うものを型判別して処理の理解を深める
- if文の判定結果を可視化してみよう
- ステージの敵名一覧を取得
- 自動で属性選択
- string.Formatの書式指定子を色々お試し
- 右揃えの九九表を作ってみよう
- アプリ再起動まで消した関数定義を使える
- bladeでより多くの敵を巻き込むscreen.iを取得
- エーテルのお守り
- 指定size分、行(列)移動したら次の行(列)へ
- draw_circle
ふとした時に見るリンク
ja.javascript.info
mozilla.org/ja
docs.python.org/ja
utokyo-ipp.github
真夏の月光クエスト
明瞭の石を使用して火のお守りの能力を発動させる
?summon.GetId() ! "cinderwisp"
^& item.GetCooldown("fire_talisman") <= 0
^& item.CanActivate()
equipR fire talisman
activate R
?summon.count = 1
loc.Leave()
デコレーションをしながら敵を倒す
import Cosmetics/PetDog import Cosmetics/PetCrab
gen_foe_key
var foe_key = ""
foe_key = gen_foe_key()
func gen_foe_key()
var __en = foe.id + " " + te.toEnglish(foe.name)
var __tid = foe.id + " " + te.GetTID(foe.name)
?!foe
return ""
:?foe = __en
return __en
:?foe = __tid
return __tid
:
return "gen_foe_key()内のif不足"
>`1,6,ascii
Type @Type(foe_key)@
█@foe_key@█
asciiend
スクリプト編集中の時にキャッシュを無効にする
キャッシュ無効にしないと本来期待する動作にならない事があるんおね(´・ω・)久々にスクリプト触ってる
「現在、sys namespaceは意図した通りに機能していません」から変わったのでしょうかManualまとめ sys.cacheRemoteFiles
sys.cacheRemoteFilesをfalseにしてもステージの出入りでキャッシュ有効/無効が交互に切り替わってるから、2回に1回はキャッシュ無効になった
コンポーネント(Text)でキャッシュ確認しゅた
?loc.begin sys.cacheRemoteFiles = false
敵の名前を完全なユニークとして扱う為に
色々遊んだ後はブログを少し整備して、新しいページを追加(敵図鑑 loc・foeデータ(高難易度のみ))しました。
foe.id, foe.name(en), foe.name(jp), foe.name(tid)
いずれかに統一すると、必ず何かしらユニークとして扱えない敵が発生するという
何を心配せずとも常にユニークとしては扱いたいなら、文字を結合してユニークであろう可能性を上げるか、要所要所で使い分けがね 必要だよね(えぇ…)
そしてお気に入り図鑑
アリくん
アリえんよなぁ…🐜⸒⸒
アリの群れ
アリガトウよなぁ…🐜⸒⸒(可愛い)
カツラ泥棒
…🐍すき
GWは近場で色々お店開拓してました
銀座は半数近くが外国人観光客 みなとみらいは三割前後 ဗီူဗီူ 比率ほんとに変わったね
内部的な処理の流れが分からない時
とにかくログをとる
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が真、またはiterable が空ならtrue
組み込み関数 — Python 3.12.4 ドキュメント
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
▼ iterable のいずれかの要素が真ならTrue
iterable が空なら False
func any(iterable)
for element : iterable
?element
return true
return false
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 - 3)
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文の判定結果を可視化してみよう
👆🏻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
▼ 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_自分用おべんきょ
↓ 若干重いから新しいページ作った
Stonescript おべんきょう 2 - Stone Story RPGを機械翻訳 + 備忘録
モンテスちゃんの旧学び場です
…勝手に引用しちゃうもんね👶!!
可愛いモンテスに免じて許してください
名前:モンモンモンテス
(:зꇤ )ニ キュ
JavaScriptとpythonの講座。とても安眠効果がある。
2023/11/22 もはやスクリプトは一切追記してない
developer.mozilla
python.jp
東京大学Pythonプログラミング入門教材
- 色々
- 多方向に対応したスワイプを作ってみよう
- 小さい四角を移動させてみよう
- 正方形に近くなるマス目
- canvasで座標の補助線を表示するスクリプトを直してもらった
- Stonescriptが反映されない原因?
- 可愛いフォントがおったそうな
- 2024/03/02 イベント
- canvasの計算
- ボタン押下でblend変更
- canvas色々保存
- ポーションボタン(擬似透過)
- 行動の誤作動
- ログ表示に背景色をつけてサイバーチックにしてみる
- ログ書き込み修正
- コンポーネントの枠線を色々変えてみる
- スキル発動中に台詞を追加してみる
- プレイヤー/敵のバフ/デバフ数をintで取得
- 1つのボタンに複数の役割を持たせる
- if文でreturn
- スライド表示
- 特定の条件でキャンバス追加(多重追加)
- スクリプトでマスクを発動しよう
- 配列の要素を画面の高さ分追加(それ以上は追加しない)
- スキル分岐
- 円を描く演算いじいじ
- 配列とtime関連の認識改め
- 指定地点に近付くほど減速
- string.Formatで右寄せ左寄せ
- ブックマークレット
- 配列の概念
- this.でグローバル変数呼び出し
- varの一時的なデッドゾーン
- 4次元配列を試す
- Lambdaにもう一度触れてみる
- uiのCanvasが難しい
- FPS表示その2
- 指定座標へアニメーション表示
- hpとアーマー値を合わせる
- 処理の使い分け
- 実行関数を関数で判定
- ラムダ式(Lambda)
- Stone Story RPGの知識階級
- コネコネタイム
- 親コンポーネント設定
- 敵のchill数だけ数字として取り出す
- 演算でプレイヤー周りに星をクルクル表示
- アニメーション表示
- varを書いてみる
- 使える文字(一部)
- モバイル版でマインドストーンを途中で開く
- FPSチェッカー
- 文字列の数字を数値として扱うにはどうすればいいですか?
- 東京大学の教材"Pythonプログラミング入門"をみてみる
- for (ループ)
- func
色々
多方向に対応したスワイプを作ってみよう
スワイプの話題がdiscordで挙がっていたので、
多方向(斜め検出可能な8方向とか)に対応したスワイプを実現する為に、必要なものを揃えてみまする

今回必要なものはタッチ開始を基点とした角度と距離としておきます
ゲームを作るにしても、これらを用意しておけばスワイプでキャラクター操作の速度を調節できたり、斜め移動も可能になったりと、なんだか楽しそうですね

スワイプの角度処理は面倒で作ってないけど、必要な物は用意できたと思ふ👶タブン
もはやスワイプと名乗ってはいけないんだと思いますが、まぁおいといて(おいとくぬぁ)
今まで使ってこなかったネイティブ関数を活用してみたのだ
今回初めて登場する子達
↓ Manualまとめの項目にジャンプ
math.Sqrt(num)
math.ToDeg(num)
math.Atan2(y, x)
math.pi
math.RoundToInt(num)
公式(英語)のmanualはこっち
わかりやすい解説があったのでぺたぺた
外部リンク
2点の座標(線分)からラジアンを求める
2点の座標(線分)から距離を求める
直角三角形の斜辺を求める
var touch_enabled = false
touch_start()
// タッチ開始
func touch_start()
?key = "Begin" & ! loc.begin
touch_enabled = true
return true
return false
// テンプレ 配列の値2つ書き換え
func update_array(arr,val_1,val_2)
?arr.Count() = 1
arr.Emplace(0,[val_1,val_2])
?arr.Count() = 0
arr.Add([val_1,val_2])
// 斜辺の長さを求める
func hypot(dx, dy)
return math.RoundToInt(
^ math.Sqrt(dx * dx + dy * dy))
var swipe_inp_1 = []
var swipe_inp_2 = []
var swipe_inp_3 = []
var swipe_toggle = 0.0
var swipe_length = 0.0
var swipe_rad = 0.0
var swipe_deg = 0.0
func update_swipe()
// タッチ開始
?key = "Begin" & ! loc.begin
update_array(swipe_inp_1,input.x,input.y)
// タッチ移動中
?key = "primary"
^& key ! "Begin"
^& key ! "End"
update_array(swipe_inp_2,input.x,input.y)
swipe_toggle = hypot(
^ swipe_inp_2[0][0] - swipe_inp_1[0][0]
^,swipe_inp_2[0][1] - swipe_inp_1[0][1])
return true
// タッチ終了
?key = "End"
update_array(swipe_inp_3, input.x, input.y)
swipe_length = hypot(
^ swipe_inp_3[0][0] - swipe_inp_1[0][0]
^,swipe_inp_3[0][1] - swipe_inp_1[0][1])
swipe_rad = math.Atan2(
^ swipe_inp_3[0][1] - swipe_inp_1[0][1]
^,swipe_inp_3[0][0] - swipe_inp_1[0][0])
// + math.piがない場合、-180(付近)〜180°
swipe_deg = math.RoundToInt(
^ math.ToDeg(swipe_rad + math.pi))
touch_enabled = false
return true
:
return false
// 実行 スワイプに必要なものたち
?touch_enabled
update_swipe()
// 動作テスト
>`1,1,ascii
touch_enabled @touch_enabled@
swipe_toggle @swipe_toggle@
swipe_length @swipe_length@
swipe_rad @swipe_rad@
swipe_deg @swipe_deg@
asciiend
// タッチ位置を見やすく
draw.BG(0,0,#222222,screen.w,screen.h)
追加でswipe_enabledとか作ったり、もう少しまとめてみたりなんだりとしたいですが、とりあえずしうりょう◦<(:3[▓]
見慣れないradianと馴染みのあるdegree表記はわけておきまんた
どんなものかちょっと見たかった
小さい四角を移動させてみよう
チラつきが目に悪い
▼ 小さい四角を画面下に移動
var y = 0
var text = "▀"
?totaltime % 2 = 1
text = "▀"
text = "▄"
?totaltime % 2 = 0
y++
?y = screen.h-1
y = 0
>`1,@y@,@text@
正方形に近くなるマス目
8×9マスが1番正方形に近いなりね👶
画面表示のマス目でいうと8×4.5
4.5マスゥ?
uiAdd.styleに使用する記号を入れておけば微妙な位置に記号を配置できるという裏技が(´ω`)
あとは"▄"、"▀"、canvas.SetBG(color)を駆使すれば表現出来る…?凹〇 コテッ
Vector…ワカリマシェン

気が向いたらなにかドット絵で作ってみるかもしれない
折角だから、やたら発光させてみたり
…それはまぁおいといて
座標の補助線を表示するスクリプトの流れ(とうとつぅ)

縦軸はフレーム経過
横軸は内部処理の順番を意識したもの…を少し整形
またいつかこんな事をするかもしれなひ
▼ 作る前はこんな感じで大雑把にカキカキ

皆はどういう手順で書いてるんだろう?
いきなりガリガリ書き始められるのかな
canvasで座標の補助線を表示するスクリプトを直してもらった
自分は何を作ったか知ってるけど、相手は何をどんな流れで作ったか知らない状況でスクリプトを読むということが抜けてた👶ソーリー
ありがとうございめす!
プリント座標位置の補助線-修正してもらったもの
var inp_x
var inp_y
var root_children
var sh = screen.h
var sw = screen.w
var s_size = string.Size
inp_x = input.x
inp_y = input.y
root_children = ui.root.children
var cnvs_ruler_arr = []
// テンプレ キャンバス設定
func set_cnvs_arr(arr,idx,x,y,w,h,blend,color)
?arr.Count() ! 0
arr[idx].x = x
arr[idx].y = y
arr[idx].w = w
arr[idx].h = h
arr[idx].blend = blend
arr[idx].SetFG(color)
arr[idx].SetBG(color)
arr[idx].anchor = "top_left"
arr[idx].dock = "top_left"
// まとめ ルーラー設定
func set_cnvs_ruler()
var arr = cnvs_ruler_arr
?arr.Count() = 6
// set_cnvs_arr(arr,idx,x,y,w,h,blend,color)
set_cnvs_arr(arr,0,0,inp_y,sw,1,"Multiply","#8873E8")
set_cnvs_arr(arr,1,0,inp_y,sw,1,"Divide","#778A08")
set_cnvs_arr(arr,2,0,inp_y,sw,1,"Add","#070537")
set_cnvs_arr(arr,3,inp_x,0,1,sh,"Multiply","#8873E8")
set_cnvs_arr(arr,4,inp_x,0,1,sh,"Divide","#778A08")
set_cnvs_arr(arr,5,inp_x,0,1,sh,"Add","#070537")
var ruler_enabled = false
var prev_ruler_enabled=false
var ruler_recycle_duration = 0
// 画面タッチ検出
func detect_touch_start()
?key = "primary"
^& key ! "primaryEnd"
^& ! loc.begin
^& ! loc.loop
ruler_enabled = true
ruler_recycle_duration = 0
return true
return false
var ruler_duration_toggle = false
detect_touch_end()
// 画面タッチ検出終了
func detect_touch_end()
?key = "primaryEnd"
^& ! loc.begin
^& ! loc.loop
ruler_duration_toggle = true
ruler_recycle_duration = 0
// タッチした位置の座標表示(後で手直し)
func show_ruler_pos()
var color = "#996FFF"
var x = s_size("Y " + inp_y) / - 2
?ruler_enabled
>`@1+inp_x+x@,1,@color@,Y @inp_y@
>`1,@inp_y@,@color@,X @inp_x@
// キャンバス追加〜設定あれこれ更新
func update_cnvs_ruler()
?detect_touch_start()
?ruler_enabled&!prev_ruler_enabled
^& cnvs_ruler_arr.Count() = 6
for i = 0..5
cnvs_ruler_arr.Emplace(i,ui.AddCanvas())
?cnvs_ruler_arr.Count() = 0
for i = 0..5
cnvs_ruler_arr.Add(ui.AddCanvas())
?ruler_duration_toggle
ruler_recycle_duration++
?ruler_recycle_duration = 60
for i = 0..cnvs_ruler_arr.Count()-1
cnvs_ruler_arr[i].Recycle()
ruler_duration_toggle = false
ruler_enabled = false
ruler_recycle_duration = 0
set_cnvs_ruler()
show_ruler_pos()
prev_ruler_enabled=ruler_enabled
// 動作確認 ////////////////////////////////////
>`1,6,ascii
key @key@
time @time@
totaltime @totaltime@
ruler_enabled @ruler_enabled@
ruler_duration_toggle @ruler_duration_toggle@
ruler_recycle_duration @ruler_recycle_duration@
cnvs_ruler_arr.Count() @cnvs_ruler_arr.Count()@
root_children.Count() @root_children.Count()@
asciiend
// main ////////////////////////////////////////
?loc.begin | loc.loop
disable hud br
update_cnvs_ruler()
Stonescriptが反映されない原因?
ホームでも変数が残ってる

画面表示の>h基準使って表示させたからかな
Cosmetics(等)をホームでも反映させる仕様がバグを引き起こしてるのかな?そんな事はなかった
変数が残ってるわけじゃなかった
でも、そんな感じの挙動はほかの場面であるなぁ
コンポーネント弄ってる時は再起動しないと直らない事が殆どだったから(コピペでは直らなかった)、再起動で全ての変数が一度初期化されてるのかなぁ
一度ステージを出入りしないと反映されない変数も(変数というかコンポーネントというか)あったし
ちゃんとした書き方を学んだ方がいいんだろうなん
やらぬのだけど👩
本格的なプログラムのドキュメント見ると眠くなるんだよなぁ

(パイパイとは)
可愛いフォントがおったそうな
なんとなしにネットサーフィンしてたらこんなに可愛いフォントと巡り合ってしまった
なんで巡り合ったんだろう
{ }波括弧が可愛すぎる

フォントは🔎
色々他のフォントと組み合わせて補ってるんだね

IBMのオリジナルフォントなんだ👶
というわけで、google fontsにあったので使ってみる
文字化けもフワフワしてきゃわっ꒰ ꒱

weight 300は目がチカチカする
weight 300
{}{}()[]
item.CanActivate()
item.GetCooldown("") <= 0
1234567890Oo○、。?!/#+×÷¥$<=>:*^|\~&・☆
対応文字が少なくてよく化けるけど かわ
weight 400
{}{}()[]
item.CanActivate()
item.GetCooldown("") <= 0
1234567890Oo○、。?!/#+×÷¥$<=>:*^|\~&・☆
ストーンスクリプト関係で検索してたはずなんだけどな〜?
2024/03/02 イベント
ポーション飲むクエスト 手動でいいんだけどしゃ
// アーマーポーションを飲んで退出(3回) ?loc.begin brew stone + tar activate potion ?item.potion = "Empty" loc.leave()
ポーション調合表
/***********************************************
コメントアウト
item.potion
Berserk
wood + bronze
Cleansing
wood + tar
Defensive
stone + tar
Experience
wood
Healing
tar
Invisibility
stone + wood
Lightning
bronze
Lucky
stone + bronze
Strength
stone
Vampiric
tar + bronze
***********************************************/
石ころのアイテムのみを使って枯木の渓谷をクリアする
// 枯木3
func LR(itemL,itemR)
equipL @itemL@
equipR @itemR@
func can_dash(itemR,dist)
?foe.distance <= dist
^& foe.distance > 10
^& item.GetCooldown(itemR) <= 0
^& item.CanActivate()
^& foe ! "immune_to_ranged"
return true
return false
?can_dash("bash",16)
LR("triskelion","bash")
:?can_dash("dash",16)
LR("triskelion","dash")
:?foe.distance <= 16
?foe = "immune_to_ranged"
?foe.distance <= 9 & foe.distance > 5
equip skeleton_arm
:
LR("Stone sword","compound")
:
equip repeating
:?pickup.distance <= 14
LR("triskelion","star")
:
LR("triskelion","compound")
>`1,1,#999999,ascii
L @item.left@
R @item.right@
asciiend
両手専用装備だと左手に武器表示されないからアウトかな〜と思ったら、クエスト達成出来るんですね
捨て台詞を吐かれつつ...(星3)

使い捨てのスクリプトでも長くなっちゃう...欲がね
でる( ◜ω◝ )
↓ せっかくなのでスクリプトを再利用
丈夫な盾でボスをスタンする(20回)
// 洞窟5
func LR(itemL,itemR)
equipL @itemL@
equipR @itemR@
func can_dash(itemR,dist)
?foe.distance <= dist
^& foe.distance > 10
^& item.GetCooldown(itemR) <= 0
^& item.CanActivate()
^& foe ! "immune_to_ranged"
return true
return false
?can_dash("bash",16)
LR("triskelion","bash")
:?can_dash("dash",16)
LR("triskelion","dash")
:?foe.distance <= 16
?foe = "phase"
LR("quest","wand dP")
?foe.debuffs.string = ":debuff_damage:"
LR("quest","compound")
:?foe = "immune_to_ranged"
?foe.distance <= 9 & foe.distance > 5
equip skeleton_arm
:
LR("Stone sword","compound")
:
equip repeating
:?pickup.distance <= 14
LR("triskelion","star")
:
LR("triskelion","compound")
>`1,1,#999999,ascii
L @item.left@
R @item.right@
@foe.debuffs.string@
asciiend
canvasの計算

ただしフィルターを複数通ると…ソレハシラナイ
ボタン押下でblend変更
加算、減算、乗算、除算の順に変更
( 'ࠔ')ノ 凸ポティ
var xxx = []
var blend_ = [
"add","subtract","multiply","divide"]
func change_canvas_blend()
var text_ = ["◀","▶"]
var blend_c = "#4499EE"
?loc.begin | loc.loop
xxx.Add(ui.AddButton()) // 0
xxx.Add(ui.AddButton()) // 1
xxx.Add(ui.AddCanvas()) // 2
for i = 0..1
// ボタン設定
xxx[i].x = 6 * i
xxx[i].y = 6
xxx[i].text = text_[i]
xxx[i].w = string.Size(xxx[i].text) + 4
xxx[i].h = 3
xxx[i].style = -1
xxx[i].SetPressed(change_blend)
// キャンバス設定
xxx[2].w = screen.w
xxx[2].h = screen.h
xxx[2].blend = blend_[0]
xxx[2].SetFG(blend_c)
xxx[2].SetBG(blend_c)
var blend_idx = 0
func change_blend(btn)
?btn = xxx[0]
blend_idx--
?blend_idx <= -1
blend_idx = blend_.Count()-1
?btn = xxx[1]
blend_idx++
?blend_idx >= blend_.Count()
blend_idx = 0
xxx[2].blend = blend_[blend_idx]
change_canvas_blend()
>o4,0,@blend_[blend_idx]@
canvas色々保存
色が壊れてしまう時あるけど…保存!特に青紫👶
▼ 青紫 線画反転
var xxx = []
?loc.begin | loc.loop
xxx.Add(ui.AddCanvas()) // 0
xxx.Add(ui.AddCanvas()) // 1
xxx[0].blend = "Multiply"
xxx[0].SetFG(#9E20FF)
xxx[0].SetBG(#9E20FF)
xxx[1].blend = "Add"
xxx[1].SetFG(#010022)
xxx[1].SetBG(#010022)
▼ 紫 線画反転
var xxx = []
?loc.begin | loc.loop
xxx.Add(ui.AddCanvas()) // 0
xxx.Add(ui.AddCanvas()) // 1
xxx[0].blend = "Multiply"
xxx[0].SetFG(#FF03F2)
xxx[0].SetBG(#FF03F2)
xxx[1].blend = "Add"
xxx[1].SetFG(#0E0323)
xxx[1].SetBG(#0E0323)
ポーションボタン(擬似透過)
あれだ >とか他のものがcanvasの背景にあるとblendがアレ 色の予測が立てづらい
色相自体まるっきり変わるのはなんなんだろう
あと、ui系いじると再起動しないと反映されてない事が結構あるなぁ
アプリ起動してから1回、ステージの出入りしないと反応しないvarとか
これが本当に意味不ぅ
線の反転色を決めたいが為にまた長くなってしまわれた
var style_ = [ui.AddStyle("#########")]
var purple_c = [
["Add","#080808"]
,["Add","#01001C"]
,["Subtract","#00FF00"]
]
var itemP_slct
itemP_slct = string.Split(item.potion)[0]
var itemP_obj = []
func set_potion_btn()
// itemP_obj[idx[i]].blend
var idx = [1,2,3]
?loc.begin | loc.loop
disable hud ab
itemP_obj.Add(ui.AddButton()) // 0
itemP_obj.Add(ui.AddCanvas()) // 1
itemP_obj.Add(ui.AddCanvas()) // 2
itemP_obj.Add(ui.AddCanvas()) // 3
// 共通設定
for i = 0..itemP_obj.Count()-1
itemP_obj[i].x = 1
itemP_obj[i].y = 2
itemP_obj[i].w = string.Size(itemP_slct) + 2
itemP_obj[i].h = 3
itemP_obj[i].anchor = top_left
itemP_obj[i].dock = top_left
// ボタン個別設定
itemP_obj[0].tcolor = #8873E8
itemP_obj[0].style = style_[0]
itemP_obj[0].text = itemP_slct
itemP_obj[0].SetPressed(push_potion)
// キャンバス個別設定
for i = 0..purple_c.Count()-1
itemP_obj[idx[i]].blend = purple_c[i][0]
itemP_obj[idx[i]].SetFG(purple_c[i][1])
itemP_obj[idx[i]].SetBG(purple_c[i][1])
func push_potion(btn)
?btn = itemP_obj[0]
activate potion
set_potion_btn()
itemP_obj[0].text = itemP_slct
for i = 0..itemP_obj.Count()-1
itemP_obj[i].w = string.Size(itemP_slct) + 2
行動の誤作動
画面表示でも実行しちゃうんだ
起動しちゃうんだきみぃ(:3 _ )=
コマンド系は除外されるかと思った
func test(item)
?item.CanActivate()
equip @item@
activate R
return true
return false
// @で計算してスキル起動しちゃう
>@test("mask")@
ログ表示に背景色をつけてサイバーチックにしてみる
ちょっと暗い
画像が圧縮されてるのか、実際の色より暗く見える
▼ 氷の尾根 紫に怪しく光る月

▼ 枯木の渓谷 敵の色によって重なった部分が変色

黄色線が蛍光ピンク
水色線が青
明度によって紫系に変化
スクリプトは長いので折りたたみဗီူဗီူどうしてこんな事に
スクリプト表示
var size_ = string.Size
// ログ取得
// [] = 0 | [[]] = 1
var iR_state_time = []
var iL_state_time = []
var f_id_dist = []
var f_state_time = []
var style_transparent = ui.AddStyle("#########")
var style_fslash_1 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄")
var style_fslash_2 = ui.AddStyle("⁄⁄⁄⁄#⁄⁄⁄⁄")
var style_sun = ui.AddStyle("☼〜☼┊#┊☼〜☼")
var style_dline = ui.AddStyle("╥–╥║#║╨–╨")
var style_mul = ui.AddStyle("×××┊#┊×××")
var style_cyrl_zhe = ui.AddStyle("жжж┊#┊жжж")
// ボタン表示切り替え(未実装)
var info_visibility = true
// #ひな形-コンポーネント-基本設定-パーツ
func set_base(name,x,y,w,h,doc_anc)
name.x = x
name.y = y
name.w = w
name.h = h
name.dock = doc_anc
name.anchor = doc_anc
// #ひな形-キャンバス-設定-パーツ
func set_blend(name,blend,BG_FG,color)
name.blend = blend
?string.Equals(BG_FG,"FG")
name.SetFG(color)
?string.Equals(BG_FG,"BG")
name.SetBG(color)
?string.Equals(BG_FG,"BGFG")
name.SetBG(color)
name.SetFG(color)
// #ひな形-キャンバス-設定-まとめ
func set_canvas(name,parent,blend,BG_FG,color)
set_base(name,0,0,parent.w,parent.h,left_top)
set_blend(name,blend,BG_FG,color)
// 画面表示-上 ///////////////////////////////
// #ひな形-ログ-記録
func write_logs(arr,ins_val,max_row)
?arr.Count()
arr.Insert(0,ins_val)
?arr.Count() = 0
arr.Add(ins_val)
?arr.Count() > 1 & (arr[0][0] = arr[1][0])
arr.RemoveAt(1)
?arr.Count() > max_row
arr.RemoveAt(max_row)
// #ひな形-ログ-表示
func show_logs(
arr,topic,x,y,color_1,color_2,color_3)
?arr.Count()
for i = 0..arr.Count()-1
>`@2+x@,@y@,@color_1@,@topic@
>`@2+x@,@1+y+i@,@color_2@,@arr[i][0]@.@arr[i][1]@
>`@2+x@,@1+y@,@color_3@,@arr[0][0]@.@arr[0][1]@
// &まとめ
// ログ-記録---表示
// コンポーネント-追加---設定
func show_logs_top()
var arr = [
iL_state_time
^ ,iR_state_time
^ ,f_state_time
^ ,f_id_dist
]
var topics = [
"Ls.Lt"
^ ,"Rs.Rt"
^ ,"Fs.Ft"
^ ,"Fid.Fd"
]
var logs = [
[item.left.state,item.left.time]
,[item.right.state,item.right.time]
,[foe.state,foe.time]
,[foe.id,foe.distance]
]
var x = [1,11,21,31]
var y = 1
var w = [10,10,10,30]
var col = [10,20,30,60]
var row = 5
var color = [
// (ログ見出し
// ["#FFB520","#FFB520","#75FECF","#75FECF"]
["#A867D5","#A867D5","#D85696","#D85696"]
// (キャンバス
,["#080808","#01001C","#00ff00"
,"#E363BF","#733B7D"]
// (枠線
,["#9957C4"]
]
// (コンポーネント-追加-設定
var panel_top
var canvas_top_0
var canvas_top_1
var canvas_top_2
?loc.begin | loc.loop
// (コンポーネント-追加
panel_top = ui.AddPanel()
canvas_top_0 = ui.AddCanvas()
canvas_top_1 = ui.AddCanvas()
canvas_top_2 = ui.AddCanvas()
// (コンポーネント-設定
// (パネル-設定
set_base(panel_top
^ ,x[0],y,col[col.Count()-1],row+2,top_left)
panel_top.style = style_transparent
panel_top.visible = false
// (キャンバス-設定
// canvas_top_0 不要っぽい メモ
set_canvas(canvas_top_0
^ ,panel_top,"add","BGFG",color[1][0])
set_canvas(canvas_top_1
^ ,panel_top,"add","BGFG",color[1][1])
set_canvas(canvas_top_2
^ ,panel_top,"subtract","BGFG",color[1][2])
// (親設定
panel_top.Add(canvas_top_0)
panel_top.Add(canvas_top_1)
panel_top.Add(canvas_top_2)
// (ログ-初期化
for i = 0..arr.Count()-1
arr[i].Clear()
// (ログ-記録-表示-枠線表示
for i = 0..arr.Count()-1
// (ログ-記録
write_logs(arr[i]
^ ,[logs[i][0],logs[i][1]],row)
// (ログ-表示
show_logs(arr[i],topics[i],x[i],y
^ ,color[0][i],color[1][4],color[1][3])
// (枠線-表示
draw.Box(x[i],y,w[i],row+2,color[2][0],style_fslash_2)
// ログ表示 /////////////////////////////////
// 後で切り替えボタン実装
// 今は意味なしお
?info_visibility
show_logs_top()
:
panel_top.visible = false
// メモ /////////////////////////////////////
/*
パネル(コンポーネント)の枠線はキャンバスで色が上乗せされるので、色変したい場合はdraw.Box
// キャンバス設定お気に入り色
// 080808 暗め 加算 add 不要っぽい
// 01001C 青紫 加算 add
// 00ff00 原色緑 減算 subtract
*/
…こんな長いのメインスクリプトに入れたくないよ👶(?!)
っていうか 色もっと抑えた方がいいなぁ
ファンシーな色合いにしつつ
自然な配色 う〜ん
追記:キャンバスレイヤーの枚数によっては1枚目のブレンドモードが不透明のような扱いに変わってると思い、アイビスで色確認しやすいレイヤー3枚で確認していた…が!レイヤー2枚にしても同じだった
canvas_top_0いらないね…👀
どうしてこんな勘違いを起こしたんだろう?謎のcolもいるし(?)
手直し手直し
修正版
var equals_ = string.Equals
var size_ = string.Size
var iR_state_time = []
var iL_state_time = []
var f_id_dist = []
var f_state_time = []
var style_00 = ui.AddStyle("#########")
var style_01 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄")
var style_02 = ui.AddStyle("☼〜☼┊#┊☼〜☼")
var info_visibility = true
var iR
iR = item.right
var iL
iL = item.left
var iRs
iRs = item.right.state
var iLs
iLs = item.left.state
var iRt
iRt = item.right.time
var iLt
iLt = item.left.time
// #ひな形-コンポーネント-基本設定-パーツ
func set_base(name,x,y,w,h,doc_anc)
name.x = x
name.y = y
name.w = w
name.h = h
name.dock = doc_anc
name.anchor = doc_anc
// #ひな形-キャンバス-設定-パーツ
func set_blend(name,blend,color)
name.blend = blend
name.SetBG(color)
name.SetFG(color)
// #ひな形-キャンバス-設定-まとめ
func set_base_canvas(name,parent,blend,color)
set_base(name,0,0,parent.w,parent.h,left_top)
set_blend(name,blend,color)
// ログ記録
func write_logs(logs,ins_val,max_row)
?logs.Count()
logs.Insert(0,ins_val)
?logs.Count() = 0
logs.Add(ins_val)
?logs.Count() > 1 & (logs[0][0] = logs[1][0])
logs.RemoveAt(1)
?logs.Count() > max_row
logs.RemoveAt(max_row)
// ログ表示
func show_logs(
logs,topic,x,y,color_1,color_2,color_3)
?logs.Count()
for i = 0..logs.Count()-1
>`@x@,@y@,@color_1@,@topic@
>`@x@,@y+i+1@,@color_2@,@logs[i][0]@.@logs[i][1]@
>`@x@,@y+1@,@color_3@,@logs[0][0]@.@logs[0][1]@
// ログ-記録---表示
// & コンポーネント-追加---設定
func show_logs_top()
var logs = [[iLs,iLt],[iRs,iRt]
,[foe.state,foe.time],[foe.id,foe.distance]
]
var logs_arr = [iL_state_time,iR_state_time
,f_state_time,f_id_dist
]
var topics = [
"Ls.Lt","Rs.Rt","Fs.Ft","Fid.Fd"
]
var x = [1,11,21,31]
var y = 1
var w = [11,11,11,30]
var row = 5
var color = [
// 0(ログ見出し
["#A867D5","#A867D5","#D85696","#D85696"]
// 1(キャンバス
,["#01001C","#00ff00"]
// 2(トピック
,["#E363BF","#733B7D"]
// (枠線
,["#9957C4"]
]
?loc.begin | loc.loop
// コンポーネント設定
set_base(panel_top
^ ,x[0],y,w[(w.Count()-1)]*2,row+2,top_left)
panel_top.visible = false
// 親設定
panel_top.Add(canvas_purple_1)
panel_top.Add(canvas_purple_2)
set_base_canvas(canvas_purple_1
^ ,panel_top,"add",color[1][0])
set_base_canvas(canvas_purple_2
^ ,panel_top,"subtract",color[1][1])
// ログクリア
for i = 0..logs_arr.Count()-1
logs_arr[i].Clear()
for i = 0..logs_arr.Count()-1
write_logs(logs_arr[i]
^ ,[logs[i][0],logs[i][1]],row)
show_logs(logs_arr[i],topics[i],x[i]+2,y
^ ,color[0][i],color[2][1],color[2][0])
draw.Box(x[i],y,w[i],row+2
^ ,color[2][0],style_02)
?loc.begin | loc.loop
// 青紫キャンバスカラー変更
var panel_top = ui.AddPanel()
var canvas_purple_1 = ui.AddCanvas()
var canvas_purple_2 = ui.AddCanvas()
?info_visibility
show_logs_top()
:
panel_top.visible = false
ログ書き込み修正
値が何もない(?)時に上書きされる問題を修正/.:°+╰( ˘ω˘ )╯;。:*\これできっと平気だよねっ
// [] = 0 | [[]] = 1
var a = []
// ログ記録
func write_logs(arr,ins_val,max_row)
?arr.Count()
arr.Insert(0,ins_val)
?arr.Count() = 0
arr.Add(ins_val)
?arr.Count() > 1 & (arr[0][0] = arr[1][0])
arr.RemoveAt(1)
?arr.Count() > max_row
arr.RemoveAt(max_row)
// 確認用_ログ記録表示
func confirm_logs(arr)
?arr.Count()
for i = 0..arr.Count()-1
>`1,1,arr.Count() = @arr.Count()@
>`2,@i+2@,[@i@] @arr[i][0]@.@arr[i][1]@
?loc.begin | loc.loop
a.Clear()
// write_logs(arr,ins_val,max_row)
write_logs(a,[foe.id,foe.distance],10)
// confirm_logs(arr)
confirm_logs(a)
コンポーネントの枠線を色々変えてみる

▼ コンポーネントの枠線色々
var style_01 = ui.AddStyle("#_#(#)#¯#")
var style_02 = ui.AddStyle("#_#[#]#¯#")
var style_03 = ui.AddStyle("◘≡◘┊#┊◘≡◘")
var style_04 = ui.AddStyle("*•*┊#┊*•*")
var style_05 = ui.AddStyle("⁄⁄⁄┊#┊⁄⁄⁄")
var style_06 = ui.AddStyle("⁄⁄⁄⁄#⁄⁄⁄⁄")
var style_07 = ui.AddStyle("☼〜☼┊#┊☼〜☼")
var style_08 = ui.AddStyle("╥–╥║#║╨–╨")
var style_09 = ui.AddStyle("╥÷╥┊#┊╨÷╨")
var style_10 = ui.AddStyle("×××┊#┊×××")
var style_11 = ui.AddStyle("₪₪₪┊#┊₪₪₪")
var style_12 = ui.AddStyle("╔═╗⏹#⏹╚═╝")
▼ パネルオブジェクトの枠線を変えてみる
?loc.begin | loc.loop
var panel = ui.AddPanel()
// パネル枠線確認(花っぽい)
panel.style = ui.AddStyle("☼〜☼┊#┊☼〜☼")
▼ Styleをvarにいれて使ってみる
var custom_style = ui.AddStyle("☼〜☼┊#┊☼〜☼")
?loc.begin | loc.loop
var panel = ui.AddPanel()
// パネル枠線確認(花っぽい)
panel.style = custom_style
▼ 敵情報をパネルに表示してみる(表示のガタつきに目を瞑りつつ)
var panel
var text
var custom_style = ui.AddStyle("
^⁄⁄⁄
^┊#┊
^⁄⁄⁄
^")
// オブジェクト基本設定_パーツ
func set_base(name,x,y,w,h,doc_anc)
name.x = x
name.y = y
name.w = w
name.h = h
name.dock = doc_anc
name.anchor = doc_anc
?loc.begin | loc.loop
// オブジェクト追加 /////
panel = ui.AddPanel()
text = ui.AddText()
// オブジェクト設定 /////
panel.style = custom_style
panel.visible = false
text.x = 0
text.y = 1
// 親設定 ///////////////
panel.Add(text)
?foe
// オブジェクト設定 /////
// 親パネル
set_base(panel,0,1,20,text.h,left_top)
panel.visible = true
// 子テキスト
text.w = panel.w - 4
text.h = text.lines.Count() + 2
text.text = foe
:
panel.visible = false
スキル発動中に台詞を追加してみる
>で表示させる情報は停止系の処理が挟まれると表示が消える(見えない?)ので、テキストオブジェクトを置いてみまする
追記: t.w,t.h(幅,高さ)プロパティ追加
というか >`の画面表示はオブジェクトより表示の優先順位高いから、一時的に優先順位下がってるだけなのかな
▼ blade発動中に"台詞表示確認...etc"表示
?loc.begin | loc.loop
// オブジェクト追加
var p = ui.AddPanel()
var t = ui.AddText("[color=#red]台詞表示確認\nああああああああああ\n[/color]いいいいいいいいいい")
// オブジェクト設定
p.visible = false
t.w = string.Size(t.text)
t.h = t.lines.Count()
// 親子設定
p.Add(t)
// オブジェクト設定_可視性変更
?foe.distance <= 16
^& item.GetCooldown("blade") <= 0
t.visible = true
:
t.visible = false
// 以降テキスト表示確認
?foe.distance <= 16
^& item.GetCooldown("blade") <= 0
equip blade
activate R
:
equipL triskelion
equipR star
オブジェクトの種類(Panel,Text,Button...etc)によってウィンドウサイズのデフォルト値は異なるので、テキストの表示位置や幅はプロパティをいじる✍️👶
台詞の位置調整は相対座標("親.x = x",親.y = y")に
var x var y x = screen.FromWorldX(pos.x) y = screen.FromWorldZ(pos.z - pos.y)
あたりをつかう…のだと思う
絶対座標を使いたい場合はxxx.absoluteXxxx.absoluteY
テキスト幅はテキストオブジェクトのプロパティでいじるんだね✍️情報アリガタイー
プレイヤー/敵のバフ/デバフ数をintで取得
おべんり╰(ˇωˇ )╯;。:*保存
関数に少し付け足してしまったけど
バフデバフの記号表示可愛いからさ(:3 _ )=
▼ プレイヤーのバフ取得で使ってみる
var buff_arr
buff_arr = string.Split(buffs.string,",",":")
var smite_i = []
var pickp_i = []
smite_i = extract_arr(buff_arr,"smite")
pickp_i = extract_arr(buff_arr,"pick_pocket")
// バフ/ デバフ取得
func extract_arr(arr,name)
var index
?arr.Contains(name)
index = arr.IndexOf(name)
return [arr[index - 1]
^, int.Parse(arr[index + 1])
^, int.Parse(arr[index + 2])]
return ["",0,0]
// カウントテスト
?smite_i[1] > 10
>`1,1,smiteが11以上になった
?pickp_i[1] = 5
>`1,2,pick_pocketが5になった
// 表示テスト
>o-3,-4,@smite_i[0]@ @smite_i[1]@.@smite_i[2]@
>o-3,-5,@pickp_i[0]@ @pickp_i[1]@.@pickp_i[2]@
1つのボタンに複数の役割を持たせる
ミントさんとポティさんの会話を見つつ
イベント終わってから色々試してみよう
(って何回も思ってるはずなんですけど!!)
イベント全然進んでにゃい🦥*̣̩⋆フェーン
▼ "退出"と"ログ非表示"⇔"ログ表示" 切り替えボタン
var parent_btn
var loc_leave
var info
// 雛形_パネル設定
func set_panel(name,x,y,w,h,doc_anc)
name.x = x
name.y = y
name.w = w
name.h = h
name.dock = doc_anc
name.anchor = doc_anc
name.style = -1
name.visible = false
// 雛形_ボタン設定
func set_button(name,x,doc_anc,txt)
name.x = x
name.y = 0
name.h = parent_btn.h
name.w = string.Size(txt) + 4
name.dock = doc_anc
name.anchor = doc_anc
name.style = -3
name.text = txt
name.visible = true
name.SetPressed(push)
// 工程_ボタン設定
func process_set_property()
var x = 0
var add = 1
// 親パネル
set_panel(parent_btn,1,6,20,3,left_top)
// 退出
set_button(loc_leave,x,left_top,"退出")
x += loc_leave.w + add
// ログ表示/非表示
set_button(info,x,left_top,"ログ非表示")
// 雛形_ボタン幅/テキスト変更
func change_set_button(name,txt)
name.text = txt
name.w = string.Size(txt) + 4
var visible_info = false
// ボタン押下分岐
func push(btn)
?btn = loc_leave
loc.leave()
>ボタン1が押されました
:?btn = info & !visible_info
visible_info = true
change_set_button(info,"ログ表示")
>ボタン2が押されました
:?btn = info & visible_info
visible_info = false
change_set_button(info,"ログ非表示")
>ボタン3が押されました
?loc.begin | loc.loop
// パネル/ボタン追加
parent_btn = ui.AddPanel()
loc_leave = ui.AddButton()
info = ui.AddButton()
// パネル/ボタン設定
process_set_property()
// ボタンの親設定
parent_btn.Add(loc_leave)
parent_btn.Add(info)
// 表示切り替えテスト
?visible_info
>`1,1,フレーム = @totaltime@
>`1,2,ログ表示 = @visible_info@
if文でreturn
2画面ブレードでの使用例
ifの後にreturn書くだけのがスクリプトがちょこちょこあったけど、なんとなく意味がわかった👶
スクリーン指定の方は例の使用法だと動かないので、returnをBlade()に置換
真偽判定ちゃんとしておけばifの後にreturn書くだけでも良いんだなぁ
func BladeAt(i)
return screen.i = i
^& foe.distance <= 16 & Blade()
var waitToBlade = 0
func Blade()
?item.GetCooldown("blade") <= 0
waitToBlade++
screen.Next()
?waitToBlade > 30
equip blade
activate R
screen.ResetOffset()
waitToBlade = 0
return true
return false
// 関数使用例1_敵の数指定:
?foe.count > 10 & Blade()
return
// 関数使用例2_スクリーン指定:
?BladeAt(2)
Blade()
スライド表示
GIF変換ミスってアス比がおかしな事になってお〜るよ
,
(👀 )

var test_0 = 0.0
var test_1 = 0.0
var test_2 = 0.0
var test_3 = 0.0
var test_4 = 0.0
var floor_i = math.FloorToInt
var lerp = math.Lerp
?key = "Begin"
test_0 = 0.0
test_1 = 0.0
test_2 = 0.0
test_3 = 0.0
test_4 = 0.0
test_0 = lerp(test_0,screen.w*0.2,0.2)
test_1 = lerp(test_1,screen.w*0.4,0.2)
test_2 = lerp(test_2,screen.w*0.6,0.2)
test_3 = lerp(test_3,screen.w*0.8,0.2)
test_4 = lerp(test_4,screen.w*1.0,0.2)
>`@floor_i(test_0)@,1,#ff0000,@test_0@\n█
>`@floor_i(test_1)@,3,#00ff00,@test_1@\n█
>`@floor_i(test_2)@,5,#0000ff,@test_2@\n█
>`@floor_i(test_3)@,7,#ffff00,@test_3@\n█
>`@floor_i(test_4)@,9,#00ffff,@test_4@\n█
特定の条件でキャンバス追加(多重追加)
returnすればui.Addxxx()とプロパティを同時に定義出来たんだね…シラナカッタヨ👉🏻👈🏻ツムツム
(いつもヒントありがとだっぴ)
こういう事ではないかもしれないけど!!!()
func change_display_color(FGBG,blend,color)
var filter
filter = ui.AddCanvas()
filter.w = screen.w
filter.h = screen.h
filter.blend = blend
?FGBG = FG
filter.SetFG(color)
?FGBG = BG
filter.SetBG(color)
return filter
// 30フレーム毎にキャンバス追加
?time%30 = 0
change_display_color(FG,"add","#220011")
>FGフィルター追加〜
/* BGお試し版 ******************
FG,BGの同時適用とFG,BGを個別で適用する機会を儲けた方がFGとBGの関係が見えやすい…🦆フォン
?time%30 = 0
change_display_color(BG,"add","#220011")
>BGフィルター追加〜
******************************/
スクリプトでマスクを発動しよう
というクエストが出た
.:° 🌾🌾╰(ˇωˇ )╯🌾🌾;。:*
発動したらすぐ帰るのだ
?item.CanActivate() equipR mask activate R
配列の要素を画面の高さ分追加(それ以上は追加しない)
戦闘スクリプトォ?(・∀・`)シラヌヨ
▼ 画面左上に縦書きで"0 False" "1 False"...
var arr = [] // arrの要素1以上 // かつarrの要素数が画面の高さ未満 ?arr.Count() > 0 ^& arr.Count() < screen.h arr.Insert(0,false) :?arr.Count() = 0 arr.Add(false) for i = 0..arr.Count()-1 >`1,@i@,@i@ @arr[i]@ >`20,1,@arr.Count()@
特段見出しなしでシレッと動画を混ぜ込む おもちろい
▼ 再生リスト
スキル分岐
色々書いておかないと忘れちゃう
func can_sp_atk(dist,itemGC,itemR)
return foe.distance <= dist & foe.hp > 0
^& item.GetCooldown(itemGC) <= 0
^& item.CanActivate()
^|(item.right = itemR
^& item.right.state = 2)
func act(item)
equip @item@
activate R
func test()
?can_sp_atk(16,"hammer","heavy_hammer")
act("heavy_hammer")
return 1
:?can_sp_atk(10,"bardiche","bardiche")
act("bardiche")
return 2
:?can_sp_atk(16,"mask","mask")
act("mask")
return 3
:
return 0
// 判定テスト
>`1,1,ascii
hammer @can_sp_atk(16,"hammer",heavy_hammer)@
bardiche @can_sp_atk(10,"bardiche",bardiche)@
mask @can_sp_atk(16,"mask",mask)@
asciiend
>`1,5,#yellow,test @test()@
test()の使い道
True判定
?test()
?test() = 1〜3
?test() = true
False判定
:?(else if)
:(else)
?!test()
?test() = 0
?test() = false
!はクリアタイムを気にするならあまり使わないようにする…(👀 )
円を描く演算いじいじ
novaSwirl / novaSwirl.txt
written: Henry Thompson
↑ 演算の値を変えて挙動を変えてみ〜る
圧縮したGIFで見るとカクカクだぁ(•︠ˍ•︡)
imgur: なめらか版リンク
ビデオ → GIF変換

サイズ大きいGIFが貼れなひ
配列とtime関連の認識改め
discordの日本語チャンネルを見るとtime関連の話題が目に入った
timeとtotaltimeが1の時にloc.beginなんだね!
スクリプト共有スレッドもよきよき
…マニュアル直すのは気が向いたらဗီူメンドクチャイ…
item.xxx.timeは停止でフレームに差が出るのか〜
ほぇ〜👶
ていうか配列の書き換え方法とか色々知れて良かったε( c 'ω')モヤモヤが少し消えた
▼ "Poison","Vigor"と"",""が交互に表示
var arr = [[]]
func write_arr(itemLR)
arr[0] = itemLR
return arr
?time%30 <= 16
write_arr([Poison,Vigor])
:
arr[0] = ["",""]
>`1,1,ascii
Count() @arr.Count()@
arr[0][0] @arr[0][0]@
arr[0][1] @arr[0][1]@
asciiend
フレーム差確認
手動で停止すると差が出ない時もあった(内部的なものはちらぬ)
loc.Pause() >`1,1,ascii loc.begin @loc.begin@ time @time@ totaltime @totaltime@ Rs:Rt @item.right.state@:@item.right.time@ asciiend
指定地点に近付くほど減速
var n = 0.0
var ceil_i = math.CeilToInt
?key = Begin
n = 0.0
n = math.Lerp(n,screen.w-1,0.02)
// 画面表示
>`@ceil_i(n)@,1,#FE1F6D,▄
>`1,2,ascii
key#=#@key@
n###=#@n@
asciiend
string.Formatで右寄せ左寄せ
https://learn.microsoft.com/ja-jp/dotnet/api/system.string.format?view=net-5.0 string.Format
// {0,10} -> {要素位置的なもの?,文字幅}
// {0,10} 右寄せ(正) / {0,-10} 左寄せ(負)
// {0,x} x文字を超える場合、優先フィールドの幅は無視
var str = "{0,10}{1,10}\n{2,-10}{3,-10}"
var result = string.Format(
^ str
^,player.name// ->
^,player.name// ->
^,player.name// <-
^,player.name// <-
^)
>@result@
ブックマークレット
javascript:(function()%20%7B%20%20%20%20%20var%20urls%20=%20%5B%5D;%20%20%20%20%20var%20links%20=%20document.getElementsByTagName('a');%20%20%20%20%20for%20(var%20i%20=%200;%20i%20%3C%20links.length;%20i++)%20%7B%20%20%20%20%20%20%20%20%20var%20link%20=%20links%5Bi%5D;%20%20%20%20%20%20%20%20%20var%20href%20=%20link.getAttribute('href');%20%20%20%20%20%20%20%20%20if%20(href%20&&%20href.startsWith('http'))%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20urls.push(href);%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%7D%20%20%20%20%20%20var%20newWindow%20=%20window.open();%20%20%20%20%20newWindow.document.write('%3Chtml%3E%3Chead%3E%3Ctitle%3EURL一覧%3C/title%3E%3C/head%3E%3Cbody%3E');%20%20%20%20%20newWindow.document.write('%3Ch1%3EURL一覧%3C/h1%3E');%20%20%20%20%20newWindow.document.write('%3Cul%3E');%20%20%20%20%20urls.forEach(function(url)%20%7B%20%20%20%20%20%20%20%20%20newWindow.document.write('%3Cli%3E%3Ca%20href=%22'%20+%20url%20+%20'%22%3E'%20+%20url%20+%20'%3C/a%3E%3C/li%3E');%20%20%20%20%20%7D);%20%20%20%20%20newWindow.document.write('%3C/ul%3E');%20%20%20%20%20newWindow.document.write('%3C/body%3E%3C/html%3E');%20%7D)();
▼ 公式manualでブックマークレットを使用した画面(iPhone)

どこで拾ったかは忘れたよ
html編集で使いまみた 情報検索としても
【Web制作の効率UP】時短になるブックマークレット一覧と作り方 - もぐもぐ食べるおいしいWebデザイン。 - もぐでざ
配列の概念

フィルター検索というか
階層みたいだね
画像の図はフォルダで表すと上下逆なんだけれども
三次元配列 スクリプト
画面左上に縦書きで"あ" "い" "う"..."D"
var a = [
[// 0
["あ","い"],
["う","え"]
],
[// 1
["A","B"],
["C","D"]
]
]
>`1,1,@a[0][0][0]@
>`1,2,@a[0][0][1]@
>`1,3,@a[0][1][0]@
>`1,4,@a[0][1][1]@
>`1,5,@a[1][0][0]@
>`1,6,@a[1][0][1]@
>`1,7,@a[1][1][0]@
>`1,8,@a[1][1][1]@
四次元配列 スクリプト
画面左上に縦書きで"あ" "い" "う"..."D"
var a = [
[// 0
[["あ"],["い"]],
[["う"],["え"]]
],
[// 1
[["A"],["B"]],
[["C"],["D"]]
]
]
>`1,1,@a[0][0][0][0]@
>`1,2,@a[0][0][1][0]@
>`1,3,@a[0][1][0][0]@
>`1,4,@a[0][1][1][0]@
>`1,5,@a[1][0][0][0]@
>`1,6,@a[1][0][1][0]@
>`1,7,@a[1][1][0][0]@
>`1,8,@a[1][1][1][0]@
this.でグローバル変数呼び出し
▼ "1" → "2" → "1" ...
var a = 2
func A()
var a = 1
?time%30 <= 16
return a
return this.a
>@A()@
varの一時的なデッドゾーン
一時的なデッドゾーン (TDZ) let または const 変数は、ブロックの始まりからコードが実行されて変数が宣言され初期化される行に到達するまでは、「一時的なデッドゾーン」(TDZ) 内にあると言います。
Stonescriptだとvarがこれに該当しまつね
JavaScriptではこういう仕様が元々letとconstにあるんだ。知らなかった!(読むとクークー寝るからね)
string.Breakとstring.Splitで沼にハマりまくったなぁ
プログラミング講座を見るとやっぱり眠くなってしまうので、あまり見れない
4次元配列を試す
4次元配列を試してみようと思い、コピペさせていただきまんした୧⍢⃝୨
多次元配列のイメージ。4次元以降がわからなかったのでメモ。 - CRAFT TIME
何次元まで利用可能かは知りませぬが
ていうか、Stonescriptではconstがvar扱いなんですかね
const a = 0 ?time%30 = 0 a += 1 >`1,1,@a@ // aくん どんどん増えるじゃん
constの説明少し見ただけだから理解が違うかもしれないけど
1本の棒を伝えるだけの伝達ゲーム。総人数500人
人を介する度に線は歪む
ふと思い出した 多分また何年か後に見たくなる
ただのブクマなのだ🦌⸝⋆
Lambdaにもう一度触れてみる
2024/01/14
戦闘のスクリプトをどうしていくか 未だに悩む
書くのをやめるか(え``)書くか
パターンを色々見たり、書いてみたり
色々分からないことだらけで、実現に必要な事がいまいち掴めない
追記: 今回のacceptは全く必要がないじゃあないか!!いい加減にしろ!!
全ての判定を1箇所に帰結させて承認する役がほしい
集結すると長くなる うーん 短くするにはどうしたらいいんだろう?
func act(item,LR)
?LR = L
equipL @item@
activate L
?LR = R
equip @item@
activate R
func can_sp_atk(dist,itemGC,itemR)
return foe.distance <= dist
^& item.GetCooldown(itemGC) <= 0
^& item.CanActivate()
^|(item.right = itemR
^& item.right.state = 2)
func exec_sp_atk()
// エラー吐かないようにacceptこっちに持ってきた
// can_sp_atkに置いてエラーを吐いておったそうな
// コメントもなおちた
var accept = func(a,b,c,d)
return a(b,c,d)
// (can_sp_atk,dist,itemGC,itemR)
?accept(can_sp_atk,16,"hammer",heavy_hammer)
act("heavy_hammer",R)
return true
:?accept(can_sp_atk,10,"bardiche",bardiche)
act("bardiche",R)
return true
:?accept(can_sp_atk,16,"mask",mask)
act("mask",R)
return true
:
return false
>SP ATK @exec_sp_atk()@
uiのCanvasが難しい
dockは親に対してくっつける位置
anchorはdockに対してくっつける位置
とか説明見て思ってたけど〜なんかおかしいから違うんだろうな それとも、なにか見落としているか
dock,anchorだけで相対的な位置を指定したいけど、
anchor設定で親の外側へ配置すると、どうも上手くいかない
子の数が少なければ問題ないけれどみょ
panelはclipでどうにかなるそうな気もする
パネルを親にすればいいのかな?もはや試す気力はないのである
こういう使い方をしたいんじゃないんだよなん👶
そもそも今回は親設定してませんが…設定しようとするとエラーでる
var ceil_i = math.CeilToInt var canvas_blend = [ "opaque" // 0 不透明 ,"multiply" // 1 乗算 ,"divide" // 2 除算 ,"add" // 3 加算 ,"subtract" // 4 減算 ] var color = [// #rrggbb 16進数 0〜9,a〜f "#111111" // 0 ,"#777777" // 1 ,"#dddddd" // 2 ,"#red" // 3 ,"#green" // 4 ,"#blue" // 5 ,"#yellow" // 6 ,"#cyan" // 7 ,"#blue" // 8 ,"#magenta" // 9 ] var canvas1 var canvas2 var canvas3 var canvas4 var canvas5 func change_screenColor(name, doc,anc,x,w,blend,color) name.dock = doc name.anchor = anc name.x = x name.w = w name.h = ceil_i((screen.h/10)*3) name.blend = blend name.SetBG(color) name.SetFG(color) name.visible = true ?loc.begin | loc.loop // キャンバス追加 canvas1 = ui.AddCanvas() canvas2 = ui.AddCanvas() canvas3 = ui.AddCanvas() canvas4 = ui.AddCanvas() canvas5 = ui.AddCanvas() // キャンバスプロパティ // キャンバス1のblendを変更で他のCanvasに影響する(キャンバス1の幅がscreen.wだから) // (name,doc,anc,x,w,blend,BG,FG) // キャンバス1 change_screenColor(canvas1 ^,left_center,left_center ^,0,screen.w ^,canvas_blend[0],color[6]) // キャンバス2 change_screenColor(canvas2 ^,left_center,right_center ^,(screen.w/5)*2,screen.w/5 ^,canvas_blend[1],color[6]) // キャンバス3 change_screenColor(canvas3 ^,left_center,right_center ^,(screen.w/5)*3,screen.w/5 ^,canvas_blend[2],color[6]) // キャンバス4 change_screenColor(canvas4 ^,left_center,right_center ^,(screen.w/5)*4,screen.w/5 ^,canvas_blend[3],color[6]) // キャンバス5 change_screenColor(canvas5 ^,left_center,right_center ^,(screen.w/5)*5,screen.w/5 ^,canvas_blend[4],color[6]) // 各blendモード表示 >`@canvas1.absoluteX+5@,10,opaque >`@canvas2.absoluteX+5@,10,multiply >`@canvas3.absoluteX+5@,10,divide >`@canvas4.absoluteX+5@,10,add >`@canvas5.absoluteX+5@,10,subtract
FPS表示その2
var oldtime = 0 var newtime newtime = time.msbn newtime.Sub(oldtime) >@newtime.ToString()@ oldtime = time.msbn //code here
指定座標へアニメーション表示
引用元 discord: ket.6226
rateの数字を小さくするとアニメーション切り替えが速くなる
var asciiart = [ascii > asciiend,ascii #> asciiend,ascii ##> asciiend,ascii ###> asciiend] var framecount = asciiart.Count() //how much to divide time with, slows animation var rate = 2 //calculate what frame to show at current time var currentframe currentframe = (time/rate)%framecount //display current frame relative to player >o-2,-2,@asciiart[currentframe]@
hpとアーマー値を合わせる
2024/01/06
アーマーの小数点以下も合わせて合算。
どこかの条件で使う予定があったような気がするような…しないような
var hp_arm hp_arm = hp+armor+armor.f*0.1 >@hp_arm@
処理の使い分け
できたらいいな👶
1
var y = 1 ?time%30 <= 16 >`1,@y@,@["僕は要素位置0","私は要素位置1"][0]@ : >`1,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
2
var y = 1 ?time%30 <= 16 >`0,@y@,@["僕は要素位置0","私は要素位置1"][0]@ >`0,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
3
var y = 1 ?time%30 <= 16 >`0,@y@,@["僕は要素位置0","私は要素位置1"][0]@ >`0,@y+1@,@["僕は要素位置0","私は要素位置1"][1]@
実行関数を関数で判定
引用元 discord: fruloo
翻訳機: それを数値にする必要があるため、ブール値を0または1に変換する必要がありますが、それ以外は機能します
var test = true
func btoi(x)
?x
return 1
return 0
func foo()
>`10,10,"hello"
func bar()
>`10,10,"goodbye"
[foo,bar][btoi(test)]()
ふむ👶なんだか面白い書き方
"[配列1][配列2]()"
配列1に実行関数
配列2に実行関数選択の関数
配列2が配列1の実行位置(要素位置)を指定してるっぽい
()つければ実行してくれるのかな
変数testは?xのreturn 1をtrue判定にする為に必要
return 0は配列1の要素位置0へnullまたはfalse
またはその他の判定、もしくは判定直入れでよさそう
とりあえずotherという関数を作ってみる。
▼ 例に当てはめてステージ選択をしてみる
var run = true
func select_loc(run)
?run = loc.isQuest
return 1
:?run = (loc = "rocky_plateau")
return 2
:?run = (loc = "deadwood_valley")
return 3
:?run = (loc = "caustic_caves")
return 4
:?run = (loc = "Deadwood Waterfall")
return 5
:?run = (loc = "fungus_forest")
return 6
:?run = (loc = "uulaa_shop")
return 7
:?run = (loc = "tid_crypt_0")
return 8
:?run = (loc = "Haunted Halls")
return 9
:?run = (loc = "cross_deadwood_river")
return 10
:?run = (loc = "bronze_mine")
return 11
:?run = (loc = "icy_ridge")
return 12
:?run = (loc = "cross_bridge")
return 13
:?run = (loc = "temple")
return 14
return 0
func other()
>`10,10,"other"
func quest()
>`10,10,"quest"
func rocky_plateau()
>`10,10,"rocky_plateau"
func deadwood_valley()
>`10,10,"deadwood_valley"
func caustic_caves()
>`10,10,"caustic_caves"
func deadwood_waterfall()
>`10,10,"Deadwood Waterfall"
func fungus_forest()
>`10,10,"fungus_forest"
func uulaa_shop()
>`10,10,"uulaa_shop"
func haunted_gate()
>`10,10,"tid_crypt_0"
func haunted_halls()
>`10,10,"Haunted Halls"
func cross_deadwood_river()
>`10,10,"cross_deadwood_river"
func bronze_mine()
>`10,10,"bronze_mine"
func icy_ridge()
>`10,10,"icy_ridge"
func cross_bridge()
>`10,10,"cross_bridge"
func temple()
>`10,10,"temple"
[other
,quest
,rocky_plateau
,deadwood_valley
,caustic_caves
,deadwood_waterfall
,fungus_forest
,uulaa_shop
,haunted_gate
,haunted_halls
,cross_deadwood_river
,bronze_mine
,icy_ridge
,cross_bridge
,temple][select_loc(run)]()
このスクリプトを使うかどうかはシラヌケド( ◔‿ゝ◔) loc判定をしたら関数()をそのままぶち込みたくなるけど、他の場面若しくはなにかしらの理由で使うかもしれない 色んなやり方を知りたいな 今は戦闘スクリプトを書き直してる
ラムダ式(Lambda)
2024/01/02
引用元 discord: fruloo
画面表示の`を追加
無名関数(匿名関数)
var squareFn = func(x) return x*x func apply(fn, arg) return fn(arg) >`1,7,apply(squareFn, 5) = @apply(squareFn, 5)@
Stone Story RPGの知識階級
2024/01/02
あけおめす
引用元 discord: a_lol0273
面白かったので保存。この氷塊はダークウェブを説明する時によく用いられますね

コネコネタイム
スクリプトの書き方を展開・模索する為に
様々な考え方を受容しなければ 思考はトマト...
というわけで forっぽい代替を描き留めてオキュ
ほや...?
こうだっ けども120の順だからなん
式をどうにかすればいいのでつか
いや、0はloc.beginにとられてるからいいのかな?
var arr = ["a","b","c"] >@arr[time%3]@
親コンポーネント設定
12/20
スクリプトれんしうのお題
soundプレイヤー(SSRでは効果音)
必要そうな機能は実験出来たので、UIだけ先にちまちま作ってる

12/19
親コンポーネントを設定し、anchorとdockで子の位置を相対的にしゅる👶

期待通りになったら親(container)の可視性をfalse、子の可視性をtrueに変更container_btn.visible = false
var container_btn var btn1 var btn2 var btn3 // ボタンプロパティ雛形 func set_btn(name,w,anc,dock,txt) name.w = w name.h = container_btn.h name.anchor = anc name.dock = dock name.style = -3 name.text = txt ?loc.begin // パネル追加 container_btn = ui.AddPanel() // ボタン追加 btn1 = ui.AddButton() btn2 = ui.AddButton() btn3 = ui.AddButton() // ボタンの親設定 container_btn.Add(btn1) container_btn.Add(btn2) container_btn.Add(btn3) // パネルプロパティ container_btn.w = screen.w/3 container_btn.h = 3 container_btn.anchor = center_center container_btn.dock = center_center container_btn.style = -1 // ボタンプロパティ // (name,w,anc,dock,txt) set_btn(btn1,1+4,left_center,left_center,"左") set_btn(btn2,2+4,center_top,top_center,"中央") set_btn(btn3,1+4,right_center,right_center,"右")
敵のchill数だけ数字として取り出す
2023/12/08
fds_chill_intにchill数をいれたのだ chill数が同期しない時もあるかもしれない
気付いたらシレッと修正する
var fds_arr
var fds_chill_get
var fds_chill_arr
var fds_chill_int
fds_chill_int = 0
?foe.debuffs.string
fds_arr = string.Split(foe.debuffs.string,",")
for v : fds_arr
?v = "debuff_chill"
fds_chill_get = v
fds_chill_arr = string.Split(fds_chill_get,":")
fds_chill_int = int.Parse(fds_chill_arr[2])
演算でプレイヤー周りに星をクルクル表示
novaSwirl /
novaSwirl.txt
written: _smallbear

あとで見る
アニメーション表示
とても楽しげな画面(discord要ログイン)を見たのでアニメーション系を試してみる
Anim > Componentをお試し
Manualのanim.Play()でスクリプト例が誤って出力されていたので修正
修正したので一応試してみる
グラフィックアート文字作成ツール
"枯木の滝"でグラフィックアート(文字)表示
>@totaltime@
var test
?loc = waterfall
// ステージ開始直後のバナー表示を消す
disable hud b
test = ui.AddAnim(ascii
▄▄▄█████▓
▓##██▒#▓▒
▒#▓██░#▒░
░#▓██▓#░#
##▒██▒#░#
##▒#░░###
####░####
##░######
%%
▄▄▄█████▓▓█████#
▓##██▒#▓▒▓█###▀#
▒#▓██░#▒░▒███###
░#▓██▓#░#▒▓█##▄#
##▒██▒#░#░▒████▒
##▒#░░###░░#▒░#░
####░#####░#░##░
##░#########░###
############░##░
%%
▄▄▄█████▓▓█████###██████#
▓##██▒#▓▒▓█###▀#▒██####▒#
▒#▓██░#▒░▒███###░#▓██▄###
░#▓██▓#░#▒▓█##▄###▒###██▒
##▒██▒#░#░▒████▒▒██████▒▒
##▒#░░###░░#▒░#░▒#▒▓▒#▒#░
####░#####░#░##░░#░▒##░#░
##░#########░###░##░##░##
############░##░######░##
%%
▄▄▄█████▓▓█████###██████#▄▄▄█████▓
▓##██▒#▓▒▓█###▀#▒██####▒#▓##██▒#▓▒
▒#▓██░#▒░▒███###░#▓██▄###▒#▓██░#▒░
░#▓██▓#░#▒▓█##▄###▒###██▒░#▓██▓#░#
##▒██▒#░#░▒████▒▒██████▒▒##▒██▒#░#
##▒#░░###░░#▒░#░▒#▒▓▒#▒#░##▒#░░###
####░#####░#░##░░#░▒##░#░####░####
##░#########░###░##░##░####░######
############░##░######░###########
asciiend)
test.duration = 90
test.loop = false
test.Play()
anim.Play()のanimはアニメーションの変数を入れるところなんだね(仮)
varを書いてみる
2023/11/16
モンテスちゃん
やっとpython.jpを読みすすめたみたい
Python基礎の基礎 > 変数
"太郎くんは、一つ100円のももを5つ、一つ40円のみかんを8つ、80円のなしを5つ、60円のキウイを10、 90円のスイカを20、110円のかきを10買いました。全部でいくらになったでしょう?"momo = 100 * 5 mikan = 40 * 8 nashi = 80 * 5 kiwi = 60 * 10 suika = 90 * 20 kaki = 110 * 10 momo + mikan + nashi + kiwi + suika + kaki
Stonescriptに置き換え
var momo var mikan var nashi var kiwi var suika var kaki var sum momo = 100 * 5 mikan = 40 * 8 nashi = 80 * 5 kiwi = 60 * 10 suika = 90 * 20 kaki = 110 * 10 sum = momo + mikan + nashi + kiwi + suika + kaki >@sum@円
画面左上に"4720円"と表示されました。
Discordでvarについて質問したのが2023/10/17
varのマニュアルページを読むまで1ヶ月かかった
とんでもないやつですねぇ…?
今回の例題は毎秒書き換える必要はないので、アドバイス通り
var momo momo = 100 * 5
の形式にしました
使える文字(一部)
ASCII-art Tutorial
Fonts
- Mono-spaced
- 1:1 VS 1:2 (16:29)
- Courier, Verdana, FixedSys
- Custom font
Discord
テキストコピー
☆☺ʘ❤♦♣♠•◘⏹◙♂♀♪♫☼
▶◀À⚿œ§≠¿↑↓→←¯¡▲▼
!"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~´
ÇüéâäàåçêëèïîìÄÅ
ÉæÆôöòûùýÖÜ€£¥₩Á
áíóúñÑãõζηξλψέ«»
░▒▓│┤╡╢╖╕╣║╗╝╜╛┐
└┴┬├─┼╞╟╚╔╩╦╠═╬╧
╨╤╥╙╘╒╓╫╪┘┌█▄▀ρι
αβγπΣσμτΦΘΩδ∞φεω
≡±≥≤⌐¬÷≈°…·†☤∆❄┊
モバイル版でマインドストーンを途中で開く
key list
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を見てから実践
関数の定義と返値
BMI(ボディマス指数)の式を関数定義
BMIの求め方は[体重(kg)]÷[身長(m)の2乗]
▼ PythonでBMIの式を関数定義
def bmi(height, weight):
return weight / (height/100.0) ** 2
▼ Stonescriptに置き換え
func bmi(height, weight) return weight / math.Pow((height/100.0), 2) >`1,1,@bmi(170.0,77.0)@
画面左上に"26.6436"と表示
BMIの評価では肥満(1度)
横川尚隆さんの身長とオン体重(多分コンテスト中の事)を入力しました
Discordこの時もらった回答と同じ事だ〜👶(時が経つの早い)
BMIの体型評価云々についてはしょーりゃく
▼ べき乗の書き方
3 ** 2 // Pythonのべき乗 math.Pow(3, 2) // Stonescriptのべき乗
for (ループ)
·:·:· ループ ·:·:·についてみてゆく
今ループ処理(for)してるものはfoe改行表示とヒットダメージ表示
とりあえず、サンプルスクリプトを使用してみます
var min = 1 var max = 4 var sum sum = 0 for j = min..max sum = sum + j >sum = @sum@
画面左上に"sum = 10"と表示されたので
sum = sum + jは
"sum = 0+1+2+3+4"
の処理がされたとみなします
負の数へ進む事も出来る
var g g = "" for k = 5..-2 g = g + k >g = @g@
画面左上に"g = 543210-1-2"と表示されました
今回は文字列の結合をする為に変数gは""と宣言してるのかな?この変数は文字列として扱われます…的な
まぁまぁまぁ そういう事にしておきます👶
今回は文字列を結合した結果が返ってきたので、とりあえずそう捉えておきましゅよ
ループを入れ子にして複雑なアルゴリズムを形成
for x = 1..9
for y = x/2 .. x/2 + 6
>`@x@,@y@,*
画面左上に
*
***
*****
*******
*********
*********
*********
********
******
****
**
と表示されました👶ナナメノダイヤー
ループを早期に抜け出す
var n
n = ""
for i = 1..5
?i = 3
i = -1
n = n + i
>n = @n@
画面左上に"n = 12-1"と表示されました
iが3になるとiは-1されてしまうので
1+2+2+2…etcと延々と続く
そこでn = n + iを反復処理(4〜5行目)の範囲外に置いたんですね
変数nは文字列として認識されるので今回も文字の結合となり
n = "1"+"2"+"-1"
n = 12-1となったと👶タブンサァ
breakコマンドでループを抜ける
▼ breakコマンドを使用してループから抜け出す事も出来るようです
for i = 1..5
?i = 3
break
continueコマンドでスキップ
▼ continueコマンドでスキップ、ループが続行
var n
n = ""
for i = 1..5
?i = 3
continue
n = n + i
>n = @n@
画面左上に"n = 1245"と表示されました
?i = 3でcontinueコマンドを挿入した事により、3の処理がスキップされたようです
配列の要素をループ処理
var a = [1, 2, 3] var n n = "" for value : a n = n + value >n = @n@
画面左上に"n = 123"と表示されました
"for (ループ変数) : (配列)"にすれば配列を順に参照してくれるのかな👶
全てManualのサンプルスクリプトを貼付しただけですが、少し理解が深まったきがしゅるね
追記
apocryphic(discord)さんのスクリプトで同じ形式"for (ループ変数) : (配列)"があったので、試してみます
最後の2行は画面表示用に追加
var foephase
for i : string.Split(foe)
?i = phase
foephase = i
break
?foe
>@foephase@
ボス対峙で画面左上に"phase(数字)"と表示されました
この場合もfor (ループ変数) : (配列)の形式になってますね👶
func
returnはどんな時に使う?
2023/10/25
(funcのreturnって、どういうときに使うんですか?…👶)
回答1
うーん原理的には何か返してほしいとき、なんですけど
たとえばこんな感じに整数の乱数を作りたいときに、いくつまでを作るか、を関数に入れてやって、returnでその値を返してやると
func int_rnd(bins)
return math.FloorToInt(rngf*bins)
var rand=int_rnd(10)
とかすれば0-9の10種類のランダムな値が返ってくる!みたいな便利機能を作れる
funcってあるひとまとめの手続きをしてほしいってこともあるんですが、↑の例みたいに手続きの結果が欲しい!ってこともあるのでそういう時に便利です
回答2
funcに投げてreturnを使うと、コード全体が見やすくなる
★returnを使う場合
func isBossFight() return foe = boss func isGhost() return foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon() :?isBossFight() normalWeapon(bardiche,true) : normalWeapon(heavy,false)
★returnを使わない場合
//main ? foe = ghost | foe = large_ghost ghostWeapon() :? foe = boss normalWeapon(bardiche,true) : normalWeapon(heavy,false)
👶ghostがいる会館で実験
○ return有り
func ghostWeapon() loadout 1 func isGhost() return foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon()
× return無し(赤字エラー)
func ghostWeapon() loadout 1 func isGhost() foe = ghost | foe = large_ghost //main ? isGhost() ghostWeapon()
回答3
(今更になりますが)returnを使うのと使わないのでは主に汎用性が違います 下記の例では"ふたつの数字を足した数を画面に出力するもの"を書いてます
func Add(a,b) return a + b >@Add(3,5)@
func Add(c,d) >@c + d@ Add(3,5)
どちらも動作は同じですが
前者は画面に出力する以外の用途でも使えるのに対して、 (例えば
?foe.hp + foe.armor < 100
という条件を書きたい場合
?Add(foe.hp,foe.armor) < 100
のように使えます)後者は画面出力にしか使えない上に座標指定も出来ません
とにかくreturnはすごいです!!(語彙力)
returnの扱い
return true,false処理1
2023/10/26
discord
func castWisp()
? gc(fire_talisman) <= 0
^ | IR = "fire talisman" & IRS = 2 // required
eqL("tri")
eqR("fire talisman")
actR = 1
return 1
return
and then
// wisp
? summonCount = 0
? lo ! "deadwood"
? castWisp()
return 1
func castWisp()のreturn 1,returnはtrue,falseのような扱いですか?
? castWisp()にはtrue文を返すみたいな
回答
returnのみでfalse相当の何かが返されてますね
たぶん普通の言語で言うnullみたいなものが返されていて、空白文にした時と動作は違うみたいです
あと、普通の言語同様数字の0もfalseとして扱われているみたいです
言語的な仕様としてnullと同じかもわかりませんが、
長さ0の文字列""もfalseですね
長さ0の配列[]はtrueと…へぇ~…
return true,false処理2
2023/10/28
funcのreturn true,return falseの使用について
func TriStar()
equipL tri
equipR star
func Quarter()
?item.GetCooldown("quarterstaff") <= 0 &
^item.CanActivate() &
^harvest.distance > 7 &
^pickup.distance > 7
equip quarterstaff
activate R
return true
:
return false
func QuarterToTriStar()
?Quarter()
Quarter()
:
TriStar()
?loc.begin
new_stone = 0
QuarterToTriStar()
?loc = rocky
?loc.stars = 5
new_stone = res.stone - res_stone
?screen.i = 1 &
^harvest ! Boulder &
^pickup ! Stone
loc.leave()
:?pickup & pickup.distance <= 10
TriStar()
:?harvest.distance <= 6
?item.right.state = 3
equipR xi
equip shovel
:
QuarterToTriStar()
return true
return falseはこんな感じで使うのが標準的ですか?
冗長になってますか?
回答1
うーーーん、冗長な気がしてしまいます
?Quarter()を評価した時点で、もし条件を満たしていればequipもactivateもされてしまうので
func QuarterToTriStar()
?Quarter()
Quarter()
:
TriStar()
のifがtrueの場合のQuarterがいらないので、
func QuarterToTriStar()
?!Quarter()
TriStar()
で同様に作用すると思います
funcの定義でtrueは返される?
この場合、funcの定義でtrue結果は条件文に組み込まれてるようなものなのでしょうか?👀trueとfalse処理を理解してなすびです
回答2
funcの定義で、true時に恐らくしたい処理
equip quarterstaff
activate R
が条件を満たしたときには行われるようになっているため、何かで(→?Quarter()などで)Quarter()を呼び出すとすでに条件を満たすときにはこれが行われるようになってしまう、という感じです
解決
そういう事なんですね!!
だからifで組み込む場合は!(?!Quarter())を使用するんですね
わかりました!いつもありがとうございます🦉
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ログ表示
[[]](二重角括弧内)のスクリプトが表示されなかったので、半角スペースを挿入しました🐥⸒⸒一応そのまま使ってもエラーにはなりません
テキスト差分比較 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配置用にランダムカラー出力
イラストアプリで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, "▄")
すこしのストレスはひつようかも
2048 / 2048.txt
//2048
//written by ArtificialPotato
//v0.9
//
//Description: Stonescript implementation of 2048 by Gabriele Cirulli
ちまちまとやるものの、プレイ後半はミスに気をつけて集中力を保つ必要がありゅ

良い流れを断ち切ってしまい、一気にゲームオーバーへ

ちなみにこの時はトイレに行きました。
そのお陰でスッキリ爽快。
楽園にいるかのごとくα波を感じます。
そう。
リフレッシュしてしまったんです。
こんなに爽やかな気分じゃダメなんですきっと。
テスト
- Bestiary / Bestiary.zip
- Chisel_v0_3 / Chisel_v0_3.txt
- Firehead / Firehead.txt
- Mobile_Mindstone_Button / Mobile_Mindstone_Button.txt
- MiniMap / MiniMap.txt
- MindstoneButton / MindstoneButton.txt
- scottyEyeTracker / scottyEyeTracker.txt
- wisp / wisp.txt
Bestiary / Bestiary.zip
written: Incoherent_Toast
Incoherent_Toastによる敵図鑑
Chisel_v0_3 / Chisel_v0_3.txt
Firehead / Firehead.txt
written: electr0nic
Mobile_Mindstone_Button / Mobile_Mindstone_Button.txt
MiniMap / MiniMap.txt
MindstoneButton / MindstoneButton.txt
scottyEyeTracker / scottyEyeTracker.txt
written: MaxMinMedian
"呪いの門"で宝箱追跡。精度高いver
今の所100%
wisp / wisp.txt
written: Night
宝箱追跡も兼ね備えたペット




