aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cub3d.h7
-rw-r--r--event.c8
-rw-r--r--minimalist.cub8
-rw-r--r--render.c60
-rw-r--r--render_state.c78
-rw-r--r--state.c32
-rw-r--r--textures/stone.xpm92
-rw-r--r--textures/wood.xpm79
8 files changed, 267 insertions, 97 deletions
diff --git a/cub3d.h b/cub3d.h
index 00a3374..2c5d0c3 100644
--- a/cub3d.h
+++ b/cub3d.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/15 06:40:37 by cacharle #+# #+# */
-/* Updated: 2020/01/30 14:17:19 by cacharle ### ########.fr */
+/* Updated: 2020/01/30 15:05:20 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include <stdio.h>
@@ -126,6 +126,7 @@ typedef struct s_render_state
t_vector map_pos;
t_vector delta;
t_side side;
+ double perp_dist;
int line_height;
t_vector probe;
t_vector map_step;
@@ -205,6 +206,7 @@ int render_update(void *param);
void render_update_window(t_state *state);
void render_column(t_state *state, int x);
void render_window_column(t_state *state, t_render_state *rstate);
+void render_texture(t_state *state, t_render_state *rstate);
/*
** vector.c
@@ -249,10 +251,11 @@ void helper_init_dir_plane(t_state *state, int y, int x);
void rstate_ray(t_state *state, t_render_state *rstate);
void rstate_delta(t_render_state *rstate);
void rstate_init_probe(t_state *state, t_render_state *rstate);
-double rstate_perp_dist(t_state *state, t_render_state *rstate);
+void rstate_perp_dist(t_state *state, t_render_state *rstate);
void rstate_line_height(t_state *state, t_render_state *rstate);
void rstate_next_probe(t_render_state *rstate);
t_image *get_tex(t_state *state, t_render_state *rstate);
+int get_tex_x(t_state *state, t_render_state *rstate, t_image *texture);
/*
** capture.c
diff --git a/event.c b/event.c
index 0c71267..9dcaa75 100644
--- a/event.c
+++ b/event.c
@@ -6,13 +6,13 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/15 06:39:37 by cacharle #+# #+# */
-/* Updated: 2020/01/30 14:18:13 by cacharle ### ########.fr */
+/* Updated: 2020/01/30 15:20:18 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
-#define ROTATE_STEP (M_PI / 20.0)
+#define ROTATE_STEP (M_PI / 40.0)
#define MOVE_SPEED 0.25
int event_keydown(int key, t_state *state)
@@ -21,10 +21,10 @@ int event_keydown(int key, t_state *state)
state->running = FALSE;
else if (key == MLXK_A)
state->pos = vector_add(state->pos,
- vector_scale(vector_rotate(state->dir, M_PI_2), MOVE_SPEED));
+ vector_scale(vector_rotate(state->dir, -M_PI_2), MOVE_SPEED));
else if (key == MLXK_D)
state->pos = vector_add(state->pos,
- vector_scale(vector_rotate(state->dir, -M_PI_2), MOVE_SPEED));
+ vector_scale(vector_rotate(state->dir, M_PI_2), MOVE_SPEED));
else if (key == MLXK_W)
state->pos = vector_add(state->pos,
vector_scale(state->dir, MOVE_SPEED));
diff --git a/minimalist.cub b/minimalist.cub
index f2d39e7..9974bb2 100644
--- a/minimalist.cub
+++ b/minimalist.cub
@@ -1,8 +1,8 @@
-R 400 400
+R 700 500
NO ./textures/brick.xpm
-SO ./textures/brick.xpm
-WE ./textures/brick.xpm
-EA ./textures/brick.xpm
+SO ./textures/wood.xpm
+WE ./textures/wood.xpm
+EA ./textures/stone.xpm
S ./textures/brick.xpm
F 0,225,0
diff --git a/render.c b/render.c
index 8a70f70..88b0cae 100644
--- a/render.c
+++ b/render.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/11 13:37:17 by cacharle #+# #+# */
-/* Updated: 2020/01/30 14:16:36 by cacharle ### ########.fr */
+/* Updated: 2020/01/30 15:17:49 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -54,6 +54,7 @@ void render_column(t_state *state, int x)
if (state->map[(int)rstate.map_pos.y][(int)rstate.map_pos.x] == CELL_WALL)
break ;
}
+ rstate_perp_dist(state, &rstate);
rstate_line_height(state, &rstate);
rstate.draw_start = state->window.height / 2 - rstate.line_height / 2;
rstate.draw_end = state->window.height / 2 + rstate.line_height / 2;
@@ -75,41 +76,32 @@ void render_window_column(t_state *state, t_render_state *rstate)
((t_color*)state->window.data)[i++ * state->window.width + rstate->x] = state->ceilling_color;
while (i < rstate->draw_end)
((t_color*)state->window.data)[i++ * state->window.width + rstate->x] = white;
+ render_texture(state, rstate);
+ i = rstate->draw_end;
while (i < state->window.height)
((t_color*)state->window.data)[i++ * state->window.width + rstate->x] = state->floor_color;
- /* while (++i < rstate->draw_start) */
- /* ((t_color*)state->window.data)[i * state->window.width + rstate->x] = */
- /* state->ceilling_color; */
- /* i = rstate->draw_end; */
- /* i = render_texture(state, rstate); */
- /* while (++i < state->window_height) */
- /* ((t_color*)state->window.data)[i * state->window.width + rstate->x] = */
- /* state->floor_color; */
}
-/* int render_texture(t_state *state, t_render_state *rstate)) */
-/* { */
- /* int i; */
- /* int tex_x; */
- /* double step; */
- /* double tex_pos; */
- /* int tex_y; */
- /* t_image *texture; */
- /* */
- /* texture = get_tex(state, side); */
- /* tex_x = get_tex_x(); */
- /* */
- /* step = 1.0 * texture->height / line_height; */
- /* texPos = (start - state->window.height / 2 + line_height / 2) * step; */
- /* */
- /* i = start - 1; */
- /* while (++i < end) */
- /* { */
- /* tex_y = (int)tex_pos & (texture->height - 1); */
- /* tex_pos += step; */
- /* ((t_color*)state->window.data)[i * state->window.width + x] = */
- /* texture[texHeight * texY + texX]; */
- /* } */
- /* return (end); */
-/* } */
+void render_texture(t_state *state, t_render_state *rstate)
+{
+ int i;
+ double step;
+ double tex_pos;
+ int tex_y;
+ int tex_x;
+ t_image *texture;
+
+ texture = get_tex(state, rstate);
+ tex_x = get_tex_x(state, rstate, texture);
+ step = 1.0 * texture->height / rstate->line_height;
+ tex_pos = (rstate->draw_start - state->window.height / 2 + rstate->line_height / 2) * step;
+ i = rstate->draw_start - 1;
+ while (++i < rstate->draw_end)
+ {
+ tex_y = (int)tex_pos & (texture->height - 1);
+ tex_pos += step;
+ ((t_color*)state->window.data)[i * state->window.width + rstate->x] =
+ ((t_color*)texture->data)[texture->height * tex_y + tex_x];
+ }
+}
diff --git a/render_state.c b/render_state.c
index 573d1f1..5fcc6ed 100644
--- a/render_state.c
+++ b/render_state.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/15 14:40:14 by cacharle #+# #+# */
-/* Updated: 2020/01/30 13:36:35 by cacharle ### ########.fr */
+/* Updated: 2020/01/30 15:14:39 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -142,13 +142,12 @@ void rstate_next_probe(t_render_state *rstate)
** if we had hit it form west/east, we would use the x component instead.
*/
-double rstate_perp_dist(t_state *state, t_render_state *rstate)
+void rstate_perp_dist(t_state *state, t_render_state *rstate)
{
if (rstate->side == SIDE_WE)
- return (rstate->map_pos.x - state->pos.x + (1 - rstate->map_step.x) / 2) / rstate->ray.x;
+ rstate->perp_dist = (rstate->map_pos.x - state->pos.x + (1 - rstate->map_step.x) / 2) / rstate->ray.x;
else
- return (rstate->map_pos.y - state->pos.y + (1 - rstate->map_step.y) / 2) / rstate->ray.y;
- return (1.0);
+ rstate->perp_dist = (rstate->map_pos.y - state->pos.y + (1 - rstate->map_step.y) / 2) / rstate->ray.y;
}
/*
@@ -158,27 +157,27 @@ double rstate_perp_dist(t_state *state, t_render_state *rstate)
void rstate_line_height(t_state *state, t_render_state *rstate)
{
- rstate->line_height = (int)((double)state->window.height / rstate_perp_dist(state, rstate));
+ rstate->line_height = (int)((double)state->window.height / rstate->perp_dist);
}
-/* t_image *get_tex(t_state *state, t_render_state *rstate) */
-/* { */
-/* if (rstate->side == SIDE_NS) */
-/* { */
-/* if (rstate->probe.y < state->pos.y) */
-/* return (state->textures + TEX_NORTH); */
-/* else */
-/* return (state->textures + TEX_SOUTH); */
-/* } */
-/* else if (rstate->side == SIDE_WE) */
-/* { */
-/* if (rstate->probe.x < state->pos.x) */
-/* return (state->textures + TEX_WEST); */
-/* else */
-/* return (state->textures + TEX_EAST); */
-/* } */
-/* return (NULL); */
-/* } */
+t_image *get_tex(t_state *state, t_render_state *rstate)
+{
+ if (rstate->side == SIDE_NS)
+ {
+ if (rstate->probe.y < state->pos.y)
+ return (state->textures + TEX_NORTH);
+ else
+ return (state->textures + TEX_SOUTH);
+ }
+ else if (rstate->side == SIDE_WE)
+ {
+ if (rstate->probe.x < state->pos.x)
+ return (state->textures + TEX_WEST);
+ else
+ return (state->textures + TEX_EAST);
+ }
+ return (NULL);
+}
/*
** Since we're drawing each column, all the texels we want to draw on the window
@@ -186,16 +185,21 @@ void rstate_line_height(t_state *state, t_render_state *rstate)
** First we find the x-coord relative to the wall we hit
*/
-/* int get_tex_x() */
-/* { */
-/* //calculate value of wall_x */
-/* double wall_x; //where exactly the wall was hit */
-/* if (side == 0) wall_x = state->pos.y + perp_dist * ray.y; */
-/* else wall_x = state->pos.x + perp_dist * ray.x; */
-/* wall_x -= floor(wall_x); */
-/* //x coordinate on the texture */
-/* int tex_x = (int)(wall_x * (double)texWidth); */
-/* if(side == 0 && ray.x > 0) tex_x = texture_width - tex_x - 1; */
-/* if(side == 1 && ray.y < 0) tex_x = texture_width - tex_x - 1; */
-/* return (tex_x); */
-/* } */
+int get_tex_x(t_state *state, t_render_state *rstate, t_image *texture)
+{
+ int tex_x;
+ double wall_x;
+
+ if (rstate->side == SIDE_WE)
+ wall_x = state->pos.y + rstate->perp_dist * rstate->ray.y;
+ else
+ wall_x = state->pos.x + rstate->perp_dist * rstate->ray.x;
+ wall_x -= floor(wall_x);
+
+ tex_x = (int)(wall_x * (double)texture->width);
+ if (rstate->side == 0 && rstate->ray.x > 0)
+ tex_x = texture->width - tex_x - 1;
+ if (rstate->side == 1 && rstate->ray.y < 0)
+ tex_x = texture->width - tex_x - 1;
+ return (tex_x);
+}
diff --git a/state.c b/state.c
index 5a10888..11e1c65 100644
--- a/state.c
+++ b/state.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/11/19 16:39:57 by cacharle #+# #+# */
-/* Updated: 2020/01/17 14:05:08 by cacharle ### ########.fr */
+/* Updated: 2020/01/30 15:13:42 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -27,14 +27,14 @@ t_state *state_new(t_state *state)
state->window.width, state->window.height, WINDOW_TITLE)) == NULL)
return (state_destroy(state));
printf("init mlx and mlx window\n");
- /* i = -1; */
- /* while (++i < TEXTURES_NUM) */
- /* { */
- /* load_texture(state->mlx_ptr, &state->textures[i], */
- /* state->textures_path[i]); */
- /* if (state->textures[i].id == NULL) */
- /* return (error_put_return_state_destroy("load texture", state)); */
- /* } */
+ i = -1;
+ while (++i < TEXTURES_NUM)
+ {
+ load_texture(state->mlx_ptr, &state->textures[i],
+ state->textures_path[i]);
+ if (state->textures[i].id == NULL)
+ return (error_put_return_state_destroy("load texture", state));
+ }
if ((state->window.id = mlx_new_image(state->mlx_ptr,
state->window.width, state->window.height)) == NULL)
return (state_destroy(state));
@@ -95,13 +95,13 @@ void *state_destroy(t_state *state)
if (state == NULL)
return (NULL);
- /* i = -1; */
- /* while (++i < TEXTURES_NUM) */
- /* { */
- /* free(state->textures_path[i]); */
- /* if (state->mlx_ptr != NULL && state->textures[i].id != NULL) */
- /* mlx_destroy_image(state->mlx_ptr, state->textures[i].id); */
- /* } */
+ i = -1;
+ while (++i < TEXTURES_NUM)
+ {
+ free(state->textures_path[i]);
+ if (state->mlx_ptr != NULL && state->textures[i].id != NULL)
+ mlx_destroy_image(state->mlx_ptr, state->textures[i].id);
+ }
printf("free window image\n");
if (state->mlx_ptr != NULL && state->window.id != NULL)
mlx_destroy_image(state->mlx_ptr, state->window.id);
diff --git a/textures/stone.xpm b/textures/stone.xpm
new file mode 100644
index 0000000..ff575f8
--- /dev/null
+++ b/textures/stone.xpm
@@ -0,0 +1,92 @@
+/* XPM */
+static char *greystone[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 22 1",
+" c #1F1F1F",
+". c #3B3B3B",
+"X c #3F3F3F",
+"o c #474747",
+"O c #4B4B4B",
+"+ c #4F4F4F",
+"@ c #535353",
+"# c #575757",
+"$ c #5F5F5F",
+"% c #676767",
+"& c #6B6B6B",
+"* c #737373",
+"= c #7B7B7B",
+"- c #838383",
+"; c #8F8F8F",
+": c #9B9B9B",
+"> c #ABABAB",
+", c #B7B7B7",
+"< c #C7C7C7",
+"1 c #D3D3D3",
+"2 c #DFDFDF",
+"3 c #EFEFEF",
+/* pixels */
+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .",
+"#@#+#+#+#+O1222121222121222 .->,1<11<1,<>-# oooooooooo@+#+#+#+#+",
+"@#@@#@@@#@o21<1,111<11,11<; .-<,;>-;;;;->+. .&;;-;;;=&%oooOoooOo",
+";;-;;;-; @O2<<,1,<<,<<,,1;$ .>1>;>;>->;>-#. .;122212,,>;-;;;-;;;",
+"1111,>;- #o21>>:>;>>>>:>>=@ .;,;;->>>>-;*+. .-22,<,1222121<111<1",
+">>>>:>=* @o3,:>>>>:>;>->>&@ .o>;>>-;:;>&#@. .;1,>;>;>>:;;>;>->;:",
+",:::>;=& Oo31>->;>;:::;;>;+ .o=;->;>>->*... .-2,;>-:-;;>-;:;>:;:",
+",>-,-:$# .o3<;:;>>:;=;;>;$# .oo;>>:;;;>&... .;2>>-:=>:=;>->>;=>:",
+":>>;:*oO O<,>:>->;:-:;;>&@ O@o=........ ..*22;>--:*:;>;;=>>*;",
+";;-;*@oo .o>3>:>;;;;;;->-#= .o....... . ooo<<;;;;:::-;>;>>->;",
+"*&**+O.. O;1;>;;=;;>->;>&#. .o. . . O@o<>;>->;-;*&%$$%$%$",
+"@#ooo .X*2>-:===>:;-=;&%. .ooOO*=;>:>>:*.+O,;&*%$%#@@@oOoOooO",
+" . . .@o2<;;;::-;>=;>;+. .X*>>123111:&@ @o;&%$@Ooo..... . . ",
+" . . . ..+o>1;>-=;>;-:;-*+. .>,21,->;>-*. ........... ",
+"..........OO;<>->:-=;=;>;+#. .X>2,>;;;-;;+. . . . . XX.......",
+"@O...... .@o*<->:;>:>->->+*o O>3>;->;>->@. .o#@## oOooOoooooooX",
+"::;:;:;:: #o<,:;-::*;;;;&#@ O>3-;>>->;;+. .&>21#o@=::;:::;::::",
+"1<11<1,>*X #o;,;>;=;;->;&;&O O><>>;->;>-#. .>1<> o=<12221222121",
+">:;>;>>&*. @o*:>->>->*;&@*@O O><>;&**&@#@. .1<>- O:11,,>,,,>,,,",
+">;:;>-;&*. o@o:;**&*@@*+*@o .:;*;&....... $2>;; o:2>>:>;>;:-::",
+">;;>->>&#. o@o%@#@#ooo. ;*... $2>>- O:1>;:-:;:*-;-",
+">;>;>-;*+. o@o . . ..+. . . ;2>>; o;<->:>;>;:-::",
+";>*=;;>&#. .+#O. +OO+OOo;;;>>;;;=# X%,2>-= O-<>-:;:-:==;;",
+";--=;>-%o. .-2221<>>;$.O%=>>,<<2221222<:% .=2<:>* o-,>:;>->;==;;",
+";;>>-;;$O. .1<>;::>;:.+O=1322<,,<,<,<,<&# .;2>:;& O&<->;;:;->;>;",
+":>-;>-*@.. .2:;:>>;:> @O:2<;>->:->:>:;-%o .;3>-># Oo;*$#@@%%&=;-",
+"%$%$%@o... .1>>>->;>$ Oo:3>:>;=>>;-;>->#o .-3>>;# @ ..ooooOoo@#@",
+"@Oo... .2->;>>;=$ Oo:3->;:>-;=;>;;;+O .;3->;+ #. ..o",
+" . OOo2>:->;>=$ .o:3;;>-;=;=;-;>;+O .-3>>-# #....... . ",
+"o%%&;:;-;;o 2>*:;>--%. o;3>;-;=;=;>=;->@o .;3;>>+ #oXo+@+#@@#...",
+"%;,21211<>* 2>>-=;>-%. o;2,:;>;>*=;=;>-#. .;1;;>+ O>21,;$#ooOoo@",
+"%>1<<,>>:>X 3;:>=;>:&o O=1<>-;*;==>;>--+. .;2>;;@ O2-;,221222;.@",
+"%2,>>->;>-* 3:>;>>->&O .+<2>>:;>->==;>&#. X;1;>;+ O2;->>-;>;--.+",
+"%1,:->;>->* 3:-:>;>-%@ #>3>>:;;=;==>-*o. O;1>>-# o2>>-;>>->;$.o",
+"%2>;>;>>=>+ 2>>>;;;>%+ .+;3,>;>-;:->;>$o .X;1:;>+ O<>;>>-;>;>$.o",
+"%2>>;;::>-# 2,=:=>>:$# O&1,>;=:-;:;;;$. O;1;>+# O<>:>;>-;>:#.o",
+"%1,;>>;>->@ <2-:>;;;$# O@,2>->;>;>-;%@. .o=>=+...X>>;>:;>;->#..",
+"%2,>:;>;>;+ ,2=>-;;>&# .+;,>;=%$@oO.... .X#....Xo *+o@#@#@@#@..",
+"%2>;>>->=>@ :1:=>>-;&# .@o;;$#o. .o+oo+@#@# .",
+"%1,;-:>;>-# =2>:>-;>%+ +o. . . . . .o@#ooOoooOoo..........",
+"%2,>>-:>;>@ #3;:;;>-%@ .ooo.....OoOX+OoOoo#@================*.+",
+"%2>;;>->;&# o3>;-=;>&# X%=============;;;:>,><,<,<,,<,<,<,<=.+",
+"%<,>>;>;>+ +3:;>;;-%#. .=<,<,<,<<,<,<,<,122333333333331211;% O",
+"%1,;>;>>-# .X3;>=:->%+. =<<3333322332333332211,,,<,>,<,,<,=# +",
+"%,,>;>-;;+ .o2>>->;;$#. =<<,<,<,<>,<>,<,,>>::;;>;>-;;>->;>&#..",
+"O<-;>-*&*@ .o1-;>->;&#. %,2,;;-;;;>->>;;:>>>;=:->>:->;>>:;&@ .",
+"o,>>:;#@@ Xo,>-;>;-*@. o<2,;;;>;:;:>-;:>>-:;:;;=-::;>->;>&#..",
+"o===#@#@@ ..X::>-;;&%@. ,21>>-;;;=;->;:->:=-;>-;>;=*;=:;;*@ .",
+"o. #@@# .XO=%$%%$%@@. .>11;->;>-;>;==::->;>;;>-;=;;->;*-&# .",
+"@#@o. ..X........... ;1,>;;>->=;-:=:;:=>-;=;;;->;=;;-=&# .",
+"oOoooOo. .O.. .-:&**&**&>;>>-;=-;;=;;>->;;>-;;;:&# .",
+"o=>>>>;;%OO@.. . . . . .@o.. . . #*&=;===================%+ .",
+"o><12122,>>;&$#O..........X#oo...... O@@#@#@#@#@@@#@#@@#@#@@@ ..",
+"o>1>>;,1222,>>>>>>>:;;-==&%%+#oooXo.. . . . . . . .X",
+"o>2>>>,>;>,222121212222<1<,>>>>>-O@o......... . . . . . . ...oO",
+"o>2>->==>:;=>->;>;>>->;>>><1211,-.o+Ooo... .................XoO@",
+"o><>>>;>;;;:>-;>=*;>=;-;>->;>>>=% .+O>12:=OOo@@@ooXoooXooXoo+#@@",
+"o><>->==:>->>:-=>=;=:->;>;>->>:%@ .oo2>>2221,@@O,22122211<>:=Oo@",
+"o>-%$%$%$%%$%$%%$%$%$%%$%$%$%$%#@. .o1,>,>,,,$#=2:>>;>->:>;>1: @",
+"o;%............................... O,>,,:$:-%o,>;>->>>->;>->@ #",
+"o. +.o.+%$%%$O2:::>>;:>::>;;+ #",
+"@O... . . . . . . . . . . . X+#.. .@#@@@@@#+@#@#+# @",
+"@#+@oooOOoOO.........................+#+@......+@ #",
+"................................................................"
+};
diff --git a/textures/wood.xpm b/textures/wood.xpm
new file mode 100644
index 0000000..9af7c5e
--- /dev/null
+++ b/textures/wood.xpm
@@ -0,0 +1,79 @@
+/* XPM */
+static char *wood[] = {
+ /* columns rows colors chars-per-pixel */
+ "64 64 9 1",
+ " c #28200C",
+ ". c #382C14",
+ "X c #403018",
+ "o c #483818",
+ "O c #543C1C",
+ "+ c #5C4020",
+ "@ c #6C4824",
+ "# c #744C28",
+ "$ c #905C34",
+ /* pixels */
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+ "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+ "OOOOOOO.O .OOOOOOOOOOOOOO.O .OOOO.O .OOOOOO.O .OOOOOOOOOOO.O .OO",
+ "oo@####O$ O$+oooo##o@o@ooO$ O$#o#O$ O$+ooo+O$ O$o#oo#o#o##O$ O$@",
+ "oo@###+O$ O$@oooO##o@o@ooO$ O$#o#O$ O$#+o+#O$ O$o#oo#o#o##O$ O$@",
+ "oo+###OO$ O$#OooO##o@o@ooO$ O$@o#O$ O$##+##O$ O$o#oo#o#o##O$ O$@",
+ "OoO@##OO$ O$#Ooo+#@o@o@ooO$ O$@o#O$ O$#####O$ O$o#oo#o#o##O$ O$@",
+ "@oo+#+oO$ O$#+oO@#@o@o@ooO$ O$@o#O$ O$#####O$ O$o#oo#o#o@#O$ O$O",
+ "@oOo+OoO$ O$#@o+##+o@o@ooO$ O$+o#O$ O$#####O$ O$o#oo#o#o@#O$ O$O",
+ "#OooOooO$ O$##+@##+o@o@ooO$ O$+o#O$ O$#####O$ O$o#oo#o#o+#O$ O$O",
+ "#OooooOO$ O$##@###Oo@o@ooO$ O$oo#O$ O$#####O$ O$o#oo#o#o+#O$ O$o",
+ "@#oooO#O$ O$##@###Oo@o@ooO$ O$o+#O$ O$@####O$ O$o#oo#o#Oo#O$ O$o",
+ "@#OooO#O$ O$#####@oo@o@ooO$ O$o+#O$ O$@###@O$ O$o#oo#o#Oo#O$ O$o",
+ "+##oO##O$ O$#####@oo@o@ooO$ O$o##O$ O$+###@O$ O$o#oo#o#Oo#O$ O$o",
+ "O###O#+O$ O$@####@oo@o@ooO$ O$+##O$ O$o@#@+O$ O$o#oo#o#Oo#O$ O$O",
+ "o@##+#OO$ O$@####+oo@o@ooO$ O$+#@O$ O$o+@+oO$ O$o#oo#o#+o#O$ O$O",
+ "o@####OO$ O$+####+oo@o@ooO$ O$##@O$ O$oo+ooO$ O$o#oo#o#+o@O$ O$O",
+ "o+@###oO$ O$+####Ooo@o@ooO$ O$##+O$ O$oooooO$ O$o#oo#o#@o@O$ O$@",
+ "oO@##+oO$ O$O@###OoO@o@ooO$ O$#@+O$ O$oooooO$ O$o#oo#o#@o@O$ O$@",
+ "oo+##OoO$ O$O@##@ooO@o@ooO$ O$#@oO$ O$oooooO$ O$o#oo#o#@o+O$ O$@",
+ "ooO##OoO$ O$o+##@ooO@o@ooO$ O$#+oO$ O$+ooo+O$ O$o#oo#o##o+O$ O$@",
+ "OoO+OooO$ O$o+##+oo+@o@ooO$ O$@ooO$ O$@+o+@O$ O$o#oo#o@#ooO$ O$@",
+ "OooOooOO$ O$oO@@+oo+@o@ooO$ O$+ooO$ O$#@+@#O$ O$o#oo#o@#OoO$ O$@",
+ "OoooooOO$ O$oO++Ooo++o@ooO$ O$oooO$ O$##@##O$ O$o#oo#o+#OoO$ O$+",
+ "@ooooo@O$ O$ooOOooo@Oo@ooO$ O$oooO$ O$#####O$ O$o#oo#o+#+oO$ O$O",
+ "@ooooo@O$ O$ooooooo@Oo@ooO$ O$ooOO$ O$#####O$ O$o#oo#oO#+oO$ O$O",
+ "@OoooO+O$ O$ooooooO#oo@ooO$ O$ooOO$ O$#####O$ O$o#oo#oO#@OO$ O$o",
+ "+OoooOOO$ O$oooooo+#oo@ooO$ O$oo+O$ O$@####O$ O$o#oo#oO#@OO$ O$o",
+ "O@ooo@OO$ O$oooooo+#oo@ooO$ O$oo@O$ O$@####O$ O$o#oo#oo##+o$ O$o",
+ "O@Ooo@oO$ O$oooooo@#oo@ooO$ O$oO@O$ O$+###@O$ O$o#oo#oo##+O$ O$o",
+ "o+Oo@+oO$ O$Oooooo@#oo@ooO$ O$o+#O$ O$+@##@O$ O$o#oo#oo@#@O$ O$o",
+ "oO@O@OoO$ O$+ooooO#@oO@ooO$ O$O@#O$ O$o@##+O$ O$o#oo#oo@#@O$ O$o",
+ "oO@O@OoO$ O$@Oooo+#@oO@ooO$ O$+##O$ O$o+#@oO$ O$o#oo#Oo+##O$ O$o",
+ "oo+@+ooO$ O$#+ooO+#+o+@ooO$ O$@##O$ O$oo@+oO$ O$o#oo#Oo+##O$ O$O",
+ "ooO+OooO$ O$#@OoO##Oo+@ooO$ O$###O$ O$oo+ooO$ O$o#oo#OoO##O$ O$O",
+ "oooOoooO$ O$##+o+##Oo+@ooO$ O$##@O$ O$oooooO$ O$o#oo#OoO##O$ O$+",
+ "oooooooO$ O$###+###oo@@ooO$ O$##@O$ O$oooooO$ O$o#oo#+oO##O$ O$@",
+ "ooooooOO$ O$######@oo@@ooO$ O$##+O$ O$oooooO$ O$o#oo#+oo@#O$ O$@",
+ "OoooooOO$ O$@#####@oo#@ooO$ O$#@+O$ O$+ooooO$ O$o#oo#@oo@#O$ O$@",
+ "Oooooo+O$ O$@#####+oo#@ooO$ O$#@oO$ O$+ooooO$ O$o#oo@@oo+#O$ O$O",
+ "@OoooO+O$ O$+#####Ooo#+ooO$ O$#+oO$ O$@+oo+O$ O$o#oo@#oo+#O$ O$O",
+ "@OoooO@O$ O$O#####ooo#+ooO$ O$@+oO$ O$#+o++O$ O$o#oo+#OoO@O$ O$o",
+ "@+OoO+@O$ O$o@###@ooO#oooO$ O$@ooO$ O$#@++@O$ O$o#oo+#OoO@O$ O$o",
+ "@@OOO@+O$ O$o+###+oo+#oooO$ O$+ooO$ O$##+@#O$ O$o#ooO#OoO+O$ O$o",
+ "+@+O+@OO$ O$oO@#@Ooo@#oooO$ O$oooO$ O$##@##O$ O$o#ooO#+oo+O$ O$o",
+ "O@@+@@OO$ O$ooO@+ooo@#oooO$ O$ooOO$ O$#####O$ O$o#ooO#+OoOO$ O$o",
+ "O@@+@@oO$ O$oooOOooo#@oooO$ O$ooOO$ O$#####O$ O$o#ooO#@OoOO$ O$o",
+ "o@###@oO$ O$OooooooO#@oooO$ O$oo+O$ O$####@O$ O$o#ooo#@OoOO$ O$o",
+ "o+###@oO$ O$Ooooooo+#+oooO$ O$oO@O$ O$@###@O$ O$o#ooo@#+ooO$ O$o",
+ "oO@##@oO$ O$+oooooo@#+oooO$ O$o+#O$ O$@###+O$ O$o#ooo@#+OoO$ O$o",
+ "oO@##+oO$ O$@Oooooo@#ooooO$ O$O@#O$ O$+###+O$ O$o#ooo+#@OoO$ O$O",
+ "oo+#@+oO$ O$#OooooO#@ooooO$ O$@##O$ O$+##@OO$ O$o#ooo+#@+oO$ O$O",
+ "ooO@@OoO$ O$#+oooo+#@oo+oO$ O$###O$ O$O@#@OO$ O$o#OooO@#+OO$ O$+",
+ "ooO@+OoO$ O$@@Oooo@#+oo+oO$ O$###O$ O$O@#+oO$ O$o#OooO+#@OO$ O$+",
+ "ooo++ooO$ O$@#OooO@#ooo@oO$ O$###O$ O$o+@OoO$ O$o#Oooo+#@OO$ O$@",
+ "oooOOooO$ O$+#@OoO##ooo@oO$ O$###O$ O$oO+ooO$ O$o#OoooO@#OO$ O$@",
+ "OoooooOO$ O$o@#@O##@ooo@oO$ O$###O$ O$ooOooO$ O$o@+oooO+#@O$ O$#",
+ "OoooooOO$ O$o+#####+ooo#oO$ O$##@O$ O$oooooO$ O$o@@oooo+#@O$ O$#",
+ "+ooooo@O$ O$oo####@ooo+#oO$ O$##@O$ O$oooooO$ O$o+@OoooO@@O$ O$#",
+ "+OoooO@O$ O$oo+@#@+ooo@#oO$ O$#@+O$ O$oooooO$ O$o+#Ooooo++O$ O$#",
+ "@OoooO@O$ O$ooo+@+oooo@#oO$ O$#@+O$ O$oooooO$ O$oo#OoooooOO$ O$#",
+ "@+oooO@O$ O$oooo+oooo@##+O$ O$@+oO$ O$oooooO$ O$+o#+ooooooO$ O$#",
+ "+++++++O$ O$+ooooooo+++++O$ O$+ooO$ O$+ooo+O$ O$+o++ooooooO$ O$+"
+};