diff --git a/cart.bin b/cart.bin index a7e9658..b0683dd 100755 --- a/cart.bin +++ b/cart.bin Binary files differ diff --git a/cart.bin b/cart.bin index a7e9658..b0683dd 100755 --- a/cart.bin +++ b/cart.bin Binary files differ diff --git a/cart/test/game.bin b/cart/test/game.bin index 7b91a31..8094454 100755 --- a/cart/test/game.bin +++ b/cart/test/game.bin Binary files differ diff --git a/cart.bin b/cart.bin index a7e9658..b0683dd 100755 --- a/cart.bin +++ b/cart.bin Binary files differ diff --git a/cart/test/game.bin b/cart/test/game.bin index 7b91a31..8094454 100755 --- a/cart/test/game.bin +++ b/cart/test/game.bin Binary files differ diff --git a/cart/test/game.dll b/cart/test/game.dll index 9b1ea05..2700729 100644 --- a/cart/test/game.dll +++ b/cart/test/game.dll Binary files differ diff --git a/cart.bin b/cart.bin index a7e9658..b0683dd 100755 --- a/cart.bin +++ b/cart.bin Binary files differ diff --git a/cart/test/game.bin b/cart/test/game.bin index 7b91a31..8094454 100755 --- a/cart/test/game.bin +++ b/cart/test/game.bin Binary files differ diff --git a/cart/test/game.dll b/cart/test/game.dll index 9b1ea05..2700729 100644 --- a/cart/test/game.dll +++ b/cart/test/game.dll Binary files differ diff --git a/cart/test/game.pdb b/cart/test/game.pdb index 21226ee..84ed6b1 100755 --- a/cart/test/game.pdb +++ b/cart/test/game.pdb Binary files differ diff --git a/cart.bin b/cart.bin index a7e9658..b0683dd 100755 --- a/cart.bin +++ b/cart.bin Binary files differ diff --git a/cart/test/game.bin b/cart/test/game.bin index 7b91a31..8094454 100755 --- a/cart/test/game.bin +++ b/cart/test/game.bin Binary files differ diff --git a/cart/test/game.dll b/cart/test/game.dll index 9b1ea05..2700729 100644 --- a/cart/test/game.dll +++ b/cart/test/game.dll Binary files differ diff --git a/cart/test/game.pdb b/cart/test/game.pdb index 21226ee..84ed6b1 100755 --- a/cart/test/game.pdb +++ b/cart/test/game.pdb Binary files differ diff --git a/test/test.c b/test/test.c index 4b982c9..030207f 100644 --- a/test/test.c +++ b/test/test.c @@ -9,9 +9,6 @@ #define PADY 2 #define SPRITEOFF -1 -pbm_t* player; -pbm_t* player_out; - typedef enum { BG_SOLID = 1, @@ -43,26 +40,62 @@ grid_t grid[COLS][ROWS]; -void grid_pos(grid_t* g, int* x, int* y) +void grid_pos(grid_t* g, int* gx, int* gy) { int index = (int)(g - &grid[0][0]); - *x = index / ROWS; - *y = index - (*x * ROWS); + *gx = index / ROWS; + *gy = index - (*gx * ROWS); } struct hashmap_s tile_tags; +typedef struct +{ + // last frame coords + float ox; + float oy; + + // current coords + float x; + float y; + + pbm_t* graphic; + pbm_t* outline; + int off_x; + int off_y; + int outline_pixels; +} ent_t; + +ent_t player; + #define OUTLINE 2 bool load_level(char* fname); void unload_bg(); +void set_outline(ent_t* ent, int pixels, bool expand, bool dither) +{ + ent->outline = d_expand_bitmap(ent->graphic, pixels, expand, dither); + ent->outline_pixels = expand ? pixels : 0; +} +void set_standard_sprite_off(ent_t* ent) +{ + ent->off_x = ent->off_y = SPRITEOFF; +} +void reset_pos(ent_t* ent, int x, int y) +{ + ent->x = ent->ox = x; + ent->y = ent->oy = y; +} + int setup(int a) { hashmap_create(32, &tile_tags); - player = f_bitmap("/player.pbm"); - player_out = d_expand_bitmap(player, OUTLINE, true, false); + player.graphic = f_bitmap("/player.pbm"); + set_outline(&player, OUTLINE, true, false); + set_standard_sprite_off(&player); + reset_pos(&player, 0, 0); if (!load_level("/level14.txt")) { @@ -215,36 +248,36 @@ } } - int x = 0; - int y = 0; + int gx = 0; + int gy = 0; while (true) { int res = parse(last_level, len, is_comma_or_space, false); //printf("Parse res: %d\n", res); if (res == DONE || res == BREAK) { - if (y < ROWS) + if (gy < ROWS) { - printf("Didn't read full grid, only %d,%d\n", x, y); + printf("Didn't read full grid, only %d,%d\n", gx, gy); return false; } break; } if (res == NL) { - if (x < COLS) + if (gx < COLS) { - printf("Couldn't read full row, only to index %d on line %d\n", x - 1, parse_line); + printf("Couldn't read full row, only to index %d on line %d\n", gx - 1, parse_line); return false; } - x = 0; - y++; + gx = 0; + gy++; } if (res == WORD) { - if (x >= COLS || y >= ROWS) + if (gx >= COLS || gy >= ROWS) { - printf("Grid is too big, reached %d,%d on line %d\n", x, y, parse_line); + printf("Grid is too big, reached %d,%d on line %d\n", gx, gy, parse_line); return false; } char* prob = NULL; @@ -302,14 +335,14 @@ int p = max(0, min(9, atoi(prob))); if (random(1, 10) > p) continue; } - //printf("Tile %d on %d,%d\n", i, x, y); + //printf("Tile %d on %d,%d\n", i, gx, gy); grid_t g = { i + 1, flags, tag }; - if (tag) hashmap_put(&tile_tags, tag, strlen(tag), &grid[x][y]); - grid[x][y] = g; + if (tag) hashmap_put(&tile_tags, tag, strlen(tag), &grid[gx][gy]); + grid[gx][gy] = g; } } - x++; + gx++; } } @@ -318,25 +351,9 @@ return 0; } -float x = 0; -float y = 0; -int rot = 0; float speed = 80; -bool flipX = false, flipY = false; - -void d_pbm_outline(int16_t x, int16_t y, pbm_t* pbm) -{ - for (int i = x - 1; i <= x + 1; i++) - { - for (int j = y - 1; j <= y + 1; j++) - { - d_pbm(i, j, pbm, 0, 0, 0, 0, WHITE, TRANSPARENT, R_NONE, false, false); - } - } -} - bool move_debug = false; bool r_intersect(int x1, int y1, int w1, int h1, @@ -350,12 +367,12 @@ return true; } -bool r_free(int x, int y, int w, int h) +bool r_free(int px, int py, int w, int h) { - int minX = x / GRID; - int maxX = (x + w - 1) / GRID; - int minY = y / GRID; - int maxY = (y + h - 1) / GRID; + int minX = px / GRID; + int maxX = (px + w - 1) / GRID; + int minY = py / GRID; + int maxY = (py + h - 1) / GRID; for (int i = max(0, minX); i <= min(COLS - 1, maxX); i++) { @@ -363,7 +380,7 @@ { if (grid[i][j].tile != 0 && (bg[grid[i][j].tile - 1].flags & SOLID)) { - if (r_intersect(x, y, w, h, + if (r_intersect(px, py, w, h, i * GRID + 1, j * GRID + 1, GRID - 2, @@ -374,34 +391,78 @@ return true; } -#define ENTER_GRID_PCT 0.2f -void entered_tile(int tx, int ty) +bool in_door = false; +void entered_tile(ent_t* ent, int gx, int gy) { - grid_t g = grid[tx][ty]; + grid_t g = grid[gx][gy]; if (g.tag) { - void* find = NULL; - if (strcmp(g.tag, "d1") == 0) + if (ent == &player) { - if ((find = hashmap_get(&tile_tags, "d2", 2)) != NULL) + void* find = NULL; + if (strcmp(g.tag, "d1") == 0) { - int gx, gy; - grid_pos((grid_t*)find, &gx, &gy); - x = gx * GRID; - y = gy * GRID; + if (!in_door && (find = hashmap_get(&tile_tags, "d2", 2)) != NULL) + { + int target_gx, target_gy; + grid_pos((grid_t*)find, &target_gx, &target_gy); + ent->x = target_gx * GRID; + ent->y = target_gy * GRID; + in_door = true; + } + } + if (strcmp(g.tag, "d2") == 0) + { + if (!in_door && (find = hashmap_get(&tile_tags, "d1", 2)) != NULL) + { + int target_gx, target_gy; + grid_pos((grid_t*)find, &target_gx, &target_gy); + ent->x = target_gx * GRID; + ent->y = target_gy * GRID; + in_door = true; + } } } } } -void exited_tile(int x, int y) +void exited_tile(ent_t* ent, int gx, int gy) { - grid_t g = grid[x][y]; + grid_t g = grid[gx][gy]; } +void render_ent(ent_t* ent) +{ + + if (ent->outline) + { + d_pbm( + (uint16_t)roundf(ent->x) - ent->outline_pixels + PADX + ent->off_x, + (uint16_t)roundf(ent->y) - ent->outline_pixels + PADY + ent->off_y, + ent->outline, 0, 0, 0, 0, WHITE, TRANSPARENT, R_NONE, false, false); + } + d_pbm( + (uint16_t)roundf(ent->x) + PADX + ent->off_x, + (uint16_t)roundf(ent->y) + PADY + ent->off_y, + ent->graphic, 0, 0, 0, 0, BLACK, TRANSPARENT, R_NONE, false, false); +} + +void update_ent_movement(ent_t* ent, bool debug); int loop(int ms) { + float t = ms / 1000.0f; + + if (button_down(DPAD_RIGHT)) player.x += t * speed; + if (button_down(DPAD_LEFT)) player.x -= t * speed; + if (button_down(DPAD_DOWN)) player.y += t * speed; + if (button_down(DPAD_UP)) player.y -= t * speed; + if (button_pressed(BUTTON_A)) move_debug = !move_debug; + + update_ent_movement(&player, move_debug); + + in_door = false; + d_clear(); for (int i = 0; i < COLS; i++) @@ -419,18 +480,9 @@ } } - //d_fillRect(0, 0, SCREEN_W, SCREEN_H, BLACK); + render_ent(&player); - d_pbm( - (uint16_t)roundf(x) - OUTLINE + PADX + SPRITEOFF, - (uint16_t)roundf(y) - OUTLINE + PADY + SPRITEOFF, - player_out, 0, 0, 0, 0, WHITE, TRANSPARENT, rot, flipX, flipY); - d_pbm( - (uint16_t)roundf(x) + PADX + SPRITEOFF, - (uint16_t)roundf(y) + PADY + SPRITEOFF, - player, 0, 0, 0, 0, BLACK, TRANSPARENT, rot, flipX, flipY); - for (int i = 0; i < COLS; i++) { for (int j = 0; j < ROWS; j++) @@ -462,63 +514,44 @@ } } - /* - if (button_pressed(BUTTON_A)) + return 0; +} + +#define ENTER_GRID_PCT 0.2f +void get_close_grid(float x, float y, int* gx, int* gy, float* pct_x, float* pct_y) +{ + float grid_x, grid_y; + *pct_x = modff((x + GRID * 0.5f) / GRID, &grid_x) - 0.5f; + *pct_y = modff((y + GRID * 0.5f) / GRID, &grid_y) - 0.5f; + if (fabsf(*pct_x) > ENTER_GRID_PCT || fabsf(*pct_y) > ENTER_GRID_PCT) { - rot = (rot + 1) % 4; + grid_x = -1; + grid_y = -1; } - if (button_pressed(BUTTON_B)) + *gx = (int)grid_x; + *gy = (int)grid_y; +} + +void update_ent_movement(ent_t* ent, bool debug) +{ + int ox_i = (int)roundf(ent->ox); + int oy_i = (int)roundf(ent->oy); + + if (ent->x != ent->ox || ent->y != ent->oy) { - flipX = !flipX; - if (!flipX) - { - flipY = !flipY; - } - printf("Flip: %d %d\n", flipX, flipY); - } - */ + int x_i = (int)roundf(ent->x); + int y_i = (int)roundf(ent->y); - float ox = x; - float oy = y; + if (ent->x > ent->ox) x_i = (int)roundf(ent->x + 0.5f); + if (ent->x < ent->ox) x_i = (int)roundf(ent->x - 0.5f); - int ox_i = (int)roundf(ox); - int oy_i = (int)roundf(oy); - - float o_grid_x; - float o_grid_y; - - float o_ingrid_x = modff((x + GRID * 0.5f) / GRID, &o_grid_x) - 0.5f; - float o_ingrid_y = modff((y + GRID * 0.5f) / GRID, &o_grid_y) - 0.5f; - if (fabsf(o_ingrid_x) > ENTER_GRID_PCT || fabsf(o_ingrid_y) > ENTER_GRID_PCT) - { - o_grid_x = -1; - o_grid_y = -1; - } - - - float t = ms / 1000.0f; - if (button_down(DPAD_RIGHT)) x += t * speed; - if (button_down(DPAD_LEFT)) x -= t * speed; - if (button_down(DPAD_DOWN)) y += t * speed; - if (button_down(DPAD_UP)) y -= t * speed; - - if (button_pressed(BUTTON_A)) move_debug = !move_debug; - - if (x != ox || y != oy) - { - int x_i = (int)roundf(x); - int y_i = (int)roundf(y); - - if (x > ox) x_i = (int)roundf(x + 0.5f); - if (x < ox) x_i = (int)roundf(x - 0.5f); - - if (y > oy) y_i = (int)roundf(y + 0.5f); - if (y < oy) y_i = (int)roundf(y - 0.5f); + if (ent->y > ent->oy) y_i = (int)roundf(ent->y + 0.5f); + if (ent->y < ent->oy) y_i = (int)roundf(ent->y - 0.5f); bool goX = ox_i != x_i; bool goY = oy_i != y_i; - if (move_debug) printf("(%f,%f)->(%f,%f) I: (%d,%d)->(%d,%d) [%d, %d]\n", ox, oy, x, y, ox_i, oy_i, x_i, y_i, goX, goY); + if (debug) printf("(%f,%f)->(%f,%f) I: (%d,%d)->(%d,%d) [%d, %d]\n", ent->ox, ent->oy, ent->x, ent->y, ox_i, oy_i, x_i, y_i, goX, goY); while (goX || goY) { @@ -558,37 +591,50 @@ } } - if (ox_i != x_i) x = ox_i; - if (oy_i != y_i) y = oy_i; - if (move_debug) printf("reached (%d,%d) on target of (%d,%d), x,y=(%f,%f)\n", ox_i, oy_i, x_i, y_i, x, y); + if (ox_i != x_i) ent->x = ox_i; + if (oy_i != y_i) ent->y = oy_i; + if (debug) printf("reached (%d,%d) on target of (%d,%d), x,y=(%f,%f)\n", ox_i, oy_i, x_i, y_i, ent->x, ent->y); - if (move_debug) printf("\n====================\n\n"); + if (debug) printf("\n====================\n\n"); - float grid_x; - float grid_y; + int o_grid_x, o_grid_y; + float o_ingrid_x, o_ingrid_y; - float ingrid_x = modff((x + GRID * 0.5f) / GRID, &grid_x) - 0.5f; - float ingrid_y = modff((y + GRID * 0.5f) / GRID, &grid_y) - 0.5f; - if (fabsf(ingrid_x) > ENTER_GRID_PCT || fabsf(ingrid_y) > ENTER_GRID_PCT) + int grid_x, grid_y; + float ingrid_x, ingrid_y; + + get_close_grid(ent->ox, ent->oy, &o_grid_x, &o_grid_y, &o_ingrid_x, &o_ingrid_y); + + int tries = 10; + for (; tries > 0; tries--) { - grid_x = -1; - grid_y = -1; - } + get_close_grid(ent->x, ent->y, &grid_x, &grid_y, &ingrid_x, &ingrid_y); - if (grid_x != o_grid_x || grid_y != o_grid_y) - { - if (o_grid_x != -1) + if (grid_x == o_grid_x && grid_y == o_grid_y) { - exited_tile((int)o_grid_x, (int)o_grid_y); - //printf("Exited: %f %f\n", o_grid_x, o_grid_y); + break; } - if (grid_x != -1) + else { - entered_tile((int)grid_x, (int)grid_y); - //printf("Entered: %f %f\n", grid_x, grid_y); + if (o_grid_x != -1) + { + exited_tile(ent, o_grid_x, o_grid_y); + //printf("Exited: %f %f\n", o_grid_x, o_grid_y); + } + if (grid_x != -1) + { + entered_tile(ent, grid_x, grid_y); + //printf("Entered: %f %f\n", grid_x, grid_y); + } + + o_grid_x = grid_x; + o_grid_y = grid_y; } } + if (tries == 0) printf("RAN OUT OF TILE CHECK TRIES\n"); } - return 0; + ent->ox = ent->x; + ent->oy = ent->y; + }