/**
 * Nametry
 * (c) Kenta Cho (cs8k-cyu@asahi-net.or.jp)
 * http://www.asahi-net.or.jp/~cs8k-cyu/
 *
 * nametry.h(header file)
 */

#define TRUE 1
#define FALSE 0
#define randomize() srand(sys_get_tick_count())
#define randN(N) ((((long) rand()) * N) / ((long) RAND_MAX + 1))
#define abs(n)   ((n)<0? -(n) : (n))
#define Boolean int

/**
 * main routine 
 */
/* loop interval */
#define INTERVAL 2

extern Boolean loopf;
extern int timer;

/**
 * game manager 
 */
/* game status */
#define TITLE 0
#define GAME_IN_PROGRESS 1
#define GAMEOVER 2
#define GAME_GAMEOVER 3
#define RANKING 4
#define PAUSE 5

/* stage effect status */
#define NONE 0
#define START_ENTRY 1
#define START_RANK 2

/* sprite index */
#define ILSPR_IDX 0
#define MYSPR_IDX 4
#define ENMSPR_IDX 8
#define FILSPR_IDX 48
#define LTRSPR_IDX 52
#define CSRSPR_IDX 116

/* letter grid center position */
#define LTCNT_X 128
#define LTCNT_Y 80

typedef struct {
  int status;
  int time;
  int atrcStat;
  int atrcTime;
} GameStatus;

typedef struct {
  int x, y;
  int d, aimd, speed;
  int moveCnt, moveStat;
  int cnt;
} Enemy;

#define IPT_Y 16

extern GameStatus gameStatus;
extern Boolean aPrsd, bPrsd, startPrsd;
extern long score;
extern int tableNum;
extern int iptlt[];
extern int nmIdx;
extern int rankPtn[];
extern int ilIdx;
extern int crsCnt;

extern void initGame();
extern void startGame();
extern void handleGameStatus();
extern void initTitleState();
extern void moveLetters(int);
extern void drawLetters();
extern void setEntryTable();
extern void moveFlyingLetter();
extern void drawBottomRank(int, int);
extern void inputLetter();
extern void resetCursor();
extern void resetFlyingLetter();
extern void drawRankScore();

/**
 * title manager
 */
typedef struct {
  char name[3];
  long score;
} Ranking;

extern Boolean loadPrefs();
extern Boolean savePrefs();
extern void initRanking();
extern void gotoTitle();
extern void startGameGameover();
extern void startPause();
extern void handleTitle();
extern void handleGameover();
extern void handleGameGameover();
extern void handleRanking();
extern void endRanking();
extern void handlePause();

/**
 * display manager
 */
/* screen text size */
#define SCREEN_WIDTH 28
#define SCREEN_HEIGHT 18

/* used sprite index range */
#define SPRITE_RANGE 125

/* position to hidden sprite */
#define DISAP_POS -32

/* character index */
#define ALP_IDX 16
#define ALP_NUM 26
#define NUM_IDX 42
#define NUM_NUM 10
#define SBL_IDX 52
#define SBL_NUM 5

#define AB_IDX 80
#define AB_NUM 104
#define NB_IDX 184
#define NB_NUM 40
#define SB_IDX 224
#define SB_NUM 20

#define LINE_IDX 256
#define LINE_NUM 9
#define LCK_IDX 288
#define LCK_NUM 54
#define HTO_IDX 342
#define HTO_NUM 3
#define END_IDX 346
#define END_NUM 4

extern void initDisplay();
extern void closeDisplay();
extern void clearDisplay();
extern void drawLinePtn(int[], int, int, int, int);
extern void drawAlp(int, int, int);
extern void drawAlpPtn(int[], int, int, int, int);
extern void drawBgAlp(int, int, int);
extern void drawBgAlpScr(int, int, int, int);
extern void drawNum(long, int, int);
extern int drawBgNum(long, int, int);
extern void clearChr(int, int, int, int);
extern void clearChrScr(int, int, int, int, int);

/**
 * preference manaager
 */
Boolean loadPreferences(char far *, int);
Boolean savePreferences(char far *, int);

/**
 * sound manager
 */
#define BGM_NUM 3

#define BGM_GAMEOVER 0
#define BGM_GAME 1
#define BGM_RANKING 2
#define SE_MOVE 0
#define SE_SET 1
#define SE_BACK 2
#define SE_INPUTEND 3
#define SE_NEXTENTRY 4
#define SE_HIT 5

void initSound();
void closeSound();
void playBgm(int num, int mode);
void stopBgm();
void playSe(int num);
int checkSe();

/**
 * sin cos table
 */
#define TABLE_SIZE 256
#define DIV 256

extern int sintbl[], costbl[];
extern int getDeg(int, int);
