/*============================================================================

                            ＳＦＸＶＩ  for X680x0

                        キャラクタデータ作成支援マクロ

                                          Programed by  KYOSKE 1995,96,97,98

==============================================================================
                               WORKマクロ Rel.8
============================================================================*/

#ifndef __WORK_MACRO
#define __WORK_MACRO

/* 外部変数定義 */

extern long	myPlayer;
extern long	sfsysInfo;
extern short	flagNextProcess;

/* 基本マクロ */

#ifndef WORK
#define  WORK(p,ofs,type)	(*((type *)(((char *)(p))+(ofs))))
#endif

#ifndef WORK_USE_LIB

/* sfxvilib.a (Rel.13α) に含まれている関数 */

#define  属性設定_歩行速度(p,speed)		(WORK(WORK(p, 0x0a82, long), 0x003e, short) = speed)
#define  属性設定_シューティング(p,mode)	(WORK(p, 0x0f1a, short) = mode)
#define  属性取得_歩行速度(p)			(WORK(WORK(p, 0x0a82, long), 0x003e, short))
#define  属性取得_地上投げ威力(p)		(WORK(WORK(p, 0x0a82, long), 0x0038, short))
#define  属性取得_空中投げ威力(p)		(WORK(WORK(p, 0x0a82, long), 0x003c, short))
#define  属性取得_シューティング(p)		(WORK(p, 0x0f1a, short))
#define  Prm設定_CPU_近攻撃座り率(p,r)		(WORK(WORK(p, 0x0a82, long), 0x002c, short) = r)
#define  Prm設定_CPU_必殺技Ｓ小率(p,r)		(WORK(WORK(p, 0x0a82, long), 0x002e, short) = r)
#define  Prm設定_CPU_必殺技Ａ小率(p,r)		(WORK(WORK(p, 0x0a82, long), 0x0030, short) = r)
#define  Prm設定_CPU_必殺技Ｍ小率(p,r)		(WORK(WORK(p, 0x0a82, long), 0x0032, short) = r)
#define  Prm設定_CPU_空中必殺小率(p,r)		(WORK(WORK(p, 0x0a82, long), 0x0034, short) = r)
#define  状態設定_ジャンプ方向(p,drct)		(WORK(p, 0x01ba, short) = drct)
#define  状態設定_振動(p)			(WORK(p, 0x0f22, short) = 1)
#define  状態設定_防御許可(p)			(WORK(p, 0x01be, short) = 1)
#define  状態取得_動作(p)			(WORK(p, 0x09e2, short))
#define  状態取得_複合動作(p)			(WORK(p, 0x09e4, short))
#define  状態取得_表示方向(p)			(WORK(p, 0x01b6, short))
#define  状態取得_相対方向(p)			(WORK(p, 0x01b8, short))
#define  状態取得_動作方向(p)			(WORK(p, 0x09e8, short))
#define  状態取得_ジャンプ方向(p)		(WORK(p, 0x01ba, short))
#define  状態取得_燃焼(p)			(WORK(p, 0x0a90, short))
#define  状態取得_無敵(p)			(WORK(p, 0x01c0, short))
#define  状態取得_変身(p)			(WORK(p, 0x01b4, short))
#define  状態取得_防御許可(p)			(WORK(p, 0x01be, short))
#define  状態取得_受け身(p)			(WORK(p, 0x0ce2, short) == 0x0100)
#define  状態取得_残り体力(p)			(WORK(p, 0x002e, short))
#define  状態取得_敗北(p)			(WORK(p, 0x01cc, short))
#define  状態取得_勝ち数(p)			(WORK(p, 0x002c, short))
#define  状態取得_SHOT攻撃(p)			(WORK(p, 0x0f0c, short))
#define  座標取得_Ｘ(p)				(WORK(p, 0x0006, short))
#define  カウンタ設定_値維持(p)			(WORK(p, 0x09ee, short)++)
#define  カウンタ取得_現在値(p)			(WORK(p, 0x09ee, short))
#define  同期取得_先頭サイクル(p,act_id)	(WORK(p, 0x173e, short) == act_id)
#define  同期取得_動作過程(p)			(WORK(p, 0x09e6, short))
#define  同期進行_動作過程(p)			(WORK(p, 0x09e6, short)++)
#define  同期取得_攻撃過程(p)			(WORK(p, 0x0a42, short))
#define  同期進行_攻撃過程(p)			(WORK(p, 0x0a42, short)++)
#define  同期完了_不時着(p)			(WORK(p, 0x0008, short) = BASE_LINE, WORK(p, 0x09e6, short)++)
#define  同期取得_連続技(p)			(WORK(p, 0x09fe, short))
#define  同期進行_連続技(p)			(WORK(p, 0x09fe, short)++)
#define  攻撃設定_威力レベル(p,level)		(WORK(p, 0x0a46, short) = level)
#define  攻撃設定_最多ヒット数(p,num)		(WORK(p, 0x0a44, short) = num, flagNextProcess = 0)
#define  攻撃設定_基本技キャンセル(p,ccla)	(WORK(p, 0x1742, short) = ccla)
#define  攻撃設定_必殺技キャンセル(p,mode)	(WORK(p, 0x01c4, short) = mode)
#define  攻撃設定_SHOT消滅(p, num)		(WORK(p, 0x0a92, short) = num)
#define  攻撃取得_威力レベル(p)			(WORK(p, 0x0a46, short))
#define  攻撃取得_最多ヒット数(p)		(WORK(p, 0x0a44, short))
#define  攻撃取得_ヒット情報(p)			(WORK(p, 0x0a3e, HIT_INFO*))
#define  攻撃取得_被ヒット情報(p)		(WORK(p, 0x1326, HIT_INFO*))
#define  攻撃取得_超技モード(p)			(WORK(p, 0x05de, short))
#define  同期取得_気集中(p)			(WORK(p, 0x0ac2, short))
#define  多重化設定_指定値(p,val)		(WORK(p, 0x05d6, short) = val)
#define  多重化取得_指定値(p)			(WORK(p, 0x05d6, short))
#define  コンボ設定_クリア(p)			(WORK(p, 0x0a96, short) = 0)
#define  コンボ設定_増加(p)			(WORK(p, 0x0a96, short)++)
#define  セル取得_表示(p)			(WORK(p, 0x09ea, short))
#define  Cmd登録_地上必殺技判定関数(p,func)	(WORK(p, 0x0cda, void*) = func)
#define  Cmd登録_空中必殺技判定関数(p,func)	(WORK(p, 0x0cde, void*) = func)
#define  Cmd登録_基本技判定関数(p,func)		(WORK(p, 0x1762, void*) = func)
#define  Trg取得_直接状態(p)			(WORK(p, 0x0ad2, short))
#define  Trg取得_直接状態２(p)			(WORK(p, 0x0ad4, short))
#define  Cmd条件_防御キャンセル(p)		(WORK(p, 0x1740, short))
#define  Cmd取得_超技(p)			(WORK(p, 0x0aa6, short))
#define  Cmd設定_防御キャンセル技(p,mode)	(WORK(p, 0x1752, short) = mode)
#define  Cmd取得_防御キャンセル技(p)		(WORK(p, 0x1752, short))
#define  Cpu設定_歩行方向(p,drct)		(WORK(p, 0x0a8e, short) = drct)
#define  Cpu設定_歩行時間(p,num)		(WORK(p, 0x0a8c, short) = num)
#define  Cpu取得_CPU情報(p)			(WORK(p, 0x0a82, CPU_INFO*))
#define  Cpu取得_思考完了(p)			(WORK(p, 0x1324, short))
#define  Cpu取得_制御状態(p)			(WORK(p, 0x0a86, short))
#define  Cpu取得_思考レベル()			(WORK(sfsysInfo, 0x0008, short))
#define  ゲージ取得_体力(p)			(WORK(p, 0x0030, short))
#define  ゲージ取得_サブ(p)			(WORK(p, 0x0a4a, short))
#define  ゲージ設定_サブ(p,val)			(WORK(p, 0x0a4a, short) = val)
#define  ゲージ取得_超技(p)			(WORK(p, 0x0aa4, short))
#define  Shot取得_標準ハンドラ(p)		(WORK(p, 0x0f08, SHOT*))
#define  Shot設定_標準SHOT関数(p,func)		(WORK(WORK(p, 0x0f08, SHOT*), 0x0004, void*) = func)
#define  Shot設定_特性タイプ(shot,_type)	((shot)->type = (_type))
#define  Shot設定_Ｘ座標(shot,pos)		((shot)->pos_x = (pos))
#define  Shot設定_Ｙ座標(shot,pos)		((shot)->pos_y = (pos))
#define  Shot設定_Ｘ方向(shot,_drct)		((shot)->drct = (_drct))
#define  Shot設定_Ｙ方向(shot,drct)		((shot)->drct_ud = (drct))
#define  Shot設定_重なり数(shot,num)		((shot)->multi = (num))
#define  Shot増減_重なり数(shot,num)		((shot)->multi += (num))
#define  Shot設定_超技フラグ(shot,mode)		((shot)->super = (mode))
#define  Shot設定_ＳＰ番号(shot,_sp_num)	((shot)->sp_num = (_sp_num))
#define  Shot設定_ＰＣＧコード(shot,pcg_code)	((shot)->pcg_num = (pcg_code))
#define  Shot設定_くらい動作(shot,act_id)	((shot)->hit_info->act = (act_id))
#define  Shot移動_絶対方向(shot,dx,dy)		((shot)->pos_x += (dx),(shot)->pos_y += (dy))
#define  Shot設定_カウンタ(shot,val)		((shot)->counter = (val))
#define  Shot増減_カウンタ(shot,val)		((shot)->counter += (val))
#define  Shot取得_モジュール状態(shot)		((shot)->state)
#define  Shot取得_特性タイプ(shot)		((shot)->type)
#define  Shot取得_Ｘ座標(shot)			((shot)->pos_x)
#define  Shot取得_Ｙ座標(shot)			((shot)->pos_y)
#define  Shot取得_Ｘ方向(shot)			((shot)->drct)
#define  Shot取得_Ｙ方向(shot)			((shot)->drct_ud)
#define  Shot取得_重なり数(shot)		((shot)->multi)
#define  Shot取得_超技フラグ(shot)		((shot)->super)
#define  Shot取得_ＳＰ番号(shot)		((shot)->sp_num)
#define  Shot取得_ＰＣＧコード(shot)		((shot)->pcg_num)
#define  Shot取得_ヒット情報(shot)		((shot)->hit_info)
#define  Shot取得_カウンタ(shot)		((shot)->counter)
#define  Shot取得_セル情報(shot)		((shot)->cell_info)
#define  演出表示_身体残像(p)			(WORK(p, 0x0aa8, short) = 1)
#define  Cnf取得_キャラクタ標準(p)		(WORK(p, 0x175c, CONFIG*))
#define  Reg設定_追加データ数(num)		(WORK(sfsysInfo, 0x047e, short))
#define  Reg設定_ストーリー数(num)		(WORK(sfsysInfo, 0x0480, short))
#define  Sel取得_動作モード()			(WORK(sfsysInfo, 0x047c, short))
#define  Sel取得_キャラクタ番号(p)		(WORK(p, 0x176a, short))
#define  Sel取得_ストーリー番号(p)		(WORK(p, 0x176c, short))
#define  Sel取得_ステージ番号()			(WORK(sfsysInfo, 0x047a, short))
#define  Sel取得_全体ストーリー番号()		(WORK(sfsysInfo, 0x0064, short))
#define  Sys取得_PATH_キャラクタ()		(WORK(sfsysInfo, 0x0058, char*))
#define  Sys取得_PATH_ステージ()		(WORK(sfsysInfo, 0x005c, char*))
#define  Sys取得_PATH_ログ()			(WORK(sfsysInfo, 0x0060, char*))
#define  Sys取得_バージョン()			(WORK(sfsysInfo, 0x002c, short))
#define  場面取得_デモ()			(WORK(sfsysInfo, 0x0048, short))
#define  自分ハンドラ()				(myPlayer)
#define  相手ハンドラ(p)			(WORK(p, 0x132a, long))
#define  プレイヤー番号(p)			(WORK(p, 0x000a, short))
#define  セレクト番号(p)			(WORK(p, 0x000c, short))
#define  キャラの名前(p)			(((char *)p)+0x000e)
#define  同キャラ識別番号(p)			(WORK(p, 0x001a, short))
#define  ステージ番号()				(WORK(sfsysInfo, 0x0016, short))
#define  ラウンド番号()				(WORK(sfsysInfo, 0x001a, short))



/* sfxvilib.a (Rel.9 PreRelease版) に含まれている関数 */

/* WORK 4aから持ってきたが、機能するかは確認してない */

#define  飛び道具Ｘ位置設定(p,num)	(WORK(p, 0x0a52, short) = num)
#define  飛び道具Ｘ位置()	(WORK(myPlayer, 0x0a52, short))
#define  飛び道具Ｘ位置２(p)	(WORK(p, 0x0a52, short))

#define  飛び道具Ｙ位置設定(p,num)	(WORK(p, 0x0a54, short) = num)
#define  飛び道具Ｙ位置()	(WORK(myPlayer, 0x0a54, short))
#define  飛び道具Ｙ位置２(p)	(WORK(p, 0x0a54, short))

 /* 飛び道具が画面上に出てるか？ON/OFF */
#define  飛び道具使用状態設定(p,num)	(WORK(p, 0x0a4c, short) = num)
#define  飛び道具使用状態()	(WORK(myPlayer, 0x0a4c, short))
#define  飛び道具使用状態２(p)	(WORK(p, 0x0a4c, short)) /* 使えた */

#define  飛び道具速度再設定(p,num)	(WORK(p, 0x0a56, short) = num)

#define  飛び道具移動方向(p)	(WORK(p, 0x0a50, short))
#define  飛び道具移動方向設定(p,num)	(WORK(p, 0x0a50, short) = num)

#define  アドレス取得(p,ofs)	(WORK(p, ofs, long))
#define  アドレス設定(p,ofs,num)	(WORK(p, ofs, long) = num)
#define  ステータス取得(p,ofs)	(WORK(p, ofs, short))
#define  ステータス設定(p,ofs,num)	(WORK(p, ofs, short) = num)



#endif

/* WORKマクロオリジナル */
/* MMPマクロは、numに指定出来る値に制限があるので注意すること */
/* ex_funcのいくつかの関数を吸収しています。 */

#define  MMP設定_動作関数(p,num,func)		(WORK(p, 0x05e0+num*4, long) = (long)func)
#define  MMP設定_CPU関数(p,num,func)		(WORK(p, 0x0f24+num*4, long) = (long)func)
#define  MMP設定_セル(p,num,cell)		(WORK(p, (num < 256 ? 0x01d0 : 0x0f2e)+num*4, CELL*) = cell)
#define  MMP取得_動作関数(p,num)		(WORK(p, 0x05e0+num*4, long))
#define  MMP取得_CPU関数(p,num,func)		(WORK(p, 0x0f24+num*4, long))
#define  MMP取得_セル(p,num)			(WORK(p, (num < 256 ? 0x01d0 : 0x0f2e)+num*4, CELL*))

#define  状態設定_動作(p,num)			(WORK(p, 0x09e0, short) = WORK(p, 0x09e2, short) = num)
#define  状態設定_複合動作(p,num)		(WORK(p, 0x09e4, short) = num)
#define  状態設定_表示方向(p,drct)		(WORK(p, 0x01b6, short) = drct)
#define  状態設定_動作方向(p,drct)		(WORK(p, 0x09e8, short) = drct)
#define  状態設定_硬直時間(p,num)		(WORK(p, 0x01c6, short) = num)
#define  状態設定_気絶量(p,num)			(WORK(p, 0x0032, short) = num)
#define  状態設定_ヒットストップ(p,num)		(WORK(p, 0x0a70, short) = num)
#define  状態取得_硬直時間(p)			(WORK(p, 0x01c6, short))
#define  状態取得_気絶量(p)			(WORK(p, 0x0032, short))
#define  状態取得_ヒットストップ(p)		(WORK(p, 0x0a70, short))
#define  状態取得_攻撃判定(p)			(WORK(p, 0x0a3c, short))
#define  同期設定_動作過程(p,num)		(WORK(p, 0x09e6, short) = num)
#define  同期設定_攻撃過程(p,num)		(WORK(p, 0x0a42, short) = num)
#define  コンボ取得_現在値(p)			(WORK(p, 0x0a96, short))
#define  コンボ増減_現在値(p,num)		(WORK(p, 0x0a96, short) += num)
#define  演出設定_背景スクロール(p,num)		(WORK(p, 0x09f6, short) = num)
#define  時間取得_ヒットストップ()		(WORK(sfsysInfo, 0x0078, short))

#define  Shot設定_サブキー(shot,_sub_key)	((shot)->sub_key = (_sub_key))
#define  Shot設定_汎用変数16(shot,val)		((shot)->value16 = (val))
#define  Shot設定_汎用変数32(shot,val)		((shot)->value32 = (val))
#define  Shot設定_汎用ポインタ32(shot,ptr)	((shot)->value32 = (long)(void*)(val))
#define  Shot取得_サブキー(shot)		((shot)->sub_key)
#define  Shot取得_汎用変数16(shot)		((shot)->value16)
#define  Shot取得_汎用変数32(shot)		((shot)->value32)
#define  Shot取得_汎用ポインタ32(shot)		((void*)((shot)->value32))
#define  Shot取得_前SHOTモジュール(shot)	((SHOT*)((shot)->ptr_pre))
#define  Shot取得_次SHOTモジュール(shot)	((SHOT*)((shot)->ptr_next))

/* dfunc.a (ver1.04) に含まれている関数 */

#define  動作アドレス取得(p,num)	(WORK(p, 0x05e0+num*4, long))
#define  攻撃コマンド受付許可(p)	(WORK(p, 0x09e2, short) = WORK(p, 0x09e4, short) = 100)
#define  ＣＯＭＢＯ設定(p,num)	(WORK(p, 0x0a96, short) = num)
#define  ＣＯＭＢＯ取得(p)	(WORK(p, 0x0a96, short))
#define  セルＩＤ変更(p,num1,num2)	(WORK(p, 0x01d0+num1*4, long) = WORK(p, 0x01d0+num2*4, long))
#define  セルアドレス取得(p,num)	(WORK(p, 0x01d0+num*4, long))
#define  レバー状態取得(p)	(*((short *)(WORK(p, 0x0cd6, long))))
#define  システム変数取得(ofs)	(WORK(sfsysInfo, ofs, short))
#define  システム変数設定(ofs,num)	(WORK(sfsysInfo, ofs, short) = num)

#endif
