95 lines
1.8 KiB
C
95 lines
1.8 KiB
C
/* -*- c-basic-offset: 4 -*- */
|
|
|
|
#ifndef KHET_GAME_H
|
|
#define KHET_GAME_H
|
|
|
|
#define NONE 0
|
|
#define PHARAO 1
|
|
#define DJHED 2
|
|
#define PYRAMID 3
|
|
#define OBELISK 4
|
|
#define OBELISK2 5
|
|
|
|
#define N_PIECE_TYPES 6
|
|
|
|
#define SILVER 0
|
|
#define RED 1
|
|
|
|
#define BOARD_WIDTH 10
|
|
#define BOARD_HEIGHT 8
|
|
|
|
#define F_ROTATE 1
|
|
#define F_SPLIT 2
|
|
|
|
#define M_MOVE 1
|
|
#define M_MOVE_SPLIT 2
|
|
#define M_ROTATE 3
|
|
|
|
#define E_FAILURE -1
|
|
#define E_ILLEGAL_MOVE -2
|
|
#define E_UNKNOWN_COMMAND -3
|
|
#define E_NOT_YOUR_TURN -4
|
|
#define HUGE_SUCCESS 1
|
|
|
|
// return values for laser():
|
|
#define L_WALL 0
|
|
#define L_PIECE 1
|
|
#define SILVER_WINS 2
|
|
#define RED_WINS 3
|
|
|
|
typedef enum { R_CW, R_CCW } rot_t;
|
|
typedef enum { D_NW=0, D_N, D_NE, D_E, D_SE, D_S, D_SW, D_W } dir_t;
|
|
|
|
typedef struct square {
|
|
unsigned int piece : 4;
|
|
unsigned int side : 1;
|
|
unsigned int dir : 2;
|
|
} square_t;
|
|
|
|
typedef struct {
|
|
int type;
|
|
int x, y;
|
|
int dir;
|
|
} move_t;
|
|
|
|
typedef struct {
|
|
int move;
|
|
int winner;
|
|
square_t board[BOARD_WIDTH][BOARD_HEIGHT];
|
|
int laser_pos[2];
|
|
square_t last_hit;
|
|
move_t last_move;
|
|
} game_t;
|
|
|
|
typedef struct {
|
|
int num;
|
|
char *name;
|
|
} pieceinfo_t;
|
|
|
|
typedef struct {
|
|
char ch;
|
|
char *name;
|
|
} sideinfo_t;
|
|
|
|
extern char classic_setup[];
|
|
extern sideinfo_t sideinfo[];
|
|
extern pieceinfo_t pieceinfo[];
|
|
|
|
int game_turn(game_t *game);
|
|
int laser_at(game_t *game, int x, int y);
|
|
int laser(game_t *game, int side);
|
|
int movable(game_t *game, int row, int col, int side);
|
|
int rotate(game_t *game, int side, int row, int col, rot_t dir);
|
|
int move(game_t *game, int side, move_t m);
|
|
void move_dest(move_t m, int *nx, int *ny);
|
|
void place(game_t *game, int row, int col, int piece, int side, int dir);
|
|
|
|
void setup_board(game_t *game, char *desc);
|
|
void init_game(game_t *game);
|
|
|
|
int parse_move(char *buf, move_t *m);
|
|
int perform_move(game_t *game, int side, move_t m);
|
|
|
|
|
|
#endif
|