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
|
||||
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"])
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#define USB_FEATURE 0
|
||||
#define DEBUGMODE 0
|
||||
#define PRECISION 8
|
||||
|
||||
#include <gint/display.h>
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) */
|
||||
|
|
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 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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue