From bad46c8c8e7d876c3263fa9b5258754f63a1c59e Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Thu, 4 Nov 2021 18:08:43 +0100 Subject: [PATCH] Continue the project : taxes & funds, statistics and in-game options --- CMakeLists.txt | 3 + assets-fx/calccity.png | Bin 0 -> 19117 bytes assets-fx/fn_keys.png | Bin 0 -> 771 bytes assets-fx/fxconv-metadata.txt | 10 +- src/calccity.c | 1 + src/calccity.h | 21 +-- src/core.c | 164 +++++++++++++++++++-- src/core.h | 7 + src/display.c | 52 +++++-- src/display.h | 7 +- src/main.c | 4 + src/menus.c | 263 ++++++++++++++++++++++++++++++++++ src/menus.h | 16 +++ 13 files changed, 512 insertions(+), 36 deletions(-) create mode 100644 assets-fx/calccity.png create mode 100644 assets-fx/fn_keys.png create mode 100644 src/menus.c create mode 100644 src/menus.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b59d06..9f999b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,14 +13,17 @@ set(SOURCES src/main.c src/core.c src/display.c + src/menus.c ) set(ASSETS) set(ASSETS_fx + assets-fx/calccity.png assets-fx/large_tileset.png assets-fx/large_water.png assets-fx/title.png + assets-fx/fn_keys.png ) set(ASSETS_cg) diff --git a/assets-fx/calccity.png b/assets-fx/calccity.png new file mode 100644 index 0000000000000000000000000000000000000000..a069279a458c595383832ac0b0f8b684133a9eb2 GIT binary patch literal 19117 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 BR|5b5 literal 0 HcmV?d00001 diff --git a/assets-fx/fxconv-metadata.txt b/assets-fx/fxconv-metadata.txt index 74707b1..fc09555 100644 --- a/assets-fx/fxconv-metadata.txt +++ b/assets-fx/fxconv-metadata.txt @@ -1,3 +1,11 @@ *.png: type: bopti-image - name_regex: (.*)\.png img_\1 \ No newline at end of file + name_regex: (.*)\.png img_\1 + +calccity.png: + type: font + name: font_calccity + charset: print + grid.size: 5x6 + grid.padding: 1 + proportional: True \ No newline at end of file diff --git a/src/calccity.c b/src/calccity.c index 510dfd5..0ce9e8c 100644 --- a/src/calccity.c +++ b/src/calccity.c @@ -1,2 +1,3 @@ #include "calccity.h" +static const char tiles_names = {}; \ No newline at end of file diff --git a/src/calccity.h b/src/calccity.h index 7666150..d44884e 100644 --- a/src/calccity.h +++ b/src/calccity.h @@ -3,41 +3,42 @@ #include - struct calccity { // human's statistics = {happyness, health, education, housing, work, food} - signed long humans[6]; + unsigned long humans[6]; // population evolution = {population, birth_rate, death_rate, immigration, emigration} - signed long population[5]; + unsigned long population[5]; // trade statistics = {import, export, production, commercial, industrial, annual_cost} - signed long trade[6]; + unsigned long trade[6]; // production = {water, power} - signed long production[2]; + unsigned long production[2]; // consumption = {water, power} - signed long consumption[2]; + unsigned long consumption[2]; // some others statistics = {treasure, crime, safety, fire_hazard, nuclear_hazard, pollution, transport, grabage, graves} - signed long misc[9]; + unsigned long misc[9]; // taxes in percents on {housing, trade, industry, export} - int taxes[4]; + unsigned int taxes[4]; // fund in percents on {police, fireman, education, heathcare} - int funds[4]; + unsigned int funds[4]; // in-game time int month, year; int blinker; + int tick; // in-game options uint8_t disaster; uint8_t animation; int time_speed; + int menu; }; @@ -57,6 +58,6 @@ struct map }; -#define ENGINE_TICK 1000 +#define ENGINE_TICK 100 #endif /* _CALCCITY_H */ \ No newline at end of file diff --git a/src/core.c b/src/core.c index 81cb056..ad1796d 100644 --- a/src/core.c +++ b/src/core.c @@ -17,14 +17,19 @@ int callback_tick(volatile int *tick) void default_values(struct calccity *calccity, struct camera *camera, struct map *map) { + srand(20211104); + // Initialisation of struct calccity memset(calccity, 0, sizeof *calccity); // Treasure - calccity->misc[0] = 500000; + calccity->misc[0] = 5000; for (int i = 0; i < 4; i++) + { calccity->taxes[i] = 10; + calccity->funds[i] = 100; + } calccity->month = 1; calccity->year = 1900; @@ -32,13 +37,13 @@ void default_values(struct calccity *calccity, struct camera *camera, struct map calccity->disaster = 1; calccity->animation = 1; - calccity->time_speed = 30; + calccity->time_speed = 5100; // Initialisation of struct camera memset(camera, 0, sizeof *camera); - camera->cursor_x = 64; - camera->cursor_y = 32; + camera->cursor_x = 2; + camera->cursor_y = 2; // Initialisation of struct map @@ -49,15 +54,55 @@ void default_values(struct calccity *calccity, struct camera *camera, struct map // Water if ((x * y == 0) || (x == 49 || y == 49)) map->data[y][x] = 139; - - // Shorelines - - // Ground else map->data[y][x] = 48 + rand() % 2; + + // Shorelines + switch (y) + { + case 1: + switch (x) + { + case 1: + map->data[y][x] = 110; + break; + case 48: + map->data[y][x] = 112; + break; + + default: + if (x != 0 && x != 49) map->data[y][x] = 111; + break; + } + break; + + case 48: + switch (x) + { + case 1: + map->data[y][x] = 130; + break; + + case 48: + map->data[y][x] = 132; + break; + + default: + if (x != 0 && x != 49) map->data[y][x] = 131; + break; + } + break; + + default: + if (y != 0 && y != 49) + { + if (x == 1) map->data[y][x] = 120; + if (x == 48) map->data[y][x] = 122; + } + } } } @@ -76,6 +121,27 @@ int rtc_key(void) } +void next_step(struct calccity *calccity) +{ + calccity->tick += ENGINE_TICK; + + // In-game animation + if (calccity->animation && !(calccity->tick % 1000)) + calccity->blinker = (calccity->blinker + 1 ) % 2; + + // In-game time + if (!(calccity->tick % calccity->time_speed)) + { + calccity->month ++; + if (calccity->month > 12) + { + calccity->month = 1; + calccity->year ++; + } + } +} + + void main_loop(struct calccity *calccity, struct camera *camera, struct map *map) { // Timer initialisation @@ -89,12 +155,92 @@ void main_loop(struct calccity *calccity, struct camera *camera, struct map *map while (!end) { - display_map(calccity, camera, map); + // Real-time clock system + while (!tick) sleep(); + tick = 0; + next_step(calccity); + + // Display map + display_large_map(calccity, camera, map); + display_around(calccity, camera); + + // Get and manage input key = rtc_key(); + keyboard_managment(calccity, camera, key); + // Open the menu + switch (calccity->menu) + { + // Tax and funds + case 4: + menu_4(calccity); + break; + + case 5: + menu_5(calccity); + break; + + // Options + case 6: + end = menu_6(calccity); + break; + } + calccity->menu = 0; } // Free timer if (t >= 0) timer_stop(t); +} + + +void keyboard_managment(struct calccity *calccity, struct camera *camera, const int key) +{ + switch (key) + { + case KEY_UP: + if (camera->cursor_y > 0) camera->cursor_y --; + else if (camera->y > 0) camera->y --; + break; + + case KEY_RIGHT: + if (camera->cursor_x < 14) camera->cursor_x ++; + else if (camera->x < 42) camera->x ++; + break; + + case KEY_DOWN: + if (camera->cursor_y < 6) camera->cursor_y ++; + else if (camera->y < 46) camera->y ++; + break; + + case KEY_LEFT: + if (camera->cursor_x > 0) camera->cursor_x --; + else if (camera->x > 0) camera->x --; + break; + + + case KEY_F1: + calccity->menu = 1; + break; + + case KEY_F2: + calccity->menu = 2; + break; + + case KEY_F3: + calccity->menu = 3; + break; + + case KEY_F4: + calccity->menu = 4; + break; + + case KEY_F5: + calccity->menu = 5; + break; + + case KEY_F6: + calccity->menu = 6; + break; + } } \ No newline at end of file diff --git a/src/core.h b/src/core.h index 3289348..408ea95 100644 --- a/src/core.h +++ b/src/core.h @@ -3,6 +3,7 @@ #include "calccity.h" #include "display.h" +#include "menus.h" // callback_tick : time function int callback_tick(volatile int *tick); @@ -13,7 +14,13 @@ void default_values(struct calccity *current_game, struct camera *camera, struct // rtc_key : get a key with RTC system int rtc_key(void); +// next_step : compute in-game time +void next_step(struct calccity *calccity); + // main_loop : game main loop void main_loop(struct calccity *calccity, struct camera *camera, struct map *map); +// keyboard_managment : get the key and manage input +void keyboard_managment(struct calccity *calccity, struct camera *camera, const int key); + #endif /* _CORE_H */ \ No newline at end of file diff --git a/src/display.c b/src/display.c index 260bcdd..a6ef94b 100644 --- a/src/display.c +++ b/src/display.c @@ -15,33 +15,57 @@ void title_screen(void) } -void display_map(struct calccity *calccity, struct camera *camera, struct map *map) +void display_large_map(struct calccity *calccity, struct camera *camera, struct map *map) { extern const bopti_image_t img_large_tileset; extern const bopti_image_t img_large_water; - if (calccity->animation) - calccity->blinker = (calccity->blinker + 1 ) % 2; - else - calccity->blinker = 0; - dclear(C_WHITE); - for (int y = camera->y; y <= camera->y + 3; y++) + + for (int y = 0; y < 4; y++) { - for (int x = camera->x; x <= camera->x + 7; x ++) + for (int x = 0; x < 8; x ++) { + int cam_x = x + camera->x, cam_y = y + camera->y; // Water - if (map->data[y][x] == 139) - dsubimage(x * 15, y * 15, &img_large_water, 15 * calccity->blinker, 0, 15 * (calccity->blinker + 1), 15, DIMAGE_NONE); + if (cam_y > 49 || cam_x > 49 || map->data[cam_y][cam_x] == 139) + dsubimage(3 + x * 15, y * 15, &img_large_water, 15 * calccity->blinker, 0, 15 * (calccity->blinker + 1), 15, DIMAGE_NONE); else { - unsigned tile_id = map->data[y][x]; - unsigned int tile_x = 16 * (tile_id % 10); - unsigned int tile_y = 16 * (tile_id / 10); + unsigned tile_id = map->data[cam_y][cam_x]; + unsigned int tile_x = 15 * (tile_id % 10); + unsigned int tile_y = 15 * (tile_id / 10); - dsubimage(x * 15, y * 15, &img_large_tileset, tile_x, tile_y, 15, 15, DIMAGE_NONE); + dsubimage(3 + x * 15, y * 15, &img_large_tileset, tile_x, tile_y, 15, 15, DIMAGE_NONE); } } } + +} + + +void display_around(struct calccity *calccity, struct camera *camera) +{ + extern const bopti_image_t img_fn_keys; + + // Functions keys + dimage(3, 57, &img_fn_keys); + + // Frame around screen + dline(3, 0, 123, 0, C_BLACK); + dline(3, 56, 123, 56, C_BLACK); + dline(3, 0, 3, 56, C_BLACK); + dline(123, 0, 123, 56, C_BLACK); + + // Date in the top-left corner + dprint_opt(4, 1, C_BLACK, C_WHITE, DTEXT_LEFT, DTEXT_TOP, "%d-%d", calccity->month, calccity->year); + + // Cursor + drect_border(8 * camera->cursor_x + 3, 8 * camera->cursor_y, 8 * camera->cursor_x + 11, 8 * camera->cursor_y + 8, C_WHITE, 1, C_BLACK); + dline(8 * camera->cursor_x + 6, 8 * camera->cursor_y + 4, 8 * camera->cursor_x + 8, 8 * camera->cursor_y + 4, C_BLACK); + dline(8 * camera->cursor_x + 7, 8 * camera->cursor_y + 3, 8 * camera->cursor_x + 7, 8 * camera->cursor_y + 5, C_BLACK); + + dupdate(); } + diff --git a/src/display.h b/src/display.h index 78fa18a..9e4f937 100644 --- a/src/display.h +++ b/src/display.h @@ -6,7 +6,10 @@ // title_screen : display title screen void title_screen(void); -// display_map : display the current state of the map -void display_map(struct calccity *calccity, struct camera *camera, struct map *map); +// display_large_map : display the current state of the large map +void display_large_map(struct calccity *calccity, struct camera *camera, struct map *map); + +// display_around : display the screen frame and cursor +void display_around(struct calccity *calccity, struct camera *camera); #endif /* _DISPLAY_H */ \ No newline at end of file diff --git a/src/main.c b/src/main.c index 9b49904..d2d7a95 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,12 @@ +#include #include "core.h" int main(void) { + extern font_t font_calccity; + dfont(&font_calccity); + title_screen(); // Game initialisation diff --git a/src/menus.c b/src/menus.c new file mode 100644 index 0000000..425c888 --- /dev/null +++ b/src/menus.c @@ -0,0 +1,263 @@ +#include +#include +#include + +#include "menus.h" + + +void menu_5(struct calccity *calccity) +{ + int scroll = 0, key = 0; + int opt = GETKEY_DEFAULT & GETKEY_REP_ARROWS; + int timeout = 0; + + static const char *names[23] = { + "GENERAL", + "ARGENT", + "POPULATION", + "BONHEUR", + "SANTE", + "EDUCATION", + "LOGEMENT", + "TRAVAIL", + "NOURRITURE", + "EAU", + "ENERGIE", + "TRANSPORT", + "DECHETS", + "TOMBES", + "RISQUES", + "CRIME", + "RISQUE INCENDIE", + "RISQUE NUCLEAIRE", + "POLLUTION", + "COMMERCE", + "PRODUCTION", + "IMPORT", + "EXPORT" + }; + + long int values[23] = { + -1, + calccity->misc[0], + calccity->population[0], + calccity->humans[0], + calccity->humans[1], + calccity->humans[2], + calccity->humans[3], + calccity->humans[4], + calccity->humans[5], + calccity->production[0], + calccity->production[1], + calccity->misc[6], + calccity->misc[7], + calccity->misc[8], + -1, + calccity->misc[1], + calccity->misc[3], + calccity->misc[4], + calccity->misc[5], + -1, + calccity->trade[2], + calccity->trade[0], + calccity->trade[1] + }; + + while (key != KEY_ALPHA) + { + dclear(C_WHITE); + + // Title + drect(0, 0, 127, 6, C_BLACK); + dtext(27, 1, C_WHITE, "STATISTIQUES"); + + // Frame + dhline(0, C_BLACK); + dhline(63, C_BLACK); + dvline(0, C_BLACK); + dvline(127, C_BLACK); + + // Scroll bar + dline(5, 6, 5, 63, C_BLACK); + drect(2, scroll + 8, 3, 8 + scroll + 38, C_BLACK); + + for (int i = 0; i < 8; i ++) + { + if (values[i + scroll] < 0) + { + drect(5, 7 + i * 7, 127, 13 + i * 7, C_BLACK); + dtext(12, 8 + i * 7, C_WHITE, names[i + scroll]); + } + else + dprint(7, 8 + i * 7, C_BLACK, "%s %lu", names[i + scroll], values[i + scroll]); + } + + dupdate(); + + key = getkey_opt(opt, &timeout).key; + + switch (key) + { + case KEY_UP: + if (scroll > 0) scroll --; + break; + + case KEY_DOWN: + if (scroll < 15) scroll ++; + break; + } + + } +} + + +void menu_4(struct calccity *calccity) +{ + int choice = 0, key = 0; + int opt = GETKEY_DEFAULT & ~GETKEY_MOD_SHIFT & ~GETKEY_MOD_ALPHA & GETKEY_REP_ARROWS; + int timeout = 0; + + while (key != KEY_ALPHA) + { + dclear(C_WHITE); + drect(0, 0, 127, 6, C_BLACK); + dtext(24, 1, C_WHITE, "TAXES & FONDS"); + + dhline(0, C_BLACK); + dhline(63, C_BLACK); + dvline(0, C_BLACK); + dvline(127, C_BLACK); + + dtext(7, 8, C_BLACK, "TAXE HABITATION"); + dtext(7, 15, C_BLACK, "TAXE COMMERCE"); + dtext(7, 22, C_BLACK, "TAXE INDUSTRIE"); + dtext(7, 29, C_BLACK, "TAXE EXPORT"); + dtext(7, 36, C_BLACK, "FOND POLICE"); + dtext(7, 43, C_BLACK, "FOND POMPIER"); + dtext(7, 50, C_BLACK, "FOND ECOLE"); + dtext(7, 57, C_BLACK, "FOND S.SOCIALE"); + + for (int i = 0; i < 4; i ++) + { + dprint(97, 8 + i * 7, C_BLACK, "%d%%", calccity->taxes[i]); + dprint(97, 36 + i * 7, C_BLACK, "%d%%", calccity->funds[i]); + } + + + dtext(2, 8 + choice * 7, C_BLACK, ">"); + dtext(121, 8 + choice * 7, C_BLACK, "<"); + dupdate(); + + key = getkey_opt(opt, &timeout).key; + switch (key) + { + case KEY_UP: + if (choice > 0) choice --; + break; + + case KEY_DOWN: + if (choice < 7) choice ++; + break; + + case KEY_LEFT: + if (choice < 5 && calccity->taxes[choice] > 0) calccity->taxes[choice] --; + if (choice >= 5 && calccity->funds[choice - 5] > 0) calccity->funds[choice - 5] --; + break; + + case KEY_RIGHT: + if (choice < 5 && calccity->taxes[choice] < 100) calccity->taxes[choice] ++; + if (choice >= 5 && calccity->funds[choice - 5] < 100) calccity->funds[choice - 5] ++; + break; + } + + } +} + + +int menu_6(struct calccity *calccity) +{ + int choice = 0, key = 0; + int opt = GETKEY_DEFAULT & ~GETKEY_MOD_SHIFT & ~GETKEY_MOD_ALPHA & GETKEY_REP_ARROWS; + int timeout = 0; + + while (key != KEY_ALPHA) + { + int prcnt = 100 - (calccity->time_speed * 100 / 10000); + + dclear(C_WHITE); + + drect(0, 0, 127, 6, C_BLACK); + dtext(39, 1, C_WHITE, "OPTIONS"); + + dhline(0, C_BLACK); + dhline(63, C_BLACK); + dvline(0, C_BLACK); + dvline(127, C_BLACK); + + dtext(7, 9, C_BLACK, "ANIMATIONS "); + dtext(7, 16, C_BLACK, "CATASTROPHES"); + dtext(7, 23, C_BLACK, "VITESSE DU JEU"); + dtext(7, 30, C_BLACK, "QUITTER LE JEU"); + dtext(7, 37, C_BLACK, "REPRENDRE"); + + if (calccity->animation) + dtext(85, 9, C_BLACK, "on"); + else + dtext(85, 9, C_BLACK, "off"); + + if (calccity->disaster) + dtext(85, 16, C_BLACK, "on"); + else + dtext(85, 16, C_BLACK, "off"); + + dprint(97, 23, C_BLACK, "%d%%", prcnt + 1); + + + dtext(2, 9 + choice * 7, C_BLACK, ">"); + dtext(121, 9 + choice * 7, C_BLACK, "<"); + dupdate(); + + key = getkey_opt(opt, &timeout).key; + + switch (key) + { + case KEY_UP: + if (choice > 0) choice --; + break; + + case KEY_DOWN: + if (choice < 4) choice ++; + break; + + case KEY_SHIFT: + switch (choice) + { + case 0: + calccity->animation = (calccity->animation + 1) % 2; + break; + + case 1: + calccity->disaster = (calccity->disaster + 1) % 2; + break; + + case 3: + return 1; + break; + + case 4: + return 0; + + } + break; + + case KEY_LEFT: + if (choice == 2 && calccity->time_speed < 10000) calccity->time_speed += 100; + break; + + case KEY_RIGHT: + if (choice == 2 && calccity->time_speed > 100) calccity->time_speed -= 100; + break; + } + } + return 0; +} diff --git a/src/menus.h b/src/menus.h new file mode 100644 index 0000000..d1d3caa --- /dev/null +++ b/src/menus.h @@ -0,0 +1,16 @@ +#ifndef _MENUS_H +#define _MENUS_H + +#include "calccity.h" + + +// menu_4 : tax and funds +void menu_4(struct calccity *calccity); + +// menu_5 : informations +void menu_5(struct calccity *calccity); + +// menu_6 : options +int menu_6(struct calccity *calccity); + +#endif /* _MENUS_H */ \ No newline at end of file