This repository has been archived on 2024-07-04. You can view files and clone it, but cannot push or open issues or pull requests.
khet/src/game.h

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