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

View file

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

View file

@ -30,10 +30,10 @@ void interaction_available(Game *game) {
/* simple distance check along X and Y axis */
/* Be careful to use world coordinates, not local (i.e.map) ones */
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) &&
(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)) {
/* the player can do something */
game->player.canDoSomething = true;

View file

@ -72,8 +72,8 @@ typedef struct {
typedef struct {
/* current coordinates of the NPC */
uint32_t curx; /* Initialize them at runtime */
uint32_t cury; /* Initialize them at runtime */
uint32_t curx;
uint32_t cury;
/* initial coordinates of the NPC (needed to get absolute coordinates of
* 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 h = full_map->h;
int32_t x = floor(npc->curx) / T_WIDTH;
int32_t y = floor(npc->cury) / T_HEIGHT;
int32_t x = (npc->curx>>PRECISION) / T_WIDTH;
int32_t y = (npc->cury>>PRECISION) / T_HEIGHT;
dest_x /= T_WIDTH;
dest_y /= T_HEIGHT;
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
void update_npcs([[maybe_unused]] Game *game) {
void update_npcs(Game *game) {
for(uint32_t u = 0; u < game->map_level->nbNPC; u++) {
update_npc(&game->map_level->npcs[u]);
}
@ -213,8 +213,8 @@ void update_npc(NPC *npc) {
if(!npc->hasPath || npc->paused == true)
return;
float vecX = (float)(npc->xpath[npc->currentPoint] + npc->x) - npc->curx;
float vecY = (float)(npc->ypath[npc->currentPoint] + npc->y) - npc->cury;
float vecX = (float)(npc->xpath[npc->currentPoint] + npc->x) - (npc->curx>>PRECISION);
float vecY = (float)(npc->ypath[npc->currentPoint] + npc->y) - (npc->cury>>PRECISION);
float vecN = length(vecX, vecY);
if(vecN > 0.5f) {
@ -225,8 +225,8 @@ void update_npc(NPC *npc) {
npc->currentPoint = npc->currentPoint % npc->path_length;
}
npc->curx += vecX;
npc->cury += vecY;
npc->curx += vecX*(float)(1<<PRECISION);
npc->cury += vecY*(float)(1<<PRECISION);
}
void npc_draw(Game *game) {
@ -265,8 +265,8 @@ void npc_draw(Game *game) {
}
#endif // DEBUGMODE
int16_t delX = ((int16_t)(Data->curx * PXSIZE)) - (int16_t)pl->wx;
int16_t delY = ((int16_t)(Data->cury * PXSIZE)) - (int16_t)pl->wy;
int16_t delX = ((int16_t)((Data->curx>>PRECISION) * PXSIZE)) - (int16_t)pl->wx;
int16_t delY = ((int16_t)((Data->cury>>PRECISION) * PXSIZE)) - (int16_t)pl->wy;
bopti_image_t *face = npc_sprites[Data->face];
dimage(pl->px - P_WIDTH / 2 + delX, pl->py - P_HEIGHT / 2 + delY, face);
}