mirror of
https://git.planet-casio.com/Slyvtt/Collab_RPG.git
synced 2024-12-28 04:23:42 +01:00
Got NPCs working again!
This commit is contained in:
parent
6ab37ee4fb
commit
6cfe0ab687
5 changed files with 17 additions and 15 deletions
|
@ -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"])
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
18
src/npc.c
18
src/npc.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue