From 0df11fb8d4a12bdcaf685a420575a720d0689873 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Thu, 27 May 2021 18:04:45 +0200 Subject: [PATCH 01/26] first try of custom conversion --- Plague.g1a | Bin 41984 -> 43424 bytes .../__pycache__/converters.cpython-39.pyc | Bin 0 -> 913 bytes assets-fx/converters.py | 8 ++++---- assets-fx/mutations_table/abilities_1.txt | 2 +- src/core.h | 9 --------- src/display_engine.h | 8 ++++++++ 6 files changed, 13 insertions(+), 14 deletions(-) create mode 100644 assets-fx/__pycache__/converters.cpython-39.pyc diff --git a/Plague.g1a b/Plague.g1a index 42200be9a633550358f2eefe29fedcc31cc7bc40..d6987f59da0b459496312222db3f522681c284bc 100644 GIT binary patch delta 6694 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 delta 5840 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 BLM8wJ diff --git a/assets-fx/__pycache__/converters.cpython-39.pyc b/assets-fx/__pycache__/converters.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7ecc362a537e38337ad3b25853d2ac937d12971 GIT binary patch literal 913 zcmZ8f&ubJh6n>dxW~Xbr_S904(vvWU?baWlNGXCn7onh7C~LZt-A z_Yh);NeTxLdole02P9^(kE0ipeTaffjDWoXbHjCWb06&mn!1l*Fm?^kzw_j}1_Oo| z&(J9&5Yv5#85&?Ne{XVUP$^wxU42%HNhhl`*GZ9gH9ty)B$(>bK}2kOP~`80)cs6H z%(j!ftaLx;nXo}oXa@e*oDK5Iy51UEA@hDX*Tn9U>2riPM%=I z`004-H4?|LPbq6I`XWyxn)VxuzUpzc-pqN z(?sb(k(E2kxc-F(ll8yqZEmN#m literal 0 HcmV?d00001 diff --git a/assets-fx/converters.py b/assets-fx/converters.py index 91227c7..9984554 100644 --- a/assets-fx/converters.py +++ b/assets-fx/converters.py @@ -3,7 +3,7 @@ import fxconv def convert(input_name, output, params, target): if params["custom-type"] == "mutation-table": - convert_mt(map, input_name, output, params, target) + convert_mt(input_name, output, params, target) return 0 else: return 1 @@ -17,8 +17,8 @@ def convert_mt(input_name, output, params, target): # Encode information into bytes data = bytes() - for i in enumerate(mutation_matrix): - for j in enumerate(i): - mutation += fxconv.u32(int(j)) + for i in mutation_matrix: + for j in i: + data += fxconv.u32(int(j)) fxconv.elf(data, output, "_" + params["name"], **target) diff --git a/assets-fx/mutations_table/abilities_1.txt b/assets-fx/mutations_table/abilities_1.txt index 216307f..52ca2ed 100644 --- a/assets-fx/mutations_table/abilities_1.txt +++ b/assets-fx/mutations_table/abilities_1.txt @@ -1,4 +1,4 @@ 1 | 0 | 0 | 0 | 6 | 0 | 0 | 0 7 | 7 | 0 | 7 | 0 | 0 | 0 | 0 0 | 0 | 0 | 0 | 7 | 0 | 0 | 0 -0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 +0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 \ No newline at end of file diff --git a/src/core.h b/src/core.h index 5e09a34..87a3f51 100644 --- a/src/core.h +++ b/src/core.h @@ -56,15 +56,6 @@ struct plane }; - -// mutation : contain the map of the mutation available -struct mutation_table -{ - // Data of the map - int data[4][8]; -}; - - // get_inputs : detect and manage inputs int get_inputs(const int background, int *mutation_menu); diff --git a/src/display_engine.h b/src/display_engine.h index 6ab6315..ffe944e 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -13,4 +13,12 @@ void display_mutation(const struct game *current_game, const int mutation_menu, // init_mat : copy src into dest void init_mat(int x, int y, int dest[][x], int src[][x]); +// mutation_table : contain the map of the mutation available +struct mutation_table +{ + // Data of the map + int data[4][8]; +}; + + #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file -- 2.45.0 From b1c3ed89b9873df250cbb6e695789173b178eb55 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Thu, 27 May 2021 22:09:01 +0200 Subject: [PATCH 02/26] Add mutations menus cursor, and background, and improve plane's traffic. --- CMakeLists.txt | 2 +- Plague.g1a | Bin 43424 -> 43848 bytes assets-fx/cursor.png | Bin 0 -> 698 bytes assets-fx/piece.png | Bin 629 -> 0 bytes assets-fx/pieces.png | Bin 8760 -> 0 bytes assets-fx/planes.png | Bin 677 -> 4995 bytes src/core.c | 60 ++++++++++++++++++++++++++++++++++--------- src/core.h | 23 +++++++++++++---- src/display_engine.c | 9 ++++--- src/display_engine.h | 2 +- src/main.c | 9 ------- 11 files changed, 73 insertions(+), 32 deletions(-) create mode 100644 assets-fx/cursor.png delete mode 100644 assets-fx/piece.png delete mode 100644 assets-fx/pieces.png diff --git a/CMakeLists.txt b/CMakeLists.txt index b6f3adf..5e3e91b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ set(ASSETS_fx assets-fx/planes.png assets-fx/bground.png assets-fx/mutations.png - assets-fx/piece.png + assets-fx/cursor.png assets-fx/title.png assets-fx/mutations_table/abilities_1.txt assets-fx/mutations_table/abilities_2.txt diff --git a/Plague.g1a b/Plague.g1a index d6987f59da0b459496312222db3f522681c284bc..11751509d5c7a40c46863e3d89df2004f140dba5 100644 GIT binary patch delta 4356 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 S#y!dUv8Nydk}j46`~Mf4Fx{8{ diff --git a/assets-fx/planes.png b/assets-fx/planes.png index fae3c21925ca0e6cdcee66c30f80bf9a6c42486c..5995dc05c06651bace4df4689c1ab315ee183bfb 100644 GIT binary patch literal 4995 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 +#include #include #include "core.h" @@ -45,13 +47,7 @@ void next_frame(struct game *current_game) int get_inputs(const int background, int *mutation_menu) { - int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS; - int timeout = 1; - - key_event_t ev = getkey_opt(opt, &timeout); - if(ev.type == KEYEV_NONE) return background; - - int key = ev.key; + int key = rtc_key(); if (key == KEY_OPTN && (background == 1 || background == 2)) return (background % 2) + 1; if (key == KEY_VARS) return 3; @@ -98,15 +94,55 @@ int get_inputs(const int background, int *mutation_menu) } +int rtc_key(void) +{ + int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS; + int timeout = 1; + + key_event_t ev = getkey_opt(opt, &timeout); + if(ev.type == KEYEV_NONE) return 0; + + return ev.key; +} + + +int callback_tick(volatile int *tick) +{ + *tick = 1; + return TIMER_CONTINUE; +} + + void manage_mutation(struct game *current_game, const int mutation_menu) { int key = 0, end = 0; - int cursor_x = 1, cursor_y = 1; - while (!end) - { - display_mutation(current_game, mutation_menu, cursor_x, cursor_y); - key = getkey().key; + struct cursor c = {0, 0, 0}; + static volatile int tick = 1; + int t = timer_configure(TIMER_ANY, CURSOR_TICK*1000, GINT_CALL(callback_tick, &tick)); + if (t >= 0) timer_start(t); + + + while (!end) + { + // Cursor blinking gestion + while (!tick) sleep(); + tick = 0; + c.display = (c.display + 1) % 2; + + // Display the mutation menu + display_mutation(current_game, mutation_menu, c); + + // Get the key + key = rtc_key(); + if (key == KEY_EXIT) end = 1; + + + if (key == KEY_LEFT && c.x > 0) c.x--; + if (key == KEY_RIGHT && c.x < 7) c.x++; + if (key == KEY_UP && c.y > 0) c.y--; + if (key == KEY_DOWN && c.y < 3) c.y++; } + if (t >= 0) timer_stop(t); } diff --git a/src/core.h b/src/core.h index 87a3f51..cf93a01 100644 --- a/src/core.h +++ b/src/core.h @@ -1,9 +1,9 @@ #ifndef _PLAGUE_CORE_H #define _PLAGUE_CORE_H - // Duration for internal clock #define ENGINE_TICK 50 +#define CURSOR_TICK 200 // Number of planes on screen #define NB_PLANES 5 @@ -11,7 +11,6 @@ // Number of humans #define TOTAL_POP 10000000000 - // game : all statistics of the current game struct game { @@ -38,7 +37,6 @@ struct game struct plane *planes[NB_PLANES + 1]; }; - // plane : information about planes struct plane { @@ -51,20 +49,35 @@ struct plane // Coordinates of the plane's destination int dest_x, dest_y; - //Coordinates of the plane's departure + // Coordinates of the plane's departure int depa_x, depa_y; }; +//cursor : cursor information for mutations selection +struct cursor +{ + // Cursor's coordinates + int x, y; + + // If the cursor should be displayed + int display; +}; + // get_inputs : detect and manage inputs int get_inputs(const int background, int *mutation_menu); - // next_frame : compute the plane's positions void next_frame(struct game *current_game); +// rtc_key : get the key with RTC system +int rtc_key(void); + +// callback_timer : basic timer +int callback_tick(volatile int *tick); // manage_mutation : an independant sub-programm which allow to select, buy and see the mutations. void manage_mutation(struct game *current_game, const int mutation_menu); + #endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index 4d4ac48..3fae5b4 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -79,10 +79,10 @@ void display_foreground(const int background, const struct game *current_game) } -void display_mutation(const struct game *current_game, const int mutation_menu, const int cursor_x, const int cursor_y) +void display_mutation(const struct game *current_game, const int mutation_menu, const struct cursor c) { extern const bopti_image_t img_mutations; - extern bopti_image_t img_piece; + extern bopti_image_t img_cursor; // Load symptoms extern struct mutation_table mt_symptoms_1; @@ -122,14 +122,15 @@ void display_mutation(const struct game *current_game, const int mutation_menu, } dclear(C_WHITE); + display_background(5); for (int i = 0 ; i < 4 ; i++) { for (int j = 0 ; j < 8; j++) { - if (table[i][j]) dsubimage(i*16, j*16, &img_mutations, 16 * (mutation_menu - 1), 0, 16 * (table[i][j] - 1), 15, 15); + if (table[i][j]) dsubimage(j*16, i*16, &img_mutations, 16 * (mutation_menu - 1), 16 * (table[i][j] - 1), 15, 15, DIMAGE_NONE); } } - dimage(16 * (cursor_x - 1), 16 * (cursor_y - 1), &img_piece); + dsubimage((16 * c.x) - 1, (16 * c.y) - 1, &img_cursor, 0, 17 * (c.display), 17, 17, DIMAGE_NONE); dupdate(); } diff --git a/src/display_engine.h b/src/display_engine.h index ffe944e..e9c7e9c 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -8,7 +8,7 @@ void display_background(const int background); void display_foreground(const int background, const struct game *current_game); // display_mutation : display the mutation selection screen -void display_mutation(const struct game *current_game, const int mutation_menu, const int cursor_x, const int cursor_y); +void display_mutation(const struct game *current_game, const int mutation_menu, const struct cursor c); // init_mat : copy src into dest void init_mat(int x, int y, int dest[][x], int src[][x]); diff --git a/src/main.c b/src/main.c index abb3ba2..7d94cbc 100644 --- a/src/main.c +++ b/src/main.c @@ -19,9 +19,6 @@ static void title_screen(void); // main_loop : display background, foreground and manage inputs void main_loop(struct game *current_game); -// callback_timer : basic timer -int callback_tick(volatile int *tick); - int main(void) { @@ -117,9 +114,3 @@ void main_loop(struct game *current_game) if (t >= 0) timer_stop(t); } - -int callback_tick(volatile int *tick) -{ - *tick = 1; - return TIMER_CONTINUE; -} -- 2.45.0 From 453b6b5276ceff5689a432f8256cbddbdda21a0c Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Fri, 28 May 2021 22:27:31 +0200 Subject: [PATCH 03/26] Add mutation data (custom fxconv type) and other minor changes --- CMakeLists.txt | 4 + Plague.g1a | Bin 43848 -> 44596 bytes README.md | 7 +- .../__pycache__/converters.cpython-39.pyc | Bin 913 -> 1298 bytes assets-fx/converters.py | 16 ++++ assets-fx/mutations_data/abilities.txt | 14 +++ assets-fx/mutations_data/fxconv-metadata.txt | 3 + assets-fx/mutations_data/space_splitter.py | 8 ++ assets-fx/mutations_data/symptoms.txt | 14 +++ assets-fx/mutations_data/transmissions.txt | 14 +++ src/core.c | 12 ++- src/display_engine.c | 52 +---------- src/display_engine.h | 15 +--- src/mutation_engine.c | 84 ++++++++++++++++++ src/mutation_engine.h | 32 +++++++ 15 files changed, 206 insertions(+), 69 deletions(-) create mode 100644 assets-fx/mutations_data/abilities.txt create mode 100644 assets-fx/mutations_data/fxconv-metadata.txt create mode 100644 assets-fx/mutations_data/space_splitter.py create mode 100644 assets-fx/mutations_data/symptoms.txt create mode 100644 assets-fx/mutations_data/transmissions.txt create mode 100644 src/mutation_engine.c create mode 100644 src/mutation_engine.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e3e91b..62a715c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ set(SOURCES src/main.c src/core.c src/display_engine.c + src/mutation_engine.c # ... ) # Shared assets, fx-9860G-only assets and fx-CG-50-only assets @@ -35,6 +36,9 @@ set(ASSETS_fx assets-fx/mutations_table/transmissions_1.txt assets-fx/mutations_table/transmissions_2.txt assets-fx/mutations_table/transmissions_3.txt + assets-fx/mutations_data/abilities.txt + assets-fx/mutations_data/symptoms.txt + assets-fx/mutations_data/transmissions.txt # ... ) set(ASSETS_cg diff --git a/Plague.g1a b/Plague.g1a index 11751509d5c7a40c46863e3d89df2004f140dba5..b180f0a86d666aa80a7827983268ef920d3fcfed 100644 GIT binary patch delta 4211 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 diff --git a/assets-fx/converters.py b/assets-fx/converters.py index 9984554..10a2b88 100644 --- a/assets-fx/converters.py +++ b/assets-fx/converters.py @@ -5,6 +5,9 @@ def convert(input_name, output, params, target): if params["custom-type"] == "mutation-table": convert_mt(input_name, output, params, target) return 0 + elif params["custom-type"] == "mutation-data": + convert_md(input_name, output, params, target) + return 0 else: return 1 @@ -22,3 +25,16 @@ def convert_mt(input_name, output, params, target): data += fxconv.u32(int(j)) fxconv.elf(data, output, "_" + params["name"], **target) + + +def convert_md(input_name, output, params, target): + with open(input_name, "r") as file: + # Extract informations + lines = file.read().splitlines() + + # Convert data into bytes-like object + data = bytes() + for i in lines: + data += bytes(i, encoding="utf-8") + + fxconv.elf(data, output, "_" + params["name"], **target) diff --git a/assets-fx/mutations_data/abilities.txt b/assets-fx/mutations_data/abilities.txt new file mode 100644 index 0000000..2a93ce9 --- /dev/null +++ b/assets-fx/mutations_data/abilities.txt @@ -0,0 +1,14 @@ +FROID,4,0,0,10,0 +CHAUD,7,0,0,15,0 +GENETIQUE,0,5,4,25, +MUTATION+,0,8,8,30,2 +ENVIRON,10,0,0,30,0 +MEDICAMENT,0,2,2,15,1 +NONE +NONE +NONE +NONE +NONE +NONE +NONE +NONE \ No newline at end of file diff --git a/assets-fx/mutations_data/fxconv-metadata.txt b/assets-fx/mutations_data/fxconv-metadata.txt new file mode 100644 index 0000000..0ad2668 --- /dev/null +++ b/assets-fx/mutations_data/fxconv-metadata.txt @@ -0,0 +1,3 @@ +*.txt: + custom-type: mutation-data + name_regex: (.*)\.txt md_\1 \ No newline at end of file diff --git a/assets-fx/mutations_data/space_splitter.py b/assets-fx/mutations_data/space_splitter.py new file mode 100644 index 0000000..e09ada1 --- /dev/null +++ b/assets-fx/mutations_data/space_splitter.py @@ -0,0 +1,8 @@ +for file_name in ("abilities.txt", "symptoms.txt", "transmissions.txt"): + file = open(file_name, "r") + content = file.read().replace(" ", "") + file.close() + + file = open(file_name, "w") + file.write(content) + file.close() \ No newline at end of file diff --git a/assets-fx/mutations_data/symptoms.txt b/assets-fx/mutations_data/symptoms.txt new file mode 100644 index 0000000..7ccbfa5 --- /dev/null +++ b/assets-fx/mutations_data/symptoms.txt @@ -0,0 +1,14 @@ +NAUSEE,1,1,0,2,0.5, +VOMISSEMENT,3,2,0,4,0.5 +TOUX,2,1,0,3,0.5 +PNEUMONIE,2,2,0,4,0.5 +TUMEUR,4,2,5,15,1 +PLAIES,2,1,0,3,0.5 +LESIONS,5,4,0,10,0.5 +HEMORRAGIE,5,15,15,20,0.5 +INFLAMMATION,2,2,2,5,0.5 +INFECTION,6,7,6,17,0.5 +IMMUNODEFICIENCE,2,6,4,12,1 +PARANOIA,0,4,0,5,1 +FOLIE,6,15,0,20,2 +ARRETTOTAL,0,20,25,30,2 \ No newline at end of file diff --git a/assets-fx/mutations_data/transmissions.txt b/assets-fx/mutations_data/transmissions.txt new file mode 100644 index 0000000..c4f008c --- /dev/null +++ b/assets-fx/mutations_data/transmissions.txt @@ -0,0 +1,14 @@ +AIR1,2,0,0,9,0 +AIR2,5,0,0,15,0 +AIR3,8,0,0,20,0 +AEROSOL,10,0,0,30,0 +EAU1,2,0,0,9,0 +EAU2,4,0,0,12,0 +OISEAU1,3,0,0,12,0 +OISEAU2,6,0,0,16,0 +ANIMAL1,2,0,0,10,0 +ANIMAL2,6,0,0,16,0 +SANG1,1,0,0,8,0 +SANG2,4,0,0,14,0 +SANG3,9,0,0,20,0 +NONE \ No newline at end of file diff --git a/src/core.c b/src/core.c index 063c56c..e57f55d 100644 --- a/src/core.c +++ b/src/core.c @@ -3,6 +3,7 @@ #include #include "core.h" +#include "mutation_engine.h" #include "display_engine.h" @@ -130,14 +131,19 @@ void manage_mutation(struct game *current_game, const int mutation_menu) tick = 0; c.display = (c.display + 1) % 2; - // Display the mutation menu - display_mutation(current_game, mutation_menu, c); + // Get and display the mutation menu + int table[4][8]; + get_mutation(current_game, mutation_menu, table); + char data[14]; + get_mutation_data(mutation_menu, data); + display_mutation(table, c, mutation_menu); // Get the key key = rtc_key(); + // Manage input if (key == KEY_EXIT) end = 1; - + // if (key == KEY_EXE) mutation_selected(c, mutation_menu, get_mutation_data(current_game, mutation_menu)); if (key == KEY_LEFT && c.x > 0) c.x--; if (key == KEY_RIGHT && c.x < 7) c.x++; diff --git a/src/display_engine.c b/src/display_engine.c index 3fae5b4..31caeeb 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -1,6 +1,6 @@ #include -#include "core.h" +#include "mutation_engine.h" #include "display_engine.h" @@ -79,48 +79,11 @@ void display_foreground(const int background, const struct game *current_game) } -void display_mutation(const struct game *current_game, const int mutation_menu, const struct cursor c) +void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu) { extern const bopti_image_t img_mutations; extern bopti_image_t img_cursor; - // Load symptoms - extern struct mutation_table mt_symptoms_1; - extern struct mutation_table mt_symptoms_2; - extern struct mutation_table mt_symptoms_3; - - // Load abilities - extern struct mutation_table mt_abilities_1; - extern struct mutation_table mt_abilities_2; - extern struct mutation_table mt_abilities_3; - - // Load transmissions - extern struct mutation_table mt_transmissions_1; - extern struct mutation_table mt_transmissions_2; - extern struct mutation_table mt_transmissions_3; - - int table[4][8]; - if (mutation_menu == 1) - { - if (current_game->symptoms < 4) init_mat(8, 4, table, mt_symptoms_1.data); - else if (current_game->symptoms < 8) init_mat(8, 4, table, mt_symptoms_2.data); - else init_mat(8, 4, table, mt_symptoms_3.data); - } - - if (mutation_menu == 2) - { - if (current_game->abilities < 2) init_mat(8, 4, table, mt_abilities_1.data); - else if (current_game->abilities < 4) init_mat(8, 4, table, mt_abilities_2.data); - else init_mat(8, 4, table, mt_abilities_3.data); - } - - if (mutation_menu == 3) - { - if (current_game->transmissions < 5) init_mat(8, 4, table, mt_transmissions_1.data); - else if (current_game->transmissions < 10) init_mat(8, 4, table, mt_transmissions_2.data); - else init_mat(8, 4, table, mt_transmissions_3.data); - } - dclear(C_WHITE); display_background(5); for (int i = 0 ; i < 4 ; i++) @@ -135,14 +98,3 @@ void display_mutation(const struct game *current_game, const int mutation_menu, } - -void init_mat(int x, int y, int dest[][x], int src[][x]) -{ - for (int i = 0 ; i < x ; i++) - { - for (int j = 0 ; j < y ; j++) - { - dest[j][i] = src[j][i]; - } - } -} diff --git a/src/display_engine.h b/src/display_engine.h index e9c7e9c..57fbeaa 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -1,6 +1,8 @@ #ifndef _PLAGUE_DISPLAY_ENGINE_H #define _PLAGUE_DISPLAY_ENGINE_H +#include "core.h" + // display_background : display the background void display_background(const int background); @@ -8,17 +10,6 @@ void display_background(const int background); void display_foreground(const int background, const struct game *current_game); // display_mutation : display the mutation selection screen -void display_mutation(const struct game *current_game, const int mutation_menu, const struct cursor c); - -// init_mat : copy src into dest -void init_mat(int x, int y, int dest[][x], int src[][x]); - -// mutation_table : contain the map of the mutation available -struct mutation_table -{ - // Data of the map - int data[4][8]; -}; - +void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu); #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file diff --git a/src/mutation_engine.c b/src/mutation_engine.c new file mode 100644 index 0000000..a5b4c99 --- /dev/null +++ b/src/mutation_engine.c @@ -0,0 +1,84 @@ +#include "mutation_engine.h" + +void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]) +{ + // Load symptoms + extern struct mutation_table mt_symptoms_1; + extern struct mutation_table mt_symptoms_2; + extern struct mutation_table mt_symptoms_3; + + // Load abilities + extern struct mutation_table mt_abilities_1; + extern struct mutation_table mt_abilities_2; + extern struct mutation_table mt_abilities_3; + + // Load transmissions + extern struct mutation_table mt_transmissions_1; + extern struct mutation_table mt_transmissions_2; + extern struct mutation_table mt_transmissions_3; + + if (mutation_menu == 1) + { + if (current_game->symptoms < 4) init_mat(8, 4, table, mt_symptoms_1.data); + else if (current_game->symptoms < 8) init_mat(8, 4, table, mt_symptoms_2.data); + else init_mat(8, 4, table, mt_symptoms_3.data); + } + + if (mutation_menu == 2) + { + if (current_game->abilities < 2) init_mat(8, 4, table, mt_abilities_1.data); + else if (current_game->abilities < 4) init_mat(8, 4, table, mt_abilities_2.data); + else init_mat(8, 4, table, mt_abilities_3.data); + } + + if (mutation_menu == 3) + { + if (current_game->transmissions < 5) init_mat(8, 4, table, mt_transmissions_1.data); + else if (current_game->transmissions < 10) init_mat(8, 4, table, mt_transmissions_2.data); + else init_mat(8, 4, table, mt_transmissions_3.data); + } +} + + +void get_mutation_data(const int mutation_menu, char data[14]) +{ + extern struct mutation_data md_abilities; + extern struct mutation_data md_symptoms; + extern struct mutation_data md_transmissions; + + switch (mutation_menu) + { + case 1: + char_init_mat(14, data, md_symptoms.data); + break; + + case 2: + char_init_mat(14, data, md_abilities.data); + break; + + case 3: + char_init_mat(14, data, md_transmissions.data); + break; + } +} + + +void init_mat(int x, int y, int dest[][x], int src[][x]) +{ + for (int i = 0; i < x; i++) + { + for (int j = 0; j < y; j++) + { + dest[j][i] = src[j][i]; + } + } +} + +void char_init_mat(int x, char dest[x], char src[x]) +{ + for (int i = 0; i < x; i++) + { + dest[i] = src[i]; + } +} + diff --git a/src/mutation_engine.h b/src/mutation_engine.h new file mode 100644 index 0000000..1b99a7a --- /dev/null +++ b/src/mutation_engine.h @@ -0,0 +1,32 @@ +#ifndef _MUTATION_ENGINE_H +#define _MUTATION_ENGINE_H + +#include "core.h" + +// mutation_table : contain the map of the mutation available +struct mutation_table +{ + // Data of the map + int data[4][8]; +}; + +// mutation_data : contain the mutations data +struct mutation_data +{ + // Data of the mutations + char data[14]; +}; + +// get_mutation : return the mutation table to display +void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]); + +// get_mutation_data : return the mutation_data +void get_mutation_data(const int mutation_menu, char data[14]); + +// init_mat : copy src into dest (for int) +void init_mat(int x, int y, int dest[][x], int src[][x]); + +// char_init_mat : copy src into dest (for char) +void char_init_mat(int x, char dest[x], char srx[x]); + +#endif /* _MUTATION_ENGINE_H */ \ No newline at end of file -- 2.45.0 From 89c606d910a3afa89a143003bb390b7eadf684dd Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Fri, 28 May 2021 22:29:26 +0200 Subject: [PATCH 04/26] Update gitignore --- .gitignore | 1 + assets-fx/__pycache__/converters.cpython-39.pyc | Bin 1298 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 assets-fx/__pycache__/converters.cpython-39.pyc diff --git a/.gitignore b/.gitignore index e63abc7..228ca6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build-fx/* +assets-fx/__pycache__/* \ No newline at end of file diff --git a/assets-fx/__pycache__/converters.cpython-39.pyc b/assets-fx/__pycache__/converters.cpython-39.pyc deleted file mode 100644 index 655234ab181970e33d51961ae6f8917e61a7ecd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmaizO=}ZD7{_OJXE)pQ6|JpBEk(TSAx(S%i-aQBqZFl}SSWGLY|^d!lFUpb4U<#6 zR?$z8f|nizzd^sn+{9DQ;@#)jw6U#%v&?^9p4oYJ|G$}Fdb&uUe1HD+^#LQ~2M*2` z3kHv&$~z#Oa2k_s!YyvUC)<=W?m%mCmlvS5Io%?@cLFQPW*v4L7wkJwpFouxAll+| z3HEtwiDgAJ(NtU79xzI{y>%945UnbDIm(?a_!7wEZuTbY9jUUUr1o23Zzk!eKt)+v zQo)-z6ciHmrpJ>!P{9e#`Iafxv-DjkR4q~G`rK!x7^SU_s--~^8aL}G7#Oz|h#-;1 zRe@-R>WGL5*yh(Gkn(Ppgk`xKlbS>)|!zjKZ}EACoBh2hDw$i-STPD zP{`HRzA2mz(HuDgLg*Bop=_j15B|RM^e?Zq_ut(#y_Ew-tr%w ztJOHG2eDj-&e=jkYlb0G-!m+0g{fg847e%gsp2RNrE%WuD`?zC7xyxD=l(roN2xM) z7&rW)z<&@fN&y8y7}kj5&^Y-9+p}jUt(F8zL|w!1#EDs4NcS%NhOl88LvjuT$XmeP zcBu!?11pbSV2|m>?7J`+v#(xcpVM}c{mwj6SGF$Tc{s3uvD?1=7vZOu2s_&S4`DF{ z`Fl=BHA-v1%L~(b#-p?;uE4xND84J^v40H(nTth~>nJxseD7a&ikld}g|du-_FT3N zFAD}GenW0sZd%0>81dOC2VR}r!+iGK9(Zp>evG_olJQO)uH#vi$knsGNpJQy3J?-! -- 2.45.0 From e8fb7c7107b487a0fbf579027a3598a83eeb1e2e Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Fri, 28 May 2021 22:30:40 +0200 Subject: [PATCH 05/26] Remove useless python script --- assets-fx/mutations_data/space_splitter.py | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 assets-fx/mutations_data/space_splitter.py diff --git a/assets-fx/mutations_data/space_splitter.py b/assets-fx/mutations_data/space_splitter.py deleted file mode 100644 index e09ada1..0000000 --- a/assets-fx/mutations_data/space_splitter.py +++ /dev/null @@ -1,8 +0,0 @@ -for file_name in ("abilities.txt", "symptoms.txt", "transmissions.txt"): - file = open(file_name, "r") - content = file.read().replace(" ", "") - file.close() - - file = open(file_name, "w") - file.write(content) - file.close() \ No newline at end of file -- 2.45.0 From 5279fccb55327f186c90d2cc4a00e1cc0eca4fcf Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Fri, 28 May 2021 22:37:04 +0200 Subject: [PATCH 06/26] Add licence GNU General Public Licence v3.0 --- LICENSE.md | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 9 +- 2 files changed, 680 insertions(+), 3 deletions(-) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/main.c b/src/main.c index 7d94cbc..c8e4e6d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,10 @@ /* - Name : Plague - Version : - dev - - Last modification : 24 May 2021 + Name ..............: Plague + Version ...........: - dev - + Last modification .: 24 May 2021 + + Code provided with licence : + GNU General Public Licence v3.0 */ #include -- 2.45.0 From f93811fdf5805bba173fa0c6a76f34ea51dda52a Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 29 May 2021 16:44:46 +0200 Subject: [PATCH 07/26] Add mutation data --- CMakeLists.txt | 4 +- Plague.g1a | Bin 44596 -> 45296 bytes assets-fx/bground.png | Bin 11163 -> 23076 bytes assets-fx/converters.py | 14 +----- assets-fx/mutations.png | Bin 4858 -> 15531 bytes assets-fx/mutations_data/abilities.txt | 14 ------ assets-fx/mutations_data/fxconv-metadata.txt | 3 -- assets-fx/mutations_data/symptoms.txt | 14 ------ assets-fx/mutations_data/transmissions.txt | 14 ------ assets-fx/mutations_table/abilities_1.txt | 8 +-- assets-fx/mutations_table/abilities_2.txt | 8 +-- assets-fx/mutations_table/transmissions_1.txt | 8 +-- assets-fx/mutations_table/transmissions_2.txt | 6 +-- src/core.c | 10 ++-- src/core.h | 3 +- src/display_engine.c | 44 +++++++++++++++++ src/display_engine.h | 3 ++ src/main.c | 3 +- src/mutation_data.c | 46 ++++++++++++++++++ src/mutation_engine.c | 30 ------------ src/mutation_engine.h | 14 +++--- 21 files changed, 126 insertions(+), 120 deletions(-) delete mode 100644 assets-fx/mutations_data/abilities.txt delete mode 100644 assets-fx/mutations_data/fxconv-metadata.txt delete mode 100644 assets-fx/mutations_data/symptoms.txt delete mode 100644 assets-fx/mutations_data/transmissions.txt create mode 100644 src/mutation_data.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 62a715c..0c2b79c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ set(SOURCES src/core.c src/display_engine.c src/mutation_engine.c + src/mutation_data.c # ... ) # Shared assets, fx-9860G-only assets and fx-CG-50-only assets @@ -36,9 +37,6 @@ set(ASSETS_fx assets-fx/mutations_table/transmissions_1.txt assets-fx/mutations_table/transmissions_2.txt assets-fx/mutations_table/transmissions_3.txt - assets-fx/mutations_data/abilities.txt - assets-fx/mutations_data/symptoms.txt - assets-fx/mutations_data/transmissions.txt # ... ) set(ASSETS_cg diff --git a/Plague.g1a b/Plague.g1a index b180f0a86d666aa80a7827983268ef920d3fcfed..ce87a5ee3743adc65784ebf6bbed1a33b4e93767 100644 GIT binary patch delta 5508 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 delta 4717 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 delta 10163 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 G&Hn-72mXx! diff --git a/assets-fx/converters.py b/assets-fx/converters.py index 10a2b88..b31c588 100644 --- a/assets-fx/converters.py +++ b/assets-fx/converters.py @@ -5,7 +5,7 @@ def convert(input_name, output, params, target): if params["custom-type"] == "mutation-table": convert_mt(input_name, output, params, target) return 0 - elif params["custom-type"] == "mutation-data": + elif params["custom-type"] == "mutation": convert_md(input_name, output, params, target) return 0 else: @@ -26,15 +26,3 @@ def convert_mt(input_name, output, params, target): fxconv.elf(data, output, "_" + params["name"], **target) - -def convert_md(input_name, output, params, target): - with open(input_name, "r") as file: - # Extract informations - lines = file.read().splitlines() - - # Convert data into bytes-like object - data = bytes() - for i in lines: - data += bytes(i, encoding="utf-8") - - fxconv.elf(data, output, "_" + params["name"], **target) diff --git a/assets-fx/mutations.png b/assets-fx/mutations.png index 6970d18a53ebd4f71fccf084933d2ec9b1a5aaef..d6f671bb23ab05d114624e975d1bdcc58d331f86 100644 GIT binary patch literal 15531 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 NNls0+R@yxDe*uw@&u9Pu delta 3807 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 0) c.x--; if (key == KEY_RIGHT && c.x < 7) c.x++; diff --git a/src/core.h b/src/core.h index cf93a01..b6e9545 100644 --- a/src/core.h +++ b/src/core.h @@ -3,7 +3,7 @@ // Duration for internal clock #define ENGINE_TICK 50 -#define CURSOR_TICK 200 +#define CURSOR_TICK 100 // Number of planes on screen #define NB_PLANES 5 @@ -79,5 +79,4 @@ int callback_tick(volatile int *tick); // manage_mutation : an independant sub-programm which allow to select, buy and see the mutations. void manage_mutation(struct game *current_game, const int mutation_menu); - #endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index 31caeeb..98e4cc9 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -98,3 +98,47 @@ void display_mutation(const int table[4][8], const struct cursor c, const int mu } + +void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8]) +{ + extern const bopti_image_t img_mutations; + const int id = table[c.y][c.x]; + + extern struct mutation symptoms_data[14]; + extern struct mutation abilities_data[6]; + extern struct mutation transmissions_data[13]; + + struct mutation *mutation_data; + + switch (mutation_menu) + { + case 1: + mutation_data = &symptoms_data[id - 1]; + break; + + case 2: + mutation_data = &abilities_data[id - 1]; + break; + + case 3: + mutation_data = &transmissions_data[id - 1]; + break; + } + + dclear(C_WHITE); + + display_background(4); + dsubimage(3, 21, &img_mutations, 16 * (mutation_menu - 1), 16 * (id - 1), 15, 15, DIMAGE_NONE); + + dprint(47, 25, C_BLACK, mutation_data->name); + dprint(81, 33, C_BLACK, "%d", mutation_data->dna); + dprint(81, 41, C_BLACK, "%d", mutation_data->contagion); + dprint(81, 49, C_BLACK, "%d", mutation_data->lethality); + dprint(81, 57, C_BLACK, "%d", mutation_data->severity); + + dupdate(); + + +} + + diff --git a/src/display_engine.h b/src/display_engine.h index 57fbeaa..23898a9 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -12,4 +12,7 @@ void display_foreground(const int background, const struct game *current_game); // display_mutation : display the mutation selection screen void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu); +// mutation_selected : display the mutation shop +void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8]); + #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index c8e4e6d..a161c31 100644 --- a/src/main.c +++ b/src/main.c @@ -30,13 +30,14 @@ int main(void) title_screen(); + // Game statistics struct plane plane_1 = {22, 20, 2, 84, 20, 22, 20}; struct plane plane_2 = {34, 20, 3, 34, 44, 34, 20}; struct plane plane_3 = {68, 44, 1, 68, 20, 68, 44}; struct plane plane_4 = {104, 20, 3, 104, 50, 104, 20}; struct plane plane_5 = {68, 44, 4, 34, 44, 68, 44}; - GUNUSED struct game current_game = + struct game current_game = { .contagion = 0, .severity = 0, diff --git a/src/mutation_data.c b/src/mutation_data.c new file mode 100644 index 0000000..f298398 --- /dev/null +++ b/src/mutation_data.c @@ -0,0 +1,46 @@ +#include "mutation_engine.h" + +const struct mutation abilities_data[6] = +{ + {4, 0, 0, 10, 0, "FROID"}, + {7, 0, 0, 15, 0, "CHAUD"}, + {0, 5, 4, 25, 0, "GENETIQUE"}, + {0, 8, 8, 30, 2, "MUTATION+"}, + {10, 0, 0, 30, 0, "ENVIRON"}, + {0, 2, 2, 15, 1, "MEDICAMENT"}, +}; + +const struct mutation symptoms_data[14] = +{ + {1, 1, 0, 2, 0.5, "NAUSEE"}, + {3, 2, 0, 4, 0.5, "VOMISSEMENT"}, + {2, 1, 0, 3, 0.5, "TOUX"}, + {2, 2, 0, 4, 0.5, "PNEUMONIE"}, + {4, 2, 5, 15, 1, "TUMEUR"}, + {2, 1, 0, 3, 0.5, "PLAIES"}, + {5, 4, 0, 10, 0.5, "LESIONS"}, + {5, 15, 15, 20, 0.5, "HEMORRAGIE"}, + {6, 7, 6, 17, 0.5, "INFECTION"}, + {2, 2, 2, 5, 0.5, "INFLAMMATION"}, + {2, 6, 4, 12, 1, "IMMUNODEFICIENCE"}, + {0, 4, 0, 5, 1, "PARANOIA"}, + {6, 15, 0, 20, 2, "FOLIE"}, + {0, 20, 25, 30, 2, "ARRET TOTAL"}, +}; + +const struct mutation transmissions_data[13] = +{ + { 2, 0, 0, 9, 0, "AIR 1"}, + { 5, 0, 0, 15, 0, "AIR 2"}, + { 8, 0, 0, 20, 0, "AIR 3"}, + {10, 0, 0, 30, 0, "AEROSOL"}, + { 2, 0, 0, 9, 0, "EAU 1"}, + { 4, 0, 0, 12, 0, "EAU 2"}, + { 2, 0, 0, 10, 0, "ANIMAL 1"}, + { 6, 0, 0, 16, 0, "ANIMAL 2"}, + { 3, 0, 0, 12, 0, "OISEAU 1"}, + { 6, 0, 0, 16, 0, "OISEAU 2"}, + { 1, 0, 0, 8, 0, "SANG 1"}, + { 4, 0, 0, 14, 0, "SANG 2"}, + { 9, 0, 0, 20, 0, "SANG 3"}, +}; \ No newline at end of file diff --git a/src/mutation_engine.c b/src/mutation_engine.c index a5b4c99..a4dc60b 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -40,29 +40,6 @@ void get_mutation(const struct game *current_game, const int mutation_menu, int } -void get_mutation_data(const int mutation_menu, char data[14]) -{ - extern struct mutation_data md_abilities; - extern struct mutation_data md_symptoms; - extern struct mutation_data md_transmissions; - - switch (mutation_menu) - { - case 1: - char_init_mat(14, data, md_symptoms.data); - break; - - case 2: - char_init_mat(14, data, md_abilities.data); - break; - - case 3: - char_init_mat(14, data, md_transmissions.data); - break; - } -} - - void init_mat(int x, int y, int dest[][x], int src[][x]) { for (int i = 0; i < x; i++) @@ -74,11 +51,4 @@ void init_mat(int x, int y, int dest[][x], int src[][x]) } } -void char_init_mat(int x, char dest[x], char src[x]) -{ - for (int i = 0; i < x; i++) - { - dest[i] = src[i]; - } -} diff --git a/src/mutation_engine.h b/src/mutation_engine.h index 1b99a7a..a132110 100644 --- a/src/mutation_engine.h +++ b/src/mutation_engine.h @@ -10,19 +10,19 @@ struct mutation_table int data[4][8]; }; -// mutation_data : contain the mutations data -struct mutation_data +// mutation : data about a mutation +struct mutation { - // Data of the mutations - char data[14]; + // Data of the mutation : contagion, lethality, severity, DNA cost + int contagion, severity, lethality, dna, changement; + + // Name of the mutation + char *name; }; // get_mutation : return the mutation table to display void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]); -// get_mutation_data : return the mutation_data -void get_mutation_data(const int mutation_menu, char data[14]); - // init_mat : copy src into dest (for int) void init_mat(int x, int y, int dest[][x], int src[][x]); -- 2.45.0 From 35b2b2435feced0c0f706eb28191f5cc3b1b0420 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 29 May 2021 17:02:07 +0200 Subject: [PATCH 08/26] Manageme the UI for the purchase of mutations --- src/core.c | 30 ++++++++++++++++++++++++------ src/core.h | 7 +++++-- src/display_engine.c | 7 +++++-- src/display_engine.h | 4 ++-- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/core.c b/src/core.c index f27576c..5dd3d55 100644 --- a/src/core.c +++ b/src/core.c @@ -141,12 +141,8 @@ void manage_mutation(struct game *current_game, const int mutation_menu) // Manage input if (key == KEY_EXIT) end = 1; - if (key == KEY_EXE && table[c.y][c.x] != 15 && table[c.y][c.x] != 0) - { - mutation_selected(c, mutation_menu, table); - getkey(); - } - + if (key == KEY_EXE && table[c.y][c.x] != 15 && table[c.y][c.x] != 0) mutation_buy(current_game, c, mutation_menu, table); + if (key == KEY_LEFT && c.x > 0) c.x--; if (key == KEY_RIGHT && c.x < 7) c.x++; if (key == KEY_UP && c.y > 0) c.y--; @@ -154,3 +150,25 @@ void manage_mutation(struct game *current_game, const int mutation_menu) } if (t >= 0) timer_stop(t); } + + +void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]) +{ + int button_selected = 0, end = 0; + int key = 0; + + while (!end) + { + mutation_selected(c, mutation_menu, table, button_selected); + key = getkey().key; + + if (key == KEY_DOWN || key == KEY_UP) button_selected = (button_selected + 1) % 2; + if (key == KEY_EXIT) end = 1; + if (key == KEY_EXE) + { + if (!button_selected) end = 1; + // else evolution + } + + } +} diff --git a/src/core.h b/src/core.h index b6e9545..71e66a8 100644 --- a/src/core.h +++ b/src/core.h @@ -76,7 +76,10 @@ int rtc_key(void); // callback_timer : basic timer int callback_tick(volatile int *tick); -// manage_mutation : an independant sub-programm which allow to select, buy and see the mutations. -void manage_mutation(struct game *current_game, const int mutation_menu); +// manage_mutation : an independant sub-programm which allow to select and see the mutations. +void mutation_select(struct game *current_game, const int mutation_menu); + +// mutation_buy : UI interface to buy mutations and see informations on them +void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]) #endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index 98e4cc9..7280944 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -99,7 +99,7 @@ void display_mutation(const int table[4][8], const struct cursor c, const int mu } -void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8]) +void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected) { extern const bopti_image_t img_mutations; const int id = table[c.y][c.x]; @@ -135,7 +135,10 @@ void mutation_selected(const struct cursor c, const int mutation_menu, const int dprint(81, 41, C_BLACK, "%d", mutation_data->contagion); dprint(81, 49, C_BLACK, "%d", mutation_data->lethality); dprint(81, 57, C_BLACK, "%d", mutation_data->severity); - + + if (button_selected) drect(81, 2, 123, 8, C_INVERT); + else drect(81, 12, 123, 18, C_INVERT); + dupdate(); diff --git a/src/display_engine.h b/src/display_engine.h index 23898a9..21670df 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -12,7 +12,7 @@ void display_foreground(const int background, const struct game *current_game); // display_mutation : display the mutation selection screen void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu); -// mutation_selected : display the mutation shop -void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8]); +// mutation_selected : display the mutation's informations screen +void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected); #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file -- 2.45.0 From b5206956c67787478c0fa17f0e7f9ea7c7c0fbed Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 29 May 2021 17:02:56 +0200 Subject: [PATCH 09/26] Fix bugs --- Plague.g1a | Bin 45296 -> 45824 bytes src/core.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Plague.g1a b/Plague.g1a index ce87a5ee3743adc65784ebf6bbed1a33b4e93767..a7ed6fa726e49af0afe90b85f4c51c2d26b16518 100644 GIT binary patch delta 4470 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 delta 3933 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 diff --git a/src/core.h b/src/core.h index 71e66a8..dc16d39 100644 --- a/src/core.h +++ b/src/core.h @@ -80,6 +80,6 @@ int callback_tick(volatile int *tick); void mutation_select(struct game *current_game, const int mutation_menu); // mutation_buy : UI interface to buy mutations and see informations on them -void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]) +void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]); #endif /* _PLAGUE_CORE_H */ \ No newline at end of file -- 2.45.0 From dec258a8dcffff5544f5ddfc34e94cb00f8264a2 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 29 May 2021 17:07:37 +0200 Subject: [PATCH 10/26] Minors changes --- Plague.g1a | Bin 45824 -> 45824 bytes assets-fx/bground.png | Bin 23076 -> 23285 bytes src/core.c | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Plague.g1a b/Plague.g1a index a7ed6fa726e49af0afe90b85f4c51c2d26b16518..7c5eeb7bf59950cb259ae002de18b36ae3a210c9 100644 GIT binary patch delta 66 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

`Cwt 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 XQQ76~F!0*x@f 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 Date: Sat, 29 May 2021 23:02:51 +0200 Subject: [PATCH 11/26] Fully operationnal purchase system --- Plague.g1a | Bin 45824 -> 46500 bytes src/core.c | 59 ---------------- src/core.h | 13 ++-- src/display_engine.c | 42 +++++------ src/display_engine.h | 4 +- src/main.c | 17 ++--- src/mutation_data.c | 44 +++++++----- src/mutation_engine.c | 159 ++++++++++++++++++++++++++++++++++++++++-- src/mutation_engine.h | 15 +++- 9 files changed, 223 insertions(+), 130 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index 7c5eeb7bf59950cb259ae002de18b36ae3a210c9..88654ad10b8b1c944d8304268b4fbdb775e2b4ff 100644 GIT binary patch delta 5444 zcmZ`-eNaMgg_#M@L`NdLO?zvxdBw9X-oiHKokOqw9U960RhoQ8#M;j(9-3k zr_Cr_#&Nr-E?OyvwW%iZ>@H`@nWCmG$Jy;a5*rm=XP1uz8D(9!Wtpxiy0hmdMBJX8 zQ0JX{KJLf)-E+^okFHsE@EIF`^bD-MRy@S8 zUkq{!Od4a^c2g(`u0$BYj~nzjfZ?bQgc6}0A*KsqZV(}XT_|CZTSA$$}@f&LQVb%do>gz*GIUqP>o2!uDvz(xt=tOA4u!w3hqg3So4PeNESq&cIx zpt+*?vZvgkE>(@Ib)u~@XQ~V7MF(FxQ{3o&ieBVG&XkU5y{P4-BiWp#vxu5sI+N}t z=|#quM($psUUagu>80`Vy#&3;)OK$@=t-~oUOez_M|}E{G44WwPUJ=;e#$5b&sYkN znq_+w^)Da9XqUnoXHnRRCrnsV*vXzKka5_xuuEYi>;va&=+B#Eeks`6S(nE?wr%S14RObG+gCIfZ7@I{&k5no#HMJmezG&&JB!#1LIH-zo58`%n8c)XbIgUS%GQnY6)oyyd0#PV&bJpG>OPuP`co>1mVplq6}VB zp|iaB1DjdG-^qvW@Yje!&>}jHj`ohzJH_tZ=mKg8Oz6_HPQ zyQ6rCMIyf3(A~^yA{wbF!(;uq6pJ*!H@yF3lY0~BTS2d3 z>PWvRG2^GPGTW*n9=%X6)JUg8ot00}{YrPJf^!8ZRC?ahvm> zC>3$jq4)E^SLM=E&yi#l)YJ0kt&elFq77$e*+(0hUmAYO${)O;{RKZbKwcusRFe|1 zLS&s~A85e#AuA^)abnQVK#l|XBQhjT4mt}`6i7DmNSwUkw}8u-4-NBKKO(zs&6hSd zHXg_g?Vj?X_A#82@Enr4>NghuL84$%^{10G%`|7G12h-vDl}L08#G_m=9j8;LW@hW zyXC#zONz#g(ZYQWbwl?%-zy4qBIA3`lxCjyFeSs2KZO+G4c$|r3h9B%im+oIXZ#7z zMEo}4eW2|^P5E}AI}-eOdwwy?b6eIFid-54fgOo)$7-Y?8R~jLlDm_Al7ULA-P&cT z2c&TK7N0a7kb1)zW?Q9EJrT}!xLFw1;0&=u`;V1AwQ2E*bhcyUTep~IOi15K<)8s4 zM_7DOn=gXFMI(0xYR)u4yxw>M4nV57p=3az;FTuO;d}$obfYNwO3cB0&FxZ^Vf!O3 zY`(y?JcfefLWWBa z;d(bxNTL0yBCPIG3C&rGLabZp)%Jk4*Q-4Z+Gw}Lt9>7|r>WMtMlV7^4w(*~`+Msy zY1R8rYt^aJ@*cydT6OvRTJ_qn@?Hbz%THTCkXpp039XAOm54&snS<~tC@=pAY19ej zh2{y3+6;%yYzMmKFGuUEogp@HZN8PYiL5+ZsFgVvaLh9$yBid+nvrYONK_j>B|GK` zSbbM8@)t(F+~$w`HzP-uA5Ek=Gf5M#9ujXABwmH)woa(I-<+?RZK*F+9j>sS0&ceRae`cdS^L-EX)G1uL=PD+;2qdml0I za>G9g$(5~{nPTMfLSa_Fq5B9U3pWy{L@$!v9tf=EoT1~P6nHv$El2Q%i1X`!47@Ep#BfX)S2}6*Wp>PU^zC-w*p?wAT zuYmuG%0O44ef2xiCS3h?iDl3-q$qGD=|q`J&LVgGpNfnx6|#*>&O(6Up`*}^_I!7L zyH4ct=)%tNnt9G`^xg9eJxBAX{%%~BO+AA)q)#&6=o(+923IZ|&&(G!T>d7PObR0{ zTWA7V+nac{)EUMaX$zmq?5V&K+nee;*5kI^83Eae@wu$DxeuKqj#Hj*((=K7+L!gM0drFvd%xAoXL{u4I$gpG~M zI>o?>J}U}47YVqoOR`j3YDyChFCJR-Cnr6CAEHjr$jl7N*=(DfK_ma($&iadG3l=^ z3pZX}7ML>wzRQ9{hOh|QfjZyiAOz6OFmm&uX}sXi0L{odK&ME2_+QiVYUoV|;k*H7 z04)M2=q|rbb;P5RI(hok(gb=mR(!aUh@Uf?Vy`0{{S<~CLwFtBcvvA2ydT%WvC$3E zn-0ig2iwQ!Qr!ss2OR@ms*?}FE`U)^EQ)XsZ**LMUF;k|Nf5ILa zBVWsRvC{Kg^xC_OVC_7@@{8O;^if728;6;#q&4Pvg6yv_NdzQWAzYXs9*Re7i60Bl z!FkPyAVS4H>8?41*U&Xa_*~_!#H2W-lJ zD2Sv@sgkP-9Q=m-aX!2q04M+lp42niNQRZUtm2p{oht*TO4$VkYPeM846rO|jvlCQtk8?x9t+<;Maomsm;7^q&y6IdsMwl0Qj!uw zS*uSvpArQUHY@`s{LV*1Q=uH@sVHWIa&a^?!2=dAR z_X+M|nv@k#{MD1hj#W_aN%V<&Ssj|HaI9%eJDNx$|C3$VtgUkavO zefM3?k>0|x*;yoKerypMzJfI1Bl(omP58(c5}u|wP-TJygZ#6gGktz1_@He-RCKTd!_=-0%F^FROx zz=+UAxcS?Gx53R6f~d-Yi53vP<^n#4Q1Af4yT#Ccf$*M5go}Zj>`)sK=;p6pz4{r# z4Sfh72HPP%!aJ<=#rse^vC6qhbLG*hhF*G7jbzJP8$wFXg1yr_E^Zhg?QiW>72kp( z$9+)HT`e}kkyL`51nqX9>*U2-s*vKrWz`3u>LbeSDc+6P*#w^{gIwkIr;OaUDF1@! zX8Q6SCaNxa9`(AJ)(D6V>IkVRzWw)1Sv#r(-W6L(-;OkI&g^U=cXm8ycYa51l%%n{ z_++l+_iU+*4DUQlS@fi4rCA7?8zjZ^_!$LeUElg7hlHgY2t3xn|adFLO89k5u-{- z@de=3r0l?b!6=5Nj#D>%$;2E4m=1#Zpbn@Os0-*k5S);Mlf5l@@;o?m!U5m8%liRx zZXOPCg!gRMw4{YlGd+@CwVYg}s@WCq{0MHmoUJ zAOL1`7)S{A0-!RW8lWa1@Zq38{SuE#f+PWeM`4`NG0;nZF9FQ~jf0#+?5#2EAqjD` zCdi8hS3oJc{#yGyCpq+Sz-zB(?)uR@_BFZp*tcwkkt`fLCCxCxa_xgf2>w~X(y3~D zdLq~2);m!9&eDwa{%|XXbs>c9V_tK9CqU#_Hi9}|hZ3lHxXWvf19M#eiaD+p38~qB z6U;kso(vGpTrulhh)>PKur->6S9*T~t6d0hX!45)r_pjq{Y^bR>l3kZ*lWVWeF*3J z+OK@6TQ0mp+(`Wy4J*Bg};^icv2geu-v{#b?dd4H>`EdN`bzP_ohUDt zb0HZpM-_Keg8B8qLza8j01pCUmWeKcPHKeb>;ArVs{L#AuXB=|r{*~@Q_upJc^GgS-U1l|b0-z(z|@6~Kp}_0J0;`=HAgR-eEWzH z1&0N55>a+Wv7MN^(|LgrSXvRbv~k8$S2cp+en{W}F5+`DllHC-;dg6*P5})-nN|X& zL)(FH8`Og~u(jDiR}9p~-5fd22<+fzA0S!R%ofw6_oWY0dVkmmrJ~-qJ$@bKREO(Y vUsrkCcpvny9)G3BKY98}?^jYE{|_I6vh;2yP!doy;$v=rrgt2v9v%8$F`g&u delta 5136 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 A!2kdN diff --git a/src/core.c b/src/core.c index b9554cb..d0496e3 100644 --- a/src/core.c +++ b/src/core.c @@ -113,62 +113,3 @@ int callback_tick(volatile int *tick) return TIMER_CONTINUE; } - -void manage_mutation(struct game *current_game, const int mutation_menu) -{ - int key = 0, end = 0; - struct cursor c = {0, 0, 0}; - - static volatile int tick = 1; - int t = timer_configure(TIMER_ANY, CURSOR_TICK*1000, GINT_CALL(callback_tick, &tick)); - if (t >= 0) timer_start(t); - - - while (!end) - { - // Cursor blinking gestion - while (!tick) sleep(); - tick = 0; - c.display = (c.display + 1) % 2; - - // Get and display the mutation menu - int table[4][8]; - get_mutation(current_game, mutation_menu, table); - display_mutation(table, c, mutation_menu); - - // Get the key - key = rtc_key(); - - // Manage input - if (key == KEY_EXIT) end = 1; - if (key == KEY_EXE && table[c.y][c.x] != 15 && table[c.y][c.x] != 0) mutation_buy(current_game, c, mutation_menu, table); - - if (key == KEY_LEFT && c.x > 0) c.x--; - if (key == KEY_RIGHT && c.x < 7) c.x++; - if (key == KEY_UP && c.y > 0) c.y--; - if (key == KEY_DOWN && c.y < 3) c.y++; - } - if (t >= 0) timer_stop(t); -} - - -void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]) -{ - int button_selected = 1, end = 0; - int key = 0; - - while (!end) - { - mutation_selected(c, mutation_menu, table, button_selected); - key = getkey().key; - - if (key == KEY_DOWN || key == KEY_UP) button_selected = (button_selected + 1) % 2; - if (key == KEY_EXIT) end = 1; - if (key == KEY_EXE) - { - if (!button_selected) end = 1; - // else evolution - } - - } -} diff --git a/src/core.h b/src/core.h index dc16d39..fdf14e5 100644 --- a/src/core.h +++ b/src/core.h @@ -20,9 +20,10 @@ struct game // DNA points int dna; - // Mutations counts and sprite selected - int abilities, symptoms, transmissions; - int abilities_sel, symptoms_sel, transmissions_sel; + // Mutations counts, mutations selected, mutations bought (symptoms; abilities; transmissions) + int mutations_count[3]; + int mutations_selected[3]; + int mutations_bought[3][14]; // Research data int research, limit; @@ -76,10 +77,4 @@ int rtc_key(void); // callback_timer : basic timer int callback_tick(volatile int *tick); -// manage_mutation : an independant sub-programm which allow to select and see the mutations. -void mutation_select(struct game *current_game, const int mutation_menu); - -// mutation_buy : UI interface to buy mutations and see informations on them -void mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]); - #endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index 7280944..0e36e00 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -39,6 +39,9 @@ void display_foreground(const int background, const struct game *current_game) break; case 3: + + dprint(1, 35, C_BLACK, "C:%d S:%d L:%d", current_game->contagion, current_game->severity, current_game->lethality); + dprint(102, 37, C_BLACK, "%d", current_game->dna); length = 67 * current_game->contagion / 26; @@ -53,9 +56,9 @@ void display_foreground(const int background, const struct game *current_game) dline(57, 60, 57 + length, 60, C_BLACK); dline(57, 61, 57 + length, 61, C_BLACK); - if (current_game->symptoms_sel) dsubimage(5, 15, &img_mutations, 0, 16 * (current_game->symptoms_sel - 1), 15, 15, 0); - if (current_game->abilities_sel) dsubimage(35, 15, &img_mutations, 16, 16 * (current_game->abilities_sel - 1), 15, 15, 0); - if (current_game->transmissions_sel) dsubimage(65, 15, &img_mutations, 32, 16 * (current_game->transmissions_sel - 1), 15, 15, 0); + if (current_game->mutations_selected[0]) dsubimage(5, 15, &img_mutations, 0, 16 * (current_game->mutations_selected[0] - 1), 15, 15, 0); + if (current_game->mutations_selected[1]) dsubimage(35, 15, &img_mutations, 16, 16 * (current_game->mutations_selected[1] - 1), 15, 15, 0); + if (current_game->mutations_selected[2]) dsubimage(65, 15, &img_mutations, 32, 16 * (current_game->mutations_selected[2] - 1), 15, 15, 0); break; case 6: @@ -99,31 +102,12 @@ void display_mutation(const int table[4][8], const struct cursor c, const int mu } -void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected) +void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected) { extern const bopti_image_t img_mutations; const int id = table[c.y][c.x]; - extern struct mutation symptoms_data[14]; - extern struct mutation abilities_data[6]; - extern struct mutation transmissions_data[13]; - - struct mutation *mutation_data; - - switch (mutation_menu) - { - case 1: - mutation_data = &symptoms_data[id - 1]; - break; - - case 2: - mutation_data = &abilities_data[id - 1]; - break; - - case 3: - mutation_data = &transmissions_data[id - 1]; - break; - } + struct mutation *mutation_data = get_mutation_data(mutation_menu, id); dclear(C_WHITE); @@ -140,8 +124,14 @@ void mutation_selected(const struct cursor c, const int mutation_menu, const int else drect(81, 12, 123, 18, C_INVERT); dupdate(); - - +} + + +void output_error(const char *msg) +{ + dclear(C_WHITE); + dprint(0, 0, C_BLACK, msg); + dupdate(); } diff --git a/src/display_engine.h b/src/display_engine.h index 21670df..0ef9459 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -13,6 +13,8 @@ void display_foreground(const int background, const struct game *current_game); void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu); // mutation_selected : display the mutation's informations screen -void mutation_selected(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected); +void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected); +// output_error : display text +void output_error(const char *msg); #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index a161c31..2396119 100644 --- a/src/main.c +++ b/src/main.c @@ -1,9 +1,9 @@ /* - Name ..............: Plague + Project name ......: Plague Version ...........: - dev - - Last modification .: 24 May 2021 + Last modification .: 29 May 2021 - Code provided with licence : + code provided with licence : GNU General Public Licence v3.0 */ @@ -14,6 +14,7 @@ #include "core.h" #include "display_engine.h" +#include "mutation_engine.h" // title_screen : display the title screen @@ -43,11 +44,11 @@ int main(void) .severity = 0, .lethality = 0, - .dna = 0, + .dna = 100, - .abilities = 1, .abilities_sel = 0, - .symptoms = 1, .symptoms_sel = 0, - .transmissions = 1, .transmissions_sel = 0, + .mutations_count = {0, 0, 0}, + .mutations_selected = {0, 0, 0}, + .mutations_bought = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, .research = 0, .limit = 100, @@ -110,7 +111,7 @@ void main_loop(struct game *current_game) if (background == -1) end = 1; if (background == 5) { - manage_mutation(current_game, mutation_menu); + mutation_select(current_game, mutation_menu); background = 3; } } diff --git a/src/mutation_data.c b/src/mutation_data.c index f298398..28410b1 100644 --- a/src/mutation_data.c +++ b/src/mutation_data.c @@ -1,5 +1,25 @@ #include "mutation_engine.h" + +const struct mutation symptoms_data[14] = +{ + {1, 1, 0, 2, 0, "NAUSEE"}, + {3, 2, 0, 4, 0, "VOMISSEMENT"}, + {2, 1, 0, 3, 0, "TOUX"}, + {2, 2, 0, 4, 0, "PNEUMONIE"}, + {4, 2, 5, 15, 1, "TUMEUR"}, + {2, 1, 0, 3, 0, "PLAIES"}, + {5, 4, 0, 10, 0, "LESIONS"}, + {5, 15, 15, 20, 0, "HEMORRAGIE"}, + {6, 7, 6, 17, 0, "INFECTION"}, + {2, 2, 2, 5, 0, "INFLAMMATION"}, + {2, 6, 4, 12, 1, "IMMUNITE"}, + {0, 4, 0, 5, 1, "PARANOIA"}, + {6, 15, 0, 20, 2, "FOLIE"}, + {0, 20, 25, 30, 2, "ARRET TOTAL"}, +}; + + const struct mutation abilities_data[6] = { {4, 0, 0, 10, 0, "FROID"}, @@ -10,23 +30,6 @@ const struct mutation abilities_data[6] = {0, 2, 2, 15, 1, "MEDICAMENT"}, }; -const struct mutation symptoms_data[14] = -{ - {1, 1, 0, 2, 0.5, "NAUSEE"}, - {3, 2, 0, 4, 0.5, "VOMISSEMENT"}, - {2, 1, 0, 3, 0.5, "TOUX"}, - {2, 2, 0, 4, 0.5, "PNEUMONIE"}, - {4, 2, 5, 15, 1, "TUMEUR"}, - {2, 1, 0, 3, 0.5, "PLAIES"}, - {5, 4, 0, 10, 0.5, "LESIONS"}, - {5, 15, 15, 20, 0.5, "HEMORRAGIE"}, - {6, 7, 6, 17, 0.5, "INFECTION"}, - {2, 2, 2, 5, 0.5, "INFLAMMATION"}, - {2, 6, 4, 12, 1, "IMMUNODEFICIENCE"}, - {0, 4, 0, 5, 1, "PARANOIA"}, - {6, 15, 0, 20, 2, "FOLIE"}, - {0, 20, 25, 30, 2, "ARRET TOTAL"}, -}; const struct mutation transmissions_data[13] = { @@ -42,5 +45,8 @@ const struct mutation transmissions_data[13] = { 6, 0, 0, 16, 0, "OISEAU 2"}, { 1, 0, 0, 8, 0, "SANG 1"}, { 4, 0, 0, 14, 0, "SANG 2"}, - { 9, 0, 0, 20, 0, "SANG 3"}, -}; \ No newline at end of file + { 9, 1, 1, 20, 0, "SANG 3"}, +}; + + +const struct mutation default_value = {0, 0, 0, 1, 0, "VIDE"}; \ No newline at end of file diff --git a/src/mutation_engine.c b/src/mutation_engine.c index a4dc60b..c33297a 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -1,3 +1,9 @@ +#include +#include +#include + +#include + #include "mutation_engine.h" void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]) @@ -19,27 +25,168 @@ void get_mutation(const struct game *current_game, const int mutation_menu, int if (mutation_menu == 1) { - if (current_game->symptoms < 4) init_mat(8, 4, table, mt_symptoms_1.data); - else if (current_game->symptoms < 8) init_mat(8, 4, table, mt_symptoms_2.data); + if (current_game->mutations_count[0] < 4) init_mat(8, 4, table, mt_symptoms_1.data); + else if (current_game->mutations_count[0] < 8) init_mat(8, 4, table, mt_symptoms_2.data); else init_mat(8, 4, table, mt_symptoms_3.data); } if (mutation_menu == 2) { - if (current_game->abilities < 2) init_mat(8, 4, table, mt_abilities_1.data); - else if (current_game->abilities < 4) init_mat(8, 4, table, mt_abilities_2.data); + if (current_game->mutations_count[1] < 2) init_mat(8, 4, table, mt_abilities_1.data); + else if (current_game->mutations_count[1] < 4) init_mat(8, 4, table, mt_abilities_2.data); else init_mat(8, 4, table, mt_abilities_3.data); } if (mutation_menu == 3) { - if (current_game->transmissions < 5) init_mat(8, 4, table, mt_transmissions_1.data); - else if (current_game->transmissions < 10) init_mat(8, 4, table, mt_transmissions_2.data); + if (current_game->mutations_count[2] < 5) init_mat(8, 4, table, mt_transmissions_1.data); + else if (current_game->mutations_count[2] < 10) init_mat(8, 4, table, mt_transmissions_2.data); else init_mat(8, 4, table, mt_transmissions_3.data); } } +void mutation_select(struct game *current_game, const int mutation_menu) +{ + int key = 0, end = 0; + struct cursor c = {0, 0, 0}; + + static volatile int tick = 1; + int t = timer_configure(TIMER_ANY, CURSOR_TICK*1000, GINT_CALL(callback_tick, &tick)); + if (t >= 0) timer_start(t); + + + while (!end) + { + // Cursor blinking gestion + while (!tick) sleep(); + tick = 0; + c.display = (c.display + 1) % 2; + + // Get and display the mutation menu + int table[4][8]; + get_mutation(current_game, mutation_menu, table); + display_mutation(table, c, mutation_menu); + + // Get the key + key = rtc_key(); + + // Manage input + if (key == KEY_EXIT) end = 1; + if (key == KEY_EXE && table[c.y][c.x] != 15 && table[c.y][c.x] != 0) + { + end = mutation_buy(current_game, c, mutation_menu, table); + } + + if (key == KEY_LEFT && c.x > 0) c.x --; + if (key == KEY_RIGHT && c.x < 7) c.x ++; + if (key == KEY_UP && c.y > 0) c.y --; + if (key == KEY_DOWN && c.y < 3) c.y ++; + } + if (t >= 0) timer_stop(t); +} + + +int mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]) +{ + int button_selected = 1; + int key = 0, id = table[c.y][c.x]; + + struct mutation *mutation_data = get_mutation_data(mutation_menu, table[c.y][c.x]); + + while (1) + { + display_mutation_buy(c, mutation_menu, table, button_selected); + key = getkey().key; + + if (key == KEY_DOWN || key == KEY_UP) button_selected = (button_selected + 1) % 2; + if (key == KEY_EXIT) return 1; + if (key == KEY_EXE) + { + if (!button_selected) return 0; + else + { + // if the player has'nt bought this mutation yet + if (!current_game->mutations_bought[mutation_menu - 1][id - 1]) + { + // if the player has enought DNA points + if (current_game->dna >= mutation_data->dna) + { + // Take DNA points and save the purchase + current_game->dna = current_game->dna - mutation_data->dna; + current_game->mutations_bought[mutation_menu - 1][id - 1] = 1; + current_game->mutations_count[mutation_menu - 1] ++; + current_game->mutations_selected[mutation_menu - 1] = id; + + // Update + update_disease(current_game); + } + else {output_error("Achat impossible"); getkey();} + } + + // if the player has already bought this mutation + else + { + current_game->mutations_selected[mutation_menu - 1] = id; + update_disease(current_game); + } + + } + return 1; + } + } + return 0; +} + + +void update_disease(struct game *current_game) +{ + struct mutation *symptom = get_mutation_data(1, current_game->mutations_selected[0]); + struct mutation *ability = get_mutation_data(2, current_game->mutations_selected[1]); + struct mutation *transmission = get_mutation_data(3, current_game->mutations_selected[2]); + + dclear(C_WHITE); + dprint(0, 0, C_BLACK, "SY C:%d S:%d L:%d", symptom->contagion, symptom->severity, symptom->lethality); + dprint(0, 8, C_BLACK, "AB C:%d S:%d L:%d", ability->contagion, ability->severity, ability->lethality); + dprint(0, 16, C_BLACK, "TR C:%d S:%d L:%d", transmission->contagion, transmission->severity, transmission->lethality); + dupdate(); + getkey(); + + current_game->contagion = symptom->contagion + ability->contagion + transmission->contagion; + current_game->severity = symptom->severity + ability->severity + transmission->severity; + current_game->lethality = symptom->lethality + ability->lethality + transmission->lethality; +} + + +struct mutation *get_mutation_data(const int mutation_menu, const int id) +{ + extern struct mutation symptoms_data[14]; + extern struct mutation abilities_data[6]; + extern struct mutation transmissions_data[13]; + extern struct mutation default_value; + + if (!id) return &default_value; + + struct mutation *mutation_data = &default_value; + + switch (mutation_menu) + { + case 1: + mutation_data = &symptoms_data[id - 1]; + break; + + case 2: + mutation_data = &abilities_data[id - 1]; + break; + + case 3: + mutation_data = &transmissions_data[id - 1]; + break; + } + return mutation_data; +} + + void init_mat(int x, int y, int dest[][x], int src[][x]) { for (int i = 0; i < x; i++) diff --git a/src/mutation_engine.h b/src/mutation_engine.h index a132110..206ba50 100644 --- a/src/mutation_engine.h +++ b/src/mutation_engine.h @@ -2,6 +2,7 @@ #define _MUTATION_ENGINE_H #include "core.h" +#include "display_engine.h" // mutation_table : contain the map of the mutation available struct mutation_table @@ -23,10 +24,20 @@ struct mutation // get_mutation : return the mutation table to display void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]); +// manage_mutation : an independant sub-programm which allow to select and see the mutations. +void mutation_select(struct game *current_game, const int mutation_menu); + +// mutation_buy : UI interface to buy mutations and see informations on them +int mutation_buy(struct game *current_game, const struct cursor c, const int mutation_menu, const int table[4][8]); + +// update_disease : update the disease parameters +void update_disease(struct game *current_game); + +// get_mutation_data : get the information from a mutation +struct mutation * get_mutation_data(const int mutation_menu, const int id); + // init_mat : copy src into dest (for int) void init_mat(int x, int y, int dest[][x], int src[][x]); -// char_init_mat : copy src into dest (for char) -void char_init_mat(int x, char dest[x], char srx[x]); #endif /* _MUTATION_ENGINE_H */ \ No newline at end of file -- 2.45.0 From 51adb19ba126c3539b09d7bb83603014682b55da Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 29 May 2021 23:10:09 +0200 Subject: [PATCH 12/26] Real-time clock for DNA points --- Plague.g1a | Bin 46500 -> 46532 bytes src/core.c | 7 +++++++ src/display_engine.c | 3 --- src/main.c | 2 +- src/mutation_engine.c | 7 ------- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index 88654ad10b8b1c944d8304268b4fbdb775e2b4ff..d5aba1d664aedd6375547b977fb045ea71fb6a5e 100644 GIT binary patch delta 4034 zcmZ`*4NTnS8Gqm74(`fF?Y`g2CJF~At_V59^Yiw+pgI(E}0boTAHmc<_X_CVs% zf>TRH2VY-vI5FqCF2)yQXC`Kf-c?amWocQmWF1YcT32Ly?ei*&J827h?Njl6bY9w@ zE!i#nYA7qa%5rrYz5lcdyJEB6rPxiyjqxz+YH30s9SLxW4INuzJxg? z1~5<1JfydMRPmT%bsO;6J``c?56)ILHZ~sJvG$cOq&1_rIvK5Vi*vCbSTUYlp9uE? zlL-=@xX-e%@R8M%Qt3k4wU2_osA@ID+fA^S64-Rd|8o;UcoFIRHGKP!PH8Wt?bm<_ zU?!4&(VMU{{w{41O1N!xGm7hAlmOrH13(*W7DQ<6#SMLo*3L6}HyJ?x66ht+LD0(* z=wC@z2F-i<{aACg97mVSk-rL_EJrgCJAx9d*2*sdLl*dyoJ41o2_slTz!_0zJ!z8L zB!wD(YZDXJd&R8vgsD|-CPpQrqJDka%9ql){tdqM2BQoe#+(98hoTWMqwitl!sN@F z@f|mz>*cQen~ePnMM3v$6uXl@}HNp2R4*9(!3(Cn0SJsn> zl}1J>HmRDpx185+R| zia>sf0tb`mFb(`UGXaK1|#g;8-$7~xG&^QH5GCDQKs121`8Vz}c5^$z*!!e|NL7AX+ zIs>xrSP-|i*sVxoVjq&d_%VN2E;~}>92d5NQa&yk3YvJcm@N1WcZs^fizZlUXQyJ^ zdP2wDqP6I{sh-iZ5FGc3vf^z}?0;30KMc|>Y6Y_NkZ<>*Z z7;WoPhIagw8wwfioKk$Qdvvl}`k?45*=8*?nqxx1jO55VmrV(k+~)i{aii>Q(=Bao zzYK}yM|PSPFk{RXU!#xQF)T9L(5VD=ZR38_dTuy9rvgxFmP!~3D;X64#kbzY=wKau z%`+OttrByKu{D^{V-ED^7}YXHd(BAa1U5SAGG_Mj<;zzX9T{QN1lh?P$Oq*W@p;@- z{KxUmcm5H7AgoL>6YXXI{$$qM<#V*nP6DH=^GQ zObT1MJw6!b41hBt+~xUl0rqv_ZVM`%<+pi?8c-w{xqe!S!%5fPZ>+1NB{&zPdz=fW zE3W?^$+3Mk1{vz02<~$lR99kQ-`BeR$>P?2C(jYdl^^k9FiteJqoYh`57-|3&nx|AjRL+#!zDG?~U2 z)l_3?9U@e7Ci+);wffs?)3`iAhiyO{5-gu1D2CcTG5GT*c%RTez8C-Q$7^_>GKhcP zf2Qse)3_E7w5ID0aGOGh&T~sYqeJf1Lnxsqn{*jD+Ua(;2;LmhqvCm5a4Rfp7CFz+fVbKo<7LyHE}LkasaNWb|AA-N7@dIdL_N>}^aB9^)#PDn9wCBDADVC2umHnU?m#pYj+J%b#Hz@^cLE{s2}lQw_?`!?6QN&ZayrwL zml9k_NBQKcen4?Gy=_>zTa}sCQr*g@pi_6aPvo@uEj|Pq7$|3Ed0@gpM^BG6jXbxI zn;}`2Y9o&u5iv%AkSZ=chh)r!gQ}{f%*H;lBDS|NqZ9|GA>K*?8$N4B6UqM;E+JGB0?E;_U$1S~3Z zFC5m1VPA&duu8gCGxer}$`B(hN$rp~2Xsw@33_js?*LWzcvz;sTNrr@@h#^PY1(Ya zyB&2bgGivK!H)qVEt0w3Fhgcl+NG%9P7}L*cY)L5uDe)BMw6?p+d$Gy}d2QSxQD5f8GEB`=ac zE$`%A2}7j7MmTjoIZdpMU(J(TBnyB7^hpKjAOfud$!81mq^@)#7a3Fb z5vXht$5LPNw}VPuE%%yZIL*l4tr%ar;*@W}p)qAN z;N_d^ao78R-vMK|3|v4J`g4q$9ROs_6W|>Ox|RCjQ``Wxz?hg;+Wjvu_4S~-#UC}` zV0xx7^0`bUkDivbb9bYsU{gE4%%ms7$pt^sq)w#KNt_u?)xd6GJBuP^On5G3_VgRX I;>h6t0Kn+L-2eap delta 3993 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 diff --git a/src/core.c b/src/core.c index d0496e3..7338ccb 100644 --- a/src/core.c +++ b/src/core.c @@ -43,6 +43,13 @@ void next_frame(struct game *current_game) } } current_game->time += ENGINE_TICK; + if (current_game->time > 10000) + { + current_game->dna += 1; + current_game->time = 0; + + // Epidemic propagation simulation to add here + } } diff --git a/src/display_engine.c b/src/display_engine.c index 0e36e00..b36070b 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -39,9 +39,6 @@ void display_foreground(const int background, const struct game *current_game) break; case 3: - - dprint(1, 35, C_BLACK, "C:%d S:%d L:%d", current_game->contagion, current_game->severity, current_game->lethality); - dprint(102, 37, C_BLACK, "%d", current_game->dna); length = 67 * current_game->contagion / 26; diff --git a/src/main.c b/src/main.c index 2396119..6e4699b 100644 --- a/src/main.c +++ b/src/main.c @@ -44,7 +44,7 @@ int main(void) .severity = 0, .lethality = 0, - .dna = 100, + .dna = 0, .mutations_count = {0, 0, 0}, .mutations_selected = {0, 0, 0}, diff --git a/src/mutation_engine.c b/src/mutation_engine.c index c33297a..c534c93 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -145,13 +145,6 @@ void update_disease(struct game *current_game) struct mutation *ability = get_mutation_data(2, current_game->mutations_selected[1]); struct mutation *transmission = get_mutation_data(3, current_game->mutations_selected[2]); - dclear(C_WHITE); - dprint(0, 0, C_BLACK, "SY C:%d S:%d L:%d", symptom->contagion, symptom->severity, symptom->lethality); - dprint(0, 8, C_BLACK, "AB C:%d S:%d L:%d", ability->contagion, ability->severity, ability->lethality); - dprint(0, 16, C_BLACK, "TR C:%d S:%d L:%d", transmission->contagion, transmission->severity, transmission->lethality); - dupdate(); - getkey(); - current_game->contagion = symptom->contagion + ability->contagion + transmission->contagion; current_game->severity = symptom->severity + ability->severity + transmission->severity; current_game->lethality = symptom->lethality + ability->lethality + transmission->lethality; -- 2.45.0 From 3236732ea895f1ce8c0490066a5f4a0ec6b4ed43 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sun, 30 May 2021 18:56:22 +0200 Subject: [PATCH 13/26] Add message and adjust timers --- CMakeLists.txt | 1 + Plague.g1a | Bin 46532 -> 48108 bytes assets-fx/bground.png | Bin 23285 -> 5113 bytes assets-fx/dna.png | Bin 0 -> 9522 bytes assets-fx/mutations.png | Bin 15531 -> 15723 bytes src/core.c | 30 ++++++++++++++++++++++++++++-- src/core.h | 17 +++++++++-------- src/display_engine.c | 31 ++++++++++++------------------- src/display_engine.h | 8 ++++++-- src/main.c | 6 +----- src/mutation_engine.c | 6 +++++- 11 files changed, 62 insertions(+), 37 deletions(-) create mode 100644 assets-fx/dna.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c2b79c..294350e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,7 @@ set(ASSETS_fx assets-fx/mutations.png assets-fx/cursor.png assets-fx/title.png + assets-fx/dna.png assets-fx/mutations_table/abilities_1.txt assets-fx/mutations_table/abilities_2.txt assets-fx/mutations_table/abilities_3.txt diff --git a/Plague.g1a b/Plague.g1a index d5aba1d664aedd6375547b977fb045ea71fb6a5e..aaaa1f417ee3502fe8c6ab1284af71503812a5fb 100644 GIT binary patch delta 8683 zcmb_g4^)#^mVe)uKmtKX!XG0>5)%HYNFMkHiVBHRL5c!G)v>e#6%Z^USZu*E4XqxV zp3(B>v2LfsTDo$q$8jn)R_WHAWu~l$v!|z%IBKoK%pe2Gj%N)%He(&A;?!E86-@WgBUmUp0PyCG!KYixk&$ij#IvV8qEBsyg#^uTieX2b?Nw%CO zC8w=SK9_rn<3F0P-{X=v>$)>?WneL(1loraE(dfpv`Vg&_Y%Uj5c=T+A^yE`B~Qlm zr~{3DR5M2EykpKgCe+vi6JYmI4fImM4_$wXP>F~9(3h0Z4Q4_g&m#7BBpkM3XR zwP=f?e5%}j&8oL3nu@EY%1>O=Srmv83D1L$MPsBh@>rx|)5od%2=7za{_Rnn2k9+R^?)%mEiK6O0fOv%5<8nv

Z{YzTD&9 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 delta 6962 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 diff --git a/assets-fx/bground.png b/assets-fx/bground.png index 2a727f54055da7ca87cdc944254587bba15f2d58..3df997a8c7b9d40306c2daf6c5a0de88dfb220f3 100644 GIT binary patch literal 5113 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 P=mSLkQ+g%Gog@DPTutJ; diff --git a/assets-fx/dna.png b/assets-fx/dna.png new file mode 100644 index 0000000000000000000000000000000000000000..5d515bd681fc919fe9dbce1bb1bca3b29197adf7 GIT binary patch literal 9522 zcmeHLXH=70v!)8tQKXm9K@21$5D2}46ggB8R6-JZi6ls07T*nz9JOLPYH(Lj1Gyvy?K?Bfu2U{W{{8Vv@!()Le z_Xj77OmLEKl$;cW$*x(8tGjD#;Y*8O)8kfgXH))L0y-)iJ?T3CR-xnLX^BNU-c1mYEdyRuLKTfRv7#R5ab$NyLSR>=iGy4T#=o9e09l3e9w+pr6&;AoaM$OgWc?>$`m&18K0RVeG9dF?G5$U!Q#ut9M4nt4+91zN*@CK1Kpp z-fSMYR>ff#=biRWS|=Lo2YmwN$-kBEt*l<_A-Vk4@blMn^D!R#pL6+s zKlFhy$5C-TRCto$ z9iC8;r_PmrtS7!iqkroapfZ8Ju(vYa04u*bQ`b4XKQ+BGFoI!@vd?45k;>8Y7PKK% zGUKA@GrQqZyl30@-o7I7md|RvCChhxF|%R|7^Dg@5@GH(^IJfqHMCs5Y>7J6*V?DlKlC@I+1q({|Ge&#rd{(QA}yWx2Mrf%b#ghqpv;BQ(J_`=CeU4bDTC}!N8ds(pzpeAs-p!SkOW5+zM&>{5XgN?w@Gq(}eG`TE-8||MPbeR}CYxj> zCtUn^;ssNGfjXVBi&WC;%Z8D0`A>Ee4a0{ijFJ!9y8z0v#iBCAdpY_X4O$v&KEZ+MQA z(nq6jGT(I~Dp-yf>(}<&q7t`AiNP9U?Q-87W^iwiY)l4ima32?tYzrPIbKfu5%S*I zN(9@RBdKt!*NWI+5G4h9z#qB-o!BT<*fbpzi2%Dj zIEn5qxQ403mXSwtMd{*w(gxzoDmLc#^M$I#0UurNtSOFev;aJuMpo9@6PJMIA%To!+8EV3a?b_w8=)5+Lm#?Xeja7X z+7T+<8*k=KtJu{3j2TF-o4Qet>@~Xeklcujk1fOND!MnjLh89loEP;&4RMO+o#7m7 z)0)0Wy18vbP$Pvlr7pSnG=u|OCxO4UDCn8J=gITfto&xaN)ISgZKjm4^rGC5N= zK03=u^8_t3`HX|r+-iTky5C)wE-L7$oQt)r zIYEZNhn6)J?gxyNt<Cze6e~kFy32>haoEx-|~2wf@Tnh zBzv!n4HnK9Uao)US~dy*8o`vtvlYAax~)}Ae3{9h$^K@%q7ByWdat_V)t*o^gf8B9 zQ;n8B3L>3|UM|#>Y^=Zg*&SE=G>lqMMfVBKBuoM1BPmx3g@(_od~EWm77XNIEpn-y z>_L+UAa$(RTzh=Y`{@Y(e)GBr3S;f3# z)PXcmg|4vzelW?23J=(hq>26EOuBH^U0wM=Qk(ba`5HPSY^Tq3tUl5W#9Q4d7}rEI z4;M#u>Z9S0dD-gw0!9$xc11C|@nmwe?A<9kKWWXIn<^w(*B7P%EJa3{*CIW)t)WXT z_h^-)_kmJ@3e0w_`X(QwYEUQfxYQ^OB=zI+$hUTDNi)X2$xW9PJ^;o*lNeA2BoyE~>1qtW4rnKn4*J7o#vV+HBQ$iwcyy1q%2fSVX zjo90+7Tpql>p>~f*xF|nzm@8x@I*zq1r5C;Rpc~6>NUS!COpHaDl3xNJU>#vnzd4` zI6Ey4yCZy4W+cZCTn#w8QqH<90(+NG(;i8dJ;rnkd>8ax1 zJ*NQ-HFYQ17BMx*C+N|1?ilR_zLFJCRy?)NK^(RL}w>J!&= zTH=R(muw8*!$UWA(pUN&kojDJ723Wx1~Lt}I5RH2_+IwSfH7t_wfTPQ>w^N3&6?2+ zmI9X@+CbkgWqcfZoLbLC-@VEl4S)#KbosN9wlHXOa&ol$S8Go`!wM1^(q(L2a+cjD z=d&qICb~qIdw*XZGi0>TT>9wwb@7nBl7T?phlaq%=GPi}m)cZYts@;}y@kg;I|l`a z9wBg%5R#qT=MGwW&SX?tm%oPu*bh2}*ezpX3%lYk>b+QGu(4lD!BlMNG7P6D+}1e1 zv+DjfS*Hnx97_*qcwN;~*yZ{t^`d|^3z&NGVwsB&f*hf>(Ev6<{`NdH?>T-;sgiVU zjYOz%c&WKDf^OPgw$2CMM33S?VGx(qC12EekkL;fqU_13pDFhbHm!LMIsPnJt`*gv zJ7<4R!9_-Tx`~^tn|HZ|>$)J{QVvDd+)K?b{U%J#zUE7S-c|CX*I$Fhd+ap6Fc5NL;HzzGgTJDT?I+Rc!Ml4Jo>Ypq}AvS zTE<&92hc3bpk3sNO0W=YqcVb4BS$MY*#SwrL|VFB#;>vJz#0>28$@rN7}Lx z$EDmc*yZPy$$D?Th2~-M6U}*C0E&9|G*WsUzPV@-WHj0H(2MUAa86K}?xkRy_Jw5H z6rn4N6PGhUt(}pNkZ)X_@aOlM`KFSX+bR{Ud%Km%va-cg@b#7D`!YrB&vpC0EJh_= z`j=cT)t~3+qra0Jydvr7 ziPR>pV7Po(cRp0xI(Rm${k&p_PFa2Az3Bj_@fyAkq90##MX`KxP~YeMU(Hn&cBXMC zkx7lDrN=44$t%rdHsogNkTa?$E$6%22rY_hJ#rhKRNFGb@rkpzJYAsDi-$^;9KfTT<9&5Q}LS)op5_PizGX>pSMb?h!U&&$C~@e=&$8JN3< zH(OQWRKE@d_U{6_sI0ZUdQr&Y_%iy6;5cOR=0e$CGu8KC8FP?V!$iv)&SbhZW&>*) zT}b2$q_}|7MM|wkO!*aQkWHrLA!V(on;+lTJYxjSu)1@s8Iwt<;2@3rQvVYGI$-~4 zqT2n7(WC%%-!|oWon8$KRwsXt;pdB@kvXeNG)8Em88PAsH@x!ezzSQ;7h7vB(^*hM zhdSadB~_wf^H<6S%=fXC*J8f0EK8T1y5dz{pa0=QcYX->jS|PoFG)=exN<@1VpvR5 z#HG$Wk;&{emO@{TS45Gv2X)^+tlfC@j&xHMpU05oRu{e4m+4UW&On1|`tr}MHjfCzJWn19E++{DkmPGog`!p z;2b_Id5}T`Fg_5MbC*x_fYql?xndYC6l3f6`s;6r3!TAIAW?XNCVG3?I@|wqs-Z^M z;nfKc9UctdPGn`dN2|KeCw^!$X*-F2G7LfNFw z9S9A|wAkZq>;>2lfo`E!{1yHnAa}%;#BSoeD#yDv5m;pOZs{ZXT`LfU#E`3_Uxfj6 zLHT$_Hna6&zKucRlf{=3$Pk3Jv<{LZ$0BS{KzoXmx5sYz;kXn(oEOnhEx`ErQQo!C z26}T4UF^&DODuus9|s3kz1g!+ZgNqbWK>sTTOD$Wd(YH}e1jkhZwl0Af5njJ_yLi& znY0rz*Ck9wrN(Wh67=<+OcId+p@I^ga}(S}EkEV<{1rYu=SSX>HM&1{NqR-_1@(jK z!Kj`-Cd1B0VGcRzEAz_VVbNJGzMLsvI2wIp=-h?x(EBQL&(eV})3{{~ysRgCIX9Y{ zlb0h8_{h&qW=63AA}%OjydH_l**C_zb{!e2bR}gAvP}6yLv2J!7v#j3L%1$9hG=|c zBYE01SavfHERP&(NF}OYd1r?w{S7tTakaucx^@<(!BRfl4RXkNBJuWvnVn#Msuhcs(eGM0v!h*~v>Uc|=)a0Z5CWhRnjYFersdK~Fp8jTeH6s7f&Ndlo5#tw1 z28L8Mtf{az>3O>)kCe%5)pM;B-!cMTWNEAAyo|-LzRTTZlRG?tNy_U<2XnXU$t3HK z1_YKH&@d`b)_*tsg_3$)%$?w*s$h z#zqd`VU~<=bDfyHlk=`fd%=Lu&gh47&{MkLh8Sa=lc$v`)UU6)?4*Cj3ijG`YFT88 zAp5zmAFP0=AiYmn!wP5uTlF#8DAE;3?_s`S*g08mXHdu1Y}rJ6`H-_N1!2e-?4YJ* zsH3L#$4rqhNlf#LRnTr#=4`)htgG>Y?k)pk_aNMY;S!^8u`1)`2RE`!DdKdM9thFu zL`3Aw-N0-iUw)ZeC@Ksp1W@`1RM*Ig)@p~H=u!b~_zz}h40jAvVLA+t5AyACK6^|l?Q>Br43cd!8bgNuH@P)ZOrpveqN|y za(4-cMRKF@2(aDx!z`tCN5n-4nXP0_^toVApmzF$km+8V9gJ+c~%@@NK?nFtD+ zMe!*qQpw}t1OOK_4gtWsIJ;uucm=*QTsUEUDwf~_oT=cP6!@;|8v@ka+|dB2I8+=2 z)WAF3mE=>T0?50gY~e=gn!iI3o)q}(aX1WILc-J2Q`{3G?&fYM0hX1Ol>kXfNJ;_; z8bGX+ zF&^&DXX&7j5@=_%3qci2@CyE$OD!FJ!#^!fDX?>J!JJtU$o`uq&cXISWc@9+)19+) z{u&6u{7>A!Y5$S?nKD63UmvdShV(cMPe)yW@6?$l2SHEX`rkW0s({~ zWo3Xek}@(t2+9^FiG)C4(jeqtAg;MP5V{iK{MV>Xp-`t#GBQXs3?T!A$x6upp%7UV zP!@!Q0U;nL5+Z90wvm#RJcB|Z;hJvlE(k(79b6E0XbFs~-Py(|;cyj09R)r~anOGx zhRz6_Ex|y6PtU>C1OJ~569*TxF%EIcCRkch5+VzRL0~dqDJbYy+GluXXm>236HhV0 zAaTiGJEvuV6Othii#Y950>Bw8As4usI~sv=b2o8wb5`Ixg#esdp0zhX{#Q}79k2uq zuhWkIz2}Y5cYZzndIg*v&b9!6v$lmJkiVQ@5qHt3Ge-owUt36fgsUBz@P7Z^P=ClB z{!6i-U`YrXB?$#0KuB326op0rZ6FW?Pznr2K#|gtw$i_+_a{2m%@*g0a7U}y5i%uY zLujD0Yycu>REqvR7EgQhDNi6tFc2g~sGA8`1}-TH2gAfbl5h}+PvZB4B~IV!KQfk= z_+OmJpDFz17$DgFk`ay_b()BN0|A>Kq zr2KDp{Y%$BV&ESs|Jz;vXLM2h=fZ<_CHxEWBwT0Eo-dRLSE2J5Z3`?B5%tB>FELR{ z8Y@9afz#2~p!i76&A`l<c{3i~iMT>*-v z1=pX*C<>LmD-FHD@((@Ca-v1_r<@|C6rYlenli*pves~g9#n%XI7-8bYq}g?a1L2+ z?e5m5Qai*{W_#^-d`=r_|~+;L3jntGX$ zc%Vs=iV8K2OgRn_=oxcKl{$Q zCl1T8tPz4~P5brhQe%Bv^q@gvmM5-mz?6IRtJeGvzl>R*IUoAXN|KXv0h+q+squ%` V>s7K>pPb%;buad02mbp?|-?s{ee@_l=T&RuuWm{yu2@ zd_8`?5b}3d=ksyJ?+f~0|EKmI@$0qvxBLAQxe=vZcvXt=q>wy+#*{yAl=Oc{laGZz zQ_|}~%KSYi@Ay!7;!lA82w;l;9N1rf`z@}Y74`2I(%<4ye|`MN&xi8Y=iToCd{O%C zox}O{&VPJ98>#vISJ#7oz5%><_j}K0cQaR_Rll41*~EJLj!*W~;)s?$IpBA=v89oA z>g37DT;j9w*IL4R+wtDci0}40bVs5C4-0(D|LeE=cV2X_DMZ14f3r(ju&$`$U=_+- z2+jvyMn=N@2DQ8Z|NQ>@FXc6n!Sce~+2Hg`PayrPgujX_y+kKoSorv<_|W$E0fdMZ z6c!T_8Spiv5^C@*M%O|hkevigmQFv!MOs2BakI#nQ>rAVN4+=S)53dcEb;ScV24DM zR9$N1W~527axT<=Ps^PenkAK7N~xulUPhTU)m%%hwN>HQY^mi|T5YZMHrjMO_1sIZ zz4hKlpCgV0zLil&8-0v1CvQ4=^5nZGFPL-1l~!J5)zwyCV@-?Bl4UDaty#BWbH|-F z5U}fRyYI2*35QZT`IJ*nJN=9^FQsKSqtB+#g{3) zu>Hy!pKa~u5kYWLlru6Gb0FbO83@V6sGRv8a*oQJa^^>*D+)LtijuQ~GDZgT39;Pp zD|dfouDDeHGkJ3)BK{{b=ajmCBXj?nw|~mo7Kho(*ryE@RG;X+GggVKZ{PB~Y|yi! z0HaPjx9%B#SMKvvTY0->yv&NXeAZeqY0s&dwYJ(mHH}+C8ITjT6K`+LivGc3*F7QJ z%?2-T=~ke>b{ms7$TifodN;p?$|>|3R%U-^lGc9Gv;{xySU167#q=3*So!ScBF{e5 zQm?VBH0l|M#)HCYrok&uWP@ z#9LR2w!&Uk8wsez4*#`NO0W@g3;T2r7@tj;0P^c7nqAH*H?Kv$`P|`Gt}Bnj`-A0t zBe}MISVBvo=Htg*b9L=~*4oP-|;=Is+4(rWm#d)Vua+BNO6+MIktgl z?dD{EI|nk-VEPlX+ihCPcNdzEvSoX$^<3V`&k^#u6kf7=*Xs1x==8>2wtzsM)DpoO zCALe}8k}=T;j&$b|1!udSH2o4*-5{Uh#Qb%tr6~c8vR94ro{s5r1sfPK9kBOO6=?m zHpg0l>y_C^K2-URv#&~%nk!A7yBsY%K+1UPrs7vvfJRAS zZVIn-N@9WKEtxMl8mZbt6*x<#9BHxbZyu|*?0UTHQKcUEH!`Ouh}0^+y!hPN7@v3F9aTySJ#+yHcKOa zM0e*&7FaAnkFF5nvNJ4hv|%HznYW#XsO0Qv)MB7a*u90f4pxxL<$Fumjm=QQc0;Rf z<^ejTR`fQ6qyTD!dLA>LP6;DHMvGM8ZGqipRMSl4b5-D_TuaEIGM1xmD7}K{q!1#_ z7D}JD)=ablZ;IlHU?cs0NsA}@pOztB9XVn%lg$z*%PURtg^tO)He!?~^$1y! z>b*)6kdRwsAy}`53+>V#r^e1k&^Q8z0l0xtqRT`y<20A)o}(_>bDwc%UIzbBg%s=} z?!XVg&396zae)xSskHZ&B9olLJ{t`=i^R!LV z6C4j606Bh>U?AeQd`E_C9B(kU)E2--mF1NTE=h+K_uY}HD;~Rp2G|fI^$)?&1{668 zy1n;3mBc#$uTsZ5^S*^05EhE&1;qwbPK=2;VFK3_PZNt7RI$h`_;x*ifoV6odSYk> z9;rLP52FJB)zpoWsBjQ40eV5Jw;sv~Fbts041@j|n{XtUz>=%o=ZgtFSVrjDzW`jw zt2CMo^#PR>(JC-%P-Yrze{@i*&q7z#18Af^+%6pzF|F{%NTMLimk~Lv21x;W&4Yj$ ztrO$A$Sd4}`j~72&9@3#Z_K2!~s5fp0Dkn&5?1=uO z-oRww9m9mYBk22TQZpJtl82L6k89)OtCZam&5dZ$|h zw0p&_-whaQ&&UdTEuqFXN!r8E(H{4YfS%~wb@av<)_e(#I2($p*%D#{_2?)OBo8Q~ z0vvo`E0j3MC7y<5mq*OWU{wPfU#f=%lr#0~8?@Il^mOrmBD2u{VA;Tn<)*i#QK1gh z*96pXZZq_f1wfNvn;yk}vEn=M@Cuh84_xv~YA%7W5&Rzb2_#WQ(dVZJp=>Fvqo|^W zi_na40bd(&Tbdp#HRSruo4gB{mAeAHw?Wg(B^*E)5~Hu-T8KSuFoXIAFzO9(8d(W5 zq3k{KxbO*oV3?gC|ABdHC`=*)Yjs7l1YYs_7a)U93pzQAU-*wk%j|<_S4Zu4cG2W! zB8@~_Qf=aU8SM3KUBo3qaU@CW1T>bS7sBun{WSDdhh9J{qMj*5uod`?n)%>OHnd8` z&#AV~LvRJt(5{E-28}NAlXM1zBh=+s8}*d{$c2l4I%o1UI&N3QFMNnj47Y+hkbIKV zG0F<+r4A16JCHm!y=&n?dt${y26da4y#x?c{aMQCc4 zv3Nadq{cYgMK~_%eIjE>6mYT;D-&L$VsDVkxtQRQS498NXypTBcfd>ht2nTbK+_Kt zt5?E*AVk^~b<($9jv`!eOSh%5LIdmoq#L~HF=))O!I0FvlP4wTh&T)0&O#*WToK;9=01_AjK2pLgy5l4)V3Nqu zkchbnpqj*+l}PHts_3ffcEDfK9r$Hx57qhvVFiT7(1|HBxY+Wj9m5pciWcrai5EBgJuN^5v?tv7^1YRY15+c?pkZB}h2c;b*pUT1wKtcO1#OoA) z&cK!j#aavOb0N2TWwj8e0WCT00y`8zX!2o$RMH|SRvLl=RLcr6NPdxsh}dDmkfdLY zz3n5$A){ON0#dpLaRg00OT|LS%2o&(xPi!c2LUG}}ghH;)dAvv+7(X7yaMK^nB?fuG}@!pOOyCY**C z#MD3kHZ<;~vQen8jI12|$2KnzjBAK+G_?hQjs;+?2mg>89UmR^bBH0;N$?b$XZSK(1BNMcM31{L>wH|*72L9V>2)&t3oUOX?=ub zFn}D*lBhCV=z!M*pL1P9twGhBypWC z4zeLyGYaI+Cjr-fB}qx3mvFy-YNlvZ8#MrH97!C+@)1e!1>mQ!+UBTXgcX zU>C^)-zK=E9Zk>fxOAx5S#)x|4p~V#G=p&CRn&n`gg>1@-~ljt#X9bPl>Cv#2E2fG zUXyb`{yZh1Y66cSY}vP+_CdT)8W9b30$5iyilr)N+#|*T@r;d53M^0qvhaQ%&8X;S zC>xxB`bo6pv|k;1!<6y3CLV7cEr3SE1!#tU1myq{c@M8Gk&N)lUJf<_q|`wgxgpal zY=J5Vf=dSADdBK!QV4W^P=OpQRFAyGbrgfT=t8Xb$ximHpk2@xAW2Mj@QMny7f`&C z5RJcPz{_H;QO+9aV;!a}4*G+rVzG&Y12)^GTD;s7ZAi`r@`9j;)6h^gA~KFibPuHP zJt)a$L@R4ZWE*o)AiwEw7=~&9=TgM($qi9RQ00!@BO#ZR2ck`X9(I~^l>uz%4P=CA z^5P>Xm6BuUu)?Z97V>uuPcMcWVRrbPvLFB@CJI|)B!P^z1&VMH+`v6qf;6dJH8s)4`-S*tjtb^A3@Rm${BFh8yl_} zD4~Se02`r(Au=d`YR()HKZs8amSJN=0$w<4n&XhLYy>FZxP#6EJh8(hWJxN+34{W? z*AgPa2zbFuAh_5#l#Rp&nJR_^rll%lyI5#MEVTwkldL@uMvvD zhoY5=r{_TG(>3PtLPu0E??M?6^@bNMD)WZ3#OR{Dv7Z<}L?yTqqrRMhAwNC5t*Iw6 zdp=c*%d5zLwaX_!N1zE+gy8nH0e(}%lr(_az;h*8@Hv2X&Y2al$x5YTfjwf@htW|v zu_$O$McOqJO<1mrqwQ=UxuzMN%2N{F3$CsX=h$~9*-VgI zy(da}@4TGkaE7aPkjF6IuE`>UsvhG)66quJ0d0zZ2p&``L1!Hs-3V6fq~3v?qg$jb zbd)weI1WuxLQlg0mWHqbtMAiP@Wz-|Go2%`2$y=KoMu89SHc1uggN9fwzXfHTBKFL-Ht zs0_vNY$9E7y*>uhK}NxOk^G3TkVDjez!-|8XIjK-fabA@9s845L_&okFnCXmW08O@+K>1l_lP z2h-xzfg1foAJMk1zPTlxY-l(73ZsosCMiR-5deruyAO4#&ev)-L?bn9Ge(p!Bn4(7 z@?D55e9UJc0Cb*%cgTxUp-nU%VHtgC09$lgUSPgPudxpxH|PLSgN2Rp0~=VA)b=V3 z5sAeC#3|(Zv>2wnY>*5x8uAWzcv_Hu^0;TnAd=QBtZ`CDI0U{?Wekkyh%bTQnu@YD zoqeH65hok+0qdR-_sD^ewSm&%Ro|xDHPF#nHW#sjD#%*g7|%S@nz#-+1#;!F8or8G z&^Tl3$mgY=JwXO)T4sHZy*;p3)l!rKkT(&>Inh+} z2_MP-A=#y0_BhXp*{;uCe&j2k#BzqdEvPZ;8xc zfwXP*6ibK|vZer-v?mJq46zAfS8VE;GUzN*6Ok#T(!>;)sW?cR(13s(aUBrf zQ9@O8fMF)abDo8gxwm8D5hF6a9~pt2(Ba(v9L_oPchRk$NHwE>4IO&m*}p(Y4*QQ7F;T|qA1;H3ZuWx8*2G(6-%k|V4UnL|@`@;*C; zim+E0hRVEofdLbA6IIzBCxffYnq!^a)T=r}Lk~;YxCQbXFF1hH$p{om`sx5pAV)W2 zJdf{?5@D4ZMu9AJL)KX{wWL!x(~SWaKGbJ(AdqA^yP9i93+rc_K8~OR9InJ^Vd=to^nJ)I5 zm8YotD;0mD`(`>d??)G>KoQ+bC`o58jzuCO@no8=qH%y7B;{T@4+ZqB5T>o^cTuSC zyT~KJ$Kdm<7(&po`Pq)-=%SDz)nti;SRnS0)-~OKRgs&(p%;&uLg(lJiw@8+gftQa zipP`=arZp|bPfdp=?ARKTS43xp^h@4IIt*C@YuSoX;YKYH+=t;E0z1o)#)T_SH2rz zfpacW_l+bSvV=#1$#HW8a_Mk|+P*z|9ZgTdRhtCLediUfz4<_tS6ey_xY2OL@_|-F zmC}lTWP89M8>sZ*oq`fE!iah!t%Gfp<~p43!4)|Wx{PJufD^C_F3U=ohBJl7z44*$ zGoAh>xlQL#D0Q6ifmU=O4x3R!CMHOC992N+AM*IlAF!J-!W&C^{lupG3gp&+F|m%e zD79LblduE(BK8~3#vmHvfJT1TBxje*QkN2cd4+er8;?5KG!I4{e_E2Cf>gin_`(w;1SO`DsR*|4Fv?Qr>##49jd7N%#%7IQK$M3L`{h|~!n#UnP ziAns0N!D0GLEbut(4ZM@OWA~~vV&J09!pq9xxkE93qy+%UWA$SpTr9F-SX$sgcK!z zT!fj4puFS{%fSDGN2P7(!*CX?!cbYAhd^JT1mgHzBgw66wYvn3e>NE0P!WVur>FQ~ zjM)m9W0lG5NiB>0e_9uVR@c&;jwKzqm}Ws$yupX*G*6eAG!oRL9hA!l%I49hHDp7? z9qUfP@z_V%UJZR@)No%2@cTTqbQ+3($E0VHCU}pmXi&%g>2jI9kk3-NYQlve)t$33 zb+?G}!~>vYckjA4M2C|p?@`^dN%#)DwL=mX-Q~zSgN1@Mx_(keXA0U0q>SM#Xw^!w zZe7m;UgN`6)Ka@1;aP_R2~janaH%>Q?D8{*;Ov$jV%pLI*hbe6+^BXPMH zB5=oJJ@K^U;CPT~`eJ;lR2{`oG@xpLo_G`piS9#m;$27jFkChQM*!Xpxk!#L+@Iun zBmFkwkTw9H$QaomqOeWfMnO@OUXxzjFqGdG)O&Wy4b>2^AC{>j3V0%sqFNNtTu!&wvUhlo(O9MYy&Oa?W(}4F!QXh#aJ}sp?R6 zx{s(!+*v}$!|EDYY=jr$79m=6zTq^t!Nmf%*jVH_E%xT9+SCMU5IKBn)d2+|RvTOV z(YWDCY4Hc?!-~omuRf@@JT%4D?8*a<3F(6qfMzI!t{X4QS}|R+*)$e^;>Yi*Aug6_ zHn()6PvhgRi%gpM3=IkMD7q-s#h)Z6lG!Yb8oG5^j&&XUkagN9>wF@(rF-AH@CeK! z>hK|_s%nGDuO&!N=U3DxLJygxK{GBMcFBALt)v^Ky1nFHPqHkpvlDP>G!2u3=mA8O zZM~`C@9vwyPaR0%ir#^LRM5Nxj1zu0c+IY^pqOq^m7gQ2616M+hpV85rmi;c;`9tWmV3j9UWY2lywo@?G4g((NohRNDS)^ z;DV5Nj?HHGh8d&oaTNcC*Qv1mfJTdN9N_61umNeIs|7ksHhZ^!{d75wMszB%WV$5T z1d&-M|3_oHg_FbVAeH*k_(qp5;YQsI@fpF`w`_aW1=$91IJB#d1~e7Kx+DQ^ezQx& z=Ad(`4#7~ZNA|zSIyZU|vnLkZmzNG2cTw5Wup1JGT;*2l1KZCKXo4ryF8xQL#i8>a zoiNZ^=RxcQPgf{^M9c7NQ#ZH(b3I#Aw|57u5QBFkb&`stOEd-C=zL4g@BY-Fx?+{? z)K#ikhU24OqsTHL0QCf@lbW8oO>lJgVCwFq??;}=I*oANzTh(*Nw90|Zw^kwcinKr zJj)ZJuxJ2GJ|0FRA0fD|8H}zwP?{N{L(on|^=6HZ)f|d{7It32QnBJ`!Kw>OP94xL z-2%J1Slcvfpah4m6!~0qKKy=ICA|x=CIfY+(}@(Ung+(Az@k)?E?+=&9X3Oigo5|V zs0Qj)SD`gBIxii%av)iuJITpWu>{?2)V+W%bJ=Jg;)$OmXSMIpg=g3llk3G7v`n!h zTDPR{+D*297E?2IZzof##HV@a^Sl$+H`6I3C#72^j(lq{id&}RWy@(2@EBrQt2a-t zZ7Ox5BQh-?LPG3S8Wy~X-=BebKRQu#^wH5cZ+@sNFI$hs_VFo%norCz@M#p~12FA8#^MeiZ zy;waVDO<$6!mlj5IB;=fup@;PWx3D_*m@m~ZygB^ou0*_3(EV5N`|hGR2?%1DNaP1 z=@{96yAKlT&(Gvq^I_T^K|+_+H~8u$kZV$=t7z!c9O2MDn|_{1*9tq3+#Oy!FA1}9 z1sd!Y0M;p)NUYNU;z^`Q*M+;xCiT+=7s2s4A87Z$RY0dZycmNPGyn}zSLtUDm9=p1EZZD2R72sHT4`lIj^>CIBJgr$B$ zZlU=o;}~?ut?9ym+=G9j-LYVtJ&DF4@=fpV^8gLO`C~I{;trncECYu=XqfP>I8|Mr zfwT}NL>_E)f&#ogy{y6BVJ}fr>;xQQ2q-DtOJUWRV`LLBfnM^unW-Onx|qWShoa+u z9KJ8Y2*4rEfM?SGSwA~5GzDL}1|aQ%t`meENwuI!rU)u(xj;S2N>p)U`p4+ z(FH;02!pDNk#4MBj#Co=0S+?f(q5MufmL{qxr2`5KQlH;_FfF!m8{iV2CFuS#3RQf z^QO5eh$Y8=-w#U^{oH}+Cr{+WWADg+8g!yA4q3SQU3Lq&=BY_LAcr^8P(oBH?$BKz z8@i#xzr)Z)9*S!irR9M4^M1f#>S9)re9{fGzMnfwx~-A*gJl}9fiZ-vQk+B)42vJv zuDxeRps-X~S88z1cn-r3qB@VZ02_$kH!RdGqq+9l2NB!Gh5O%`7nvvUIu{ue`bn_Q z!QRC?x&H-t;yO_hG|ybKPar4+0sXUhB#HtgH8W#jG%`43EjD90W-T;1VrDI3G-EI= zV=yr@I51)`H8(RelO`vq3^O-4G&MLhGC49gF|*nyTmh3)C|o2oV=*-_H#9aaHezBl zEi_~?F)cVUVl*upG6(IL`AtxU2ombzL9dqtn;+=Ic9kz5agBbY=SU`unw( zuzdh>AH8?K&(#D~!1KDUi_3(nGD-kRNTdK#{!)KI3nF-X@2(-V##%*C>Cf~05SqGw zPhTW~BQLH$-0!znp|rtia%KVVdA>U&Q7d;DDp#GOv}yhAOIWQ>d}yB1K;*?W4N0al zqiM9y@H~@hCaUneTvYS<5}vbmnt8rI+^X48=?nD$ssNG+*V1d9k1D|34sZoO|4VCQ z3(kLnMyEfYOqFjid*bzI%_q+%&pUYjW2n^3IhCQLNy%<-LnZZl>VES4);vF&@xyo? zA-k14U!|te4qrVyZ&d)5XZwuedB_T$C!0<3d;rgrexBs{2+6xPM-PHE!I#|C{BXuP6?nd_sSgg{U&)2(V5SB+ZD-FLrHS?jM z86GpLy<06TG6*EkC(kF(C(kF(t2|#l&i}hGh=Gy{!};gi{96Xvn&%NmZz#{B(8YhD zO3U*F;dzhal@na5S!w!7@mCnnYfXS^=h|vbnJGADh^+9()t1QfRHn0e-ZDr)>#&xg zwAYAf_yF^KuZ8vSyr#V5`Q-WJ`CsCB1V_E#<{51`#=TbYp_5j=T5c|Li55|1NG@k4mtOMIN)#gl#*&ubGBF1<8#PUC-h#A7y# zLWl6YWtC$z4_RRiW(cmGt#i-+ zD`Z8A*q*)B&a%St1!mk%fe3%WJ(yipLl7jiR?BXlpTXwViHzE8+6^ZwnhY{&XEkq) z)EjB2v|ayS!T;Lo1y_Zm3e^({RWw(FgtarYj%*?r7H>0hlnIZwSxJ@2^U3ogdA@hm zZv-A_`ESYd5?8T2FA1eB5R4isDT}J|JoN*lP_tctFwbv4G;%yIb&h`sQ_#)xo?Qyt z@Vq7AmOM{&*oXoQ;rSjncQnrr^Uu#1?~~_~=ac7uo#!pbJNbXYbV*M*|72R5k!CK?NchxbF~oZG1Dx3@_h1q^87FP=N}nwBOU)T(?74h)n({@ z*sXZJ{c$A2yLp~Fj>UV%O$5(Zv?)a6F%$?*X75!o?Ns(Wg z=Y~V?SvRAE<~AQxgz}>Ifuqf{NavN!9wyPg#^wKPkD0Vk+-e>TAoYTobw6(MeDZwy z=L6jyo{6~me4Bq=dA@qy?>aJkrRRJdHtIvW7sd0E>#s=Kj*cgG^E@}zqO5E*5<`;_ zWb9pebWAG?`(|F$M?Rb9;Yg>|+8)aD(u*6m_RmLJSgN@quMA25eDZwqeDZwqypQKK zG}xNwBeXq@=iAd&tZy8R;`xf0>hST~bJ!-g$#K;N026=DbH*aNy`!DESlZoelHiW> zWeHPyZ(x+6Lf=E!8nNwpo;m{|c|Ljm$voe4ZNc+y&F{kVo@)!9?`rdie?DqG*4*YT z7H_Akpn~txR3I?hS>vkky9-VVzia1&I;`}D(e3bH2cGY0HmiBwEqw3!^GTJxVD`V{ z`IRUC7mi!!sZZ??*y!|MJdb`#_8}^L@g$VCB}J#d{mBs+>s&mNlCtt6+q%R| zl6vHeK=^P62jtHG{?B#);!jICyIfkYqgKzKJo1Q>Z@T~d8SiuO`F(zW;{Ezr`15sl zzJCyTDe*OZ{@Ui(?|;7@elGC&GWo9jcA@W^hxO+V`qvL)|I3Bq=S$LmiuApGU1)s$ zJjKrsLjHQH^ZB~I-uNE(>;K&UT%G>z{&=AgB`aJn#duOkp3gDm&yAA)4{7qX@HwWz z?}b$PKBeg155`Y`{|I1;e;?SN?|zHxTT$p=KS+OxNB#Nwx37ot>vi{af$#go-|rmG z&z=8xy)RPp`=1x1uK?bEYyIBydAgY^(W+k$_5CRCJARLg1C8zQ_Z#1T3Z!<&6ZkjrPbD2Z=+4uQ_sEh+FS2^ z^f}^4;9D7Ww9&^Hb8^$kl_&3>{KA|ouC($htFE^C8f)(8cG`KDU3c4kk3B6~G9bXJ zHS0EPo^U9olTSJIwA0Tx^HORz-F(Zfx7~h+yYnY&;j3+b|N8NN$XfWyT6~$(FSeho z@oH<|mk5HBqMVVjm;(uK%0NgiM&-=+kaJY#lrujfT~WaKP?Q`C$`~2UC&Y5YPwswY zt~e0xzmhjcBI17|b55!I2bufNy!~C)OdPgf#y)MRp!!7j8L=5BtV?QkEPWNf>h*_( z%sOtZ{oERVR*b{2q{!+h@_4j*1IENsIn)sG5 zpH)tn%NE6xy8)JYjJ}(TsZ8S{b$ysFkcyOen$FX8^$h^#jY6~*_fg7jXW?ymDkSAg zXzH1N$3gLwXw9%nm`u6?qeaE$~>@y zStt^#<&MT3Mh~&gNKi{pJ1r1uHE#0ON1BFz)$4-ooXw{^s!h5Ogh{JY(SFg(FkeW^ z-@F?ze|x%GSlz+ShS?9rz-sauz(_f<=h}%J6*fa32Tr$A_V85nrlCD~RY!o7!_p9Q zAUX|9Swj^|_j93RJW01xycXL0-IGQi(TvX&=%xP4Ugh>?vz$fX2yawr_MX-Ig?c%E z(b=KC=(jj`$!8nkp)JEkj--BO9w5lBi-r1bK-4v`!;eLU0XE!^h6PZ7k+yPQd&M#+ zJEH@8s&*)&?prW`HzQHodWBopWXY)jFs&q`Kg=jQvYy-;WRxtj2z2KVf1XXwM3KIO zLKItqN?S{G(9C)`0LYq}uiGWMbC5)T$KqB0(SV1!6SU; zrCnz+0;HBXoiLnG2&r2oHcQ72JyZM~n+`09p4BB{U*w2i0~2SXTXty{k6+d+0xVTx z6{FtoDE$o_fP-51^(qSw!n{Q+iV7sP@JUmF3J&_0JB$rX#|^R z>bp?!q3#<`20(Q~o)XZ>6WkmpkCW=0YC*c7?E=oN(F##cKrMiRa`9!R5c$27Mg@K@ z!9IHze;|pQPnJd{oWbq_atq`Nr+`OE@HMC0QEJrVT+L62YYgj?Uk3_+GKlN+to|RH z4#_78yBj62D6Gr67U6&rlLMT8RDT_09A$@EDO$Qh36GDd5v4LNR7|X1IN#wATAtD@ z^U@)-8jR>X0p-sHszim+f(wWkxooRCAh1nhz=Mfj0KKGouocFlv?$@} zA5^st>Zf|+Mov(uXd0lDMl{ep5hI@xNRnoO0>P$av5B}QSH1<*0iau;pq7YdgGU{` z!P0xSE$TiO#RSxbvEe{}Kx}ppP5?w;gYpacL!En{m0DvJsz`&^Z-wV3&kO1lst&#d znw%{V9h*{5^p!e^Xsc}W1a1&cD)pqh@RN%eK)nTIy3osPR9<`tpRS(NWsiVD4%ID` z-#tER)RL(GDaZj~xFT?d8Y>C>8gzuXv4YE!Sd->X))4L;sz~^M_A2l&xQys^sc?{n zzmunSVIc(#qR7*C#2w{GH&f2G7d_?%5(_qJ)GuO+unPP6n`8;f%Fv8JI_hPrA?hK4 zhk9-W?=UJ^7>Ex%q9bV;6i)#TTP;bKv8-+Zd~k@GqTmotbS{Ca6eK#; z2L0^Fts+WacxhCB&?gka=k1X34sBm#!9nY0mWvvi0X@tLDPOWOPQi$F(ANnuCVCav z1b+Q3twRm*95O9UL+^*DL<#q4;S?+@IW_1nEfsPCsAt;_Dk%t2@G#7@Eo|e#4OpW4 zDyA3AkRDGBB@$zXYa=i@MG%IPf@=mkvm6%?4qZN%)`e$(XBrdIYj9XCxN@9Zm&!z9 zt~X-nU|FYr>E45chHaBLU^-8I-bNYSWOP_T*`TAze#mh3*itb>_cYL|LnTF02dGry z;gu4X7_s65#*t=W@LXPtXfALZ+^KSw|r6;3wF}CRPB8L}?A;Jm|a9dqA}jH&GM? zrW&Mq?S#I1yB?x@byk`OKb|}WAuunf^Z-b0>6{IJPNPWCt|0a9fpqZe8(Mnv4caCG zCw#0VYRb(V#fDv?NU;kz38dW`=-?ogM-Pb$r&K<^#|Tqz;$tjGZPMLfYC}IwvWAA> z&Gb-(@iI9;PSlT@B`U~Bv9nqizrQ7{!jbrBQ23Bstab6XhO7bmjc2VG%t6VO4z&5F zM<|tliHiZzF&Ksi3S@6&)E73#9|YDK6X8Yvn|Bxw5eP7iuC2!MdQG=s-LQChMa>te z7Ge$+^$e}SPea0!N(C^mZM+r(f_)h&vm(vz2Er0qGn`;WDoTAkAErfPQz_dV-3Nrwvj)9PJtMJ!i4A$Bu|Y{AF>7r zh)CO_VCc`oiWfR@$KQj z#X2xfozh7JQ$>DdFCA4AAwU>l?QU9<1u54v9?~Y|}mUc}G$~ z^#;e~DG?Ygo$_?rK-1z1B#i)1pwmcy0bm`3&NM1*(N5ldmUf6dDpO*kV!u%~!0K5hrlqFkoSdVg9SCLaU5D=eW z_$g2hLa#x*#j{=f8P)Ic^1KZ}-x85<=*;J#*QJ~>_{5=CeDT~|O^)n>GEKIB0ttu2 zqzz0%0)Ro{VZo&)ljzKN4jLv$10V2*_$V}c!t_iz$RUcyR!#9EmZ~+rpG1Q?@r0ai z>EOV2U?I3SgfGwd)@OiOxMU!~rO)vdBZdY?$7)Hq$y2N@!eHe%oN|!ID7P%vTk*8C z;3at|sC%eyd@Kd2V%+?8!;db1$+lX;Y_=3j8U|gE<rR$mD->)oRm7tNN6PPk_Y@r2T&aea$YxU9)X#Vm4u>z z?{i^zUssj5L)?-^;uKvw4U)epz1Yxy$dGumrlR!4!OQbN@WEx>=RtRWYJxkOjOs&g z7G3~R-9Vq9)$v_Toms5WjnwOaBk=Yo$(qCFeW1*19TBGV1Fa`NF5S=(d~~>@Mj`^O zfqQdP0<`IQWVJMm;X*~Oj~>iWF$!#;CI}od8&bt}9SL3xnhRP7K?-uBeJn19P&k8? z@hIRChKx%`Jvd$osfHkb2~;;t30*9qIh{fJF_(Bpqmr?BS8V>NCn~j|tpLeD8mZ@n zY(a=36gR#Mr^MCT9n?jGkQ^pPVmT_JEfLv`8J6KKST|Hq)j){<(AAB{0aE&n+;C0p z6W~7(k`a`42Njs5Pxh0C2SK*Lk1{4jun7gWdtePV#!0hRJSAd(vyRfnL^e;&F2RN4 z;J3pE;7f~Q!RWk{L&mHe*neXv6Na?x%0f4l9OGR-+-cL3A}h#Im7U=bf7DfYlw9%|#DooFZ}# zIleqs(hf^+X~DESgJZ?ZhV0;ylmc}OO52*DRBU@9{a$ho%K^xbi+(fFatE$RA4#-Bzb_AR;Uxj^ffzx?h+l|Fga(qVh!FUHLNNu!Pm7;8BVv@QJP|Ck zQLg+bzlk>!;om|ijpvRA5CoZBPc#v-^w!vSX&yvcfqBHJ#zHCM-nL{No-&gQL;yH2 zTf&p$_R-j^r}>buzHii=G|lA!0bg)|he?ih0-X=+L8WLKfOlfKU8-pZXSn}Plx_Nm#qm>Yym#PH9kz&NcmJ0!JH^2&ER(mn2VV|;Yv01;5QwCwb?$lzuS2IA95;lv0i`j4j+Z z1h8pajqTQ)h<=RVCbc0_7)vSAi8qLoT}Z?)}E03-aaa&;|a;2PKI% zc`X%?-*6}D?8+i@pQAZBZ=-o^B$(FJg4jeGG&@>nfHyOkTtTK&vCI-=nqvy%HNC+xBp41e*ksdc#*3-}+Dvj=fb%v~=U%~qYPZbDdIbqt zGvFL+N@xPpxPy+z1=F8`k*bX))iiWVA!^>X2=>tC0X7DWqwdO(uy&V+Uz({ugbRzl^LChM|Q(XDu_c6|Wejo@w*T&Ffq! z0kL@#oO~M665_57uyzZ-DTqIPjH6 z^D$h0I#S z!C3;q@cS3F;BmbqFIIY8-ETmxMe>gb~gOgcrR=S@WB-s{3UT z>5bbJ!k0H=maCuIU@3Sm2(O?qNWCT|MFV7flJK(A>Im-wNC@qK+}hq|-qPkUR?yzg zYj)ZiCHAIGjs=q*jrdJ}TSgJmD#GBkHMy|OBZ30m2Ot~1gBYnTIjG(Nf23f-cuOVY zc|4E{Ee`0S%I(V2zPU*~OQQ^~kzh4B5^WV~XM|3zD0Y|gezQ|@fzC`7r;6KZL<0Xa z{M!@j84sY*;2e;l3Ou1dwulz(v_&S#rAAx5T>OtF=2SG z1WYM{LP=;D6Ojae`4m&CU2)h*Bm>vG6~M)aX^#j5WN9j!%GN&P8*TO5{R^s{Kxf+NzELq(^6>UxZfTYq=Le=I-E^t2Q!fJhiP}ysrJW$7ggJ6BbB@w%24l;|NvE z_(-sA!+08hDG~!}q@!{~l^D3SNIPM@sB|b_vIb2>^$NLk}kjzXyAx1ekqcQLqK3)urfW$V`!%YdZH?z zY^r33=&&kcH7IMZQhk3{-CTwIkS4vYyp3J2qdMGwUz^AAo+BZo(bc5^&>Ie|ih05= zRa#XgDU!7`BskHfsPn1Qc^y68Hm!l&nO=Z|7`zA<*c-nRf(tt5^ASg?W1Y=7+I=U? zG^$2(+91$?0SyN-W?8N#ltPhPhf?IF%-qQD6pZ>vFSPLvL?K^^lIP6>`0$^Aa2?u}6C?b$eumxgk8g z3{HsN!3lW5qj7rR2dEXfiFYukoft7p$RKTDM{b5mkz+yRc-R7wab#?dFv~$TL^Vxq zgCpi(NlXzjkaE`vqrOhp9y9DrA9Gi)O+}P{LE{6fJpE(z;iNM_bcx=ABLbZ-iW!Nb zO?>>VAb4~Y60jIahG?IF#rUR^ExeOO2k`F_!k7pY0C@MA&%nV*4{Z!;Hz#PbX`^wd zer;qh) zjwx>K-tO!PC!wOU@qtlC3?K=>2^bkg)&hwq9dcRIRr%=HCir#u5(iQ36pv<-I(H%s z2fY#vQDGyEq{nfA05}(FAjW#MrCT+KucQ%VQzO(B0I8=)Uc}Lp@i> z6Mv(2*LFh}YF%>#RlL2I+2RCj9wqmZRkgeHLLvENw-f{^YkMRX1 z+8@$Li3B5P5b6X{d*(Bm7$5Y1cJz8iujt^ejz(ybxyO*L=Mg7pmFqi$f@ZLkfz}vw zt^hJcD9mm6ZN$l#=xmVcYP+s_i?r1YMdmZe*xSpWw*;&lT+NYDOg1lfQMM4D^1LW!gMHES9=Q$T`&7KA#s9QllYy?1m79D;9# z`wXk6niLFDb0Nre*rJI%P`@|~ZPM<- z6TTBr*b;;`O?2@X=R!w+>&ZQeI?_=(&x3iEDS(||V?WAe=^8P?luP@nNRZC}YG`}K zGIu6Etf=p|fQf3m@f|f%W@7qavCb=DV2UP`lz_^a^(}4J6dnFaYpR}`(}6`qmUcVQ zeAMfrviCc@h@VEI(U55Sx*#7NJ=H`;C(w>22&Vw0U}%vVp@igrBDgsCg}vWYjgF6m zkAlD}S<=~<^29NawGgcs$!gcQsucSIBWPMGq+*a{tuVEXfM7>6>S^e(p5~RIp^@+! z>q^LY4Ifw`kPeC9TIm8?m}7rbFc5v$L6RCF8`f?h8 zh13ZTvCh!eVbaNeavlDY(ZjOtS~@0hoM=1-Qb?toOl{0N7odV$2G(yxD$+NIK=cvX z7|XO#N4KqTA5Q;?#uFG)OKBNNJLE?Mh$ceB>LBh6!e3XAfg3fcbEbgzp={on+APyM zrnKWicxZ{*GUOJ>A}LaxqDSM=b%7{ij=grAd3rJ{E`v&ct!aM12)UFCnqJcB$U7^Eb!Uy z;2QvmQgjI?w{9^HdXy3gAp1fLf`&L|~i7 zOxi~X+Gt6CLcz0ix|D_Ltf7v#oTLrIQpgg}mRnXfe36@T1fVCpB}E%`o+^@$fbTh5 z6C53t8L$A-6DwS`ok}oOY^Ji89-=iWy2M=`SLZl*f7Id6Ect z6RhtsG*r{cIFSGDt;6$(0K(NZ=EH2Ja)G|0xgIR6bkWKZ4q3;@9aJT_sME7b2uc-Dz`Yas)t)}e8@Bn9D#uL zw$6e2f;b?)h6YaeA}w_&R@35-HLceX(|v7ej!UU;s*|cfA7!*4LP#UB2m(HTjr!3v z5HE|o_c}X_cOO)WNgn}clqw9Hz1mzS0zi3x3^x6OAZa=XV5nMX0OrYnx1C-f4E=*B zKn8w@7R`~8y0uS58RhqX)CI`n*w(?F}z(t$W3@LJO}>dnS~ z&CXr5=xnUUgs?`(yeI6VszYbzL?SmJ*mxF41me)KT^+dqyiA*<+A5{^4N;#(i|bi$ z8TLzg>Tnn=uCpLr>Ql3o>LxbKzuh8O886?YV|fM|pc+coiw0OBUwFQ*p{dTzdi^_u zaO7L?Uh|TE0Op>(AL)HmF9-0D6ueA3b+W*=+e9BEG z*bhNy)}(O{Z~^LcCKw(0qT%MaW5TZ0v*(jeFd+2MB3N2Cw#j@){Tk(HD`_ zAv^w#sMWua(NPK+%81N;TenHa(&$Us8%=w*V=cVW?h=GagXteVR3s^Y92bg83^^b= z8<_f|KrIc~qxMCz#HBV66HV>3@u6A4qIzo(`X}5rs4RmD1Hpb(df?`z!P1h zO8N{KXgT8M{tYRnRvHuq%(Sx@ASeU@8nZzpiUK4yGBq|aWoBb7Fl1&oEi^YVVl6o^ zGBYh^H)J_BHf3UBF*IV6?9@qY!UB0#luIpk8zmHQlSW&*91*P-2{jHEl`SUzK z%H98N%b(YEUFeNl4RC+ATH=mr<=gwV=NClqe|F!!>W~_fZ1+Qxjh3nX_wq#&IC6VG zMB66r``fKh+Tb)f^8xSoyxV@OebUY}v^-fgg_op_ZmRF_RXKr49br={{#KP>-N3$`%Whq1|}f^`j5n&GX!tl^fZh zHGp;_EH=WJ%7AFDC!&+P^ z(l=iE2 z#WVk%6Wki#Z?(^ruaaPz8TCG#e-@*ZCY4n%YiA{>Bpz$b(K-e|wrNq~UZT`uq@wT? ze_I6TnVzve$QK?+H?!PSVi%;gw8T5H!Fp^x+O}j4{xn!hQ)o|TZD445O>maywMhmv zUq%ZUN#&($-j5X&N2T+;%WFOJBY0j*lT4mZp7-K;Zyu*&ms5BijbM4ie_f{Yyrco? z#*+O`<9Q@vHj6@Cc-}J0;mt!9+?bXK?Ug_+rF#`^Ffrq%qt}FofnmKR(SWt&p}K?3 zTf!zR&wKIsGM-0oti{)<*!*L7o@%hk^U3p0o@fi6_i&f)>tTE1@G}G_=Ml7g8>tiV z>|KZQDlNUMr|BRgD9-DAf2FKQ8QZg$+DS9>W+ z=G%DJ0CNB2`Q&*|p6{Ii@DdzKW!Lg5EqV1bxCUMiE184EHhTr%GM202s|e>Y+&_@RU5CJfA#& z{L=XRqw{T| z)C;G$W6}0*8pEPI9mVqOU}QA^eI?Hq>oU>V@p-Cu=W^?lf9I3uljoD?#{}0VlDFk~ zyl%cicvM7%F~LqzkTqG0t2mB^GJ$!Mzo3HBEjAuXWKYM^!M-OH~#9VJu0J zUz%?P9DUb~m(bkegBsP7T5KIP&!WBFWwxJ3+S+4yUR$36t%sGqI^o@Dd)MP8&nM3( z&kx>U8=jAdf7^`keC_$Z>x_9=Yv_;Ud2Tsrne58wX=lS;SDl;4E2+xZv7gjAR?RwcJf49hS)dBz$&vQr|ZSQDfE*86+ zO%iQwYkq%wKhKS=AHnm~I}kG8CVBqJJU_B+!}C4c7Chf=HaqzFA)D`cL+B0zjZ{Y1Xy7hV2(na<;W9wQfcZ>!2bTl25~dJ2-iN0v{`r{+`h>F3kW|8ARq bG*$isqc8)k8%)fp00000NkvXXu0mjf_tHO0 diff --git a/src/core.c b/src/core.c index 7338ccb..d7f884c 100644 --- a/src/core.c +++ b/src/core.c @@ -43,9 +43,9 @@ void next_frame(struct game *current_game) } } current_game->time += ENGINE_TICK; - if (current_game->time > 10000) + if (current_game->time > LIMIT_TICK) { - current_game->dna += 1; + if (current_game->dna <= 100) current_game->dna += 1; current_game->time = 0; // Epidemic propagation simulation to add here @@ -120,3 +120,29 @@ int callback_tick(volatile int *tick) return TIMER_CONTINUE; } + +void message(const char *msg[5]) +{ + display_message(msg); + + int key = 0, frame = 1; + + static volatile int tick = 1; + int t = timer_configure(TIMER_ANY, DNA_ANIMATION_TICK*1000, GINT_CALL(callback_tick, &tick)); + if (t >= 0) timer_start(t); + + while (!key) + { + while(!tick) sleep(); + tick = 0; + + key = rtc_key(); + display_dna_animation(frame); + + frame = (frame + 1) % 24; + if (!frame) frame = 24; + } + + if (t >= 0) timer_stop(t); +} + diff --git a/src/core.h b/src/core.h index fdf14e5..d3eca8b 100644 --- a/src/core.h +++ b/src/core.h @@ -1,16 +1,17 @@ #ifndef _PLAGUE_CORE_H #define _PLAGUE_CORE_H -// Duration for internal clock +// Duration for internal clock (ms) #define ENGINE_TICK 50 -#define CURSOR_TICK 100 +#define CURSOR_TICK 150 +#define DNA_ANIMATION_TICK 150 + +// The duration for DNA points and infectious model (ms) +#define LIMIT_TICK 10000 // Number of planes on screen #define NB_PLANES 5 -// Number of humans -#define TOTAL_POP 10000000000 - // game : all statistics of the current game struct game { @@ -28,9 +29,6 @@ struct game // Research data int research, limit; - // Infectious pattern parameters - long long int healthy, infected, dead, cured; - // Time int time; @@ -77,4 +75,7 @@ int rtc_key(void); // callback_timer : basic timer int callback_tick(volatile int *tick); +// message : display a message +void message(const char *msg[5]); + #endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index b36070b..93379da 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -58,23 +58,7 @@ void display_foreground(const int background, const struct game *current_game) if (current_game->mutations_selected[2]) dsubimage(65, 15, &img_mutations, 32, 16 * (current_game->mutations_selected[2] - 1), 15, 15, 0); break; - case 6: - length = 63 * current_game->healthy/ TOTAL_POP; - dline(61, 31, 61 + length, 31, C_BLACK); - dline(61, 32, 61 + length, 32, C_BLACK); - - length = 63 * current_game->infected / TOTAL_POP; - dline(61, 39, 61 + length, 39, C_BLACK); - dline(61, 40, 61 + length, 40, C_BLACK); - - length = 63 * current_game->dead / TOTAL_POP; - dline(61, 47, 61 + length, 47, C_BLACK); - dline(61, 48, 61 + length, 48, C_BLACK); - - length = 63 * current_game->cured / TOTAL_POP; - dline(61, 55, 61 + length, 55, C_BLACK); - dline(61, 56, 61 + length, 56, C_BLACK); - break; + // case 6: statistics about humans } } @@ -124,10 +108,19 @@ void display_mutation_buy(const struct cursor c, const int mutation_menu, const } -void output_error(const char *msg) +void display_message(const char *msg[5]) { dclear(C_WHITE); - dprint(0, 0, C_BLACK, msg); + display_background(7); + for (int i = 0; i < 5; i ++) dprint(54, 6 * i + 4, C_BLACK, msg[i]); + dupdate(); +} + +void display_dna_animation(const int frame) +{ + extern bopti_image_t img_dna; + + dsubimage(114, 29, &img_dna, 11 * (frame - 1), 0, 11, 32, DIMAGE_NONE); dupdate(); } diff --git a/src/display_engine.h b/src/display_engine.h index 0ef9459..6942f3c 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -15,6 +15,10 @@ void display_mutation(const int table[4][8], const struct cursor c, const int mu // mutation_selected : display the mutation's informations screen void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected); -// output_error : display text -void output_error(const char *msg); +// output_error : display text and message background +void display_message(const char *msg[5]); + +// display_dna_animation : display the DNA according to the frame number +void display_dna_animation(const int frame); + #endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6e4699b..2f9dbae 100644 --- a/src/main.c +++ b/src/main.c @@ -53,10 +53,6 @@ int main(void) .research = 0, .limit = 100, - .healthy = TOTAL_POP - 1, - .infected = 1, - .dead = 0, - .time = 0, .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL} @@ -101,7 +97,7 @@ void main_loop(struct game *current_game) display_foreground(background, current_game); dupdate(); - // Compute the motion of planes + // Compute the motion of planes, DNA points and infectious model next_frame(current_game); // Get inputs from the keyboard and manage it diff --git a/src/mutation_engine.c b/src/mutation_engine.c index c534c93..ed14116 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -120,8 +120,10 @@ int mutation_buy(struct game *current_game, const struct cursor c, const int mut // Update update_disease(current_game); + const char *msg[5] = {"mutation", "achetee", "", "", ""}; + message(msg); } - else {output_error("Achat impossible"); getkey();} + else {const char *msg[5] = {"achat", "impossible", "", "", ""}; message(msg);} } // if the player has already bought this mutation @@ -129,6 +131,8 @@ int mutation_buy(struct game *current_game, const struct cursor c, const int mut { current_game->mutations_selected[mutation_menu - 1] = id; update_disease(current_game); + const char *msg[5] = {"mutation", "selectionnee"}; + message(msg); } } -- 2.45.0 From 21f5ad03dde5f52b6aa39570c672a363c0bcd5bc Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sun, 30 May 2021 21:33:32 +0200 Subject: [PATCH 14/26] Bases of the epidemic engine --- CMakeLists.txt | 1 + Plague.g1a | Bin 48108 -> 50600 bytes assets-fx/bground.png | Bin 5113 -> 18592 bytes assets-fx/plague.png | Bin 1604 -> 18053 bytes src/core.c | 3 +++ src/core.h | 4 ++-- src/display_engine.c | 9 +++++---- src/display_engine.h | 2 +- src/epidemic_engine.c | 19 +++++++++++++++++++ src/epidemic_engine.h | 10 ++++++++++ src/main.c | 4 +++- src/mutation_engine.c | 7 ++++++- src/mutation_engine.h | 4 +++- 13 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/epidemic_engine.c create mode 100644 src/epidemic_engine.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 294350e..a37a897 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ set(SOURCES src/display_engine.c src/mutation_engine.c src/mutation_data.c + src/epidemic_engine.c # ... ) # Shared assets, fx-9860G-only assets and fx-CG-50-only assets diff --git a/Plague.g1a b/Plague.g1a index aaaa1f417ee3502fe8c6ab1284af71503812a5fb..5e3df4abf519c68203cfe81760680fa0662aaaf8 100644 GIT binary patch delta 7176 zcmZ`e4OmlGvgh6e3h7n|NLOFv7QJsjnJb;k@ASaYY?r0(d5A&M@H)>tP zsYM(yF{A_Iev<$#+pCAkw;+Z!-~&IRi;b89(6f$>oNuxyioQI6PqKfP*UBKq{~(Mx zgP5=w#H4nEO{Iuot{_Hn6)^zp5ecMAR!hREP`HipoS=6^d+o5HF!jbK9iIwozLt zfouW=>X!j2T#?I*#TWfk0*1gE5f0+~HtnF#4sTq}J&p_g{6i9#)2C0r191Sqf*}UJSYUR5!oLSx$xOhx z0pC3{hAxl*WF|lWET8}a5eET?fgtX^>C^^BQY-e}T%Z+SxnELOS6836v}@cq=4}`5 zjk^DEY^pQET#A&M-g$M_yLIafgE-YvbE@SndcdcT%qFzrz}dbxY)Y=;@4a-C@;! zP!l#HQRIjv?nEC|_vRgz{+B?F@>0|0sUWKdSvlWJT{R*g8YcW!UL6XvEtN~BICplr zX%$yHsT&HlMwP^EnQfkJnr)nIm{lcPW~cafb~zrpgGhiwE-Yp#i4qAii4+O$-Z8|a zL&j##;QZjckcD6p5g_#ir&`H~4@|z8mPmC4*JTos&9BWfA)?}kBy^-AN~axJ;iKIa zQQ1S!EQ!pH(mnrG#1pg#R%Ciq-BzQtVryD+o#L1@tvQCDQ&icelWgorYpzUl@!%~j zi^;04P;52nGqS1`y9GQ&t{}Tc6nCAQmckCqm*h)SC@oUS%@B!}l*A#fWfn4s={km( zf7yYU{dWN$grw{yd4h98@$1EsyTmk| zCyKZ|PDMs)IXQ3Wx=dI!+(wDQhN4tlvF!Izrs=Zjjwm%uUIbupTA7l#mf6KcCf@%( z%<-TjYABRwFkux}H0%mBO?SlH2~u+1Xeb2mDDkqPV8<=7$Z_i)g$|$;$cLb6#E|O3 ziSp$}STwYuh}j42z6{^4-V6M_Gk9?6TXE+shzTu6%sC+a3h=YgehBS{qz~{B;2+&} z?g(8^ZF*cNVO{16<$OT^9Z)d1eZHbV3gc1^DGaZN81&gi69VHpbtr7Tpjv)AWq%}5 zWVH6qAn=?OO-dX>&Kcf1DpeUo3O-_#r9*xtQWfy8vyIX=kCZ>eQYAx9fP0HFPD|KN zs4OugZ{%?}JX)bW1LHXW;O=rZV)DSR0tEda7kz|MCc6>(FQNkq-OBL)pj#PyKl~$F zn2QI5r=W3`F55}b!u|M~XeVj35x<~cZpC*ais`VG&YZ~Wlz+qp;22Yf8l|$g0@_tlHF3;}7x_hy&%$#=+$SoE!beu@k%r}X zrIxCdK61)U7~yhJH)v%tFgI% zZ(^;Gg5R>6E_R9Z2HTq}?C9lWM-fFa<@kaui-u-Krl2zuoCz_NRA3f^m@H79z7luG zHu@*QhI`h4AH}ZsqVWQ(jg!*P8l25>GFtLI9Bb7j(jhGpH~X!Crar}$FL=F1!=kyrIDMCl}KG|GE~W}pI#ic>6r6M;#+j;%dn8=J0J=- z5Tow)-4d)Ppnnqp63YsCZ0&?ZIEon6P3Mu7k(9p@lBR9Oc_xKV`;#P1>ciLMvT%rD zSTuxsZirHm#RvCO44BQRX=t=e3!TQn=a_$`MzJ#Otw1u+m(|YuX-zbB7guHcHsB#* z>VaVi!U>tH={ycLWqwTEb;e}XvV*-YLNHDtCTBlBvidLO!B;q;OU3{u3B~Dp?i-5!_;Y+gbv*Fnb3Wf7^9<^| zKy^1__JF(49Z>((UvdPNHp+QIvzoHPorj6(^F?S6OuFX;5rf?XDaIOv7Wix>V)XZ6 zB3RsuH=wu<>tLQ_F7W$nCDncpH?)%R6+I++`1F!K6VxG^DACMpYL(pjO zP_X>eAA`+@$>ucS7uKePtj`7hO0Qm~wiF*(yGg3;0G0cFaUhGS6~L9t1^ooTV*pGz zbe%LrTRu<908&0yu1oT+K%oev%bgwTzM&$0MlBdb77>;Z77-@ep?x5Hl1<72_y(l| z?|%N%f5xg>U+M3)I0v6upXyDOLJ_{Z{sCP$fJX~c>B2LZQ*@cSimw&D4DZ|xr|4of zp4{*YXq@|tBdL($lZYvTiHgCKqO17b66Z5l|JUR3AON`UdZ2zmD2dbt2w!oGb9d=W zlmrG8UHu^oF(vul6=O;}@SN_`NYX8Z=;MLHiV@jk`j_NxcCr&Y@jy)AU!G*@UhBG zG&D1n>q(>BSP6~u*v3kV)WwHY*8{7ne8vIy+6!g$3xm$+O~0V{WSeY))Lm5NbZu^- zS5%zw)xD>AFzpu#y|>u(hUGAE65?KFtTlq%KhLw^(NH)WDFrr1{QVpv|)Jm>gYGS!m=CC_R$(=&VaC<<_U$wj*dT5Pm zWnR>lk;bo*zP^Vn{S8h-ml2ag0B%3l$9G(E{c*{M~I*TmZcA9xNa*M!ohJ2oGW?@%W=IStS>t)$hf@tnb^CwYlbdYsbTKWxNbqjj@xBThVjB!eJ zD>rJ@r@ijRF30Vi)E~JZ@iR;R9K}Ze^DQLZQnG7zjPA*v%RT8jY1K!!fyWf zA%gEzgh)x1pOT*~k;YkSH1v(6iBYTCNkH>$^|H2)sz z#Hc}2UzY9Py9I8kY&&geKQYqH?q=J}-L&mRpwT^s1@-bzA&hr)>dj@1VJ~P_pIgtX z$}iR1Yd4nPe{S_}ZRVr_o28|H&sZ@J^iDLr(|oUqRruw7HpU1+3@WHv}L4a zDkUKGm2y?ey$W5*=#-~^XGW>vvb`k!JmS=LrSGZ1iV&en$QR0l8RM)t{!qJu-%BZk zp!Tq#wq@2N+cKL^HP4#Ubv1_crrEWzjkBLo(VH7)+bAL1P-~eLY7ke*2N&1|z#xiT zgFcRLHPq@T!F%`CbE;2XzeMG^DS3v0j#4oK0K8>@#hiY=66D)v0lo zP-dtVW(fDi@qc)WN1V)^_1JMaJCOKPv(s^9iW)->#}u;L44N{PPNxX%>2@U%u44=Z zkfpFE8DSydV-*&{3f)v#hs9<1X=+c(y_C_r9?NS9%Ns5`UNbuX9QEpW@hy;fFXi3? zk0Y`8y=K-faqhLEUvGJ*slD)4@)yl4$FibZ&A5$FpV{(`u}gJJ@Ij^=XBr{~!uKr^JD#Y1fi}s`iIU`PQq%NV%FAX`0q@#qEnmmd%VqqS}MX{toW| z^R$aY%qQkrb4nuM-fWp2^8o6_ATPbjUp8?6feR^DS{ANQf;u_l*cWQWy)V3e zE%V2af!K{+zgm}@)oM??V?BCBX0dCxca9hp+k2v3Kc8LwdqbUUUBZ3AI;%(%p^hl{ zQu>0d$qkboRr)o~`lf1_^-X4MC!W0irkc{kI>xfAr%-x}V$aA1P&nflMgjG* z;i7_s0?;PgWe6Ktua1y5d`4|2CO1iUxzW>RkEkb*aO^Ypf9Vnfbgyru@-22ynGo{YJy}XSm9;Lr(k)n$ zSnwl<^?)0Vh{2kDw-E`nV-JM7&@5{eXI8HbZZ0&WE5B@%t^d+-K6>-bW%oSW#*2Pr zcCOt}xWREQ_KTwtv6kN0;ozG7+J1FJy&k4&7!EEVQ|+4aWEkvJMqTFi`(&yw9XdCf zqgfu*Ng*~8lbrzD!HSl^3(7j#8dd-t(V(9|tMV-UIjO^eHC?q`>Ih9jJqE>`1;sg_ zIHzva_IV#-;p?Q6C?Gm&)VJ?%RKe=5!FrP{9}Ok46AiWDs<<3UqCF~l6&y>+@jL3; z*CnotP>E`+wbJF|tlIWizD9H?cSMW=G)Ntz*jg86|3{lgvAy?i;Wgnh#0}42m>$95 zWR-|nIl+pR*0ie=)e(~9>w*GNI4wyI4+EJF`;EHxaT;-B`S8;QJAQ|q9%qx@5LYT1 z_ZTB%`NnotqFSUPBbUI)4lAj{;bBWWbJT(daMmHjK_oC9qxv?Lmeu=gO_?IAH)sCD zl6A9tiV5DMG!Q(UoLX>_$>8kD^qycz1h+|bsxl~$cCkdXQLQh_&bFmyr`t2733^SL zzA`^uYG1O^T%I0hTPhJ{ZMOwUL?{4yf^?}ZG;1paiaX|kUl=IB{KqK3JUSit_1}bw z0_@*`JpBFuM~TQbJ4QJkpa5xt?Jt0RjRHz_Iu+tFBHPzv9>-1mpkszk6X3~hd-!SO z!ZvvFc@#=MF5#k8dgxI2a;6dPWR1DRb??J8jKR$e?qeShdfBR#@WI;Y;}Np*A&MjI z`BpDm0&GdqB3lwlA_$}31$H6x99$Nkn_Oh)9f1@iqdVcF_T*#w0>UI6K}@n}p$qsR zd=3(M%b`QD@yv>9FN-<9A2GQ;{IM(%%LQL@kKn-{pNNh%MJL3X6491z9mbA^ms^Nj zySdq1OFAuPGp^bpjU&G(?PL4ytK`l~U|$e`;7OYE#Ev>Da-SA7ct3`SDtH3CZ)RU9 zj@~JZ+*bu%;`+iP@FL7U11=?O3v~a#(XF_Xuy_1`9XLO_6Au#hLFlr)B;Sjy5cs?A zn2${&NqI@Wm(LDn-yja%1*6Xal~_we2rQU(5i1G%Dv*`{EIdoS2(!<`XpoDlI;v4}ongaGC?1IrXI@&mV}2EgoJx?-TN~=L$`AD5op( zYp?9ax}U7ZT#)dqs8CTn6{piDff`Sre)TWBUEPnIL-xct|MLf7C-!}Cb{CZbUz%HB zqijh9C`C+*3t$59PJj!51FyvZ@DKPJk9H1xxRyGE1+?j}^R2!33blF+?2Lic16>4yqI5I>w|UCK{(o~$EO z)rvK@2-TGky5SBXckP5)o)DTkPiO$v1*8$WX$|B$2=%WdlxD-;AVNc&%;R@DU`^Bs%TdeX(h8lHVGg!v4+q$x@0}^(AU*3>xnR8uUtaU4gf|0;5owqlu&Mu z(lah3=t$rgxtcqvuw2@lJCbO*`rq?M%j5KKYT53$cE6BYu%+H=J$qRhmQ=92UI>p5 zi>jIniea3>5=V@CC_QZwbveZhdCi@^~0&G2CK^z{5QoJSyn-Ae&r;Q>~aYmm^5r7Sn#Ppe1C z9q#qUQg{u|bnyOpc$R?3Idi2FjX{WU!fTm!aBw=Wyu7?(=cwm^<*cYboel z&2=ojfdFn=W4ZLXpXKV&Ld$#U8!WdSyYtL8wQIsuT>Z`Bc~ki&qxxm<`r{X0dTPqF z1(tntIJruZ9ymdU*Wy<>PE29PFOIJ==_+oRLQgLYC!AdvN!X))2*^@f3bNFb5s*_H z{_YowNmq1s;DjZgeWCbG%w(KJ2Q2?+J21oKS{cjdSkz?dB6bB>*yP{I*yn!h`iDc? zf-UCXtG_ruDMD@ju-0YFOMGpvdai0NeO=|;?{#0C?|nQO#ABsJKvz2a{F4ybYaS@; z5ciz52Jh4^$?({LG!mTR;_>Oe!_oY#PxW#7HosE~pX-IB;Yfwy1!I2py|5KDooKKc z5APe+COO;u&Mu7W{iA-P6%45t%FPwlEj8u3Ej0=ChvE*W7MQox6j~33TGR4D3qO^* zo&<*LxT%fEgY#Yhis+pBdG<5y4((TIOuZ`3b)U|cDD2Ar*peFLD72}AVpxUg^qAdr zv*M!g*RmTX>+%1x=nnml>BfOT(}dSz3nT$YgB)Qkr`r^Tk5lPoWlO{7!n$No8rrg3 zA})`w>u<9-q+=Jywe<^P)X}@A7Bq%!#vJvw>-jx#`pYTD?|Nf!<`=)g@)h@1yLN>A zZuRB3vM+b&qdy%N42Ep=*6aBf%b5P-Q-VHhI4V8RWPT7?_GQ8227LxLKL~J0uJw6| zwR0!tYUbo~;+6D3+xw_NKdj*z^dF}Oma*PHI;7sIKMLd$4@eM>h*vT{Lmj%AItaxP zfHQMC0j;bkQ{>oI;IE> zY?2F*cOGpEFG6WRw^z{Yvhhwy=&oiK5^h+5N*lxfQP>=FjnL>%(6CTP(Nhpr1CV8g zt%UA?n!S8^kXP&wZ0jZo`A_Z|`ofclpNl8!SbyYC#fUoA5cM7g$*4akh!OqlTJ$+S zgd5%wYd!3i;h?B!((kt8-ZR@znQ5V`{ z3;ovc#>`4$R?5Q)vC4c6S}Q~ z4JPLJris}sJjpC>>yWl4#fyGc+yZXqSZffIK4BNuUS1@GB%94Iju3&6JhRu&HE%gq zUid(13#|CkrCcpPg2 zW{4QVQ)@+<#+p;VBLuM^>$@7hP|j1S-};&;7+J!mUjMi96C5-TVu| zD9vnsRT=CH1_JUKpnyWuYp&Eb=gkKCCk;{28{#{2V36zEckePo|(6j=)D`X`!0Zw zw1!@K%*~4S9x-R#f=ZahW5N$Ms|W?k4-@&8RR-u{-o0jRR>vZ#0i@>ktYqI|L&_B|0KK@%Q{r*ELpTSPnus_9@H8~}$ zd;cRbXNq0RO%Zcu*--9XLCsnZoW$?^f%n7%nXK#JI~b(QJcFP;fWym$BM0C}uA0@@ zrPb=E3kwSbfY;&zniv6>OCfp(%A~aXSA;k$$W?!xMd-n1IYN22*qwrp4IIrw@a%}` z$+`uuiEE}X;d)_=c(9q>DQp*O+nK${H%t^+#e#XJFRs-Tx^a{VgaUOJx2sOw_tnOl zLk1y|A3U?bvv9f0g8u4E;LkBAs<9nQhfUUCS(Qc1}nfj3Ogi}y5#A;yfNWQjcmakpZ;j=^A*N!6(8>@11=s;~fF?jEz{|#}G7P)CFrrhgxm}Nt zaHA+@rLV-(s#CO_&HpR#ku}W8Ne`E$ZA$4@b-hr{AJzOhl!$ZbNA>Vh;m@MJI{;h^ zeZcz=(LNZ_-wHsa`nv!g0A%{T{LRGg31mqSu{$yH?Dbq?wwx6*uNiiJJatbQ?Dyjgmw@-W>9= zV;zLXHZ8MbGl`nBZ!5vxPj_OUUHWDAjv=Dt?3*L#^&`*dOB1?wh|uKRB^2`s-+y8B z=D?LJ&nMBAE1HiW>yw5IWf2&*&ot?~cG1B1dhCbX4&%RZ@8FhNt7-#nbU3oFYEV2jW)k8qJ zqe~x;DC~23nXMVCx#ub$N&X4(4b(Zo>NtDmZ?NZCC)kZVz$=w&<<*TL%*)w4+$-6# znY1ys{oCNK@d?YmajEFV#gtLbP6PV?_|=%r9Gq(AN{BvKFHz z+22)1RzDpeXa9l)_*6|EVh{&NWuT1v5jzPNY{c%zdfKlhFQX(Gw_nc+@hDsf3ksKm z1V3#eTjr!{c1aQcgQx$-#qjym32%!JidTLeLJkXi>j&`|(`H{;<;w&}a=G;I%+Nh@ zq7c8fr~kk{eQS)p@VyO&?-m!Q3!&-irbP>({PjPFo^N^5!_HkRkM=7r_7mNi%{G}$ zs(X4G|7_YbctL9X-r7Xf%?VWFl+^u;^TGy7XiYAl7U0I65&|$|J^(-=p8)SfCurLM z4$1z@J%aR4|FTI?{bY*JpG>idyJuWyz&}&BxD_Gv=pdnvr4xQe_R;9erOSlH8GXr% odu;F-ogVqjH|O-F?<@0a>`{{d&;x>qlJ-v#cC;zLhdi?Px#ylU z-urXMc=zAwF}k`|%{jlC^Q&1kR;^VX4ONjvLncNB003z6a#HFqzd-;1a0C(NrN+&K zs|x_oCHiXWc&M9tfnD63t!y1E!5%&?mS9V7TPpy-d$~5-){RskCH(hKTz6Q9gl&k< z#16ds;~ja5#XC)=X1)WqbgAesaj1Q(>zk)8yT6}rI)DG@)pGY(vSaSXoeJ#OB}WLf zeZE-t4usEN&p+usp*TA+?m5xAySLx6-?YE?mAvzPy15ygf)g=@4{Yu=sHm-{_+lJ5 zeX(or&}+DN5Snt#aQ^Pev+&uo5LZ+b(U^cR-|}u&|LFjG=gxn1UC|+bT_v#OzV69A zdHr`T^T)P$=Q2W7)f1ts++0zGF3RvG#Afsbz+M4fy5^dH};svPX52HrjU96WjotoNR*POSQg zRFiZxly2Lrtt7&MRyg`g)ks=w;AxWDkL2;`;N~~(f)wnL zqq}+V;M5dtS$O@5I(aF<-VjQBeSQ<7XP{wF_K)WHY@}$!TkMo@Z2$Pih&~a%P40GR zvCSq8Y(I#gn7mK?yI#=8J%OEUDa1Eqc_QeN(KeFKH3f6Gz?1* zJto4J+G<_t9$vlC$JIg#7}6y%b!utYU5(4fM5EwGIq&{OA9--=|C#iNt^N1CdPF1l z0=r1y-h~(P(_+rZH;w8c#zXGpyR2Jc`82*44zOxB+ftv4;ok7J;gr{p2u3P?O3cL%_jE&ujN)%G z_+A(>-!!71E(^0Pm4I35Hq538Y7 za0g?*C2`{EDt9I_Eh$>WYP={wqD&D}VY@$nXr z+^-rtaUXI$oQCbD5tfw_E(ajoO~!m-PIrgd&kT6^4`bk7rw`pS6|rHCgTkrUo`pUxSXQfUR%aj6*|8g1J)td5Go!%oU5_?ns2o$ zAhZ@b4B77D;|C4lLrI9ptc~;i!S%ZwUhi@bS~6#@g>pxMwk7CGo&7d^xl+!q&9fTq z5+=Z>IW<<^!g$~1D3yFzc;8F^og>JDaD!{vgHLW^p zTQCmk)ef9GN@bygw(uq;QXC)gUwz(DgIiaz(Pt^+K~4N;P+%$l7ea?R=|FUZuk=~ zMk9#-Q=If9_yZ04p){o`d)HPyN*X5N8~LH9Ov{T<19(J*R@zK13e)TTuc#<}ikMjO z@jK{hwd5{fklbk0Tf5+!H|Kb?pbOGE*$sCFS(I>$hCCKP)kznLfOM@qvTHM5a80c% zb8#(xkM!6w{5tX$H8Nvz1qZGt5`2A(i&#(}L{c+dTI5M68enOq>Z5$2VnI)ex~G1mW(a%TNPGUA`?D#9?E}IqVxRisthG%_Zx@s4YMlhF_C(ri45Y(# zqX`Yo5v`S56eMxuc0T!@h?EELt_Ve(o}aq$p(^dM-KL>)mJrNj8bx~bX{atH`kgcq zmE&}v2_++%UKQE`7XC`Irl1%_LD}NW5obdwZaGh=gRq-?HJt&JX&8AIPg4U_GczT7 z8toiCyv^n+cI8g#Xw#LP68^n`zr5cT;0p8pbEgdskN%3lxz94!F_%V|ci($4IbD{i zo(A(hL^%o*=MXBq(2TgXQ2!slhP8sny8;Jn{e`6b${#1t_9ct(^hqI9n$ObG)D2iX z)P<`SQGLKlhI}l&(RbxAi(Sz_fMB-AdIM%Tv=HRtv4fJY z$2zzRYa5(}Fs|WUd(|!~9?_?0p3bNJN%bx|4~wJDAIne7K#i$PhFvjL^@mWGGIk1f9ACcA`LmduA==R*b^1ydgrq4_nS8C6NH zhDl0@eYJxzPAb&KZ?6E90FXNbJVG%+>iI;qw>)&upL9|^^M~vxEu73hAiYTn@AEKw zo$PE$3&JX0T_{-v(spZqJJo3FA=s&y4*-u!q>!abSLS~ zO;nFpfCDpPT{1b>K>DIfj%pV$XDo;OlCm9+E!5ieO)T8MvydjenRZn$3pB&IM9)Ea zLm&bWEls>1y#4_q@_$gnfbZ$GTS`K;%=tOCeSpYtCK`p+p{MR=MqK7ks}Nl}6*kppF3e6^BkotQMSVj{8@xU7{Xald zSv7BHtlGI#f|IgCjn#UIu*V@WDwg#TnTROjAF|_U+7XBxU|sbi8RDYS;gy4MHTe?E zSgwcU2`iG_QuSV$+yhrC^Y^30aF90GC^M_^m^0(?3O@ZXDaLDhfkt5?YDkhq~&7JyQi?xHmI$mTP&%io}G`*OM_d&JCbj(jze z^rqVr!p$!!l-#Oypd1KJ!<$6-75K{@L@^s|)!0%llNs`4V`1c(BmxyHL1??{jHoCQ zkbAq5*fZKM1|`(6(F)+cR`f}-K>KDPvzhu<@|!CgopF$-gihtdPf=F`hfoDfjaz9m5NU`wJ{w%*3Y~5+#$ps^ zgE)1Hj(y5UKz7#ZfP(|;wn}d08uqW17)?t4ifbbp=Tf&yhw=KKzCWrPk}&K;Xg4yc zJ5A=%>}rOX_k6v8Uz7`syZaFR2h?ZrRC_~1CPW=n`v_Sg@xQu89EVmH$edS(d|W+K z#O0mVot}eA7bqZ>c&i_U7hQ)^_2Y5Wa0qZsCjWL=6o~Z54H7vwP}a{?65$+uvzkj+ zFQI{f@d{?LhU3!==EQ#cmpMfbqUet^>~g8kzUgwt=SU`l#Oid19BzoIuG6K3SROT` z5kdNNU*jxxk);-on9R`aLM%OLFz6z`Sa*ai%*D!T!nBQ}^q39CJknqdpKW|-SH@EF zWbpX1rYYNoxWEPFX?LzJxz)s_%p^wijI5}XXqo!@Q@G&SM!$chn^j0C_ZG`E z`8Z-lj@p(IOgf;uUvb@xg=UA)K{i8{=Ao%}&_%Eww?E}Z&(%S17uY#25s!71jEO?? zgEBaIk6yZ`$d3E947S-TWo3?(bbiCJL%-}+aH7e62Bb$9h`t8g)Q%XEf z*$5$yGO>{ z3a$vfAxplK#PLByv38Z9UR)|;Pd45Xpu$p#7Scdz;rqOC& z(J^qGHdF0HlQO$Mn{>Sw7lfdaxk9%SKD#yG!9qHBB4J4Dphb2kFxgrm!^NV36S+mr zhx$3E6LvG6DA(`A^+seB{`d`Rmj5k9P_cN7{Hh*<+BcQg0 zQG7^hd^5+o9h2Tq+-*Li@y$-FnUp)`%crJf#5{j#KQ~pulF!k4Z|G50j?d>M|2!!%G9`;tT?_s~=b-UP$Z%PkEH%5ah5(1tO;Qq0 zDy;K87Ddq@350Nt%}#2i1oag+ID~>M*{Wh-vTA$BXG{s4Gs`TYfQ8ZN5fy1z&qzp^ zFi?it97p2jF8}Rg=yJ+V@ROLn!am^KF0WGg*D&>b!JXBGfs*Sg*=iW?%=2K<-PJP( zu8o{4M4r#1W{|#_4jH@skQfD#gi{0kO{u+v7$AP2eOg8XgeXF5ZJPZ4flT89403#c*NpYn!`F$W<_Tv@M%;IK`&$=TeMs|ODow3dNx zfe;fFc35teqf}iaU!@c;!|+t3(4l+2*+7K~U-QutZWnH;usv#9SjQySqmJd2{&Vn` z;58cq#KbB(t#?Ewl4A;pHMlb%*BG4|H&>E0Jw0t1`@s_OPkUvE%w-wV-@Tpv18!!6 z4_{R>s>RHyM^Um|ZEe536CER-;9E?(M9uyBKDIQjS*CB`Ob`uBdoZni*;gwYa{H5G zG%ptSI=8dn8V6AHg}sgR-TBZs4pSO$f+`)M55}xP%gDDhdWM2rg2V=3mQ;lb`Yts^sn!Q z#dc$b=#cUnWBLZY#X?G?69&!5d}8Z=@Yh92t3lM*gmtp^kxdf%y&t2OFIkq_WQQ2B z7v135u|wcyd4UvBh+)G5M-y%R?&D5#yf$V?!#l}XB-%678+iROBau0Ux*|a_IoD{7 z`6#+)Hlx)kGU9RgEdz@#a-8i2&&UhnV-X7!JxzrckyzVaF;c_7Sdd!UFiZx%A+_`H z$`yMaWt%Ij6v0jp>Cx5{$dYOHb+bI<{w%&63PpUXRY@T>9I6xlkf-fPQ(t90zoBy~ z@s%7cf-q?=DTz7#SHF}94Rp5<=8{ERkeQ#zt4>lR_*^zzQu9V4P6m^P=+LYEYeB}k zFa4y2VE&DY)?$f*Elin>!%CeKF=f9VuVGR_{uZLI!q%{WVGyD<8{4LVvS!aM8Os^Ff=z)9Se2t?wcOwL z47q`%H={SsVuoGCPc`quKR_*4*k03{x2UvlSN-y=-1G_wyBuQt^}((qFaYPwB6N!R z9I$@~wVTWK{c7Ui6O@1&Zy=!FsAk>oOMjzqEjaqc;>tpW4pA9S`~8Ew!v1Y1jQ~x) z9qkDi?h^87!G1Um)}{Hn@=@|Eg{FsYSa%s&v95Xa5n_x6)%0<+X@>hMR+7~yrebhj zL&q2#kpfB_CzrFF&@%yl8?P(`nh*II*Gbh9sJ&UUJ7P?LmxY!Y^||jCCd4iaRA8Oz zr=rsB;^?%Y;{XdPTW!oKvQ-q!Wy{A=i?4y-DyhHG_$1)r6={DuYScB_?NKi8CW=Rh ztccxP(q{`Fr^OI%^MuVL`yF>ENc=n#HvP(WVU(i>vs%=g2aLdLlB+K_ds9HYjdai* zt-8hU>E&ih%^PxOo6_Vj|9d8a&}~C`L|- z$Zy6g53(p3`AQm7ntkuvzCv}xD_rF`b&AfLB6w$jgcoxng;mh}&Cj@_Di-20bSt=F zX|pUlKxzvep9YRJYZ7@^F=#1Kw`kVESC{xL{eGl^tO>pm4=`JQLU)28HDQfd6Pgu2 zmY7Yj4F0`wEYq)*+h@yCYhv3Orj(U}tgK;9G|Z;@`BMrK`NqKgTOBc=1sRDmK6;M* zw0l_+N`_V+%;$|kHNgn(rJ96kT5UP&F0dUjCWt3ZsJd?za~DmAd(o+2Y7CA$EEJw_ zx?K{laBdp}T#lVs7F-H{>!BAlDFzb?Gi9P~a%+L9V=hupvU&Bk6m!^MP3b-SD2KE7 zr)pj63F&yeiTg||n2IdD@-3NbYgleaIJ+J(kf$e28obAYXDjf%!KvCFA zSAHb#PmEF1++`z*_#eNmoxzQ~ik_l)=o2oJ=Z+c6qSFZ3@xo65@Uhj;wB?Dt8h?PL zS^vo(i?y^WNHH6|0Eope3a{zfAjT3CI}+olLf0}O!yWI~*NX>p6vga2sHkhG&m|cz zrVf%J#d!n$KR>8-lXngp_T3z7N@g5XLHPfgBnnj=2%z>eu#!}XLXutfMkG*pK{X{!2SqAJ0AETnhM!ID~}d& z#uCI4HFT*M!M8HsdO;G?72T%ch!Yzyo_$_FseBC7Q7D8UcQ%NTajZRaB~oH3$qe)~ z0t2;gASQLSB+|QluxELSWTc@{j95-jJ`zGhJx5DF?vE*!li{V|tAB8Tw}@K2FK=gq z`=!!&HZ%etu&)+y?tLVAZ5?negtqvlBm5(af4nYw%pjXfBu+bhORXqx8S5dt?J106 zdS`!?$xfPypQy*~A0(r|X9D5I!{Ha2=~6U3hxiM`#2Y$%sibW} z%tm0e$;Oi2CZqhC!y?yeQ~Bw)BI1feX-lV4D_m>VLrUYQ@62Qs2BL+n4<;E(S6<4R ziE+zDsRo}ceao1fN*%JVl?#IrO0m{&z~IIPa8f)b%*_{i!w2V%ki!WpqhU)1W_ZcP zz?O+5Q+C**sQS=l5RYq#T0$mq=zh5!@T`lrJD`q6n0fYPidIo-&Q9(4@;nFoF>m_cxJm<F}xaxw}rLd zYbcgd4k>2CWUW#uIwOBe?f6*D;Nn?bsS3voH@$SSXsn`v5?5jdQ;W$Yg@OT9%d##U z(&UeTq2=p1BWoe%1zXP^_%8&PF#M$DO0X`iB|jijHjg8=F#S%zSo1s-#Da9SXBR-N zz+mS2+d~LNyXU`j63NIxeZG8ZrD%%i}{O3EkBaN9B_Cz|n%m65__ z%TQ2o`_2FyTA;NFC9}kcOn$kwk*C~PvRgQ9BTip{n~nl0MkLiKyf$blaH7Vvr39z|@D>e}nE92qc%!`*Sj(+J97o7cX{4 zER80f)x1{o+H&tKN2lnumL6FsjcA(0sHCmKP0c>Mq?|DIK+~w8kkoUSpcp{2dydy{ zCjV?Fs0mp2;Hyqm8`r)oNW~sqtxd}&zh%KMG$_`Sd#xj1+=@#yFT%(U5G6#UVX3y= zQp0zl8ksp0r!O9}b&_%2y^2s7#}%SEde&+#BEl4}-i`BqdWJ$vk2>2~S! zraLZ^N3XIO*&wgUX5U3nUZW2W&|cW9*RM^{kGfunKBIfCbhP(i6kkywz-#O=zxwEp zAss5{qVDXAKA?5m^RWs6kODuKB&Nv?gJ@eXveg8P9er(u)?@r5Zb8G3Q-K%PfeZg- z0}|$?#~w7(;l;jBIOz$^vn$?>o?d>J&&pfCpbxVK=YGD0i#a{`iQMxW{df0bn$&jU z_eOIRGrD9uZTpn<7j)LsNG8{YA`g-x{&dvDP~&7`kZGW0q=8oa!1_A=HT zC9_jNX8U6Zyh3g5-eg+WhEwstSL4v zLj0?!L$iL#+;eTyJ=b}XrOR5s2Dl>z+c`e%zQK)2_@sWKCrq4VwU0Gf>dq8btZ0KY zM*u?<3a3dqQbs;!yX87amv93cWowWUKWS|Ex<)C|`s$MK4aBCV6L6VFptc8AN?J{n zrI)qr`t{J*TIP%3<8tMIjqHd%)04322|(@{l>JJZOKKY>ZXJV*$uq58rTg>7mlV;O zo+tc5Ma(Gn__RaVHff@nry?d>3B@RtMN|-VRP%PO*{4Hr;~@OOcou0?b)&Ij!fc6EjjzHvzR6-%c^21g-}qqsoqDAEScu2 z_p(HX<&b%}6bF3;U#!PeT-jvj#)U&bre=RS`=TNktS9F1|BA$$AXaOi zn>q3&4NFt@@uDI1FA|@r9c=NsXW1>GXV$g;O36?BM!{M2ys1NxoSp2wxj!X=n^!-r zU;w$Qgjh8qc|5h58tM!&O>?5}`#!X}k9vv4?2)oq!oS3+FGJ`)CL8ML;cmd5^I$3& z9Rq~z_63J;hDI7oQiVO5t+r{-R(zXL)(&j2@t^~*BM9*LF2UWXuPl^ zZcvOcV!aGsnhE^~OqEh7sEdi`I>&@tC{cl@=gHA=iIK%a!^oBpV&C7NKU@_W+gyiU z7XrQoZSL%p>`~FaeTS zm8&^UKwhEW%YT)+Z{Z_k>Rj|@cTeL29|S{n#=@yyl&*CD(Z9K*GFd|4f1+VeeJJ$x}hyaN8U+=?1Ah0sAY2C*c$9a=IPkv?J zdMSKk+^Qf*S6(ki2%l_Ujtc51D+!uAJF=NtIGb6rc{{qi93=z*ghahvOwH{rJ-}v` z*0xT9yShEX>Z#%TvQ^+U?DdP zD?xQBnSVgMTnSUzczC!7va@@6d9itMvpKt2vvUdv2(WW-v2$^;zG$$z`#5=+db2vY zQ~!bZ8$-&{-Q3OA#lzOw3H%4s)Xdq_Lzs%{MGpQi{~TSEmH!FvJ@jir+Z^}j+`nE%t>#na8< zuW&5P*)1I`9bZ)4UwY;Iw=QMnm7)K%_(OrUt)t6dRxf1#o2G}Y)qj)qZ@&GJ{1wi> zI`U%vPuzdg{;$~oQhw1=Ru+_UHuwDFp1hPW)t~+aEu775Ed>9n@|l_P@S9t5v-0wq zLRfkDdCXW%Ir+F*xdb3q5OXV2OLIQ1e}R&Ba`!NGGPnE#^#aaj`+~z`#>s8PXJx@^ z#l^+T$^+rGVuf&-Td;C*@N-(3^YdDmTk-r0gsPkEOIDgX{Hs@gpe+7Caax#jnL@1o z_+ZY;V`0X_YR1LE_orscWg!6J=78}11!Z9_DC6wrX!2Sv`-{YAs)PsaZv=QS){|GxTr3OLyQB?5#0N?Sow^S?WBH+^Gi@mEJL zc7Kb^ZA_i4EnnvMKN9M{+HL@^Ub9a0zm7P_h5-hiJ+Hu`=hf;$k)B<9bPH4jwL6h?%)5D;LC!$DE6k17gnk z|2IS~PQjPpxVZm4L?QM+3)g=Qsu27CHSB*Y{L4!BLe1Z8FDvNFg3SKU75N{W{mGR7 z#m_&|?SHX{7wG?V@;~DDKXmS_`X4dyKT`frcKv^&3;DnIbe2vp zH+o(#JGO08?&X)=9+Hckt~&sLg7fDK1Z3q9zBD3u$SX@DY{QY`zz`Tddr|@b*eLQ+ z;+o#eM}|wSTTF<&y3fDa7Xlyw8ZSFfDc41jx&28_Iv^1rlR^H}Cr_sZ&!;EqyPDm4 zagtLr?hnU*<3)?_*sZzD>Q^f!@%#Dg6kKLPogGVh?=K>3!&8h* zMF(-@PK{X%gB|u!W>z=URfCETRpW$mFHK8U&k?8BHTTDs|K?r?ZC~X5jPDr&?2Bqc za6fM%bh@e(_Qo}^V{ zRHiWU3zIcP)y3i6v1i&BOB4ODUW%iKrsvt;RV(Ul2zn~(&v#gFV(5?4QBAqJyMth* zAHQJ>vI#bQ@M8A6sPan{VtBhVQ36M{!6JCo$>sXAKD69)yA$GPIezW5fD~4yVKD8D z^7hqRww{g+qxa&S_7qBx+#IBbX*CucsnPoJ#}D4h9e!}dhIG@tYGBxt>F>tafyopy z0c9=qzP?UKzAhyd(uH@)7jjs%!>6=5aKzNG0vk)i@Pzw0D>k|Fn|GMn{lz3EAdfaX zyc_K?t>2dC3q}56s5TfXd&@@slkn154mZswb@vuQG2RAKZz+?gSe(yUJld4H4Rb56 zqxbD-hEF=b!KL<|zM4IKoQOd3(zO@d$rY*3KVev7sbN^DZ3GL#@~E@hGa^esA!iIA zJY1y;gD7ty?ieEtr30#8yXxY@kl+sFP113bI(T?2^xFE1{d19To3}w|&p1Bf0=5AM z6wKGS{1#gwM`y;Kq9s3Db%z7iKxP~AwGt;~^Gj2lfJ!?7rbj~=Ch{2^FT3?n5luKx zPv&3oi2I4fZFvVKU+VH_9th*^$-N|ax1rVtOkYt^Z3;Edy|aoga1Ka)Wus{Yz-pwymZ~HH8U0W!!M@_*u;_tHppMs3M*!L1i zbHt#rXfCAzBKu}%&qes+H+6v|4Uz8`u{i;L+QL)~Xo|-%6}~o!?jYD~S#Yg4jVY=nNZRDq>^^ zVI&o_uU`xOrBMG3!FA!FdFqA2B10~Vd0&K6PPi@=eis>jYJEUBQt01Bp^&LsALS7o zTEsKM#wloM1WEx%ic9!{sr1hj{o~3#!$tvS&U8!n%Y}*_(#hAtAj!l1f}lYg>K7*@ zY5NL;LOWnzu5pOx)|Ssr?kNCG1{ndD97^_tWC}D`0#?`F)+8=PSb{owph}VT@O)8Cade()4E!t&Fi*S+BW96SAw~{MW}YXZ`PUA5*|?{`VCxnBX))0h~#uEj+DmA?TDEe zD)rqIwctTdzzqE9gnYTkzzO!Al(+aj)2QtUKQSu%Lb$OAx~+1GfvvNex5z1ah3Mei zD{(C0xodepI@<*K zFKII&utTb))?VfV->w7To3Mr&TdxTl%B8;~zXlQuXDsiz9%XWNS}@^1m)N%9=M|T| z8cyBqm)ay?=Bm$O?L7dZd5aIf$u}@@XH$wx{$xMud~Cy09TBr^0w6Tm!>fUu+rVGy zmm9cl&7c-&T-Z%azm_5I54!2cpwgn23uxLL1!Yb7^m`a+v|6-pj;?|zo5opLWvkzj z_Q zCIiaq>H2u9;~vqs&~Cfo)~RLEFA_-|UXh&XXJ@G8w7I4yBfP7)?BE~mmQvKJx|1aj zgdQ`MaUWUqmyrp)e~MeISk5FI)W1V@PssW1aj2f{o-1R9dNO@J(v>Mu9E%3&;7qh* zq#FT%ny{hi5|aL1=&ybv8$q3W5m5`e3S_()kfej|&m-US2U*ekq{(Kx`&z!OQ8 zr#CHqC`B}VSH_a?Akx}1zw+t!)llDwg$^a=6laHx#cF~X#G$($oR z3DcLZuO!S_T0yb76fJLu1#A|QJmoic6%_dui_pHGDWvWKFIn?vePTj_ zAR@J;sVLQz@oDXZ5QNRQnVQe@Yy#9c3a_^(EA)5@G45rr{R(}hkM!%yxORTI56BOt zRU2Vl(syFXq6+j$Y|DN4oD<~1i$Z>R4ENSHqn;$of7lE{d911-Dr*_y(+|-T+8B(j z!rr(X?ZE8wG!!8aC@2@g(U~dbx9O)c!;YV;57}e_=SQ)u0895On#4XKjZn5uv_8%z zP#_4!7%FUriA%slt!jQr4LNQDK#w3}j%m3x;L7c&_t}p!of!PM;(KPmD>9$8m;_at z1u0J-=nCA=(JPTnssQc#j>OTf1>&E91P`$K0`5<#3+}&ZEe4`nv!_5q*l@W5@JW^J zNad{jlNTz9q?r4P4xleSm|a2iIV()76S)2Zj3q6tS|K$2OT?jNur5l*DX;?FGZ?WG zUq|Et?kLjQq)B1%IV@uSj|LypHqDWuYWcdU8IC0hy1#r|BaIFtd;f!e_cLds>*~Cy zwnC4n{w|_Hi)+{3HBR-nB8ODEDG*ZaDge|Bh|D*)Av28-Y3@JMr5iF zP_}}I^^El}DD*w8dhQwXd?ec_9wmgh_3U_?^KC9H5`w+8M_;7-wguk`*X6^GK||Jk z^AWQ>cS+OwY<2M6HFoeUNbM7>KZOx6smFK~HLX83o(JI=5D0Y`2 zPVcehs7xd0VtIcN1=5HGf#_uK4t@a8F=7~$l03s1?uvA(EcN(qgR+J^=ypW9--TWC z{&MsXP&Cr7vQ$Ar>@KJ>gMuy-*_6v?Q;|q94>7*1p04%I`%!A}hlr+!AiIjy$h*;7 z+wuR#jICfjVHJ_*U_^J3)astu)II0sKRZBO0D*yY*c$@Asj30}z5woQ=y9F2Hd&tb zxqQC5BKpplxbQ3VOy%Ddy9Ie<2o?F_hhYFchIT@9XdAFqprSk-;4R(<>;onRg}Ma! z;9tADilsYhP7S<8Mjur+QgH-W`C@U3WPU}NO$&P8+@Kl-x}-I!VmZ{o5CfqD(8Wk% zK#=H4D+cL?T7sdoM^r^D(oXWePr&%#*_M4^0Ie7&ztP9YwHDm|9F)|xr@Usu208=0 zCxUlWnJXH%vn!N7Z35^na>k+t7yh((9{CCMIiiKVTEEZ5k5&fw@2f9+GwI1fo%ZU# zJN&t~ zK1g$v@sUJVPnz1PG-A#Nn^BZZxTMqUN!-kV40 zDF8e^mDRz;fDrW&Jn|LjT=MT}&lM_(%tJo)Zu101I(z7M`x-Bb)fLtxt z%d5=?2L_=3>gt2wr;I}@5G2pI7WRX|IyM3n8!8>J3}bJ&PJ+Nffucu@@F*!Qz;096 zuo(dX%u$$w#_b2DMGXVr-O#G^1G~RB=C}xWB}JvdWik1LKieN8(*z9zR3NESnsQ>4 zQ6m;&PBObPL9ibb0J6&4gh3s~rl6Gj+(GQl-&R;~-r`~d*0Q)@AW3c1j|DD#siVA1 z>WJng_~HC3z^0P;#y42)&1NKz!1V4Y5{H@Yy3f78Q@36+*TnR^zLVPvL%@3{DbX`T zF}Ib{%Ht@{crye4MEp6**Ak^Cj(soUEmGC2H=A@L=5v_x1M4y!JP`dBL2#~jz-peGx24@y0Xy0 zV8;EtR{o_P41z@z+j&nGj@NzweBG?tN@oy92Sg|UA^;FF3yf7~ zcq7c1@ocEi1Zo@WhO_hc0WH~k#;348c9m}cREQzI5oTy&QJ|rVZW}q3R-nelUrPl} zPEx---uIPSr^H8lr-`qo`BMmEA16NiPNYt_yb3ies3(B!{LVLr1p)ryb}jS*-;Snx0N1Hb`rR3jD3p>x;qI2;FrjIY}b>pUFw19o5$NIDmT z^sdy?wc${qWg^}Hb{lH=54U`nFmipHsL-5_mkQv|>|mjYVc7Q&TR%oEm|&#B?ADxi zhst+z(-ffVyQbKR!E|y2P1-c9_rLMOlPc$_Yr;v27DNIg8m_dZcHM+sarI0;j8N{; z%J+BsLGx2>)78acYM)kS-Pj$1hy)V0`)ehlHda!VN^{0Q?58>@(GZ)oKGOZZV!OOw zUOi}5jzmOM&5<=!6M0M(_&xK-F(%gn@h|_$9fJ|U$_?$EO%uk?UA<`EvSwTH6Y;!l z$grZ9z|zGlXUGR7`IbJb8Vp4@?=5t*yLul!|jp1?SQOPyAH_*y7qduR! zp=&!XLC#P<%4xJrcvDt*Eibqef}Eq5;!!B+P+$&hY$L_pWp{;UQ=>)tRrJU$RUuc! zw1ol%Enw0gHUT^w08}v$s1NXgj0jx);e(dG3Hwflkl4L%1(;_y$Ne{O4GlwYfkuz# Rt8N@>==Tt*pS5U9H!K`#hR}wDR&_q@88~@ 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 Br;-2w literal 1604 zcmZuw3sBTW7++E3&=@>LWlT-EzYiQxFcYf-Q4eGlk;oEGWKJrS#}X+%I7tD)P*Cs_ zFii=AQbSQZZ*dfS9UkC74v{CYJSIki(SYn!&}rHhoN++fnce;NKi{{%$G87|{(j4C zMok)p5VFBOssORah&e|#Qmm2BS{o4>j{JSsc!?wLpS*wL;>7y~V~kP?0E7^Xu_Q?h zA&L+nL=eIVNup}VC&mz^2mld+Fhlu3k4O2Q0kN~{K6#l$|6s(}Tl|Ev zI@iL;h@^VC%h*33T}icCg(?qU*uNvla{Puwon~!xK%+}lfHLw@RQ;n|_}k%eY1zSz ztJ~jau9^DkhVciJyrSzIRE24(6?>BHI&GY$p2-S`2s=5iYU$xzylQ@PgUi~PXK!0B z2>a^0UzOXOQx})-R8f1^?vVCHruxffh5Iq%;;i)=a#ko;6l>aY9wfPE(uSbL4rguKq=! zZqw{>R(gB;VQc-?-_I{NmbqZM!?NPpzPD17XmQnMq34*mV3c8=Y4zEn4ivc1E_XUlw0U)JPxHF z_wCf*+G1xihn?QilX$eXz9xI_?C>)s?^G6Tn6=Ks`nT=LmFnJrgtyE&mT~87-Qx=! z;pvFU`@cDza5B5YzUhufjpmaZEj#`*??UV4n46^WxeA8r>CcI-vRZ z--_*u(qTR8nq|h&kh%k&4WZix6WSi+mK5f7^!*dq%THCb HRFm`{A5RDj diff --git a/src/core.c b/src/core.c index d7f884c..c526a40 100644 --- a/src/core.c +++ b/src/core.c @@ -48,6 +48,9 @@ void next_frame(struct game *current_game) if (current_game->dna <= 100) current_game->dna += 1; current_game->time = 0; + current_game->research += current_game->priority; + // if (current_game->research > current_game->limit) ; game over + // Epidemic propagation simulation to add here } } diff --git a/src/core.h b/src/core.h index d3eca8b..cd3f2dc 100644 --- a/src/core.h +++ b/src/core.h @@ -6,7 +6,7 @@ #define CURSOR_TICK 150 #define DNA_ANIMATION_TICK 150 -// The duration for DNA points and infectious model (ms) +// Duration for DNA points and infectious model (ms) #define LIMIT_TICK 10000 // Number of planes on screen @@ -27,7 +27,7 @@ struct game int mutations_bought[3][14]; // Research data - int research, limit; + int research, limit, priority; // Time int time; diff --git a/src/display_engine.c b/src/display_engine.c index 93379da..e9ee567 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -83,12 +83,13 @@ void display_mutation(const int table[4][8], const struct cursor c, const int mu } -void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected) +void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected, const struct game *current_game) { extern const bopti_image_t img_mutations; const int id = table[c.y][c.x]; struct mutation *mutation_data = get_mutation_data(mutation_menu, id); + struct mutation *mutation_sel = get_mutation_data(mutation_menu, current_game->mutations_selected[mutation_menu]); dclear(C_WHITE); @@ -97,9 +98,9 @@ void display_mutation_buy(const struct cursor c, const int mutation_menu, const dprint(47, 25, C_BLACK, mutation_data->name); dprint(81, 33, C_BLACK, "%d", mutation_data->dna); - dprint(81, 41, C_BLACK, "%d", mutation_data->contagion); - dprint(81, 49, C_BLACK, "%d", mutation_data->lethality); - dprint(81, 57, C_BLACK, "%d", mutation_data->severity); + dprint(81, 41, C_BLACK, "%d (%d)", mutation_data->contagion, mutation_data->contagion - mutation_sel->contagion); + dprint(81, 49, C_BLACK, "%d (%d)", mutation_data->severity, mutation_data->severity - mutation_sel->severity); + dprint(81, 57, C_BLACK, "%d (%d)", mutation_data->lethality, mutation_data->lethality - mutation_sel->lethality); if (button_selected) drect(81, 2, 123, 8, C_INVERT); else drect(81, 12, 123, 18, C_INVERT); diff --git a/src/display_engine.h b/src/display_engine.h index 6942f3c..916e4f8 100644 --- a/src/display_engine.h +++ b/src/display_engine.h @@ -13,7 +13,7 @@ void display_foreground(const int background, const struct game *current_game); void display_mutation(const int table[4][8], const struct cursor c, const int mutation_menu); // mutation_selected : display the mutation's informations screen -void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected); +void display_mutation_buy(const struct cursor c, const int mutation_menu, const int table[4][8], const int button_selected, const struct game *current_game); // output_error : display text and message background void display_message(const char *msg[5]); diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c new file mode 100644 index 0000000..4caaf25 --- /dev/null +++ b/src/epidemic_engine.c @@ -0,0 +1,19 @@ +#include "epidemic_engine.h" + +int * count(const int epidemic_grid[10][20], int counter[4]) +{ + for (int i = 0; i < 10; i ++) + { + for (int j = 0; j < 20; j ++) + { + counter[epidemic_grid[i][j]] ++; + } + } + return counter; +} + +int can_become_infected(const int epidemic_grid[10][20], const int i, const int j) +{ + + return 0; +} \ No newline at end of file diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h new file mode 100644 index 0000000..132d939 --- /dev/null +++ b/src/epidemic_engine.h @@ -0,0 +1,10 @@ +#ifndef _EPIDEMIC_ENGINE_H +#define _EPIDEMIC_ENGINE_H + +// count : return an int *counter[4] of the form {healthy, infected, healed, dead} +int * count(const int epidemic_grid[10][20], int counter[4]); + +// can_become_infected : return 0 if the case (i, j) isn't infectable, 1 else +int can_become_infected(const int epidemic_grid[10][20], const int i, const int j); + +#endif /* _EPIDEMIC_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index 2f9dbae..6e58790 100644 --- a/src/main.c +++ b/src/main.c @@ -15,6 +15,7 @@ #include "core.h" #include "display_engine.h" #include "mutation_engine.h" +#include "epidemic_engine.h" // title_screen : display the title screen @@ -51,7 +52,8 @@ int main(void) .mutations_bought = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, .research = 0, - .limit = 100, + .limit = RESEARCH_LIMIT, + .priority = 0, .time = 0, diff --git a/src/mutation_engine.c b/src/mutation_engine.c index ed14116..8b0931a 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -96,7 +96,7 @@ int mutation_buy(struct game *current_game, const struct cursor c, const int mut while (1) { - display_mutation_buy(c, mutation_menu, table, button_selected); + display_mutation_buy(c, mutation_menu, table, button_selected, current_game); key = getkey().key; if (key == KEY_DOWN || key == KEY_UP) button_selected = (button_selected + 1) % 2; @@ -149,9 +149,14 @@ void update_disease(struct game *current_game) struct mutation *ability = get_mutation_data(2, current_game->mutations_selected[1]); struct mutation *transmission = get_mutation_data(3, current_game->mutations_selected[2]); + // disease parameters current_game->contagion = symptom->contagion + ability->contagion + transmission->contagion; current_game->severity = symptom->severity + ability->severity + transmission->severity; current_game->lethality = symptom->lethality + ability->lethality + transmission->lethality; + + // research parameters + current_game->limit = RESEARCH_LIMIT + symptom->changement + ability->changement + transmission->changement; + current_game->priority = floor((symptom->severity + ability->severity + transmission->severity) / 10); } diff --git a/src/mutation_engine.h b/src/mutation_engine.h index 206ba50..b8d22d1 100644 --- a/src/mutation_engine.h +++ b/src/mutation_engine.h @@ -4,6 +4,9 @@ #include "core.h" #include "display_engine.h" +// Basic limit research +#define RESEARCH_LIMIT 100 + // mutation_table : contain the map of the mutation available struct mutation_table { @@ -39,5 +42,4 @@ struct mutation * get_mutation_data(const int mutation_menu, const int id); // init_mat : copy src into dest (for int) void init_mat(int x, int y, int dest[][x], int src[][x]); - #endif /* _MUTATION_ENGINE_H */ \ No newline at end of file -- 2.45.0 From b7ffa0ab772a7546141c4526adf0fc9cdef5e613 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Mon, 31 May 2021 09:52:58 +0200 Subject: [PATCH 15/26] Change title screen for an animated one --- CMakeLists.txt | 1 + Plague.g1a | Bin 50600 -> 54748 bytes README.md | 69 ++++++----------------- assets-fx/explosion.png | Bin 0 -> 1725 bytes assets-fx/title.png | Bin 3894 -> 2982 bytes src/core.c | 3 +- src/data.c | 121 ++++++++++++++++++++++++++++++++++++++++ src/display_engine.c | 2 +- src/epidemic_engine.c | 8 +-- src/epidemic_engine.h | 4 +- src/main.c | 53 +++++++++++++++++- src/mutation_data.c | 52 ----------------- src/mutation_engine.c | 9 +-- 13 files changed, 199 insertions(+), 123 deletions(-) create mode 100644 assets-fx/explosion.png create mode 100644 src/data.c delete mode 100644 src/mutation_data.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a37a897..62da10f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ set(ASSETS_fx assets-fx/cursor.png assets-fx/title.png assets-fx/dna.png + assets-fx/explosion.png assets-fx/mutations_table/abilities_1.txt assets-fx/mutations_table/abilities_2.txt assets-fx/mutations_table/abilities_3.txt diff --git a/Plague.g1a b/Plague.g1a index 5e3df4abf519c68203cfe81760680fa0662aaaf8..1e81fb2623466fa8ab0ff3aab5219a89839e6e0c 100644 GIT binary patch delta 7933 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 F{6C0mmXH7d diff --git a/README.md b/README.md index c10a668..713f60c 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,22 @@ ## Présentation -De l'Anglais 'Plague' virus, ou peste et 'inc' diminutif de 'incorporated' peut être traduit par coopérative ou entreprise. Vous voila donc plongé dans 'L'Entreprise du Virus' un nom digne de 1984 : 'Le Ministère des Virus et de la Régulation Démographique' Ça nous fait un superbe acronyme : MVRD. J'aurais pu rajouter 'Et de la Santé Publique' on tape dans du très haut niveau là : MVRDESP aussi… Les Humains sont tellement fragiles, protégeons-les ! La plus grande menace pour l'Homme étant l'Homme, faites une bonne action : jouez à ce jeu ! +### Description du jeu -Plague inc est donc un jeu de stratégie où le but est de réduire l'humanité à néant… Simple ? Non ! Il vous faudra manipuler avec dextérité et prudence un virus pour anéantir des humains qui ne sont pas super collaboratifs… Pire, ces petits rigolos veulent sauver leurs peaux et recherchent activement un remède à ce mystérieux virus inconnu… +Plague inc est un jeu de stratégie où le but est de réduire l'humanité à néant… Simple ? Non ! Il vous faudra manipuler avec dextérité et prudence un virus pour anéantir des humains qui ne sont pas super collaboratifs… Pire, ces petits rigolos veulent sauver leurs peaux et recherchent activement un remède à ce mystérieux virus inconnu ! + +### Licence + +La totalité du projet est soumise à la licence GNU General Public Licence v3.0. ## Contrôles -Lancez le jeu, et pressez n'importe quelle touche pour passer l'écran principal. Une fois sur l'écran représentant la Terre, plusieurs choix s'offrent à vous : +Lancez le jeu, et pressez n'importe quelle touche pour passer l'écran principal. Une fois sur l'écran représentant la Terre, plusieurs choix s'offrent à vous : - [OPTN] permet d'afficher / cacher la barre en dessous du monde qui vous affiche vos points ADN et la barre de recherche des humains. - [VARS] permet de passer au gros du jeu : les mutations. Ce menu vous affiche vos points ADN, mais aussi les mutations sélectionnées ainsi que vos point de contagion, de sévérité, et de létalité. Dans ce menu, vous pouvez modifier tout cela. - - [x^2] permet d'accéder au menu statistique qui vous affiche les stats sur les humains. La barre symbolise la popuation totale : donc la somme de toute les barre doit donné une seule barre entière. + - [x^2] permet d'accéder au menu statistique qui vous affiche les stats sur les humains. La barre symbolise le pourcentage de la popuation totale : donc la somme de toute les barre doit donné une seule barre entière. -De manière générale, si vous êtes perdu, [EXIT] vous ramènera toujours sur la mappemonde. +De manière générale, si vous êtes perdu, [EXIT] vous ramènera toujours sur la mappemonde, ou au menu précédent. Dans le menu des mutations, vous pouvez modifier vos caractéristiques via les touches F1 à F6 comme suit : - [F1] sert à changer les symptômes de votre maladie @@ -23,65 +27,24 @@ Dans le menu des mutations, vous pouvez modifier vos caractéristiques via les t ## Mutations -Dans ce jeu, vous aurez le choix entre plusieurs mutations pour faire le plus de dégât possible parmis les humains ! Comme dans le jeu d'origine, celles-ci sont divisées en 3 catégories : Symptômes, Capacités, et Transmissions. +Dans ce jeu, vous aurez le choix entre plusieurs mutations pour faire le plus de dégât possible parmis les humains ! Comme dans le jeu d'origine, celles-ci sont divisées en 3 catégories : Symptômes, Capacités, et Transmissions. Toutes les mutations ont plusieurs spécificités : - Contagion qui détermine la proportion de personnes infectées - Sévérité touche la recherche, on peut la comprendre de la manière suivante : si la sévérité est élevée, la maladie est grave, elle entraine par conséquent une recherche active de la part des Humains. Néanmoins, votre compteur de points ADN, augmente plus vite… - Létalité détermine le taux de mortalité parmi les infectés… Une létalité élevée fera de votre maladie une veritable machine à tuer, mais cela vous dévoile au grand jour et accèlere la recherche ! - - ADN, du nom de la molècule qui compose le code génétique. Ici, rien à voir, les points ADN vous permettent d'acheter des mutations. - - Changement : certaines mutations par leur nature ralentissent la recherche, c'est ce ralentissement qui est symbolysé par changement. Concrétement, plus une maladie a de *changement* plus elle ralentit la recherche… + - le coût en points ADN. -### Symptômes +Dans le menu de mutation vous avez les statistiques de la mutation sélectionnée. Et entre parenthèses vous avez les modifications effectives. Le nombre entre parenthèses vous indique donc le nombre de points de contagion, sévérité, létalité, vous allez gagner (ou perdre si le nombre est négatif) si vous faites muter votre maladie. -Comme son nom l'indique, votre maladie aussi puissante soit-elle n'est pas invisible : elle présente certains symptômes qui ont leurs spécificités. Bien entendu, les symptômes présentés dans ce jeu font partie du jeu d'origines et leurs spécificités sont proches. +### Symptômes de la maladie -|Nom|Coût ADN|Pt de contagion|Pt de sévérité|Pt de létalité|Changement| -|:---:|:---:|:---:|:---:|:---:|:---:| -|nausée|2|1|1|0|0,5 -|vomissement|4|3|2|0|0,5 -|tumeurs|15|4|2|5|1 -|pneumonie|4|2|2|0|0,5 -|toux|3|2|1|0|0,5 -|arrêt total des organes|30|0|20|25|2 -|folie|20|6|15|0|2 -|paranoïa|5|0|4|0|1 -|lésions|10|5|4|0|0,5 -|hémorragie|20|5|15|15|0,5 -|plaies|3|2|1|0|0,5 -|infections|17|6|7|6|0,5 -|immunodéficience|12|2|6|4|1 -|inflammation|5|2|2|2|0,5 +Comme son nom l'indique, votre maladie aussi puissante soit-elle n'est pas invisible : elle présente certains symptômes qui ont leurs spécificités. Bien entendu, les symptômes présentés dans ce jeu font partie du jeu d'origine et leurs spécificités en sont proches. -### Capacités +### Capacités spéciales En mutant, votre maladie peut acquérir des capacités. Ces capacités lui permettent de mieux apréhender un milieu ou une situation, ainsi la capacité *Résistance au froid* donne un suplément de vigueur à votre virus dans les pays froid. Cela se traduit par une augmentation plus ou moins forte de la contagion dans ces régions du monde… -|Nom|Pt de contagion|Pt de sévérité|Pt de létalité|Coût ADN| -|:---:|:---:|:---:|:---:|:---:| -|résistance au froid|+4|||10 -|résistance au chand|+7|||15 -|résistance à l'environnement|+10|||30 -|résistance aux médicaments||+2|+2|15 -|résistance génétique||+5|+4|25 -|mutation accélérée||+8|+2|30 - ### Moyens de transmissions -Votre maladie aura tout le loisir de changer ses moyens de transmission ! Plus ou moins efficaces ceux-ci permettent à votre maladie d'accéder à des caractérestiques intéressantes qui lui permettront de coloniser le monde entier ! ;) - -|Nom|Pt de contagion|Coût ADN| -|:---:|:---:|:---:| -|air Nv 1|+2|9 -|air Nv 2|+5|15 -|air Nv 3|+8|20 -|air et eau|+10|30 -|eau Nv 1|+2|9 -|eau Nv 2|+4|12 -|oiseau Nv 1|+3|12 -|oiseau Nv 2|+5|18 -|animaux Nv 1|+2|10 -|animaux Nv 2|+6|16 -|sang Nv 1|+1|8 -|sang Nv 2|+4|14 -|sang Nv 3|+9|20 +Votre maladie aura tout le loisir de changer ses moyens de transmission ! Plus ou moins efficaces ceux-ci permettent à votre maladie d'accéder à des caractérestiques intéressantes qui lui permettront de coloniser le monde entier ! \ No newline at end of file diff --git a/assets-fx/explosion.png b/assets-fx/explosion.png new file mode 100644 index 0000000000000000000000000000000000000000..cd70249b5eec799d442e26eb7061e2de55518e71 GIT binary patch literal 1725 zcmV;u215CXP)EX>4Tx04R}tkv&MmP!xqvQ%glE4t6Lin4vmZ5EXIMDionYs1;guFnQ@8G-*gu zTpR`0f`dPcRR6lU)^quLxk6DuO|oS;m|sCE>Zg?&0J6U5saW-}`g*syT}RK9P8q8KzCVK|H-_ z8=Uuv!>lN)#OK6gCN)U>$aTf#H_nA73p_Jyrc?98VPdh+!Ab|SqNx#25l2-`r+gvf zvdVdjvsSLMR-gQZp`5<5%yp_EB(R7jND!f*iW17O5u;rv#X^eC;~xHjre7kLLaq`R zITlcX2D#}6|AXJNweph_Zc-=?1YR8HV+0890*#vEd>=bb;{@jJ_!g^xpzKYwp}y=Qw=;(lo2&4RCM> zj20++-Q(Teopby5PHTQYQn+%O%WDoo00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF-^t9|a^TW?urc0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR zr%6OXRCwC$T*~qL~LOJ zB%0GKn|RQeHQ8n|7q5hSD~zr4>gwp>e1AVR^JI^gTK5UkB+6ScZT0&_Z+ODG{2fX| z4W0Q15LTSU3b#d?JY)ckf$Lt*_cKtl`OWg?@((_=Z1C6LmfwZ2X6f(hTC;Z)(0h{` z-jBn>0>lCl4V`@ap#k)W;*|^3N!^7O>4XeJoMvy5B9feAh)PF^>dm0vn>mt!XIY=V z>&!0%sZLfP>|~LCtDVzm+)8-Y!-0900`Da=c>}M+Bh$pcXmJdC}9MAe`!n* z9?~`bMVqppih#+TLRQ<8HG%bS6MIG;tyB+(JzG}tg*xh`v}8GFiP8aR4L;XP1~MC|V1(>CE^lf)V5Iu_i_ zESiY2j;h2PraHB0FKvB>CaWJW1L#LmXiwB?!{tg*8GmsE9$w*}1s$2kF!i7fRjE5I zFz*l`znEhNivAmPCm4S%Cl@if+Iu~rTglY8KKiC zmHw<|ok$=PY=PkgcEp&@52mN7;4Vb0Ht+nkqQwv% z9Tr&(GaBY1h`{XHIwv5`6o~a4Yq_Y2nd3EHK9WJeut>Flvd;+IqR9+dr#?<3Yl;Bi z<}}&u`-V40Y=Fj`T59*$%Af<+kbGNx8(`~Ngw;E0h{*F&_SlSxZ$n~C5@%*Rc~1JB z8PN;U5QgcCkBd1AP&`rYKW44I?r5CJkeO3x;eMwXi9v*2!2LJ`0V1+~kU7ZFqK7e) z_4L?B>`M(ye!H=v_PR+@;2i8CMWun;yu5w+3|KmU0o7d5qPCi#kZ=*hYe%zyZ+L~W)L?Gczyw&m^2B-c;JS=4l_HbZP2P#AQb z2qQoIN_s)*EkWhfaSQqVih>D{|Ef&|%OR09uE!5Vm}l4wqyKmn#v-VJQ=@CXV&Y?YXIa2(EeQkh{a;5t z%UL_aj_@Q-NX^m)*+bDhlzrm29wG3;KsP{qgY3n`c~>@W7UCOZyHRZFInwwC)Mj>b TPzLyn00000NkvXXu0mjfZ&xPL literal 0 HcmV?d00001 diff --git a/assets-fx/title.png b/assets-fx/title.png index f0beb69a4245ae4f7e449a89036e2db7eb414947..e929a45d59b0707fa340718176942bc3fd597027 100644 GIT binary patch literal 2982 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 Ef@o*aaR2}S diff --git a/src/core.c b/src/core.c index c526a40..9c397d6 100644 --- a/src/core.c +++ b/src/core.c @@ -147,5 +147,4 @@ void message(const char *msg[5]) } if (t >= 0) timer_stop(t); -} - +} \ No newline at end of file diff --git a/src/data.c b/src/data.c new file mode 100644 index 0000000..bcdd428 --- /dev/null +++ b/src/data.c @@ -0,0 +1,121 @@ +#include "mutation_engine.h" + + +const struct mutation symptoms_data[14] = +{ + {1, 1, 0, 2, 0, "NAUSEE"}, + {3, 2, 0, 4, 0, "VOMISSEMENT"}, + {2, 1, 0, 3, 0, "TOUX"}, + {2, 2, 0, 4, 0, "PNEUMONIE"}, + {4, 2, 5, 15, 25, "TUMEUR"}, + {2, 1, 0, 3, 0, "PLAIES"}, + {5, 4, 0, 10, 0, "LESIONS"}, + {5, 15, 15, 20, 30, "HEMORRAGIE"}, + {6, 7, 6, 17, 0, "INFECTION"}, + {2, 2, 2, 5, 0, "INFLAMMATION"}, + {2, 6, 4, 12, 0, "IMMUNITE"}, + {0, 4, 0, 5, 120, "PARANOIA"}, + {6, 15, 0, 20, 100, "FOLIE"}, + {0, 20, 25, 30, 250, "ARRET TOTAL"}, +}; + + +const struct mutation abilities_data[6] = +{ + {4, 0, 0, 10, 0, "FROID"}, + {7, 0, 0, 15, 0, "CHAUD"}, + {0, 5, 4, 25, 20, "GENETIQUE"}, + {0, 8, 8, 30, 50, "MUTATION+"}, + {10, 0, 0, 30, 0, "ENVIRON"}, + {0, 2, 2, 15, 50, "MEDICAMENT"}, +}; + + +const struct mutation transmissions_data[13] = +{ + { 2, 0, 0, 9, 0, "AIR 1"}, + { 5, 0, 0, 15, 0, "AIR 2"}, + { 8, 0, 0, 20, 0, "AIR 3"}, + {10, 0, 0, 30, 0, "AEROSOL"}, + { 2, 0, 0, 9, 0, "EAU 1"}, + { 4, 0, 0, 12, 0, "EAU 2"}, + { 2, 0, 0, 10, 0, "ANIMAL 1"}, + { 6, 0, 0, 16, 0, "ANIMAL 2"}, + { 3, 0, 0, 12, 0, "OISEAU 1"}, + { 6, 0, 0, 16, 0, "OISEAU 2"}, + { 1, 0, 0, 8, 0, "SANG 1"}, + { 4, 0, 0, 14, 0, "SANG 2"}, + { 9, 1, 1, 20, 0, "SANG 3"}, +}; + + +const struct mutation default_value = {0, 0, 0, 0, 0, "NONE"}; + + +const int world[][] = +{ + {00000000000000000000000000000000011100000001111111100000000000000000000000000000000000000000000000000000000000000000000000000000}, + {00000000000000000000000000001111111111111111111111110010000000000000000000000000000000000000000000000000000000000000000000000000}, + {00000000000000000000000000101111111111111111111111111110000000000000000000001101111000000000011000000000000000000000000000000000}, + {00000000000000000000000010111111111011111111111111111100000000001111110000000000000000000000111100000000000000000000000000000000}, + {00000000000000000001101101011111101111111111111111111000000000001111000000000000000000000000000111000000000000000000000000000000}, + {00000000000000000111001000101111000111111111111111111100000000000100000000000000000000000000000011000000000000000000000000000000}, + {00000000000000001111110110010000000110111111111111111000000000000000000000000000011100000000111111111000000001110000000000000000}, + {00000000000000000001100000111110000000001111111111111000000000000000000000000000100000000001111111110000000000000000000000000000}, + {00000000000000011110011010101111100000001111111111110000000000000000000000000001000001001111111111111111110000110000000000000000}, + {00000000000000011111111011101111110000001111111111110000000000000000000000000011000011111111111111111111110111111100000000001000}, + {00111110000000000011111101101111111100001111111111110000000000000001111000000000000011111111111111111111111111111111100011100000}, + {11111111111111111111110001111110011100000111111111000000000000000111111111000011111111111111111111111111111111111111111111111000}, + {01111111111111111111111111111110001111000111111100000000000000001111111111111111111111111111111111111111111111111111111111111111}, + {11111111111111111111111111111100111100000111110000011110000000001111011110111111111111111111111111111111111111111111111111111110}, + {00111111111111111111111111110110001110000011110000000100000000011110111111111111111111111111111111111111111111111111111111110000}, + {01111111111111111111111111100001110010000011100000000000000000111101111111111111111111111111111111111111111111111111111111000000}, + {11111110111111111111111111000000111000000000100000000000000000111110101111111111111111111111111111111111111111111110011010000000}, + {00111000000111111111111111100000111111000000000000000000011000101111111111111111111111111111111111111111111111000000110000000000}, + {00010000000111111111111111111000111111000000000000000000001000011101111111111111111111111111111111111111111110000001110000000000}, + {01000000000001111111111111111111111111110000000000000000111100011111111111111111111111111111111111111111111111000000100000000000}, + {00000000000000111111111111111110111111110000000000000000111111111111111111111111111111111111111111111111111111100000000000000000}, + {00000000000000111111111111111111111111110000000000000000001011111111111111111111111111111111111111111111111111010000000000000000}, + {00000000000000011111111111111111111110011000000000000000001111111111111111111111111111111111111111111111111111000000000000000000}, + {00000000000000001111111111111111111111100000000000000000000011111111111111111011111111111111111111111111111110000000000000000000}, + {00000000000000011111111111111111111010000000000000000000011111101111110000111011111111111111111111111111111100110000000000000000}, + {00000000000000001111111111111111111000000000000000000000011110011101111111111001111111111111111111111111110000100000000000000000}, + {00000000000000001111111111111111110000000000000000000000011100000101111111111001111111111111111111111100110000100000000000000000}, + {00000000000000001111111111111111100000000000000000000000001011110000001101111111111111111111111111111110010011000000000000000000}, + {00000000000000000111111111111111100000000000000000000000011111110000000011111111111111111111111111111110001110000000000000000000}, + {00000000000000000011111111111110000000000000000000000000011111111101100011111111111111111111111111111111001000000000000000000000}, + {00000000000000000001111111010010000000000000000000000000111111111111111111111011111111111111111111111110000000000000000000000000}, + {00000000000000000001111110000010100000000000000000000001111111111111111101111100111111111111111111111110000000000000000000000000}, + {00000000000000000000111110000000000000000000000000000011111111111111111111111111100011111111111111111101000000000000000000000000}, + {00000000000000000000001110001001100000000000000000000011111111111111111110111111100011111110011111110000000000000000000000000000}, + {00000000000000000000000111011000101110000000000000000011111111111111111111111111000000111100011111000000000000000000000000000000}, + {00000000000000000000000011111100000000000000000000000011111111111111111111011110000000111000000111100001000000000000000000000000}, + {00000000000000000000000000011100000000000000000000000011111111111111111111111000000000111000000111100001000000000000000000000000}, + {00000000000000000000000000000100011101000000000000000011111111111111111111111100000000010000000001000011100000000000000000000000}, + {00000000000000000000000000000011111111100000000000000001111111111111111111111100000000001000000100000100100000000000000000000000}, + {00000000000000000000000000000000111111111100000000000000011100111111111111111000000000000000001010000110000000000000000000000000}, + {00000000000000000000000000000000111111111100000000000000000000011111111111111000000000000000000110001100010000000000000000000000}, + {00000000000000000000000000000001111111111111000000000000000000011111111111100000000000000000000010011111000100000000000000000000}, + {00000000000000000000000000000001111111111111110000000000000000001111111111000000000000000000000011000011001111110010000000000000}, + {00000000000000000000000000000001111111111111111100000000000000001111111111000000000000000000000000110000000001111101000000000000}, + {00000000000000000000000000000000111111111111111100000000000000001111111111000000000000000000000000000111100000101000010000000000}, + {00000000000000000000000000000000111111111111111000000000000000000111111111000000000000000000000000000000001110000000000000000000}, + {00000000000000000000000000000000011111111111110000000000000000001111111111000100000000000000000000000000111100010000000000000000}, + {00000000000000000000000000000000001111111111110000000000000000001111111111011100000000000000000000000000111111110000000000010000}, + {00000000000000000000000000000000000111111111110000000000000000001111111110001000000000000000000000000001111111111000000000000000}, + {00000000000000000000000000000000000111111111100000000000000000000111111110011000000000000000000000001111111111111100000000000000}, + {00000000000000000000000000000000000111111110000000000000000000000111111100011000000000000000000000001111111111111110000000000000}, + {00000000000000000000000000000000000111111110000000000000000000000111111100000000000000000000000000000111111111111110000000000000}, + {00000000000000000000000000000000001111111110000000000000000000000011111000000000000000000000000000000111111111111110000000000000}, + {00000000000000000000000000000000001111111100000000000000000000000011110000000000000000000000000000000111100011111110000000000000}, + {00000000000000000000000000000000001111111000000000000000000000000001000000000000000000000000000000000100000001111100000001000000}, + {00000000000000000000000000000000001111110000000000000000000000000000000000000000000000000000000000000000000000111100000000110000}, + {00000000000000000000000000000000001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000}, + {00000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000}, + {00000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000}, + {00000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000}, + {00000000000000000000000000000000011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, + {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, + {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, + {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, +}; \ No newline at end of file diff --git a/src/display_engine.c b/src/display_engine.c index e9ee567..560d009 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -89,7 +89,7 @@ void display_mutation_buy(const struct cursor c, const int mutation_menu, const const int id = table[c.y][c.x]; struct mutation *mutation_data = get_mutation_data(mutation_menu, id); - struct mutation *mutation_sel = get_mutation_data(mutation_menu, current_game->mutations_selected[mutation_menu]); + struct mutation *mutation_sel = get_mutation_data(mutation_menu, current_game->mutations_selected[mutation_menu - 1]); dclear(C_WHITE); diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index 4caaf25..ee21ece 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -1,10 +1,10 @@ #include "epidemic_engine.h" -int * count(const int epidemic_grid[10][20], int counter[4]) +int * count(const int epidemic_grid[64][128], int counter[4]) { - for (int i = 0; i < 10; i ++) + for (int i = 0; i < 64; i ++) { - for (int j = 0; j < 20; j ++) + for (int j = 0; j < 128; j ++) { counter[epidemic_grid[i][j]] ++; } @@ -12,7 +12,7 @@ int * count(const int epidemic_grid[10][20], int counter[4]) return counter; } -int can_become_infected(const int epidemic_grid[10][20], const int i, const int j) +int can_become_infected(const int epidemic_grid[64][128], const int i, const int j) { return 0; diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index 132d939..2df329b 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -2,9 +2,9 @@ #define _EPIDEMIC_ENGINE_H // count : return an int *counter[4] of the form {healthy, infected, healed, dead} -int * count(const int epidemic_grid[10][20], int counter[4]); +int * count(const int epidemic_grid[64][128], int counter[4]); // can_become_infected : return 0 if the case (i, j) isn't infectable, 1 else -int can_become_infected(const int epidemic_grid[10][20], const int i, const int j); +int can_become_infected(const int epidemic_grid[64][128], const int i, const int j); #endif /* _EPIDEMIC_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6e58790..3285080 100644 --- a/src/main.c +++ b/src/main.c @@ -69,12 +69,59 @@ int main(void) static void title_screen(void) { extern bopti_image_t img_title; + extern bopti_image_t img_explosion; - dclear(C_WHITE); - dimage(0, 0, &img_title); - + static volatile int tick_250 = 1; + static volatile int tick_100 = 1; + int t_250 = timer_configure(TIMER_ANY, 250000, GINT_CALL(callback_tick, &tick_250)); + int t_100 = timer_configure(TIMER_ANY, 100000, GINT_CALL(callback_tick, &tick_100)); + + if (t_250 >= 0) timer_start(t_250); + if (t_100 >= 0) timer_start(t_100); + + dclear(C_BLACK); dupdate(); + while (!tick_250) sleep(); + tick_250 = 0; + + dsubimage(0, 0, &img_title, 0, 0, 128, 64, DIMAGE_NONE); + dupdate(); + while (!tick_250) sleep(); + tick_250 = 0; + + for (int frame = 0; frame < 5; frame ++) + { + dclear(C_BLACK); + dsubimage(0, 0, &img_title, 0, 0, 128, 64, DIMAGE_NONE); + dsubimage(72, 5, &img_explosion, 41 * frame, 0, 40, 40, DIMAGE_NONE); + dupdate(); + while (!tick_100) sleep(); + tick_100 = 0; + } + + dclear(C_BLACK); + dsubimage(0, 0, &img_title, 0, 65, 128, 64, DIMAGE_NONE); + dupdate(); + while (!tick_250) sleep(); + tick_250 = 0; + + for (int i = 0; i < 5; i ++) + { + dclear(C_BLACK); + dsubimage(0, 0, &img_title, 0, ((i % 2) + 1) * 65, 128, 64, DIMAGE_NONE); + dupdate(); + while (!tick_250) sleep(); + tick_250 = 0; + } + + dclear(C_BLACK); + dsubimage(0, 0, &img_title, 0, 130, 128, 64, DIMAGE_NONE); + dupdate(); + getkey(); + + if (t_250 >= 0) timer_stop(t_250); + if (t_100 >= 0) timer_stop(t_100); } diff --git a/src/mutation_data.c b/src/mutation_data.c deleted file mode 100644 index 28410b1..0000000 --- a/src/mutation_data.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "mutation_engine.h" - - -const struct mutation symptoms_data[14] = -{ - {1, 1, 0, 2, 0, "NAUSEE"}, - {3, 2, 0, 4, 0, "VOMISSEMENT"}, - {2, 1, 0, 3, 0, "TOUX"}, - {2, 2, 0, 4, 0, "PNEUMONIE"}, - {4, 2, 5, 15, 1, "TUMEUR"}, - {2, 1, 0, 3, 0, "PLAIES"}, - {5, 4, 0, 10, 0, "LESIONS"}, - {5, 15, 15, 20, 0, "HEMORRAGIE"}, - {6, 7, 6, 17, 0, "INFECTION"}, - {2, 2, 2, 5, 0, "INFLAMMATION"}, - {2, 6, 4, 12, 1, "IMMUNITE"}, - {0, 4, 0, 5, 1, "PARANOIA"}, - {6, 15, 0, 20, 2, "FOLIE"}, - {0, 20, 25, 30, 2, "ARRET TOTAL"}, -}; - - -const struct mutation abilities_data[6] = -{ - {4, 0, 0, 10, 0, "FROID"}, - {7, 0, 0, 15, 0, "CHAUD"}, - {0, 5, 4, 25, 0, "GENETIQUE"}, - {0, 8, 8, 30, 2, "MUTATION+"}, - {10, 0, 0, 30, 0, "ENVIRON"}, - {0, 2, 2, 15, 1, "MEDICAMENT"}, -}; - - -const struct mutation transmissions_data[13] = -{ - { 2, 0, 0, 9, 0, "AIR 1"}, - { 5, 0, 0, 15, 0, "AIR 2"}, - { 8, 0, 0, 20, 0, "AIR 3"}, - {10, 0, 0, 30, 0, "AEROSOL"}, - { 2, 0, 0, 9, 0, "EAU 1"}, - { 4, 0, 0, 12, 0, "EAU 2"}, - { 2, 0, 0, 10, 0, "ANIMAL 1"}, - { 6, 0, 0, 16, 0, "ANIMAL 2"}, - { 3, 0, 0, 12, 0, "OISEAU 1"}, - { 6, 0, 0, 16, 0, "OISEAU 2"}, - { 1, 0, 0, 8, 0, "SANG 1"}, - { 4, 0, 0, 14, 0, "SANG 2"}, - { 9, 1, 1, 20, 0, "SANG 3"}, -}; - - -const struct mutation default_value = {0, 0, 0, 1, 0, "VIDE"}; \ No newline at end of file diff --git a/src/mutation_engine.c b/src/mutation_engine.c index 8b0931a..78e6783 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -1,8 +1,7 @@ #include #include #include - -#include +#include #include "mutation_engine.h" @@ -156,7 +155,7 @@ void update_disease(struct game *current_game) // research parameters current_game->limit = RESEARCH_LIMIT + symptom->changement + ability->changement + transmission->changement; - current_game->priority = floor((symptom->severity + ability->severity + transmission->severity) / 10); + current_game->priority = floor((current_game->severity + current_game->lethality) / 2); } @@ -198,6 +197,4 @@ void init_mat(int x, int y, int dest[][x], int src[][x]) dest[j][i] = src[j][i]; } } -} - - +} \ No newline at end of file -- 2.45.0 From afe41f7619a825202d11f8c6cb2f3ac270d85dde Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Mon, 31 May 2021 13:36:24 +0200 Subject: [PATCH 16/26] Calculator crash just after title_screen(); --- CMakeLists.txt | 2 +- Plague.g1a | Bin 54748 -> 87516 bytes src/core.c | 2 +- src/core.h | 3 + src/data.c | 132 +++++++++++++++++++++--------------------- src/epidemic_engine.h | 3 + src/main.c | 4 +- 7 files changed, 77 insertions(+), 69 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 62da10f..3e8e66f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ set(SOURCES src/core.c src/display_engine.c src/mutation_engine.c - src/mutation_data.c + src/data.c src/epidemic_engine.c # ... ) diff --git a/Plague.g1a b/Plague.g1a index 1e81fb2623466fa8ab0ff3aab5219a89839e6e0c..9f45fa909a9b474b44f2c15c41581353b80dd185 100644 GIT binary patch delta 12844 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 += ENGINE_TICK; if (current_game->time > LIMIT_TICK) { - if (current_game->dna <= 100) current_game->dna += 1; current_game->time = 0; + if (current_game->dna <= 100) current_game->dna += 1; current_game->research += current_game->priority; // if (current_game->research > current_game->limit) ; game over diff --git a/src/core.h b/src/core.h index cd3f2dc..8296bb9 100644 --- a/src/core.h +++ b/src/core.h @@ -34,6 +34,9 @@ struct game // Planes struct plane *planes[NB_PLANES + 1]; + + // Grid for epidemologic model + int grid[64][128]; }; // plane : information about planes diff --git a/src/data.c b/src/data.c index bcdd428..9c0b49e 100644 --- a/src/data.c +++ b/src/data.c @@ -52,70 +52,70 @@ const struct mutation transmissions_data[13] = const struct mutation default_value = {0, 0, 0, 0, 0, "NONE"}; -const int world[][] = +const int world[64][128] = { - {00000000000000000000000000000000011100000001111111100000000000000000000000000000000000000000000000000000000000000000000000000000}, - {00000000000000000000000000001111111111111111111111110010000000000000000000000000000000000000000000000000000000000000000000000000}, - {00000000000000000000000000101111111111111111111111111110000000000000000000001101111000000000011000000000000000000000000000000000}, - {00000000000000000000000010111111111011111111111111111100000000001111110000000000000000000000111100000000000000000000000000000000}, - {00000000000000000001101101011111101111111111111111111000000000001111000000000000000000000000000111000000000000000000000000000000}, - {00000000000000000111001000101111000111111111111111111100000000000100000000000000000000000000000011000000000000000000000000000000}, - {00000000000000001111110110010000000110111111111111111000000000000000000000000000011100000000111111111000000001110000000000000000}, - {00000000000000000001100000111110000000001111111111111000000000000000000000000000100000000001111111110000000000000000000000000000}, - {00000000000000011110011010101111100000001111111111110000000000000000000000000001000001001111111111111111110000110000000000000000}, - {00000000000000011111111011101111110000001111111111110000000000000000000000000011000011111111111111111111110111111100000000001000}, - {00111110000000000011111101101111111100001111111111110000000000000001111000000000000011111111111111111111111111111111100011100000}, - {11111111111111111111110001111110011100000111111111000000000000000111111111000011111111111111111111111111111111111111111111111000}, - {01111111111111111111111111111110001111000111111100000000000000001111111111111111111111111111111111111111111111111111111111111111}, - {11111111111111111111111111111100111100000111110000011110000000001111011110111111111111111111111111111111111111111111111111111110}, - {00111111111111111111111111110110001110000011110000000100000000011110111111111111111111111111111111111111111111111111111111110000}, - {01111111111111111111111111100001110010000011100000000000000000111101111111111111111111111111111111111111111111111111111111000000}, - {11111110111111111111111111000000111000000000100000000000000000111110101111111111111111111111111111111111111111111110011010000000}, - {00111000000111111111111111100000111111000000000000000000011000101111111111111111111111111111111111111111111111000000110000000000}, - {00010000000111111111111111111000111111000000000000000000001000011101111111111111111111111111111111111111111110000001110000000000}, - {01000000000001111111111111111111111111110000000000000000111100011111111111111111111111111111111111111111111111000000100000000000}, - {00000000000000111111111111111110111111110000000000000000111111111111111111111111111111111111111111111111111111100000000000000000}, - {00000000000000111111111111111111111111110000000000000000001011111111111111111111111111111111111111111111111111010000000000000000}, - {00000000000000011111111111111111111110011000000000000000001111111111111111111111111111111111111111111111111111000000000000000000}, - {00000000000000001111111111111111111111100000000000000000000011111111111111111011111111111111111111111111111110000000000000000000}, - {00000000000000011111111111111111111010000000000000000000011111101111110000111011111111111111111111111111111100110000000000000000}, - {00000000000000001111111111111111111000000000000000000000011110011101111111111001111111111111111111111111110000100000000000000000}, - {00000000000000001111111111111111110000000000000000000000011100000101111111111001111111111111111111111100110000100000000000000000}, - {00000000000000001111111111111111100000000000000000000000001011110000001101111111111111111111111111111110010011000000000000000000}, - {00000000000000000111111111111111100000000000000000000000011111110000000011111111111111111111111111111110001110000000000000000000}, - {00000000000000000011111111111110000000000000000000000000011111111101100011111111111111111111111111111111001000000000000000000000}, - {00000000000000000001111111010010000000000000000000000000111111111111111111111011111111111111111111111110000000000000000000000000}, - {00000000000000000001111110000010100000000000000000000001111111111111111101111100111111111111111111111110000000000000000000000000}, - {00000000000000000000111110000000000000000000000000000011111111111111111111111111100011111111111111111101000000000000000000000000}, - {00000000000000000000001110001001100000000000000000000011111111111111111110111111100011111110011111110000000000000000000000000000}, - {00000000000000000000000111011000101110000000000000000011111111111111111111111111000000111100011111000000000000000000000000000000}, - {00000000000000000000000011111100000000000000000000000011111111111111111111011110000000111000000111100001000000000000000000000000}, - {00000000000000000000000000011100000000000000000000000011111111111111111111111000000000111000000111100001000000000000000000000000}, - {00000000000000000000000000000100011101000000000000000011111111111111111111111100000000010000000001000011100000000000000000000000}, - {00000000000000000000000000000011111111100000000000000001111111111111111111111100000000001000000100000100100000000000000000000000}, - {00000000000000000000000000000000111111111100000000000000011100111111111111111000000000000000001010000110000000000000000000000000}, - {00000000000000000000000000000000111111111100000000000000000000011111111111111000000000000000000110001100010000000000000000000000}, - {00000000000000000000000000000001111111111111000000000000000000011111111111100000000000000000000010011111000100000000000000000000}, - {00000000000000000000000000000001111111111111110000000000000000001111111111000000000000000000000011000011001111110010000000000000}, - {00000000000000000000000000000001111111111111111100000000000000001111111111000000000000000000000000110000000001111101000000000000}, - {00000000000000000000000000000000111111111111111100000000000000001111111111000000000000000000000000000111100000101000010000000000}, - {00000000000000000000000000000000111111111111111000000000000000000111111111000000000000000000000000000000001110000000000000000000}, - {00000000000000000000000000000000011111111111110000000000000000001111111111000100000000000000000000000000111100010000000000000000}, - {00000000000000000000000000000000001111111111110000000000000000001111111111011100000000000000000000000000111111110000000000010000}, - {00000000000000000000000000000000000111111111110000000000000000001111111110001000000000000000000000000001111111111000000000000000}, - {00000000000000000000000000000000000111111111100000000000000000000111111110011000000000000000000000001111111111111100000000000000}, - {00000000000000000000000000000000000111111110000000000000000000000111111100011000000000000000000000001111111111111110000000000000}, - {00000000000000000000000000000000000111111110000000000000000000000111111100000000000000000000000000000111111111111110000000000000}, - {00000000000000000000000000000000001111111110000000000000000000000011111000000000000000000000000000000111111111111110000000000000}, - {00000000000000000000000000000000001111111100000000000000000000000011110000000000000000000000000000000111100011111110000000000000}, - {00000000000000000000000000000000001111111000000000000000000000000001000000000000000000000000000000000100000001111100000001000000}, - {00000000000000000000000000000000001111110000000000000000000000000000000000000000000000000000000000000000000000111100000000110000}, - {00000000000000000000000000000000001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000}, - {00000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000}, - {00000000000000000000000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000}, - {00000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000}, - {00000000000000000000000000000000011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, - {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, - {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, - {00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}, -}; \ No newline at end of file + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0}, + {0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0}, + {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, + {0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, + {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, + {2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index 2df329b..cb99377 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -1,6 +1,9 @@ #ifndef _EPIDEMIC_ENGINE_H #define _EPIDEMIC_ENGINE_H +// humans per case of the epidemic grid +#define HUMAN_PER_CASE 1000000 + // count : return an int *counter[4] of the form {healthy, infected, healed, dead} int * count(const int epidemic_grid[64][128], int counter[4]); diff --git a/src/main.c b/src/main.c index 3285080..7f4669b 100644 --- a/src/main.c +++ b/src/main.c @@ -57,7 +57,9 @@ int main(void) .time = 0, - .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL} + .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL}, + + .grid = {}, }; main_loop(¤t_game); -- 2.45.0 From b44c91051e59062a5cbf65be5647bc4ddb8dcc32 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Mon, 31 May 2021 14:53:52 +0200 Subject: [PATCH 17/26] Resize of the epidemiologic grid --- Plague.g1a | Bin 87516 -> 56796 bytes src/core.h | 2 +- src/data.c | 85 ++++++++++++----------------------------------------- src/main.c | 4 ++- 4 files changed, 22 insertions(+), 69 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index 9f45fa909a9b474b44f2c15c41581353b80dd185..021640cb8279e1b36835be0e7e4231bcf4717f7f 100644 GIT binary patch delta 3308 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 diff --git a/src/core.h b/src/core.h index 8296bb9..f6f5047 100644 --- a/src/core.h +++ b/src/core.h @@ -36,7 +36,7 @@ struct game struct plane *planes[NB_PLANES + 1]; // Grid for epidemologic model - int grid[64][128]; + int grid[16][32]; }; // plane : information about planes diff --git a/src/data.c b/src/data.c index 9c0b49e..2946c97 100644 --- a/src/data.c +++ b/src/data.c @@ -1,6 +1,5 @@ #include "mutation_engine.h" - const struct mutation symptoms_data[14] = { {1, 1, 0, 2, 0, "NAUSEE"}, @@ -52,70 +51,22 @@ const struct mutation transmissions_data[13] = const struct mutation default_value = {0, 0, 0, 0, 0, "NONE"}; -const int world[64][128] = +const unsigned int world[16][32] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0}, - {0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0}, - {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, - {0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, - {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; + {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, + {0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, + {0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0}, + {0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7f4669b..dd6ab59 100644 --- a/src/main.c +++ b/src/main.c @@ -59,7 +59,7 @@ int main(void) .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL}, - .grid = {}, + .grid = {{0}}, }; main_loop(¤t_game); @@ -73,6 +73,8 @@ static void title_screen(void) extern bopti_image_t img_title; extern bopti_image_t img_explosion; + extern const unsigned int world; + static volatile int tick_250 = 1; static volatile int tick_100 = 1; int t_250 = timer_configure(TIMER_ANY, 250000, GINT_CALL(callback_tick, &tick_250)); -- 2.45.0 From 4de5708f3be5e35489e590e77ddd6b8a5489c429 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Mon, 31 May 2021 15:30:26 +0200 Subject: [PATCH 18/26] will work (#1) won't work Reviewed-on: https://gitea.planet-casio.com/Shadow15510/Plague/pulls/1 Co-Authored-By: KikooDX Co-Committed-By: KikooDX --- src/core.h | 12 ++++++++++-- src/main.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/core.h b/src/core.h index f6f5047..3c537d7 100644 --- a/src/core.h +++ b/src/core.h @@ -1,6 +1,8 @@ #ifndef _PLAGUE_CORE_H #define _PLAGUE_CORE_H +#include + // Duration for internal clock (ms) #define ENGINE_TICK 50 #define CURSOR_TICK 150 @@ -12,6 +14,12 @@ // Number of planes on screen #define NB_PLANES 5 +struct grid { + int width; + int height; + uint8_t *data; +}; + // game : all statistics of the current game struct game { @@ -36,7 +44,7 @@ struct game struct plane *planes[NB_PLANES + 1]; // Grid for epidemologic model - int grid[16][32]; + struct grid grid; }; // plane : information about planes @@ -81,4 +89,4 @@ int callback_tick(volatile int *tick); // message : display a message void message(const char *msg[5]); -#endif /* _PLAGUE_CORE_H */ \ No newline at end of file +#endif /* _PLAGUE_CORE_H */ diff --git a/src/main.c b/src/main.c index dd6ab59..3ca085a 100644 --- a/src/main.c +++ b/src/main.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "core.h" #include "display_engine.h" @@ -59,11 +61,18 @@ int main(void) .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL}, - .grid = {{0}}, + .grid = { 128, 64, NULL }, }; + /* allocate memory */ + current_game.grid.data = calloc(current_game.grid.width * + current_game.grid.height, sizeof(uint8_t)); + main_loop(¤t_game); + /* free memory */ + free(current_game.grid.data); + return 1; } -- 2.45.0 From d5a5ba71c8de52d2ebad007c4e217839d7d7296b Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Mon, 31 May 2021 15:39:44 +0200 Subject: [PATCH 19/26] Integrate the commit to rest of the project, re-resize the world map for infectious model --- src/core.h | 6 ++-- src/data.c | 84 +++++++++++++++++++++++++++++++++---------- src/epidemic_engine.c | 6 ++++ src/epidemic_engine.h | 3 ++ src/main.c | 5 ++- 5 files changed, 81 insertions(+), 23 deletions(-) diff --git a/src/core.h b/src/core.h index 3c537d7..e2bb6be 100644 --- a/src/core.h +++ b/src/core.h @@ -15,8 +15,10 @@ #define NB_PLANES 5 struct grid { - int width; - int height; + + int width, height; + + // Use grid.data[i + j * grid.width] instead of grid.data[i][j] uint8_t *data; }; diff --git a/src/data.c b/src/data.c index 2946c97..bbc937a 100644 --- a/src/data.c +++ b/src/data.c @@ -51,22 +51,70 @@ const struct mutation transmissions_data[13] = const struct mutation default_value = {0, 0, 0, 0, 0, "NONE"}; -const unsigned int world[16][32] = +const unsigned int world[64][128] = { - {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, - {0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, - {0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0}, - {0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; \ No newline at end of file + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0}, + {0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0}, + {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, + {0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, + {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, + {2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index ee21ece..8e46036 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -16,4 +16,10 @@ int can_become_infected(const int epidemic_grid[64][128], const int i, const int { return 0; +} + + +void epidemic_simulation(struct game *current_game) +{ + } \ No newline at end of file diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index cb99377..e71bff7 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -10,4 +10,7 @@ int * count(const int epidemic_grid[64][128], int counter[4]); // can_become_infected : return 0 if the case (i, j) isn't infectable, 1 else int can_become_infected(const int epidemic_grid[64][128], const int i, const int j); +// epidemic_simulation : simulate the propagation of the virus +void epidemic_simulation(struct game *current_game); + #endif /* _EPIDEMIC_ENGINE_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index 3ca085a..9903088 100644 --- a/src/main.c +++ b/src/main.c @@ -61,12 +61,11 @@ int main(void) .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL}, - .grid = { 128, 64, NULL }, + .grid = {128, 64, NULL}, }; /* allocate memory */ - current_game.grid.data = calloc(current_game.grid.width * - current_game.grid.height, sizeof(uint8_t)); + current_game.grid.data = calloc(current_game.grid.width * current_game.grid.height, sizeof(uint8_t)); main_loop(¤t_game); -- 2.45.0 From 11b1b4bfb100b81173011a20f946a9e9abab0025 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Tue, 1 Jun 2021 11:36:26 +0200 Subject: [PATCH 20/26] First epidemic model --- Old assets/bground.png | Bin 0 -> 18592 bytes Old assets/convert_world.py | 39 ++++++++++++++ Old assets/world.png | Bin 0 -> 2216 bytes Plague.g1a | Bin 56796 -> 90388 bytes README.md | 2 +- assets-fx/bground.png | Bin 18592 -> 18445 bytes assets-fx/dna.png | Bin 9522 -> 9750 bytes src/core.c | 10 +++- src/core.h | 5 +- src/data.c | 105 +++++++++++++++++++----------------- src/display_engine.c | 14 ++++- src/epidemic_engine.c | 82 +++++++++++++++++++++++----- src/epidemic_engine.h | 12 +++-- src/main.c | 8 ++- 14 files changed, 199 insertions(+), 78 deletions(-) create mode 100644 Old assets/bground.png create mode 100644 Old assets/convert_world.py create mode 100644 Old assets/world.png diff --git a/Old assets/bground.png b/Old assets/bground.png new file mode 100644 index 0000000000000000000000000000000000000000..174080c9a26023ccb0eee8c433072007f3e029c8 GIT binary patch literal 18592 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 R 52: return 1 + if 24 < index < 40: return 3 + else: return 2 + + +def show(): + img = Image.open("world.png") + data = np.array(img) + + rslt = "" + for index, line in enumerate(data): + for pxl in line: + rslt += f"{analyse(index, pxl)}" + rslt += "\n" + print(rslt) + + +def get_tabular(): + img = Image.open("world.png") + data = np.array(img) + + rslt = "const unsigned int world[64][128] =\n{" + for index, line in enumerate(data): + rslt += "\n {" + for pxl in line: + rslt += f"{analyse(index, pxl)}, " + rslt = rslt[:-2] + "}," + rslt += "\n};" + print(rslt) + + +get_tabular() diff --git a/Old assets/world.png b/Old assets/world.png new file mode 100644 index 0000000000000000000000000000000000000000..359c314c739d98eb09b02d21081b6d153413e81d GIT binary patch literal 2216 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 delta 7707 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 diff --git a/README.md b/README.md index 713f60c..fddbdf3 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Dans ce jeu, vous aurez le choix entre plusieurs mutations pour faire le plus de Toutes les mutations ont plusieurs spécificités : - Contagion qui détermine la proportion de personnes infectées - - Sévérité touche la recherche, on peut la comprendre de la manière suivante : si la sévérité est élevée, la maladie est grave, elle entraine par conséquent une recherche active de la part des Humains. Néanmoins, votre compteur de points ADN, augmente plus vite… + - Sévérité touche la recherche, on peut la comprendre de la manière suivante : si la sévérité est élevée, la maladie est grave, elle entraine par conséquent une recherche active de la part des Humains. - Létalité détermine le taux de mortalité parmi les infectés… Une létalité élevée fera de votre maladie une veritable machine à tuer, mais cela vous dévoile au grand jour et accèlere la recherche ! - le coût en points ADN. diff --git a/assets-fx/bground.png b/assets-fx/bground.png index 174080c9a26023ccb0eee8c433072007f3e029c8..3547c43cf7d60bf48f08a7c155e7587f10d33921 100644 GIT binary patch delta 14779 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 VVupY!**X9K002ovPDHLkV1oDOkOTk# delta 15113 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 diff --git a/assets-fx/dna.png b/assets-fx/dna.png index 5d515bd681fc919fe9dbce1bb1bca3b29197adf7..07127be892581f1b528da5bc2c768a57464d3427 100644 GIT binary patch delta 6233 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 <= 100) current_game->dna += 1; current_game->research += current_game->priority; - // if (current_game->research > current_game->limit) ; game over + if (current_game->research > current_game->limit) + { + const char *msg[5] = {"Vous avez", "perdu.", "", "", ""}; + message(msg); + current_game->research = 0; + } - // Epidemic propagation simulation to add here + epidemic_simulation(current_game); } } diff --git a/src/core.h b/src/core.h index e2bb6be..9b9c2b1 100644 --- a/src/core.h +++ b/src/core.h @@ -16,7 +16,7 @@ struct grid { - int width, height; + int height, width; // Use grid.data[i + j * grid.width] instead of grid.data[i][j] uint8_t *data; @@ -39,6 +39,9 @@ struct game // Research data int research, limit, priority; + // Humans stats : healthy, infected, dead, healed + long long int humans[4]; + // Time int time; diff --git a/src/data.c b/src/data.c index bbc937a..1dc55cc 100644 --- a/src/data.c +++ b/src/data.c @@ -1,5 +1,6 @@ #include "mutation_engine.h" + const struct mutation symptoms_data[14] = { {1, 1, 0, 2, 0, "NAUSEE"}, @@ -51,36 +52,42 @@ const struct mutation transmissions_data[13] = const struct mutation default_value = {0, 0, 0, 0, 0, "NONE"}; -const unsigned int world[64][128] = +/* Encoded data for the world + 0: water + 1: low temperature + 2: temperate + 3: hot +*/ +const unsigned int world[64][128] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0}, - {0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0}, - {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}, - {0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, - {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, - {2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, + {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, @@ -93,28 +100,28 @@ const unsigned int world[64][128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 3, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }; diff --git a/src/display_engine.c b/src/display_engine.c index 560d009..1c83ed9 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -1,4 +1,5 @@ #include +#include #include "mutation_engine.h" #include "display_engine.h" @@ -24,11 +25,12 @@ void display_foreground(const int background, const struct game *current_game) { dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); } + break; case 2: for (int i = 0; current_game->planes[i]; i++) { - if (current_game->planes[i]->y + 8 < 53) dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); + if (current_game->planes[i]->y + 8 < 57) dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); } int length = 74 * current_game->research / current_game->limit; @@ -58,7 +60,15 @@ void display_foreground(const int background, const struct game *current_game) if (current_game->mutations_selected[2]) dsubimage(65, 15, &img_mutations, 32, 16 * (current_game->mutations_selected[2] - 1), 15, 15, 0); break; - // case 6: statistics about humans + case 6: + for (int i = 0; i < 4; i ++) + { + length = floor(63 * current_game->humans[i] / 8192); + dline(61, i*8 + 31, 61 + length, i*8 + 31, C_BLACK); + dline(61, i*8 + 32, 61 + length, i*8 + 32, C_BLACK); + + } + break; } } diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index 8e46036..9ef4ad2 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -1,25 +1,81 @@ +#include #include "epidemic_engine.h" -int * count(const int epidemic_grid[64][128], int counter[4]) + +int can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j) { - for (int i = 0; i < 64; i ++) - { - for (int j = 0; j < 128; j ++) - { - counter[epidemic_grid[i][j]] ++; - } - } - return counter; + extern const unsigned int world[64][128]; + + // In case of water, low or high temperature + if (world[i][j] == 0 && mutations_selected[2] != 3) return 0; + if (world[i][j] == 1 && mutations_selected[1] != 0 && mutations_selected[1] != 4) return 0; + if (world[i][j] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return 0; + + // return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i (j+1) * epidemic_grid.width] - 1) == 0; + + if (i == 0 && j == 0) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + if (i == 0 && j == epidemic_grid.width - 1) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; + if (i == 0) return (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) == 0; + + if (i == epidemic_grid.height -1 && j == 0) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + if (i == epidemic_grid.height - 1 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; + if (i == epidemic_grid.height) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + + return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; } -int can_become_infected(const int epidemic_grid[64][128], const int i, const int j) + +int bernoulli(const float p, const int seed) { - - return 0; + srand(seed); + return rand() > p; } void epidemic_simulation(struct game *current_game) { - + float contagion_rate = current_game->contagion / 100; + float lethality_rate = current_game->lethality / 100; + float healed_rate = current_game->research / current_game->limit; + + for (int i = 0; i < current_game->grid.height; i ++) + { + for (int j = 0; j < current_game->grid.width; j ++) + { + switch (current_game->grid.data[i + j * current_game->grid.width]) + { + // Healthy + case 0: + if (can_become_infected(current_game->grid, current_game->mutations_selected, i, j) + && bernoulli(contagion_rate, current_game->time)) + { + current_game->grid.data[i + j * current_game->grid.width] = 1; + current_game->humans[0] --; + current_game->humans[1] ++; + } + break; + + // Infected + case 1: + + // Become healed + if (bernoulli(healed_rate, current_game->time)) + { + current_game->grid.data[i + j * current_game->grid.width] = 3; + current_game->humans[1] --; + current_game->humans[3] ++; + } + + // Become dead + else if (bernoulli(lethality_rate, current_game->time)) + { + current_game->grid.data[i + j * current_game->grid.width] = 2; + current_game->humans[1] --; + current_game->humans[2] ++; + } + break; + } + + } + } } \ No newline at end of file diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index e71bff7..6916b9a 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -1,14 +1,16 @@ #ifndef _EPIDEMIC_ENGINE_H #define _EPIDEMIC_ENGINE_H -// humans per case of the epidemic grid -#define HUMAN_PER_CASE 1000000 +#include "core.h" -// count : return an int *counter[4] of the form {healthy, infected, healed, dead} -int * count(const int epidemic_grid[64][128], int counter[4]); +// humans per case of the epidemic grid +#define HUMANS_PER_CASE 1000000 // can_become_infected : return 0 if the case (i, j) isn't infectable, 1 else -int can_become_infected(const int epidemic_grid[64][128], const int i, const int j); +int can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j); + +// bernoulli : simulate a random event +int bernoulli(const float p, const int seed); // epidemic_simulation : simulate the propagation of the virus void epidemic_simulation(struct game *current_game); diff --git a/src/main.c b/src/main.c index 9903088..27a6009 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,7 @@ Version ...........: - dev - Last modification .: 29 May 2021 - code provided with licence : + code and assets provided with licence : GNU General Public Licence v3.0 */ @@ -17,7 +17,6 @@ #include "core.h" #include "display_engine.h" #include "mutation_engine.h" -#include "epidemic_engine.h" // title_screen : display the title screen @@ -56,12 +55,13 @@ int main(void) .research = 0, .limit = RESEARCH_LIMIT, .priority = 0, + .humans = {8191, 1, 0, 0}, .time = 0, .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL}, - .grid = {128, 64, NULL}, + .grid = {64, 128, NULL}, }; /* allocate memory */ @@ -81,8 +81,6 @@ static void title_screen(void) extern bopti_image_t img_title; extern bopti_image_t img_explosion; - extern const unsigned int world; - static volatile int tick_250 = 1; static volatile int tick_100 = 1; int t_250 = timer_configure(TIMER_ANY, 250000, GINT_CALL(callback_tick, &tick_250)); -- 2.45.0 From b197758c1030d1098f2f80306e110ecf6645b2e1 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Tue, 1 Jun 2021 11:45:23 +0200 Subject: [PATCH 21/26] Display the disease propagation : first try. Add a new assets folder (for old assets) --- Old assets/Plague Logo.png | Bin 0 -> 1747 bytes Old assets/title.png | Bin 0 -> 3894 bytes src/display_engine.c | 25 +++++++++++++++++++++++++ src/main.c | 2 ++ 4 files changed, 27 insertions(+) create mode 100644 Old assets/Plague Logo.png create mode 100644 Old assets/title.png diff --git a/Old assets/Plague Logo.png b/Old assets/Plague Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f207bed55e0f641fed58c37610c3e634b4625e2a GIT binary patch literal 1747 zcmV;^1}yoBP)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*IS-bxA})RA>e5SM6@ZAPieid;eG7E+@Hi-4GI>-JP`lffC!XDePnW zc|Kns{5(F``^){Pm=5|he-8j)U_2~lbzpcM*vtsNVOfLMG3PpKzwUq*L1JJuui{Os%27N# zpDwWiTgD-Py74kx52sqt)X~#_FxdmB$X~y+NAupi1D;VMb6~}AjT;#*sj4F>DMq7PmTMxCT7eu~r$&0o25d0p+T8CP+DeiE1M? zl4-0Q)y!xZrgVuTQ5fnO0WQ+2)E>QtEisShttsEbcx%e@-iQ9rg?A!z?=rbdNg`X7{6LG41mU&raj}( p!njH^6#z}&aXeh&cQn}Z^b5*@I8##AOS1p~002ovPDHLkV1nkIRZ0K= literal 0 HcmV?d00001 diff --git a/Old assets/title.png b/Old assets/title.png new file mode 100644 index 0000000000000000000000000000000000000000..f0beb69a4245ae4f7e449a89036e2db7eb414947 GIT binary patch literal 3894 zcmV-656SR}P)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*IS_*hxe|RCodHT#It!HVkxb(*OV9b|&R2T4uQd_>k;4cW2F{B!I;N z1Rz;))4tu_Zy&eUHLSqLzaO`^f8K^T0#@<#JG&wtt}MqapZCq{zuWEOBc6k|w{qxD z)a|z8vLG85{?XwhCgP>d*BWmW-|dufhW(1pS@{XNxUv}+X{Oz;#M@dM6@}4ZV}W`& z;<3))W_fi`M!aqx$;egtAz!`N4A$%_pZk;F^^mie@X2hvw>Lfq^@2qSP`4EoLc>mL z8Ib*P^`-gTdHhYAaJX+*-Z_@|%hTgMmNMc$rT@^Ru785P^{o6HU%W)L^*(2iqH8%F)f83t^XEmRWl$7ky{mLmT;sblxw z4lx{#?p1 zs>5oW*}8cSRW7~50N{t0p1W=BE-4^<1d(a5p5`gdV)4!lV3rm+VZR42`JyJ#rnxB2 z?U_w+ig8}x@N>YFS~h(sjyeqO04VDd_j>5_589|xjN6Ful{om)pE|D8 zyD#J!4E<2&Uld;JdIsmM@y^u%D|_ag9894Zo3+olGEN*=QFi-}BzK3y}%g(FzZ0|7@=X{hEqkGzY zox!-zv*pnsL}!Y0ILBLg3;6o|;MphpDe?DT89g1nBh{u2(L$?U@vHlcQ}y5s^W!t# zUIdv#eF9MNTK}#Ja6bO7Q;$xIsw7W=o~z%HJ?vQ@zT@Lmtv}&6hoV=jPy86xncO zdUEtQiTSZ>DVP?Dd9uK?ai#rP>r5Vs@!oXb0USJgNF9)~9J8@TIL$?|QC^B=!_|j- zEhu%fYmXNkSGc1blrK8-Lw^m_f+D#n0ZkhC5ytT|yz0Zf=7yM*uQbSgo8p(3x0S2s zt2S~XHuPMn$Evz5N4f1EIslpk_AD~?QKM;(Z19OL`oOm0M=ttrzVdlVyRT94iP?%v zVPDx4Q%{MRZJ8RS_m49r@6>i{q~)~4`c$n*k9w=2FO_CW)HguNl&#LVt`aJesZ zydpepT*^7?mijOudW@Njk?rI$MXMjnP;=JZHNwvnb;SE9J96Vt)fl+* z(PjJuPl09t{J<<+C42B@Hr^;t+9N*bXkR_fy_)Y$qI?g29fHGCz=xp7%}d~FL7stU z^P=X`hP>Pk8+E$xouT1NzR6?rBA%$BJ^Yq;5U1x8#Q+a|s=c|@zp_o#Ux1&mYZ_7R z;OOc#wP%aCW^^pDVr#LB5_V!#ulUiP{=g}R>bY0D^1{B^_)(z7vj6da55VT(?$tY3 zhk_V8TUS*7F0dHAxGeg}kM>nO{8oJ&-{jo6&Ht#602W-=Y&bGKeRV*zm|ke&u__L7 z4-5P3wZf}djlb!GLHO}c04)-m!Y6^+qCN4EZB~~Rbk_g7afhZ45;zP%Ry61%o9k4j z4_D-(_DCM&TR#SRIL6bDjUN79HZ6X{iDBZ8+o{)qa}4BBjL4^_`+6wsza#41<;_xC zj}$ieD&Dz9{*66(foU)%Xlyf`67NxXaInEx$w?g&qwZ9ayOYKl@f`jpP!ogmsF1L; z*<43Km+fC;I^{abd5Yu?Ag?7TwK>{&+B~dd+&&}sIDWxMfUev}-yV5T9Rj!ATfX!p zkz^ht@}FnEKd(t?=1w20=Ui#$A-8bL21K&J4}hjVS#S-qVLR;riq<= zcd#0N7LS@~^Rn9Z_|zXb??cab#fEQHKK~=}~?gW#-zXfyVn4=^V2tqXFIo-kA}V+amwS z?~3lX`zDZw#qfpAB|z5IL1iPnc|v)5OYV%|VKI{@e4@_M`#tng!*y6_&zkXwCZKXz zJgq7)_l!S^IeY@JSWS}qTeaI*^c}AI=e`#^Y8EimJAM?0ej}XQ&&Hu& zjoTT3j>*%Rm$Qas`g!IUse?K5#g((vLKOpw#{vT9HpuuTI?dj`w>U&(7jlRyg$$GA!+tcp= zA^D%A)Iufa$_kw|Mrkr%#pwPDXV=$;;57hR^@$-+_-a$t7fpgcSG8T)cbgAl8vqlp zgx-Bw#QQVH$uXW=&%~!s#%VFKV(VaJ7^PB-`YL92&!L*d^T@OKPuygI)<`d)&z&L< z2)@x788g7)-NxT*@?fo{4g>jHb5~-_bO-{@&yN5eA^_Bg#8gFR)8py5{Ww$S%zCHR zrttv#`PmSt5167$8$}+jqk3AN%&mzTa3H_We;v#~Gb@NJVB;o%v;f5L?%;0#&~J$h zzFnlh<6ZWcjHmvLt#Q>Jap;-1#@V-$wb*ig`h*QB0jCE5$tkZUoAiP)0p)qsjc3eg z6}#qSR?p%(jmXegGX6QB0tyXM#u1FAcCWIOWBD*5@md?c~hE9Cj>Y zvX+#M`K}^jAV1a=$+t^8;eUZJHv(w80mi zup1u!?z3}hU6~4XJb(N@iY$cD0DwgG`jlXRt1A;E4-=(~l|{tf@hWfmd4b_1m*Syj zJk?VtZre7~JI-a#zu_6=>s*^0_(b`uj{E$JAWoH$SI6?XmIV)!`~#J!Mbo^+GuB$l z3*{ok0j``;eg}Jb2Uz=S#}cxVyoTV=fK^4*q*V^!*%S56hLc#>^Cy5Z1$&avlm(;x zwZ;{=Isj+;K)=%ipvNH@bgx0s%8d6{20-h6ruOjvACnv39Hq)$07*qoM6N<$ Ef@o*aaR2}S literal 0 HcmV?d00001 diff --git a/src/display_engine.c b/src/display_engine.c index 1c83ed9..25ecd00 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -16,28 +16,53 @@ void display_foreground(const int background, const struct game *current_game) { extern const bopti_image_t img_mutations; extern const bopti_image_t img_planes; + extern const unsigned int world[64][128]; + GUNUSED int length; switch (background) { case 1: + + // Planes animations for (int i = 0; current_game->planes[i]; i++) { dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); } + // Disease propagation + for (int i = 0; i < current_game->grid.height; i ++) + { + for (int j = 0; j < current_game->grid.width, j ++) + { + if (current_game->grid[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + } + } break; + case 2: + + // Planes animations for (int i = 0; current_game->planes[i]; i++) { if (current_game->planes[i]->y + 8 < 57) dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); } + // Status bottom bar int length = 74 * current_game->research / current_game->limit; dprint(9, 58, C_BLACK, "%d", current_game->dna); dline(51, 60, 51 + length, 60, C_BLACK); dline(51, 59, 51 + length, 59, C_BLACK); + + // Disease propagation + for (int i = 0; i < current_game->grid.height; i ++) + { + for (int j = 0; j < 50, j ++) + { + if (current_game->grid[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + } + } break; case 3: diff --git a/src/main.c b/src/main.c index 27a6009..ad8cbd4 100644 --- a/src/main.c +++ b/src/main.c @@ -67,6 +67,8 @@ int main(void) /* allocate memory */ current_game.grid.data = calloc(current_game.grid.width * current_game.grid.height, sizeof(uint8_t)); + current_game.grid.data[95 + 25 * currnet_game.grid.width] = 1; + main_loop(¤t_game); /* free memory */ -- 2.45.0 From 863473457e8052b46a34d84614896267c4228c1a Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Tue, 1 Jun 2021 11:59:33 +0200 Subject: [PATCH 22/26] Fix bugs --- Plague.g1a | Bin 90388 -> 90580 bytes src/display_engine.c | 36 ++++++++++++++++++------------------ src/epidemic_engine.c | 8 ++++---- src/main.c | 2 +- src/mutation_engine.c | 1 + 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index 55c22dd429885c38dc8c5d84e0dd3bd054d6a842..d69480a21f206870219d1057d9a369b20540bad6 100644 GIT binary patch delta 5024 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 diff --git a/src/display_engine.c b/src/display_engine.c index 25ecd00..4b81f45 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -24,24 +24,33 @@ void display_foreground(const int background, const struct game *current_game) { case 1: + // Disease propagation + for (int i = 0; i < current_game->grid.width; i ++) + { + for (int j = 0; j < current_game->grid.height; j ++) + { + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + } + } + // Planes animations for (int i = 0; current_game->planes[i]; i++) { dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); } - - // Disease propagation - for (int i = 0; i < current_game->grid.height; i ++) - { - for (int j = 0; j < current_game->grid.width, j ++) - { - if (current_game->grid[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); - } - } break; case 2: + // Disease propagation + for (int i = 0; i < current_game->grid.width; i ++) + { + for (int j = 0; j < 50; j ++) + { + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + } + } + // Planes animations for (int i = 0; current_game->planes[i]; i++) { @@ -54,15 +63,6 @@ void display_foreground(const int background, const struct game *current_game) dline(51, 60, 51 + length, 60, C_BLACK); dline(51, 59, 51 + length, 59, C_BLACK); - - // Disease propagation - for (int i = 0; i < current_game->grid.height; i ++) - { - for (int j = 0; j < 50, j ++) - { - if (current_game->grid[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); - } - } break; case 3: diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index 9ef4ad2..1372521 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -14,12 +14,12 @@ int can_become_infected(const struct grid epidemic_grid, const int mutations_sel // return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i (j+1) * epidemic_grid.width] - 1) == 0; if (i == 0 && j == 0) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; - if (i == 0 && j == epidemic_grid.width - 1) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; + if (i == 0 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; if (i == 0) return (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) == 0; - if (i == epidemic_grid.height -1 && j == 0) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; - if (i == epidemic_grid.height - 1 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; - if (i == epidemic_grid.height) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + if (i == epidemic_grid.width - 1 && j == 0) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + if (i == epidemic_grid.width - 1 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; + if (i == epidemic_grid.width - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; } diff --git a/src/main.c b/src/main.c index ad8cbd4..ae48d8b 100644 --- a/src/main.c +++ b/src/main.c @@ -67,7 +67,7 @@ int main(void) /* allocate memory */ current_game.grid.data = calloc(current_game.grid.width * current_game.grid.height, sizeof(uint8_t)); - current_game.grid.data[95 + 25 * currnet_game.grid.width] = 1; + current_game.grid.data[95 + 20 * current_game.grid.width] = 1; main_loop(¤t_game); diff --git a/src/mutation_engine.c b/src/mutation_engine.c index 78e6783..fc6e795 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -5,6 +5,7 @@ #include "mutation_engine.h" + void get_mutation(const struct game *current_game, const int mutation_menu, int table[4][8]) { // Load symptoms -- 2.45.0 From 910bcced27bdea93c314abbf3a7fa876507fbbe4 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Tue, 1 Jun 2021 14:58:37 +0200 Subject: [PATCH 23/26] Works on disease simulations --- Plague.g1a | Bin 90580 -> 89792 bytes assets-fx/bground.png | Bin 18445 -> 18902 bytes assets-fx/title.png | Bin 2982 -> 21314 bytes old assets/Plague Logo.png | Bin 0 -> 1747 bytes old assets/bground.png | Bin 0 -> 18592 bytes old assets/convert_world.py | 39 +++++++++++++++++++ old assets/title.png | Bin 0 -> 3894 bytes old assets/world.png | Bin 0 -> 2216 bytes src/core.c | 1 - src/core.h | 2 +- src/data.c | 2 +- src/display_engine.c | 17 +++++---- src/epidemic_engine.c | 73 ++++++++++++++++++++---------------- src/epidemic_engine.h | 4 +- src/main.c | 45 ++++++++++++---------- src/mutation_engine.c | 2 +- 16 files changed, 118 insertions(+), 67 deletions(-) create mode 100644 old assets/Plague Logo.png create mode 100644 old assets/bground.png create mode 100644 old assets/convert_world.py create mode 100644 old assets/title.png create mode 100644 old assets/world.png diff --git a/Plague.g1a b/Plague.g1a index d69480a21f206870219d1057d9a369b20540bad6..fefbe92927ad26935dde88007c50e1e2a14256e5 100644 GIT binary patch delta 7289 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 M?4+h;W(hv?f6f#N82|tP delta 7933 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 CVpp;N diff --git a/assets-fx/bground.png b/assets-fx/bground.png index 3547c43cf7d60bf48f08a7c155e7587f10d33921..16eac62ebc335d7fcebc0d8f43f27a44c57b21b7 100644 GIT binary patch delta 12025 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 VVupY!**X9K002ovPDHLkV1nC}GR*)0 diff --git a/assets-fx/title.png b/assets-fx/title.png index e929a45d59b0707fa340718176942bc3fd597027..dcc8c29a0c9607c82d016f8c3e3cb391d4f9ce57 100644 GIT binary patch literal 21314 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 QMF0Q*07*qoM6N<$g2Qh7=>Px# delta 2951 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 diff --git a/old assets/Plague Logo.png b/old assets/Plague Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f207bed55e0f641fed58c37610c3e634b4625e2a GIT binary patch literal 1747 zcmV;^1}yoBP)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*IS-bxA})RA>e5SM6@ZAPieid;eG7E+@Hi-4GI>-JP`lffC!XDePnW zc|Kns{5(F``^){Pm=5|he-8j)U_2~lbzpcM*vtsNVOfLMG3PpKzwUq*L1JJuui{Os%27N# zpDwWiTgD-Py74kx52sqt)X~#_FxdmB$X~y+NAupi1D;VMb6~}AjT;#*sj4F>DMq7PmTMxCT7eu~r$&0o25d0p+T8CP+DeiE1M? zl4-0Q)y!xZrgVuTQ5fnO0WQ+2)E>QtEisShttsEbcx%e@-iQ9rg?A!z?=rbdNg`X7{6LG41mU&raj}( p!njH^6#z}&aXeh&cQn}Z^b5*@I8##AOS1p~002ovPDHLkV1nkIRZ0K= literal 0 HcmV?d00001 diff --git a/old assets/bground.png b/old assets/bground.png new file mode 100644 index 0000000000000000000000000000000000000000..174080c9a26023ccb0eee8c433072007f3e029c8 GIT binary patch literal 18592 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 R 52: return 1 + if 24 < index < 40: return 3 + else: return 2 + + +def show(): + img = Image.open("world.png") + data = np.array(img) + + rslt = "" + for index, line in enumerate(data): + for pxl in line: + rslt += f"{analyse(index, pxl)}" + rslt += "\n" + print(rslt) + + +def get_tabular(): + img = Image.open("world.png") + data = np.array(img) + + rslt = "const unsigned int world[64][128] =\n{" + for index, line in enumerate(data): + rslt += "\n {" + for pxl in line: + rslt += f"{analyse(index, pxl)}, " + rslt = rslt[:-2] + "}," + rslt += "\n};" + print(rslt) + + +get_tabular() diff --git a/old assets/title.png b/old assets/title.png new file mode 100644 index 0000000000000000000000000000000000000000..f0beb69a4245ae4f7e449a89036e2db7eb414947 GIT binary patch literal 3894 zcmV-656SR}P)Hg1+lHrgWSWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6 zwD^Ni=!>T7nL9I?X}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8re zhoBb*p;u8ID_yBf0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J z`jH<$>RKN5V(7OqK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYv zwjAKwmYb0gKL(K8-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z> z!FI&AHCpoWI|RUqx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVT zrI(b06~u#xf1yS}_UGdMvD``!0~u->P=lA4?YN`hilQ z|3tHka)7T{2CGqwjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^ z7T9R1gAN8V6s;5)ieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2b zW$~+pTw@bIek?ZvKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L z_AC5qq~L$#SMj%U$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6= zb6>{xYV#Ue-+LB$7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re z4r3qYr~6#KE>;1F`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+ z5K}u-6REM(K@W$srgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5 zh^QEb$V`rCQ-|7ZS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX z2i^rZ^Mu;6+rb@?NPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV z0id6JRRdfL?*IS_*hxe|RCodHT#It!HVkxb(*OV9b|&R2T4uQd_>k;4cW2F{B!I;N z1Rz;))4tu_Zy&eUHLSqLzaO`^f8K^T0#@<#JG&wtt}MqapZCq{zuWEOBc6k|w{qxD z)a|z8vLG85{?XwhCgP>d*BWmW-|dufhW(1pS@{XNxUv}+X{Oz;#M@dM6@}4ZV}W`& z;<3))W_fi`M!aqx$;egtAz!`N4A$%_pZk;F^^mie@X2hvw>Lfq^@2qSP`4EoLc>mL z8Ib*P^`-gTdHhYAaJX+*-Z_@|%hTgMmNMc$rT@^Ru785P^{o6HU%W)L^*(2iqH8%F)f83t^XEmRWl$7ky{mLmT;sblxw z4lx{#?p1 zs>5oW*}8cSRW7~50N{t0p1W=BE-4^<1d(a5p5`gdV)4!lV3rm+VZR42`JyJ#rnxB2 z?U_w+ig8}x@N>YFS~h(sjyeqO04VDd_j>5_589|xjN6Ful{om)pE|D8 zyD#J!4E<2&Uld;JdIsmM@y^u%D|_ag9894Zo3+olGEN*=QFi-}BzK3y}%g(FzZ0|7@=X{hEqkGzY zox!-zv*pnsL}!Y0ILBLg3;6o|;MphpDe?DT89g1nBh{u2(L$?U@vHlcQ}y5s^W!t# zUIdv#eF9MNTK}#Ja6bO7Q;$xIsw7W=o~z%HJ?vQ@zT@Lmtv}&6hoV=jPy86xncO zdUEtQiTSZ>DVP?Dd9uK?ai#rP>r5Vs@!oXb0USJgNF9)~9J8@TIL$?|QC^B=!_|j- zEhu%fYmXNkSGc1blrK8-Lw^m_f+D#n0ZkhC5ytT|yz0Zf=7yM*uQbSgo8p(3x0S2s zt2S~XHuPMn$Evz5N4f1EIslpk_AD~?QKM;(Z19OL`oOm0M=ttrzVdlVyRT94iP?%v zVPDx4Q%{MRZJ8RS_m49r@6>i{q~)~4`c$n*k9w=2FO_CW)HguNl&#LVt`aJesZ zydpepT*^7?mijOudW@Njk?rI$MXMjnP;=JZHNwvnb;SE9J96Vt)fl+* z(PjJuPl09t{J<<+C42B@Hr^;t+9N*bXkR_fy_)Y$qI?g29fHGCz=xp7%}d~FL7stU z^P=X`hP>Pk8+E$xouT1NzR6?rBA%$BJ^Yq;5U1x8#Q+a|s=c|@zp_o#Ux1&mYZ_7R z;OOc#wP%aCW^^pDVr#LB5_V!#ulUiP{=g}R>bY0D^1{B^_)(z7vj6da55VT(?$tY3 zhk_V8TUS*7F0dHAxGeg}kM>nO{8oJ&-{jo6&Ht#602W-=Y&bGKeRV*zm|ke&u__L7 z4-5P3wZf}djlb!GLHO}c04)-m!Y6^+qCN4EZB~~Rbk_g7afhZ45;zP%Ry61%o9k4j z4_D-(_DCM&TR#SRIL6bDjUN79HZ6X{iDBZ8+o{)qa}4BBjL4^_`+6wsza#41<;_xC zj}$ieD&Dz9{*66(foU)%Xlyf`67NxXaInEx$w?g&qwZ9ayOYKl@f`jpP!ogmsF1L; z*<43Km+fC;I^{abd5Yu?Ag?7TwK>{&+B~dd+&&}sIDWxMfUev}-yV5T9Rj!ATfX!p zkz^ht@}FnEKd(t?=1w20=Ui#$A-8bL21K&J4}hjVS#S-qVLR;riq<= zcd#0N7LS@~^Rn9Z_|zXb??cab#fEQHKK~=}~?gW#-zXfyVn4=^V2tqXFIo-kA}V+amwS z?~3lX`zDZw#qfpAB|z5IL1iPnc|v)5OYV%|VKI{@e4@_M`#tng!*y6_&zkXwCZKXz zJgq7)_l!S^IeY@JSWS}qTeaI*^c}AI=e`#^Y8EimJAM?0ej}XQ&&Hu& zjoTT3j>*%Rm$Qas`g!IUse?K5#g((vLKOpw#{vT9HpuuTI?dj`w>U&(7jlRyg$$GA!+tcp= zA^D%A)Iufa$_kw|Mrkr%#pwPDXV=$;;57hR^@$-+_-a$t7fpgcSG8T)cbgAl8vqlp zgx-Bw#QQVH$uXW=&%~!s#%VFKV(VaJ7^PB-`YL92&!L*d^T@OKPuygI)<`d)&z&L< z2)@x788g7)-NxT*@?fo{4g>jHb5~-_bO-{@&yN5eA^_Bg#8gFR)8py5{Ww$S%zCHR zrttv#`PmSt5167$8$}+jqk3AN%&mzTa3H_We;v#~Gb@NJVB;o%v;f5L?%;0#&~J$h zzFnlh<6ZWcjHmvLt#Q>Jap;-1#@V-$wb*ig`h*QB0jCE5$tkZUoAiP)0p)qsjc3eg z6}#qSR?p%(jmXegGX6QB0tyXM#u1FAcCWIOWBD*5@md?c~hE9Cj>Y zvX+#M`K}^jAV1a=$+t^8;eUZJHv(w80mi zup1u!?z3}hU6~4XJb(N@iY$cD0DwgG`jlXRt1A;E4-=(~l|{tf@hWfmd4b_1m*Syj zJk?VtZre7~JI-a#zu_6=>s*^0_(b`uj{E$JAWoH$SI6?XmIV)!`~#J!Mbo^+GuB$l z3*{ok0j``;eg}Jb2Uz=S#}cxVyoTV=fK^4*q*V^!*%S56hLc#>^Cy5Z1$&avlm(;x zwZ;{=Isj+;K)=%ipvNH@bgx0s%8d6{20-h6ruOjvACnv39Hq)$07*qoM6N<$ Ef@o*aaR2}S literal 0 HcmV?d00001 diff --git a/old assets/world.png b/old assets/world.png new file mode 100644 index 0000000000000000000000000000000000000000..359c314c739d98eb09b02d21081b6d153413e81d GIT binary patch literal 2216 zcmV;Z2v_%sP)EX>4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRb1C~&j0`b z24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jvC<1u+_c zRgQN6000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000B`Nklf0;RDgwiawm<9s&&Xdl*YVC5)6>sH6!&fZpo3 zKhMDB1RkqYOF*EpkECR-iS*3c{kbK<2rNzoV93PT+!d1FL!h zCB@to=$YP%Hux*w&*AS6_;8(MN&mWfR?h;A-YH$Geby_Yf;=k459i%;0iz$hT_KnV zUt(|INw~3__NkA ziE*y_6g^sxUeARY0VGy}hMyi)B74m$UaY{XkQOos)CT_f9*ag$N*p8_h#l_xz}sWLTm4wMe7Uin#CPvSR(?9zY{wR^}# z7O*mNPxBw8utd##ApTxU7s=|DFpZm`kFW>NL*+CI7+-MjTp_| zgw)Y*cP_v(jT`mMTaF2O+*{I;h3N_OkRo!YYO|)3-n~mAcMe#(01x*7X}BQB`&VuN za>Sl=pFvatXa|Z~bqngfNz~G@sS7w)x%S;ln-Ew)mTI z$^kxZK+5r(e87(_&|=Z>rqH9py)D6Ni#U5@@mc-4;?4qm{r-M! q3y~uX@`#+2NNhc_u?slh+sGe|1^TK7#*-HS0000research = 0; } - epidemic_simulation(current_game); } } diff --git a/src/core.h b/src/core.h index 9b9c2b1..196644d 100644 --- a/src/core.h +++ b/src/core.h @@ -40,7 +40,7 @@ struct game int research, limit, priority; // Humans stats : healthy, infected, dead, healed - long long int humans[4]; + int humans[4]; // Time int time; diff --git a/src/data.c b/src/data.c index 1dc55cc..cf6bfb5 100644 --- a/src/data.c +++ b/src/data.c @@ -3,7 +3,7 @@ const struct mutation symptoms_data[14] = { - {1, 1, 0, 2, 0, "NAUSEE"}, + {100, 1, 0, 0, 0, "NAUSEE"}, {3, 2, 0, 4, 0, "VOMISSEMENT"}, {2, 1, 0, 3, 0, "TOUX"}, {2, 2, 0, 4, 0, "PNEUMONIE"}, diff --git a/src/display_engine.c b/src/display_engine.c index 4b81f45..b511339 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -29,7 +29,7 @@ void display_foreground(const int background, const struct game *current_game) { for (int j = 0; j < current_game->grid.height; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] != 0 && world[i][j] != 0) dpixel(i, j, C_BLACK); } } @@ -47,7 +47,7 @@ void display_foreground(const int background, const struct game *current_game) { for (int j = 0; j < 50; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] != 0 && world[i][j] != 0) dpixel(i, j, C_BLACK); } } @@ -68,15 +68,15 @@ void display_foreground(const int background, const struct game *current_game) case 3: dprint(102, 37, C_BLACK, "%d", current_game->dna); - length = 67 * current_game->contagion / 26; + length = 67 * current_game->contagion / 100; dline(57, 48, 57 + length, 48, C_BLACK); dline(57, 49, 57 + length, 49, C_BLACK); - length = 67 * current_game->severity / 20; + length = 67 * current_game->severity / 100; dline(57, 54, 57 + length, 54, C_BLACK); dline(57, 55, 57 + length, 55, C_BLACK); - length = 67 * current_game->lethality / 33; + length = 67 * current_game->lethality / 100; dline(57, 60, 57 + length, 60, C_BLACK); dline(57, 61, 57 + length, 61, C_BLACK); @@ -88,9 +88,10 @@ void display_foreground(const int background, const struct game *current_game) case 6: for (int i = 0; i < 4; i ++) { - length = floor(63 * current_game->humans[i] / 8192); - dline(61, i*8 + 31, 61 + length, i*8 + 31, C_BLACK); - dline(61, i*8 + 32, 61 + length, i*8 + 32, C_BLACK); + // length = 63 * current_game->humans[i] / (current_game->grid.width * current_game->grid.height); + // dline(61, i*8 + 31, 61 + length, i*8 + 31, C_BLACK); + // dline(61, i*8 + 32, 61 + length, i*8 + 32, C_BLACK); + dprint(61, i*8 + 31, C_BLACK, "%d", current_game->humans[i]); } break; diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index 1372521..93c8790 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -2,52 +2,59 @@ #include "epidemic_engine.h" -int can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j) +#include +#include + + +int grid_get(const struct grid epidemic_grid, const int i, const int j) +{ + if (i < 0 || j < 0 || i >= epidemic_grid.width || j >= epidemic_grid.height) return epidemic_grid.data[i + j * epidemic_grid.width]; + return 0; +} + + +bool can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j) { extern const unsigned int world[64][128]; // In case of water, low or high temperature - if (world[i][j] == 0 && mutations_selected[2] != 3) return 0; - if (world[i][j] == 1 && mutations_selected[1] != 0 && mutations_selected[1] != 4) return 0; - if (world[i][j] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return 0; + if (world[j][i] == 0 && mutations_selected[2] != 3) return false; + if (world[j][i] == 1 && mutations_selected[1] != 0 && mutations_selected[1] != 4) return false; + if (world[j][i] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return false; - // return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i (j+1) * epidemic_grid.width] - 1) == 0; - - if (i == 0 && j == 0) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; - if (i == 0 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; - if (i == 0) return (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) == 0; - - if (i == epidemic_grid.width - 1 && j == 0) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; - if (i == epidemic_grid.width - 1 && j == epidemic_grid.height - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) == 0; - if (i == epidemic_grid.width - 1) return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; - - return (epidemic_grid.data[i-1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i+1 + j * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j-1) * epidemic_grid.width] - 1) * (epidemic_grid.data[i + (j+1) * epidemic_grid.width] - 1) == 0; + // Test cases around + return grid_get(epidemic_grid, i - 1, j) == 1 || grid_get(epidemic_grid, i + 1, j) == 1 || grid_get(epidemic_grid, i, j - 1) == 1 || grid_get(epidemic_grid, i, j + 1) == 1; } -int bernoulli(const float p, const int seed) +bool bernoulli(const float p) { - srand(seed); - return rand() > p; + return (rand() / 2147483647) <= p; } void epidemic_simulation(struct game *current_game) { - float contagion_rate = current_game->contagion / 100; - float lethality_rate = current_game->lethality / 100; - float healed_rate = current_game->research / current_game->limit; + srand(15510); + double contagion_rate = current_game->contagion / 100; + double lethality_rate = current_game->lethality / 100; + double healed_rate = current_game->research / current_game->limit; - for (int i = 0; i < current_game->grid.height; i ++) + dclear(C_WHITE); + dprint(5, 5, C_BLACK, "HR:%lf", healed_rate); + dupdate(); + getkey(); + + for (int i = 0; i < current_game->grid.width; i ++) { - for (int j = 0; j < current_game->grid.width; j ++) + for (int j = 0; j < current_game->grid.height; j ++) { switch (current_game->grid.data[i + j * current_game->grid.width]) { // Healthy case 0: if (can_become_infected(current_game->grid, current_game->mutations_selected, i, j) - && bernoulli(contagion_rate, current_game->time)) + && bernoulli(contagion_rate)) { current_game->grid.data[i + j * current_game->grid.width] = 1; current_game->humans[0] --; @@ -59,20 +66,20 @@ void epidemic_simulation(struct game *current_game) case 1: // Become healed - if (bernoulli(healed_rate, current_game->time)) - { - current_game->grid.data[i + j * current_game->grid.width] = 3; - current_game->humans[1] --; - current_game->humans[3] ++; - } - - // Become dead - else if (bernoulli(lethality_rate, current_game->time)) + if (bernoulli(healed_rate)) { current_game->grid.data[i + j * current_game->grid.width] = 2; current_game->humans[1] --; current_game->humans[2] ++; } + + // Become dead + else if (bernoulli(lethality_rate)) + { + current_game->grid.data[i + j * current_game->grid.width] = 3; + current_game->humans[1] --; + current_game->humans[3] ++; + } break; } diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index 6916b9a..b217ff5 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -7,10 +7,10 @@ #define HUMANS_PER_CASE 1000000 // can_become_infected : return 0 if the case (i, j) isn't infectable, 1 else -int can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j); +bool can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j); // bernoulli : simulate a random event -int bernoulli(const float p, const int seed); +bool bernoulli(const float p); // epidemic_simulation : simulate the propagation of the virus void epidemic_simulation(struct game *current_game); diff --git a/src/main.c b/src/main.c index ae48d8b..a59da4b 100644 --- a/src/main.c +++ b/src/main.c @@ -55,7 +55,7 @@ int main(void) .research = 0, .limit = RESEARCH_LIMIT, .priority = 0, - .humans = {8191, 1, 0, 0}, + .humans = {0, 1, 0, 0}, .time = 0, @@ -68,6 +68,7 @@ int main(void) current_game.grid.data = calloc(current_game.grid.width * current_game.grid.height, sizeof(uint8_t)); current_game.grid.data[95 + 20 * current_game.grid.width] = 1; + current_game.humans[0] = (current_game.grid.width * current_game.grid.height) - 1; main_loop(¤t_game); @@ -83,47 +84,51 @@ static void title_screen(void) extern bopti_image_t img_title; extern bopti_image_t img_explosion; - static volatile int tick_250 = 1; - static volatile int tick_100 = 1; - int t_250 = timer_configure(TIMER_ANY, 250000, GINT_CALL(callback_tick, &tick_250)); - int t_100 = timer_configure(TIMER_ANY, 100000, GINT_CALL(callback_tick, &tick_100)); + static volatile int tick_5 = 1; + static volatile int tick_1 = 1; + int t_1 = timer_configure(TIMER_ANY, 500000, GINT_CALL(callback_tick, &tick_5)); + int t_2 = timer_configure(TIMER_ANY, 100000, GINT_CALL(callback_tick, &tick_1)); - if (t_250 >= 0) timer_start(t_250); - if (t_100 >= 0) timer_start(t_100); + if (t_1 >= 0) timer_start(t_1); + if (t_2 >= 0) timer_start(t_2); dclear(C_BLACK); dupdate(); - while (!tick_250) sleep(); - tick_250 = 0; + while (!tick_5) sleep(); + tick_5 = 0; dsubimage(0, 0, &img_title, 0, 0, 128, 64, DIMAGE_NONE); dupdate(); - while (!tick_250) sleep(); - tick_250 = 0; + while (!tick_5) sleep(); + tick_5 = 0; for (int frame = 0; frame < 5; frame ++) { dclear(C_BLACK); dsubimage(0, 0, &img_title, 0, 0, 128, 64, DIMAGE_NONE); - dsubimage(72, 5, &img_explosion, 41 * frame, 0, 40, 40, DIMAGE_NONE); + dsubimage(76, 9, &img_explosion, 41 * frame, 0, 40, 40, DIMAGE_NONE); dupdate(); - while (!tick_100) sleep(); - tick_100 = 0; + while (!tick_1) sleep(); + tick_1 = 0; } dclear(C_BLACK); dsubimage(0, 0, &img_title, 0, 65, 128, 64, DIMAGE_NONE); dupdate(); - while (!tick_250) sleep(); - tick_250 = 0; + + for (int i = 0; i < 2; i ++) + { + while (!tick_5) sleep(); + tick_5 = 0; + } for (int i = 0; i < 5; i ++) { dclear(C_BLACK); dsubimage(0, 0, &img_title, 0, ((i % 2) + 1) * 65, 128, 64, DIMAGE_NONE); dupdate(); - while (!tick_250) sleep(); - tick_250 = 0; + while (!tick_5) sleep(); + tick_5 = 0; } dclear(C_BLACK); @@ -132,8 +137,8 @@ static void title_screen(void) getkey(); - if (t_250 >= 0) timer_stop(t_250); - if (t_100 >= 0) timer_stop(t_100); + if (t_1 >= 0) timer_stop(t_1); + if (t_2 >= 0) timer_stop(t_2); } diff --git a/src/mutation_engine.c b/src/mutation_engine.c index fc6e795..a3a2b60 100644 --- a/src/mutation_engine.c +++ b/src/mutation_engine.c @@ -131,7 +131,7 @@ int mutation_buy(struct game *current_game, const struct cursor c, const int mut { current_game->mutations_selected[mutation_menu - 1] = id; update_disease(current_game); - const char *msg[5] = {"mutation", "selectionnee"}; + const char *msg[5] = {"mutation", "selectionnee", "", "", ""}; message(msg); } -- 2.45.0 From c57a6f97ae0684f3e709535314fd8f3143204ccb Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Wed, 2 Jun 2021 21:15:15 +0200 Subject: [PATCH 24/26] SysError --- Plague.g1a | Bin 89792 -> 88716 bytes src/core.h | 5 +++-- src/display_engine.c | 6 +++--- src/epidemic_engine.c | 40 +++++++++++++++++----------------------- src/epidemic_engine.h | 2 +- src/main.c | 6 ++++++ 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index fefbe92927ad26935dde88007c50e1e2a14256e5..8fd3ccbdd441a91c7f9699cf1a3bc7c442cc36de 100644 GIT binary patch delta 6504 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 diff --git a/src/core.h b/src/core.h index 196644d..66956ed 100644 --- a/src/core.h +++ b/src/core.h @@ -14,8 +14,9 @@ // Number of planes on screen #define NB_PLANES 5 -struct grid { - +struct grid +{ + // 64, 128 int height, width; // Use grid.data[i + j * grid.width] instead of grid.data[i][j] diff --git a/src/display_engine.c b/src/display_engine.c index b511339..e58d63f 100644 --- a/src/display_engine.c +++ b/src/display_engine.c @@ -8,7 +8,7 @@ void display_background(const int background) { extern const bopti_image_t img_bground; - dsubimage(0, 0, &img_bground, 0, 65 * (background - 1), 128, 64, DIMAGE_NONE); + if (background != 6) dsubimage(0, 0, &img_bground, 0, 65 * (background - 1), 128, 64, DIMAGE_NONE); } @@ -29,7 +29,7 @@ void display_foreground(const int background, const struct game *current_game) { for (int j = 0; j < current_game->grid.height; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] != 0 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); } } @@ -47,7 +47,7 @@ void display_foreground(const int background, const struct game *current_game) { for (int j = 0; j < 50; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] != 0 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); } } diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index 93c8790..d15b50b 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -2,14 +2,10 @@ #include "epidemic_engine.h" -#include -#include - - int grid_get(const struct grid epidemic_grid, const int i, const int j) { - if (i < 0 || j < 0 || i >= epidemic_grid.width || j >= epidemic_grid.height) return epidemic_grid.data[i + j * epidemic_grid.width]; - return 0; + if (i < 0 || j < 0 || i >= epidemic_grid.width || j >= epidemic_grid.height) return 0; + else return epidemic_grid.data[i + j * epidemic_grid.width]; } @@ -18,43 +14,41 @@ bool can_become_infected(const struct grid epidemic_grid, const int mutations_se extern const unsigned int world[64][128]; // In case of water, low or high temperature - if (world[j][i] == 0 && mutations_selected[2] != 3) return false; + /*if (world[j][i] == 0 && mutations_selected[2] != 3) return false; if (world[j][i] == 1 && mutations_selected[1] != 0 && mutations_selected[1] != 4) return false; - if (world[j][i] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return false; + if (world[j][i] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return false;*/ // Test cases around return grid_get(epidemic_grid, i - 1, j) == 1 || grid_get(epidemic_grid, i + 1, j) == 1 || grid_get(epidemic_grid, i, j - 1) == 1 || grid_get(epidemic_grid, i, j + 1) == 1; } -bool bernoulli(const float p) +bool bernoulli(const int p) { - return (rand() / 2147483647) <= p; + return (rand() % 101) <= p; } void epidemic_simulation(struct game *current_game) { srand(15510); - double contagion_rate = current_game->contagion / 100; - double lethality_rate = current_game->lethality / 100; - double healed_rate = current_game->research / current_game->limit; - dclear(C_WHITE); - dprint(5, 5, C_BLACK, "HR:%lf", healed_rate); - dupdate(); - getkey(); + int healed_rate = 100 * (current_game->research / current_game->limit); for (int i = 0; i < current_game->grid.width; i ++) { for (int j = 0; j < current_game->grid.height; j ++) { + current_game->grid.data[i + j * current_game->grid.width] = 1; + + /* switch (current_game->grid.data[i + j * current_game->grid.width]) { // Healthy - case 0: - if (can_become_infected(current_game->grid, current_game->mutations_selected, i, j) - && bernoulli(contagion_rate)) + case 0: + + // Become infected + if (can_become_infected(current_game->grid, current_game->mutations_selected, i, j) && bernoulli(current_game->contagion)) { current_game->grid.data[i + j * current_game->grid.width] = 1; current_game->humans[0] --; @@ -74,15 +68,15 @@ void epidemic_simulation(struct game *current_game) } // Become dead - else if (bernoulli(lethality_rate)) + else if (bernoulli(current_game->lethality)) { current_game->grid.data[i + j * current_game->grid.width] = 3; current_game->humans[1] --; current_game->humans[3] ++; } break; - } + }*/ } } -} \ No newline at end of file +} diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index b217ff5..a2cdd80 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -10,7 +10,7 @@ bool can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j); // bernoulli : simulate a random event -bool bernoulli(const float p); +bool bernoulli(const int p); // epidemic_simulation : simulate the propagation of the virus void epidemic_simulation(struct game *current_game); diff --git a/src/main.c b/src/main.c index a59da4b..bbc5f77 100644 --- a/src/main.c +++ b/src/main.c @@ -67,6 +67,12 @@ int main(void) /* allocate memory */ current_game.grid.data = calloc(current_game.grid.width * current_game.grid.height, sizeof(uint8_t)); + if (current_game.grid.data == NULL) + { + const char *msg[5] = {"CALLOC", "FAILED", "", "", ""}; + message(msg); + } + current_game.grid.data[95 + 20 * current_game.grid.width] = 1; current_game.humans[0] = (current_game.grid.width * current_game.grid.height) - 1; -- 2.45.0 From 329743fb32a3dfda95dfba5fb878da8c0e4304da Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Wed, 2 Jun 2021 22:10:19 +0200 Subject: [PATCH 25/26] =?UTF-8?q?Fully=20fonctionnal=20game=20(thanks=20Se?= =?UTF-8?q?nsei~=20=E2=99=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plague.g1a | Bin 88716 -> 64524 bytes src/data.c | 2 +- src/display_engine.c | 18 ++++++++---------- src/epidemic_engine.c | 36 +++++++++++++++++++++++++----------- src/epidemic_engine.h | 3 +++ 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/Plague.g1a b/Plague.g1a index 8fd3ccbdd441a91c7f9699cf1a3bc7c442cc36de..4f8012206f9ef302efccdd8063876c51f11e7681 100644 GIT binary patch delta 9269 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 delta 14625 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.height; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[j][i] != 0) dpixel(i, j, C_BLACK); } } @@ -45,9 +45,9 @@ void display_foreground(const int background, const struct game *current_game) // Disease propagation for (int i = 0; i < current_game->grid.width; i ++) { - for (int j = 0; j < 50; j ++) + for (int j = 0; j < 48; j ++) { - if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[i][j] != 0) dpixel(i, j, C_BLACK); + if (current_game->grid.data[i + j * current_game->grid.width] == 1 && world[j][i] != 0) dpixel(i, j, C_BLACK); } } @@ -88,11 +88,9 @@ void display_foreground(const int background, const struct game *current_game) case 6: for (int i = 0; i < 4; i ++) { - // length = 63 * current_game->humans[i] / (current_game->grid.width * current_game->grid.height); - // dline(61, i*8 + 31, 61 + length, i*8 + 31, C_BLACK); - // dline(61, i*8 + 32, 61 + length, i*8 + 32, C_BLACK); - dprint(61, i*8 + 31, C_BLACK, "%d", current_game->humans[i]); - + length = 63 * current_game->humans[i] / (current_game->grid.width * current_game->grid.height); + dline(61, i*8 + 31, 61 + length, i*8 + 31, C_BLACK); + dline(61, i*8 + 32, 61 + length, i*8 + 32, C_BLACK); } break; } diff --git a/src/epidemic_engine.c b/src/epidemic_engine.c index d15b50b..51ca43a 100644 --- a/src/epidemic_engine.c +++ b/src/epidemic_engine.c @@ -1,4 +1,5 @@ #include + #include "epidemic_engine.h" @@ -11,12 +12,12 @@ int grid_get(const struct grid epidemic_grid, const int i, const int j) bool can_become_infected(const struct grid epidemic_grid, const int mutations_selected[3], const int i, const int j) { - extern const unsigned int world[64][128]; + extern const uint8_t world[64][128]; // In case of water, low or high temperature - /*if (world[j][i] == 0 && mutations_selected[2] != 3) return false; + if (world[j][i] == 0 && mutations_selected[2] != 3) return false; if (world[j][i] == 1 && mutations_selected[1] != 0 && mutations_selected[1] != 4) return false; - if (world[j][i] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return false;*/ + if (world[j][i] == 3 && mutations_selected[1] != 1 && mutations_selected[1] != 4) return false; // Test cases around return grid_get(epidemic_grid, i - 1, j) == 1 || grid_get(epidemic_grid, i + 1, j) == 1 || grid_get(epidemic_grid, i, j - 1) == 1 || grid_get(epidemic_grid, i, j + 1) == 1; @@ -25,7 +26,7 @@ bool can_become_infected(const struct grid epidemic_grid, const int mutations_se bool bernoulli(const int p) { - return (rand() % 101) <= p; + return (rand() % 101) < p; } @@ -33,15 +34,17 @@ void epidemic_simulation(struct game *current_game) { srand(15510); + // Create a copy of the epidemic grid + uint8_t *current_grid = calloc(current_game->grid.width * current_game->grid.height, sizeof(uint8_t)); + init_tab(current_game->grid.width * current_game->grid.height, current_grid, current_game->grid.data); + int healed_rate = 100 * (current_game->research / current_game->limit); + // Make the epidemic grid evolove for (int i = 0; i < current_game->grid.width; i ++) { for (int j = 0; j < current_game->grid.height; j ++) { - current_game->grid.data[i + j * current_game->grid.width] = 1; - - /* switch (current_game->grid.data[i + j * current_game->grid.width]) { // Healthy @@ -50,7 +53,7 @@ void epidemic_simulation(struct game *current_game) // Become infected if (can_become_infected(current_game->grid, current_game->mutations_selected, i, j) && bernoulli(current_game->contagion)) { - current_game->grid.data[i + j * current_game->grid.width] = 1; + current_grid[i + j * current_game->grid.width] = 1; current_game->humans[0] --; current_game->humans[1] ++; } @@ -62,7 +65,7 @@ void epidemic_simulation(struct game *current_game) // Become healed if (bernoulli(healed_rate)) { - current_game->grid.data[i + j * current_game->grid.width] = 2; + current_grid[i + j * current_game->grid.width] = 2; current_game->humans[1] --; current_game->humans[2] ++; } @@ -70,13 +73,24 @@ void epidemic_simulation(struct game *current_game) // Become dead else if (bernoulli(current_game->lethality)) { - current_game->grid.data[i + j * current_game->grid.width] = 3; + current_grid[i + j * current_game->grid.width] = 3; current_game->humans[1] --; current_game->humans[3] ++; } break; - }*/ + } } } + init_tab(current_game->grid.width * current_game->grid.height, current_game->grid.data, current_grid); + free(current_grid); } + + +void init_tab(int x, uint8_t dest[x], uint8_t src[x]) +{ + for (int i = 0; i < x; i++) + { + dest[i] = src[i]; + } +} \ No newline at end of file diff --git a/src/epidemic_engine.h b/src/epidemic_engine.h index a2cdd80..6ad86d3 100644 --- a/src/epidemic_engine.h +++ b/src/epidemic_engine.h @@ -15,4 +15,7 @@ bool bernoulli(const int p); // epidemic_simulation : simulate the propagation of the virus void epidemic_simulation(struct game *current_game); +// init_tab : copy src into dest (for int) +void init_tab(int x, uint8_t dest[x], uint8_t src[x]); + #endif /* _EPIDEMIC_ENGINE_H */ \ No newline at end of file -- 2.45.0 From 957a0cf122d83704130bfdd7f0d8cb383e4834cc Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Wed, 2 Jun 2021 22:11:53 +0200 Subject: [PATCH 26/26] Change tests values --- src/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data.c b/src/data.c index 3042fad..24466b1 100644 --- a/src/data.c +++ b/src/data.c @@ -3,7 +3,7 @@ const struct mutation symptoms_data[14] = { - {100, 1, 0, 0, 0, "NAUSEE"}, + {1, 1, 0, 2, 0, "NAUSEE"}, {3, 2, 0, 4, 0, "VOMISSEMENT"}, {2, 1, 0, 3, 0, "TOUX"}, {2, 2, 0, 4, 0, "PNEUMONIE"}, -- 2.45.0