Still tentatively sort of working maze

This commit is contained in:
Carlos Sanchez 2024-08-18 05:32:28 -04:00
parent 67cbfb0329
commit 21894acdb0
2 changed files with 60 additions and 34 deletions

View File

@ -40,23 +40,24 @@ typedef struct {
// mt->pos = (*oi)->pos;
// }
// Move camera position into moveto
static void sys_ecs_camera_moveto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt camid,
hecs_cidt mtid) {
// eprintf("Camera moveto %ld, %ld\n", camid, mtid);
ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
// eprintf("Camera moveto END\n");
mt->pos = (*cam)->pos;
}
static void sys_ecs_camera_rotateto(haloo_ecs *ecs, hecs_eidt id,
hecs_cidt camid, hecs_cidt rtid) {
ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
rt->rot.x = (*cam)->yaw;
rt->rot.y = (*cam)->pitch;
}
// // Move camera position into moveto
// static void sys_ecs_camera_moveto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt
// camid,
// hecs_cidt mtid) {
// // eprintf("Camera moveto %ld, %ld\n", camid, mtid);
// ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
// // eprintf("Camera moveto END\n");
// mt->pos = (*cam)->pos;
// }
//
// static void sys_ecs_camera_rotateto(haloo_ecs *ecs, hecs_eidt id,
// hecs_cidt camid, hecs_cidt rtid) {
// ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
// ecs_camera *cam = HECS_ENTITYCOMPONENT(ecs_camera *, id, camid, ecs);
// rt->rot.x = (*cam)->yaw;
// rt->rot.y = (*cam)->pitch;
// }
static void sys_ecs_moveto(haloo_ecs *ecs, hecs_eidt id, hecs_cidt mtid) {
ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);

59
maze.c
View File

@ -18,10 +18,10 @@
// INteresting flags for performance comparisons
#define FASTFILL
#define WIDTH 320
#define HEIGHT 200
#define WIDTH 480
#define HEIGHT 300
#define ASPECT ((float)WIDTH / HEIGHT)
#define SCREENSCALE 3
#define SCREENSCALE 2
#define SWIDTH (WIDTH * SCREENSCALE)
#define SHEIGHT (HEIGHT * SCREENSCALE)
#define NEARCLIP 0.01
@ -31,7 +31,7 @@
// Game options
#define MAZESIZE 15
#define HSCALE 1.0
#define HSCALE 1.5
// Maze grows in the positive direction
#define MAZENORTH 1
@ -99,8 +99,8 @@ int maze_visited(uint8_t *maze, int x, int y, int size) {
}
int maze_connected(uint8_t *maze, int x, int y, int size, uint8_t move) {
eprintf("CHECKING DIR %d at (%d,%d), it is %d\n", move, x, y,
maze[x + y * size]);
// eprintf("CHECKING DIR %d at (%d,%d), it is %d\n", move, x, y,
// maze[x + y * size]);
if (move == DIREAST) {
return (maze[x + y * size] & MAZEEAST) == 0;
} else if (move == DIRWEST) {
@ -131,7 +131,6 @@ void maze_generate(uint8_t *maze, int size) {
int mazetop = 0;
STACKPUSH(mazestack, mazetop, x + y * size);
maze[x + y * size] |= MAZEVISIT;
// struct vec2i visitable[4];
uint8_t visitable[4];
int visittop = 0;
@ -208,9 +207,25 @@ static void sys_ecs_smartai(haloo_ecs *ecs, hecs_eidt id, hecs_cidt said,
ecs_maze *maze = HECS_ENTITYCOMPONENT(ecs_maze *, id, mzid, ecs);
ecs_moveto *mt = HECS_ENTITYCOMPONENT(ecs_moveto *, id, mtid, ecs);
ecs_rotateto *rt = HECS_ENTITYCOMPONENT(ecs_rotateto *, id, rtid, ecs);
// Player can only move if the previous timer expired
// if (mt->timer == 0) {
// // Player can only move forward if they can't turn right
// uint8_t rightdir = TURNRIGHT(maze->dir);
// if (!maze_connected(maze->maze, maze->pos.x, maze->pos.y, maze->size,
// rightdir)) {
// struct vec2i movement = dirtovec(maze->dir);
// maze->pos.x += movement.x;
// maze->pos.y += movement.y;
// mt->timer = fps / 2;
// mt->dst.x += HSCALE * movement.x;
// mt->dst.z += HSCALE * movement.y;
// // smartai->state = 0; // We are no longer stuck, you can turn right
// }
// }
// At this point,
if (mt->timer == 0) { // && rt->timer == 0) {
eprintf("SMARTAI: %d DIR: %d POS: (%f, %f)\n", smartai->state, maze->dir,
mt->pos.x, mt->pos.z);
// eprintf("SMARTAI: %d DIR: %d POS: (%f, %f)\n", smartai->state, maze->dir,
// mt->pos.x, mt->pos.z);
// We can only do things if we're not moving and not rotating
// First, we see if we can turn right. If so, go for it.
uint8_t newdir = TURNRIGHT(maze->dir);
@ -230,7 +245,7 @@ static void sys_ecs_smartai(haloo_ecs *ecs, hecs_eidt id, hecs_cidt said,
// begin an animation to move there. Otherwise, turn left
if (!maze_connected(maze->maze, maze->pos.x, maze->pos.y, maze->size,
maze->dir)) {
if (rt->timer == 0) {
if (rt->timer <= 0) {
rt->dstrot.x = rt->rot.x - MPI_2;
rt->timer = fps / 2;
maze->dir = TURNLEFT(maze->dir);
@ -243,8 +258,8 @@ static void sys_ecs_smartai(haloo_ecs *ecs, hecs_eidt id, hecs_cidt said,
maze->pos.x += movement.x;
maze->pos.y += movement.y;
mt->timer = fps / 2;
mt->dst.x += movement.x;
mt->dst.z += movement.y;
mt->dst.x += HSCALE * movement.x;
mt->dst.z += HSCALE * movement.y;
smartai->state = 0; // We are no longer stuck, you can turn right
}
}
@ -312,7 +327,7 @@ int main() { // int argc, char **argv) {
uint16_t wallcols[] = {0xFA22};
haloo3d_apply_alternating(wallt, wallcols, 1);
haloo3d_apply_noise(wallt, NULL, 1.0 / 8);
haloo3d_apply_brick(wallt, 16, 11, 0xFEEE);
haloo3d_apply_brick(wallt, 18, 13, 0xFEEE);
// haloo3d_apply_brick(wallt, 14, 8, 0xFD94);
haloo3d_apply_noise(wallt, NULL, 1.0 / 8);
eprintf("Initialized models and textures\n");
@ -337,6 +352,12 @@ int main() { // int argc, char **argv) {
vec3(floori->scale.v, HSCALE, 1, HSCALE);
vec3(ceili->scale.v, HSCALE, 1, HSCALE);
vec3(walli->scale.v, HSCALE, 1, HSCALE);
floori->pos.x += MAZESIZE / 2.0 * HSCALE;
floori->pos.z += MAZESIZE / 2.0 * HSCALE;
ceili->pos.x += MAZESIZE / 2.0 * HSCALE;
ceili->pos.z += MAZESIZE / 2.0 * HSCALE;
walli->pos.x += MAZESIZE / 2.0 * HSCALE;
walli->pos.z += MAZESIZE / 2.0 * HSCALE;
// vec3(walli->scale.v, HSCALE, 0, HSCALE);
ceili->pos.y = 1; //-1;
eprintf("Setup all object instances\n");
@ -382,7 +403,10 @@ int main() { // int argc, char **argv) {
// This is VERY critical: the player start is at 0 0 but in the maze that's
// the center of the maze! This should probably be fixed or something!
struct vec2i playerstart = {.x = MAZESIZE / 2, .y = MAZESIZE / 2};
render.camera.pos.x = 0.5 * HSCALE;
render.camera.pos.z = 0.5 * HSCALE;
struct vec2i playerstart = {.x = 0,
.y = 0}; // MAZESIZE / 2, .y = MAZESIZE / 2};
struct vec2 playerrotation = {.x = render.camera.yaw,
.y = render.camera.pitch};
HECS_SETCOMPONENT(ecs_moveto, &ecs, playerid){
@ -435,9 +459,10 @@ int main() { // int argc, char **argv) {
// eprintf("CHECKING EID %d\n", i);
// HECS_RUNSYS(&ecs, i, sys_ecs_objin_moveto, ecs_objin_id,
// ecs_moveto_id);
HECS_RUNSYS(&ecs, i, sys_ecs_camera_rotateto, ecs_camera_id,
ecs_rotateto_id);
HECS_RUNSYS(&ecs, i, sys_ecs_camera_moveto, ecs_camera_id, ecs_moveto_id);
// HECS_RUNSYS(&ecs, i, sys_ecs_camera_rotateto, ecs_camera_id,
// ecs_rotateto_id);
// HECS_RUNSYS(&ecs, i, sys_ecs_camera_moveto, ecs_camera_id,
// ecs_moveto_id);
HECS_RUNSYS(&ecs, i, sys_ecs_smartai, ecs_smartai_id, ecs_maze_id,
ecs_moveto_id, ecs_rotateto_id);
HECS_RUNSYS(&ecs, i, sys_ecs_moveto, ecs_moveto_id);