Classについて

Last-modified: 2018-12-13 (木) 22:09:06
 

概要

Sanny Builder3では、より素早くスクリプトが書けるようにOpcodeよりわかりやすく簡潔に記述できるコードが用意されています。
9種類のクラスネームにそれぞれ数種類のクラスメンバーが付きます。
クラスメンバーを選択する画面左に check, proc, property と3種類出てきます。それぞれ
check … 主に条件に使用するクラスメンバー
proc … 主に宣言に使用するクラスメンバー
property … 主に値取得に使用するクラスメンバー 右式に書いて左式に代入など
となっています。

クラスネーム

クラスメンバーは多すぎるので記述しません

Class名対象
Actor
Cameraカメラ
Car乗り物
Garageガレージ
Markerマーカー
Modelモデル
Objectオブジェクト
Pickup拾える物(武器やミッション専用の物)
PlayerCJ

使用例

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で書かれたソースがコンパイルを通らなくなる欠点はありますが)