#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};