Initial commit

This commit is contained in:
Thomas
2026-02-28 18:00:58 +00:00
commit c66c12ae68
587 changed files with 239570 additions and 0 deletions

69
src/engine/tilemap.h Normal file
View File

@@ -0,0 +1,69 @@
#ifndef JNR_TILEMAP_H
#define JNR_TILEMAP_H
#include <SDL2/SDL.h>
#include <stdbool.h>
#include <stdint.h>
#include <math.h>
#include "config.h"
#include "util/vec2.h"
/* Forward declarations */
typedef struct Camera Camera;
typedef enum TileFlag {
TILE_SOLID = 1 << 0,
TILE_PLATFORM = 1 << 1, /* one-way, passable from below */
TILE_LADDER = 1 << 2,
TILE_HAZARD = 1 << 3, /* spikes, lava, etc. */
TILE_WATER = 1 << 4,
} TileFlag;
typedef struct TileDef {
uint16_t tex_x, tex_y; /* position in tileset (in tiles) */
uint32_t flags;
} TileDef;
/* Entity spawn entry read from .lvl files */
typedef struct EntitySpawn {
char type_name[32]; /* e.g. "grunt", "flyer" */
float x, y; /* world position (pixels) */
} EntitySpawn;
typedef struct Tilemap {
int width, height; /* map size in tiles */
uint16_t *bg_layer; /* background tile IDs */
uint16_t *collision_layer; /* solid geometry tile IDs */
uint16_t *fg_layer; /* foreground decoration IDs */
TileDef tile_defs[MAX_TILE_DEFS];
int tile_def_count;
SDL_Texture *tileset;
int tileset_cols; /* columns in tileset image */
Vec2 player_spawn;
float gravity; /* level gravity (px/s^2), 0 = use default */
char music_path[ASSET_PATH_MAX]; /* level music file path */
SDL_Color bg_color; /* background clear color */
bool has_bg_color; /* true if BG_COLOR was set */
char parallax_far_path[ASSET_PATH_MAX]; /* far bg image path */
char parallax_near_path[ASSET_PATH_MAX]; /* near bg image path */
EntitySpawn entity_spawns[MAX_ENTITY_SPAWNS];
int entity_spawn_count;
} Tilemap;
bool tilemap_load(Tilemap *map, const char *path, SDL_Renderer *renderer);
void tilemap_render_layer(const Tilemap *map, const uint16_t *layer,
const Camera *cam, SDL_Renderer *renderer);
bool tilemap_is_solid(const Tilemap *map, int tile_x, int tile_y);
uint32_t tilemap_flags_at(const Tilemap *map, int tile_x, int tile_y);
void tilemap_free(Tilemap *map);
/* World-pixel to tile coordinate helpers */
static inline int world_to_tile(float world_coord) {
return (int)floorf(world_coord / TILE_SIZE);
}
static inline float tile_to_world(int tile_coord) {
return (float)(tile_coord * TILE_SIZE);
}
#endif /* JNR_TILEMAP_H */