/*#### 	$Id: z_camera.h,v 1.1.1.1 2003/01/17 21:07:17 tong Exp $
 |###   --- Camera ---
 |##
 |#   
 * 
 * $Log: z_camera.h,v $
 * Revision 1.1.1.1  2003/01/17 21:07:17  tong
 * ZELDA-OCARINA OF TIME (20L) build from Nintendo
 *
 * Revision 2.1  1998/10/22  11:45:49  zelda
 * £Ò£Ï£Í½Ð¤·¥Ð¡¼¥¸¥ç¥ó(NTSC)
 *
 * Revision 1.281  1998/10/09 13:23:21  ogawa
 * *** empty log message ***
 *
 * Revision 1.280  1998-10-09 21:50:32+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.279  1998-10-08 23:45:48+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.278  1998-10-07 18:14:01+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.277  1998-09-26 23:53:57+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.276  1998-09-23 11:35:25+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.275  1998-09-22 15:00:04+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.274  1998-09-22 14:57:05+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.273  1998-09-21 13:51:22+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.272  1998-09-07 17:30:52+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.271  1998-09-07 16:08:58+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.270  1998-09-07 16:06:47+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.269  1998-09-07 16:02:03+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.268  1998-09-07 14:56:01+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.267  1998-09-07 14:18:56+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.266  1998-09-07 14:02:16+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.265  1998-09-07 13:43:20+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.264  1998-09-07 12:07:05+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.263  1998-09-07 11:49:54+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.262  1998-09-02 22:55:08+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.261  1998-09-02 14:46:12+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.260  1998-09-02 11:02:11+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.259  1998-08-20 13:39:06+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.258  1998-08-18 19:30:04+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.257  1998-08-11 14:58:10+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.256  1998-08-11 14:35:43+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.255  1998-08-08 17:34:45+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.254  1998-08-06 15:15:08+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.253  1998-08-06 15:12:26+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.252  1998-08-01 22:47:12+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.251  1998-07-18 21:56:24+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.250  1998-07-18 20:45:18+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.249  1998-07-18 17:56:08+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.248  1998-07-18 16:57:39+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.247  1998-07-18 16:55:48+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.246  1998-07-18 16:51:35+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.245  1998-07-10 10:52:01+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.244  1998-07-08 17:36:54+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.243  1998-07-08 15:22:15+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.242  1998-07-06 20:56:15+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.241  1998-07-06 17:14:43+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.240  1998-07-06 10:17:27+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.239  1998-07-03 20:46:19+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.238  1998-07-03 20:43:45+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.237  1998-07-03 20:32:28+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.236  1998-07-03 20:17:25+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.235  1998-07-02 10:41:45+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.234  1998-07-02 10:17:01+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.233  1998-07-01 17:58:21+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.232  1998-07-01 17:56:38+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.231  1998-07-01 17:49:11+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.230  1998-07-01 15:41:28+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.229  1998-06-30 16:25:34+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.228  1998-06-30 16:19:45+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.227  1998-06-26 16:21:04+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.226  1998-06-20 21:21:55+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.225  1998-06-19 22:05:04+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.224  1998-06-19 22:04:15+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.223  1998-06-16 19:14:48+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.222  1998-06-10 20:06:43+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.221  1998-06-10 15:47:57+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.220  1998-06-09 22:16:10+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.219  1998-06-09 16:16:35+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.218  1998-05-15 16:56:17+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.217  1998-05-14 18:24:27+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.216  1998-05-14 17:12:48+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.215  1998-05-07 11:22:24+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.214  1998-05-02 22:40:29+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.213  1998-04-10 09:58:41+09  ogawa
 * *** empty log message ***
 *
 * Revision 1.212  1998/04/09  13:25:32  ogawa
 * *** empty log message ***
 *
 * Revision 1.211  1998/04/01  02:56:00  ogawa
 * *** empty log message ***
 *
 * Revision 1.210  1998/03/18  02:58:05  ogawa
 * *** empty log message ***
 *
 * Revision 1.209  1998/03/16  01:32:55  nisiwaki
 * °É²Ã
 *
 * Revision 1.208  1998/03/13  07:30:01  ogawa
 * *** empty log message ***
 *
 * Revision 1.207  1998/03/10  13:27:35  ogawa
 * *** empty log message ***
 *
 * Revision 1.206  1998/02/24  02:08:52  ogawa
 * *** empty log message ***
 *
 * Revision 1.205  1998/02/21  10:25:59  ogawa
 * *** empty log message ***
 *
 * Revision 1.204  1998/02/13  11:25:02  ogawa
 * *** empty log message ***
 *
 * Revision 1.203  1998/02/10  13:25:35  ogawa
 * *** empty log message ***
 *
 * Revision 1.202  1998/02/04  06:54:50  ogawa
 * *** empty log message ***
 *
 * Revision 1.201  1998/01/21  10:52:51  ogawa
 * *** empty log message ***
 *
 * Revision 1.200  1998/01/21  10:46:40  ogawa
 * *** empty log message ***
 *
 * Revision 1.199  1998/01/13  08:08:42  ogawa
 * *** empty log message ***
 *
 * Revision 1.198  1998/01/12  02:51:29  ogawa
 * *** empty log message ***
 *
 * Revision 1.197  1998/01/09  02:31:42  ogawa
 * *** empty log message ***
 *
 * Revision 1.196  1998/01/09  02:18:28  ogawa
 * *** empty log message ***
 *
 * Revision 1.195  1998/01/08  09:29:01  ogawa
 * *** empty log message ***
 *
 * Revision 1.194  1997/12/18  01:38:15  ogawa
 * *** empty log message ***
 *
 * Revision 1.193  1997/12/03  09:20:47  ogawa
 * *** empty log message ***
 *
 * Revision 1.192  1997/11/25  09:16:21  ogawa
 * *** empty log message ***
 *
 * Revision 1.191  1997/11/25  09:14:07  ogawa
 * *** empty log message ***
 *
 * Revision 1.190  1997/11/25  05:47:15  ogawa
 * *** empty log message ***
 *
 * Revision 1.189  1997/11/20  08:53:37  ogawa
 * *** empty log message ***
 *
 * Revision 1.188  1997/11/18  15:46:42  ogawa
 * *** empty log message ***
 *
 *
 */

#ifndef __CAMERA_H_
#define __CAMERA_H_

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

/*
## --- Camera ---
###                                                    ogawa@srd-kyoto
##    calculate center, eye and up position to 'view' control
###
*/

#include "z_basic.h"
#include "z_bgcheck.h"
#include "z_olib.h"
#include "z_view.h"
//#include "game.h"
//#include "z_play.h"
#include "z_actor_h.h"
#include "camdemo.h"
#include "z_bezier.h"
#include "z_collision_type.h"


#define _CAMERA_KEYCODE    'CAM_'


#ifdef __CAMERA_C_
#  define _GLOBAL
#  define _LOCAL  static
#else
#  define _GLOBAL  extern
#endif

/*
-- camera status -- */
#define CAM_STATUS_CUT      (short)(0)
#define CAM_STATUS_WAIT     (short)(1)
#define CAM_STATUS_SET      (short)(3)
#define CAM_STATUS_ACTION   (short)(7)
#define CAM_STATUS_DIE      (short)(0x100)
#define CAM_STATUSLOCK      (short)(0x8000)

/*
-- (lockflg) -- */
#define CAM_LOCK_CENTER           (char)( 1)
#define CAM_LOCK_EYE              (char)( 2)
#define CAM_LOCK_UP               (char)( 4)
#define CAM_LOCK_TARGETACTOR      (char)( 8)
#define CAM_LOCK_TARGETPOSITION   (char)(16)
#define CAM_LOCK_FOVY             (char)(32)
#define CAM_LOCK_Z                (char)(64)
#define CAM_LOCKAT_POSITION       (char)(CAM_LOCK_CENTER | CAM_LOCK_EYE | CAM_LOCK_UP)
#define CAM_LOCKAT_TARGET         (char)(CAM_LOCK_TARGETACTOR | CAM_LOCK_TARGETPOSITION)
#define CAM_LOCKAT_CENTER         (char)(CAM_LOCKAT_TARGET | CAM_LOCK_CENTER)
#define CAM_LOCKAT_ALL            (char)(0xff)

/*
-- (chgflg) -- */
#define CAMCHG_SET        (char)(0x01)
#define CAMCHG_MODE       (char)(0x02)
#define CAMCHG_ID         (char)(0x04)
#define CAMCHK_SET        (char)(0x10)
#define CAMCHK_MODE       (char)(0x20)
#define CAMCHK_ID         (char)(0x40)

/*
--  (idflg) -- */
#define CAMIDCHK_ALL      (short)(0x00ff)
#define CAMIDCHK_FLOOR    (short)(0x0001)
#define CAMIDCHK_WATER    (short)(0x0002)
#define CAMIDCHK_FLOOROK  (short)(0x0004)
#define CAMIDCHK_RESTART  (short)(0x0008)
#define CAMIDCHK_MODEFIN  (short)(0x0010)
#define CAMIDCHK_MODEKEEP (short)(0x0020)
#define CAMIDFLG_INWATER  (short)(0x0100)
#define CAMIDFLG_INGASS   (short)(0x0800)
#define CAMIDFLG_SWIM     (short)(0x0200)
#define CAMIDFLG_DIVE     (short)(0x8000)
#define CAMIDFLG_STOP     (short)(0x0400)
#define CAMIDFLG_BDEMO    (short)(0x1000)
#define CAMIDFLG_MAGIC    (short)(0x2000)
#define CAMIDFLG_SCEANIN  (short)(0x4000)
#define CAMIDFLG_STRETCH  (short)(0x0040)

/* UID status */
#define CAMUID_ACTIVE     (1)
#define CAMUID_SLEEP      (2)
#define CAMUID_DEAD       (0)    

/*
-- earthquake type -- */
enum camera_shake {
    CAM_SHAKE_UPRANDAM,
    CAM_SHAKE_EARTHQUA,
    CAM_SHAKE_TATEYURE,
    CAM_SHAKE_GURAGURA,
    CAM_SHAKE_YUREYURE,
    CAM_SHAKE_HURAHURA,
    CAM_SHAKE_GURARAND,
    CAM_SHAKE_MAX
};

#define CAM_GURAGURASET(sp, v_sc, h_sc, p_sc) \
          (((sp) << 24) | ((v_sc) << 16) | ((h_sc) << 8) | (p_sc))

/*
-- camera object -- */
struct zelda_camera_struct;
typedef struct zelda_camera_struct   Camera;
typedef struct zelda_camera_cut      CameraCut;
typedef struct zelda_camera_cuts     CameraCuts;

#define posang_t      Position_Angle

#ifdef _LOCAL
#endif /* _LOCAL */

enum camera_func {
    CAM_FUNC_NONE,
    CAM_FUNC_NORM0,
    CAM_FUNC_NORM1,
    CAM_FUNC_NORM2,
    CAM_FUNC_NORM3,
    CAM_FUNC_NORM4,
    CAM_FUNC_PARA0,
    CAM_FUNC_PARA1,
    CAM_FUNC_PARA2,
    CAM_FUNC_PARA3,
    CAM_FUNC_PARA4,
    CAM_FUNC_KEEP0,
    CAM_FUNC_KEEP1,
    CAM_FUNC_KEEP2,
    CAM_FUNC_KEEP3,
    CAM_FUNC_KEEP4,
    CAM_FUNC_SUBJ0,
    CAM_FUNC_SUBJ1,
    CAM_FUNC_SUBJ2,
    CAM_FUNC_SUBJ3,
    CAM_FUNC_SUBJ4,
    CAM_FUNC_JUMP0,
    CAM_FUNC_JUMP1,
    CAM_FUNC_JUMP2,
    CAM_FUNC_JUMP3,
    CAM_FUNC_JUMP4,
    CAM_FUNC_BATT0,
    CAM_FUNC_BATT1,
    CAM_FUNC_BATT2,
    CAM_FUNC_BATT3,
    CAM_FUNC_BATT4,
    CAM_FUNC_FIXD0,
    CAM_FUNC_FIXD1,
    CAM_FUNC_FIXD2,
    CAM_FUNC_FIXD3,
    CAM_FUNC_FIXD4,
    CAM_FUNC_DATA0,
    CAM_FUNC_DATA1,
    CAM_FUNC_DATA2,
    CAM_FUNC_DATA3,
    CAM_FUNC_DATA4,
    CAM_FUNC_UNIQ0,
    CAM_FUNC_UNIQ1,
    CAM_FUNC_UNIQ2,
    CAM_FUNC_UNIQ3,
    CAM_FUNC_UNIQ4,
    CAM_FUNC_UNIQ5,
    CAM_FUNC_UNIQ6,
    CAM_FUNC_UNIQ7,
    CAM_FUNC_UNIQ8,
    CAM_FUNC_UNIQ9,
    CAM_FUNC_DEMO0,
    CAM_FUNC_DEMO1,
    CAM_FUNC_DEMO2,
    CAM_FUNC_DEMO3,
    CAM_FUNC_DEMO4,
    CAM_FUNC_DEMO5,
    CAM_FUNC_DEMO6,
    CAM_FUNC_DEMO7,
    CAM_FUNC_DEMO8,
    CAM_FUNC_DEMO9,
    CAM_FUNC_SPEC0,
    CAM_FUNC_SPEC1,
    CAM_FUNC_SPEC2,
    CAM_FUNC_SPEC3,
    CAM_FUNC_SPEC4,
    CAM_FUNC_SPEC5,
    CAM_FUNC_SPEC6,
    CAM_FUNC_SPEC7,
    CAM_FUNC_SPEC8,
    CAM_FUNC_SPEC9,
    CAM_FUNC_EVNT0,
    CAM_FUNC_EVNT1,
    CAM_FUNC_EVNT2,
    CAM_FUNC_EVNT3,
    CAM_FUNC_EVNT4,
    CAM_FUNC_NUM
};


/*
** --- camera body --- */
struct zelda_camera_struct {
    char                parambuff[80];

    xyz_t               center, eye, up; /* view setting */
    xyz_t               base_eye;        /* eye point befor correcting */
    xyz_t               gap;

//    View                *view;           /* view object */
//    Game                *game;           /* game object */
    Game_play           *game_play;      /* game_play object */
//    T_BGCheck           *bg;             /* back ground check object */
//    Bezier              *bezier;
    
    struct {                             /* owner information  */
	Actor           *actor;          /*       &            */
	posang_t        pa;              /* target information */
    }                   owner, target;
    struct {
	float           r, v, h;         /* cushion for cushion */
	float           ch, cp, fv;
    }                   cuscus;
    float               speed, dist, speed_factor;
    xyz_t               ctradj, move;
    float               fovy;            /* fovy for view */
    float               shift_ratio;     /* cushon for mode change */
    struct {
//	T_Polygon       *poly;
	float           height;          /* floor infomation */
	xyz_t           normal;          /*          to keep */
    }                   floor, water;
    struct {
	void            *p0, *p1;        /* other data keep area */
	short           n0, n1;
    }                   data;

    short               uid, dummy;
    
    s_xyz               direction;       /* 3d angles, to sync.4 contoroler */
    s_xyz               real_direct;     /* 3d angles, to sync. */

    short               active_status;   /* status */
    short               set;             /* camera set */
    short               mode;            /* mode - controller status */
    short               ai, id;          /* camera table (tool) index */
    short               chgflg;          /* change proccess ? */
    short               idflg;           /* check polygon ID code ? */
    
    short               kill, timer, stretch;
    short               prev_set, next_id, prev_ai;
    short               zang;
    short               lock;            /* locking position mask */
    short               state;           /* for state translate algorizmn */
    
    short               killtimer, next, number;
    
    short               prev_id, opdemo;
};

struct zelda_camera_cut {
    char     act_type,
	     player_action;
    short    pos_type;
    short    timer;
    sangle_t zang;
    float    fovy, cush;
    xyz_t    center, eye;
};

struct zelda_camera_cuts {
    int      n;
    struct zelda_camera_cut *v;
};

#define CAMCUT_ACT_TRANS1      (char)(0x01)
#define CAMCUT_ACT_TRANS2      (char)(0x02)
#define CAMCUT_ACT_TRANS3      (char)(0x03)
#define CAMCUT_ACT_TRANS4      (char)(0x04)
#define CAMCUT_ACT_CIRCLE1     (char)(0x09)
#define CAMCUT_ACT_CIRCLE2     (char)(0x0a)
#define CAMCUT_ACT_CIRCLE3     (char)(0x0b)
#define CAMCUT_ACT_CIRCLE4     (char)(0x0c)
#define CAMCUT_ACT_TURN1       (char)(0x0d)
#define CAMCUT_ACT_WAIT        (char)(0x0e)
#define CAMCUT_ACT_KEEP        (char)(0x0f)
#define CAMCUT_ACT_WAITRESTART (char)(0x10)
#define CAMCUT_ACT_SUBEND      (char)(0x11)
#define CAMCUT_ACT_FLASHEND    (char)(0x12)
#define CAMCUT_ACT_POPEND      (char)(0x13)
#define CAMCUT_ACT_WAITNEXT    (char)(0x15)
#define CAMCUT_ACT_REPEAT      (char)(0x18)
#define CAMCUT_ACTMSK_LINKSTAY (char)(0x40)
#define CAMCUT_ACTMSK_BGCHECK  (char)(0x80)

#define CAMCUT_POSMSK_C_BYOWNER   (short)(0x0020)
#define CAMCUT_POSMSK_C_BYTARGET  (short)(0x0040)
#define CAMCUT_POSMSK_C_GLOBE     (short)(0x0080)
#define CAMCUT_POS_C_STAY         (short)(0x0000)
#define CAMCUT_POS_C_ASWORLD      (short)(0x0001)
#define CAMCUT_POS_C_FROMVIEW     (short)(0x0002)
#define CAMCUT_POS_C_RELATIVE     (short)(0x0003)
#define CAMCUT_POS_C_RELATIVEG    (short)(0x0083)
#define CAMCUT_POS_C_FORATTENT    (short)(0x0004)
#define CAMCUT_POS_C_FORATTENTG   (short)(0x0084)
#define CAMCUT_POS_C_BYPREVEYE    (short)(0x0005)
#define CAMCUT_POS_C_BYPREVEYEG   (short)(0x0085)
#define CAMCUT_POS_C_BYOWNERE     (short)(0x0021)
#define CAMCUT_POS_C_BYOWNERW     (short)(0x0022)
#define CAMCUT_POS_C_BYOWNERS     (short)(0x0023)
#define CAMCUT_POS_C_BYOWNEREF    (short)(0x0024)
#define CAMCUT_POS_C_BYOWNERWF    (short)(0x0025)
#define CAMCUT_POS_C_BYOWNERSF    (short)(0x0026)
#define CAMCUT_POS_C_BYTARGETE    (short)(0x0041)
#define CAMCUT_POS_C_BYTARGETW    (short)(0x0042)
#define CAMCUT_POS_C_BYTARGETS    (short)(0x0043)
#define CAMCUT_POS_C_BYTARGETEF   (short)(0x0044)
#define CAMCUT_POS_C_BYTARGETWF   (short)(0x0045)
#define CAMCUT_POS_C_BYTARGETSF   (short)(0x0046)
#define CAMCUT_POS_C_BYOWNEREG    (short)(0x00a1)
#define CAMCUT_POS_C_BYOWNERWG    (short)(0x00a2)
#define CAMCUT_POS_C_BYOWNERSG    (short)(0x00a3)
#define CAMCUT_POS_C_BYTARGETEG   (short)(0x00b1)
#define CAMCUT_POS_C_BYTARGETWG   (short)(0x00b2)
#define CAMCUT_POS_C_BYTARGETSG   (short)(0x00b3)

#define CAMCUT_POSMSK_E_BYOWNER   (short)(0x2000)
#define CAMCUT_POSMSK_E_BYTARGET  (short)(0x4000)
#define CAMCUT_POSMSK_E_GLOBE     (short)(0x8000)
#define CAMCUT_POS_E_STAY         (short)(0x0000)
#define CAMCUT_POS_E_ASWORLD      (short)(0x0100)
#define CAMCUT_POS_E_FROMVIEW     (short)(0x0200)
#define CAMCUT_POS_E_RELATIVE     (short)(0x0300)
#define CAMCUT_POS_E_RELATIVEG    (short)(0x8300)
#define CAMCUT_POS_E_FORATTENT    (short)(0x0400)
#define CAMCUT_POS_E_FORATTENTG   (short)(0x8400)
#define CAMCUT_POS_E_BYCENTER     (short)(0x0500)
#define CAMCUT_POS_E_BYCENTERG    (short)(0x8500)
#define CAMCUT_POS_E_BYOWNERE     (short)(0x2100)
#define CAMCUT_POS_E_BYOWNERW     (short)(0x2200)
#define CAMCUT_POS_E_BYOWNERS     (short)(0x2300)
#define CAMCUT_POS_E_BYOWNEREF    (short)(0x2400)
#define CAMCUT_POS_E_BYOWNERWF    (short)(0x2500)
#define CAMCUT_POS_E_BYOWNERSF    (short)(0x2600)
#define CAMCUT_POS_E_BYTARGETE    (short)(0x4100)
#define CAMCUT_POS_E_BYTARGETW    (short)(0x4200)
#define CAMCUT_POS_E_BYTARGETS    (short)(0x4300)
#define CAMCUT_POS_E_BYTARGETEF   (short)(0x4400)
#define CAMCUT_POS_E_BYTARGETWF   (short)(0x4500)
#define CAMCUT_POS_E_BYTARGETSF   (short)(0x4600)
#define CAMCUT_POS_E_BYOWNEREG    (short)(0xa100)
#define CAMCUT_POS_E_BYOWNERWG    (short)(0xa200)
#define CAMCUT_POS_E_BYOWNERSG    (short)(0xa300)
#define CAMCUT_POS_E_BYTARGETEG   (short)(0xb100)
#define CAMCUT_POS_E_BYTARGETWG   (short)(0xb200)
#define CAMCUT_POS_E_BYTARGETSG   (short)(0xb300)

#define CAMCUT_POSMSK_BYOWNER   (short)(0x2020)
#define CAMCUT_POSMSK_BYTARGET  (short)(0x4040)
#define CAMCUT_POSMSK_BYACTOR   (short)(0x6060)
#define CAMCUT_POSMSK_GLOBE     (short)(0x8080)
#define CAMCUT_POS_STAY       (CAMCUT_POS_C_STAY | CAMCUT_POS_E_STAY)
#define CAMCUT_POS_ASWORLD    (CAMCUT_POS_C_ASWORLD | CAMCUT_POS_E_ASWORLD)
#define CAMCUT_POS_FROMVIEW   (CAMCUT_POS_C_FROMVIEW | CAMCUT_POS_C_FROMVIEW)
#define CAMCUT_POS_RELATIVE   (CAMCUT_POS_C_RELATIVE | CAMCUT_POS_E_RELATIVE)
#define CAMCUT_POS_BYOWNERE   (CAMCUT_POS_C_BYOWNERE | CAMCUT_POS_E_BYOWNERE)
#define CAMCUT_POS_BYOWNERW   (CAMCUT_POS_C_BYOWNERW | CAMCUT_POS_E_BYOWNERW)
#define CAMCUT_POS_BYOWNERS   (CAMCUT_POS_C_BYOWNERS | CAMCUT_POS_E_BYOWNERS)
#define CAMCUT_POS_BYOWNEREF  (CAMCUT_POS_C_BYOWNEREF | CAMCUT_POS_E_BYOWNEREF)
#define CAMCUT_POS_BYOWNERWF  (CAMCUT_POS_C_BYOWNERWF | CAMCUT_POS_E_BYOWNERWF)
#define CAMCUT_POS_BYOWNERSF  (CAMCUT_POS_C_BYOWNERSF | CAMCUT_POS_E_BYOWNERSF)
#define CAMCUT_POS_BYTARGETE  (CAMCUT_POS_C_BYTARGETE | CAMCUT_POS_E_BYTARGETE)
#define CAMCUT_POS_BYTARGETW  (CAMCUT_POS_C_BYTARGETW | CAMCUT_POS_E_BYTARGETW)
#define CAMCUT_POS_BYTARGETS  (CAMCUT_POS_C_BYTARGETS | CAMCUT_POS_E_BYTARGETS)
#define CAMCUT_POS_BYTARGETEF (CAMCUT_POS_C_BYTARGETEF|CAMCUT_POS_E_BYTARGETEF)
#define CAMCUT_POS_BYTARGETWF (CAMCUT_POS_C_BYTARGETWF|CAMCUT_POS_E_BYTARGETWF)
#define CAMCUT_POS_BYTARGETSF (CAMCUT_POS_C_BYTARGETSF|CAMCUT_POS_E_BYTARGETSF)
#define CAMCUT_POS_BYOWNEREG  (CAMCUT_POS_BYOWNERE | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_BYOWNERWG  (CAMCUT_POS_BYOWNERW | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_BYOWNERSG  (CAMCUT_POS_BYOWNERS | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_BYTARGETEG (CAMCUT_POS_BYTARGETE | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_BYTARGETWG (CAMCUT_POS_BYTARGETW | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_BYTARGETSG (CAMCUT_POS_BYTARGETS | CAMCUT_POSMSK_GLOBE)
#define CAMCUT_POS_FORATTENT  (CAMCUT_POS_C_FORATTENT | CAMCUT_POS_E_FORATTENT)
#define CAMCUT_POS_FORATTENTG (CAMCUT_POS_FORATTENT | CAMCUT_POSMSK_GLOBE)

/*
-- public routines -- */
#ifdef __cplusplus
  extern "C" {
#   define _GLOBAL
#endif

_GLOBAL Camera    *createCamera(View *, T_BGCheck *, Game *);
_GLOBAL void      initCamera(Camera *, View *, T_BGCheck *, Game *);
_GLOBAL void      releaseCamera(Camera *);
_GLOBAL void      destroyCamera(Camera *);
_GLOBAL void      leaveCamera(Camera *, Actor *);
_GLOBAL int       changeCameraMode(Camera *, short);
_GLOBAL int       useCameraModeOK(Camera *, short);
_GLOBAL int       changeCameraSet(Camera *, short);
_GLOBAL int       changeCameraID(Camera *, int);
_GLOBAL s_xyz     actionCameraWork(Camera *);

_GLOBAL s_xyz     getCameraAngle(Camera *);
_GLOBAL sangle_t  getCameraAngleX(Camera *);
_GLOBAL sangle_t  getCameraAngleY(Camera *);
_GLOBAL s_xyz     getRealCameraAngle(Camera *);
_GLOBAL sangle_t  getRealCameraAngleX(Camera *);
_GLOBAL sangle_t  getRealCameraAngleY(Camera *);
_GLOBAL int       setDamageCamera(Camera *, enum camera_shake, int, int);
_GLOBAL int       lockCamera(Camera *, int, void *);
_GLOBAL int       unlockCamera(Camera *, short);
_GLOBAL int       changeCameraStatus(Camera *, short);
_GLOBAL int       setCameraDemoSplineInfo(Camera *, SplinedatZ *, SplinedatZ *,
				      Actor *, short);
_GLOBAL int       setCameraResetSpline(Camera *);
_GLOBAL int       copyCameraPos(Camera *, Camera *);
_GLOBAL int       changeCameraByPolygon(Camera *, short);
_GLOBAL int       setDoorCameraInfo(Camera *, Actor *, short, float,
				    short, short, short);
_GLOBAL int       setCameraFlag(Camera *, short);
_GLOBAL int       clearCameraFlag(Camera *, short);
_GLOBAL xyz_t     getCameraGap(Camera *);
_GLOBAL void      setCameraData(Camera *, short, void *, void *, short, short, short);
_GLOBAL int       getAttentionDemoPart(void);
_GLOBAL int       restartCameraStoped(Camera *);

_GLOBAL int       onDebugCamera(void);
_GLOBAL void      batontouchCamera(Camera *);

#ifdef __cplusplus
  } /* extern "C" */
#endif

#define getCameraMode(obj)              ((obj)->mode)
#define getCameraSet(obj)               ((obj)->set)
#define getCameraID(obj)                ((obj)->id)

#define isCameraStoped(obj)             ((obj)->idflg & CAMIDFLG_STOP)
#define isCameraModeFinished(obj)       ((obj)->idflg & CAMIDCHK_MODEFIN)

/* other naming rules */
#define Camera_ct(obj, view, bg, game)   initCamera(obj, view, bg, game)
#define Camera_dt(obj)                   releaseCamera(obj);
#define Camera_init(obj, view, bg, game) initCamera(obj, view, bg, game)
#define Camera_process(obj)              actionCameraWork(obj);
#define Camera_personalize(obj, actor)   leaveCamera(obj, actor)
#define Camera_position(obj, pa)         positioningCamera(obj, pa) 
#define Camera_change(obj, mode)         changeCameraMode(obj, mode)
#define Camera_IDchange(obj, id)         changeCameraID(obj,id)
#define Camera_Setchange(obj, id)        changeCameraSet(obj,id)
#define Camera_angle(obj)                (getCameraAngle(obj))
#define Camera_angleX(obj)               (getCameraAngleX(obj))
#define Camera_angleY(obj)               (getCameraAngleY(obj))
#define Camera_angleR(obj)               (getRealCameraAngle(obj))
#define Camera_angleRX(obj)              (getRealCameraAngleX(obj))
#define Camera_angleRY(obj)              (getRealCameraAngleY(obj))
#define Camera_centerY(obj)              ((obj)->center.y)
#define Camera_get_through_polygon(obj)  ((obj)->poly)
#define Camera_mode(obj)                 (getCameraMode(obj))
#define Camera_mode_ok(obj, mode)        (useCameraModeOK(obj, mode))
#define Camera_ID(obj)                   (getCameraID(obj))
#define Camera_Set(obj)                  (getCameraSet(obj))
#define Camera_set_damage(obj, a, b, c)  (setDamageCamera(obj, a, b, c))
#define Camera_lock(obj, mask, pos)      (lockCamera(obj, mask, pos))
#define Camera_unlock(obj, mask)         (unlockCamera(obj, mask))

#ifdef _LOCAL
#undef _LOCAL
#endif /* _LOCAL */
#define CAMPARASET_XFOVY4V PREG(CAMPARAM_NORMAL_FOVY)
#define CAM_ID_PRERENDER0  (999)
#undef _GLOBAL


#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif
#endif /* __CAMERA_H_ **/
