Merge branch 'develop'

This commit is contained in:
2014-03-09 16:01:20 -04:30
25 changed files with 2602 additions and 149 deletions

3
.gitignore vendored
View File

@@ -15,5 +15,6 @@ obj/
*.app
bin/
# Emacs backups
# Assorted files
*~
Cyberpunk-Jam

View File

@@ -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)

410
editor/editor.py Executable file
View File

@@ -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()

View File

@@ -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

13
include/game_over.h Normal file
View File

@@ -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

23
include/game_state.h Normal file
View File

@@ -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

13
include/in_game.h Normal file
View File

@@ -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

13
include/intro.h Normal file
View File

@@ -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

92
include/intro_img.h Normal file
View File

@@ -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

View File

@@ -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

13
include/main_menu.h Normal file
View File

@@ -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

63
include/map.h Normal file
View File

@@ -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

Binary file not shown.

Binary file not shown.

80
maps/aquarium.map Normal file
View File

@@ -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?

96
maps/maze.map Normal file
View File

@@ -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.

173
maps/start.map Normal file
View File

@@ -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?

61
maps/test.map Normal file
View File

@@ -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.

99
src/game_over.c Normal file
View File

@@ -0,0 +1,99 @@
/**
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
* See the file LICENSE for more details.
*/
#include <stdio.h>
#include <string.h>
#include <ncursesw/ncurses.h>
#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);
}

32
src/game_state.c Normal file
View File

@@ -0,0 +1,32 @@
/**
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
* See the file LICENSE for more details.
*/
#include <ncursesw/ncurses.h>
#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(" ");
}
}
}

649
src/in_game.c Normal file
View File

@@ -0,0 +1,649 @@
/**
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
* See the file LICENSE for more details.
*/
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ncursesw/ncurses.h>
#include <fov.h>
#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;
}

89
src/intro.c Normal file
View File

@@ -0,0 +1,89 @@
/**
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
* See the file LICENSE for more details.
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ncursesw/ncurses.h>
#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");
}
}
}

View File

@@ -6,33 +6,37 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <ncurses.h>
#include <termios.h>
#include <sys/types.h>
#include <ncursesw/ncurses.h>
#include <locale.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#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);
}
}

146
src/main_menu.c Normal file
View File

@@ -0,0 +1,146 @@
/**
* Copyright (c) 2014, Miguel Angel Astor Romero. All rights reserved.
* See the file LICENSE for more details.
*/
#include <stdio.h>
#include <string.h>
#include <ncursesw/ncurses.h>
#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);
}

368
src/map.c Normal file
View File

@@ -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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}