よく使うコードを少し詳しく説明したり、少し応用した使い方などを書いていきます。
目の前の座標を取得
04C4: create_coordinate $12500 $12501 $12502 from_actor $PLAYER_ACTOR offset 0.0 3.0 0.0
ここではグローバル変数を使用していますが、ローカル変数を使用することをオススメします。
爆発作成
020C: create_explosion_with_radius 0 at 0@ 1@ 2@
atの前の数値によって爆発の視覚効果等が異なります。
Type | 範囲 | ダメージ | 音 | 爆発後の炎の生成 |
---|---|---|---|---|
0 | 9 | 100 | ○ | × |
1 | 0 | 0 | × | ○ |
2 | 10 | 100 | ○ | × |
3 | 10 | 100 | ○ | ○ |
4 | 9 | 100 | × | × |
5 | 9 | 100 | × | × |
6 | 25 | 100 | ○ | × |
7 | 25 | 100 | ○ | × |
8 | 10 | 100 | ○ | ○ |
9 | 10 | 100 | ○ | × |
10 | 10 | 100 | ○ | × |
11 | 3 | 100 | ○ | × |
12 | 3 | 100 | ○ | × |
キー入力
00E1: player 0 pressed_key 19 0AB0: key_pressed 0x73
00E1はLMB等、ゲームの操作として意味を持ったキーを押下したとき真になります。ゲームパッドでも認識します。
0AB0はキーボードのキーを押下したときに真になります。
数値は16進または10進どちらで書いても機能します。(00E1は未確認)
16進数で表記する場合は 0x を数値の前につけてください。
キーコードはキー一覧を参照。
キー入力2
チートと同様に入力すると真になります。
少し長くなるので別ページを用意しました。→キー入力2
メモリ
メモリ関係へ移動しました。
取得した値を目で確認したい場合
03F0: toggle_text_draw 1 0013: 0@ *= 100.0 0092: 0@ = float 0@ to_integer 045A: draw_text_1number X Y GXT 'NUMBER' number 0@
知りたい値を0@に入れる
X,Yには画面上の座標(0.0, 0.0)~(640.0, 480.0)を自由に設定出来ます。
float(小数)のまま画面に表示すると意味が分からない数値で出てくるので、それっぽい場合は 0092 でint(整数)に変換します。
整数にすると当然小数点以下は切り捨てになるので、事前に100倍やら1000倍やら100000000倍してやってください。
1行目の 03F0: toggle_text_draw 1 は必須です。
文字表示にだいたい同じ事が書いてあります。
ジョイパッドからの方向キー入力
0494: get_joystick 0 data_to 0@ 1@ 2@ 3@
0@,1@は左スティック 2@,3@は右スティックです
0@/2@ 左右 入力値-128~-40 0 40~128
1@/3@ 上下 入力値-128~-40 0 40~128
※上記は私のアナログスティックで計測した値です。
最大・最小値(-128,128)は間違いないと思いますが
アナログの最小反応値(-40,40)はパッドによって異なる可能性があります。
デジタル方向キーの場合の入力値は-128 0 128の3通りです。
キーボードからの入力も可能ですが、マウスからの入力は不可です。
テクスチャ関係
0390: load_txd_dictionary 'aaa' 038F: load_texture "bbb" as 1 074B: texture 1 position 500.0 420.0 scale 256.0 32.0 angle 180.0 color_RGBA 255 255 255 255 038D: draw_texture 1 position 500.0 420.0 size 256.0 32.0 RGBA 255 255 255 255 03F0: toggle_text_draw 0 0391: release_txd_dictionary
上のコードでテクスチャを読み込む際、xxx.imgではなく、GTA San Andreas\models\txd から探しています。間違えてimgに放り込まないように。
存在していないテクスチャを読もうとすると厄介なフリーズの仕方をしますので注意してください。
Opcode | 説明 |
---|---|
0390 | aaa.txdをロード(拡張子はつけず名前だけを指定) |
038F | ロードしたtxd内のbbbというテクスチャを指定した番号に格納。 何番まで使えるかは不明。少なくとも数十番までは使える。 |
074B | 038Fで格納した番号、表示場所、大きさ、色を指定して画面上にテクスチャを表示する。 074Bは回転も指定可能だが、上下反転されて出力されるので対応が必要。 |
038D | |
03F0 | テクスチャを非表示(このコードを使うと他のcsで制御しているテクスチャなども消えてしまうので注意) |
0391 | 0390で読み込んだ全てのtxdを解放 |
- 038D,074Bのパラメータ
position 500.0 420.0 scale 256.0 32.0 angle 180.0 color_RGBA 255 255 255 255
- 表示場所(position)
X,Yの順に指定 (0.0,0.0)~(640.0,480.0)まで。画面外にはみ出してもエラーは出ない。 - 大きさ(size/scale)
ピクセルでそのまま指定。scaleとあるが倍率ではない。 - 角度(angle)
074Bのみ。
前述の通り074Bはテクスチャが上下反転されて出力されるため、使用する際はあらかじめ上下反転したtxdを作っておく事を推奨。
大きさでYを反転させればtxdを反転させなくても済む? - 色(RGBA)
RGBAはRed Green Blue Alpha(透明度)の頭文字。各0~255。色に変化を付けないなら全て255で良い。
- 表示場所(position)
アニメーション関係
04ED: load_animation "GRENADE" 04EE: animation "GRENADE" loaded 0605: $PLAYER_ACTOR perform_animation_sequence "WEAPON_START_THROW" IFP_file "GRENADE" 4.0 loop 1 0 0 0 time -1 // versionA 0812: AS_actor $PLAYER_ACTOR perform_animation "WEAPON_START_THROW" IFP_file "GRENADE" 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 //versionB
Opcode | 説明 |
---|---|
04ED | アニメーションgrenade.ifpを読み込む |
04EE | grenade.ifpが読み込めているかどうかチェック |
0605 | grenade.ifp内のWEAPON_START_THROWを$PLAYER_ACTORに実行させる。 現在アニメーションを実行中の場合、0605は終わってから実行。0812は中断して実行。 |
0812 |
- 0605,0812のパラメータ
4.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 4.0 アニメーション実行速度 デフォルトは4.0。かなり大きな値にしないと速さが実感できない。 loopA 0 アニメーションをループさせるか 1にするとこのアニメーションをずっと繰り返す lockX 1 アニメーションをさせるとき、PEDのX座標を固定するかどうか 1にすると固定 lockY 1 アニメーションをさせるとき、PEDのY座標を固定するかどうか 1にすると固定 lockF 0 アニメーションをさせるとき、PEDのZ座標を固定するかどうか 1にすると固定(未検証) time -1 アニメーションを停止するまでの時間(ms)。-1にすると途中停止しない。
ifp内のアニメーションはGmax等のツールを使って調べます。
その他
その他Opcode wikiに詳しい説明がないもの
02CE: 16@ = ground_z_at 2@ 3@ 4@
座標2@ 3@ 4@の地面の高さを取得。
4@より下の一番近い地面の高さが代入される。下に地面がないときは0が入る。地中の場合はマイナス?
Z(4@)には600.0とか1000.0とか適当な大きい数字を入れておけば確実に指定XY地点の地表の高さを拾える。
ただしプレイヤーが近寄るなどしてロードされていないと上手く拾えないようなので注意。
06BD: no_obstacles_between 67@ 68@ 69@ and 287@ 288@ 289@ solid 1 car 0 actor 0 object 0 particle 0
67@ 68@ 69@と287@ 288@ 289@の間に何かが存在するかどうか。存在したら偽を返す。
後ろの数値は調べる対象。1で対象 0で対象外
solid = マップ / car = 車 / actor = 人 / object = 物 / particle = エフェクト(炎や煙など)
070A: AS_actor $PLAYER_ACTOR attach_to_object 0@ offset 0.0 0.0 0.0 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time 1 09A0: (unknown) $PLAYER_ACTOR 0@ 0.0 0.0 0.0 5 16 "NULL" "NULL" -1
アニメーション後、人の骨にオブジェクトをくっつける
070Aと09A0を使うことで同時に二つのオブジェクトがくっつけられる。
0A70が一つ目 09A0が二つ目
on_bone 6 16 の6の部分で骨指定。16の部分は不明だが、常にこの数値。
骨の番号
0 - 使うと落ちる
1 - Spine1
2 - Head
3 - R UpperArm
4 - L UpperArm
5 - R Hand
6 - L Hand
7 - R Thigh
8 - L Thigh
9 - R Foot
10 - L Foot
11 - L Calf
12 - R Calf
13 - R ForeArm
14 - L ForeArm
15 - Bip01 R Clavicle
16 - Bip01 L Clavicle
17 - Neck
18 - Jaw
19 - 使うと落ちる
例
... 0107: 0@ = create_object #KATANA at 0.0 0.0 0.0 0107: 1@ = create_object #KATANA at 0.0 0.0 0.0 070A: AS_actor $PLAYER_ACTOR attach_to_object 0@ offset 0.0 0.0 0.0 on_bone 6 16 perform_animation "NULL" IFP_file "NULL" time 1 09A0: (unknown) $PLAYER_ACTOR 1@ 0.0 0.0 0.0 5 16 "NULL" "NULL" -1 ...
両手に刀を持たせることが出来る。
オブジェクトとして手に持っているだけなので当然武器としては使えない。
素手の状態だと持ったままパンチする。