Got NPCs working again!

This commit is contained in:
mibi88 2024-07-31 14:38:29 +02:00
parent 6ab37ee4fb
commit 6cfe0ab687
5 changed files with 17 additions and 15 deletions

View file

@ -9,6 +9,7 @@ from tiled import *
VERBOSE = 1 VERBOSE = 1
SIGN_TYPES = ["SGN", "INFO"] SIGN_TYPES = ["SGN", "INFO"]
FACES = ["MALE", "FEMALE", "MILKMAN", "POLICE"] FACES = ["MALE", "FEMALE", "MILKMAN", "POLICE"]
PRECISION = 8
def convert(input, output, params, target): def convert(input, output, params, target):
if params["custom-type"] == "tmx": if params["custom-type"] == "tmx":
@ -211,8 +212,8 @@ def convert_map(input, output, params, target):
map_struct += fxconv.u32(len(npcs)) map_struct += fxconv.u32(len(npcs))
npc_struct = fxconv.Structure() npc_struct = fxconv.Structure()
for i in npcs.values(): for i in npcs.values():
npc_struct += fxconv.u32(i["position"][0]+i["path"][0]) npc_struct += fxconv.u32((i["position"][0]+i["path"][0])<<PRECISION)
npc_struct += fxconv.u32(i["position"][1]+i["path"][1]) npc_struct += fxconv.u32((i["position"][1]+i["path"][1])<<PRECISION)
npc_struct += fxconv.u32(i["position"][0]) npc_struct += fxconv.u32(i["position"][0])
npc_struct += fxconv.u32(i["position"][1]) npc_struct += fxconv.u32(i["position"][1])
npc_struct += fxconv.u16(i["face"]) npc_struct += fxconv.u16(i["face"])

View file

@ -3,6 +3,7 @@
#define USB_FEATURE 0 #define USB_FEATURE 0
#define DEBUGMODE 0 #define DEBUGMODE 0
#define PRECISION 8
#include <gint/display.h> #include <gint/display.h>

View file

@ -30,10 +30,10 @@ void interaction_available(Game *game) {
/* simple distance check along X and Y axis */ /* simple distance check along X and Y axis */
/* Be careful to use world coordinates, not local (i.e.map) ones */ /* Be careful to use world coordinates, not local (i.e.map) ones */
if((abs((int)game->player.wx - if((abs((int)game->player.wx -
(int)game->map_level->npcs[i].curx * PXSIZE) < (int)(game->map_level->npcs[i].curx>>PRECISION) * PXSIZE) <
MAX_INTERACTION_DISTANCE * PXSIZE) && MAX_INTERACTION_DISTANCE * PXSIZE) &&
(abs((int)game->player.wy - (abs((int)game->player.wy -
(int)game->map_level->npcs[i].cury * PXSIZE) < (int)(game->map_level->npcs[i].cury>>PRECISION) * PXSIZE) <
MAX_INTERACTION_DISTANCE * PXSIZE)) { MAX_INTERACTION_DISTANCE * PXSIZE)) {
/* the player can do something */ /* the player can do something */
game->player.canDoSomething = true; game->player.canDoSomething = true;

View file

@ -72,8 +72,8 @@ typedef struct {
typedef struct { typedef struct {
/* current coordinates of the NPC */ /* current coordinates of the NPC */
uint32_t curx; /* Initialize them at runtime */ uint32_t curx;
uint32_t cury; /* Initialize them at runtime */ uint32_t cury;
/* initial coordinates of the NPC (needed to get absolute coordinates of /* initial coordinates of the NPC (needed to get absolute coordinates of
* path) */ * path) */

View file

@ -108,8 +108,8 @@ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) {
int32_t w = full_map->w; int32_t w = full_map->w;
int32_t h = full_map->h; int32_t h = full_map->h;
int32_t x = floor(npc->curx) / T_WIDTH; int32_t x = (npc->curx>>PRECISION) / T_WIDTH;
int32_t y = floor(npc->cury) / T_HEIGHT; int32_t y = (npc->cury>>PRECISION) / T_HEIGHT;
dest_x /= T_WIDTH; dest_x /= T_WIDTH;
dest_y /= T_HEIGHT; dest_y /= T_HEIGHT;
int32_t spos = y * w + x; int32_t spos = y * w + x;
@ -202,7 +202,7 @@ int npc_pathfind(int32_t dest_x, int32_t dest_y, Map *full_map, NPC *npc) {
} }
// Refactoring to make adding complexity cleaner // Refactoring to make adding complexity cleaner
void update_npcs([[maybe_unused]] Game *game) { void update_npcs(Game *game) {
for(uint32_t u = 0; u < game->map_level->nbNPC; u++) { for(uint32_t u = 0; u < game->map_level->nbNPC; u++) {
update_npc(&game->map_level->npcs[u]); update_npc(&game->map_level->npcs[u]);
} }
@ -213,8 +213,8 @@ void update_npc(NPC *npc) {
if(!npc->hasPath || npc->paused == true) if(!npc->hasPath || npc->paused == true)
return; return;
float vecX = (float)(npc->xpath[npc->currentPoint] + npc->x) - npc->curx; float vecX = (float)(npc->xpath[npc->currentPoint] + npc->x) - (npc->curx>>PRECISION);
float vecY = (float)(npc->ypath[npc->currentPoint] + npc->y) - npc->cury; float vecY = (float)(npc->ypath[npc->currentPoint] + npc->y) - (npc->cury>>PRECISION);
float vecN = length(vecX, vecY); float vecN = length(vecX, vecY);
if(vecN > 0.5f) { if(vecN > 0.5f) {
@ -225,8 +225,8 @@ void update_npc(NPC *npc) {
npc->currentPoint = npc->currentPoint % npc->path_length; npc->currentPoint = npc->currentPoint % npc->path_length;
} }
npc->curx += vecX; npc->curx += vecX*(float)(1<<PRECISION);
npc->cury += vecY; npc->cury += vecY*(float)(1<<PRECISION);
} }
void npc_draw(Game *game) { void npc_draw(Game *game) {
@ -265,8 +265,8 @@ void npc_draw(Game *game) {
} }
#endif // DEBUGMODE #endif // DEBUGMODE
int16_t delX = ((int16_t)(Data->curx * PXSIZE)) - (int16_t)pl->wx; int16_t delX = ((int16_t)((Data->curx>>PRECISION) * PXSIZE)) - (int16_t)pl->wx;
int16_t delY = ((int16_t)(Data->cury * PXSIZE)) - (int16_t)pl->wy; int16_t delY = ((int16_t)((Data->cury>>PRECISION) * PXSIZE)) - (int16_t)pl->wy;
bopti_image_t *face = npc_sprites[Data->face]; bopti_image_t *face = npc_sprites[Data->face];
dimage(pl->px - P_WIDTH / 2 + delX, pl->py - P_HEIGHT / 2 + delY, face); dimage(pl->px - P_WIDTH / 2 + delX, pl->py - P_HEIGHT / 2 + delY, face);
} }