ビルトイン関数

数値・算術

関数説明例
floor(n)切り捨てfloor(3.7) → 3
ceil(n)切り上げceil(3.2) → 4
round(n)四捨五入round(3.5) → 4
trunc(n)小数部を切り捨てtrunc(3.9) → 3
abs(n)絶対値abs(-5) → 5
min(a, b)小さい方min(3, 5) → 3
max(a, b)大きい方max(3, 5) → 5
min(arr) / max(arr)配列内の最小 / 最大(空配列は null)max([3, 9, 5]) → 9
clamp(n, lo, hi)範囲内に収めるclamp(15, 0, 10) → 10
sqrt(n)平方根sqrt(4) → 2
rand()ランダムな整数rand() % 6 → 0〜5
rand(lo, hi)lo 以上 hi 以下のランダムな整数(両端を含む。lo > hi なら入れ替え)rand(1, 6) → 1〜6
pow(a, b)べき乗pow(2, 10) → 1024
sign(n)符号(負なら -1、0なら 0、正なら 1)sign(-3) → -1
exp(n)eの累乗exp(1) → 2.71828...
ln(n)自然対数(0以下は null)ln(exp(2)) → 2
log10(n)常用対数(0以下は null)log10(1000) → 3
sum(arr)数値配列の合計(空配列は 0)sum([1, 2, 3]) → 6
PI()円周率(括弧が必要。PI だけでは値になりません)PI() → 3.14159...
to_rad(deg)度をラジアンに変換to_rad(180) → 3.14159...
to_deg(rad)ラジアンを度に変換to_deg(PI()) → 180
to_hex(n)16進数文字列に変換to_hex(255) → "ff"
to_hex(n, digits)桁数指定で16進数に変換to_hex(255, 4) → "00ff"

自然対数は ln です。log は対数ではなくデバッグ出力用の関数(制御・ユーティリティ)なので注意してください。

三角関数

関数説明
sin(n)サイン(ラジアン)
cos(n)コサイン(ラジアン)
tan(n)タンジェント(ラジアン)
asin(n)アークサイン
acos(n)アークコサイン
atan2(y, x)アークタンジェント

文字列

関数説明例
len(s)文字数len("こんにちは") → 5
contains(s, sub)部分文字列を含むかcontains("abcde", "bc") → true
starts_with(s, p)文字列で始まるかstarts_with("abc", "ab") → true
ends_with(s, p)文字列で終わるかends_with("abc", "bc") → true
replace(s, from, to)文字列を置換replace("abc", "b", "X") → "aXc"
split(s, sep)文字列を分割して配列にsplit("a,b,c", ",") → ["a","b","c"]
join(arr, sep)配列を結合して文字列にjoin(["a","b","c"], ",") → "a,b,c"
trim(s)前後の空白を除去trim(" abc ") → "abc"
substr(s, start, count)部分文字列を取得substr("abcde", 1, 3) → "bcd"
index_of(s, sub)部分文字列の位置index_of("abcde", "bc") → 1
count(s, sub)部分文字列の出現回数count("pineapple", "p") → 3
to_lower(s)小文字に変換to_lower("Pineapple") → "pineapple"
to_upper(s)大文字に変換to_upper("Pineapple") → "PINEAPPLE"
to_hankaku(s)全角の英数字・記号・スペース・カタカナを半角に変換(濁点は分解)to_hankaku("ABC123") → "ABC123"
to_zenkaku(s)半角の英数字・記号・スペース・カタカナを全角に変換(濁点は合成)to_zenkaku("ガギ abc") → "ガギ abc"
chr(n)文字コードから文字に変換chr(65) → "A"
to_str(n)数値を文字列に変換to_str(123) → "123"
to_num(s)文字列を数値に変換to_num("123") → 123
format(fmt,…)書式付き文字列に変換詳細

count contains starts_with ends_with は大文字・小文字を区別します。 大文字小文字を無視して比較したい場合は to_lower で統一してから使ってください。

// 大文字小文字を無視してカウントする例
let n = count(to_lower("Pineapple"), "p")
// n == 3

正規表現

関数説明
regex_match(s, pat)パターンに一致するか
regex_find(s, pat)最初に一致した文字列を返す
regex_captures(s, pat)キャプチャグループを配列で返す
regex_replace(s, pat, rep)パターンに一致した部分を置換
regex_split(s, pat)パターンで分割して配列に
OnBoot => {
    let s = "2026年1月1日"
    let caps = regex_captures(s, "(\d+)年(\d+)月(\d+)日")
    湊: ${caps[1]}年${caps[2]}月${caps[3]}日ですね。
}

湊の文字列リテラルの中では \ はそのまま1文字として扱われます。 正規表現の \d などは \\d ではなく \d と書いてください (\\d と書くと \ が2文字残り、意図したパターンに一致しません)。

配列

関数説明例
len(arr)要素数len([1,2,3]) → 3
first(arr)最初の要素first([1,2,3]) → 1
last(arr)最後の要素last([1,2,3]) → 3
push(arr, v)末尾に追加した新しい配列を返すpush([1,2], 3) → [1,2,3]
pop(arr)末尾を除いた新しい配列を返すpop([1,2,3]) → [1,2]
slice(arr, start, end)部分配列を返すslice([1,2,3,4], 1, 3) → [2,3]
index_of(arr, v)要素の位置index_of([1,2,3], 2) → 1
count(arr, v)要素の出現回数count([1,2,1], 1) → 2
sum(arr)数値配列の合計(空配列は 0)sum([1,2,3]) → 6
min(arr)最小の要素(空配列は null)min([3,1,2]) → 1
max(arr)最大の要素(空配列は null)max([3,1,2]) → 3
sort(arr)昇順にソートsort([10,9,2]) → [2,9,10]
sort(arr, "desc")降順にソートsort([10,9,2], "desc") → [10,9,2]
sort(arr, "kana")かな順にソートsort(["ばなな","イチゴ","かき","ぱいん","がむ"], "kana") → ["イチゴ","かき","がむ","ぱいん","ばなな"]
reverse(arr)逆順にした新しい配列を返すreverse([1,2,3]) → [3,2,1]
unique(arr)重複を除いた新しい配列を返すunique([1,2,1,3]) → [1,2,3]

push pop sort reverse unique は元の配列を変更しません。新しい配列を返します。配列以外を渡すと、sort reverse unique は空配列を返します。

sortのモード

第2引数で並べ方を選びます。

  • 省略、または "kana" "desc" 以外の文字列("asc" など)のときは昇順です。エラーにはなりません。
  • 昇順・降順では、数値同士は数値の大小で比べます。それ以外は文字列表示のコードポイント順で比べます(sort([10,9,2]) は [2,9,10] ですが、sort(["10","9","2"]) は ["10","2","9"] です)。
  • "kana" では、数値も文字列表示で比べます(sort([10,9], "kana") → [10,9])。
  • "desc" と "kana" は同時に指定できません。逆かな順は reverse(sort(arr, "kana")) と書きます。

かな順の基準

"kana" は、各要素の文字列表示を次のように読み替えたキーで、コードポイント順に並べます。

  • カタカナはひらがなとして比べます(イ=い)。
  • 濁音・半濁音は清音と同じ扱いです(が=か、ぱ=は)。
  • 小書き文字は大きい字と同じ扱いです(ゃ=や、っ=つ)。
  • 長音「ー」は「あ」として比べます。「らあめん」と「らーめん」は同じキーです。
  • キーが同じ項目は、元の並びのままです(安定ソート)。
  • 漢字は読みに変換されず、コードポイント順で並びます(sort(["柿","梨","あ"], "kana") → ["あ","柿","梨"])。
  • 「ゐ」「ゑ」「ヴ」「ヵ」「ヶ」は読み替えの対象外です。「ヴ」は「う」と同じ扱いにならず、ひらがなの後ろに並びます(sort(["ヴ","う","え"], "kana") → ["う","え","ヴ"])。

漢字まじりの項目を五十音順に並べる

漢字は読みに変換されないので、読みをキーにしたマップを作り、キーを "kana" で並べます。表示名は値に持たせます。

OnBoot => {
    // 読み → [表示名, 説明]
    let 一覧 = {
        "ふれいむ": ["フレイム", "炎を放つ魔法。"],
        "ばりあー": ["バリアー", "身を守る障壁を張る。"],
        "あいすばーぐ": ["アイスバーグ", "巨大な氷塊を呼び出す魔法。"]
    }
    let 読み = sort(keys(一覧), "kana")
    foreach 読み as i, よみ {
        湊: ${一覧[よみ][0]}
    }
}

アイスバーグ、バリアー、フレイムの順に表示されます。

OnBoot => {
    global save.履歴 ?= []
    global save.履歴 = push(save.履歴, "起動")
}

マップ

関数説明例
has_key(map, key)キーが存在するかhas_key(data, "name") → true
keys(map)キーの配列を返す
values(map)値の配列を返す
delete(map, key)キーを除いた新しいマップを返す
len(map)キーの数
get(map, key, default)キーの値を返す。なければ default(省略時は null)get(data, "age", 0)

get は配列にも使えます(get(arr, 添字, default))。範囲外の添字や負の添字でも警告を出さず、default を返します。 data["age"] のように直接参照すると、存在しないキーや範囲外の添字では通知や警告が出ます。

日付・時刻

関数説明
days_since(year, month, day)指定した日から今日までの日数
days_between(y1, m1, d1, y2, m2, d2)1つ目の日から2つ目の日までの日数(2つ目のほうが後なら正の数)

存在しない日付(2026, 2, 30 など)を渡すと、どちらも null を返します。

OnBoot => {
    let days = days_since(2026, 1, 1)
    湊: 2026年1月1日から${days}日経ちました。
}

制御・ユーティリティ

関数説明例
choose(cond, a, b)condが真ならa、偽ならb(選ばれなかった側の式は評価されません)choose(flag, "はい", "いいえ")
talk_exists(name)その名前のトークまたは関数が定義されているかtalk_exists("挨拶") → true
log(v, ...)値をログに書き出す(戻り値は null)log("起動しました")

log は、debug_log が有効なときだけ、ゴーストフォルダの minato_debug.log に [SCRIPT] メッセージ の形で書き込みます。 複数の値を渡すと , でつないで1行にします。無効なときは何もしません。

システム連携

関数説明
get_property(name)SSPのプロパティを取得する
saori(dll, arg0, arg1, ...)SAORIを呼び出す

saori の詳細はSAORI連携を参照してください。

get_property

SSPに、そのプロパティの値を問い合わせます(SSTPの GetProperty)。プロパティ名はSSPのドキュメントを見てください。

OnBoot => {
    let name = get_property("currentghost.name")
    湊: いまのゴーストは${name}です。
}
  • 戻り値はいつも文字列です。SSPにつながらない、応答が遅い、そのプロパティがない、といった理由で取れなかったときは、空文字列 "" が返ります。エラーや警告にはなりません。
  • 問い合わせのあいだ、湊は応答を待ちます。待つのは通常、長くても1回あたり1秒前後ですが、そのあいだSSPが固まったように見えることがあります。ランダムトークのたびに呼ぶような使い方は避けてください。

外部呼び出しは1イベント10回まで

get_property() と saori() は、合わせて1イベントあたり10回までしか呼べません。 SSPやSAORIの応答を待つあいだにSSP全体が止まるのを、ループで何度も繰り返さないための上限です。

11回目以降は実際には呼び出されず、get_property() は空文字列、saori() は空の配列を返します。

関数上限を超えたとき
saori()応答の ErrorLevel に warning が付く
get_property()警告は出ない。debug_log = true のときのログ(minato_load.log)にだけ記録される

数はイベントごとに0に戻ります。トークの条件フィルタの中で呼んだ分も数えます。 ループの中で呼ぶ必要があるときは、ループの前に1回だけ呼んで、結果を let に入れて使ってください。

OnBoot => {
    // NG: 11回目から空になる
    for (let i = 0; i < 20; i++) {
        let r = saori("calc.dll", i)
    }

    // OK: 1回だけ呼んで使い回す
    let name = get_property("currentghost.name")
    for (let i = 0; i < 20; i++) {
        湊: ${name}
    }
}

型の判定

関数説明例
is_num(v)v が数値かis_num(42) → true、is_num("42") → false
is_str(v)v が文字列かis_str("42") → true
is_bool(v)v が true / false かis_bool(false) → true
is_array(v)v が配列かis_array([1, 2]) → true
is_map(v)v がマップかis_map({"a": 1}) → true
is_null(v)v が null かis_null(save.名前) → true
type_of(v)型の名前を返す("number"・"string"・"bool"・"array"・"map"・"null" のどれか)type_of(3.14) → "number"
  • 調べるのは今の値の型だけです。"42" のような数字の文字列は文字列なので、is_num("42") は false です。
  • 未定義の変数は null になるので、is_null(save.未定義) は true、type_of(save.未定義) は "null" です。
  • 引数を省略すると null を渡したのと同じ扱いになります。

JSONから読み込んだ値を使う前に確かめるときに便利です。

let data = json_parse(file_read("ghost/master/config.json"))
if (is_num(data.回数)) {
    湊: ${data.回数}回目です。
}

JSON

関数説明戻り値
json_parse(s)JSONの文字列を値(マップ・配列など)に変換する変換した値。失敗したら null
json_stringify(v, pretty)値をJSONの文字列に変換する。pretty が true なら字下げ付き、省略すると1行JSONの文字列。失敗したら null

ファイル操作

関数説明戻り値
file_read(path, enc)テキストファイルを読み込む内容の文字列。失敗したら null
file_write(path, text, enc)ファイルに書き込む(既存の内容は置き換え)成功したら true、失敗したら false
file_append(path, text, enc)ファイルの末尾に追記する(なければ作る)成功したら true、失敗したら false
file_move(from, to, overwrite)ファイルを移動(名前変更)する成功したら true、失敗したら false

書き込みできる場所の制限や使用例はファイルとJSONを参照してください。