概要
Sanny Builder3では、より素早くスクリプトが書けるようにOpcodeよりわかりやすく簡潔に記述できるコードが用意されています。
9種類のクラスネームにそれぞれ数種類のクラスメンバーが付きます。
クラスメンバーを選択する画面左に check, proc, property と3種類出てきます。それぞれ
check … 主に条件に使用するクラスメンバー
proc … 主に宣言に使用するクラスメンバー
property … 主に値取得に使用するクラスメンバー 右式に書いて左式に代入など
となっています。
クラスネーム
クラスメンバーは多すぎるので記述しません
Class名 | 対象 |
---|---|
Actor | 人 |
Camera | カメラ |
Car | 乗り物 |
Garage | ガレージ |
Marker | マーカー |
Model | モデル |
Object | オブジェクト |
Pickup | 拾える物(武器やミッション専用の物) |
Player | CJ |
使用例
CJを無敵にしたい場合
Ctrl+Spaceで Class Window を開き、Actor を選択。
するとクラスメンバーが開くので、そこから SetImmunities を選択。
すると
Actor.SetImmunities() Actor:Handle; P2:Integer; P3:Integer; P4:Integer; P5:Integer; P6:Integer
と出ます。
今回の耐性付与の場合、それぞれ
Actor:Handle … 人のハンドル($PLAYER_ACTOR等)
P2:Integer … 銃撃耐性(0でOFF、1でON)
P3:Integer … 火炎耐性
P4:Integer … 爆発耐性
P5:Integer … 接触耐性
P6:Integer … 近接耐性
となっています。
実際に入力する時は;ではなく,で区切ってください。
例えば
Actor.SetImmunities($PLAYER_ACTOR, 1, 1, 1, 1, 1)
と書いた場合は
02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1
とまったく同じ意味になります。
使用上の注意
Classは便利ですが、スクリプトを作る上で枷になる可能性があります。
例えば
Actor.PutAt($PLAYER_ACTOR, 1@, 2@, 3@)
は
00A1: put_actor $PLAYER_ACTOR at 1@ 2@ 3@
と全く同じコードです。
しかし、このコードには似た動作をできるOpcodeがあります。
08C7: put_actor $PLAYER_ACTOR at 0.0 0.0 0.0 // versionB 0972: put_actor $PLAYER_ACTOR at 0.0 0.0 0.0 // versionC
00A1は指定された座標の少し上に移動します。
08C7は指定された座標にそのまま移動します。
0972については不明ですが、これも他と違うと見て間違いないでしょう。
つまり、Actor.PutAt(=00A1)で移動すると必ず落ちる動作が入ってしまいます。
スクリプトとしては落ちる動作をカットしたくても、Classを使用していると他に似たコードがあることに気づくことが出来ません。
他にも似た種類があるコードは沢山あるので、Classに依存しすぎない方が良いでしょう。
デコンパイル
Opcodeで書いてコンパイルされたものでも、デコンパイルするとClassで出力されます。
もしClassで出力してほしくない場合、設定の Write opcodes(オペコードを書き込む) にチェックを入れるとOpcodeとして出力できますが、ClassだけでなくKeyword(waitやifなど)も全てOpcodeを書かれてしまいます。
オプションはそのまま SB3/data/sa/classes.db をリネームか削除した場合はClassのみOpcodeで出力されるので、やるならこちらの方が良いかもしれません。
(こちらはこちらでClassで書かれたソースがコンパイルを通らなくなる欠点はありますが)