VIPRAの仕様
VIPRAの仕様
目次
基本的な仕様
データ型
変数宣言と代入
演算子
出力
制御構文
関数
数学関数
組み込み関数
特殊関数
Minecraft用関数
API用関数
import機能
ありそうな質問
基本的な仕様
VIPRAはJavascript(以降js)を参考にして作られた、Minecraft Bedrock(統合版)で使える独自スクリプト言語です。
jsの基本的な構文を使用することができて仕様もある程度同じですが、異なる部分もあるので、AI生成されたjsのコードをそのままコピーアンドペーストするのは控えてください。
分かりやすく大きく異なる点として、
- コメントの記法
- コードの終わり方
コメントの記法は、jsと異なり、/**と**/で囲まれた部分(複数行にも対応)がコメントになります。
コード例:
/**コメント**/
コードの終わり方は、毎回;が必要になります。
コード例:
let a = 0;
データ型
VIPRAでは下記のデータ型を使用することができます。
大まかな記法はjsと同じです。
- 数値(整数、小数)
- 文字列(""や''で囲む)
- 真偽値(trueまたはfalse)
- 配列([と]で囲まれたデータ群)
- オブジェクト({と}で囲まれ、keyとvalueを持つデータ群)
コード例:
let a = 1;/**正の数**/
let b = -1/**負の数**/
let c = 0.1;/**小数**/
let d = "文字列";/**文字列**/
let e = '文字列';/**文字列**/
let f = "文字列1'文字列2'文字列3";/**"と'の混在も可能**/
let g = "文字列1\"文字列2\"文字列3";/**\によるエスケープも可能**/
let h = true;/**真**/
let i = false;/**偽**/
let j = [1, "a", [2, 3], {key: "value"}];/**配列の中にはほかのデータ型も格納可能**/
let k = {key1: 1, key2: "a", key3: [1, 2], key4: {key5: "value"}};/**オブジェクトの中にはほかのデータ型も格納可能**/
変数宣言と代入
VIPRAでは下記の変数宣言を行うことができます。
大まかな記法はjsと同じです。
- let(再代入可能)
- const(再代入不可能)
let a = 0;/**let**/
const b = 0;/**const**/
また、各データ型の代入も可能です。
コード例:
let a = 0;
a = 1;/**同一データ型の代入**/
let b = 0;
b = "a";/**異なるデータ型の代入**/
let c = [1, 2, 3];
c[2] = 4;/**配列への代入**/
let d = {key: "value"};
d.key = "a";/**オブジェクトへの代入**/
let e = {key: "value"};
e["key"] = "a";/**オブジェクトへの代入**/
let f = {key: "value"};
let g = "key";
f[g] = "a";/**オブジェクトへの代入**/
演算子
VIPRAには下記の演算子が存在します。
大まかな記法はjsと同じです。
- +(加算)
- -(減算)
- *(乗算)
- /(除算)
- %(剰余)
- =(代入)
- +=(加算して代入)
- -=(減算して代入)
- *=(乗算して代入)
- /=(除算して代入)
- %=(剰余して代入)
- ==(等しい)
- !=(等しくない)
- <(より小さい)
- >(より大きい)
- <=(等しいか小さい)
- >=(等しいか大きい)
- &&(且つ)
- ||(又は)
- !(ではない)
- ++(インクリメント)
- --(デクリメント)
- 条件式 ? 式1 : 式2(三項演算子)
コード例:
let a = 0;
a = 1 + 2;/**加算**/
let b = 1;
b = b + 1/**加算**/
let c = 0;
c = 2 - 1;/**減算**/
let d = 0;
d = 2 * 3;/**乗算**/
let e = 0;
e = 5 / 3;/**除算**/
let f = 0;
f = 5 % 3;/**剰余**/
let g = 0;
g = 1;/**代入**/
let h = 0;
h += 1;/**h = h + 1;と同じ**/
let i = 0;
i -= 1;/**i = i - 1;と同じ**/
let j = 1;
j *= 2;/**j = j * 2;と同じ**/
let k = 2;
k /= 2;/**k = k / 2;と同じ**/
let l = 3;
l %= 2;/**l = l % 2;と同じ**/
let m = false;
m = (m == false);/**等しいかどうかを返す**/
let n = false;
n = (n != false);/**等しくないかどうかを返す**/
let o = false;
o = (2 < 3);/**より小さいかどうかを返す**/
let p = false;
p = (2 > 3);/**より大きいかどうかを返す**/
let q = false;
q = (2 <= 3);/**等しいか小さいかどうかを返す**/
let r = false;
r = (2 >= 3);/**等しいか大きいかどうかを返す**/
let s = false;
s = (2 < 3 && 3 > 2);/**且つ**/
let t = false;
s = (2 < 3 || 2 > 3);/**又は**/
let u = false;
s = !(u);/**ではない(逆)**/
let v = 1;
v++;/**インクリメント(後置)**/
let w = 1;
++w;/**インクリメント(前置)**/
let x = 1;
x--;/**デクリメント(後置)**/
let y = 1;
--y;/**デクリメント(前置)**/
let z = 2;
z = (2 > 3 ? 1 : 0);/**三項演算子**/
出力
出力として、print関数が用意されています。
jsで言うconsole.logみたいなものです。
コード例:
print(0);/**数値**/
print("a");/**文字列**/
print([1, 2]);/**配列**/
let a = 1;
print(a);/**変数**/
制御構文
VIPRAでは下記の制御構文が使用できます。
大まかな記法はjsと同じです。
- if文(elseを含む)
- for文
- while文
- do-while文
- switch文
- break文
- continue文
- return文(関数のところで使用します)
コード例:
if(1 > 2) {
print("true");/**真の場合**/
}
if(2 > 1) {
print("true");/**真の場合**/
} else {
print("false");/**偽の場合**/
}
if(2 > 1) {/**条件1**/
print("true");/**条件1が真の場合**/
} else if(3 > 1) {/**条件2**/
} else if(3 > 1) {/**条件2**/
print("true");/**条件1が偽且つ条件2が真の場合**/
} else {
print("false");/**条件1が偽且つ条件2が偽の場合**/
}
for(let i = 0; i < 3; i++) {/**3回繰り返す**/
print(i);
}
for(let i = 0; i > -3; i--) {/**3回繰り返す**/
print(i);
}
let a = 0;
while(a < 3) {/**3回繰り返す**/
print(a);
a++;
}
let a = 0;
do {
print(a);
a++;
} while(a < 3);/**3回繰り返す**/
let b = 0;
switch(b) {
case 0:/**0の場合**/
print(0);
case 1:/**0又は1の場合**/
print(1);
}
let b = 0;
switch(b) {
case 0:/**0の場合**/
print(0);
case 1:/**0又は1の場合**/
print(1);
default:/**0又は1又はその他の場合**/
print("default");
}
while(true) {/**常にループ**/
break;/**ループを抜ける**/
}
let b = 0;
switch(b) {
case 0:/**0の場合**/
print(0);
break;/**switchを抜ける**/
case 1:/**1の場合**/
print(1);
}
for(let i = 0; i < 3; i++) {/**3回繰り返す**/
continue;/**以降の処理をスキップして戻る**/
print(i);/**実行されない**/
}
関数
関数の記法はjsの基本的な関数とほとんど同じです。
コード例:
function a() {/**引数無し**/
print("a");
/**返り値無し**/
}
a();/**呼び出し**/
function b() {/**引数無し**/
return "b";/**返り値**/
}
let c = b();/**呼び出し**/
function d(e) {/**引数1つ**/
print(e);
/**返り値無し**/
}
d("f");/**呼び出し**/
function g(h, i) {/**引数2つ**/
print(h + i);
/**返り値無し**/
}
g(1, 2);/**呼び出し**/
function j(k) {/**引数1つ**/
if(k == 0) {
return 3;/**返り値**/
} else {
return j(k - 1);/**再帰呼び出し**/
}
}
j(3);/**呼び出し**/
数学関数
VIPRAでは下記の数学関数が使用できます。
大まかな記法はjsと同じです。
引数や返り値に関してはこちらをご覧ください。
- random
- sin
- cos
- tan
- sqrt
- pow
- abs
- log
- exp
- floor
- ceil
- PI(定数)
- E(定数)
- asin
- acos
- atan
- sinh
- cosh
- tanh
- asinh
- acosh
- atanh
- round
- sign
- min
- max
- trunc
コード例:
let a = random();/**0~1の実数**/
let b = sqrt(4);/**正の平方根**/
let c = PI;/**円周率**/
let d = E;/**ネイピア数**/
組み込み関数
VIPRAには下記の組み込み関数が存在します。
大まかな仕様はjsと同じですが、記法が少し異なります。
- length(配列の長さを返す)
- keys(オブジェクトのキーを返す)
- int(文字列を整数に変換する)
- float(文字列を実数に変換する)
- string(数値を文字列に変換する)
- jsonStringfy(オブジェクトを文字列に変換する)
- jsonParse(文字列をオブジェクトに変換する)
- split(文字列を配列に変換する)
- splice(文字列の特定部分を取り出す)
- replace(文字列の特定部分を置き換える)
- type(変数の型を返す)
コード例:
let a = [1, 2, 3];
print(length(a));/**3**/
let b = {key1: 0, key2: 1, key3: 2};
print(keys(b));/**["key1", "key2", "key3"]**/
let c = "23";
print(int(c));/**整数の23**/
let d = "2.3";
print(float(d));/**実数の2.3**/
let e = 23;
print(string(e));/**文字列の23**/
let f = {key: "value"};
print(jsonStringfy(f));/**{key: "value"}**/
let g = "{key: 'value'}";
let h = jsonParse(g);/**{key: 'value'}**/
let i = "a, b, c";
print(split(i, ", "));/**["a", "b", "c"]**//**第2引数は区切り文字**/
let j = "abcde";
print(splice(j, 1, 3));/**bcd**//**第2引数は開始インデックス、第3引数は終了インデックス**/
let k = "a, b, c";
print(replace(k, ",", ":"));/**a: b: c**//**第2引数は置換する文字列、第3引数は置換後の文字列**/
let l = "abc";
print(type(l));/**string**//**jsのtypeofと大体同じ**//**配列とオブジェクトも区別する**/
特殊関数
VIPRAには下記の特殊関数が存在します。
返り値はjsにあるものですが、直接定義できないので関数で無理やり定義しています。
- undefined
- infinity
- nan
- null
- date(これは他のと違いますが、jsのDateのように現在時刻を返します)
コード例:
let a = undefined();/**undefined**/
let b = infinity();/**正のInfinity**/
let c = nan();/**Nan**/
let d = null();/**Null**/
let e = date();
/**
{
year: getFullYear(),
month: getMonth() + 1,
date: getDate(),
day: getDay(),
hours: getHours(),
minutes: getMinutes(),
seconds: getSeconds()
}
形式で返されます。(jsのメソッドの返り値が対応するキーの値に格納されます)
**/
Minecraft用関数
VIPRAには下記のMinecraft用関数が存在します。
プロパティオブジェクトに関してはこちらをご覧ください。
Form系の返り値等はこちらをご覧ください。
- data(イベントのプロパティオブジェクトを返す)
- worldData(worldのプロパティオブジェクトを返す)
- mcObject(Minecraftのプロパティオブジェクトをできる限り可視化したオブジェクトに変換する)
- actionForm(actionFormを出す)
- modalForm(modalFormを出す)
- codeForm(codeFormを出す)
mcObjectは一見すると無意味に見えますが、API等のMinecraftからのデータオブジェクトを解析する用途では必須です。
例えば、そのままではjsonStringfyで変換したとしてもほとんど何もないですが、mcObjectで変換してからだと、その大部分が可視化されます。
これは主にMinecraftからのデータオブジェクトを用いて条件分岐や別の処理をする際に有効です。
Form系の第1引数には、手動実行の場合のみ、playerオブジェクト以外に文字列の"self"が使用できます。
この場合、実行者にUIが表示されます。
actionForm用の第2引数には、
{
d1: {/**ここのキーの名前はなんでもいい**/
body: "body"/**本文**//**値はフォームに表示される**/
},
d2: {/**ここのキーの名前はなんでもいい**/
button: {/**ボタン**/
text: "text",/**値はフォームに表示される**/
icon: ""/**アイコンパスも設定できる**/
}
},
d3: {/**ここのキーの名前はなんでもいい**/
button: {/**ボタン**/
text: "text",/**値はフォームに表示される**/
icon: ""/**アイコンパスも設定できる**/
}
}
}
のようなオブジェクトが必要です。
なお、最初(上で言うd1)の中身がbodyであれば、それ以降(上で言うd2以降)のボタンは何個でも追加できます。(1つ以上)
modalForm用の第2引数には、
{
d1: {/**ここのキーの名前はなんでもいい**/
textField: {/**テキスト入力欄**/
label: "label",/**値はフォームに表示される**/
placeholder: "placeholder",/**未入力時に表示する**/
defaultValue: "defaultValue"/**初期値**/
}
},
d2: {/**ここのキーの名前はなんでもいい**/
dropdown: {/**要素選択**/
label: "label",/**値はフォームに表示される**/
options: ["option1", "option2"],/**要素配列**/
defaultValueIndex: 0/**初期値**/
}
},
d3: {/**ここのキーの名前はなんでもいい**/
toggle: {/**2択選択**/
label: "label",/**値はフォームに表示される**/
defaultValue: false/**初期値**/
}
},
d4: {/**ここのキーの名前はなんでもいい**/
slider: {/**スライダー式選択**/
label: "label",/**値はフォームに表示される**/
minimumValue: 0,/**最小値**/
maximumValue: 10,/**最大値**/
valueStep: 1,/**刻み値**/
defaultValue: 5/**初期値**/
}
}
}
のようなオブジェクトが必要です。
なお、少なくとも1つ以上要素があれば、どの要素がどの順番で合計何個あっても問題ありません。
※Form系のタイトルは変更できません。
コード例:
let a = data();/**手動実行だと空になる**/
let b = worldData();
let c = worldData();
print(mcObject(c));/**可視化される**/
let d = {
body: {
body: "本文"
},
button1: {
button: {
text: "ボタン1",
icon: ""
}
},
button2: {
button: {
text: "ボタン2",
icon: ""
}
},
button3: {
button: {
text: "ボタン3",
icon: ""
}
}
};
let e = actionForm("self", d);/**UIの結果が返ってくるまで待機する**//**jsの非同期処理を使用しています**/
let f = data();
let g = f.sender;/**chatSendのプレイヤー(送信者)プロパティ**/
let h = {
body: {
body: "本文"
},
button1: {
button: {
text: "ボタン1",
icon: ""
}
}
};
let i = actionForm(g, h);/**UIの結果が返ってくるまで待機する**//**jsの非同期処理を使用しています**/
let j = {
toggle1: {
toggle: {
label: "toggle1",
defaultValue: false
}
},
toggle2: {
toggle: {
label: "toggle2",
defaultValue: false
}
}
};
let k = modalForm("self", j);/**UIの結果が返ってくるまで待機する**//**jsの非同期処理を使用しています**/
let l = "test";
let m = codeForm("self", l);/**第2引数はコードの初期値**//**UIの結果が返ってくるまで待機する**//**jsの非同期処理を使用しています**/
API用関数
VIPRAには下記のAPI用関数が存在します。
それぞれ、第1引数がメソッドをつけるオブジェクトになり、第2引数以降がメソッドの第1引数以降のように1つずれます。
メソッドに引数が存在しない場合、引数は第1引数だけになります。
それぞれのメソッドの仕様や返り値はこちらをご覧ください。
- runCommand
- getComponent
- getComponents
- getItem
- getItemStack
- getTags
- getBlock
- getEntities
- getPlayers
- getAllPlayers
- getWheather
- getDynamicProperty
- setDynamicProperty(成功したかの返り値があるため、値を代入してください)
- getEffect
- getEffects
- getRotation
- getVelocity
- getLore
- setLore(成功したかの返り値があるため、値を代入してください)
- getGameMode
- getTotalXp
- getObjective
- getObjectives
- getScore
- getScores
- getAbsoluteTime
- getDay
- getDifficulty
- getDimention
- getTimeOfDay
- getEquipment(これだけ独自関数)
コード例:
let a = worldData();
let b = getAllPlayers(a);/**これの返り値はプレイヤーオブジェクトの配列です**/
let c = data();
let d = c.sender;/**chatSendのプレイヤー(送信者)プロパティ**/
let e = getComponent(d, "inventory");
let f = data();
let g = f.sender;/**chatSendのプレイヤー(送信者)プロパティ**/
let h = getEquipment(g);/**第1引数にエンティティオブジェクト**/
let i = worldData();
let j = setDynamicProperty(i, "tb:test", "test");/**成功したかどうかが返される**/
let k = getDynamicProperty(i, "tb:test");
/**
{
mainhand: EquipmentSlot.Mainhand,
offhand: EquipmentSlot.Offhand,
head: EquipmentSlot.Head,
chest: EquipmentSlot.Chest,
legs: EquipmentSlot.Legs,
feet: EquipmentSlot.Feet
}
形式で返されます。(それぞれのアイテムスタックオブジェクトが、対応するキーの値に格納されます)
**/
import機能
VIPRAではコードの省略化を行えるように、よく使用する関数をあらかじめ定義しておき、それをいつでもいきなり使用できるようになっています。
例えば、
function a(b, c) {
print(b + c);
}
がimportに割り当てられている場合、
a(1, 2);
と本文に書くだけで関数が実行できます。
※importに割り当てられた関数と本文の関数で同名関数が定義されている場合、本文の関数が呼び出されます。
ありそうな質問
ありそうな質問をあらかじめ回答しておきますので参考にしてください。
Q.コードの実行時にエラーが出る
A.まずコードを確認してください。AIに生成してもらったjsのコードをそのまま張り付けても実行できません。次にコメント文を確認してください。VIPRAでは/****/のコメントしか使用できません。次に;が抜けてないか確認してください。;がないとコードの区切りを認識できません。次に構文ミス、カッコのチェックを行ってください。jsと全く同じ仕様ではないので、注意してください。次に適切な使用権限があるか確認してください。特にMinecraft関連の関数やAPI関連の関数はeditor権限では使用できません。最後にロジックやアルゴリズムのチェックを行ってください。
Q.オブジェクトの中身が空、もしくは全然ない
A.Minecraftからのデータはデータを取ったり使用したりするだけならそのままでも問題ないですが、閲覧したり中身を直接確認する必要がある場合にはmcObjectで可視化する必要があります。特にForm系の返り値もこれを行わないと何もデータが取れないので注意してください。
Q.イベントのキャンセルができない
A.VIPRAが非同期実行している都合上、イベントのキャンセルはできません。ただ、chatSendだけは設定で変更できるようになっていますので、活用してください。
Q.データの書き換えができない
A.私にもよくわかりませんが、データの書き換えができないのは仕様っぽいので、読み取りだけ行って書き換えはrunCommandで代用してください。