ビルトイン関数
数値・算術
| 関数 | 説明 | 例 |
|---|---|---|
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を参照してください。