diff --git a/.gitignore b/.gitignore index b3504ee..9846a60 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,6 @@ obj/ *.app bin/ -# Emacs backups +# Assorted files *~ +Cyberpunk-Jam diff --git a/Makefile b/Makefile index c2c281c..f5ef482 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,9 @@ CC = gcc -SOURCES = src/main.c -OBJECTS = obj/main.o +OBJECTS = obj/main.o obj/game_state.o obj/in_game.o obj/main_menu.o obj/map.o obj/intro.o obj/game_over.o TARGET = bin/cyjam -CFLAGS = -Wall -I./include +CFLAGS = -Wall -I./include -std=c99 LDFLAGS = -L./lib -LDLIBS = -lm -lisland -lfov -lncurses +LDLIBS = -lfov -lncursesw -lm all: CFLAGS += -O3 all: $(TARGET) @@ -15,9 +14,26 @@ debug: $(TARGET) $(TARGET): $(OBJECTS) $(CC) -o $(TARGET) $(OBJECTS) $(CLFAGS) $(LDFLAGS) $(LDLIBS) -obj/main.o: src/main.c +obj/main.o: src/main.c include/constants.h include/game_state.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/game_state.o: src/game_state.c include/game_state.h include/in_game.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/in_game.o: src/in_game.c include/in_game.h include/game_state.h include/map.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/main_menu.o: src/main_menu.c include/main_menu.h include/game_state.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/intro.o: src/intro.c include/intro.h include/intro_img.h include/game_state.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/game_over.o: src/game_over.c include/game_over.h include/game_state.h + $(CC) -c -o $@ $< $(CFLAGS) + +obj/map.o: src/map.c include/map.h $(CC) -c -o $@ $< $(CFLAGS) clean: $(RM) $(TARGET) $(OBJECTS) - diff --git a/editor/editor.py b/editor/editor.py new file mode 100755 index 0000000..c1433e8 --- /dev/null +++ b/editor/editor.py @@ -0,0 +1,410 @@ +#!/usr/bin/env python + +# Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. +# See the file LICENSE for more details. + +""" +The map editor for TITLE PENDING, a game for the Cyberpunk Jam 2014. + +Usage: + *) Click on a game_map cell to set it's type. + Use the keypad numbers to change the type of cell a cell will turn into + when clicked. The active cell type is displayed on the title bar. + + *) Left click to place an object on the game_map. + Objects have to be edited by hand once the game_map has been saved. Use + the keys 'd', 'k', 'p', 'n' and 'e' to set the active object type. The + active object type is displayed on the title bar. + + *) Press 'q' to set the player's starting position. + + *) Press 's' to save the map to the text file 'map_file.map'. This will + replace any previous map with the same name! + + Press escape to quit. +""" + +import pygame + +CELL_SIZE = 10 +MAP_SIZE = (64, 64) +SCREEN_SIZE = ((MAP_SIZE[1] * CELL_SIZE) + 1, (MAP_SIZE[0] * CELL_SIZE) + 1) +SCREEN_FLAGS = pygame.HWSURFACE | pygame.DOUBLEBUF +TITLE = "CyJam :: " +FPS = 60 + +# Cell types +VOID = 0 +SOLID_WALL = 1 +SECRET_WALL = 2 +CLEAR_WALL = 3 +NEON_WALL = 4 +WINDOW_WALL = 5 +EMPTY_FLOOR = 6 +RUG = 7 +WATER = 8 +BAR = 9 + +# Object types +DOOR = 0 +KEY = 1 +PERSON = 2 +PLAYER = 3 +EXIT = 4 + +def get_object_type_name(game_object): + """ Return a string name for an object type. """ + name = "" + if game_object == DOOR: + name = "DOOR" + elif game_object == KEY: + name = "KEY" + elif game_object == PERSON: + name = "PERSON" + elif game_object == PLAYER: + name = "PLAYER" + elif game_object == EXIT: + name = "EXIT" + elif game_object == None: + name = "NONE" + else: + raise ValueError("Invalid object type.") + + return name + +def get_object_type_color(game_object): + """ Return a string name for an object type. """ + color = (0, 0, 0) + if game_object == DOOR: + color = (255, 0, 255) + elif game_object == KEY: + color = (255, 255, 0) + elif game_object == PERSON: + color = (0, 255, 255) + elif game_object == PLAYER: + color = (128, 255, 0) + elif game_object == EXIT: + color = (255, 0, 255) + else: + raise ValueError("Invalid object type.") + + return color + +def get_floor_type_name(floor_type): + """ Return a string name for a floor type. """ + name = "" + + if floor_type == VOID: + name = "VOID" + elif floor_type == SOLID_WALL: + name = "SOLID WALL" + elif floor_type == SECRET_WALL: + name = "SECRET WALL" + elif floor_type == CLEAR_WALL: + name = "CLEAR WALL" + elif floor_type == NEON_WALL: + name = "NEON WALL" + elif floor_type == WINDOW_WALL: + name = "WINDOW" + elif floor_type == EMPTY_FLOOR: + name = "EMPTY FLOOR" + elif floor_type == RUG: + name = "RUG" + elif floor_type == WATER: + name = "WATER" + elif floor_type == BAR: + name = "BAR" + else: + raise ValueError("Invalid floor type.") + + return name + +def get_floor_type_color(floor_type): + """ Return a string name for a floor type. """ + color = (0, 0, 0) + + if floor_type == VOID: + color = (0, 0, 0) + elif floor_type == SOLID_WALL: + color = (255, 255, 255) + elif floor_type == SECRET_WALL: + color = (128, 128, 128) + elif floor_type == CLEAR_WALL: + color = (50, 50, 50) + elif floor_type == NEON_WALL: + color = (255, 0, 0) + elif floor_type == WINDOW_WALL: + color = (128, 128, 255) + elif floor_type == EMPTY_FLOOR: + color = (128, 128, 0) + elif floor_type == RUG: + color = (128, 0, 128) + elif floor_type == WATER: + color = (64, 64, 255) + elif floor_type == BAR: + color = (255, 255, 0) + else: + raise ValueError("Invalid floor type.") + + return color + +def save_map(game_map): + p_id = 0 + dialogs = list() + f = open("map_file.map", "w") + + f.write("[MAP]\n") + f.write(str(MAP_SIZE [0]) + " " + str(MAP_SIZE[1]) + "\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + f_t = game_map[i][j].get_type(); + f.write(str(f_t)) + f.write("\n") + + f.write("[PLAYER]\n") + f.write("%player = X Y\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + o_t = game_map[i][j].get_object(); + if o_t is not None and o_t == PLAYER: + f.write("player = " + str(i) + " " + str(j) + "\n") + + f.write("[EXITS]\n") + f.write("%exit = X Y MAP_NAME MAP_X MAP_Y\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + o_t = game_map[i][j].get_object(); + if o_t is not None and o_t == EXIT: + f.write("exit = " + str(i) + " " + str(j)) + f.write(" map_file.map 0 0\n") + + f.write("[DOORS]\n") + f.write("%door = X Y ID UNLOCKED\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + o_t = game_map[i][j].get_object(); + if o_t is not None and o_t == DOOR: + f.write("door = " + str(i) + " " + str(j) + " 0" + " 0\n") + + f.write("[KEYS]\n") + f.write("%key = X Y ID\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + o_t = game_map[i][j].get_object(); + if o_t is not None and o_t == KEY: + f.write("key = " + str(i) + " " + str(j) + " 0\n") + + f.write("[PERSONS]\n") + f.write("%person = X Y NAME DIALOG_ID\n") + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + o_t = game_map[i][j].get_object(); + if o_t is not None and o_t == PERSON: + f.write("person = " + str(i) + " " + str(j)) + f.write(" SOMEONE " + str(p_id) + "\n") + dialogs.append(p_id) + p_id += 1 + + f.write("[DIALOGS]\n") + f.write("%dialog = ID TEXT\n") + for id in dialogs: + text = " Heavy boxes perform quick waltzes and jigs.\n" + f.write("dialog = " + str(id) + text) + + f.close() + +class Cell: + """ A game_map cell. """ + def __init__(self, x_size, y_size): + """ Create a new cell. """ + self.x_size = x_size + self.y_size = y_size + + self.floor_type = VOID + self.game_object = None + + # Create the drawing rectangles. + self.border = pygame.Rect((0, 0), (CELL_SIZE, CELL_SIZE)) + self.cell = pygame.Rect((0, 0), (CELL_SIZE - 2, CELL_SIZE - 2)) + + def set_type(self, floor_type): + """ Set this cell floor type. Raises a value error if the type is + not valid. """ + if floor_type < VOID or floor_type > BAR: + raise ValueError("Floor type must be a number between 0 and 9.") + else: + self.floor_type = floor_type + + def get_type(self): + """ Returns this cell's type. """ + return self.floor_type + + def set_object(self, game_object): + """ Set this cells object. """ + if game_object is not None and game_object < DOOR or game_object > EXIT: + raise ValueError("Object type must be a number between 0 and 2.") + else: + self.game_object = game_object + + def get_object(self): + """ Return this cell's object. """ + return self.game_object + + def draw(self, canvas, x_pos, y_pos): + """ Render this cell at the given position on the given screen. """ + self.border.center = (x_pos, y_pos) + self.cell.center = (x_pos, y_pos) + pygame.draw.rect(canvas, (0, 0, 255), self.border) + + color = get_floor_type_color(self.floor_type) + pygame.draw.rect(canvas, color, self.cell) + + if self.game_object is not None and self.game_object < PLAYER: + r = (CELL_SIZE - 2) // 2 + color = get_object_type_color(self.game_object) + pygame.draw.circle(canvas, color, (x_pos, y_pos), r, 1) + elif self.game_object is not None and self.game_object >= PLAYER: + r = (CELL_SIZE - 3) // 2 + color = get_object_type_color(self.game_object) + pygame.draw.circle(canvas, color, (x_pos, y_pos), r, 0) + +def main(): + """ Application entry point. """ + # Local variables + done = False + game_map = list() + curr_obj = None + curr_fl = VOID + obj_str = "" + fl_str = "" + mouse_pos = (0, 0) + mouse_cell = (0, 0) + mouse_r_click = False + mouse_l_click = False + + # Initialize Pygame. + pygame.init() + clock = pygame.time.Clock() + screen = pygame.display.set_mode(SCREEN_SIZE, SCREEN_FLAGS) + pygame.mouse.set_visible(True) + + for i in range(0, MAP_SIZE[0]): + game_map.append([Cell(10, 10) for j in range(0, MAP_SIZE[1])]) + + # Main game loop. + while(not done): + try: + fps = clock.get_fps() + 0.001 + + # Set title bar. + obj_str = get_object_type_name(curr_obj) + fl_str = get_floor_type_name(curr_fl) + title = TITLE + str(mouse_cell) + " :: FPS: " + str(int(fps)) + title += " :: " + obj_str + " :: " + fl_str + pygame.display.set_caption(title) + + # Input capture. + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + + if event.type == pygame.MOUSEBUTTONDOWN: + mouse_pos = event.pos + if event.button == 1: + mouse_r_click = True + elif event.button == 3: + mouse_l_click = True + + if event.type == pygame.MOUSEMOTION: + i = mouse_pos[1] // CELL_SIZE + j = mouse_pos[0] // CELL_SIZE + mouse_cell = (i, j) + if mouse_r_click: + mouse_pos = event.pos + + if event.type == pygame.MOUSEBUTTONUP: + mouse_pos = event.pos + if event.button == 1: + mouse_r_click = False + elif event.button == 3: + mouse_l_click = False + + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + done = True + + if event.key == pygame.K_d: + curr_obj = DOOR + if event.key == pygame.K_k: + curr_obj = KEY + if event.key == pygame.K_p: + curr_obj = PERSON + if event.key == pygame.K_q: + curr_obj = PLAYER + if event.key == pygame.K_e: + curr_obj = EXIT + if event.key == pygame.K_n: + curr_obj = None + + if event.key == pygame.K_0: + curr_fl = VOID + if event.key == pygame.K_1: + curr_fl = SOLID_WALL + if event.key == pygame.K_2: + curr_fl = SECRET_WALL + if event.key == pygame.K_3: + curr_fl = CLEAR_WALL + if event.key == pygame.K_4: + curr_fl = NEON_WALL + if event.key == pygame.K_5: + curr_fl = WINDOW_WALL + if event.key == pygame.K_6: + curr_fl = EMPTY_FLOOR + if event.key == pygame.K_7: + curr_fl = RUG + if event.key == pygame.K_8: + curr_fl = WATER + if event.key == pygame.K_9: + curr_fl = BAR + + if event.key == pygame.K_s: + save_map(game_map) + + # Update cycle. + if mouse_r_click: + i = mouse_pos[1] // CELL_SIZE + j = mouse_pos[0] // CELL_SIZE + if i >= MAP_SIZE[0]: + i = MAP_SIZE[0] - 1 + if j >= MAP_SIZE[1]: + j = MAP_SIZE[1] - 1 + game_map[i][j].set_type(curr_fl) + + if mouse_l_click: + i = mouse_pos[1] // CELL_SIZE + j = mouse_pos[0] // CELL_SIZE + if i >= MAP_SIZE[0]: + i = MAP_SIZE[0] - 1 + if j >= MAP_SIZE[1]: + j = MAP_SIZE[1] - 1 + game_map[i][j].set_object(curr_obj) + + # Render cycle. + screen.fill((0, 0, 0)) + + for i in range(0, MAP_SIZE[0]): + for j in range(0, MAP_SIZE[1]): + x = (j * CELL_SIZE) + (CELL_SIZE // 2) + y = (i * CELL_SIZE) + (CELL_SIZE // 2) + game_map[i][j].draw(screen, x, y) + + pygame.display.update() + clock.tick(FPS) + + except KeyboardInterrupt: + done = True + + pygame.quit() + +if __name__ == "__main__": + main() diff --git a/include/constants.h b/include/constants.h index ae042e0..9d469ea 100644 --- a/include/constants.h +++ b/include/constants.h @@ -1,22 +1,32 @@ -#pragma once +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + #ifndef STATE_CONSTS_H #define STATE_CONSTS_H -static const int BAR_COLOR = 1; -static const int BSC_COLOR = 2; -static const int HLT_COLOR = 3; -static const int OFF_COLOR = 4; -static const int DIM_COLOR = 5; -static const int LIT_COLOR = 6; -static const int GUI_COLOR = 7; -static const int EMP_COLOR = 8; +static const int DEBUG = 0; +#define F_SEP "/" -static const int INTRO_STATE = 0; -static const int MENU_STATE = 1; -static const int LOAD_STATE = 2; -static const int SCORE_STATE = 3; -static const int GAME_STATE = 4; - -static const int QUIT_STATE = -1; +enum COLORS { + BAR_COLOR = 1, + BSC_COLOR, + HLT_COLOR, + OFF_COLOR, + DIM_COLOR, + LIT_COLOR, + GUI_COLOR, + EMP_COLOR, + DW_COLOR, + SW_COLOR, + SN_COLOR, + GR_COLOR, + FR_COLOR, + HL_COLOR, + MN_COLOR, + VOID_COLOR, + IND_COLOR +}; #endif diff --git a/include/game_over.h b/include/game_over.h new file mode 100644 index 0000000..7da303e --- /dev/null +++ b/include/game_over.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef GAME_OVER_H +#define GAME_OVER_H + +#include "game_state.h" + +void initGOState(gs_t *); + +#endif diff --git a/include/game_state.h b/include/game_state.h new file mode 100644 index 0000000..f20eb04 --- /dev/null +++ b/include/game_state.h @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef GAME_STATE_H +#define GAME_STATE_H + +static const int NUM_STATES = 4; + +typedef enum GAME_STATE_NAMES { INTRO = 0, MENU = 1, IN_GAME = 2, GAME_OVER = 3 } gsname_t; + +typedef struct GAME_STATE { + gsname_t name; + void (*input)(); + gsname_t (*update)(); + void (*render)(int, int); +} gs_t; + +extern void initStateArray(gs_t **); +void clear_screen(int, int); + +#endif diff --git a/include/in_game.h b/include/in_game.h new file mode 100644 index 0000000..be4d39a --- /dev/null +++ b/include/in_game.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef IN_GAME_H +#define IN_GAME_H + +#include "game_state.h" + +extern void initInGameState(gs_t *); + +#endif diff --git a/include/intro.h b/include/intro.h new file mode 100644 index 0000000..48851b4 --- /dev/null +++ b/include/intro.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef INTRO_H +#define INTRO_H + +#include "game_state.h" + +void initIntroState(gs_t *); + +#endif diff --git a/include/intro_img.h b/include/intro_img.h new file mode 100644 index 0000000..d7d155a --- /dev/null +++ b/include/intro_img.h @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef INTRO_IMG_H +#define INTRO_IMG_H + +static int INTRO_IMG[80][80] = { + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, DW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, GR_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, SN_COLOR, GR_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, DW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, SN_COLOR, SN_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, DW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, DW_COLOR, SN_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SN_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, DW_COLOR, DW_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, DW_COLOR, DW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, DW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, GR_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, GR_COLOR, SW_COLOR, GR_COLOR, SW_COLOR, SW_COLOR, SW_COLOR, SN_COLOR, SW_COLOR, DW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, SW_COLOR, SW_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR}, + {VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR, VOID_COLOR} +}; + +#endif diff --git a/include/island.h b/include/island.h deleted file mode 100644 index f4b9bd4..0000000 --- a/include/island.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. - * See the file LICENSE for more details. - */ - -#ifndef ISLAND_H -#define ISLAND_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum TERRAIN_TYPE { DEEP_WATER, - SHALLOW_WATER, - SAND, - GRASS, - FOREST, - HILL, - MOUNTAIN - } terrain_t; - - /** - * Generate a diamond-square fractal map. - */ - extern void ds ( float ***, const unsigned int ); - - /** - * Generate a mask using particle deposition. - */ - extern void island ( int ***, unsigned int ); - - /** - * Normalize a float matrix between 0 and 1. - */ - extern void norm ( float ***, unsigned int ); - - /** - * Normalize an int matrix between 0 and 255. - */ - extern void normInt ( int ***, unsigned int ); - - /** - * Perform a 3x3 average blur. - */ - extern void smooth ( int ***, unsigned int ); - - /** - * Multiply the diamond square map with the island mask. - * Both matrices must have been normalized before. - */ - extern void mult ( float ***, int ***, unsigned int ); - - /** - * Given a sample from a heightmap, return the terrain - * type that correspond it. - */ - terrain_t terrainType( int ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/main_menu.h b/include/main_menu.h new file mode 100644 index 0000000..9185a05 --- /dev/null +++ b/include/main_menu.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef MAIN_MENU_H +#define MAIN_MENU_H + +#include "game_state.h" + +extern void initMMState(gs_t *); + +#endif diff --git a/include/map.h b/include/map.h new file mode 100644 index 0000000..268a01f --- /dev/null +++ b/include/map.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#ifndef MAP_H +#define MAP_H + +#define MAX_MAP_SIZE 64 +#define MAX_OBJECTS 512 +#define MAX_STR 128 + +typedef enum FLOOR_TYPES { + VOID = 0, + SOLID_WALL, + SECRET_WALL, + CLEAR_WALL, + NEON_WALL, + WINDOW_WALL, + EMPTY_FLOOR, + RUG, + WATER, + BAR + } floor_t; + +typedef enum OBJECT_TYPES { + DOOR = 0, + KEY, + PERSON, + PLAYER_START, + EXIT, + DIALOG, + NONE = 9989 + } obj_t; + +typedef enum ERROR_CODES { + NO_ERROR = 0, + FILE_NOT_FOUND, + OUT_OF_MEMORY, + PREMATURE_EOF, + MAP_TOO_LARGE, + INVALID_KEY + } errcode_t; + +typedef struct MAP_CELL{ + floor_t f; +} map_cell_t; + +typedef struct OBJECT { + obj_t type; + short x, y, eX, eY, sX, sY; + short id; + short dId; + char name[MAX_STR]; + char target[MAX_STR]; + char dialog[MAX_STR]; + unsigned char unlocked; +} game_obj_t; + +extern errcode_t readMapData(const char *, map_cell_t ***, int *, int *); +extern errcode_t readMapObjects(const char *, game_obj_t **, int *); + +#endif diff --git a/lib/libfov.a b/lib/libfov.a index c66ba87..088e3cf 100644 Binary files a/lib/libfov.a and b/lib/libfov.a differ diff --git a/lib/libisland.a b/lib/libisland.a deleted file mode 100644 index 7e247dc..0000000 Binary files a/lib/libisland.a and /dev/null differ diff --git a/maps/aquarium.map b/maps/aquarium.map new file mode 100644 index 0000000..6094c96 --- /dev/null +++ b/maps/aquarium.map @@ -0,0 +1,80 @@ +[MAP] +32 32 +00000000000000166100000000000000 +01155111551101166110111111111110 +01666666666111777711166666666610 +05666666666261777716266666666650 +05664444466111777711166444446650 +01664818466101777710166481846610 +01664888466111122111166488846610 +05664181466266666666266418146650 +05664181466111155111166418146650 +01664181466105777750166418146610 +01664888466105777750166488846610 +05664818466111177111166481846650 +05664444466266277266266444446650 +01666666666111177111166666666610 +01166666666111999911166666666110 +00116666666116666661166666661100 +00011666666666666666666666611000 +00001166666666666666666666110000 +00000155155116666661155155100000 +00000000000016666661000000000000 +00000000000011666611000000000000 +00000000000001666610000000000000 +00000000000001166110000000000000 +00000000000000166100000000000000 +11555111555111166111155511155511 +13333614464417766771446441699991 +18883614666417666671466641667791 +18883666666666666666666666697791 +18883666666666666666666666697791 +18883614666417666671466641697791 +13333614464417766771446441699991 +11555111555111166111155511155511 +[PLAYER] +%player = X Y +player = 30 16 +[EXITS] +%exit = X Y MAP_NAME MAP_X MAP_Y +exit = 0 15 END 0 0 +exit = 0 16 END 0 0 +[DOORS] +%door = X Y ID UNLOCKED +door = 1 15 1 0 +door = 1 16 1 0 +door = 24 15 0 1 +door = 24 16 0 1 +door = 27 6 0 1 +door = 27 12 0 1 +door = 27 19 0 1 +door = 27 25 0 1 +door = 28 6 0 1 +door = 28 12 0 1 +door = 28 19 0 1 +door = 28 25 0 1 +door = 31 15 2 0 +door = 31 16 2 0 +[KEYS] +%key = X Y ID +key = 3 12 1 +[PERSONS] +%person = X Y NAME DIALOG_ID +person = 3 19 Cyd 0 +person = 9 6 Godot 1 +person = 9 15 Juan 2 +person = 9 16 Salvo 3 +person = 15 5 Jade 4 +person = 15 26 Wilco 5 +person = 26 5 Mildagrad 6 +person = 28 28 Bartender 7 +[DIALOGS] +%dialog = ID TEXT +dialog = 0 Hello! +dialog = 1 How did you get in here?! +dialog = 2 Bonjour! I cannot give you the key. I misplaced it. +dialog = 3 Bonjour. +dialog = 4 I think there is someone in that aquarium over there. +dialog = 5 I heard some noises coming from inside the wall! +dialog = 6 This aquarium would be better with some fish in it! +dialog = 7 Welcome to the bar. Would you like something to drink? diff --git a/maps/maze.map b/maps/maze.map new file mode 100644 index 0000000..986d593 --- /dev/null +++ b/maps/maze.map @@ -0,0 +1,96 @@ +[MAP] +64 64 +1111111111111111111111111111111111111111111111111111111111111110 +1727172727272717272727172717172717272717271727172727271727272710 +1212121212121211121212121212121212111112111212121211111211111210 +1717172727172727271717172727271727271727172717171717271727172710 +1212111112121112111112121212121111121211111212111212121112111210 +1727271717172717271717272717172717272727272717272717172717271710 +1211121212111112111222111111111211121112111111111112111211111210 +1727172727172727172717272727172717271717272717172727172717272710 +1212121211121211121111111212121111121211121112121111111212111210 +1717172717271717271727171717272727272727171727271727171727171710 +1212111111121111121211121212121111121211121112121212121112121110 +1727272727271727271717272717171727171717271727171717272717272710 +1211111112111211111211121212121211121112111112111112111211121110 +1727271727172727272727171717171727271717272727271727172717271710 +1112111212111212111111121212121111111211111111111112111212111210 +1717172717271727171727271717172727171717171717171727172727272710 +1212121111121112121212121212121112121212121212121211111111121110 +1727171727272727271717272717171717271727272727272717272717271710 +1211121211121211121211111111121211121211121211121112111212111210 +1727271727171717172717171727272717272717271727172727172727271710 +1111111112111212121112121212121111111112121112121111111211111210 +1717272727172717171727272717171717171727171727171727272717172710 +1212121111121112121111121112111212121211121111121212111112121110 +1727171727171727271727271717172717272717272727271717272727171710 +1111121211121112111211111212121212121112111111121211121112121210 +1727271727172717272717272727171727171727172727271727171727272710 +1212121211111212111211121111111211121112111112111211121111111210 +1717172717272717271717271727171717271727271727272727172727271710 +1212121211111211121211121112121611111111121112121111111211121210 +1717171717271727271727171727276667172727171727171727272727171710 +1212111212121111111112121112111611121211121111121112111111121110 +1717271727172727172717271727172717171727172777171727172727272710 +1111111111121211121211111112111212121211111112121212121111111210 +1727172727171717271727272727271727271727272727271717171727272710 +1112111212121211121212111112111211111111111112111212121111121210 +1727271717271727271717171717172717172717272727272717172717271710 +1111121212121211111112121211121212121212111111111112111211121110 +1727172717172727171717271727272717271717172727172727272727271710 +1112112112111112121211121211111111121212121112111111121212111210 +1727172727172717272717271727171727271727171717272727171717272710 +1112121111121211111112111112121211121211121211121112111211111210 +1727271727271717172727171727272717272717171727172717271727172710 +1211111111111212121111121211121211111112121211111211121212121210 +1727272727272717271727171727171727271717272727271717171717171710 +1111111112111212111212121112111111121212111211121212121212121110 +1727272717171717172717271717272727172717171717171717271717272710 +1211111212121112121211111212111211111212121212121112111111121210 +1727271727172727271727271727171717271727171717172727271727271710 +1112111111121111111212111211121212121111121212111211121211111210 +1727172727271717271717171717271717172717172727172717271717172710 +1111121112111212121211121211121111121211111111111212111212121210 +1727171727172727171727272717272727171717272717171717271727271710 +1212111212111211121112111111111112121112111212121211121112121110 +1717271717271727171717172727272727172727171717272717172727272710 +1211121212121111121212111211111211111111121211121212121111111210 +1717171717172717271717272717271717272727271727272717271717272710 +1112121112111212111211121112121211111211121112121111111211121210 +1727272717271717272717171717171727271717272727171727272717271710 +1112111211111212111212111212121111121112121211111211111212111210 +1727171717272717272727272727171727172727171717172717171717172710 +1112121212111112111212111212121212121111121212121212121112121210 +1727172727272727172717172717172717271727271727271717272727271710 +1111111111111111111111111111111111111111111111111111111111111110 +0000000000000000000000000000000000000000000000000000000000000000 +[PLAYER] +%player = X Y +player = 1 1 +[EXITS] +%exit = X Y MAP_NAME MAP_X MAP_Y +exit = 29 31 END 0 0 +[DOORS] +%door = X Y ID UNLOCKED +door = 28 31 1 0 +door = 29 30 2 0 +door = 29 32 3 0 +door = 30 31 4 0 +[KEYS] +%key = X Y ID +key = 17 37 4 +key = 31 43 3 +key = 53 23 2 +key = 57 57 1 +[PERSONS] +%person = X Y NAME DIALOG_ID +person = 1 3 Steven 0 +person = 1 61 Amethyst 1 +person = 61 1 Pearl 2 +person = 61 61 Garnet 3 +[DIALOGS] +%dialog = ID TEXT +dialog = 0 You need any of the four keys to exit this maze. +dialog = 1 GET ME OUT OF HERE! +dialog = 2 Now where is Steven? I told him this place was dangerous! +dialog = 3 Each key works on one door only. diff --git a/maps/start.map b/maps/start.map new file mode 100644 index 0000000..19011a3 --- /dev/null +++ b/maps/start.map @@ -0,0 +1,173 @@ +[MAP] +64 64 +0000000000000000000000000000017710000000000000000000000000000000 +0111111111111100000000000000117711000011111111111111111111111110 +0161626162616110000000000001137731100014441666666666666666666610 +0161616161626611000000000011837738110014771699999999999999999610 +0121112111112111100000000018837738810014776666666666666666669610 +0162616262626161110000000013337733310014991696999999999999999910 +0111212121211121610000000013337733310014991696666666666666666910 +0162616161616261610000000018837738810014776699999999999999996910 +0111211121212111611111111111837738110014771696666666666666696910 +0162616261626261626666666661137731100014441111111111111111116110 +0121112121211121611111111161626611000011111000166666666666666610 +0162626161626162610000000161616610000000000000166666666666666610 +0111111111111111111115511121116611111111111111166633333333336610 +0000040000004000001777777166666666661666666666666638888888836610 +4444444444444444441797777667777777766666666133166638888888836610 +0000040000004000005797777167777777761666666388366638888888836610 +0011111115111111105797777167777777761666666388366638888888836610 +0018166177716618101797777667777777766666666133166633333333336610 +0016166177716616101777777167777777761666666666666666666666666610 +0016161199911616101115511166666666661111111111166666666666666610 +0016666166616666100000000111116611111000000000111111111111111110 +0056666166616666500000440000016610000044000000000000000000000000 +0056666666666666500000440000016610000044000000000000000000000001 +0016666166616666100000440000016610000044000000000000000000000011 +0011111166611111100000440000016610000044000000000000000000000111 +0018177166616618104444444444036630444444444400000000000000000181 +0016177166616616104444444444036630444444444400000000000000000181 +0016161166611616100000440000016610000044000000000000000000100181 +0017777166616666100000440000016610000044000000000000000001100181 +0057777166616776504000440000016610000044000000000000000011100181 +0059977666666776504000440000016610000044000000000000000118100161 +0017977166616666104000000000116611000000000000000000000188100161 +0011111166611111104000000001166661100000000000000000000188100161 +0018166166616618104000000011667766110000000000000000100188100161 +0016166166616616100000000116677776611000000000000001100188100181 +0016161166611616104000001166777777661100000000000011100133100181 +0016666166616666104000001667777777766100000000000118100166100181 +0056666166616666504000011677777777776110000000000188100166100181 +0056666666666666504000116677777777776611000000000188100166100181 +0016666166616666104001166777777777777661100000100188100166100181 +0011111166111111100011667777777777777766110001100133100166100161 +0000000166100000000011677777777777777776110011100166100166100161 +0000000166100000000011677777777777777776110118100166100166100161 +0000000166101111110011677777777777777776110188100166100166100161 +0000000166101388310011667777777777777766110188100166100166100161 +0115151166101888810001166777777777777661100133100166100166100181 +0166666666101888811111226677777777776611000166100166100166100161 +0166666666101388826666611667777777766110000166100166100166100161 +0566111111101111111111111696777777696100000166100166100166100181 +0566100000000000000000001696777777696100000166100166100166100181 +0566111111111111111111111996777777699111111166111166111166111121 +0166666666666666666666666666777777666666666666666666666666662661 +0166666666666666666666666666666666666666666666666666666666662661 +0115511551111551155116611311661166113116611551155111155115511111 +0000000000000000000017777777741147777777710000000000000000000000 +0044444444444444444057777777741147777777750444444444444444440000 +0040004000400040004017799999741147999997710400040004000400040000 +0044444444444444444057777777741147777777750444444444444444440000 +0040004000400040004017799999741147999997710400040004000400040000 +0044444444444444444011777777711117777777110444444444444444440000 +0040004000400040004001177777110011777771100400040004000400040000 +0044444444444444444000111111100001111111000444444444444444440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +[PLAYER] +%player = X Y +player = 26 30 +[EXITS] +%exit = X Y MAP_NAME MAP_X MAP_Y +exit = 2 30 maps/aquarium.map 0 0 +exit = 2 31 maps/aquarium.map 0 0 +exit = 11 28 maps/maze.map 0 0 +[DOORS] +%door = X Y ID UNLOCKED +door = 4 42 0 1 +door = 7 42 0 1 +door = 9 60 0 1 +door = 10 28 1 0 +door = 10 30 2 0 +door = 10 31 2 0 +door = 13 43 0 1 +door = 13 46 0 1 +door = 14 25 0 1 +door = 17 25 0 1 +door = 18 43 0 1 +door = 18 46 0 1 +door = 19 3 0 1 +door = 19 5 0 1 +door = 19 13 0 1 +door = 19 15 0 1 +door = 22 7 0 1 +door = 22 11 0 1 +door = 27 3 5 0 +door = 27 5 0 1 +door = 27 13 0 1 +door = 27 15 0 1 +door = 30 7 4 0 +door = 30 11 0 1 +door = 31 30 3 0 +door = 31 31 3 0 +door = 35 3 0 1 +door = 35 5 0 1 +door = 35 13 0 1 +door = 35 15 0 1 +door = 38 7 0 1 +door = 38 11 0 1 +[KEYS] +%key = X Y ID +key = 2 8 5 +key = 7 40 3 +key = 25 3 1 +key = 51 62 2 +key = 40 62 4 +[PERSONS] +%person = X Y NAME DIALOG_ID +person = 3 4 Stan 0 +person = 3 8 Dora 1 +person = 3 40 Bill 2 +person = 4 61 Jenny 3 +person = 5 14 Cilia 4 +person = 7 2 Herdier 5 +person = 8 31 Doorman 6 +person = 8 40 Soos 7 +person = 15 19 Barman 8 +person = 15 24 Haddock 9 +person = 16 39 Dipper 10 +person = 16 40 Mabel 11 +person = 17 12 Itan 12 +person = 17 22 Astro 13 +person = 19 61 Ittle 14 +person = 22 4 Malon 15 +person = 25 62 Error 16 +person = 30 15 Walter 17 +person = 34 6 Rosa 18 +person = 34 15 Calvin 19 +person = 39 3 Nate 20 +person = 40 27 Deckard 21 +person = 40 35 Lester 22 +person = 45 14 Misty 23 +person = 45 31 Hobbes 24 +person = 49 25 Juniper 25 +person = 49 36 Tipsie 26 +[DIALOGS] +%dialog = ID TEXT +dialog = 0 Finally, I have them all! +dialog = 1 I wonder what this key is for. +dialog = 2 I'll be watching you... +dialog = 3 Hi, how you doin'? +dialog = 4 Who designs buildings like this? I'm lost! +dialog = 5 Woof! +dialog = 6 Enjoyed your stay? +dialog = 7 Now you can go to the apartment building. +dialog = 8 Want a tip? Go to the very end of the largest hallway. +dialog = 9 They serve the best drinks in here! +dialog = 10 Have you seen our uncle? +dialog = 11 Stan! Where are you? +dialog = 12 ZZZZzzzzzz... +dialog = 13 That man sure drinks a lot! +dialog = 14 Keep an eye out for secret places! +dialog = 15 What are you doing in my house?! +dialog = 16 You never saw me here, OK? +dialog = 17 Like the rug? It really ties the room together! +dialog = 18 ZZZZzzzzzz... +dialog = 19 Hey! Knock first! +dialog = 20 Have you seen dog? It's name is Herdier and it ran away! +dialog = 21 This is one fancy building, all right. +dialog = 22 There seems to be an electrical storm coming this way. +dialog = 23 I love swimming? Do you swim? +dialog = 24 Why won't he hurry?! We are already late as it is! +dialog = 25 May I help you? +dialog = 26 May I help you? diff --git a/maps/test.map b/maps/test.map new file mode 100644 index 0000000..56ee246 --- /dev/null +++ b/maps/test.map @@ -0,0 +1,61 @@ +[MAP] +32 32 +00000000000000000000000000000000 +00000000000044444440000000000000 +00000000000441111144000000000000 +00000000004411666114400000000000 +44444000044116777611440000000000 +41514400441167777761144000000000 +41771440411677737776114444444000 +41777144416777383777614115114000 +41997711116773888377611166614000 +41797726626738888837666666654000 +41997711116773888377611166614000 +41777144416777383777614115114000 +41771440411677737776114444444000 +41514400441167777761144000000000 +44444000044116777611440000000000 +00000000004411666114400000000000 +00000000000441161144000000000000 +00000000000044565440000000000000 +00000000000004161400000000000000 +00000000000004565400000000000000 +00000000444444161444444000000000 +00000000411551161155114000000000 +00000000416666666666614000000000 +00000000456666666666654000000000 +00000000456677777776654000000000 +00000000416677777776614000000000 +00000000416677777776614000000000 +00000000456677777776654000000000 +00000000456666666666654000000000 +00000000416666666666614000000000 +00000000411551151155114000000000 +00000000444444444444444000000000 +[PLAYER] +%player = X Y +player = 27 15 +[EXITS] +%exit = X Y MAP_NAME MAP_X MAP_Y +exit = 8 25 maps/start.map 0 0 +exit = 9 25 maps/start.map 0 0 +exit = 10 24 END 0 0 +exit = 10 25 maps/start.map 0 0 +[DOORS] +%door = X Y ID UNLOCKED +door = 9 22 0 0 +[KEYS] +%key = X Y ID +key = 7 2 0 +[PERSONS] +%person = X Y NAME DIALOG_ID +person = 8 24 Hugo 0 +person = 9 2 Paco 1 +person = 23 11 Luis 2 +person = 23 19 Donald 3 +[DIALOGS] +%dialog = ID TEXT +dialog = 0 Step into the elevator to retry. +dialog = 1 I'm unreachable! +dialog = 2 Welcome to Cyjam! +dialog = 3 Have fun. diff --git a/src/game_over.c b/src/game_over.c new file mode 100644 index 0000000..ca9528d --- /dev/null +++ b/src/game_over.c @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#include +#include +#include + +#include "constants.h" +#include "game_over.h" + +static const char * title = "NOT SO ROGUE-LIKE"; +static const char * subtitle = "A game for the Cyberpunk Jam 2014"; +static const char * aWinnerIsYou = "You have completed the scenario!"; +static const char * thanks = "Thank you for playing."; +static const char * goInfo = "Press enter to return to the main menu."; + +static bool enter; + +void goInput(); +gsname_t goUpdate(); +void goRender(int, int); + +void initGOState(gs_t * gs){ + gs->name = GAME_OVER; + gs->input = &goInput; + gs->update = &goUpdate; + gs->render = &goRender; +} + +void goInput(){ + int key = 0; + + key = getch(); + + if(key != ERR){ + if(key == KEY_ENTER || key == '\n') enter = TRUE; + } +} + +gsname_t goUpdate(){ + if(enter){ + enter = FALSE; + return MENU; + } + + return GAME_OVER; +} + +void goRender(int w, int h){ + int sW; + + clear_screen(w, h); + + /* Print the title. */ + sW = strlen(title); + sW /= 2; + + attron(A_BOLD); + + move(1, (w / 2) - sW); + attron(COLOR_PAIR(SN_COLOR)); + printw(title); + + /* Print the subtitle. */ + sW = strlen(subtitle); + sW /= 2; + + move(2, (w / 2) - sW); + attron(COLOR_PAIR(SW_COLOR)); + printw(subtitle); + + attroff(A_BOLD); + + /* Print the game over message. */ + sW = strlen(aWinnerIsYou); + sW /= 2; + + move((h / 2) - 2, (w / 2) - sW); + attron(COLOR_PAIR(GR_COLOR)); + printw(aWinnerIsYou); + + sW = strlen(thanks); + sW /= 2; + + move((h / 2) - 1, (w / 2) - sW); + attron(COLOR_PAIR(GR_COLOR)); + printw(thanks); + + /* Print help. */ + sW = strlen(goInfo); + sW /= 2; + + move(h - 5, (w / 2) - sW); + attron(COLOR_PAIR(MN_COLOR)); + printw(goInfo); +} + diff --git a/src/game_state.c b/src/game_state.c new file mode 100644 index 0000000..9ddb253 --- /dev/null +++ b/src/game_state.c @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#include + +#include "constants.h" +#include "game_state.h" +#include "intro.h" +#include "main_menu.h" +#include "in_game.h" +#include "game_over.h" + +void initStateArray(gs_t ** s){ + initIntroState(&((*s)[INTRO])); + initMMState(&((*s)[MENU])); + initInGameState(&((*s)[IN_GAME])); + initGOState(&((*s)[GAME_OVER])); +} + +void clear_screen(int w, int h){ + int i, j; + move(0,0); + attron(COLOR_PAIR(BSC_COLOR)); + for(i = 0; i < w; i++){ + for(j = 0; j < h; j++){ + move(j, i); + printw(" "); + } + } +} diff --git a/src/in_game.c b/src/in_game.c new file mode 100644 index 0000000..1baf3a2 --- /dev/null +++ b/src/in_game.c @@ -0,0 +1,649 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#include +#include +#include +#include +#include + +#include "constants.h" +#include "in_game.h" +#include "map.h" + +#define MAX_KEYS 15 + +static const char *keyMsg = "You picked up a key."; +static const char *saysMsg = " says: "; +static const char *openDoor = "The door opens."; +static const char *doorLock = "This door is locked."; + +typedef struct PLAYER { + unsigned short x; + unsigned short y; +} player_t; + +static bool ** vis; +static bool ** seen; +static bool ** wmap; +static bool w_mov = FALSE; +static bool uK, dK, lK, rK, esc; +static clock_t then, msgThen; +static player_t player; +static map_cell_t ** map; +static game_obj_t objs[MAX_OBJECTS]; +static int mW, mH, nO; +static fov_settings_type fov_settings; +static int keys[MAX_KEYS]; +static int freeKey; +static char msg[128]; +static bool newMsg = FALSE; + +void input(); +gsname_t update(); +void render(int, int); +void drawGui(int, int); +void setPlayerStart(); +void initObjects(); +void initKeys(); +void drawNeon(int, int, floor_t); +void apply(void *, int, int, int, int, void *); +bool opaque(void *, int, int); +void loadMap(const char *); +bool canMoveTo(int, int); + +void initInGameState( gs_t * gs) { + int i, j; + + uK = dK = lK = rK = esc = FALSE; + + gs->name = IN_GAME; + gs->input = &input; + gs->update = &update; + gs->render = &render; + + map = ( map_cell_t ** ) malloc ( sizeof ( map_cell_t * ) * MAX_MAP_SIZE); + for ( i = 0; i < MAX_MAP_SIZE; ++i ) { + map[ i ] = ( map_cell_t * ) calloc ( MAX_MAP_SIZE , sizeof ( map_cell_t ) ); + } + + wmap = ( bool ** ) malloc ( sizeof ( bool * ) * MAX_MAP_SIZE); + for ( i = 0; i < MAX_MAP_SIZE; ++i ) { + wmap[ i ] = ( bool * ) calloc ( MAX_MAP_SIZE, sizeof ( bool ) ); + for(j = 0; j < MAX_MAP_SIZE; ++j){ + wmap[i][j] = rand() % 2; + } + } + + vis = ( bool ** ) malloc ( sizeof ( bool * ) * MAX_MAP_SIZE); + seen = ( bool ** ) malloc ( sizeof ( bool * ) * MAX_MAP_SIZE); + for ( i = 0; i < MAX_MAP_SIZE; ++i ) { + vis[ i ] = ( bool * ) calloc ( MAX_MAP_SIZE, sizeof ( bool ) ); + seen[ i ] = ( bool * ) calloc ( MAX_MAP_SIZE, sizeof ( bool ) ); + for(j = 0; j < MAX_MAP_SIZE; ++j){ + vis[i][j] = TRUE; + seen[i][j] = FALSE; + } + } + + initObjects(); + loadMap("maps/start.map"); + + fov_settings_init(&fov_settings); + fov_settings_set_opacity_test_function(&fov_settings, opaque); + fov_settings_set_apply_lighting_function(&fov_settings, apply); +} + +void input(){ + int key = 0; + + key = getch(); + + if(key != ERR){ + if(key == KEY_UP) uK = TRUE; + if(key == KEY_DOWN) dK = TRUE; + if(key == KEY_LEFT) lK = TRUE; + if(key == KEY_RIGHT) rK = TRUE; + if(key == 27) esc = TRUE; + } +} + +gsname_t update(){ + clock_t msgNow, delta; + int i, j, k, d, iX, iY, nX, nY; + + iX = player.x; + iY = player.y; + nX = iX; + nY = iY; + + if(uK) nY = iY - 1 < 0 ? mH - 1 : iY - 1; + + if(dK) nY = (iY + 1) % mH; + + if(lK) nX = iX - 1 < 0 ? mW - 1 : iX - 1; + + if(rK) nX = (iX + 1) % mW; + + if(esc){ + /* Reset the game and go to the main menu. */ + esc = FALSE; + initObjects(); + loadMap("maps/start.map"); + return MENU; + } + + /* Find if the player is standing on an exit, then load the next map. */ + for(i = 0; i < nO; i++){ + if(objs[i].type == EXIT){ + if(objs[i].x == iY && objs[i].y == iX){ + player.x = objs[i].eX; + player.y = objs[i].eY; + if(strcmp(objs[i].target, "END") != 0){ + loadMap(objs[i].target); + return IN_GAME; + }else{ + initObjects(); + loadMap("maps/start.map"); + return GAME_OVER; + } + } + } + } + + /* If the player is standing on a key, pick it up. */ + for(i = 0; i < nO; i++){ + if(objs[i].type == KEY){ + if(objs[i].x == iY && objs[i].y == iX){ + keys[freeKey] = objs[i].id; + objs[i].type = NONE; + for(j = 0; j < 128; j++){ + msg[j] = '\0'; + } + for(j = 0; keyMsg[j] && j < 128; j++){ + msg[j] = keyMsg[j]; + } + newMsg = TRUE; + msgThen = clock(); + freeKey++; + } + } + } + + /* If the player bumps into a person, listen to what they have to say. */ + for(i = 0; i < nO; i++){ + if(objs[i].type == PERSON){ + if(objs[i].x == nY && objs[i].y == nX){ + for(k = 0; k < nO; k++) + if(objs[k].type == DIALOG && objs[k].id == objs[i].dId) break; + + for(j = 0; j < 128; j++){ + msg[j] = '\0'; + } + + for(j = 0; objs[i].name[j] && j < 128; j++) + msg[j] = objs[i].name[j]; + + for(d = 0; saysMsg[d] && j < 128; j++, d++) + msg[j] = saysMsg[d]; + + for(d = 0; objs[k].dialog[d] && j < 128; j++, d++) + msg[j] = objs[k].dialog[d]; + + newMsg = TRUE; + msgThen = clock(); + } + } + } + + /* If the player bumps into a door, open it if the key is available. */ + for(i = 0; i < nO; i++){ + if(objs[i].type == DOOR){ + if(objs[i].x == nY && objs[i].y == nX){ + if(!objs[i].unlocked){ + for(j = 0; j < MAX_KEYS; j++){ + if(keys[j] == objs[i].id){ + objs[i].unlocked = 1; + break; + } + } + + for(j = 0; j < 128; j++){ + msg[j] = '\0'; + } + + if(objs[i].unlocked){ + for(j = 0; openDoor[j] && j < 128; j++){ + msg[j] = openDoor[j]; + } + }else{ + for(j = 0; doorLock[j] && j < 128; j++){ + msg[j] = doorLock[j]; + } + } + + newMsg = TRUE; + msgThen = clock(); + } + } + } + } + + /* Clear the message buffer after a timeout. */ + if(newMsg){ + msgNow = clock(); + delta = msgNow - msgThen; + if((int)delta / (int)CLOCKS_PER_SEC >= 4){ + msgThen = msgNow; + for(j = 0; j < 128; j++){ + msg[j] = '\0'; + } + newMsg = FALSE; + } + } + + /* Move the player. */ + if(uK){ + iY = iY - 1 < 0 ? mH - 1 : iY - 1; + if(canMoveTo(iY, iX)) player.y = iY; + uK = FALSE; + } + + if(dK){ + iY = (iY + 1) % mH; + if(canMoveTo(iY, iX)) player.y = iY; + dK = FALSE; + } + + if(lK){ + iX = iX - 1 < 0 ? mW - 1 : iX - 1; + if(canMoveTo(iY, iX)) player.x = iX; + lK = FALSE; + } + + if(rK){ + iX = (iX + 1) % mW; + if(canMoveTo(iY, iX)) player.x = iX; + rK = FALSE; + } + + return IN_GAME; +} + +void render(int w, int h){ + clock_t now, delta; + int i, j, k, pi, pj, ioff, joff, di, dj; + + now = clock(); + delta = now - then; + if((float)delta / (float)CLOCKS_PER_SEC >= 0.25f){ + then = now; + w_mov = TRUE; + } + + pi = (((w - 2) - 1) / 2) + 1; + pj = (h - 3) / 2 + 1; + + ioff = (w - 28 - 27) / 2; + joff = (h - 3) / 2; + + fov_circle(&fov_settings, &map, NULL, player.x, player.y, (MAX_MAP_SIZE / 2) - 1); + + for(i = 1; i < w - 1; i++){ + for(j = 1; j < h - 3; j++){ + move(j, i); + + di = i - 27 + player.x - ioff; + dj = j - 1 + player.y - joff; + + if( di < 0 || di >= mW || dj < 0 || dj >= mH ){ + printw(" "); + }else{ + if(vis[dj][di] || seen[dj][di]){ + switch(map[dj][di].f){ + case WATER: + attron(COLOR_PAIR(DW_COLOR)); + if(w_mov) + wmap[dj][di] = !wmap[dj][di]; + if(wmap[dj][di]) + printw("\u2248"); + else + printw("~"); + break; + + case VOID: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(MN_COLOR)); + printw(" "); + break; + + case EMPTY_FLOOR: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(MN_COLOR)); + printw(" "); + break; + + case RUG: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(SN_COLOR)); + printw("\u2592"); + break; + + case WINDOW_WALL: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(SW_COLOR)); + printw("\u2591"); + break; + + case CLEAR_WALL: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(SW_COLOR)); + printw("\u2588"); + break; + + case SECRET_WALL: + case SOLID_WALL: + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(MN_COLOR)); + printw("\u2588"); + break; + + case NEON_WALL: + drawNeon(dj, di, NEON_WALL); + break; + + case BAR: + drawNeon(dj, di, BAR); + break; + } + + move(j, i); + for(k = 0; k < nO; k++){ + if(objs[k].x == dj && objs[k].y == di){ + if(!vis[dj][di]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(MN_COLOR)); + + if(objs[k].type == DOOR){ + printw("\u25D9"); + }else{ + if(vis[dj][di]){ + if(objs[k].type == KEY){ + printw("k"); + }else if(objs[k].type == PERSON){ + printw("\u263A"); + } + } + } + } + } + + }else{ + attron(COLOR_PAIR(MN_COLOR)); + printw(" "); + } + } + } + } + w_mov = FALSE; + + move(pj, pi); + attron(COLOR_PAIR(BSC_COLOR)); + printw(/*"\u263A"*/ "@"); + + drawGui(w, h); + + for ( i = 0; i < MAX_MAP_SIZE; ++i ) { + for(j = 0; j < MAX_MAP_SIZE; ++j){ + vis[i][j] = FALSE; + } + } +} + +void drawNeon(int i, int j, floor_t floor){ + int r; + bool n, s, e, w; + + if(floor == NEON_WALL){ + if(!vis[i][j]) attron(COLOR_PAIR(DW_COLOR)); + else{ + r = rand() % 1000; + if(r < 998) + attron(COLOR_PAIR(FR_COLOR)); + else + attron(COLOR_PAIR(MN_COLOR)); + } + }else if(floor == BAR){ + if(!vis[i][j]) attron(COLOR_PAIR(DW_COLOR)); + else attron(COLOR_PAIR(SN_COLOR)); + } + + w = map[i ][j - 1 < 0 ? mH - 1 : j - 1].f == floor; + e = map[i ][(j + 1) % mH ].f == floor; + s = map[i - 1 < 0 ? mW - 1 : i - 1][j ].f == floor; + n = map[(i + 1) % mW ][j ].f == floor; + + if((n && s && e) && (!w)){ + printw("\u2560"); + return; + } + + if((n && s && w) && (!e)){ + printw("\u2563"); + return; + } + + if((n || s) && (!e && !w)){ + printw("\u2551"); + return; + } + + if((e || w) && (!n && !s)){ + printw("\u2550"); + return; + } + + if((e && n) && (!s && !w)){ + printw("\u2554"); + return; + } + + if((w && n) && (!s && !e)){ + printw("\u2557"); + return; + } + + if((e && s) && (!n && !w)){ + printw("\u255A"); + return; + } + + if((w && s) && (!n && !e)){ + printw("\u255D"); + return; + } + + if((s && e && w) && (!n)){ + printw("\u2569"); + return; + } + + if((n && w && e) && (!s)){ + printw("\u2566"); + return; + } + + if(n && s && e && w){ + printw("\u256C"); + return; + } +} + +void drawGui(int w, int h){ + int i; + + attron(COLOR_PAIR(BSC_COLOR)); + + /* Clear the gui space. */ + for(i = 1; i < w - 1; i++){ + move(h - 2, i); + printw(" "); + } + + /* Upper horizontal bar. */ + move(0, 0); + printw("\u2554"); + for(i = 0; i < w - 2; i++){ + printw("\u2550"); + } + printw("\u2557"); + + /* Lower horizontal bars. */ + move(h - 3, 0); + printw("\u255A"); + for(i = 0; i < w - 2; i++){ + printw("\u2550"); + } + printw("\u255D"); + + move(h - 1, 0); + printw("\u255A"); + for(i = 0; i < w - 2; i++){ + printw("\u2550"); + } + printw("\u255D"); + + /* Vertical bars. */ + for(i = 1; i < h - 1; i++){ + move(i, 0); + if(i != h - 3) printw("\u2551"); + else printw("\u2560"); + move(i, w-1); + if(i != h - 3) printw("\u2551"); + else printw("\u2563"); + } + + move(h - 2, 1); + for(i = 0; msg[i] && i < w - 2; i++){ + printw("%c", msg[i]); + } +} + +void setPlayerStart(){ + int i; + + for(i = 0; i < nO; i++){ + if(objs[i].type == PLAYER_START){ + player.y = objs[i].sX; + player.x = objs[i].sY; + break; + } + } +} + +void initObjects(){ + int i, j; + + for(i = 0; i < MAX_OBJECTS; ++i){ + objs[i].type = NONE; + objs[i].x = 0; + objs[i].y = 0; + objs[i].eX = 0; + objs[i].eY = 0; + objs[i].sX = 0; + objs[i].sY = 0; + objs[i].id = 0; + objs[i].dId = 0; + for(j = 0; j < MAX_STR; j++){ + objs[i].name[j] = '\0'; + objs[i].target[j] = '\0'; + objs[i].dialog[j] = '\0'; + } + objs[i].unlocked = 0; + } +} + +void initKeys(){ + int i; + + freeKey = 0; + for(i = 0; i < MAX_KEYS; ++i){ + keys[i] = -1; + } +} + +void apply(void *map, int x, int y, int dx, int dy, void *src){ + if(x < 0 || x >= MAX_MAP_SIZE) return; + if(y < 0 || y >= MAX_MAP_SIZE) return; + + vis[y][x] = TRUE; + seen[y][x] = TRUE; +} + +bool opaque(void *m, int x, int y){ + int k; + if(x < 0 || x >= MAX_MAP_SIZE) return FALSE; + if(y < 0 || y >= MAX_MAP_SIZE) return FALSE; + + if(map[y][x].f == SOLID_WALL || map[y][x].f == SECRET_WALL){ + return TRUE; + }else{ + for(k = 0; k < nO; k++){ + if(objs[k].type == DOOR){ + if(objs[k].x == y && objs[k].y == x){ + return TRUE; + } + } + } + + return FALSE; + } +} + +void loadMap(const char * file){ + int i, j; + + errcode_t rc = readMapData(file, &map, &mW, &mH); + if(rc != NO_ERROR){ + fprintf(stderr, "\t%s.loadMap(): readMapData() returned %d\n", __FILE__, rc); + exit(rc); + } + + game_obj_t * objsP = objs; + rc = readMapObjects(file, &objsP, &nO); + if(rc != NO_ERROR){ + fprintf(stderr, "\t%s.loadMap(): readMapObjects() returned %d\n", __FILE__, rc); + exit(rc); + } + + setPlayerStart(); + initKeys(); + + for ( i = 0; i < MAX_MAP_SIZE; ++i ) { + for(j = 0; j < MAX_MAP_SIZE; ++j){ + vis[i][j] = FALSE; + seen[i][j] = FALSE; + } + } +} + +bool canMoveTo(int iY, int iX){ + int k; + + for(k = 0; k < nO; k++){ + if(objs[k].x == iY && objs[k].y == iX){ + if(objs[k].type == DOOR){ + if(objs[k].unlocked) return TRUE; + else return FALSE; + }else if(objs[k].type == PERSON){ + return FALSE; + } + } + } + + if((map[iY][iX].f > WINDOW_WALL && map[iY][iX].f <= WATER) || map[iY][iX].f == SECRET_WALL) + return TRUE; + else + return FALSE; +} diff --git a/src/intro.c b/src/intro.c new file mode 100644 index 0000000..ce21e76 --- /dev/null +++ b/src/intro.c @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#include +#include +#include +#include + +#include "constants.h" +#include "intro.h" +#include "intro_img.h" + +void inInput(); +gsname_t inUpdate(); +void inRender(int, int); + +static bool anyKey; +static clock_t then = 0, nThen = 0; +static int mRows = 0, mH = 0; + +void initIntroState(gs_t * gs){ + gs->name = INTRO; + gs->input = &inInput; + gs->update = &inUpdate; + gs->render = &inRender; +} + +void inInput(){ + int key = 0; + + key = getch(); + + if(key != ERR && key != KEY_RESIZE){ + anyKey = TRUE; + } +} + +gsname_t inUpdate(){ + clock_t now, delta; + + if(anyKey){ + anyKey = FALSE; + mRows = 0; + then = 0; + nThen = 0; + return MENU; + } + + now = clock(); + delta = now - then; + if((float)delta / (float)CLOCKS_PER_SEC >= 0.15f){ + then = now; + mRows = mRows + 1 <= mH ? mRows + 1 : mH; + } + + if(mRows >= mH){ + now = clock(); + delta = now - nThen; + if((int)delta / (int)CLOCKS_PER_SEC >= 3){ + nThen = 0; + mRows = 0; + then = 0; + return MENU; + } + }else{ + nThen = clock(); + } + + return INTRO; +} + +void inRender(int w, int h){ + int i, j, jOff; + + mH = h < 30 ? h : 30; + jOff = mH < h ? (mH / 4) : 0; + + clear_screen(w, h); + + for(i = 0; i < w && i < 80; i++){ + for(j = 21; j < h + 21 && j < mRows + 21 && j < 80; j++){ + move((j - 21) + jOff, (w / 2) - 40 + i); + attron(COLOR_PAIR(INTRO_IMG[i][j])); + printw("\u2588"); + } + } +} diff --git a/src/main.c b/src/main.c index ea0bcf7..095fbcc 100644 --- a/src/main.c +++ b/src/main.c @@ -6,33 +6,37 @@ #include #include #include -#include #include #include #include -#include -#include -#include +#include +#include #include -#include + #include "constants.h" +#include "game_state.h" void leave(void); void manage_signal(int signal); -int start_ncurses(void); +int start_ncurses(void); void set_colors(void); -void clear_screen(void); void on_resize(int); -static int w = 0, h = 0; +static int w = 0, h = 0; +static bool resize = FALSE; int main() { - bool finished = false; - char *home_dir = getenv("HOME"); - char *data_dir; - char *log_file; - time_t raw_date; - struct tm *current_date; + bool finished = FALSE; + char * home_dir = getenv("HOME"); + FILE * f; /* To avoid a warning. */ + clock_t then, now, delta; + unsigned int fps = 0, pfps = 0; + char * data_dir; + char * log_file; + time_t raw_date; + struct tm * current_date; + gs_t * states; + int c_state; atexit(leave); signal(SIGINT, manage_signal); @@ -45,13 +49,13 @@ int main() { /* If we got the user's home directory, build the data directory path. */ data_dir = (char*)malloc(strlen(home_dir) + 7); strcpy(data_dir, home_dir); - strcat(data_dir, "/.tomb"); + strcat(data_dir, F_SEP ".cyjam"); /* Redirect stderr output to a file. */ log_file = (char*)malloc(strlen(data_dir) + 8); strcpy(log_file, data_dir); - strcat(log_file, "/stderr"); - freopen(log_file, "a", stderr); + strcat(log_file, F_SEP "stderr"); + f = freopen(log_file, "a", stderr); /* Log the current date and time. */ time(&raw_date); @@ -59,38 +63,76 @@ int main() { fprintf(stderr, "%s", asctime(current_date)); /* Try to create the data directory with permissions 775. */ - if(mkdir(data_dir, S_IRWXU | S_IWGRP | S_IRGRP| S_IROTH | S_IXOTH) == 0){ - /* The data directory was sucessfully created. */ - //init_scores(data_dir); - }else{ + if(mkdir(data_dir, S_IRWXU | S_IWGRP | S_IRGRP| S_IROTH | S_IXOTH) != 0){ if(errno != EEXIST){ /* The directory does not exists and could not be created. */ - perror("\tmain.c"); + perror("\t" __FILE__); fprintf(stderr, "\tdata_dir is: %s\n", data_dir); - //init_scores(NULL); - }else{ - /* The directory already exits. */ - //init_scores(data_dir); } } }else{ /* If there is no HOME environment variable, quit. */ - fprintf(stderr, "\tmain.c: Couldn't find the user's home directory\n"); + fprintf(stderr, "\t%s: Couldn't find the user's home directory\n", __FILE__); return EXIT_FAILURE; } /* Start ncurses. */ if(start_ncurses() != 0){ - fprintf(stderr, "\tmain.c: Ncurses could not be initialized.\n"); + fprintf(stderr, "\t%s: Ncurses could not be initialized.\n", __FILE__); return EXIT_FAILURE; } set_colors(); - do{ - clear_screen(); + /* Create the state data structures. */ + c_state = INTRO; + states = (gs_t *)malloc(sizeof(gs_t) * NUM_STATES); + initStateArray(&states); - refresh(); - }while(!finished); + /* Start the game loop. */ + then = clock(); + do{ + /* Handle terminal resize. */ + if(resize){ + endwin(); + refresh(); + + getmaxyx(stdscr, h, w); + + fprintf(stderr, "\tSIGWINCH caught. (W: %d, H: %d)\n", w, h); + + resize = FALSE; + signal(SIGWINCH, on_resize); + } + + states[c_state].input(); + c_state = states[c_state].update(); + + if(c_state == -1) finished = TRUE; + + if(c_state >= INTRO && c_state <= GAME_OVER){ + states[c_state].render(w, h); + } + + if(DEBUG){ + fps++; + + now = clock(); + delta = now - then; + if((int)delta / (int)CLOCKS_PER_SEC == 1){ + then = now; + pfps = fps; + fps = 0; + } + + move(1, 1); + attron(COLOR_PAIR(BSC_COLOR)); + printw("FPS: %u", pfps); + } + + refresh(); + }while(!finished); + + fclose(f); return EXIT_SUCCESS; } @@ -101,8 +143,8 @@ void leave(void){ /* Finish ncurses. */ endwin(); - /* Close the scores database and todays log. */ - // close_scores(); + + /* Mark the end of this run's log. */ for(i = 0; i < 80; i++) fprintf(stderr, "-"); fprintf(stderr, "\n"); @@ -113,54 +155,65 @@ void manage_signal(int signal){ switch(signal){ case SIGINT: fprintf(stderr, "\tSIGINT caught.\n"); + exit(EXIT_SUCCESS); break; + case SIGSEGV: fprintf(stderr, "\tSegmentation fault.\n"); + exit(EXIT_FAILURE); + break; + case SIGTERM: + fprintf(stderr, "\tSIGTERM caught.\n"); exit(EXIT_FAILURE); break; } } void on_resize(int signal){ - struct winsize ws; - - /* Request the new size of the terminal. */ - ioctl(1, TIOCGWINSZ, &ws); - /* Resize ncurse's stdscr. */ - resizeterm(ws.ws_row, ws.ws_col); - /* Get the new size of the window. */ - getmaxyx(stdscr, h, w); - fprintf(stderr, "\tSIGWINCH caught. (W: %d, H: %d)\n", w, h); + resize = TRUE; } int start_ncurses(void){ WINDOW *win_ptr; int ret_code; + + setlocale(LC_ALL, ""); + /* Prepare the terminal. */ win_ptr = initscr(); if(win_ptr == NULL) return -1; + /* Enable special characters. */ ret_code = keypad(stdscr, TRUE); if(ret_code == ERR) return -1; + /* Disable line buffering. */ ret_code = cbreak(); if(ret_code == ERR) return -1; + /* Disable echo. */ ret_code = noecho(); if(ret_code == ERR) return -1; + /* Hide the cursor. */ ret_code = curs_set(FALSE); if(ret_code == ERR) return -1; + + /* Set delay. */ + ret_code = nodelay(stdscr, TRUE); + if(ret_code == ERR) + return -1; + /* Initialize the screen size variables. */ getmaxyx(stdscr, h, w); - return 0; + return EXIT_SUCCESS; } void set_colors(void){ @@ -168,26 +221,29 @@ void set_colors(void){ ret_code = start_color(); if(ret_code == OK){ if(has_colors() == TRUE){ - init_pair(1, COLOR_WHITE, COLOR_RED); /* The color for the top and bottom bars. */ - init_pair(2, COLOR_WHITE, COLOR_BLACK); /* Basic text color. */ - init_pair(3, COLOR_YELLOW, COLOR_BLACK); /* Highlighted text color. */ - init_pair(4, COLOR_BLUE, COLOR_BLACK); /* Lights off color. */ - init_pair(5, COLOR_RED, COLOR_BLACK); /* Dim light color. */ - init_pair(6, COLOR_YELLOW, COLOR_BLACK); /* Lights on color. */ - init_pair(7, COLOR_YELLOW, COLOR_YELLOW); /* Main GUI bar color. */ - init_pair(8, COLOR_WHITE, COLOR_WHITE); /* Empty GUI bar color. */ - } - } -} -void clear_screen(void){ - int i, j; - move(0,0); - attron(COLOR_PAIR(BSC_COLOR)); - for(i = 0; i < w; i++){ - for(j = 0; j < h; j++){ - move(j, i); - printw(" "); + init_pair(BAR_COLOR, COLOR_WHITE, COLOR_RED); /* The color for the top and bottom bars. */ + init_pair(BSC_COLOR, COLOR_WHITE, COLOR_BLACK); /* Basic text color. */ + init_pair(HLT_COLOR, COLOR_YELLOW, COLOR_BLACK); /* Highlighted text color. */ + init_pair(OFF_COLOR, COLOR_BLUE, COLOR_BLACK); /* Lights off color. */ + init_pair(DIM_COLOR, COLOR_RED, COLOR_BLACK); /* Dim light color. */ + init_pair(LIT_COLOR, COLOR_YELLOW, COLOR_BLACK); /* Lights on color. */ + init_pair(GUI_COLOR, COLOR_YELLOW, COLOR_YELLOW); /* Main GUI bar color. */ + init_pair(EMP_COLOR, COLOR_WHITE, COLOR_WHITE); /* Empty GUI bar color. */ + + init_pair(DW_COLOR, COLOR_BLUE, COLOR_BLACK); + init_pair(SW_COLOR, COLOR_CYAN, COLOR_BLACK); + init_pair(SN_COLOR, COLOR_YELLOW, COLOR_BLACK); + init_pair(GR_COLOR, COLOR_GREEN, COLOR_BLACK); + init_pair(FR_COLOR, COLOR_RED, COLOR_BLACK); + init_pair(HL_COLOR, COLOR_WHITE, COLOR_BLACK); + init_pair(MN_COLOR, COLOR_WHITE, COLOR_BLACK); + + init_pair(VOID_COLOR, COLOR_BLACK, COLOR_BLACK); /* Pure black. */ + init_pair(IND_COLOR, COLOR_MAGENTA, COLOR_BLACK); /* Intro shadow. */ } + }else{ + fprintf(stderr, "\t%s: Colors not supported.\n", __FILE__); + exit(EXIT_FAILURE); } } diff --git a/src/main_menu.c b/src/main_menu.c new file mode 100644 index 0000000..7f3b5e5 --- /dev/null +++ b/src/main_menu.c @@ -0,0 +1,146 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#include +#include +#include + +#include "constants.h" +#include "main_menu.h" + +static const char * title = "NOT SO ROGUE-LIKE"; +static const char * subtitle = "A game for the Cyberpunk Jam 2014"; +static const char * opt1 = "New game"; +static const char * opt2 = "Replay intro"; +static const char * opt3 = "Quit"; +static const char * creds = "Designed and programmed by Miky"; +static const char * info = "Press enter to select an option. Scroll with the arrow keys."; +static const char * info2 = "Press escape while in game to return to the main menu."; + +static int selOpt = 0; +static bool uK, dK, esc, enter; + +void mmInput(); +gsname_t mmUpdate(); +void mmRender(int, int); + +void initMMState(gs_t * gs){ + gs->name = MENU; + gs->input = &mmInput; + gs->update = &mmUpdate; + gs->render = &mmRender; +} + +void mmInput(){ + int key = 0; + + key = getch(); + + if(key != ERR){ + if(key == KEY_UP) uK = TRUE; + if(key == KEY_DOWN) dK = TRUE; + if(key == 27) esc = TRUE; + if(key == KEY_ENTER || key == '\n') enter = TRUE; + } +} + +gsname_t mmUpdate(){ + if(uK){ + selOpt = selOpt - 1 < 0 ? 2 : selOpt - 1; + uK = FALSE; + } + + if(dK){ + selOpt = (selOpt + 1) % 3; + dK = FALSE; + } + + if(esc) return -1; + + if(enter){ + enter = FALSE; + if(selOpt == 0) return IN_GAME; + else if(selOpt == 1) return INTRO; + else return -1; + } + + return MENU; +} + +void mmRender(int w, int h){ + int sW; + + clear_screen(w, h); + + /* Print the title. */ + sW = strlen(title); + sW /= 2; + + attron(A_BOLD); + + move(1, (w / 2) - sW); + attron(COLOR_PAIR(SN_COLOR)); + printw(title); + + /* Print the subtitle. */ + sW = strlen(subtitle); + sW /= 2; + + move(2, (w / 2) - sW); + attron(COLOR_PAIR(SW_COLOR)); + printw(subtitle); + + attroff(A_BOLD); + + /* Print the menu options. */ + sW = strlen(opt1); + sW /= 2; + + move((h / 2) - 2, (w / 2) - sW); + if(selOpt == 0) attron(COLOR_PAIR(GR_COLOR)); + else attron(COLOR_PAIR(DW_COLOR)); + printw(opt1); + + sW = strlen(opt2); + sW /= 2; + + move((h / 2) - 1, (w / 2) - sW); + if(selOpt == 1) attron(COLOR_PAIR(GR_COLOR)); + else attron(COLOR_PAIR(DW_COLOR)); + printw(opt2); + + sW = strlen(opt3); + sW /= 2; + + move((h / 2), (w / 2) - sW); + if(selOpt == 2) attron(COLOR_PAIR(GR_COLOR)); + else attron(COLOR_PAIR(DW_COLOR)); + printw(opt3); + + /* Print help. */ + sW = strlen(info); + sW /= 2; + + move(h - 5, (w / 2) - sW); + attron(COLOR_PAIR(MN_COLOR)); + printw(info); + + sW = strlen(info2); + sW /= 2; + + move(h - 4, (w / 2) - sW); + attron(COLOR_PAIR(MN_COLOR)); + printw(info2); + + /* Print credits. */ + sW = strlen(creds); + sW /= 2; + + attron(A_BOLD); + move(h - 2, (w / 2) - sW); + attron(COLOR_PAIR(SW_COLOR)); + printw(creds); + attroff(A_BOLD); +} diff --git a/src/map.c b/src/map.c new file mode 100644 index 0000000..904242d --- /dev/null +++ b/src/map.c @@ -0,0 +1,368 @@ +/** + * Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved. + * See the file LICENSE for more details. + */ + +#define _GNU_SOURCE +#include +#include +#include + +#include "map.h" + +errcode_t readMapData(const char * file, map_cell_t *** map, int * w, int * h){ + size_t n = 2048; + char *buffer; + FILE * f; + + f = fopen(file, "r"); + if(f == NULL) return FILE_NOT_FOUND; + + buffer = (char*)calloc(n + 1, sizeof(char)); + if(buffer == NULL) return OUT_OF_MEMORY; + + while(getline(&buffer, &n, f) != -1){ + if(strcmp(buffer, "[MAP]\n") == 0){ + int rc, i, j; + char *end; + + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + *w = strtol(buffer, &end, 10); + *h = strtol(end, NULL, 10); + + if((*w <= 0 || *w > MAX_MAP_SIZE) || (*h <= 0 || *h > MAX_MAP_SIZE)){ + *w = -1; + *h = -1; + free(buffer); + return MAP_TOO_LARGE; + } + + for(i = 0; i < *w; i++){ + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + /* Skip commentaries. */ + if(buffer[0] == '%'){ + i--; + continue; + } + + for(j = 0; buffer[j] && j < *h; j++){ + if(buffer[j] >= '0' && buffer[j] <= '9'){ + switch(buffer[j]){ + case '0': (*map)[i][j].f = VOID; break; + case '1': (*map)[i][j].f = SOLID_WALL; break; + case '2': (*map)[i][j].f = SECRET_WALL; break; + case '3': (*map)[i][j].f = CLEAR_WALL; break; + case '4': (*map)[i][j].f = NEON_WALL; break; + case '5': (*map)[i][j].f = WINDOW_WALL; break; + case '6': (*map)[i][j].f = EMPTY_FLOOR; break; + case '7': (*map)[i][j].f = RUG; break; + case '8': (*map)[i][j].f = WATER; break; + case '9': (*map)[i][j].f = BAR; break; + default: + fprintf(stderr, "\t%s.readMapData() : Invalid character %c in map file %s\n", __FILE__, buffer[j], file); + (*map)[i][j].f = VOID; + break; + } + }else{ + fprintf(stderr, "\t%s.readMapData() : Invalid character %c in map file %s\n", __FILE__, buffer[j], file); + (*map)[i][j].f = VOID; + } + } + } + /* Skip the rest of the file. */ + break; + } + } + + fclose(f); + free(buffer); + + return NO_ERROR; +} + +errcode_t readMapObjects(const char * file, game_obj_t ** objArr, int *nObj){ + size_t n = 2048; + int rc; + char *buffer; + FILE * f; + + *nObj = 0; + + f = fopen(file, "r"); + if(f == NULL) return FILE_NOT_FOUND; + + buffer = (char*)calloc(n + 1, sizeof(char)); + if(buffer == NULL) return OUT_OF_MEMORY; + + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + while(*nObj < MAX_OBJECTS && rc != -1){ + if(buffer[0] == '%') continue; + + if(strcmp(buffer, "[MAP]\n") == 0){ + int i, w; + + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + + w = strtol(buffer, NULL, 10); + + for(i = 0; i <= w; ++i){ + rc = getline(&buffer, &n, f); + if(rc == -1){ + free(buffer); + return PREMATURE_EOF; + } + } + + }else if(strcmp(buffer, "[PLAYER]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'p'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "player =", i) == 0){ + int sX, sY; + char *end; + + sX = strtol(&buffer[i + 1], &end, 10); + sY = strtol(end, NULL, 10); + + (*objArr)[*nObj].type = PLAYER_START; + (*objArr)[*nObj].sX = sX; + (*objArr)[*nObj].sY = sY; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in PLAYER key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[EXITS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'e'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "exit =", i) == 0){ + int x, y, eX, eY; + char *end, *end2, *end3; + + x = strtol(&buffer[i + 1], &end, 10); + y = strtol(end, &end2, 10); + end2++; + + (*objArr)[*nObj].type = EXIT; + (*objArr)[*nObj].x = x; + (*objArr)[*nObj].y = y; + + for(i = 0; end2[i] && end2[i] != ' '; ++i); + + strncpy((*objArr)[*nObj].target, end2, i); + (*objArr)[*nObj].target[i] = '\0'; + + eX = strtol(&end2[i], &end3, 10); + eY = strtol(end3, NULL, 10); + + (*objArr)[*nObj].eX = eX; + (*objArr)[*nObj].eY = eY; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in EXITS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[DOORS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'd'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "door =", i) == 0){ + int dX, dY, dId, un; + char *end, *end2, *end3; + + dX = strtol(&buffer[i + 1], &end, 10); + dY = strtol(end, &end2, 10); + dId = strtol(end2, &end3, 10); + un = strtol(end3, NULL, 10); + + (*objArr)[*nObj].type = DOOR; + (*objArr)[*nObj].x = dX; + (*objArr)[*nObj].y = dY; + (*objArr)[*nObj].id = dId; + (*objArr)[*nObj].unlocked = un; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in DOORS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[KEYS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'k'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "key =", i) == 0){ + int kX, kY, kId; + char *end, *end2; + + kX = strtol(&buffer[i + 1], &end, 10); + kY = strtol(end, &end2, 10); + kId = strtol(end2, NULL, 10); + + (*objArr)[*nObj].type = KEY; + (*objArr)[*nObj].x = kX; + (*objArr)[*nObj].y = kY; + (*objArr)[*nObj].id = kId; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in KEYS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[PERSONS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'p'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "person =", i) == 0){ + int pX, pY, pDId; + char *end, *end2; + + pX = strtol(&buffer[i + 1], &end, 10); + pY = strtol(end, &end2, 10); + end2++; + + (*objArr)[*nObj].type = PERSON; + (*objArr)[*nObj].x = pX; + (*objArr)[*nObj].y = pY; + + for(i = 0; end2[i] && end2[i] != ' '; ++i); + + strncpy((*objArr)[*nObj].name, end2, i); + (*objArr)[*nObj].name[i] = '\0'; + + pDId = strtol(&end2[i], NULL, 10); + (*objArr)[*nObj].dId = pDId; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in PERSONS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else if(strcmp(buffer, "[DIALOGS]\n") == 0){ + do{ + rc = getline(&buffer, &n, f); + if(rc == -1) break; + + if(buffer[0] == '%') continue; + else if(buffer[0] == 'd'){ + int i; + + for(i = 0; buffer[i] && buffer[i] != '='; ++i); + + if(strncmp(buffer, "dialog =", i) == 0){ + int dId; + char *end; + + dId = strtol(&buffer[i + 1], &end, 10); + end++; + + (*objArr)[*nObj].type = DIALOG; + (*objArr)[*nObj].id = dId; + + strcpy((*objArr)[*nObj].dialog, end); + for(i = 0; (*objArr)[*nObj].dialog[i] && (*objArr)[*nObj].dialog[i] != '\n'; ++i); + (*objArr)[*nObj].dialog[i] = '\0'; + + *nObj += 1; + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Skipped invalid data in DIALOGS key in map file %s.\n", __FILE__, file); + fprintf(stderr, "\t%s.readMapObjects(): The invalid line is %s.\n", __FILE__, buffer); + continue; + } + } + }while(buffer[0] != '['); + + }else{ + fprintf(stderr, "\t%s.readMapObjects(): Found invalid key in map file %s. Key is %s\n", __FILE__, file, buffer); + free(buffer); + return INVALID_KEY; + } + } + + fclose(f); + free(buffer); + + return NO_ERROR; +}