From ab44eac4ee46d631dcbacba29bc161f7bd389ef5 Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Sat, 19 Apr 2025 00:02:03 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9parationement=20des=20probl=C3=A8mes=20d?= =?UTF-8?q?e=20m=C3=A9moire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 2 +- src/config.h | 6 +++++- src/draw.c | 10 ++++++++-- src/game.c | 22 +++++++++++++++++++++- src/game.h | 3 +++ src/lua_inter.c | 10 +++++++++- src/main.c | 39 +++++++++++++++++++++++++++++++++++++-- src/map.c | 4 +++- src/types.h | 3 ++- src/ui.c | 44 +++++++++++++++++++++++++++++++++++++++++--- src/ui.h | 2 ++ 12 files changed, 133 insertions(+), 13 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 src/game.c diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 5240460..f7b72e9 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ raylib/ *.tiled-session map/maps_out.c map/converter +log.txt diff --git a/Makefile b/Makefile index 3edeec2..2bbe7d2 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ OUTNAME = mtycoon -CFLAGS = -O2 -Wall -Wextra -g -I./raylib/include -I./lua/include -pipe +CFLAGS = -O0 -Wall -Wextra -g -I./raylib/include -I./lua/include -pipe CC = gcc diff --git a/src/config.h b/src/config.h index 267cb80..846819f 100644 --- a/src/config.h +++ b/src/config.h @@ -2,7 +2,11 @@ #define VERSION_MAJ 0 #define VERSION_MIN 1 -#define VERSION_PATCH 3 +#define VERSION_PATCH 4 + +#define DEBUG 1 + +#define LOG_PATH "log.txt" // Set in ui.c extern char *VERSION_STR; diff --git a/src/draw.c b/src/draw.c index 7cc57a6..4c7ff71 100644 --- a/src/draw.c +++ b/src/draw.c @@ -39,17 +39,23 @@ Image tile_index[TILE_N]; extern GUIInfo gui_info; int init_draw(){ + char tmpbuf[4096]; InitWindow(1280, 720, "Mineur Tycoon"); SetTargetFPS(60); + char *cwd = GetApplicationDirectory(); + puts(cwd); + for(int i = 0; i < TEX_N; i++){ - tex_index[i] = LoadTexture(tex_files[i]); + snprintf(tmpbuf, 4096, "%s%s", cwd, tex_files[i]); + tex_index[i] = LoadTexture(tmpbuf); GenTextureMipmaps(&tex_index[i]); } for(int i = 0; i < TILE_N; i++){ - tile_index[i] = LoadImage(tile_files[i]); + snprintf(tmpbuf, 4096, "%s%s", cwd, tile_files[i]); + tile_index[i] = LoadImage(tmpbuf); ImageFormat(&tile_index[i], 4); } diff --git a/src/game.c b/src/game.c old mode 100644 new mode 100755 index fb27e54..f93cdfd --- a/src/game.c +++ b/src/game.c @@ -8,6 +8,7 @@ #include #include +#include "config.h" #include "types.h" #include "map.h" #include "game.h" @@ -19,6 +20,16 @@ MachineDef machine_dict[] = { {{{0,0},{32,0},{0,32},{32,32}}, {R_Coal, R_Iron}, 2, R_Steel, 0}, // MT_Furnace }; +char *worker_names[] = { + "Bob", + "Jill", + "Frank", + "Michel", + "Sophie" +}; + +_Static_assert(sizeof(worker_names)/sizeof(void*) >= WORKER_NAMES); + int init_machines(Machines *machines){ machines->machine_n = 0; machines->machine_id = 0; @@ -52,7 +63,7 @@ int init_game(Game *game){ game->camera = (Camera2D){.offset = {0, 0}, .zoom = 1}; int err = init_machines(&game->machines); - err |= init_workers(&game->workers); + err |= init_workers(&game->workers); if(err){ printf("Failed to init game. Error : %x\n", err); return 1; @@ -64,18 +75,26 @@ int init_game(Game *game){ for(int j = 0; j < 16; j++){ Machine *coal_mine = add_machine(&game->machines, (V2d){k*250+40,j*400+40}); coal_mine->type = MT_CoalMine; + int coal_id = coal_mine->id; Machine *iron_mine = add_machine(&game->machines, (V2d){k*250+40,j*400+240}); iron_mine->type = MT_IronMine; + int iron_id = iron_mine->id; Machine *furnace = add_machine(&game->machines, (V2d){k*250+140,j*400+140}); furnace->type = MT_Furnace; + // The adresses may have changed + coal_mine = get_machine_from_id(&game->machines, coal_id); + iron_mine = get_machine_from_id(&game->machines, coal_id); + for(int i = 0; i < 10; i++) add_worker(&game->workers, (V2d){.x=k*250+100,.y=j*400}); for(int i = 0; i < 4; i++) assign_worker_machine(coal_mine, &game->workers.worker_stack[c_worker++]); for(int i = 4; i < 8; i++) assign_worker_machine(iron_mine, &game->workers.worker_stack[c_worker++]); + game->workers.worker_stack[c_worker].satisf = rand() & 63; assign_worker_fetch(iron_mine, furnace, &game->workers.worker_stack[c_worker++]); + game->workers.worker_stack[c_worker].satisf = rand() & 63; assign_worker_fetch(coal_mine, furnace, &game->workers.worker_stack[c_worker++]); if(!(furnace->id%1000)) printf("%d\n",furnace->id); @@ -113,6 +132,7 @@ Worker *add_worker(Workers *workers, V2d pos){ Worker *work = &workers->worker_stack[workers->worker_n++]; work->pos = pos; + work->name = rand()%WORKER_NAMES; work->ai = (AiInternal){S_Idle, 0, 0, 0, MACH_NULL, MACH_NULL, {.x=0,.y=0}}; return work; diff --git a/src/game.h b/src/game.h index ab7aff3..5df4596 100644 --- a/src/game.h +++ b/src/game.h @@ -20,7 +20,10 @@ #define TPS_TIME (1.0/TPS) +#define WORKER_NAMES 5 + extern MachineDef machine_dict[]; +extern char *worker_names[]; int init_game(Game *game); diff --git a/src/lua_inter.c b/src/lua_inter.c index c85b0d7..820b035 100644 --- a/src/lua_inter.c +++ b/src/lua_inter.c @@ -305,11 +305,17 @@ void lua_mt_init(lua_State *L){ } void script_init(Game *game){ + char tmpbuf[4096]; gl_game = game; - FilePathList scripts = LoadDirectoryFilesEx("script",".lua",true); + + char *cwd = GetApplicationDirectory(); + snprintf(tmpbuf, 4096, "%sscript", cwd); + FilePathList scripts = LoadDirectoryFilesEx(tmpbuf,".lua",true); + lstate_n = scripts.count; lstates = malloc(sizeof(void*)*lstate_n); if(!lstates){ + puts("Fail 318"); return; } for(int i = 0; i < scripts.count; i++){ @@ -320,7 +326,9 @@ void script_init(Game *game){ int ret = luaL_dofile(lstates[i], scripts.paths[i]); if(ret) puts(lua_tostring(lstates[i], -1)); + MemFree(scripts.paths[i]); } + MemFree(scripts.paths); } void script_clean(){ diff --git a/src/main.c b/src/main.c index 94fb078..5727f71 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include #include +#include "config.h" #include "types.h" #include "game.h" #include "map.h" @@ -22,11 +23,45 @@ * map : * - Textures : ~ * - Affichage : -* - convertisseur : */ +#if DEBUG +FILE *log_file; + +char *log_levels[] = { + "???", + "TRACE", + "DEBUG", + "INFO", + "WARNING", + "ERROR", + "FATAL", + "!!!" +}; + +void log_callback(int logLevel, const char *text, va_list args){ + char tmpbuf[1024*16]; + snprintf(tmpbuf, 1024*16, "%s : %s\n", log_levels[logLevel], text); + vfprintf(log_file, tmpbuf, args); +} + +int init_log_file(){ + char tmpbuf[4096]; + snprintf(tmpbuf, 4096, "%s%s", GetApplicationDirectory(), LOG_PATH); + log_file = fopen(tmpbuf, "w"); + if(!log_file) + return 1; + SetTraceLogCallback(log_callback); + return 0; +} +#endif + int init(Game *game){ - int err = init_draw(); + int err; +#if DEBUG + err = init_log_file(); +#endif + err |= init_draw(); err |= init_game(game); init_ui(); script_init(game); diff --git a/src/map.c b/src/map.c index dba4539..11fd919 100644 --- a/src/map.c +++ b/src/map.c @@ -21,6 +21,8 @@ int generate_coll(Game *game, int mapn){ memcpy(lmap->coll, map->layers[1], map->width*map->height); for(int i = 0; i < mach->machine_n; i++){ V2d pos = mach->machine_stack[i].pos; + pos.x /= 32; + pos.y /= 32; lmap->coll[(int)(pos.y * lmap->width + pos.x)] = 1; lmap->coll[(int)(pos.y * lmap->width + pos.x+1)] = 1; lmap->coll[(int)((pos.y+1) * lmap->width + pos.x)] = 1; @@ -35,7 +37,7 @@ int load_map(Game *game, int mapn){ nmap->maptex = mkmap_tex(map); nmap->width = map->width; nmap->height = map->height; - nmap->coll = realloc(nmap->coll, map->width*map->height); + nmap->coll = malloc(map->width*map->height); if(!nmap->coll) return 1; if(generate_coll(game, mapn)) diff --git a/src/types.h b/src/types.h index 051990a..813acb9 100644 --- a/src/types.h +++ b/src/types.h @@ -60,7 +60,8 @@ typedef struct { uint assign_n : 2; // To offset on machines uint satisf : 6; uint8_t fatigue; - uint8_t __padding[3]; + uint8_t name; + uint8_t __padding[2]; } Worker; diff --git a/src/ui.c b/src/ui.c index dbbbf66..f36f834 100644 --- a/src/ui.c +++ b/src/ui.c @@ -27,6 +27,20 @@ void draw_text_centered(char *str, int y, int font_size, Color color){ DrawText(str, 640-width/2, y, font_size, color); } +void draw_print(int x, int y, int font_size, Color color, char *fmt, ...){ + char tmpbuf[2048]; + + va_list vlist; + + va_start(vlist, fmt); + + vsnprintf(tmpbuf, 2048, fmt, vlist); + + va_end(vlist); + + DrawText(tmpbuf, x, y, font_size, color); +} + void draw_buttons(Widget *widget){ for(int i = 0; i < widget->button_n; i++){ Button *butt = &widget->buttons[i]; @@ -188,6 +202,16 @@ Widget pause_menu = { void worker_widget_draw(Widget *widget, Game *game){ DrawRectangleRounded(widget->box, 0.1, 3, color_main_brown); + + draw_buttons(widget); + + Worker *work = gui_info.widg_target; + draw_print(205, 100, 17, BLACK, "Name : %s", worker_names[work->name]); + draw_print(205, 120, 17, BLACK, "Traits : TODO"); + draw_print(205, 140, 17, BLACK, "Satisfaction : %.0f%%", + (float)work->satisf/64.0f*100.0f); + draw_print(205, 160, 17, BLACK, "Fatigue : %.0f%%", + (float)work->fatigue/256.0f*100.0f); } void worker_widget_do_event(Widget *widget, Game *game, MTEvent event){ @@ -196,14 +220,27 @@ void worker_widget_do_event(Widget *widget, Game *game, MTEvent event){ } Widget worker_widget = { - .box = {.x = 40, .y = 40, .width = 300, .height = 600}, + .box = {.x = 40, .y = 40, .width = 350, .height = 600}, .draw = worker_widget_draw, .do_event = worker_widget_do_event, .capt_flags = CF_Mouse, .buttons = { - + {.box = {350,50,30,30}, + .color_0 = RED, + .color_1 = BLACK, + .color_txt = BLACK, + .txt = "X", + .handler = NULL + }, + {.box = {55,90,140,140}, + .color_0 = GRAY, + .color_1 = BLACK, + .color_txt = WHITE, + .txt = "", + .handler = NULL + }, }, - .button_n = 0 + .button_n = 2 }; Widget machine_widget = { @@ -306,6 +343,7 @@ void try_interface(Game *game, V2d pos){ printf("found worker\n"); gui_info.widget_active[2] = true; + gui_info.widg_target = work; return; } diff --git a/src/ui.h b/src/ui.h index a8da8bd..0d459d4 100644 --- a/src/ui.h +++ b/src/ui.h @@ -72,6 +72,8 @@ typedef struct { Widget *widgets[WIDGET_N]; bool widget_active[WIDGET_N]; + void *widg_target; + float *zoom; } GUIInfo;