# イベントスクリプト仕様

## スクリプトファイルの名称

EventID.ssfとし、scriptsフォルダに入れるものとする。フォルダ分けは自由。

## 基本的な書き方

1. 命令 パラメータ1=値1 パラメータ2=値2
2. 命令 パラメータ1=値1 パラメータ2=値2
     オプション1
     オプション2
   end

## 特殊な命令など

### コメント
行頭が#で始まるものはコメントとして扱う。

### ラベル
行頭が*で始まるものはそれ以降の文字列をラベル名とし、goto命令でのジャンプ先として機能する。
ラベルが複数続けて書かれている場合は最後のラベルのみ有効となる。

### world VariableName1[,VariableName2,...]
指定した変数名をワールド変数として扱う。
ワールド変数とは全キャラクターで共通の変数。
ワールド変数は処理を抜けたりサーバを再起動しても保持される。

### global VariableName1[,VariableName2,...]
指定した変数名をグローバル変数として扱う。
グローバル変数とは任意のキャラクター内で使用可能な変数。
グローバル変数は処理を抜けたりサーバを再起動しても保持される。

## include ScriptName
指定したスクリプトを読み込んでincludeの記述があった位置に展開する。
無限ループ防止のため同じスクリプトに対する記述は一度のみ可能。

### 変数名
変数名が空の場合はイベントデフォルト変数が使用される。
イベントデフォルト変数は各イベントにひとつ存在する変数で、EventIDを変数名としたもの。
通常は変数名に数値を使用できないため、イベントデフォルト変数は同一のイベント内からのみアクセスできる。
ワールド変数、グローバル変数、ローカル変数の名前空間は同一で、各々で同じ名前は使用できない。

## 命令一覧
[]で囲まれたパラメータは省略可能です。
例えば[abc=1]とある場合、abcパラメータを省略するとabc=1が自動的に指定されたことになります。

### case [var=""]
    case var=foo
      1: goto label=a1
      2: goto label=a2
      default: return
    end
case命令は変数の内容によって処理を分岐する。
分岐ラベルには命令をひとつのみ記述することができる。
ただしオプションを必要とする命令は記述できない(命令自体は記述可能だがオプションが記述不可)。
defaultラベルが無い場合はcaseの次の命令に移る。

### goto label=LabelName
    goto label=a1
goto命令は指定したラベル名へジャンプする。

### sysmsg msg=MessageText
    sysmsg msg=メッセージサンプル
sysmsg命令はシステムメッセージ(R03ED)を送信する。

### say id=TargetID msg=MessageText [public=0]
    say id=18001619 msg=Hello
    say id=CHAR_ID msg=Hello
    say id=PARTNER_ID msg=Hello
say命令は吹き出しで発言を表示する。
idはNPCのIDが指定できるが、CHAR_IDとPARTNER_IDを指定した場合は実行時にキャラクターやパートナーのIDに置き換えられる。
msgは発言内容を指定する。
public=1とすると周囲にも見える状態で発言を表示する。

### talk [id=0] [motion=0] [title=""] [pict=0]
    talk motion=111 title=発言者名
    メッセージを$R
    記述する
    end
talk命令はメッセージブロック(R03F7,R03F9,R03FA)を送信する。
idはNPCID、motionはMotionID、pictはPictIDを指定する。
{CHAR_NAME}と入れるとその部分はキャラ名に置き換えられる。
${VariableName}とすると指定した変数の値を展開する。

### return
    return
return命令は処理を終了しロック解除(R05DD)を送る。
ローカル変数はクリアされる。

### inc [var=""]
    inc var=foo
inc命令は指定した変数を1インクリメントする。

### select result=VariableName [title=""] [confirm=""] [cancel=0] [timeout=0]
    select title=どうする？
      選択肢1
      選択肢2
    end
select命令は選択肢を表示する。
クライアントが選択するまで次の処理には進まない。
選択されるとresultで指定した変数に結果が格納される。
結果は1,2,3,...と1ベースで返ることに注意。

### wait [time=0]
    wait time=495
wait命令は指定した時間(ミリ秒)だけ処理をブロックする。
motion命令などは非同期で実行されるため、この命令で動作の完了を待つ。

### window id=WindowID [open=1] [x=-1] [y=-1]
    window id=0 x=0 y=0
指定したWindowIDに対応するウィンドウをクライアントに表示する。
0のみ特殊で、id=0 open=1で画面上のウィンドウを全て非表示にする。

### warp map=MapID x=X y=Y [dir=0]
    warp map=10023000 x=97 y=133 dir=90
PCを指定したマップの指定した座標に移動する。
座標は0-255の間で指定、dirは0-359の間で指定する。

### image
### set var=VariableName value=ExprValue
    set var=flag1 value=15
    set var=flag1 value=CHAR_GOLD
    set var=flag1 value=flag2
set命令はvarで指定した変数にvalueで指定した値を代入する。
valueには整数リテラル、定義済み変数、ユーザー定義変数のいずれかを指定できる。
定義済み変数は以下の通り。
- CHAR_RACE: 種族(0=エミル 1=タイタニア 2=ドミニオン 3=DEM)
- CHAR_SEX: 性別(0=♂ 1=♀)
- CHAR_JOB: 職業(数値はjob.jsonのid)
- CHAR_LEVEL: レベル
- CHAR_JOBLEVEL: ジョブレベル
- CHAR_EXP: 経験値
- CHAR_JOBEXP: ジョブ経験値
- CHAR_GOLD: 所持金
- CHAR_HP: 現在HP
- CHAR_MAXHP: 最大HP
- CHAR_MP: 現在MP
- CHAR_MAXMP: 最大MP
- CHAR_SP: 現在SP
- CHAR_MAXSP: 最大SP
- CHAR_EP: 現在EP
- CHAR_MAXEP: 最大EP

### effect id=TargetID effect=IntValue [x=-1] [y=-1]
### screen [enable=1] [color=0]
### shownpc id=NPCID x=IntValue y=IntValue dir=0-7
### hidenpc id=NPCID
### movenpc id=NPCID x=IntValue y=IntValue speed=IntValue dir=0-7 movetype=IntValue motion=IntValue motionspeed=IntValue
### walknpc id=NpcID x=IntValue y=IntValue dir=0-359 movetype=IntValue
### morphnpc id=NpcID pict=PictID

### motion id=NpcID motion=MotionID [loop=1] [public=0]
    motion id=18001619 motion=113
    motion id=PARTNER_ID motion=113 loop=0
motion命令は指定したIDを持つターゲットにmotionで指定したモーションを実行させる。
idにはNPCのID、PARTNER_ID(パートナーのIDに置き換え)が指定可能。
loopは省略するとモーションをループするため、1回で終了する場合は明示的にloop=0を指定する必要がある。
public=1とすると周囲にも見える状態でモーションを実行する。

### motionpc motion=MotionID [loop=1]
### r0615
### walkpc x=IntValue y=IntValue dir=0-359 [movetype=23]

### dir id=TargetID dir=0-359
    dir id=11000618 dir=0
    dir id=CHAR_ID dir=180
dir命令は指定したIDを持つターゲットの向きを変更する。
idにはNPCのID、CHAR_ID(PCのIDに置き換え)が指定可能。

### camera x=IntValue y=IntValue z=IntValue dir=IntValue angle=IntValue [time=0]
### resetcamera
### getexp [exp=0] [jobexp=0]
### getgold gold=IntValue
### getitem id=ItemID [count=1]
### loseitem id=ItemID [count=1]
### hasitem id=ItemID [count=1] [label=""] [else=""]

### if compare=CompareMethod value=IntValue [var=""] [label=""] [else=""]
    if var=tmp compare=lessthan value=10 label=truelabel else=falselabel
if命令はcompareで指定した方法によって変数と値を比較し、結果が真の時はlabelに、偽の時はelseに指定したラベルにジャンプする。
CompareMethodは次のものがある。
    equal
    notequal
    greaterthan
    greaterthanequal
    lessthan
    lessequal
labelとelseは両方省略することはできない。
labelが空で結果が真の時、あるいはelseが空で結果が偽の時は次の命令に移る。

### ifequip pos=EquipPos [id=-1] [label=""] [else=""]
ifequip命令は指定した装備箇所に指定したアイテムを装備しているか判定し、結果が真の時はlabelに、偽の時はelseに指定したラベルにジャンプする。
posには0～13を指定する。
idにはアイテムIDを指定するが、-1を指定する(省略時は-1)と単にその装備箇所に何かが装備されているかどうかで判定する。
labelとelseは両方省略することはできない。
labelが空で結果が真の時、あるいはelseが空で結果が偽の時は次の命令に移る。

### ifstatus type=IntValue compare=CompareMethod value=IntValue [label=""] [else=""]
ifstatus命令は指定したステータス値と値を比較し、結果が真の時はlabelに、偽の時はelseに指定したラベルにジャンプする。
typeは0～7で指定する。
CompareMethodはif命令を参照。

### haspartner [label=""] [else=""]
    haspartner label=true else=false
haspartner命令はパートナーの有無によって分岐し、結果が真の時はlabelに、偽の時はelseに指定したラベルにジャンプする。
パートナーがライドパートナーである場合は偽として判定される。
labelとelseは両方省略することはできない。
labelが空で結果が真の時、あるいはelseが空で結果が偽の時は次の命令に移る。

### shownavicursor
### hidenavicursor
### npcflags
### showquest
### buyshop [rate=1.0]
### sellshop  [rate=0.1] [limit=4000]
### deposit
### withdraw
### warehouse
### inputnumber title=TitleText result=VariableName
### freeshop

### playbgm id=IntValue [public=0]
playbgm命令は指定したBGMを再生する。
public=1とすると周囲にも影響する形でBGMを再生する。

### stopbgm
### setbgm volume=IntValue

### playse id=IntValue [loop=0] [volume=100] [pan=50]
playse命令は指定した効果音を再生する。
public=1とすると周囲にも影響する形で効果音を再生する。

### stopse id=IntValue
### setse id=IntValue [volume=100] [pan=50]

### browser url=URL [x=-1] [y=-1] [width=810] [height=700]
browser命令はurlで指定したURLをブラウザで表示する。
x,yは-1を指定するとセンタリングして表示する(省略時デフォルト)。

### irisgacha
irisgacha命令はイリスカード交換ウィンドウを表示する。

### add var=VariableName value=ExprValue
add命令はvarで指定した変数とvalueに指定した値を足し、varで指定した変数に代入する。

### sub var=VariableName value=ExprValue
sub命令はvarで指定した変数からvalueに指定した値を引き、varで指定した変数に代入する。

### mul var=VariableName value=ExprValue
mul命令はvarで指定した変数とvalueに指定した値を掛け、varで指定した変数に代入する。

### div var=VariableName value=ExprValue
div命令はvarで指定した変数をvalueに指定した値で割り、varで指定した変数に代入する。

### mod var=VariableName value=ExprValue
mod命令はvarで指定した変数をvalueに指定した値で割った余りをvarで指定した変数に代入する。

### rand var=VariableName min=ExprValue max=ExprValue
    rand var=hoge min=0 max=9
rand命令はvarで指定した変数にmin～maxまでの数値をランダムで代入する。
