diff options
| -rw-r--r-- | cub3d.h | 7 | ||||
| -rw-r--r-- | event.c | 8 | ||||
| -rw-r--r-- | minimalist.cub | 8 | ||||
| -rw-r--r-- | render.c | 60 | ||||
| -rw-r--r-- | render_state.c | 78 | ||||
| -rw-r--r-- | state.c | 32 | ||||
| -rw-r--r-- | textures/stone.xpm | 92 | ||||
| -rw-r--r-- | textures/wood.xpm | 79 |
8 files changed, 267 insertions, 97 deletions
@@ -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 @@ -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 @@ -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); +} @@ -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$+" +}; |
