#define MAP_WIDTH       640         //Change this, if you like.
#define UNITS_NUM       32          //Change this, if you like.
#define HEX_SIDE        11

U0 InitDefines()
{
    DefinePrint("MAP_HEIGHT",   "%d",       (GR_HEIGHT - FONT_HEIGHT * 2) * MAP_WIDTH / GR_WIDTH);
    DefinePrint("DCOS",         "%12.9f",   HEX_SIDE * Cos(60.0 / 180 * pi));
    DefinePrint("DSIN",         "%12.9f",   HEX_SIDE * Sin(60.0 / 180 * pi));
    DefinePrint("HEX_RADIUS",   "%12.9f",   HEX_SIDE * Sin(60.0 / 180 * pi) + 0.01); //Slop
} InitDefines;

I64  map_cols = (MAP_WIDTH - DCOS)/(2 * HEX_SIDE + 2 * DCOS), 
     map_rows = ToI64((MAP_HEIGHT - DSIN) / DSIN) & ~1, 
     map_width = map_cols * (2 * HEX_SIDE + 2 * DCOS) + DCOS, 
     map_height = map_rows * DSIN + DSIN + 1, 
     x0, y0;

CDC *map_dc;
U8   terrain[map_rows][map_cols];

//Centers of hexes
class Pt
{
    F64 x, y;
};
Pt   hex_centers[map_rows][map_cols];

I64  show_vis_row, show_vis_col;
Bool roads[map_rows][map_cols], 
     rivers[map_rows][map_cols], 
     vis_map[map_rows][map_cols];

//Other options for PLAINS are WHITE or YELLOW
#define PLAINS      LTGREEN
#define TREES       GREEN
#define MOUNTAINS   DKGRAY

//These are used to display a range circle when they player
//is firing.
F64 fire_radius, fire_radius_x, fire_radius_y;

//These display "phase", "turn" and "game over".
U8  message_buf[STR_LEN];
I64 message_off_timeout; //Jiffies. Goes away after a time.

//Unit types
#define UT_INFANTRY         0
#define UT_ARTILLERY        1
#define UT_LT_TANK          2
#define UT_MD_TANK          3

class Unit
{
    U8  *img;
    I64  num, row, col, 
         armored_attack, unarmored_attack, armor;
    I8   type, player, facing, movement, life, 
         range, remaining_movement, accuracy;
    Bool vis[2], fired, infantry, indirect_fire, pad[3];
};

Unit    units[2][UNITS_NUM];

// Bt(vis_unit_bitmap,player1+player0*((UNITS_NUM+7)&~7))
U8  vis_unit_bitmap[2][(((UNITS_NUM + 7) & ~7)*UNITS_NUM) >> 3];

#define PHASE_START         0
#define PHASE_INDIRECT      0
#define PHASE_INDIRECT0     0
#define PHASE_INDIRECT1     1
#define PHASE_MOVE          2
#define PHASE_MOVE0         2
#define PHASE_MOVE1         3
#define PHASE_DIRECT        4
#define PHASE_DIRECT0       4
#define PHASE_DIRECT1       5
#define PHASE_END           6

I64     phase, cur_player, enemy_player, view_player, turn, 
        cursor_row, cursor_col, alive_count[2], 
        player_indirect[2], player_move[2], player_direct[2];
F64     animation_delay = 0.5;

Bool     moving = FALSE;
I64      move_x, move_y;
F64      move_facing;
Unit    *moving_unit;

extern I64 HexMoveOne(I64 *_row, I64 *_col, F64 x, F64 y);

class IndirectOrders
{
    IndirectOrders  *next, *last;
    Unit            *attacker;
    I64              row, col;

} indirect_head;

Bool     firing = FALSE;
I64      fire_x, fire_y;
Unit    *target_unit;
Bool     target_hit;

Bool    indirect_explosion = FALSE;
I64     indirect_row, indirect_col;

I64     row_offsets[7]      = {-1, -2, -1, 1, 2,  1, 0};
I64     col_offsets_even[7] = {-1,  0,  0, 0, 0, -1, 0};
I64     col_offsets_odd [7] = { 0,  0,  1, 1, 0,  0, 0};