#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 * ã));
	DefinePrint("DSIN", 		"%12.9f",	HEX_SIDE * Sin(60.0 / 180 * ã));
	DefinePrint("HEX_RADIUS",	"%12.9f",	HEX_SIDE * Sin(60.0 / 180 * ã) + 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};
