Hitoshina - Languageについて
Hitoshina - Languageは、Second Life向けのプログラミング言語です。
Hitoshinaの理念である「より良いSecond Lifeへの貢献」という理念に沿って、
メモリ使用量の削減や高速化といった最適化のノウハウを集約し、様々な人が意識せずにそれらの恩恵を受けられるようにすることを目標としています。
ビルドするとスクリプト言語 LSL(Linden Scripting Language)のコードを出力します。
特徴
- 最適化 — 定数畳み込み、インライン展開、デッドコード削除などの自動最適化。
- 関数とプロシージャの分離 — 純粋な関数と副作用のあるプロシージャを文法的に区別。
- テスト機能 — 関数の単体テストとモック機能。
- 静的解析 — 送信チャンネルに対する受信チャンネルが存在しないなどの意味的な誤りを検出。
Second Life の基本概念
Hitoshina - Languageを理解するために、Second Lifeの以下の概念を知っておくと役立ちます。
- オブジェクト: ワールド内に存在する3Dモデル。1つ以上のプリム(パーツ)で構成され、プリムをリンクしたものをリンクセットと呼びます。
- スクリプト: オブジェクトに埋め込まれるプログラム。イベント(初期化、タッチ、メッセージ受信等)に応じて動作します。
- アバター: プレイヤーのキャラクター。UUID で一意に識別されます。
- チャンネル: スクリプト間通信のための番号付きメッセージバス。チャンネル0はワールドチャット。
- プリム: オブジェクトを構成する個々のパーツ。リンクセット内ではリンク番号で識別されます。HLの
prim宣言はこのプリムに対応します。
クイックスタート
最小限の.hlファイル例
script main;
main #init {
"Hello, World!" -> world;
}
script main;—mainという名前のスクリプトインスタンスを宣言します。コンパイル時にoutput/main.lslとして出力されます。main #init { ... }—mainスクリプトの初期化イベントハンドラーです。スクリプトが開始されたときに1度だけ実行されます。"Hello, World!" -> world;— 文字列をワールドチャット(チャンネル0の公開チャット)に送信します。->はメッセージ送信演算子、worldは送信先です。
このスクリプトをコンパイルすると、script main; の宣言に対応する output/main.lsl が生成されます。
default {
state_entry() {
llSay(0, "Hello, World!");
}
}
コンパイル手順
# コンパイル(.hlファイルからLSLを生成)
hl main.hl
# 出力: output/main.lsl
生成された .lsl ファイルをSecond Lifeのオブジェクトに設置して使用します。
プロジェクト作成
# プロジェクトディレクトリを作成
hl new my_project
以下のディレクトリ構造が作成されます。
my_project/
├── lib/ # ライブラリファイル (.hlib)
├── prc/ # プロシージャライブラリ (.hprc)
├── msg/ # メッセージハンドラー (.hmsg)
├── output/ # 出力ファイル (.lsl)
├── tests/ # テストファイル (.hltest)
└── main.hl # メインスクリプト(初期テンプレート)
各ディレクトリ・ファイルの役割は以下の通りです。
- lib/ — 複数のスクリプトで共有する関数や定数を
.hlibファイルとして格納します。import math_lib;のように読み込みます。 - prc/ — 再利用可能なプロシージャ(副作用を伴う処理)を
.hprcファイルとして格納します。include common_proc;のように読み込みます。 - msg/ — スクリプト間のメッセージ受信時に実行される処理を
.hmsgファイルとして分離・定義します。メインファイルからメッセージ送信時に-> sub @handler_nameの形式で指定します。 - output/ —
hl main.hlでコンパイルすると、ここにLSLファイルが生成されます。このファイルをSecond Lifeに設置します。 - tests/ —
.hltestファイルで単体テストを記述します。hl testコマンドで実行できます。 - main.hl — プロジェクトのエントリポイントとなるメインスクリプト。以下の初期テンプレートが書き込まれた状態で生成されます。
script main;
main #init {
"Hello, World!" -> world;
} 文法概要
この章では、Hitoshina - Languageの全体像を簡潔に紹介します。各トピックの詳細な構文仕様は後続のセクションを参照してください。
プログラムの構造
HLプログラムは、メインファイル(.hl)を中心に構成されます。メインファイルにはスクリプトの定義、イベントハンドラー、そして処理の本体を記述します。
script main; // スクリプトインスタンスの宣言
prim btn; // プリムの宣言
const int CH = 100; // 定数の定義
main #init { // 初期化イベント
"Ready" -> owner; // オーナーにメッセージ送信
}
データ型
基本型として int, float, str, bool, key(UUID), vec(3Dベクター), rot(回転)があります。リストは ilist, slist 等の型付きリストで安全に操作できます。詳細は型システムを参照してください。
変数と定数
int count = 0; // 変数定義
const int MAX_COUNT = 100; // 定数定義(大文字命名)
関数とプロシージャ
HLでは関数とプロシージャを明確に区別します。
- 関数: 値を計算して返します。式のみで構成されます。
- プロシージャ: 副作用(※)のある処理を実行します。ブロック構文を持ちます。
※副作用とは、関数の外部に影響を与える操作のことです。メッセージ送信(->)やグローバル変数の書き換えなどが副作用に当たります。HLでは関数に副作用を持たせることができないため、どこから呼び出しても同じ入力に対して同じ結果が保証されます。
script main;
// 関数: 式で値を返す
int add(int a, int b) = a + b;
// プロシージャ: ブロックで処理を記述
#greet |str name| {
"Hello, " + name -> world;
}
main #init {
add(5, 3) -> owner; // "8"
#greet|"World"|; // "Hello, World"
}
詳細は基本構文を参照してください。
イベント駆動モデル
Second Lifeのスクリプトはイベント駆動で動作します。HLでは #init(初期化)、#timer(タイマー)、#listen(メッセージ受信)、#touch_start(タッチ)などのイベントハンドラーを定義できます。
script main;
main #listen :0 |str msg| { // チャンネル0のメッセージを受信
msg -> owner; // オーナーに転送
}
詳細は基本構文 — イベントハンドラーを参照してください。
メッセージの送受信
-> 演算子でメッセージを送信します。送信先は world(公開チャット)、owner(オーナー)、またはユーザー定義のスクリプト・アバターを指定できます。
script main;
script sub;
main #init {
"公開メッセージ" -> world; // ワールドチャット
"秘密のメッセージ" -> owner; // オーナーのみ
"データ":100 -> sub; // チャンネル100でsubスクリプトへ
}
sub #linkmsg :100 |str msg| { // チャンネル100のメッセージを受信
msg -> owner;
}
詳細はメッセージ送信を参照してください。
条件分岐とループ
script main;
main #init {
int count = 7;
if 10 < count {
"Large" -> owner;
} elif 5 < count {
"Medium" -> owner;
} else {
"Small" -> owner;
}
slist items = ["Apple", "Banana", "Cherry"];
for str item in items {
item -> owner;
}
}
詳細はブロック構文を参照してください。
ファイル構成
コードを用途別のファイルに分割できます。
| 拡張子 | 用途 | 主な内容 |
|---|---|---|
.hl | メインファイル | スクリプト定義、イベントハンドラー |
.hlib | 関数ライブラリ | 再利用可能な関数・定数 |
.hprc | プロシージャライブラリ | 再利用可能なプロシージャ |
.hmsg | メッセージハンドラー | メッセージ受信時の処理 |
.hltest | テストファイル | 単体テスト・モック |
詳細はファイルタイプを参照してください。
ファイルタイプ
Hitoshina - Languageでは、用途に応じて5種類のファイルタイプを使い分けます。
メインファイル(.hl)
メインファイルはLSLスクリプトを生成するためのエントリーポイントとなるファイルです。
定義可能な要素:
- script/avatar/prim定義(
script main;、avatar player = "UUID";等) - イベントハンドラー(
#init、#timer、#listen、#touch、#linkmsg等) - プロシージャ定義(
#proc { ... }形式) - 関数定義(
int add(int a, int b) = a + b;形式) - 定数定義(
const int MAX = 100;形式) - context定義(グローバル状態管理用の構造体)
- プロパティ定義(
#attachable、#animable、#cache_linknum、#memory_limit_kb) - import文(
.hlibファイルの参照) - include文(
.hprcファイルの参照)
定義できない要素:
- ref文(
.hmsgファイル専用) - test定義(
.hltestファイル専用)
重要: メインファイルのイベントハンドラーやプロシージャ内ではブロック構文を使用します。関数呼び出しは式として使用できますが、void関数(戻り値なし関数)は存在しません。副作用を伴う処理にはプロシージャを使用してください。
例:
project/
└── main.hl
script main;
const int MAX_COUNT = 10;
context @main {
int counter = 0;
}
#debug |str msg| {
msg -> owner;
}
main #init |context ctx| {
"Hello" -> world;
ctx.counter += 1;
#debug|"Initialized"|;
}
main #listen:0 |str msg, context ctx| {
if ctx.counter < MAX_COUNT {
ctx.counter += 1;
"Count: " + ctx.counter -> owner;
}
}
ライブラリファイル(.hlib)
ライブラリファイルは、再利用可能な関数と定数を定義します。
定義可能な要素:
- 関数定義(
int add(int a, int b) = a + b;) - 定数定義(
const int MAX_VALUE = 100;) - 他のライブラリのimport
定義できない要素:
- script/avatar/prim定義
- イベントハンドラー
- プロシージャ定義
- プロパティ定義
例:
project/
└── lib/
└── math_utils.hlib
const int MAX_VALUE = 100;
int add(int a, int b) = a + b;
int clamp(int x, int max) = max < x ? max : x;
プロシージャライブラリファイル(.hprc)
プロシージャライブラリファイルは、再利用可能なプロシージャを定義します。
定義可能な要素:
- プロシージャ定義(
#proc_name { ... }または#proc_name|params| { ... }) - 他のライブラリのimport
- 他のプロシージャライブラリのinclude
定義できない要素:
- script/avatar/prim定義
- イベントハンドラー
- 関数定義
- 定数定義
- プロパティ定義
例:
project/
└── prc/
└── greet.hprc
#say_hello |str name| {
"Hello, " + name -> world;
}
メッセージハンドラーファイル(.hmsg)
メッセージハンドラーファイルは、メッセージ送信時に呼び出される処理を分離して定義します。
定義可能な要素:
- ref文(参照先のスクリプトファイル指定)
- import文
- include文(
.hprcファイルの参照) - 定数定義
- 関数定義
- プロシージャ定義
- linkmsgイベントハンドラー
定義できない要素:
- script/avatar/prim定義
- context定義
- その他のイベントハンドラー(#init、#timer、#listen、#touch等)
例:
project/
├── main.hl
└── msg/
└── greeting.hmsg
script main;
script sub;
main #init {
"Hello":100 -> sub @ greeting; // msg/greeting.hmsg を呼び出してsubスクリプトへ送信
}
ref main;
sub #linkmsg :100 |str msg| {
msg -> world;
}
contextパラメータの使用:
.hmsgファイル内のlinkmsgハンドラでは、親.hlファイルで定義されたcontextフィールドにcontextパラメータ経由でアクセスできます。
script main;
script dialog;
context @dialog {
str dialog_part = "";
}
main #init {
"menu":100 -> dialog @ menu;
}
ref main;
dialog #linkmsg :100 |str msg, context ctx| {
ctx.dialog_part = msg; // 親.hlのcontext @dialog のフィールドにアクセス
}
テストファイル(.hltest)
テストファイルは、単体テストを記述するためのファイルです。
定義可能な要素:
- import文
- テスト式(比較式形式)
- モック定義
定義できない要素:
- script/avatar/prim定義
- イベントハンドラー
- 関数定義
- プロシージャ定義・呼び出し
- 定数定義
- メッセージ送信
- context定義
- プロパティ定義
例:
project/
├── lib/
│ └── math_utils.hlib
└── tests/
└── math_utils_test.hltest
テスト対象のライブラリとテスト例:
int add(int a, int b) = a + b;
int clamp(int x, int max) = max < x ? max : x;
import math_utils as m;
// add関数のテスト
m::add(1, 2) == 3;
m::add(-1, 1) == 0;
// clamp関数のテスト
m::clamp(50, 100) == 50;
m::clamp(150, 100) == 100;
テスト結果:
✅ m::add(1, 2) == 3
✅ m::add(-1, 1) == 0
✅ m::clamp(50, 100) == 50
✅ m::clamp(150, 100) == 100
test result: ok. 4 passed; 0 failed
ファイルタイプ対照表
各ファイルタイプで使用可能な構文の一覧です。
トップレベル宣言・定義
| 構文 | .hl | .hlib | .hprc | .hmsg | .hltest |
|---|---|---|---|---|---|
import文 (import lib;) | ✅ | ✅ | ✅ | ✅ | ✅ |
include文 (include proc;) | ✅ | ❌ | ✅ | ✅ | ❌ |
ref文 (ref main;) | ❌ | ❌ | ❌ | ✅ | ❌ |
インスタンス定義 (script main;) | ✅ | ❌ | ❌ | ❌ | ❌ |
primsグループ定義 (prims btn***) | ✅ | ❌ | ❌ | ❌ | ❌ |
定数定義 (const int MAX = 100;, 定数式対応) | ✅ | ✅ | ❌ | ✅ | ❌ |
context定義 (context @script_id { ... }) | ✅ | ❌ | ❌ | ❌ | ❌ |
関数定義 (int f(int x) = x;) | ✅ | ✅ | ❌ | ✅ | ❌ |
プロシージャ定義 (#proc { ... }) | ✅ | ❌ | ✅ | ✅ | ❌ |
| プロパティ: #attachable | ✅ | ❌ | ❌ | ❌ | ❌ |
| プロパティ: #animable | ✅ | ❌ | ❌ | ❌ | ❌ |
| プロパティ: #cache_linknum | ✅ | ❌ | ❌ | ❌ | ❌ |
| プロパティ: #memory_limit_kb | ✅ | ❌ | ❌ | ❌ | ❌ |
テスト式 (1 + 1 == 2;) | ❌ | ❌ | ❌ | ❌ | ✅ |
モック定義 (!!func() = val;) | ❌ | ❌ | ❌ | ❌ | ✅ |
イベントハンドラー定義
| 構文 | .hl | .hlib | .hprc | .hmsg | .hltest |
|---|---|---|---|---|---|
| #init | ✅ | ❌ | ❌ | ❌ | ❌ |
| #timer | ✅ | ❌ | ❌ | ❌ | ❌ |
| #listen | ✅ | ❌ | ❌ | ❌ | ❌ |
| #linkmsg | ✅ | ❌ | ❌ | ✅ | ❌ |
| #touch_start / #touch | ✅ | ❌ | ❌ | ❌ | ❌ |
| #sensor | ✅ | ❌ | ❌ | ❌ | ❌ |
| #no_sensor | ✅ | ❌ | ❌ | ❌ | ❌ |
| #run_time_permissions | ✅ | ❌ | ❌ | ❌ | ❌ |
| #dataserver | ✅ | ❌ | ❌ | ❌ | ❌ |
| #changed | ✅ | ❌ | ❌ | ❌ | ❌ |
ブロック内構文
イベントハンドラーやプロシージャのブロック{ }内で使用可能な構文。
| 構文 | .hl | .hlib | .hprc | .hmsg | .hltest |
|---|---|---|---|---|---|
変数定義 (int x = 1;) | ✅ | ❌ | ✅ | ✅ | ❌ |
変数再代入 (x = 2;) | ✅ | ❌ | ✅ | ✅ | ❌ |
メッセージ送信 (exp -> target;) | ✅ | ❌ | ✅ | ✅ | ❌ |
| if/elif/else | ✅ | ❌ | ✅ | ✅ | ❌ |
| switch文 | ✅ | ❌ | ✅ | ✅ | ❌ |
| for-toループ | ✅ | ❌ | ✅ | ✅ | ❌ |
| for-eachループ | ✅ | ❌ | ✅ | ✅ | ❌ |
| プリムメソッド呼び出し | ✅ | ❌ | ✅ | ✅ | ❌ |
| プロシージャ呼び出し | ✅ | ❌ | ✅ | ✅ | ❌ |
| ダイアログ構文 | ✅ | ❌ | ✅ | ✅ | ❌ |
早期リターン (end;) | ✅ | ❌ | ✅ | ✅ | ❌ |
※ .hlibは関数が式ベース(ブロックなし)、.hltestはテスト式とモック定義のみ。
関数式構文
関数定義の本体(=の右辺)で使用可能な式形式。
| 構文 | .hl | .hlib | .hprc | .hmsg | .hltest |
|---|---|---|---|---|---|
式 (a + b) | ✅ | ✅ | ❌ | ✅ | ❌ |
三項演算子 (exp ? exp : exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
match (exp ? pat => val : default) | ✅ | ✅ | ❌ | ✅ | ❌ |
map (map type id in exp : exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
map range (map int id = exp to exp : exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
fold (fold type id in exp : exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
fold range (fold int id = exp to exp : exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
fold accumulator (fold ... , type acc = exp : exp, exp) | ✅ | ✅ | ❌ | ✅ | ❌ |
※ 関数定義が可能なファイルタイプ(.hl, .hmsg, .hlib)でのみ使用可能。
switch単一文形式
switch文の=>後にブロック{}なしで記述する場合の構文。ブロック内構文のサブセット。
| 構文 | .hl | .hlib | .hprc | .hmsg | .hltest |
|---|---|---|---|---|---|
| 変数定義 | ✅ | ❌ | ✅ | ✅ | ❌ |
| 変数再代入 | ✅ | ❌ | ✅ | ✅ | ❌ |
| メッセージ送信 | ✅ | ❌ | ✅ | ✅ | ❌ |
| プリムメソッド呼び出し | ✅ | ❌ | ✅ | ✅ | ❌ |
| プロシージャ呼び出し | ✅ | ❌ | ✅ | ✅ | ❌ |
| ダイアログ構文 | ✅ | ❌ | ✅ | ✅ | ❌ |
※ 制御構文(if, switch, for)と早期リターン(end)は単一文形式では不可。ブロック形式{}で全構文が使用可能。
基本構文
この章では、HLプログラムを構成する基本的な構文要素を詳しく説明します。
import文
import <ライブラリ名>;
import <ライブラリ名> as <エイリアス名>;
外部ライブラリファイル(.hlib)で定義された関数・定数を現在のファイルで使用可能にします。
例:
int add(int a, int b) = a + b;
import math_utils;
script main;
main #init {
int result = math_utils::add(5, 3);
result -> owner; // "8" と表示
}
include文
include <ライブラリ名>;
include <ライブラリ名> as <エイリアス名>;
外部プロシージャライブラリファイル(.hprc)で定義されたプロシージャを現在のファイルで使用可能にします。
例:
#say_hello |str name| {
"Hello, " + name -> world;
}
include greet;
script main;
main #init {
#greet::say_hello|"World"|;
}
識別子の命名規則
通常識別子(変数名、関数名、スクリプト名等)
- 小文字英字、数字、アンダースコアのみ使用可能。
- 先頭に数字は使用不可。
- 例:
main,my_variable,count_items,user_id_123
定数識別子
- 大文字英字、数字、アンダースコアのみ使用可能。
- 先頭に数字は使用不可。
- 例:
MAX_COUNT,DEFAULT_MESSAGE,CH_PUBLIC,API_KEY_1
script/avatar/prim定義
Second Lifeのエンティティに対応するインスタンスを宣言します。
- script: LSLスクリプトに対応。
script main;はoutput/main.lslを生成します。1つの.hlファイルから複数スクリプトのコードを生成できます(例:script main; script sub;→output/main.lsl,output/sub.lsl)。 - avatar: プレイヤーキャラクター。定義時にUUIDを指定して識別します(UUID必須)。
- prim: リンクセット内の個々のプリム(パーツ)。リンク番号で識別され、色変更やタッチ検出などの操作対象となります。
script <識別子名>;
avatar <識別子名> = "<UUID文字列>";
prim <識別子名>;
// カンマ区切りで複数のインスタンスを一括宣言可能
prim <識別子名>, <識別子名>, ...;
script <識別子名>, <識別子名>, ...;
prims定義(primのグループ化)
複数のprimをワイルドカードパターンでグループ化します。
import standard as std;
script main;
main #cache_linknum;
prim btn123;
prim btn456;
prim btn789;
// primsグループ定義(ワイルドカード`*`の数が文字数を表す)
prims btn*** = btn123, btn456, btn789; // btn + 3文字 = 6文字のprimをグループ化
// primsグループへのメソッド呼び出しは各primに展開される
main #init {
#btn***.set_color|std::ALL_SIDES, <1,0,0>, 1.0|;
// 展開結果:
// #btn123.set_color|std::ALL_SIDES, <1,0,0>, 1.0|;
// #btn456.set_color|std::ALL_SIDES, <1,0,0>, 1.0|;
// #btn789.set_color|std::ALL_SIDES, <1,0,0>, 1.0|;
}
// primsグループのタッチイベント(パターンマッチングで条件生成)
btn*** #touch_start @main |prim obj| {
obj.name() -> owner; // タッチされたprimの識別子名
obj.desc() -> owner; // タッチされたprimの説明
}
制約:
- ワイルドカードは後置のみ(
btn***は可、***btnは不可)。 - 宣言時に代入が必須(
prims btn***;のみは不可)。 - パターンに一致する全primの代入が必須。
- prim型とprims型は相互変換不可。
イベントハンドラー
Second Lifeのスクリプトはイベント駆動で動作します。HLでは スクリプト識別子 #イベント名 の形式でイベントハンドラーを定義します。
| イベント | 発火タイミング | パラメータ |
|---|---|---|
#init | スクリプト開始時(1回のみ) | context |
#timer | タイマー間隔ごと | context |
#listen | 指定チャンネルのメッセージ受信時 | str name, key id, str msg(全て省略可), context |
#linkmsg | リンクメッセージ受信時 | str msg, context |
#touch_start | プリムがタッチされた時 | prim, context |
#touch | プリムがタッチされている間 | prim, context |
#sensor | センサーがオブジェクト/エージェントを検出した時 | int num_detected, context |
#no_sensor | センサーが何も検出しなかった時 | context |
#run_time_permissions | パーミッション要求の結果を受信した時 | int perm, context |
#dataserver | 非同期データリクエスト(request_agent_data()等)が完了した時 | key queryid, str data, context |
#changed | オブジェクトに変化があった時 | int change_flags, context |
#on_rez | オブジェクトがrezされた・装着された時 | int start_param, context |
init イベント
スクリプトの開始時(リセット時や装着時)に1度だけ実行されます。
<スクリプト識別子> #init {
// 処理内容
}
<スクリプト識別子> #init|context <変数名>| {
// 処理内容(contextアクセス可)
}
<スクリプト識別子> #init|bool <変数名>| {
// 処理内容(bool 変数で起動コンテキストを区別可能)
}
<スクリプト識別子> #init|bool <変数名>, context <変数名>| {
// 処理内容(bool 変数 + contextアクセス)
}
bool パラメータ(任意): #attachable が指定されたスクリプトでは、#init の内容は LSL の state_entry と attach(key id) の両方に展開されます。bool パラメータを宣言すると、その変数は state_entry 経路では false、装着時の attach 経路では true として参照可能となり、装着時にのみ実行したい処理を分岐できます。#attachable が指定されていない場合、bool 変数は常に false となります。
script main;
main #attachable;
main #init|bool is_attach| {
if is_attach {
"attached!" -> owner;
} else {
"started" -> owner;
}
}
timer イベント
設定された間隔で繰り返し実行されます。標準プロシージャの set_timer() でタイマーを設定します。
<スクリプト識別子> #timer {
// 処理内容
}
<スクリプト識別子> #timer|context <変数名>| {
// 処理内容(contextアクセス可)
}
listen イベント
指定チャンネルのチャットメッセージを受信します。チャンネル0はワールドチャット(公開チャット)で、それ以外の番号はスクリプト間通信に使用します。
// パラメータ省略
<スクリプト識別子> #listen :<チャンネル番号> {
// 処理内容
}
// メッセージのみ
<スクリプト識別子> #listen :<チャンネル番号> |str msg| {
// 処理内容
}
// 全パラメータ指定
<スクリプト識別子> #listen :<チャンネル番号> |str name, key id, str msg| {
// 処理内容(name: 送信者名、id: 送信者UUID、msg: メッセージ)
}
// contextアクセス
<スクリプト識別子> #listen :<チャンネル番号> |str msg, context ctx| {
// 処理内容(contextアクセス可)
}
// オーナーフィルタとの組み合わせ
<スクリプト識別子> #listen :<チャンネル番号> + owner |str msg| {
// 処理内容(オーナーのみ受信)
}
パラメータ(全て省略可能、順序固定):
str <変数名>— 送信者名key <変数名>— 送信者UUIDstr <変数名>— メッセージ本文context <変数名>— contextアクセス(末尾に指定)
指定可能な組み合わせ:
|str name, key id, str msg|— 送信者名・UUID・メッセージ|str name, key id|— 送信者名・UUID|str name, str msg|— 送信者名・メッセージ|key id, str msg|— UUID・メッセージ|key id|— UUID のみ|str msg|— メッセージのみ- 省略可
- 上記いずれにも
, context <変数名>を末尾に追加可能
※ 単独の str パラメータはメッセージ本文として解釈されます。
チャンネル番号:
- リテラル値:
#listen :0、#listen :123 - 定数名:
#listen :PUBLIC_CHANNEL - ライブラリ定数:
#listen :const::CH_PUBLIC
オーナーフィルタ (+ owner):
- オーナーからのメッセージのみを受信。
linkmsg イベント
同一オブジェクト内の他スクリプトからリンクメッセージを受信したときに実行されます。
<スクリプト識別子> #linkmsg :<チャンネル番号> |str msg| {
// 処理内容
}
// contextアクセス
<スクリプト識別子> #linkmsg :<チャンネル番号> |str msg, context ctx| {
// 処理内容(contextアクセス可)
}
touch_start イベント
プレイヤーがプリムをクリック(タッチ)した瞬間に1回実行されます。プリム識別子で受け取り対象を指定し、@ でスクリプトを紐付けます。
<プリム識別子> #touch_start @ <スクリプト識別子> {
// 処理内容
}
<プリム識別子> #touch_start :<面指定> @ <スクリプト識別子> {
// 処理内容(特定の面がタッチされた場合のみ実行)
}
// primパラメータ(タッチされたプリムの情報を取得)
<プリム識別子> #touch_start @ <スクリプト識別子> |prim <変数名>| {
<変数名>.name() -> owner; // プリムの識別子名
<変数名>.desc() -> owner; // プリムのDescription
}
// primパラメータとcontextパラメータの組み合わせ
<プリム識別子> #touch_start @ <スクリプト識別子> |prim <変数名>, context <ctx変数名>| {
// 処理内容
}
// primsグループの場合も同様(パターンマッチングで条件生成)
<primsグループ識別子> #touch_start @ <スクリプト識別子> |prim <変数名>| {
<変数名>.name() -> owner; // タッチされた個別primの識別子名
}
primパラメータのメソッド:
<変数名>.name(): プリムの識別子名を取得(str型)。<変数名>.desc(): プリムのDescriptionを取得(str型)。
LSL変換時の展開例:
// obj.name() → llGetLinkName($link_num)
// obj.desc() → llList2String(llGetObjectDetails(llGetLinkKey($link_num), [OBJECT_DESC]), 0)
※ メソッドがブロック内で参照されていない場合は、該当コードは生成されません(最適化)。
touch イベント
プレイヤーがプリムをタッチしている間、継続的に実行されます。パラメータは#touch_startと同様です。
// 基本
<プリム識別子> #touch @ <スクリプト識別子> {
// 処理内容
}
// 面指定
<プリム識別子> #touch :<面指定> @ <スクリプト識別子> {
// 処理内容
}
// primパラメータ(タッチされたプリムの情報を取得)
<プリム識別子> #touch @ <スクリプト識別子> |prim <変数名>| {
<変数名>.name() -> owner; // プリムの識別子名
<変数名>.desc() -> owner; // プリムのDescription
}
// primパラメータとcontextの組み合わせ
<プリム識別子> #touch @ <スクリプト識別子> |prim <変数名>, context <ctx変数名>| {
// 処理内容
}
#touch_startとの違い:
| 項目 | #touch_start | #touch |
|---|---|---|
| 実行タイミング | タッチした瞬間(1回) | タッチしている間(継続) |
| パラメータ | prim, context | prim, context |
| LSLイベント | touch_start() | touch() |
sensorイベント
標準プロシージャの sensor_repeat() / sensor() で開始されたセンサーがオブジェクト/エージェントを検出した時に実行されます。
<スクリプト識別子> #sensor |int <検出数変数>| {
// <検出数変数>: 検出されたエンティティの数(int型)
}
<スクリプト識別子> #sensor |int <検出数変数>, context <ctx変数名>| {
// contextパラメータとの併用も可能
}
no_sensorイベント
センサーが何も検出しなかった時に実行されます。
<スクリプト識別子> #no_sensor {
// 処理内容
}
<スクリプト識別子> #no_sensor |context <ctx変数名>| {
// contextパラメータとの併用も可能
}
run_time_permissionsイベント
標準プロシージャの request_permissions() で要求したパーミッションが許可/拒否された時に実行されます。パーミッション変数(int型)はビットマスクで、付与されたパーミッションを表します。
<スクリプト識別子> #run_time_permissions |int <パーミッション変数>| {
// <パーミッション変数>: 付与されたパーミッションのビットマスク(int型)
}
<スクリプト識別子> #run_time_permissions |int <パーミッション変数>, context <ctx変数名>| {
// contextパラメータとの併用も可能
}
dataserverイベント
標準ライブラリの request_agent_data() / get_notecard_line() 等の非同期データリクエストが完了した時に実行されます。クエリID変数(key型)でリクエストを識別し、データ変数(str型)に返却データが入ります。
<スクリプト識別子> #dataserver |key <クエリID変数>, str <データ変数>| {
// <クエリID変数>: リクエストを識別するクエリID(key型)
// <データ変数>: 返却されたデータ(str型)
}
<スクリプト識別子> #dataserver |key <クエリID変数>, str <データ変数>, context <ctx変数名>| {
// contextパラメータとの併用も可能
}
changed イベント
オブジェクトに何らかの変化(インベントリ追加、リンク変更、リージョン移動など)があった時に実行されます。int 変数には変化の種類を表すビットフィールドが渡されます。
<スクリプト識別子> #changed |int <変化フラグ変数>| {
// <変化フラグ変数>: 変化の種類を表すビットフィールド(int型)
// CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE,
// CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER,
// CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA,
// CHANGED_RENDER_MATERIAL のビット和
}
<スクリプト識別子> #changed |int <変化フラグ変数>, context <ctx変数名>| {
// contextパラメータとの併用も可能
}
LSL 変換:
changed(integer change)
{
// ブロック内容
}
on_rez イベント
オブジェクトがインワールドに rez された時、またはアバターが装着した時に実行されます。int 変数には llRezObject() 等で渡された start_param 値が入り、ユーザーや別オブジェクトから手動で rez された場合は通常 0 です。
<スクリプト識別子> #on_rez |int <start_param変数>| {
// <start_param変数>: rez 時の start_param 値(int型)
}
<スクリプト識別子> #on_rez |int <start_param変数>, context <ctx変数名>| {
// contextパラメータとの併用も可能
}
LSL 変換:
on_rez(integer start_param)
{
// ブロック内容
}
プロシージャと関数の違い
| 項目 | プロシージャ | 関数 |
|---|---|---|
| 定義方法 | #name { ... } | type name(...) = expr; |
| 戻り値 | なし | 必須(式の評価結果) |
| 本体 | ブロック(文の列) | 式のみ |
| 呼び出し | #name; | name() |
| 定義場所 | .hl, .hprc, .hmsg | .hl, .hlib, .hmsg |
| 用途 | 副作用を伴う処理 | 値を計算して返す |
プロシージャ定義
// パラメータなし
#<プロシージャ名> {
// 処理内容
}
// パラメータ付き
#<プロシージャ名> |<引数リスト>| {
// 処理内容
}
例:
script main;
#debug_print |str message| {
message -> world;
}
main #init {
#debug_print|"Hello"|;
}
プロシージャ呼び出し
#<プロシージャ名>;
#<プロシージャ名>|<引数>|;
関数定義
関数は値を計算して返すために使用します。.hl、.hlib、.hmsgファイルで定義できます。
<戻り値型> <関数名>(<引数リスト>) = <式>;
例:
script main;
int add(int a, int b) = a + b;
main #init {
int result = add(5, 3);
result -> owner; // "8" と表示
}
重要: 関数本体は式のみで構成されます。以下の構文は使用できません:
- 変数定義・再代入。
- プロシージャ呼び出し。
- メッセージ送信。
- 制御構文(if文、while文、for each文)。
関数専用の式
関数本体では、通常の式に加えて以下の特殊な式を使用できます。これらは関数定義内でのみ使用可能で、ブロック構文(イベントハンドラーやプロシージャ)では使用できません。
| 式 | 用途 | 構文 |
|---|---|---|
| 三項演算子 | 条件分岐 | 条件 ? 真の値 : 偽の値 |
| match式 | パターンマッチング | 値 ? パターン1 => 結果1 ? パターン2 => 結果2 : デフォルト |
| map式 | リスト/str変換 | map 型 変数 in コレクション : 変換式 |
| map式(レンジ) | レンジ変換 | map int 変数 = 開始 to 終了 : 変換式 |
| find式 | リスト検索 | find 型 変数 in リスト : (パターンマッチ形式 または 三項演算子形式) |
| find式(レンジ) | レンジ検索 | find int 変数 = 開始 to 終了 : 三項演算子形式 |
| fold式 | リスト/str集約 | fold 型 変数 in コレクション : 集約式 |
| fold式(レンジ) | レンジ集約 | fold int 変数 = 開始 to 終了 : 集約式 |
| fold式(アキュムレータ付き) | 状態追跡付き集約 | fold ... , 型 acc = 初期値 : 集約式, 更新式 |
三項演算子
条件に基づいて値を返します。
script main;
str status(bool flag) = flag ? "yes" : "no";
str classify(int x) = 10 < x ? "big" : "small";
main #init {
status(true) -> owner; // "yes"
status(false) -> owner; // "no"
classify(15) -> owner; // "big"
classify(3) -> owner; // "small"
}
match式
値に対してパターンマッチングを行い、一致したパターンに対応する結果を返します。
script main;
// 基本形式: 値 ? パターン1 => 結果1 ? パターン2 => 結果2 : デフォルト
str status(int code) = code
? 0 => "success"
? 1 => "error"
: "unknown";
main #init {
status(0) -> owner; // "success"
status(1) -> owner; // "error"
status(9) -> owner; // "unknown"
}
as句を使用した変数束縛:
match式の対象となる値に名前を付けて、パターンの結果式で参照できます。
script main;
str check(str code) = code.substr(0, 0) as c
? "A" => "admin:" + c
? "U" => "user:" + c
: "unknown:" + c;
main #init {
check("A01") -> owner; // "admin:A"
check("U99") -> owner; // "user:U"
check("X00") -> owner; // "unknown:X"
}
map式
コレクション(リスト型またはstr型)の各要素を変換して新しいリストを返します。str型の場合、1文字ずつイテレーションされます。
script main;
// 基本形式: map 型 変数 in リスト : 変換式
ilist increment(ilist numbers) = map int n in numbers : n + 1;
// インデックス付き: index キーワードでインデックスを取得
slist with_index(slist items) = map str s in items index i : s + i.to_str();
// レンジ形式: map int 変数 = 開始 to 終了 : 変換式
// 変数はint型のみ。レンジは両端含む(開始 <= 変数 <= 終了)
ilist make_range() = map int i = 0 to 2 : i + 10;
// str型コレクション: 1文字ずつ変換
slist chars(str text) = map str c in text : c + "!";
main #init {
increment([1, 2, 3]).join(", ") -> owner; // "2, 3, 4"
with_index(["a", "b"]).join(", ") -> owner; // "a0, b1"
make_range().join(", ") -> owner; // "10, 11, 12"
chars("hi").join(", ") -> owner; // "h!, i!"
}
find式
リストから条件に一致する最初の要素を検索し、対応する値を返します。パターンマッチ形式と三項演算子形式の2つの構文をサポートしています。
script main;
// パターンマッチ形式: find 型 変数 in リスト : 比較対象 ? パターン => 結果 : デフォルト
// 各要素の先頭文字で種別を判定し、最初に一致した要素から結果を返す
str classify_first(slist codes) =
find str c in codes : c.substr(0, 0)
? "A" => "admin: " + c
? "U" => "user: " + c
: "unknown";
// パターンマッチ形式(as 再束縛): find 型 変数 in リスト : 比較対象 as 識別子 ? パターン => 結果 : デフォルト
// 比較対象の評価結果を新しい識別子に束縛して以降のパターン内で参照可能(match 式の as 再束縛と同等)
// as 識別子の名前がループ変数と同名の場合はループ変数をシャドーする
str classify_upper(slist names) =
find str item in names : item.to_upper() as item
? "ALICE" => "is_alice"
: "none";
// 三項演算子形式: find 型 変数 in リスト : 条件式 ? 真の値 : 偽の値
// 指定キーワードを含む最初のメッセージを返す
str find_with_keyword(slist messages, str keyword) =
find str msg in messages : 0 <= msg.index_of(keyword) ? msg : "not found";
// レンジ形式: find int 変数 = 開始 to 終了 : 三項演算子形式
// 変数はint型のみ。レンジは両端含む(開始 <= 変数 <= 終了)
// 1〜10 で最初に divisor の倍数となる数を返す
str first_multiple_of(int divisor) =
find int i = 1 to 10 : i % divisor == 0 ? "first: " + i.to_str() : "none";
main #init {
classify_first(["X01", "U99", "A02"]) -> owner; // "user: U99"
classify_upper(["bob", "alice", "carol"]) -> owner; // "is_alice"
find_with_keyword(["hello world", "test code", "say hi"], "hi") -> owner; // "say hi"
first_multiple_of(3) -> owner; // "first: 3"
}
fold式
コレクション(リスト型またはstr型)の各要素を集約して単一の値を返します。str型の場合、1文字ずつイテレーションされます。
script main;
// 基本形式: fold 型 変数 in リスト : 集約式
int sum_all(ilist numbers) = fold int n in numbers : n;
str concat_all(slist words) = fold str w in words : w;
// str型コレクション: 1文字ずつ集約
str separate(str text) = fold str c in text : c + ",";
// レンジ形式: fold int 変数 = 開始 to 終了 : 集約式
// 変数はint型のみ。レンジは両端含む(開始 <= 変数 <= 終了)
int sum_range() = fold int i = 0 to 2 : i;
// アキュムレータ付き形式: ループ間で独立した状態を追跡する変数を追加できる
// 構文: fold 型 変数 = 開始 to 終了, アキュムレータ型 アキュムレータ名 = 初期値 : 集約式, 更新式
// コレクション形式: fold 型 変数 in リスト, アキュムレータ型 アキュムレータ名 = 初期値 : 集約式, 更新式
// 各イテレーションで: 1) 集約式を評価して結果を累積、2) 更新式でアキュムレータを更新
str fx() = fold int i = 0 to 2, int acc = 0 : (i + acc).to_str(), i + 1;
// str型コレクション + アキュムレータ: セパレータ付き結合
str join_chars(str text) = fold str c in text, str sep = "" : sep + c, ",";
main #init {
sum_all([1, 2, 3]) -> owner; // 6 (1 + 2 + 3)
concat_all(["a", "b", "c"]) -> owner; // "abc"
separate("abc") -> owner; // "a,b,c,"
sum_range() -> owner; // 3 (0 + 1 + 2)
fx() -> owner; // "024"
join_chars("abc") -> owner; // "a,b,c"
}
定数定義
const <型> <定数識別子> = <定数式>;
定数式にはリテラル値、他の定数参照、およびそれらの演算式を使用できます。 変数参照、関数呼び出し、メソッド呼び出し等の非定数式は使用できません(E0602エラー)。
整数定数式の計算結果が int の範囲(-2147483648〜2147483647)を超える場合は E0308 エラーになります。リテラル同士の式(const int BAD = 2147483647 + 1;)に加え、同一ファイル内の非ライブラリ定数を参照する式(const int MAX = 2147483647; const int BAD = MAX + 1;)も検出対象です。コンパイル時(定数畳み込み)に評価されるため、overflow を含むファイルは LSL 生成がスキップされます。なお、ライブラリ定数(lib::MAX)を介した overflow は現時点では検出されません。この検査は定数定義に限らず、通常の文の中の整数定数式(例: int x = 2147483647 + 1;)にも適用されます。
例:
const int MAX_COUNT = 10;
const str DEFAULT_MESSAGE = "hello";
const int CH_PUBLIC = 0;
const str GREETING = DEFAULT_MESSAGE + " world";
const int DOUBLED = MAX_COUNT * 2;
変数定義
// 新規変数定義
<型> <識別子名> = <式>;
// 変数再代入
<識別子名> = <式>;
例:
script main;
main #init {
int count = 10;
str message = "hello";
count += 1;
message -> owner;
}
ビット演算子
整数(int型)に対してビット演算を行います。Second Lifeのパーミッション処理などで使用します。
| 演算子 | 説明 |
|---|---|
& | ビットAND |
| | ビットOR |
^ | ビットXOR |
script main;
main #init {
int a = 12; // 0b1100
int b = 10; // 0b1010
int and_result = a & b; // 8 (0b1000)
int or_result = a | b; // 14 (0b1110)
int xor_result = a ^ b; // 6 (0b0110)
}
注意: ダイアログ構文でボタンのグルーピングに|を使用する場合、ビットOR演算子と構文が衝突するため、演算式を括弧で囲む必要があります。
int a = 12;
int b = 10;
// NG: a | b の | がボタン区切りと区別できずエラー
a | b | "OK" | @owner:1 -> world;
// OK: 括弧で囲む
(a | b) | "OK" | @owner:1 -> world;
context定義
スクリプトごとのコンテキスト情報を定義します。@スクリプト名で所属スクリプトを指定します。
同一スクリプトに対して複数のcontext定義を行うとE1003エラーになります。
@スクリプト名で指定したスクリプトがscript文で定義されていない場合はE1004エラーになります。
context @<スクリプト名> {
<型> <フィールド名> = <初期値>;
<型> <フィールド名>;
...
}
フィールド初期化子には以下を指定可能:
- リテラル(int / float / str / key / bool / vec / rot / list)
- 定数参照(
CONSTまたはlib::CONST) - 上記を組み合わせた算術式(
+,-,*,/,%、ビット演算&/^/|、論理演算、比較、単項!、括弧)
省略時は型のゼロ値(int=0, str="", bool=false 等)。関数呼び出しや変数参照は使用できない(E0602 InvalidConstExpression)。LSL 生成時、これらの初期化子は定数畳み込みされて単一のリテラル値として出力される(LSL のグローバル変数初期化子は他のグローバル変数を参照できないため)。
例:
const int MAX_COUNT = 100;
const int BASE = 10;
context @main {
int menu = 1;
str text = "default";
int max_value = MAX_COUNT; // 定数参照
int answer = 1 + 2 * 3; // 算術式 → 7
int offset = BASE + 5; // 定数参照を含む算術式 → 15(LSL生成時に畳み込み)
float value; // 初期値なし(ゼロ値)
}
script main;
main #init|context ctx| {
ctx.menu = 2;
ctx.text = "updated";
int current = ctx.menu;
current -> owner;
}
プロパティ定義
// attachable定義(装着時にも#initと#animableの処理を実行)
<スクリプト識別子> #attachable;
// animable定義(アニメーション権限を自動要求)
<スクリプト識別子> #animable;
// cache_linknum定義(primのリンク番号をキャッシュ)
<スクリプト識別子> #cache_linknum;
// memory_limit_kb定義(メモリ上限をKB単位で設定)
<スクリプト識別子> #memory_limit_kb <整数値またはconst参照>;
#cache_linknumを指定すると、primインスタンスのリンク番号をキャッシュする_cache_linknum()関数が生成されます。この関数はstate_entryとattachイベントハンドラの先頭で自動的に呼び出されます。関数の先頭でllLinksetDataDeleteFound("^\\$", "")により$プレフィックス付きの既存キャッシュを全削除してから再キャッシュするため、プリム名の変更にも対応します。
primsグループが定義されている場合、グループに属するprimは個別の名前比較ではなく、プレフィックス+長さによるパターンマッチ条件でまとめて処理されます。これにより生成コードのメモリ使用量が削減されます。グループに属さないprimは従来通り個別の名前比較で処理されます。
#memory_limit_kbを指定すると、state_entryの先頭でllSetMemoryLimitが呼び出されます。値はKB単位で指定し、1024倍されてバイト単位に変換されます。リテラル値のほか、const intで定義した定数を参照することもできます。
script main;
const int MEM_KB = 32;
main #memory_limit_kb MEM_KB; // → llSetMemoryLimit(32768);
main #init {
"Ready" -> owner;
}
primメソッド呼び出し
primインスタンスに対してメソッドを呼び出すことができます。
set_colorメソッド
primのカラーを設定します。
#<prim識別子>.set_color|<face>, <color>, <alpha>|;
パラメータ:
face: 面番号(int)。ALL_SIDESで全面を指定。color: 色(vec)。<R, G, B>形式(各値は0.0〜1.0)。alpha: 透明度(float)。0.0〜1.0。
使用例:
import standard as std;
script main;
main #cache_linknum;
prim obj1;
prim obj2;
main #attachable;
main #init {
#obj1.set_color|std::ALL_SIDES, <1.0, 0.0, 0.0>, 1.0|; // 赤色、不透明
#obj2.set_color|0, <0.0, 1.0, 0.0>, 0.5|; // 面0を緑色、半透明
}
descメソッド
primの説明(Description)を取得します。
str description = #<prim識別子>.desc();
戻り値: str型(プリムの説明文字列)。
使用例:
script main;
main #cache_linknum;
prim btn;
main #init {
#btn.desc() -> world; // primの説明をチャットに出力
}
注意: primメソッドを使用するには#cache_linknum属性が必要です。
早期リターン文
end;
イベントハンドラーおよびプロシージャの実行を早期に終了します。関数では使用できません。
型システム
基本型
- bool: 真偽値型(true/false)。LSLではinteger型に変換(true=1, false=0)。
- int: 整数型(32bit 符号付き。範囲は -2147483648〜2147483647)。定数式の計算結果がこの範囲を超える場合はコンパイルエラー(E0308)。
- float: 浮動小数点数型。
- str: 文字列型。
- key: UUID型。
- vec: ベクター型(3次元)。
- rot: 回転型(4次元クォータニオン)。
型付きリスト
型安全なリスト操作のため、以下の型付きリスト型をサポートしています:
- ilist: 整数リスト型(要素型: int)。
- flist: 浮動小数点数リスト型(要素型: float)。
- slist: 文字列リスト型(要素型: str)。
- vlist: ベクターリスト型(要素型: vec)。
- rlist: 回転リスト型(要素型: rot)。
- klist: キーリスト型(要素型: key)。
例:
ilist numbers = [1, 2, 3];
slist names = ["Alice", "Bob"];
vlist positions = [<0,0,0>, <1,1,1>];
int first = numbers.at(0); // 型が int と推論される
str name = names.at(1); // 型が str と推論される
型互換性ルール
許可される暗黙変換
| 変換元 | 変換先 | 説明 |
|---|---|---|
int | float | 整数から浮動小数点数への変換 |
key | str | UUID型から文字列型への変換 |
klist | slist | キーリストから文字列リストへの変換(key → str のリスト版) |
[](空リスト) | 任意のリスト型 | 空リストは ilist, slist, flist, vlist, rlist, klist のいずれとも互換 |
禁止される暗黙変換
| 変換元 | 変換先 | 説明 |
|---|---|---|
str | key | 文字列型からUUID型への変換は禁止 |
slist | klist | 文字列リストからキーリストへの変換は禁止(str → key と同様) |
float | int | 浮動小数点数から整数への変換は禁止 |
式と演算子
式の構造
項
- リテラル値(数値、文字列、リスト等)
- 識別子
- 関数呼び出し:
<関数名>(<引数リスト>) - ライブラリ関数呼び出し:
<エイリアス名>::<関数名>(<引数リスト>) - メソッド呼び出し:
<プリム>.<メソッド名>(<引数リスト>) - フィールドアクセス:
<プリム>.<フィールド名> - ライブラリ定数アクセス:
<エイリアス名>::<定数名> - インクリメント・デクリメント:
++<変数>,<変数>++,--<変数>,<変数>-- - 括弧式:
(<式>)
演算子(優先順位順)
- 高優先度:
*,/,% - 加減算:
+,- - 比較:
<,<=,>,>=(戻り値型: bool) - 等価:
==,!=(戻り値型: bool) - 論理:
&&,||(戻り値型: bool) - ビット:
&,|,^ - 代入:
+=,-=,*=,/=,%=
単項演算子
- 論理否定:
!<式>
リテラル
// 数値
123, -456 // 整数
123.45, -67.89 // 浮動小数点数
// 文字列
"文字列内容"
// キー(UUID)
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
// ベクター
<x, y, z>
// 回転
<x, y, z, s>
// リスト
[要素1, 要素2, 要素3]
文字列エスケープシーケンス:
\": ダブルクォート\\: バックスラッシュ\/: スラッシュ\n: 改行\r: キャリッジリターン\t: タブ\b,\f: LSL非サポートのため変換されず、\b/\fの2文字のまま出力される\uXXXX: Unicode文字(4桁16進数)※LSL非サポートのため変換されない
メソッド
メソッド呼び出し・チェーン
<プリム>.<メソッド名>(<引数リスト>)
<プリム>.<メソッド1>(<引数>).<メソッド2>(<引数>)
例:
str text = "hello world";
str result = text.substr(0, 5).replace("l", "x"); // "hexxo"
int number = 123;
str formatted = number.to_str().replace("1", "X"); // "X23"
組み込みメソッド
str型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
str.substr(int start, int end) | 部分文字列を取得 | str |
str.delete(int start, int end) | 指定範囲を削除 | str |
str.index_of(str pattern) | パターンの位置を検索 | int |
str.replace(str pattern, str replacement) | パターンを置換 | str |
str.to_int() | 整数に変換 | int |
str.to_key() | キーに変換 | key |
str.split(str separator) | 区切り文字で分割 | slist |
str.len() | 文字列の長さ | int |
str.format(...) | フォーマット(可変引数) | str |
str.json_value(str specifiers) | JSON値を取得 | str |
str.insert(int pos, str src) | 文字列を挿入 | str |
str.to_upper() | 大文字に変換 | str |
str.to_lower() | 小文字に変換 | str |
str text = "Hello, World!";
text.len() // 13
text.substr(0, 5) // "Hello"
text.index_of("World") // 7
text.replace("World", "SL") // "Hello, SL!"
text.to_lower() // "hello, world!"
text.split(", ") // ["Hello", "World!"]
text.insert(5, "!!") // "Hello!!, World!"
text.delete(5, 7) // "Hello World!"
"123".to_int() // 123
型付きリスト型メソッド(共通)
全ての型付きリスト(ilist, flist, slist, vlist, rlist, klist)で使用可能なメソッドです。
| メソッド | 説明 | 戻り値 |
|---|---|---|
.at(int index) | 型安全に要素取得 | 要素型 |
.len() | リストの長さ | int |
.index_of(要素型 test) | 要素の位置を検索 | int |
.exists(要素型 test) | 要素の存在確認 | bool |
.join(str separator) | 要素を結合 | str |
.slice(int start, int end) | 部分リストを取得 | 同じリスト型 |
.delete(int start, int end) | 指定範囲を削除 | 同じリスト型 |
.replace(同型リスト src, int start, int end) | 指定範囲を置換 | 同じリスト型 |
slist names = ["Alice", "Bob", "Charlie"];
names.at(1) // "Bob"
names.len() // 3
names.index_of("Charlie") // 2
names.exists("Alice") // true
names.join(", ") // "Alice, Bob, Charlie"
names.slice(0, 1) // ["Alice", "Bob"]
names.delete(1, 1) // ["Alice", "Charlie"]
ilist nums = [10, 20, 30];
nums.at(0) // 10
nums.len() // 3
int型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
int.to_str() | 文字列に変換 | str |
int.link_key() | リンクのUUIDを取得 | key |
int num = 42;
num.to_str() // "42"
key型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
key.to_str() | 文字列に変換 | str |
key.attached_list() | アタッチリストを取得 | klist |
float型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
float.to_int() | 整数に変換(切り捨て) | int |
float.to_str() | 文字列に変換 | str |
float val = 3.14;
val.to_int() // 3(小数点以下切り捨て)
val.to_str() // "3.14"
vec型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
vec.euler_to_rot() | 回転に変換 | rot |
rot型メソッド
| メソッド | 説明 | 戻り値 |
|---|---|---|
rot.to_euler() | オイラー角に変換 | vec |
フィールドアクセス
vec型フィールド
| フィールド | 型 | 説明 |
|---|---|---|
x | float | X成分 |
y | float | Y成分 |
z | float | Z成分 |
rot型フィールド
| フィールド | 型 | 説明 |
|---|---|---|
x | float | X成分 |
y | float | Y成分 |
z | float | Z成分 |
s | float | S成分(スカラー部分) |
例:
vec position = <1.0, 2.0, 3.0>;
float x = position.x; // 1.0
rot rotation = <0.0, 0.0, 0.0, 1.0>;
float s = rotation.s; // 1.0
// フィールドアクセス後のメソッドチェーン
int x_int = position.x.to_int(); ブロック構文
使用可能な文
ブロック {} 内で使用可能な構文要素:
- 変数定義文
- 変数再代入文
- メッセージ送信文
- プロシージャ呼び出し文
- 条件分岐文(if/elif/else)
- switch文
- for toループ文
- for eachループ文
- 早期リターン文
制御構文
if/elif/else
if <条件> {
// 処理
} elif <条件> {
// 処理
} else {
// 処理
}
while
while <条件> {
// 処理
}
for to
for int <変数名> = <開始> to <終了> {
// 処理
}
例:
script main;
main #init {
for int i = 1 to 10 {
i -> owner;
}
}
for each
for <型> <変数名> in <コレクション> {
// 処理
}
// インデックス付き
for <型> <変数名> in <コレクション> index <インデックス変数> {
// 処理
}
コレクションにはリスト型(ilist, slist, flist等)またはstr型を指定できます。str型の場合、1文字ずつイテレーションされます。
例:
script main;
main #init {
slist my_list = ["apple", "banana", "cherry"];
for str item in my_list {
item -> owner;
}
}
str型コレクションの例:
script main;
main #init {
// str型コレクション(1文字ずつイテレーション)
for str c in "hello" {
c -> world;
}
}
switch
switch <式> {
<パターン1> => <文またはブロック>;
<パターン2> => {
// 複数の文
}
}
単一文として使用可能なもの:メッセージ送信、変数定義、変数再代入、プロシージャ呼び出し、プリムメソッド呼び出し。
例:
script main;
#greet {
"Hello!" -> world;
}
#farewell {
"Goodbye!" -> world;
}
main #listen:0 |str msg| {
switch msg {
"hello" => #greet;
"bye" => {
#farewell;
"See you" -> world;
}
}
}
デフォルトパターン _:
_(ワイルドカード)を使用すると、どのパターンにも一致しなかった場合の処理を記述できます。
switch face {
0 => #btn0.set_color|1, <1.0, 0.0, 0.0>, 1.0|;
1 => #btn1.set_color|1, <0.0, 1.0, 0.0>, 1.0|;
_ => #btn0.set_color|0, <1.0, 1.0, 1.0>, 1.0|;
}
早期リターン
イベントハンドラーおよびプロシージャの実行を早期に終了します。関数では使用できません。
end;
例:
script main;
#greet |str name| {
// nameが空なら何もしない
if name == "" {
end;
}
("Hello, " + name + "!") -> owner;
}
main #init {
#greet|"Alice"|;
#greet|""|; // end; で処理を抜ける
} 標準ライブラリ
使用方法
標準ライブラリ関数を使用するには、standardライブラリをimportし、プレフィックス付きで呼び出す必要があります。
import standard as std;
script main;
str get_value() = std::read_from_lsd("key"); // 正しい
// str get_value() = read_from_lsd("key"); // エラー
各関数の説明では 戻り値型 関数名(引数型 引数名, ...) の形式(Hitoshina Language の宣言と同じ)でシグネチャを示します。
数学関数
int abs(int value)
絶対値を返す。
- 引数:
value(int): 対象となる整数値
- 戻り値:
int— 絶対値
float fabs(float value)
浮動小数点の絶対値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 浮動小数点の絶対値
float sin(float value)
正弦値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 正弦値
float cos(float value)
余弦値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 余弦値
float tan(float value)
正接値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 正接値
float asin(float value)
逆正弦値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 逆正弦値
float acos(float value)
逆余弦値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 逆余弦値
float atan2(float y, float x)
逆正接値を返す。
- 引数:
y(float): Y成分x(float): X成分
- 戻り値:
float— 逆正接値
float log(float value)
自然対数を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 自然対数
float log10(float value)
常用対数を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 常用対数
float pow(float base, float exponent)
累乗を返す。
- 引数:
base(float): 底exponent(float): 指数
- 戻り値:
float— 累乗
float sqrt(float value)
平方根を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
float— 平方根
int ceil(float value)
天井関数(切り上げ)。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
int— 整数
int floor(float value)
床関数(切り下げ)。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
int— 整数
int round(float value)
四捨五入した値を返す。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
int— 四捨五入した値
float frand(float range)
0からrange未満の乱数を返す。
- 引数:
range(float): 乱数の上限(この値未満が返される)
- 戻り値:
float— 0からrange未満の乱数
int mod_pow(int a, int b, int c)
モジュラべき乗 (a^b) mod c を計算。
- 引数:
a(int): 底b(int): 指数c(int): 法(モジュロ)
- 戻り値:
int— (a の b 乗) を c で割った剰余
文字列関数
int string_length(str text)
文字列の長さを返す。
- 引数:
text(str): 対象の文字列
- 戻り値:
int— 文字列の長さ
str get_sub_string(str source, int start, int end)
部分文字列を返す。
- 引数:
source(str): 元の文字列start(int): 開始インデックス(0始まり)end(int): 終了インデックス(0始まり、負値で末尾からの位置)
- 戻り値:
str— 部分文字列
str string_trim(str text, int type)
文字列の前後の空白を削除。
- 引数:
text(str): 対象の文字列type(int): 種別を指定するフラグ値
- 戻り値:
str— 文字列
str to_lower(str text)
文字列を小文字に変換。
- 引数:
text(str): 対象の文字列
- 戻り値:
str— 文字列
str to_upper(str text)
文字列を大文字に変換。
- 引数:
text(str): 対象の文字列
- 戻り値:
str— 文字列
int substring_index(str source, str pattern)
部分文字列の位置を検索。
- 引数:
source(str): 元の文字列pattern(str): 検索パターン文字列
- 戻り値:
int— 部分文字列の位置
str insert_string(str dst, int pos, str src)
文字列を挿入。
- 引数:
dst(str): 対象の文字列pos(int): 挿入位置(0始まりのインデックス)src(str): 元の文字列
- 戻り値:
str— 文字列
str delete_sub_string(str src, int start, int end)
部分文字列を削除。
- 引数:
src(str): 元の文字列start(int): 開始インデックス(0始まり)end(int): 終了インデックス(0始まり、負値で末尾からの位置)
- 戻り値:
str— 文字列
str replace_sub_string(str src, str pattern, str replacement, int count)
部分文字列を置換。
- 引数:
src(str): 元の文字列pattern(str): 検索パターン文字列replacement(str): 置換後の文字列count(int): 置換回数(0で全件置換)
- 戻り値:
str— 文字列
slist parse_string(str src, slist separators, slist spacers)
文字列をリストに分割。
- 引数:
src(str): 元の文字列separators(slist): 区切り文字のリストspacers(slist): スペーサー文字のリスト(区切りつつ結果に含める)
- 戻り値:
slist— 文字列リスト
slist parse_string_keep_nulls(str src, slist separators, slist spacers)
文字列をリストに分割(空要素保持)。
- 引数:
src(str): 元の文字列separators(slist): 区切り文字のリストspacers(slist): スペーサー文字のリスト(区切りつつ結果に含める)
- 戻り値:
slist— 文字列リスト
slist csv_to_list(str src)
CSVをリストに変換。
- 引数:
src(str): 元の文字列
- 戻り値:
slist— 文字列リスト
str list_to_csv(slist src)
リストをCSVに変換。
- 引数:
src(slist): 元のリスト
- 戻り値:
str— 文字列
str dump_list_to_string(slist src, str separator)
リストを文字列に結合。
- 引数:
src(slist): 元のリストseparator(str): 区切り文字列
- 戻り値:
str— 文字列
str char(int val)
Unicodeコードポイントから文字を生成。
- 引数:
val(int): 文字を生成するUnicodeコードポイント
- 戻り値:
str— 生成された1文字の文字列
int ord(str val, int index)
文字列中の指定位置の文字のUnicodeコードポイントを取得。
- 引数:
val(str): 対象の文字列index(int): コードポイントを取得する文字位置(0始まり)
- 戻り値:
int— 指定位置の文字のUnicodeコードポイント
リスト関数
int get_list_length(ilist list)
リストの長さを返す(非推奨: .len()メソッドを使用してください)。
- 引数:
list(ilist): 対象の整数リスト
- 戻り値:
int— 整数
int list_find(slist src, slist test)
リスト内のリストを検索。
- 引数:
src(slist): 元のリストtest(slist): 検索対象のリスト
- 戻り値:
int— リスト内のリスト
slist list_sort(slist src, int stride, int ascending)
リストをソート。
- 引数:
src(slist): 元のリストstride(int): ストライド(処理単位)ascending(int): 昇順なら1、降順なら0
- 戻り値:
slist— 文字列リスト
slist list_random(slist src, int stride)
リストをランダム化。
- 引数:
src(slist): 元のリストstride(int): ストライド(処理単位)
- 戻り値:
slist— 文字列リスト
slist list_insert(slist dst, slist src, int pos)
リストにリストを挿入。
- 引数:
dst(slist): 対象のリストsrc(slist): 元のリストpos(int): 挿入位置(0始まりのインデックス)
- 戻り値:
slist— 文字列リスト
slist list_replace(slist dst, slist src, int start, int end)
リストの要素を置換。
- 引数:
dst(slist): 対象のリストsrc(slist): 元のリストstart(int): 開始インデックス(0始まり)end(int): 終了インデックス(0始まり、負値で末尾からの位置)
- 戻り値:
slist— 文字列リスト
int get_list_entry_type(slist src, int index)
リスト要素の型を取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
int— リスト要素の型
int list_to_int(slist src, int index)
リストから整数を取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
int— リストから整数
float list_to_float(slist src, int index)
リストから浮動小数点を取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
float— リストから浮動小数点
str list_to_string(slist src, int index)
リストから文字列を取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
str— リストから文字列
key list_to_key(slist src, int index)
リストからキーを取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
key— リストからキー
vec list_to_vec(slist src, int index)
リストからベクトルを取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
vec— リストからベクトル
rot list_to_rot(slist src, int index)
リストから回転を取得。
- 引数:
src(slist): 元のリストindex(int): リスト内のインデックス(0始まり)
- 戻り値:
rot— リストから回転
float list_statistics(int operation, flist src)
リストの統計値を計算。
- 引数:
operation(int): 統計操作の種別(std::LIST_STAT_*定数を指定)src(flist): 元のリスト
- 戻り値:
float— リストの統計値
slist list_slice(slist src, int start, int end, int stride, int slice_index)
リストからストライド単位でスライスを抽出。
- 引数:
src(slist): スライス対象のリストstart(int): 抽出開始インデックスend(int): 抽出終了インデックスstride(int): ストライド(要素グループのサイズ)slice_index(int): 各ストライド内で抽出する要素のインデックス
- 戻り値:
slist— 抽出された要素のリスト
slist list_strided(slist src, int start, int end, int stride)
リストからストライド単位で部分リストを取得。
- 引数:
src(slist): 部分リスト抽出対象のリストstart(int): 抽出開始インデックスend(int): 抽出終了インデックスstride(int): ストライド(要素グループのサイズ)
- 戻り値:
slist— ストライド抽出された部分リスト
int list_find_next(slist src, slist test, int instance)
リスト内で指定インスタンス番目の一致位置を検索。
- 引数:
src(slist): 検索対象のリストtest(slist): 検索するリストinstance(int): 取得する一致のインスタンス番号(0始まり、-1で最後)
- 戻り値:
int— 一致開始インデックス(見つからなければ -1)
int list_find_strided(slist src, slist test, int start, int end, int stride)
ストライド境界でリスト内の一致位置を検索。
- 引数:
src(slist): 検索対象のリストtest(slist): 検索するリストstart(int): 検索開始インデックスend(int): 検索終了インデックスstride(int): ストライド(一致を許可する境界の間隔)
- 戻り値:
int— 一致開始インデックス(見つからなければ -1)
slist list_sort_strided(slist src, int stride, int stride_index, int ascending)
ストライド単位でリストをソート。
- 引数:
src(slist): ソート対象のリストstride(int): ストライド(要素グループのサイズ)stride_index(int): ソートキーとするストライド内のインデックスascending(int): 昇順なら TRUE、降順なら FALSE
- 戻り値:
slist— ソート済みのリスト
型変換関数
int str_to_int(str text)
文字列を整数に変換。
- 引数:
text(str): 対象の文字列
- 戻り値:
int— 整数
float str_to_float(str text)
文字列を浮動小数点に変換。
- 引数:
text(str): 対象の文字列
- 戻り値:
float— 浮動小数点数
str int_to_str(int value)
整数を文字列に変換。
- 引数:
value(int): 対象となる整数値
- 戻り値:
str— 文字列
str float_to_str(float value)
浮動小数点を文字列に変換。
- 引数:
value(float): 対象となる浮動小数点数
- 戻り値:
str— 文字列
検出関数
センサーイベントやタッチイベントで使用する、検出情報を取得する関数群です。num 引数はイベント内の検出インデックス(0始まり)を指定します。
int detected_face(int num)
タッチされた面番号を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
int— タッチされた面番号
str detected_name(int num)
検出されたアバター/オブジェクトの名前を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
str— 検出されたアバター/オブジェクトの名前
key detected_key(int num)
検出されたアバター/オブジェクトのキーを取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
key— 検出されたアバター/オブジェクトのキー
vec detected_pos(int num)
検出されたアバター/オブジェクトの位置を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— 検出されたアバター/オブジェクトの位置
rot detected_rot(int num)
検出されたアバター/オブジェクトの回転を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
rot— 検出されたアバター/オブジェクトの回転
vec detected_vel(int num)
検出されたアバター/オブジェクトの速度を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— 検出されたアバター/オブジェクトの速度
vec detected_grab(int num)
検出されたグラブオフセットを取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— 検出されたグラブオフセット
int detected_type(int num)
検出されたアバター/オブジェクトのタイプを取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
int— 検出されたアバター/オブジェクトのタイプ
key detected_group(int num)
検出されたアバター/オブジェクトのグループキーを取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
key— 検出されたアバター/オブジェクトのグループキー
key detected_owner(int num)
検出されたオブジェクトの所有者キーを取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
key— 検出されたオブジェクトの所有者キー
int detected_link_number(int num)
検出されたリンク番号を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
int— 検出されたリンク番号
vec detected_touch_st(int num)
タッチされたテクスチャ座標(ST)を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— タッチされたテクスチャ座標(ST)
vec detected_touch_uv(int num)
タッチされたテクスチャ座標(UV)を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— タッチされたテクスチャ座標(UV)
vec detected_touch_normal(int num)
タッチされた面の法線を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— タッチされた面の法線
vec detected_touch_binormal(int num)
タッチされた面の従法線を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— タッチされた面の従法線
vec detected_touch_pos(int num)
タッチされたワールド座標を取得。
- 引数:
num(int): イベント内の検出インデックス(0始まり)
- 戻り値:
vec— タッチされたワールド座標
プリムプロパティ関数
key get_owner()
プリムの所有者のキーを取得。
- 引数: なし
- 戻り値:
key— プリムの所有者のキー
key get_owner_key(key id)
指定されたオブジェクトの所有者キーを取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
key— 指定されたオブジェクトの所有者キー
key get_key()
プリムのキーを取得。
- 引数: なし
- 戻り値:
key— プリムのキー
str get_prim_name()
プリムの名前を取得。
- 引数: なし
- 戻り値:
str— プリムの名前
int get_link_num()
スクリプトが収められているプリムのリンク番号を取得。
- 引数: なし
- 戻り値:
int— スクリプトが収められているプリムのリンク番号
str link_name(int linknum)
リンク番号からリンク名を取得。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)
- 戻り値:
str— リンク番号からリンク名
vec get_pos()
プリムのワールド位置を取得。
- 引数: なし
- 戻り値:
vec— プリムのワールド位置
rot get_rot()
プリムのワールド回転を取得。
- 引数: なし
- 戻り値:
rot— プリムのワールド回転
vec get_scale()
プリムのスケールを取得。
- 引数: なし
- 戻り値:
vec— プリムのスケール
vec get_local_pos()
プリムのローカル位置を取得。
- 引数: なし
- 戻り値:
vec— プリムのローカル位置
rot local_rot()
プリムのローカル回転を取得。
- 引数: なし
- 戻り値:
rot— プリムのローカル回転
vec get_root_pos()
ルートプリムの位置を取得。
- 引数: なし
- 戻り値:
vec— ルートプリムの位置
rot get_root_rot()
ルートプリムの回転を取得。
- 引数: なし
- 戻り値:
rot— ルートプリムの回転
float get_alpha(int face)
プリムのアルファ値を取得。
- 引数:
face(int): 面番号(-1で全面)
- 戻り値:
float— プリムのアルファ値
vec get_color(int face)
プリムの色を取得。
- 引数:
face(int): 面番号(-1で全面)
- 戻り値:
vec— プリムの色
str get_texture(int face)
テクスチャ名を取得。
- 引数:
face(int): 面番号(-1で全面)
- 戻り値:
str— テクスチャ名
str get_object_desc()
オブジェクトの説明を取得。
- 引数: なし
- 戻り値:
str— オブジェクトの説明
key get_creator()
オブジェクトの作成者キーを取得。
- 引数: なし
- 戻り値:
key— オブジェクトの作成者キー
int get_number_of_prims()
リンクセット内のプリム数を取得。
- 引数: なし
- 戻り値:
int— リンクセット内のプリム数
int get_number_of_sides()
プリムの面数を取得。
- 引数: なし
- 戻り値:
int— プリムの面数
key get_link_key(int linknum)
リンク番号からキーを取得。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)
- 戻り値:
key— リンク番号からキー
int get_object_prim_count(key id)
オブジェクトのプリム数を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
int— オブジェクトのプリム数
float get_mass()
プリムの質量を取得。
- 引数: なし
- 戻り値:
float— プリムの質量
float get_object_mass(key id)
オブジェクトの質量を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
float— オブジェクトの質量
slist get_link_prim_params(int linknum, ilist rules)
リンクプリムのパラメータリストを取得。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)rules(ilist): ルールリスト(プリムパラメータ定数列)
- 戻り値:
slist— リンクプリムのパラメータリスト
slist get_object_details(key id, ilist params)
オブジェクトの詳細情報を取得。
- 引数:
id(key): 対象のキー(UUID)params(ilist): パラメータリスト
- 戻り値:
slist— オブジェクトの詳細情報
slist get_bounding_box(key object)
オブジェクトのバウンディングボックスを取得。
- 引数:
object(key): バウンディングボックスを取得する対象のキー
- 戻り値:
slist— 最小コーナーと最大コーナーの2ベクトルのリスト
vec get_center_of_mass()
オブジェクトの質量中心を取得。
- 引数: なし
- 戻り値:
vec— オブジェクトの質量中心のワールド座標
vec get_geometric_center()
オブジェクトの幾何中心を取得。
- 引数: なし
- 戻り値:
vec— ルートプリム基準の幾何中心オフセット
int get_link_number_of_sides(int link)
リンクプリムの面数を取得。
- 引数:
link(int): 対象のリンク番号またはLINK定数
- 戻り値:
int— リンクプリムの面(サイド)数
float get_mass_mks()
オブジェクトの質量をMKS単位(kg)で取得。
- 引数: なし
- 戻り値:
float— オブジェクトの質量(kg)
float get_max_scale_factor()
オブジェクトを拡大できる最大係数を取得。
- 引数: なし
- 戻り値:
float— 拡大可能な最大の倍率
float get_min_scale_factor()
オブジェクトを縮小できる最小係数を取得。
- 引数: なし
- 戻り値:
float— 縮小可能な最小の倍率
slist get_primitive_params(slist params)
プリムのパラメータリストを取得。
- 引数:
params(slist): 取得するPRIM_*定数の指定子リスト
- 戻り値:
slist— 要求したPRIM_*パラメータの値リスト
int scale_by_factor(float scaling_factor)
オブジェクト全体を係数倍にリサイズ。
- 引数:
scaling_factor(float): オブジェクト全体を拡大縮小する係数
- 戻り値:
int— リサイズの成否を示すステータス(成功でTRUE)
vec get_texture_offset(int face)
面のテクスチャオフセットを取得。
- 引数:
face(int): 対象の面番号(ALL_SIDESで全面)
- 戻り値:
vec— 面のテクスチャオフセット(U/Vのベクトル)
float get_texture_rot(int face)
面のテクスチャ回転を取得。
- 引数:
face(int): 対象の面番号(ALL_SIDESで全面)
- 戻り値:
float— 面のテクスチャ回転角(ラジアン)
vec get_texture_scale(int face)
面のテクスチャスケールを取得。
- 引数:
face(int): 対象の面番号(ALL_SIDESで全面)
- 戻り値:
vec— 面のテクスチャスケール(U/Vのベクトル)
slist get_prim_media_params(int face, slist params)
面のメディアパラメータを取得。
- 引数:
face(int): 対象の面番号params(slist): 取得するPRIM_MEDIA_*定数のリスト
- 戻り値:
slist— 要求したメディアパラメータの値リスト
int set_prim_media_params(int face, slist params)
面のメディアパラメータを設定。
- 引数:
face(int): 対象の面番号params(slist): PRIM_MEDIA_*定数と値のパラメータリスト
- 戻り値:
int— 設定の成否を示すステータス(STATUS_OK等)
int clear_prim_media(int face)
面のメディアを消去。
- 引数:
face(int): メディアを消去する面番号
- 戻り値:
int— 消去の成否を示すステータス(STATUS_OK等)
slist get_link_media(int link, int face, slist params)
リンクプリムの面のメディアパラメータを取得。
- 引数:
link(int): 対象のリンク番号またはLINK定数face(int): 対象の面番号params(slist): 取得するPRIM_MEDIA_*定数のリスト
- 戻り値:
slist— 要求したメディアパラメータの値リスト
int set_link_media(int link, int face, slist params)
リンクプリムの面のメディアパラメータを設定。
- 引数:
link(int): 対象のリンク番号またはLINK定数face(int): 対象の面番号params(slist): PRIM_MEDIA_*定数と値のパラメータリスト
- 戻り値:
int— 設定の成否を示すステータス(STATUS_OK等)
int clear_link_media(int link, int face)
リンクプリムの面のメディアを消去。
- 引数:
link(int): 対象のリンク番号またはLINK定数face(int): メディアを消去する面番号
- 戻り値:
int— 消去の成否を示すステータス(STATUS_OK等)
インベントリ関数
int get_inventory_type(str name)
指定された名前のインベントリアイテムのタイプを取得。
- 引数:
name(str): 対象の名前
- 戻り値:
int— 指定された名前のインベントリアイテムのタイプ
int get_inventory_num(int type)
指定されたタイプのインベントリアイテム数を取得。
- 引数:
type(int): 種別を指定するフラグ値
- 戻り値:
int— 指定されたタイプのインベントリアイテム数
str get_inventory_name(int type, int index)
指定されたタイプとインデックスのインベントリアイテム名を取得。
- 引数:
type(int): 種別を指定するフラグ値index(int): リスト内のインデックス(0始まり)
- 戻り値:
str— 指定されたタイプとインデックスのインベントリアイテム名
key get_inventory_key(str name)
インベントリアイテムのキーを取得。
- 引数:
name(str): 対象の名前
- 戻り値:
key— インベントリアイテムのキー
key get_inventory_creator(str name)
インベントリアイテムの作成者を取得。
- 引数:
name(str): 対象の名前
- 戻り値:
key— インベントリアイテムの作成者
int get_inventory_perm_mask(str name, int category)
インベントリアイテムのパーミッションマスクを取得。
- 引数:
name(str): 対象の名前category(int): カテゴリを指定する定数値
- 戻り値:
int— インベントリアイテムのパーミッションマスク
int give_agent_inventory(key agent, str folder, slist inventory, slist options)
アバターにインベントリをフォルダで渡す。
- 引数:
agent(key): インベントリを渡す相手のキーfolder(str): 渡す際に作成するフォルダ名inventory(slist): 渡すインベントリアイテム名のリストoptions(slist): 受け渡しオプションのリスト
- 戻り値:
int— 受け渡しの成否を示すステータス(成功でTRUE)
str get_inventory_desc(str item)
インベントリアイテムの説明を取得。
- 引数:
item(str): 対象のインベントリアイテム名
- 戻り値:
str— インベントリアイテムの説明文字列
str get_inventory_acquire_time(str item)
インベントリアイテムの取得時刻を取得。
- 引数:
item(str): 対象のインベントリアイテム名
- 戻り値:
str— アイテムが追加された日時のタイムスタンプ文字列
key request_inventory_data(str name)
インベントリアイテムのデータをリクエスト。
- 引数:
name(str): データをリクエストするインベントリアイテム名
- 戻り値:
key— インベントリデータ要求の識別キー(dataserverイベントで結果が返る)
アバター/エージェント関数
key name_to_key(str name)
アバター名からキーを取得。
- 引数:
name(str): 対象の名前
- 戻り値:
key— アバター名からキー
str key_to_name(key id)
キーから名前を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
str— キーから名前
int get_agent_info(key id)
エージェント情報フラグを取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
int— エージェント情報フラグ
str get_agent_language(key id)
エージェントの言語設定を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
str— エージェントの言語設定
klist get_agent_list(int scope, ilist options)
エージェントリストを取得。
- 引数:
scope(int): 対象スコープ(AGENT_LIST_*定数)options(ilist): オプションリスト
- 戻り値:
klist— エージェントリスト
vec get_agent_size(key id)
アバターのサイズを取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
vec— アバターのサイズ
str get_display_name(key id)
表示名を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
str— 表示名
str get_username(key id)
ユーザー名を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
str— ユーザー名
key avatar_on_sit_target()
シットターゲット上のアバターキーを取得。
- 引数: なし
- 戻り値:
key— シットターゲット上のアバターキー
key avatar_on_link_sit_target(int linknum)
リンクシットターゲット上のアバターキーを取得。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)
- 戻り値:
key— リンクシットターゲット上のアバターキー
int get_permissions()
現在のパーミッションフラグを取得。
- 引数: なし
- 戻り値:
int— 現在のパーミッションフラグ
key get_permissions_key()
パーミッションを付与したアバターのキーを取得。
- 引数: なし
- 戻り値:
key— パーミッションを付与したアバターのキー
int get_attached()
アタッチメントポイントを取得。
- 引数: なし
- 戻り値:
int— アタッチメントポイント
int same_group(key id)
同じグループかどうかを判定。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
int— 同じグループかどうか
str get_animation(key id)
アバターのアニメーション名を取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
str— アバターのアニメーション名
klist get_animation_list(key id)
アバターのアニメーションリストを取得。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
klist— アバターのアニメーションリスト
vec get_camera_pos()
カメラのワールド位置を取得。
- 引数: なし
- 戻り値:
vec— カメラのワールド位置ベクトル
rot get_camera_rot()
カメラのワールド回転を取得。
- 引数: なし
- 戻り値:
rot— カメラのワールド回転
float get_camera_aspect()
カメラのアスペクト比を取得。
- 引数: なし
- 戻り値:
float— カメラのアスペクト比(幅÷高さ)
float get_camera_fov()
カメラの視野角(FOV)を取得。
- 引数: なし
- 戻り値:
float— カメラの視野角(ラジアン)
int is_friend(key agent_id)
指定アバターがフレンドか判定。
- 引数:
agent_id(key): フレンド判定するアバターのキー
- 戻り値:
int— 対象がフレンドなら TRUE、そうでなければ FALSE
int agent_in_experience(key agent)
指定アバターがExperienceに参加しているか判定。
- 引数:
agent(key): Experience参加を判定するアバターのキー
- 戻り値:
int— ExperienceにOptInしていれば TRUE、そうでなければ FALSE
slist get_object_animation_names()
オブジェクトで再生中のアニメーション名一覧を取得。
- 引数: なし
- 戻り値:
slist— 再生中のオブジェクトアニメーション名のリスト
str get_animation_override(str anim_state)
アニメーション状態のオーバーライド名を取得。
- 引数:
anim_state(str): オーバーライドを取得するアニメーション状態名
- 戻り値:
str— 指定状態に設定されたアニメーション名
slist get_attached_list_filtered(key avatar, slist options)
フィルタ付きでアバターのアタッチメント一覧を取得。
- 引数:
avatar(key): 対象アバターのキーoptions(slist): フィルタオプションのリスト(ATTACH_*等)
- 戻り値:
slist— フィルタ条件に一致するアタッチメントのリスト
key request_display_name(key id)
アバターの表示名をリクエスト。
- 引数:
id(key): 名前を取得するアバターのキー
- 戻り値:
key— 表示名リクエストの識別キー(dataserverイベントで結果が返る)
key request_username(key id)
アバターのユーザー名をリクエスト。
- 引数:
id(key): 名前を取得するアバターのキー
- 戻り値:
key— ユーザー名リクエストの識別キー(dataserverイベントで結果が返る)
key request_user_key(str username)
ユーザー名からキーをリクエスト。
- 引数:
username(str): キーを取得するユーザー名
- 戻り値:
key— キーリクエストの識別キー(dataserverイベントで結果が返る)
ベクトル/回転関数
float vec_dist(vec a, vec b)
2つのベクトル間の距離を計算。
- 引数:
a(vec): 1つ目のベクトルb(vec): 2つ目のベクトル
- 戻り値:
float— 2つのベクトル間の距離
float vec_mag(vec v)
ベクトルの大きさを計算。
- 引数:
v(vec): 対象のベクトル
- 戻り値:
float— ベクトルの大きさ
vec vec_norm(vec v)
ベクトルを正規化。
- 引数:
v(vec): 対象のベクトル
- 戻り値:
vec— 3次元ベクトル
rot rot_between(vec start, vec end)
2つのベクトル間の回転を計算。
- 引数:
start(vec): 開始ベクトルend(vec): 終了ベクトル
- 戻り値:
rot— 2つのベクトル間の回転
rot euler_to_rot(vec v)
オイラー角を回転に変換。
- 引数:
v(vec): 対象のベクトル
- 戻り値:
rot— 回転(クォータニオン)
vec rot_to_euler(rot r)
回転をオイラー角に変換。
- 引数:
r(rot): 対象の回転
- 戻り値:
vec— 3次元ベクトル
rot axes_to_rot(vec fwd, vec left, vec up)
3軸から回転を生成。
- 引数:
fwd(vec): 前方ベクトルleft(vec): 左方ベクトルup(vec): 上方ベクトル
- 戻り値:
rot— 3軸から回転
vec rot_to_fwd(rot r)
回転の前方ベクトルを取得。
- 引数:
r(rot): 対象の回転
- 戻り値:
vec— 回転の前方ベクトル
vec rot_to_left(rot r)
回転の左方ベクトルを取得。
- 引数:
r(rot): 対象の回転
- 戻り値:
vec— 回転の左方ベクトル
vec rot_to_up(rot r)
回転の上方ベクトルを取得。
- 引数:
r(rot): 対象の回転
- 戻り値:
vec— 回転の上方ベクトル
float angle_between(rot a, rot b)
2つの回転間の角度を計算。
- 引数:
a(rot): 1つ目の回転b(rot): 2つ目の回転
- 戻り値:
float— 2つの回転間の角度
rot axis_angle_to_rot(vec axis, float angle)
軸と角度から回転を生成。
- 引数:
axis(vec): 回転軸ベクトルangle(float):angle(float型)
- 戻り値:
rot— 軸と角度から回転
vec linear_to_srgb(vec linear)
リニア色空間をsRGB色空間に変換。
- 引数:
linear(vec): 変換元のリニア色空間ベクトル
- 戻り値:
vec— sRGB色空間のベクトル
vec srgb_to_linear(vec srgb)
sRGB色空間をリニア色空間に変換。
- 引数:
srgb(vec): 変換元のsRGB色空間ベクトル
- 戻り値:
vec— リニア色空間のベクトル
HTTP関数
key http_request(str url, slist params, str body)
HTTPリクエストを送信。
- 引数:
url(str): 対象のURLparams(slist): パラメータリストbody(str): HTTPボディ
- 戻り値:
key— HTTPリクエスト
int get_free_urls()
利用可能なURL数を取得。
- 引数: なし
- 戻り値:
int— 利用可能なURL数
str get_http_header(key request_id, str header)
HTTPヘッダーを取得。
- 引数:
request_id(key): HTTPリクエストIDheader(str): ヘッダー名
- 戻り値:
str— HTTPヘッダー
str escape_url(str url)
URLをエスケープ。
- 引数:
url(str): 対象のURL
- 戻り値:
str— 文字列
str unescape_url(str url)
URLをアンエスケープ。
- 引数:
url(str): 対象のURL
- 戻り値:
str— 文字列
key request_url()
URLをリクエスト。
- 引数: なし
- 戻り値:
key— キー(UUID)
key request_secure_url()
セキュアURLをリクエスト。
- 引数: なし
- 戻り値:
key— キー(UUID)
物理/移動関数
vec get_force()
プリムに加わる力を取得。
- 引数: なし
- 戻り値:
vec— プリムに加わる力
vec get_torque()
プリムに加わるトルクを取得。
- 引数: なし
- 戻り値:
vec— プリムに加わるトルク
vec get_vel()
プリムの速度を取得。
- 引数: なし
- 戻り値:
vec— プリムの速度
vec get_accel()
プリムの加速度を取得。
- 引数: なし
- 戻り値:
vec— プリムの加速度
vec get_omega()
プリムの角速度を取得。
- 引数: なし
- 戻り値:
vec— プリムの角速度
slist get_physics_material()
プリムの物理マテリアルを取得。
- 引数: なし
- 戻り値:
slist— 重力係数・反発・摩擦・密度を含む物理マテリアルのリスト
土地/環境関数
float ground(vec offset)
地面の高さを取得。
- 引数:
offset(vec): オフセット位置
- 戻り値:
float— 地面の高さ
float water(vec offset)
水面の高さを取得。
- 引数:
offset(vec): オフセット位置
- 戻り値:
float— 水面の高さ
vec wind(vec offset)
風のベクトルを取得。
- 引数:
offset(vec): オフセット位置
- 戻り値:
vec— 風のベクトル
vec get_sun_direction()
太陽の方向を取得。
- 引数: なし
- 戻り値:
vec— 太陽の方向
str get_region_name()
リージョン名を取得。
- 引数: なし
- 戻り値:
str— リージョン名
vec get_region_corner()
リージョンのコーナー座標を取得。
- 引数: なし
- 戻り値:
vec— リージョンのコーナー座標
float get_region_fps()
リージョンのFPSを取得。
- 引数: なし
- 戻り値:
float— リージョンのFPS
float get_region_time_dilation()
リージョンのタイムディレーションを取得。
- 引数: なし
- 戻り値:
float— リージョンのタイムディレーション
int get_region_agent_count()
リージョン内のエージェント数を取得。
- 引数: なし
- 戻り値:
int— リージョン内のエージェント数
float get_sim_stats(int stat_type)
シミュレーター統計を取得。
- 引数:
stat_type(int): 統計種別を指定する定数
- 戻り値:
float— シミュレーター統計
str get_env(str name)
環境変数を取得。
- 引数:
name(str): 対象の名前
- 戻り値:
str— 環境変数
int get_parcel_flags(vec pos)
パーセルフラグを取得。
- 引数:
pos(vec): 位置(リージョン座標)
- 戻り値:
int— パーセルフラグ
slist get_parcel_details(vec pos, ilist params)
パーセル詳細情報を取得。
- 引数:
pos(vec): 位置(リージョン座標)params(ilist): パラメータリスト
- 戻り値:
slist— パーセル詳細情報
int get_parcel_prim_count(vec pos, int category, int sim_wide)
パーセルのプリム数を取得。
- 引数:
pos(vec): 位置(リージョン座標)category(int): カテゴリを指定する定数値sim_wide(int): リージョン全体を対象とするなら1、パーセル内なら0
- 戻り値:
int— パーセルのプリム数
int get_day_length()
パーセルの一日の長さ(秒)を取得。
- 引数: なし
- 戻り値:
int— パーセルの一日の長さ(秒)
int get_day_offset()
パーセルの一日のオフセット(秒)を取得。
- 引数: なし
- 戻り値:
int— パーセルの一日のオフセット(秒)
float get_time_of_day()
パーセルの一日の中の現在時刻(秒)を取得。
- 引数: なし
- 戻り値:
float— パーセルの一日の中の経過秒数
int get_region_day_length()
リージョンの一日の長さ(秒)を取得。
- 引数: なし
- 戻り値:
int— リージョンの一日の長さ(秒)
int get_region_day_offset()
リージョンの一日のオフセット(秒)を取得。
- 引数: なし
- 戻り値:
int— リージョンの一日のオフセット(秒)
float get_region_time_of_day()
リージョンの一日の中の現在時刻(秒)を取得。
- 引数: なし
- 戻り値:
float— リージョンの一日の中の経過秒数
vec get_moon_direction()
パーセルの月の方向ベクトルを取得。
- 引数: なし
- 戻り値:
vec— パーセルの月の方向を示す単位ベクトル
rot get_moon_rotation()
パーセルの月の回転を取得。
- 引数: なし
- 戻り値:
rot— パーセルの月に適用される回転
rot get_sun_rotation()
パーセルの太陽の回転を取得。
- 引数: なし
- 戻り値:
rot— パーセルの太陽に適用される回転
vec get_region_moon_direction()
リージョンの月の方向ベクトルを取得。
- 引数: なし
- 戻り値:
vec— リージョンの月の方向を示す単位ベクトル
rot get_region_moon_rotation()
リージョンの月の回転を取得。
- 引数: なし
- 戻り値:
rot— リージョンの月に適用される回転
vec get_region_sun_direction()
リージョンの太陽の方向ベクトルを取得。
- 引数: なし
- 戻り値:
vec— リージョンの太陽の方向を示す単位ベクトル
rot get_region_sun_rotation()
リージョンの太陽の回転を取得。
- 引数: なし
- 戻り値:
rot— リージョンの太陽に適用される回転
slist get_environment(vec pos, slist params)
指定位置の環境設定を取得。
- 引数:
pos(vec): 環境を取得する位置ベクトルparams(slist): 取得する環境パラメータの指定子リスト
- 戻り値:
slist— 要求した環境パラメータの値リスト
int set_environment(vec position, slist params)
指定位置に環境設定を適用。
- 引数:
position(vec): 環境を適用する位置ベクトルparams(slist): 適用する環境パラメータのリスト
- 戻り値:
int— 適用の成否を示すステータス(成功でTRUE)
int replace_environment(vec position, str environment, int track_no, int day_length, int day_offset)
指定位置の環境を昼サイクルごと置換。
- 引数:
position(vec): 環境を置換する位置ベクトルenvironment(str): 適用する環境設定アセット名またはUUIDtrack_no(int): 対象の環境トラック番号day_length(int): 一日の長さ(秒)day_offset(int): 一日のオフセット(秒)
- 戻り値:
int— 置換の成否を示すステータス(成功でTRUE)
int set_agent_environment(key agent_id, float transition, slist params)
エージェントの環境設定を適用。
- 引数:
agent_id(key): 対象エージェントのキーtransition(float): 環境遷移にかける時間(秒)params(slist): 適用する環境パラメータのリスト
- 戻り値:
int— 適用の成否を示すステータス(成功でTRUE)
int replace_agent_environment(key agent_id, float transition, str environment)
エージェントの環境を置換。
- 引数:
agent_id(key): 対象エージェントのキーtransition(float): 環境遷移にかける時間(秒)environment(str): 適用する環境設定アセット名またはUUID
- 戻り値:
int— 置換の成否を示すステータス(成功でTRUE)
int set_ground_texture(slist changes)
リージョンの地形テクスチャを設定。
- 引数:
changes(slist): 地形テクスチャの変更内容リスト
- 戻り値:
int— 地形テクスチャ設定の結果ステータス
slist parcel_media_query(slist query)
パーセルメディアの状態を問い合わせ。
- 引数:
query(slist): 問い合わせるPARCEL_MEDIA_COMMAND_*定数のリスト
- 戻り値:
slist— 問い合わせ結果の値リスト
int manage_estate_access(int action, key avatar)
Estateアクセスリストを管理。
- 引数:
action(int): 操作種別を示すESTATE_ACCESS_*定数avatar(key): 対象のアバターまたはグループのキー
- 戻り値:
int— 操作の成否を示すステータス(成功でTRUE)
int return_objects_by_id(klist objects)
指定IDのオブジェクト群を所有者へ返却。
- 引数:
objects(klist): 返却するオブジェクトのキーリスト
- 戻り値:
int— 返却したオブジェクト数、またはエラー時の負の値
int return_objects_by_owner(key owner, int scope)
指定所有者のオブジェクト群を返却。
- 引数:
owner(key): 返却対象オブジェクトの所有者キーscope(int): 返却範囲を示す定数(OBJECT_RETURN_*)
- 戻り値:
int— 返却したオブジェクト数、またはエラー時の負の値
int get_parcel_max_prims(vec pos, int sim_wide)
パーセルの最大プリム数を取得。
- 引数:
pos(vec): 対象パーセル内の位置ベクトルsim_wide(int): リージョン全体の合計ならTRUE、パーセル単体ならFALSE
- 戻り値:
int— パーセルに配置可能な最大プリム数
slist get_parcel_prim_owners(vec pos)
パーセル上のプリム所有者一覧を取得。
- 引数:
pos(vec): 対象パーセル内の位置ベクトル
- 戻り値:
slist— 所有者キーとプリム数が交互に並ぶリスト
str get_parcel_music_url()
パーセルの音楽ストリームURLを取得。
- 引数: なし
- 戻り値:
str— パーセルの音楽ストリームURL(権限がなければ空文字列)
vec ground_slope(vec offset)
指定位置の地面の傾きを取得。
- 引数:
offset(vec): オブジェクト位置からのオフセットベクトル
- 戻り値:
vec— 指定位置の地面の傾きを示すベクトル
vec ground_normal(vec offset)
指定位置の地面の法線を取得。
- 引数:
offset(vec): オブジェクト位置からのオフセットベクトル
- 戻り値:
vec— 指定位置の地面の法線ベクトル
vec ground_contour(vec offset)
指定位置の地面の輪郭ベクトルを取得。
- 引数:
offset(vec): オブジェクト位置からのオフセットベクトル
- 戻り値:
vec— 指定位置の地面の輪郭(等高線方向)ベクトル
int edge_of_world(vec pos, vec dir)
指定方向にリージョン境界があるか判定。
- 引数:
pos(vec): 判定の起点となる位置ベクトルdir(vec): 判定する方向ベクトル
- 戻り値:
int— 指定方向にリージョン境界があれば TRUE、なければ FALSE
エンコーディング/暗号関数
str md5(str src, int nonce)
MD5ハッシュを計算。
- 引数:
src(str): 元の文字列nonce(int): ノンス値(0で無し)
- 戻り値:
str— MD5ハッシュ
str sha1(str src)
SHA1ハッシュを計算。
- 引数:
src(str): 元の文字列
- 戻り値:
str— SHA1ハッシュ
str sha256(str src)
SHA256ハッシュを計算。
- 引数:
src(str): 元の文字列
- 戻り値:
str— SHA256ハッシュ
str base64_encode(str src)
文字列をBase64エンコード。
- 引数:
src(str): 元の文字列
- 戻り値:
str— 文字列
str base64_decode(str src)
Base64文字列をデコード。
- 引数:
src(str): 元の文字列
- 戻り値:
str— 文字列
str integer_to_base64(int number)
整数をBase64エンコード。
- 引数:
number(int): 対象の整数
- 戻り値:
str— 文字列
int base64_to_integer(str src)
Base64文字列を整数にデコード。
- 引数:
src(str): 元の文字列
- 戻り値:
int— 整数
str xor_base64(str s1, str s2)
XOR Base64エンコード。
- 引数:
s1(str): 1つ目の文字列s2(str): 2つ目の文字列
- 戻り値:
str— 文字列
str json_get_value(str json, slist specifiers)
JSON値を取得。
- 引数:
json(str): JSON文字列specifiers(slist): JSONパス指定子のリスト
- 戻り値:
str— JSON値
str json_set_value(str json, slist specifiers, str value)
JSON値を設定。
- 引数:
json(str): JSON文字列specifiers(slist): JSONパス指定子のリストvalue(str): 対象となる文字列
- 戻り値:
str— 文字列
slist json_to_list(str src)
JSON文字列をリストに変換。
- 引数:
src(str): リストに変換するJSON文字列
- 戻り値:
slist— JSONの要素を展開したリスト
str list_to_json(str json_type, slist values)
リストをJSON文字列に変換。
- 引数:
json_type(str): 生成するJSONの種別(JSON_ARRAY または JSON_OBJECT)values(slist): JSONに変換する値のリスト
- 戻り値:
str— 生成されたJSON文字列
str json_value_type(str json, slist specifiers)
JSON内の指定位置の値の型を取得。
- 引数:
json(str): 型を調べるJSON文字列specifiers(slist): JSON内の参照先を示す指定子のリスト
- 戻り値:
str— 値の型を示すJSON_*定数文字列
int hash(str val)
文字列の32ビットハッシュ値を計算。
- 引数:
val(str): ハッシュを計算する文字列
- 戻り値:
int— 32ビットのハッシュ整数
str hmac(str private_key, str msg, str algorithm)
メッセージのHMACを計算。
- 引数:
private_key(str): HMACに用いる秘密鍵msg(str): HMACを計算する対象メッセージalgorithm(str): 使用するハッシュアルゴリズム(md5/sha1/sha256等)
- 戻り値:
str— 16進数エンコードされたHMACダイジェスト
str compute_hash(str message, str algorithm)
指定アルゴリズムでメッセージのハッシュを計算。
- 引数:
message(str): ハッシュを計算する対象メッセージalgorithm(str): 使用するハッシュアルゴリズム(md5/sha1/sha256等)
- 戻り値:
str— 16進数エンコードされたハッシュダイジェスト
key generate_key()
ランダムなUUIDキーを生成。
- 引数: なし
- 戻り値:
key— 生成されたランダムなキー
str sign_rsa(str private_key, str msg, str algorithm)
RSA秘密鍵でメッセージに署名。
- 引数:
private_key(str): 署名に用いるRSA秘密鍵msg(str): 署名する対象メッセージalgorithm(str): 使用するハッシュアルゴリズム
- 戻り値:
str— Base64エンコードされた署名
int verify_rsa(str public_key, str msg, str signature, str algorithm)
RSA公開鍵で署名を検証。
- 引数:
public_key(str): 検証に用いるRSA公開鍵msg(str): 検証する対象メッセージsignature(str): 検証する署名algorithm(str): 署名生成に使用したハッシュアルゴリズム
- 戻り値:
int— 署名が有効なら TRUE、無効なら FALSE
時間/日付関数
float get_time()
スクリプト実行時間を取得。
- 引数: なし
- 戻り値:
float— スクリプト実行時間
float get_and_reset_time()
スクリプト実行時間を取得しリセット。
- 引数: なし
- 戻り値:
float— 浮動小数点数
str get_timestamp()
タイムスタンプ文字列を取得。
- 引数: なし
- 戻り値:
str— タイムスタンプ文字列
int get_unix_time()
Unix時間を取得。
- 引数: なし
- 戻り値:
int— Unix時間
float get_gmt_time()
GMT時間を取得。
- 引数: なし
- 戻り値:
float— GMT時間
float get_wall_clock()
ウォールクロック時間を取得。
- 引数: なし
- 戻り値:
float— ウォールクロック時間
str get_date()
日付文字列を取得。
- 引数: なし
- 戻り値:
str— 日付文字列
システム関数
str script_name()
スクリプト名を取得。
- 引数: なし
- 戻り値:
str— スクリプト名
str read_from_lsd(str name)
linksetデータストアの値を取得。
- 引数:
name(str): 対象の名前
- 戻り値:
str— linksetデータストアの値
slist find_lsd_keys(str pattern)
linksetデータストアからパターンに一致するキー名のリストを取得。
- 引数:
pattern(str): 検索パターン文字列
- 戻り値:
slist— linksetデータストアからパターンに一致するキー名のリスト
int used_mem_kb()
使用中メモリをKB単位で取得。
- 引数: なし
- 戻り値:
int— 整数
int free_mem_kb()
空きメモリをKB単位で取得。
- 引数: なし
- 戻り値:
int— 整数
int free_lsd_kb()
LSD空き容量をKB単位で取得。
- 引数: なし
- 戻り値:
int— 整数
key get_notecard_line(str name, int line)
ノートカードの行を読み取り。
- 引数:
name(str): 対象の名前line(int): 行番号(0始まり)
- 戻り値:
key— ノートカードの行
key get_number_of_notecard_lines(str name)
ノートカードの行数を取得。
- 引数:
name(str): 対象の名前
- 戻り値:
key— ノートカードの行数
key request_agent_data(key id, int data)
エージェントデータをリクエスト。
- 引数:
id(key): 対象のキー(UUID)data(int): データ種別を指定する定数
- 戻り値:
key— キー(UUID)
key request_simulator_data(str sim_name, int data)
シミュレーターデータをリクエスト。
- 引数:
sim_name(str): シミュレーター名data(int): データ種別を指定する定数
- 戻り値:
key— キー(UUID)
int over_my_land(key id)
指定キーのオブジェクトが自分の土地上にあるか判定。
- 引数:
id(key): 対象のキー(UUID)
- 戻り値:
int— 整数
key get_land_owner_at(vec pos)
指定位置の土地所有者キーを取得。
- 引数:
pos(vec): 位置(リージョン座標)
- 戻り値:
key— 指定位置の土地所有者キー
int delete_from_lsd(str name)
linksetデータストアから非保護のキーを削除。
- 引数:
name(str): 削除するキー名
- 戻り値:
int— 削除の成否を示すステータスコード(LINKSETDATA_*)
int delete_protected_from_lsd(str name, str pass)
linksetデータストアからパスフレーズ付き保護キーを削除。
- 引数:
name(str): 削除する保護キー名pass(str): 保護キーのパスフレーズ
- 戻り値:
int— 削除の成否を示すステータスコード(LINKSETDATA_*)
slist delete_found_from_lsd(str pattern, str pass)
linksetデータストアからパターンに一致するキーを一括削除。
- 引数:
pattern(str): 削除対象キーに一致する正規表現パターンpass(str): 保護キーのパスフレーズ(非保護のみ削除なら空文字列)
- 戻り値:
slist— 削除されたキー数とスキップされたキー数の2要素リスト
str read_protected_from_lsd(str name, str pass)
linksetデータストアからパスフレーズ付き保護キーの値を取得。
- 引数:
name(str): 値を取得する保護キー名pass(str): 保護キーのパスフレーズ
- 戻り値:
str— キーに対応する値(存在しないか認証失敗なら空文字列)
int write_protected_to_lsd(str name, str value, str pass)
linksetデータストアにパスフレーズ付き保護キーと値を書き込む。
- 引数:
name(str): 書き込む保護キー名value(str): キーに対応する値pass(str): 保護キーのパスフレーズ
- 戻り値:
int— 書き込みの成否を示すステータスコード(LINKSETDATA_*)
int count_lsd_keys()
linksetデータストアのキー総数を取得。
- 引数: なし
- 戻り値:
int— 格納されているキーの総数
int count_found_lsd_keys(str pattern)
linksetデータストアでパターンに一致するキー数を取得。
- 引数:
pattern(str): 数える対象キーに一致する正規表現パターン
- 戻り値:
int— パターンに一致するキーの個数
slist list_lsd_keys(int first, int count)
linksetデータストアのキー一覧を取得。
- 引数:
first(int): 取得を開始するキーのインデックス(0以上)count(int): 取得するキーの最大個数
- 戻り値:
slist— キー名の文字列リスト
Experience キーバリューストア関数
Experience に紐付くキーバリューストアを操作する関数群です。いずれもトランザクション ID(key 型)を返す非同期関数で、結果は #dataserver イベントで受け取ります。Experience の利用許可と接続が必要です。
key create_key_value(str k, str v)
Experienceキーバリューストアにキーと値を新規作成。
- 引数:
k(str): キー文字列v(str): 値文字列
- 戻り値:
key— キー(UUID)
key read_key_value(str k)
Experienceキーバリューストアからキーに対応する値を取得。
- 引数:
k(str): キー文字列
- 戻り値:
key— Experienceキーバリューストアからキーに対応する値
key update_key_value(str k, str v, int checked, str ovalue)
Experienceキーバリューストアのキーに対応する値を更新。
- 引数:
k(str): キー文字列v(str): 値文字列checked(int): 1なら旧値検証あり、0なら無条件更新ovalue(str): 旧値(checked=1時に照合)
- 戻り値:
key— キー(UUID)
key delete_key_value(str k)
Experienceキーバリューストアからキーを削除。
- 引数:
k(str): キー文字列
- 戻り値:
key— キー(UUID)
key data_size_key_value()
Experienceキーバリューストアの使用バイト数と上限を取得。
- 引数: なし
- 戻り値:
key— Experienceキーバリューストアの使用バイト数と上限
key keys_key_value(int first)
Experienceキーバリューストアのキー一覧を取得。
- 引数:
first(int): 取得開始インデックス(0始まり)
- 戻り値:
key— Experienceキーバリューストアのキー一覧
key key_count_key_value()
Experienceキーバリューストアのキー総数を取得。
- 引数: なし
- 戻り値:
key— Experienceキーバリューストアのキー総数
標準ライブラリ定数
標準ライブラリには、LSL組み込み定数に対応する定数が定義されています。import standard as std; でインポート後、std::ZERO_VECTOR のようにアクセスします。
ベクトル・回転定数:
| 定数 | 型 | 値 | 説明 |
|---|---|---|---|
ZERO_VECTOR | vec | <0.0, 0.0, 0.0> | ゼロベクトル |
ZERO_ROTATION | rot | <0.0, 0.0, 0.0, 1.0> | 単位回転 |
TOUCH_INVALID_TEXCOORD | vec | <-1.0, -1.0, 0.0> | タッチ無効テクスチャ座標 |
TOUCH_INVALID_VECTOR | vec | <0.0, 0.0, 0.0> | タッチ無効ベクトル |
上記以外の LSL 組み込み定数(LIST_STAT_MEAN、AGENT_LIST_REGION、PARCEL_DETAILS_NAME など)も、同じ名前に std:: を付けて参照できます(例: std::LIST_STAT_MEAN)。LSL 出力では同名の LSL 定数になります。
注: ライブラリ関数内で標準ライブラリ定数を使用し、その関数を .hltest でテストする場合も、定数は正しく解決されます。
標準プロシージャ
使用方法
標準プロシージャを使用するには、standardをincludeし、エイリアス付きで呼び出す必要があります。
include standard as std;
script main;
main #init {
#std::debug_say|"デバッグ: 処理開始"|;
}
各プロシージャの説明では プロシージャ名(引数型 引数名, ...) の形式でシグネチャを示します。プロシージャは戻り値を持ちません。
デバッグ/ロギング
debug_say(str message)
デバッグメッセージをオーナーに送信します。
- 引数:
message(str): 送信するメッセージ
log(str level, ...str args)
ログレベル付きメッセージを出力します(可変引数対応)。
- 引数:
level(str): ログレベル(INFO/WARN/ERROR等)...args(str, 可変長): 追加の引数(0個以上)
通信
say(str message)
チャンネル0でメッセージを発言します。
- 引数:
message(str): 送信するメッセージ
say_channel(int channel, str message)
指定チャンネルでメッセージを発言します。
- 引数:
channel(int): チャンネル番号message(str): 送信するメッセージ
- 別名:
say_on_channel
whisper(str message)
チャンネル0でささやきます。
- 引数:
message(str): 送信するメッセージ
shout(str message)
チャンネル0で叫びます。
- 引数:
message(str): 送信するメッセージ
region_say(int channel, str message)
リージョン全体にメッセージを送信します。
- 引数:
channel(int): チャンネル番号message(str): 送信するメッセージ
owner_say(str message)
オーナーにのみメッセージを送信します。
- 引数:
message(str): 送信するメッセージ
im(key avatar, str message)
アバターにIMを送信します。
- 引数:
avatar(key): 対象アバターのキーmessage(str): 送信するメッセージ
link_message(int link_num, int num, str str, key id)
リンクセット内のスクリプトにメッセージを送信します。
- 引数:
link_num(int): リンク番号(LINK_*定数も使用可)num(int): イベント内の検出インデックス(0始まり)str(str):str(str型)id(key): 対象のキー(UUID)
listen(int channel, str name, key id, str message)
チャンネルをリッスンします。
- 引数:
channel(int): チャンネル番号name(str): 対象の名前id(key): 対象のキー(UUID)message(str): 送信するメッセージ
listen_remove(int handle)
リッスンハンドルを削除します。
- 引数:
handle(int): 操作対象のハンドル
listen_control(int handle, int active)
リッスンハンドルを有効/無効にします。
- 引数:
handle(int): 操作対象のハンドルactive(int): 1で有効、0で無効
play_sound(str sound, float volume)
指定したサウンドを再生します。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列volume(float): 音量(0.0〜1.0)
タイマー
set_timer(float seconds)
タイマーイベントの間隔を秒単位で設定します。
- 引数:
seconds(float): 秒数
sleep(float seconds)
指定した秒数スクリプトの実行を一時停止します。
- 引数:
seconds(float): 秒数
reset_time()
スクリプト実行時間をリセット。
- 引数: なし
プリム操作
set_text(str text, vec color, float alpha)
プリムのフローティングテキストを設定します。
- 引数:
text(str): 対象の文字列color(vec): 色(RGB各0.0〜1.0)alpha(float): アルファ値(0.0〜1.0)
set_color(vec color, int face)
プリムの色を設定します。
- 引数:
color(vec): 色(RGB各0.0〜1.0)face(int): 面番号(-1で全面)
set_alpha(float alpha, int face)
プリムの透明度を設定します。
- 引数:
alpha(float): アルファ値(0.0〜1.0)face(int): 面番号(-1で全面)
set_pos(vec pos)
プリムの位置を設定します。
- 引数:
pos(vec): 位置(リージョン座標)
set_rot(rot rot)
プリムの回転を設定します。
- 引数:
rot(rot): 回転(クォータニオン)
set_scale(vec scale)
プリムのスケールを設定します。
- 引数:
scale(vec): スケール(各軸のサイズ)
set_local_rot(rot rotation)
ローカル座標系でプリムの回転を設定します。
- 引数:
rotation(rot): 対象の回転
set_link_color(int linknum, int face, vec color, float alpha)
リンクの色とアルファを設定します。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)face(int): 面番号(-1で全面)color(vec): 色(RGB各0.0〜1.0)alpha(float): アルファ値(0.0〜1.0)
set_link_alpha(int linknum, float alpha, int face)
リンクプリムのアルファを設定。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)alpha(float): アルファ値(0.0〜1.0)face(int): 面番号(-1で全面)
set_link_texture(int linknum, str texture, int face)
リンクプリムのテクスチャを設定。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)texture(str): テクスチャ名またはUUIDface(int): 面番号(-1で全面)
set_link_prim_params(int linknum, slist rules)
リンクプリムのパラメータを設定。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)rules(slist): ルールリスト(プリムパラメータ定数列)
set_texture(str texture, int face)
プリムのテクスチャを設定。
- 引数:
texture(str): テクスチャ名またはUUIDface(int): 面番号(-1で全面)
set_object_name(str name)
オブジェクト名を設定。
- 引数:
name(str): 対象の名前
set_object_desc(str desc)
オブジェクトの説明を設定。
- 引数:
desc(str): 説明文
set_region_pos(vec pos)
リージョン内位置を設定。
- 引数:
pos(vec): 位置(リージョン座標)
set_status(int status, int value)
プリムステータスフラグを設定。
- 引数:
status(int): 状態フラグvalue(int): 対象となる整数値
set_click_action(int action)
クリックアクションを設定。
- 引数:
action(int): クリックアクション定数(CLICK_ACTION_*)
set_sit_text(str text)
シットテキストを設定。
- 引数:
text(str): 対象の文字列
set_touch_text(str text)
タッチテキストを設定。
- 引数:
text(str): 対象の文字列
set_buoyancy(float buoyancy)
浮力を設定。
- 引数:
buoyancy(float): 浮力(0で無効、1で重力相殺)
target_omega(vec axis, float spinrate, float gain)
回転アニメーションを設定。
- 引数:
axis(vec): 回転軸ベクトルspinrate(float): 回転速度(ラジアン/秒)gain(float): ゲイン
volume_detect(int detect)
ボリューム検出を設定。
- 引数:
detect(int): 1で検出、0で無効
die()
プリムを削除します。
- 引数: なし
sit_target(vec offset, rot rot)
シットターゲットを設定します。
- 引数:
offset(vec): オフセット位置rot(rot): 回転(クォータニオン)
unsit(key id)
アバターを強制的に立たせます。
- 引数:
id(key): 対象のキー(UUID)
オブジェクト操作
rez_object(str inventory, vec pos, vec vel, rot rot, int param)
オブジェクトをRez。
- 引数:
inventory(str): インベントリアイテム名pos(vec): 位置(リージョン座標)vel(vec): 速度ベクトルrot(rot): 回転(クォータニオン)param(int): パラメータ識別子(または起動パラメータ)
rez_at_root(str inventory, vec pos, vec vel, rot rot, int param)
オブジェクトをルート位置でRez。
- 引数:
inventory(str): インベントリアイテム名pos(vec): 位置(リージョン座標)vel(vec): 速度ベクトルrot(rot): 回転(クォータニオン)param(int): パラメータ識別子(または起動パラメータ)
give_inventory(key destination, str inventory)
インベントリアイテムを渡す。
- 引数:
destination(key): 送信先のキーinventory(str): インベントリアイテム名
remove_inventory(str name)
インベントリアイテムを削除。
- 引数:
name(str): 対象の名前
break_link(int linknum)
リンクを解除。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)
break_all_links()
全リンクを解除。
- 引数: なし
create_link(key target, int parent)
リンクを作成。
- 引数:
target(key): 対象オブジェクトのキーparent(int): 親リンクなら1、子リンクなら0
allow_inventory_drop(int add)
インベントリドロップを許可。
- 引数:
add(int): 1で許可、0で禁止
give_money(key destination, int amount)
リンデンドルを送金。
- 引数:
destination(key): 送信先のキーamount(int): 金額(リンデンドル)
set_pay_price(int price, slist buttons)
支払い価格を設定。
- 引数:
price(int): 価格(リンデンドル)buttons(slist): ボタンラベル文字列のリスト
clear_camera_params()
カメラパラメータをクリア。
- 引数: なし
set_camera_params(slist rules)
カメラパラメータを設定。
- 引数:
rules(slist): CAMERA_*定数と値のパラメータリスト
set_camera_at_offset(vec offset)
シット時のカメラ注視点オフセットを設定。
- 引数:
offset(vec): カメラ注視点のローカルオフセット
set_camera_eye_offset(vec offset)
シット時のカメラ視点オフセットを設定。
- 引数:
offset(vec): カメラ視点のローカルオフセット
set_link_camera(int link, vec eye, vec at)
リンクプリムのカメラ視点・注視点を設定。
- 引数:
link(int): 対象のリンク番号またはLINK定数eye(vec): カメラ視点のローカルオフセットat(vec): カメラ注視点のローカルオフセット
set_primitive_params(slist rules)
プリムのパラメータを設定。
- 引数:
rules(slist): PRIM_*定数と値のパラメータリスト
set_link_primitive_params(int link, slist rules)
リンクプリムのパラメータを設定(順序保証)。
- 引数:
link(int): 対象のリンク番号またはLINK定数rules(slist): PRIM_*定数と値のパラメータリスト
offset_texture(float u, float v, int face)
面のテクスチャオフセットを設定。
- 引数:
u(float): U方向のオフセットv(float): V方向のオフセットface(int): 対象の面番号(ALL_SIDESで全面)
rotate_texture(float angle, int face)
面のテクスチャ回転を設定。
- 引数:
angle(float): テクスチャ回転角(ラジアン)face(int): 対象の面番号(ALL_SIDESで全面)
scale_texture(float u, float v, int face)
面のテクスチャスケールを設定。
- 引数:
u(float): U方向のスケールv(float): V方向のスケールface(int): 対象の面番号(ALL_SIDESで全面)
parcel_media_command_list(slist commands)
パーセルメディアにコマンドを送信。
- 引数:
commands(slist): PARCEL_MEDIA_COMMAND_*定数と値のリスト
set_velocity(vec velocity, int local)
プリムの速度を設定。
- 引数:
velocity(vec): 設定する速度ベクトルlocal(int): ローカル座標系ならTRUE、リージョン座標系ならFALSE
set_angular_velocity(vec angular_velocity, int local)
プリムの角速度を設定。
- 引数:
angular_velocity(vec): 設定する角速度ベクトルlocal(int): ローカル座標系ならTRUE、リージョン座標系ならFALSE
set_force_and_torque(vec force, vec torque, int local)
プリムに力とトルクを設定。
- 引数:
force(vec): 加える力ベクトルtorque(vec): 加えるトルクベクトルlocal(int): ローカル座標系ならTRUE、リージョン座標系ならFALSE
set_hover_height(float height, int water, float tau)
ホバー高さを設定。
- 引数:
height(float): ホバー高さwater(int): 水面基準ならTRUE、地面基準ならFALSEtau(float): 目標到達までの時定数(秒)
stop_hover()
ホバーを停止。
- 引数: なし
set_physics_material(int mask, float gravity_multiplier, float restitution, float friction, float density)
プリムの物理マテリアルを設定。
- 引数:
mask(int): 適用する項目のビットマスク(DENSITY等)gravity_multiplier(float): 重力倍率restitution(float): 反発係数friction(float): 摩擦係数density(float): 密度
set_keyframed_motion(slist keyframes, slist options)
キーフレームモーションを設定。
- 引数:
keyframes(slist): キーフレーム(移動/回転/時間)のリストoptions(slist): KFM_*定数と値のオプションリスト
rot_look_at(rot target_direction, float strength, float damping)
目標方向へ回転を向ける。
- 引数:
target_direction(rot): 向ける目標方向の回転strength(float): 向ける強さdamping(float): 減衰
add_to_land_ban_list(key avatar, float hours)
土地のBANリストにアバターを追加。
- 引数:
avatar(key): BANリストに追加するアバターのキーhours(float): BANする時間(時間単位、0で無期限)
add_to_land_pass_list(key avatar, float hours)
土地のPASSリストにアバターを追加。
- 引数:
avatar(key): PASSリストに追加するアバターのキーhours(float): アクセス許可する時間(時間単位、0で無期限)
remove_from_land_ban_list(key avatar)
土地のBANリストからアバターを削除。
- 引数:
avatar(key): BANリストから削除するアバターのキー
remove_from_land_pass_list(key avatar)
土地のPASSリストからアバターを削除。
- 引数:
avatar(key): PASSリストから削除するアバターのキー
reset_land_ban_list()
土地のBANリストをリセット。
- 引数: なし
reset_land_pass_list()
土地のPASSリストをリセット。
- 引数: なし
eject_from_land(key avatar)
アバターを土地から退去させる。
- 引数:
avatar(key): 退去させるアバターのキー
modify_land(int action, int brush)
地形を変更。
- 引数:
action(int): 地形変更操作(LAND_LEVEL等の定数)brush(int): ブラシサイズ(LAND_SMALL_BRUSH等の定数)
ground_repel(float height, int water, float tau)
地面/水面から反発してホバー。
- 引数:
height(float): ホバーする高さwater(int): 水面基準ならTRUE、地面基準ならFALSEtau(float): 目標到達までの時定数(秒)
set_parcel_music_url(str url)
パーセルの音楽ストリームURLを設定。
- 引数:
url(str): 設定する音楽ストリームのURL
set_animation_override(str anim_state, str anim)
アニメーション状態のオーバーライドを設定。
- 引数:
anim_state(str): 上書きするアニメーション状態名anim(str): 再生するアニメーション名
reset_animation_override(str anim_state)
アニメーションオーバーライドをリセット。
- 引数:
anim_state(str): リセットするアニメーション状態名(ALLで全て)
start_object_animation(str anim)
オブジェクトアニメーションを再生。
- 引数:
anim(str): 再生するアニメーション名
stop_object_animation(str anim)
オブジェクトアニメーションを停止。
- 引数:
anim(str): 停止するアニメーション名
teleport_agent_global_coords(key agent, vec global_coordinates, vec region_coordinates, vec look_at)
アバターをグローバル座標へテレポート。
- 引数:
agent(key): テレポートするアバターのキーglobal_coordinates(vec): 宛先のグローバル座標region_coordinates(vec): 宛先リージョン内のローカル座標look_at(vec): 到着時に向く方向
give_inventory_list(key target, str folder, slist inventory)
インベントリアイテムをフォルダでまとめて渡す。
- 引数:
target(key): 渡す相手のアバター/プリムのキーfolder(str): 作成するフォルダ名inventory(slist): 渡すインベントリアイテム名のリスト
set_remote_script_access_pin(int pin)
リモートスクリプトアクセスPINを設定。
- 引数:
pin(int): リモートスクリプトロードを許可するPIN(0で無効)
remote_load_script_pin(key target, str name, int pin, int running, int start_param)
PIN付きでリモートにスクリプトをロード。
- 引数:
target(key): スクリプトを送る対象プリムのキーname(str): 送るスクリプト名pin(int): 対象が設定したアクセスPINrunning(int): 起動状態にするならTRUE、停止ならFALSEstart_param(int): スクリプトに渡す開始パラメータ
データストレージ
write_to_lsd(str name, str value)
Linkset Dataストレージに値を書き込みます。
- 引数:
name(str): 対象の名前value(str): 対象となる文字列
reset_lsd()
すべてのLinkset Dataをクリアします。
- 引数: なし
アニメーション
start_anim(str anim)
アニメーションを開始します。
- 引数:
anim(str): アニメーション名
stop_anim(str anim)
アニメーションを停止します。
- 引数:
anim(str): アニメーション名
センサー
sensor(str name, key id, int type, float range, float arc)
周囲のオブジェクト・アバターをセンサーで検出します。
- 引数:
name(str): 対象の名前id(key): 対象のキー(UUID)type(int): 種別を指定するフラグ値range(float): 乱数の上限(この値未満が返される)arc(float): 検出円錐の半角(ラジアン)
sensor_repeat(str name, key id, int type, float range, float arc, float rate)
周囲のオブジェクト・アバターを繰り返しセンサーで検出します。
- 引数:
name(str): 対象の名前id(key): 対象のキー(UUID)type(int): 種別を指定するフラグ値range(float): 乱数の上限(この値未満が返される)arc(float): 検出円錐の半角(ラジアン)rate(float): 繰り返し間隔(秒)
sensor_remove()
繰り返しセンサーを停止します。
- 引数: なし
アバター操作
request_permissions(key agent, int perm)
パーミッションをリクエストします。
- 引数:
agent(key): 対象エージェントのキーperm(int):perm(int型)
attach_to_avatar(int attach_point)
アバターにアタッチ。
- 引数:
attach_point(int): アタッチメントポイント(ATTACH_*定数)
detach_from_avatar()
アバターからデタッチ。
- 引数: なし
teleport_agent(key avatar, str landmark, vec pos, vec look_at)
アバターをテレポート。
- 引数:
avatar(key): 対象アバターのキーlandmark(str): ランドマーク名(空文字列で省略)pos(vec): 位置(リージョン座標)look_at(vec): 注視点(リージョン座標)
teleport_agent_home(key avatar)
アバターをホームにテレポート。
- 引数:
avatar(key): 対象アバターのキー
物理/移動
apply_impulse(vec force, int local)
インパルスを適用。
- 引数:
force(vec): 力ベクトルlocal(int): ローカル座標系で適用するなら1、ワールド座標系なら0
apply_rotational_impulse(vec force, int local)
回転インパルスを適用。
- 引数:
force(vec): 力ベクトルlocal(int): ローカル座標系で適用するなら1、ワールド座標系なら0
set_force(vec force, int local)
力を設定。
- 引数:
force(vec): 力ベクトルlocal(int): ローカル座標系で適用するなら1、ワールド座標系なら0
set_torque(vec torque, int local)
トルクを設定。
- 引数:
torque(vec): トルクベクトルlocal(int): ローカル座標系で適用するなら1、ワールド座標系なら0
move_to_target(vec target, float tau)
ターゲットに移動。
- 引数:
target(vec): 目標位置tau(float): 応答時間定数
stop_move_to_target()
ターゲット移動を停止。
- 引数: なし
look_at(vec target, float strength, float damping)
指定方向を向く。
- 引数:
target(vec): 目標位置strength(float): 強さdamping(float): 減衰
stop_look_at()
方向固定を停止。
- 引数: なし
push_object(key id, vec impulse, vec angular, int local)
オブジェクトを押す。
- 引数:
id(key): 対象のキー(UUID)impulse(vec): インパルスベクトルangular(vec): 角インパルスlocal(int): ローカル座標系で適用するなら1、ワールド座標系なら0
ビークル
set_vehicle_type(int type_id)
ビークルタイプを設定。
- 引数:
type_id(int): ビークルタイプ定数(VEHICLE_TYPE_*)
set_vehicle_float_param(int param, float value)
ビークル浮動小数点パラメータを設定。
- 引数:
param(int): パラメータ識別子(または起動パラメータ)value(float): 対象となる浮動小数点数
set_vehicle_vector_param(int param, vec value)
ビークルベクトルパラメータを設定。
- 引数:
param(int): パラメータ識別子(または起動パラメータ)value(vec):value(vec型)
set_vehicle_rot_param(int param, rot value)
ビークル回転パラメータを設定。
- 引数:
param(int): パラメータ識別子(または起動パラメータ)value(rot):value(rot型)
set_vehicle_flags(int flags)
ビークルフラグを設定。
- 引数:
flags(int): フラグ値(ビット和)
remove_vehicle_flags(int flags)
ビークルフラグを削除。
- 引数:
flags(int): フラグ値(ビット和)
HTTP
http_response(key request_id, int status, str body)
HTTPレスポンスを返す。
- 引数:
request_id(key): HTTPリクエストIDstatus(int): 状態フラグbody(str): HTTPボディ
release_url(str url)
URLを解放。
- 引数:
url(str): 対象のURL
set_content_type(key request_id, int content_type)
コンテンツタイプを設定。
- 引数:
request_id(key): HTTPリクエストIDcontent_type(int): コンテンツタイプ定数
load_url(key avatar, str message, str url)
URLをブラウザで開く。
- 引数:
avatar(key): 対象アバターのキーmessage(str): 送信するメッセージurl(str): 対象のURL
テクスチャ/パーティクル
set_texture_anim(int mode, int face, int sx, int sy, float start, float length, float rate)
テクスチャアニメーションを設定。
- 引数:
mode(int): アニメーションモードフラグ(ANIM_ON等の定数)face(int): 面番号(-1で全面)sx(int): 横方向の分割数sy(int): 縦方向の分割数start(float):start(float型)length(float): アニメーション長rate(float): 繰り返し間隔(秒)
set_link_texture_anim(int linknum, int mode, int face, int sx, int sy, float start, float length, float rate)
リンクプリムのテクスチャアニメーションを設定。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)mode(int): アニメーションモードフラグ(ANIM_ON等の定数)face(int): 面番号(-1で全面)sx(int): 横方向の分割数sy(int): 縦方向の分割数start(float):start(float型)length(float): アニメーション長rate(float): 繰り返し間隔(秒)
particle_system(slist rules)
パーティクルシステムを設定。
- 引数:
rules(slist): ルールリスト(プリムパラメータ定数列)
link_particle_system(int linknum, slist rules)
リンクプリムのパーティクルシステムを設定。
- 引数:
linknum(int): リンク番号(LINK_*定数も使用可)rules(slist): ルールリスト(プリムパラメータ定数列)
サウンド
loop_sound(str sound, float volume)
サウンドをループ再生。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列volume(float): 音量(0.0〜1.0)
stop_sound()
サウンドを停止。
- 引数: なし
preload_sound(str sound)
サウンドをプリロード。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列
adjust_sound_volume(float volume)
サウンドボリュームを調整。
- 引数:
volume(float): 音量(0.0〜1.0)
trigger_sound(str sound, float volume)
サウンドをトリガー。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列volume(float): 音量(0.0〜1.0)
trigger_sound_limited(str sound, float volume, vec top_north_east, vec bottom_south_west)
範囲限定でサウンドをトリガー。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列volume(float): 音量(0.0〜1.0)top_north_east(vec):top_north_east(vec型)bottom_south_west(vec):bottom_south_west(vec型)
collision_sound(str sound, float volume)
衝突サウンドを設定。
- 引数:
sound(str): サウンドアイテム名またはUUID文字列volume(float): 音量(0.0〜1.0)
UI/その他
map_destination(str sim_name, vec pos, vec look_at)
マップ上の目的地を表示。
- 引数:
sim_name(str): シミュレーター名pos(vec): 位置(リージョン座標)look_at(vec): 注視点(リージョン座標)
force_mouselook(int mouselook)
マウスルックを強制。
- 引数:
mouselook(int): 1で強制マウスルック、0で解除
take_controls(int controls, int accept, int pass_on)
コントロールを取得。
- 引数:
controls(int): 対象コントロール(CONTROL_*定数のビット和)accept(int): 受け取るなら1、無視なら0pass_on(int): 他へ受け流すなら1
release_controls()
コントロールを解放。
- 引数: なし
pass_touches(int pass)
タッチイベントの受け渡しを設定。
- 引数:
pass(int): 受け流すなら1
pass_collisions(int pass)
衝突イベントの受け渡しを設定。
- 引数:
pass(int): 受け流すなら1
collision_filter(str name, key id, int accept)
衝突フィルターを設定。
- 引数:
name(str): 対象の名前id(key): 対象のキー(UUID)accept(int): 受け取るなら1、無視なら0
set_damage(float damage)
ダメージ値を設定。
- 引数:
damage(float): ダメージ量
set_memory_limit(int limit)
メモリ制限を設定。
- 引数:
limit(int): 上限値
スクリプト制御
reset()
スクリプトをリセットします。
- 引数: なし
- 別名:
reset_script
reset_other(str name)
他のスクリプトをリセットします。
- 引数:
name(str): 対象の名前
- 別名:
reset_other_script
set_script_state(str name, int running)
スクリプトの実行状態を設定します。
- 引数:
name(str): 対象の名前running(int): 1で実行中、0で停止
ターゲット
target(vec position, float range)
位置ターゲットを登録。
- 引数:
position(vec): 目標位置range(float): 乱数の上限(この値未満が返される)
target_remove(int handle)
位置ターゲットを削除。
- 引数:
handle(int): 操作対象のハンドル
rot_target(rot rot, float error)
回転ターゲットを登録。
- 引数:
rot(rot): 回転(クォータニオン)error(float): 許容誤差
rot_target_remove(int handle)
回転ターゲットを削除。
- 引数:
handle(int): 操作対象のハンドル
テスト/アサーション
テストファイル(*.test.hl)で使用するアサーションプロシージャ群です。詳細は テスト を参照してください。
assert_eq(int actual, int expected, str expr_text)
2つの値が等しいことをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
assert_ne(int actual, int expected, str expr_text)
2つの値が等しくないことをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
assert_lt(int actual, int expected, str expr_text)
actualがexpectedより小さいことをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
assert_le(int actual, int expected, str expr_text)
actualがexpected以下であることをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
assert_gt(int actual, int expected, str expr_text)
actualがexpectedより大きいことをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
assert_ge(int actual, int expected, str expr_text)
actualがexpected以上であることをアサートします。
- 引数:
actual(int): 実測値(任意の型を受け付ける)expected(int): 期待値(任意の型を受け付ける)expr_text(str): 式の文字列表現(エラーメッセージ用)
test_report()
テスト結果のサマリーを表示します。
- 引数: なし
メッセージ送信
基本構文
<式> -> <ターゲット>;
<式>:<チャンネル> -> <ターゲット>;
送信例
| 構文 | 説明 |
|---|---|
"msg" -> world; | チャンネル0の公開チャット。周囲のユーザー全員に聞こえる |
"msg" -> owner; | スクリプトの所有者にのみ届くプライベートメッセージ |
"msg" -> debug; | デバッグチャンネルへの出力(開発時のログに使用) |
"msg":100 -> sub; | スクリプト識別子 sub へチャンネル100でメッセージ送信 |
"msg":0 ->> avatar; | 同一リージョン内の特定アバターまたはオブジェクトのみにチャンネル0でメッセージ送信 |
ターゲット指定
-> の右辺に送信先を指定します。
組み込み識別子
world: ワールドチャット(チャンネル0の公開チャット。周囲のプレイヤー全員に聞こえます)。owner: オーナーチャット(スクリプトの所有者にのみ表示されます)。debug: デバッグチャンネル(DEBUG_CHANNEL。開発時のログ出力に使用)。
ユーザー定義識別子
script <識別子>;で定義されたスクリプト識別子。avatar <識別子>;で定義されたアバター識別子。
hmsgファイル指定
<式> -> <script識別子> @ <hmsg_file>;
<式>:<チャンネル> -> <script識別子> @ <hmsg_file>;
複数ターゲットメッセージ送信
// 基本形式
<式>:<チャンネル> -> <script1>, <script2>;
// 括弧グループ形式(全ターゲットに同じhmsgを適用)
<式>:<チャンネル> -> (<script1>, <script2>) @ <hmsg_file>;
// 個別hmsg指定
<式>:<チャンネル> -> <script1> @ <hmsg1>, <script2> @ <hmsg2>;
// 混合形式
<式>:<チャンネル> -> (<script1>, <script2>) @ <hmsg1>, <script3> @ <hmsg2>;
RegionSayToメッセージ送信
<式>:<チャンネル> ->> <ターゲット>;
->> 演算子はavatar識別子またはkey型変数にのみ使用可能です。
例:
script main;
avatar target_avatar = "12345678-1234-1234-1234-123456789abc";
key avatar_key = "12345678-1234-1234-1234-123456789abc";
main #init {
"Hello":0 ->> target_avatar;
"Message":100 ->> avatar_key;
} ダイアログ構文
ダイアログの見た目と同じ配置でコーディングできる専用構文で、各ボタン行が|...|で囲まれ、視覚的にダイアログのレイアウトと一致します。
基本構文
<メッセージ>
|<ボタン1>, <ボタン2>, <ボタン3>|
|<ボタン4>, <ボタン5>, <ボタン6>|
@<対象>:<チャンネル> -> world;
1行形式でも記述可能(||は閉じ|と開き|の連続):
<メッセージ>|<ボタン1>, <ボタン2>||<ボタン3>, <ボタン4>|@<対象>:<チャンネル> -> world;
構文要素
| 要素 | 型 | 説明 |
|---|---|---|
| メッセージ | str | ダイアログに表示するメッセージ(|を除く加算式レベルの式。+, -, &, ^が使用可能) |
| ボタン | str / slist | ボタンラベル(termレベルの式、1-4行)。slist型も指定可能 |
| 対象 | key | owner、key型変数、key型定数 |
| チャンネル | int | リテラル、int型変数、int型定数 |
-> world; | - | 固定(必須) |
※ メッセージ式は+, -, &, ^を含む加算式が使用可能(|はボタン区切りと衝突するため除外)。||, &&等の論理演算子を含む式は括弧()で囲む。
ボタンの制約
| 制約 | 動作 | エラーコード |
|---|---|---|
空文字列 "" | コンパイルエラー | E0403 |
| 24バイト超 | 警告を出力し、24バイトに自動切り詰め(UTF-8文字境界考慮) | W0305 |
※ これらの検査対象は文字列リテラルで書いたボタンです。slist の要素は検査されません(空文字列もエラーにならず、24バイト超の要素は警告なしで扱われます)。
slistボタン
ボタンにslist型の変数を指定すると、リスト要素がボタンとしてインライン展開されます。
slist opts = ["1", "2", "3", "4", "5"];
"Menu"|"A", opts, "B"|@owner:100 -> world;
展開後のボタンは3個ずつの行に分けられ、行の順序が逆転されます(LSLのllDialogの表示順に対応)。3個に満たない最終行は空白ボタン " " で補われます。ボタンに slist を1つでも含む場合、|...| で書いた行の区切りは使われず、すべてのボタンを連結してから3個ずつの行に分け直します(例: "M"|"A", "B"||one| で one が ["x"] なら ["A", "B", "x"] の1行になる)。
- 展開:
["A", "1", "2", "3", "4", "5", "B"](7個) - 行分割:
["A", "1", "2"],["3", "4", "5"],["B", " ", " "] - 行逆転:
["B", " ", " ", "3", "4", "5", "A", "1", "2"]
slistの値がコンパイル時に確定できない場合(関数戻り値、メソッド呼び出し等)は、実行時にリスト連結と行逆転が行われます。
使用例
// 1行ボタン
"Choose"|"A", "B", "C"|@owner:1 -> world;
// 複数行ボタン(視覚的にダイアログのレイアウトと一致)
"Menu"
|"1", "2", "3"|
|"4", "5", "6"|
@owner:100 -> world;
// 変数ターゲット、定数チャンネル
const int CH = 100;
key target = std::get_owner();
"Hello"|"OK"|@target:CH -> world;
// メッセージに加算式
str name = "Alice";
"Hello, " + name|"OK"|@owner:1 -> world;
// slistボタン
slist menus = ["1", "2", "3", "4", "5"];
"Menu"|"A", menus, "B"|@owner:100 -> world;
LSL変換
ボタン行は逆順に展開され、llDialog関数に変換されます(LSLのllDialogはリスト末尾から表示するため)。
"Menu"|"1","2","3"||"4","5","6"|@owner:100 -> world;
→
llDialog(llGetOwner(), "Menu", ["4", "5", "6", "1", "2", "3"], 100);
slistボタン(コンパイル時に確定する場合)は、インライン展開後に行分割・行逆転されたリストになります。
slist opts = ["1", "2", "3", "4", "5"];
"Menu"|"A", opts, "B"|@owner:100 -> world;
→
llDialog(llGetOwner(), "Menu", ["B", " ", " ", "3", "4", "5", "A", "1", "2"], 100);
対象の変換
| HL | LSL |
|---|---|
owner | llGetOwner() |
| 変数 | 変数識別子 |
| 定数 | 定数参照 |
テスト機能
テスト例
以下の例は lib/math_utils.hlib に定義された関数をテストします。
int add(int a, int b) = a + b;
int multiply(int a, int b) = a * b;
import math_utils as m;
// add関数のテスト
m::add(1, 2) == 3;
m::add(0, 0) == 0;
m::add(-1, 1) == 0;
// multiply関数のテスト
m::multiply(4, 5) == 20;
m::multiply(0, 100) == 0;
m::multiply(-2, 3) == -6;
テスト結果:
✅ m::add(1, 2) == 3
✅ m::add(0, 0) == 0
✅ m::add(-1, 1) == 0
✅ m::multiply(4, 5) == 20
✅ m::multiply(0, 100) == 0
✅ m::multiply(-2, 3) == -6
test result: ok. 6 passed; 0 failed
テストファイル形式
import <ライブラリ名>;
// 比較式形式のテスト
<式> <比較演算子> <式>;
比較式形式
テストは比較式を直接記述する形式で書きます。
サポートされる比較演算子:
==: 等しい。!=: 等しくない。<: より小さい。>: より大きい。<=: 以下。>=: 以上。
例:
m::add(1, 2) == 3; // 等しい
m::add(1, 2) != 0; // 等しくない
2 < m::add(1, 2); // より大きい
m::add(1, 2) < 4; // より小さい
3 <= m::add(1, 2); // 以上
m::add(1, 2) <= 3; // 以下
モック機能
外部リソースに依存する関数をテストする際に、モック定義を使用して戻り値を指定できます。
純粋関数はモック不要: 環境状態に依存しない決定的な標準ライブラリ関数(std::list_find、std::dump_list_to_string、std::abs、std::str_to_int、std::escape_url 等)は、テストランナーが LSL 関数の挙動をエミュレートして実行するため、モック定義なしでテストできます。
副作用のある関数(std::get_owner、std::read_from_lsd、std::frand、std::detected_*、HTTP系、インベントリ系等)はモック定義が必須です。
// モック定義構文
!!<関数名>(<引数>, ...) = <戻り値>;
例:
以下のライブラリが read_from_lsd(標準ライブラリ関数)を内部で使用している場合:
import standard as std;
str get_data(str key) = std::read_from_lsd(key);
テストでモックを使用して read_from_lsd の戻り値を差し替えます:
import standard as std;
import config as cfg;
// read_from_lsd をモックして戻り値を指定
!!std::read_from_lsd("key1") = "value1";
// モックされた値でテスト
cfg::get_data("key1") == "value1";
テスト結果:
✅ cfg::get_data("key1") == "value1"
test result: ok. 1 passed; 0 failed
インターリーブ形式:
モック定義とテスト式を交互に配置することで、同じ関数に対して異なるモック値でテストできます。
import standard as std;
import config as cfg;
// パターン1のモック
!!std::read_from_lsd("mode") = "debug";
cfg::get_data("mode") == "debug";
// パターン2のモック(同じ関数を異なる値で上書き)
!!std::read_from_lsd("mode") = "release";
cfg::get_data("mode") == "release";
テスト結果:
✅ cfg::get_data("mode") == "debug"
✅ cfg::get_data("mode") == "release"
test result: ok. 2 passed; 0 failed
テスト実行
# 単一ファイル
hl test tests/math_utils_test.hltest
# ディレクトリ内の全テスト
hl test tests/
# tests/ディレクトリの全テスト(デフォルト)
hl test
--lsl オプションを指定すると、テストを実行せずにテストファイルをLSLコードに変換して出力します。
hl test tests/math_utils_test.hltest --lsl
--with-lsl オプションを指定すると、テストを実行しつつ、LSLコードも生成して出力します。
hl test tests/math_utils_test.hltest --with-lsl
テスト結果
テスト実行時、各テスト式の結果が表示されます。
全テスト成功時:
✅ m::add(1, 2) == 3
✅ m::add(0, 0) == 0
✅ m::add(-1, 1) == 0
✅ m::multiply(4, 5) == 20
✅ m::multiply(0, 100) == 0
✅ m::multiply(-2, 3) == -6
test result: ok. 6 passed; 0 failed
テスト失敗時(multiply関数にバグがある場合):
int add(int a, int b) = a + b;
int multiply(int a, int b) = a + b; // バグ: * ではなく + を使用
✅ m::add(1, 2) == 3
✅ m::add(0, 0) == 0
✅ m::add(-1, 1) == 0
❌ m::multiply(4, 5) == 20 (got: 9)
❌ m::multiply(0, 100) == 0 (got: 100)
❌ m::multiply(-2, 3) == -6 (got: 1)
test result: 3 passed; 3 failed CLIコマンド
コンパイル
hl file.hl # file.hlをコンパイル
hl file.hlib # file.hlibを検証
hl file.hmsg # file.hmsgを検証
コンパイルオプション
| オプション | 説明 |
|---|---|
--show-memory-usage | メモリ使用量表示を追加(デバッグ用) |
--debug | コンパイル後のLSLコードの各イベントハンドラ先頭に llSay(DEBUG_CHANNEL, ...) を挿入。スクリプト名・イベント名・パラメータをデバッグチャンネルに出力します |
--no-optimize | デフォルトの最適化(定数インライン展開・定数伝搬・定数畳み込み・関数インライン展開・プロシージャインライン展開)を無効化 |
--no-warn-unused-exports | .hlファイル経由でインポートしたライブラリファイル(.hlib/.hprc)内の未使用関数・定数・プロシージャの警告を抑制。スタンドアロン(.hlib/.hprcを直接指定)コンパイル時はクロスファイル参照情報がないため、このフラグに関わらずW0202/W0203/W0204は自動抑制される |
--lang <LANG> | エラーメッセージの出力言語を指定(ja/en、デフォルト: 自動検出) |
-V, --version | バージョン情報(hl <バージョン番号>)を表示して終了 |
テスト実行
hl test # tests/ディレクトリの全テスト
hl test file.hltest # 単一テストファイル
hl test <directory> # ディレクトリ内の全テスト
テスト実行オプション
| オプション | 説明 |
|---|---|
--lsl | テストを実行せずにLSLコードに変換して出力 |
--with-lsl | テストを実行しつつLSLコードも生成して出力 |
プロジェクト作成
hl new <project_name> # プロジェクトディレクトリを作成
生成されるディレクトリには prc/ サブディレクトリと、main.hl の初期テンプレートが含まれます。
コードフォーマット
ソースコードの整形は Language Server hl-lsp の textDocument/formatting として提供されます。対応エディタ(coc.nvim / VS Code 等)の「ドキュメントのフォーマット」操作で、ファイル全体を整形します。CLI の hl-fmt は廃止されました。
対応ファイル: .hl / .hlib / .hmsg / .hprc / .hltest(拡張子から自動判別)
- インデント正規化(4 スペース固定)
- 改行コードの LF 統一(CRLF / CR の入力も LF で出力)
- 行コメント
/// ブロックコメント/* */と空行の保持 switchの=>、msg / dialog 式の->、行末コメントの列整列prims定義の 200 文字折返しとカンマ位置整列- 冪等(再フォーマットしても結果は変わらない)
Language Server の導入方法はダウンロードページの Language Server セクションを参照してください。Playground でも「フォーマット」ボタンで同じ整形を利用できます。
多言語対応(i18n)
エラーメッセージは日本語と英語に対応しています。言語の優先順位は以下の通りです:
--langオプション(最優先)HL_LANG環境変数- OS言語設定(
LANG→LC_MESSAGES→LC_ALL) - デフォルト: 英語
# 英語でエラー表示
hl main.hl --lang en
# 日本語でエラー表示
hl main.hl --lang ja
# 環境変数で指定
HL_LANG=ja hl main.hl 組み込み識別子
以下の識別子は言語レベルで定義され、特別な意味を持ちます。
world: ワールドチャットへのメッセージ送信先。owner: オーナーチャットへのメッセージ送信先。debug: デバッグチャンネル(DEBUG_CHANNEL)へのメッセージ送信先。
エラーコード一覧
エラーレベル
コンパイルに失敗するエラーです。
| コード | 説明 |
|---|---|
| E0001 | 構文エラー(パースエラー) |
| E0002 | 重複する変数定義(同一スコープ内) |
| E0003 | 重複する関数定義 |
| E0004 | 重複するプロシージャ定義 |
| E0005 | 重複する定数定義 |
| E0006 | 重複する型定義(script / avatar) |
| E0007 | #cache_linknumの重複定義 |
| E0008 | #initイベントの重複定義 |
| E0009 | #timerイベントの重複定義 |
| E0010 | #sensorイベントの重複定義 |
| E0011 | #no_sensorイベントの重複定義 |
| E0012 | #run_time_permissionsイベントの重複定義 |
| E0013 | #dataserverイベントの重複定義 |
| E0014 | #changedイベントの重複定義 |
| E0015 | #on_rezイベントの重複定義 |
| E0101 | 未定義変数 |
| E0102 | 未定義関数 |
| E0103 | 未定義プロシージャ |
| E0104 | 未定義定数 |
| E0105 | 未定義のライブラリエイリアス |
| E0106 | 未定義primインスタンス |
| E0107 | primsパターン不一致 |
| E0108 | prims割り当て不完全 |
| E0110 | 未定義primsグループ参照 |
| E0301 | 型の不一致 |
| E0302 | 比較演算子の型不一致 |
| E0303 | 代入の型不一致 |
| E0304 | パターンマッチの型不一致 |
| E0305 | ループ変数型の不一致 |
| E0306 | レンジイテレーションでint以外の型を使用 |
| E0307 | コレクションにリスト型またはstr型が必要 |
| E0308 | 整数定数式の計算結果がintの範囲(-2147483648〜2147483647)外(overflow) |
| E0401 | 無効なメッセージターゲット |
| E0402 | hmsgファイル指定が不正 |
| E0403 | ダイアログボタンに空文字列を使用 |
| E0404 | RegionSayToのターゲットが不正 |
| E0502 | primメソッド使用時に#cache_linknumが未指定 |
| E0601 | 定数への代入 |
| E0602 | 定数定義および context フィールド初期値での非定数式使用 |
| E0701 | メソッドが見つからない |
| E0702 | 無効なフィールドアクセス |
| E0703 | プロシージャの引数数不一致 |
| E0704 | プロシージャ引数型の不一致 |
| E0705 | 関数の引数数不一致 |
| E0706 | 関数引数型の不一致 |
| E0707 | メソッド引数数の不一致 |
| E0708 | メソッド引数型の不一致 |
| E0709 | primメソッドが見つからない |
| E0801 | 必須識別子定義の欠如、または空リストの型推論不可 |
| E0802 | リスト要素の型不一致 |
| E0803 | リスト化できない型 |
| E0804 | リスト型の不一致 |
| E0901 | importエラー |
| E0902 | ライブラリファイルで禁止されている要素 |
| E0903 | チャンネルに変数を使用 |
| E0904 | hmsgファイルでの無効な構文使用、またはincludeエラー |
| E0905 | hmsgファイル以外でのref文使用 |
| E0906 | refで指定されたファイルが見つからない |
| E0907 | hmsgファイルが見つからない |
| E0908 | hmsgファイル内にlinkmsgハンドラーがない |
| E0909 | .hprcファイルでの関数定義 |
| E0910 | .hprcファイルでの定数定義 |
| E0911 | hmsgファイルにref文がない |
| E0912 | hmsgファイルに複数のref文がある |
| E0913 | ref文がimport/include文の後に宣言されている |
| E0914 | 別の.hmsgファイルで定義されたプロシージャの呼び出し |
| E1001 | context未定義エラー |
| E1002 | contextフィールド未定義エラー |
| E1003 | context定義の重複 |
| E1004 | 未定義スクリプトへのcontext定義 |
| E1301 | 二項演算子の型不一致 |
| E1302 | 同一型に対する無効な二項演算子 |
| E1401 | テスト名の重複 |
| E1402 | アサーション引数の型不一致 |
| E1403 | モック関数が存在しない |
| E1404 | モック関数の引数数不一致 |
| E1405 | モック関数の引数型不一致 |
| E1406 | モック関数の戻り値型不一致 |
警告レベル
コンパイルは成功しますが、注意が必要な警告です。
| コード | 説明 |
|---|---|
| W0201 | 未使用変数 |
| W0202 | 未使用関数(※1) |
| W0203 | 未使用プロシージャ(※1) |
| W0204 | 未使用定数(※1) |
| W0205 | 未使用import |
| W0206 | 冗長import(.hmsgファイルで親.hlと重複) |
| W0207 | 未使用include |
| W0208 | 未使用スクリプト |
| W0209 | 未使用アバター |
| W0210 | 未使用プリム |
| W0211 | 冗長include(.hmsgファイルで親.hlと重複) |
| W0212 | 未使用linkmsgハンドラ |
| W0213 | 未使用primsグループ |
| W0301 | linkmsgハンドラーが未定義(@hmsg指定時は指定ファイル内のみを検索) |
| W0302 | ワイルドカードパターンのみのswitch文 |
| W0303 | 暗黙の精度低下変換(float → int) |
| W0304 | sensor系プロシージャ呼び出し元スクリプトに#sensor/#no_sensorハンドラが未定義 |
| W0305 | ダイアログのボタンが24バイト超(自動切り詰め) |
| W0306 | ダイアログのチャンネルに対応する#listenハンドラーが未定義 |
| W0307 | request_permissionsプロシージャ呼び出し元スクリプトに#run_time_permissionsハンドラが未定義 |
| W0401 | debugターゲットへのチャンネル指定は無視される |
※1: W0202/W0203/W0204は.hlib/.hprcファイルをスタンドアロンでコンパイルした場合、クロスファイル参照情報がないため自動抑制されます(W0201のimport警告のみ表示)。.hlファイル経由のインポート時にのみ検出されます。