From 77d3cc9c9b4b3d583bfe4ff874034a675823299b Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Thu, 1 Aug 2024 23:33:05 +0200 Subject: [PATCH] Revert "npc : Debug, crash pre-main" This reverts commit 0d8b5225437b80a5da22d1eed3dbcb3597fd07d1. --- src/config.h | 2 +- src/game.c | 5 +-- src/npc.c | 97 +++++++++++++--------------------------------------- src/npc.h | 7 ++-- 4 files changed, 27 insertions(+), 84 deletions(-) diff --git a/src/config.h b/src/config.h index b6a5bdc..8410f3a 100644 --- a/src/config.h +++ b/src/config.h @@ -2,7 +2,7 @@ #define CONFIG_H #define USB_FEATURE 0 -#define DEBUGMODE 1 +#define DEBUGMODE 0 #define PRECISION 8 #include diff --git a/src/game.c b/src/game.c index 99dd091..36e86b3 100644 --- a/src/game.c +++ b/src/game.c @@ -2,8 +2,8 @@ #include "config.h" #include "map.h" -#include "mapdata.h" #include "npc.h" +#include "mapdata.h" #include #include @@ -204,9 +204,6 @@ void game_get_inputs(Game *game) { mynpc->face = 0; mynpc->paused = 0; mynpc->has_dialog = 0; - mynpc->xpath = NULL; - mynpc->ypath = NULL; - npc_alloc_path(mynpc); } } diff --git a/src/npc.c b/src/npc.c index cfaf665..b9cf88e 100644 --- a/src/npc.c +++ b/src/npc.c @@ -6,7 +6,6 @@ #include "map.h" #include -#include #include /*debug*/ #include #include @@ -30,11 +29,6 @@ NPC *npc_create() { void npc_remove(NPC *npc) { uint32_t pos = (uint32_t)npc - (uint32_t)npc_stack; - /*if(npc->xpath) - free(npc->xpath); - if(npc->ypath) - free(npc->ypath);*/ - if(pos == npc_count) { npc_count--; return; @@ -46,14 +40,12 @@ void npc_remove(NPC *npc) { float length(float x, float y) { return sqrtf(x * x + y * y); } -int npc_alloc_path(NPC *npc) { - npc_clear_path(npc); - - /*if(npc->xpath) - free(npc->xpath); - if(npc->ypath) - free(npc->ypath);*/ - +int npc_clear_path(NPC *npc) { + npc->currentPoint = 0; + npc->hasPath = 0; + npc->path_length = 0; + free(npc->xpath); + free(npc->ypath); npc->xpath = malloc(4); npc->ypath = malloc(4); if(npc->xpath == NULL || npc->ypath == NULL) @@ -61,27 +53,9 @@ int npc_alloc_path(NPC *npc) { return 0; } -int npc_clear_path(NPC *npc) { - npc->currentPoint = 0; - npc->hasPath = 0; - - if(npc->xpath == NULL || npc->ypath == NULL) { - npc->path_length = 0; - return 1; - } - memset(npc->xpath, 0, npc->path_length * sizeof(uint16_t)); - memset(npc->ypath, 0, npc->path_length * sizeof(uint16_t)); - - npc->path_length = 0; - - return 0; -} - int npc_append_path(uint16_t x, uint16_t y, NPC *npc) { - npc->xpath = realloc(npc->xpath, npc->path_length * sizeof(uint16_t) + - sizeof(uint16_t)); - npc->ypath = realloc(npc->ypath, npc->path_length * sizeof(uint16_t) + - sizeof(uint16_t)); + npc->xpath = realloc(npc->xpath, npc->path_length * 2 + 2); + npc->ypath = realloc(npc->ypath, npc->path_length * 2 + 2); if(npc->xpath == NULL || npc->ypath == NULL) return 1; npc->xpath[npc->path_length] = x - npc->x; @@ -98,7 +72,7 @@ void as_clean(uint8_t *visited, uint8_t *gscore, uint8_t *fscore) { // TODO : Fix int as_reconstruct_path(int16_t *came_from, int w, int h, int16_t spos, - int16_t dest, NPC *npc, bool is_alloc) { + int16_t dest, NPC *npc) { if(npc_clear_path(npc)) goto as_recons_fail; @@ -133,8 +107,7 @@ int as_reconstruct_path(int16_t *came_from, int w, int h, int16_t spos, npc->ypath[npc->path_length - i - 1] = ty; } - if(is_alloc) - free(came_from); + free(came_from); npc->hasPath = true; @@ -142,14 +115,11 @@ int as_reconstruct_path(int16_t *came_from, int w, int h, int16_t spos, as_recons_fail: - if(is_alloc) - free(came_from); + free(came_from); return 1; } -uint32_t xyram = 0xe500e000 + 32; - /* Custom a* implemetation * Unoptimized, may become an issue */ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) { @@ -172,39 +142,23 @@ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) { if(map[dest_y * w + dest_x]) return 2; - uint8_t *visited, *gscore, *fscore; - int16_t *came_from; - bool is_alloc; - - /*if we can, take advantage of the on-chip memory*/ - if(isSH3() || w * h * 5 > 1024 * 15) { - is_alloc = true; - visited = malloc(w * h); - came_from = malloc(w * h * 2); - gscore = malloc(w * h * 2); - fscore = malloc(w * h * 2); - /*If the buffers won't fit on xyram and we are on fx, alloc will likely - * fail*/ - if(!visited || !came_from || !gscore || !fscore) - return 1; - } else { - is_alloc = false; - visited = (void *)xyram; - came_from = (void *)(xyram + w * h * sizeof(uint16_t)); - gscore = (void *)(xyram + 3 * (w * h)); - fscore = (void *)(xyram + 4 * (w * h)); - } - npc_clear_path(npc); + uint8_t *visited = malloc(w * h); for(i = 0; i < w * h; i++) visited[i] = 1; visited[spos] = 0; + + int16_t *came_from = malloc(w * h * 2); for(i = 0; i < w * h; i++) came_from[i] = -1; + + uint8_t *gscore = malloc(w * h * 2); for(i = 0; i < w * h; i++) gscore[i] = 255; gscore[spos] = 0; + + uint8_t *fscore = malloc(w * h * 2); for(i = 0; i < w * h; i++) fscore[i] = 255; fscore[spos] = length(dest_x - x, dest_y - y); @@ -229,10 +183,9 @@ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) { bscore = fscore[i]; } if(bx == dest_x && by == dest_y) { - if(is_alloc) - as_clean(visited, gscore, fscore); - return 0; /*as_reconstruct_path(came_from, w, h, spos, - dest_y * w + dest_x, npc, is_alloc);*/ + as_clean(visited, gscore, fscore); + return as_reconstruct_path(came_from, w, h, spos, + dest_y * w + dest_x, npc); } visited[by * w + bx] = 1; @@ -262,11 +215,9 @@ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) { } } - if(is_alloc){ - as_clean(visited, gscore, fscore); - free(came_from); - } + as_clean(visited, gscore, fscore); + free(came_from); return 3; } @@ -278,8 +229,6 @@ void update_npcs(Game *game) { } for(i = 0; i < npc_count; i++) { update_npc(&npc_stack[i]); - npc_pathfind(game->player.x, game->player.y, game->map_level, - &npc_stack[i]); } } diff --git a/src/npc.h b/src/npc.h index 4b0192e..8c7f83e 100644 --- a/src/npc.h +++ b/src/npc.h @@ -28,12 +28,9 @@ NPC *npc_create(); * Consider this as a free */ void npc_remove(NPC *npc); -/*Sets the adequate variables of npc so that it's path is cleared*/ -int npc_clear_path(NPC *npc); - -/* Tries to free then malloc()s a new path to npc +/* Frees then malloc()s a new path to npc * Useful if you want to safely edit a path */ -int npc_alloc_path(NPC *npc); +int npc_clear_path(NPC *npc); /* Adds point x,y to the path of npc * Won't work on static NPCs, use npc_clear_path before or make them on the