commit 76ff3492aea3b0d0ef01f68be4b6eec5ab1e0d1a
parent a0b75c0bdd0ebf17601ece20f251505282de3d50
Author: beep <beep@wimdupont.com>
Date: Thu, 30 Jul 2026 09:27:41 +0000
Improve world maps and tile rendering
Diffstat:
8 files changed, 122 insertions(+), 65 deletions(-)
diff --git a/data/maps/ashen-meadow.txt b/data/maps/ashen-meadow.txt
@@ -1,26 +1,26 @@
name: Ashen Meadow
-################################
-#..............................#
-#...........................e>.#
-#......####....................#
-#....@1#..#....................#
-#.....2####............###.....#
-#..........a...........#.......#
-#......................#.......#
-#......................###.....#
-#..............................#
-#............#####.............#
-#............#...#.............#
-#............#...#.............#
-#............#####.............#
-#..............................#
-#..............................#
-#....###.......................#
-#......#.......................#
-#....###.......................#
-#..............................#
-#..............................#
-#..............................#
-#..............................#
-################################
+ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC
+D:..;...:.....;..:.....;.......F
+D..:....;..............:....e>.F
+D.....ABC....;......:..........F
+D....@1EF........:.......;.....F
+D.....2HI...:........ABC.......F
+D..;.......a.........DEF..:....F
+D........:...........GHI.......F
+D....;.........:..........;....F
+D.........ABC................:.F
+D..:......DEF...;..............F
+D.........GHI..........:.......F
+D....;.............ABC.........F
+D........:.........DEF.....;...F
+D..ABC.............GHI.........F
+D..DEF...;....:...............:F
+D..GHI..............;..........F
+D...........ABC..........:.....F
+D...:.......DEF....;...........F
+D...........GHI...........;....F
+D..;.............:.............F
+D.......:..............;.......F
+D..;.........:..............;..F
+GHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHI
diff --git a/data/maps/stonehollow.txt b/data/maps/stonehollow.txt
@@ -1,26 +1,26 @@
name: Stonehollow
-################################
-#..............................#
-#..[^^^^^^]....[^^^^^^]........#
-#..{======}....{======}........#
-#..{=m====}....{======}........#
-#..{======}....{======}........#
-#..(__+___)....(___+__)........#
-#.....,............,...........#
-#.....,,,,,,,,,,,,,,...........#
-#...........,..................#
-#..[^^^^^^].,..[^^^^^^]........#
-#..{======}.,..{======}........#
-#..{======}.,..{======}........#
-#..{======}.,..{======}........#
-#..(__+___).,..(__+___)........#
-#.....,.....,.....,............#
-#.....,,,,,,,,,,,,,............#
-#...........,..................#
-#...........,,,,,..............#
-#..............,...............#
-#..............,...............#
-#..............e...............#
-#..............<...............#
-################################
+ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC
+D..............................F
+D..J....K....L....M....N....O..F
+D..m...........................F
+D..,,,,,,,,,,,,,,,,,,,,,,,,,,..F
+D..,....:.........;.........,..F
+D..,........................,..F
+D..,....P.....Q.....R.......,..F
+D..,........................,..F
+D..,.........ABC............,..F
+D..,,,,,,,,,,DEF,,,,,,,,,,,,,..F
+D..,.........GHI............,..F
+D..,....;...............:...,..F
+D..,........................,..F
+D..,......M......K......P...,..F
+D..,,,,,,,,,,,,,,,,,,,,,,,,,,..F
+D.............,................F
+D....;........,......:.........F
+D.............,................F
+D..:..........,..........;.....F
+D.............,................F
+D.............e................F
+D.............<................F
+GHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHI
diff --git a/src/engine/render.c b/src/engine/render.c
@@ -125,6 +125,19 @@ ph_draw_area(SDL_Renderer *renderer, const PhRenderAssets *assets, const PhWorld
SDL_FRect src;
if (!def) continue;
+ if (def->background_asset_id) {
+ SDL_Texture *background = ph_render_asset(assets,
+ def->background_asset_id);
+ SDL_FRect background_src = {
+ .x = (float)(def->background_sprite_tile_x * PH_TILE_SIZE),
+ .y = (float)(def->background_sprite_tile_y * PH_TILE_SIZE),
+ .w = (float)PH_TILE_SIZE,
+ .h = (float)PH_TILE_SIZE,
+ };
+
+ if (background)
+ SDL_RenderTexture(renderer, background, &background_src, &rect);
+ }
texture = ph_render_asset(assets, def->asset_id);
if (!texture) continue;
src = (SDL_FRect){
diff --git a/src/engine/world.h b/src/engine/world.h
@@ -109,6 +109,9 @@ typedef struct {
int asset_id;
int sprite_tile_x;
int sprite_tile_y;
+ int background_asset_id;
+ int background_sprite_tile_x;
+ int background_sprite_tile_y;
} PhTileDef;
typedef struct {
diff --git a/src/game/content.c b/src/game/content.c
@@ -13,20 +13,56 @@ const PhAreaDef ph_area_defs[PH_AREA_COUNT] = {
};
const PhTileDef ph_tile_defs[PH_TILE_DEF_COUNT] = {
- { '.', 0, PH_ASSET_TILESET, 1, 1 },
- { '#', 1, PH_ASSET_TILESET, 1, 5 },
- { ',', 0, PH_ASSET_TILESET, 5, 0 },
- { '[', 1, PH_ASSET_TILESET, 9, 1 },
- { '^', 1, PH_ASSET_TILESET, 10, 1 },
- { ']', 1, PH_ASSET_TILESET, 11, 1 },
- { '{', 1, PH_ASSET_TILESET, 9, 2 },
- { '=', 0, PH_ASSET_TILESET, 10, 2 },
- { '}', 1, PH_ASSET_TILESET, 11, 2 },
- { '(', 1, PH_ASSET_TILESET, 9, 3 },
- { '_', 1, PH_ASSET_TILESET, 10, 3 },
- { ')', 1, PH_ASSET_TILESET, 11, 3 },
- { '+', 0, PH_ASSET_TILESET, 10, 3 },
- { 'T', 0, PH_ASSET_TILESET, 6, 11 },
+ { '.', 0, PH_ASSET_TILESET, 1, 1, 0, 0, 0 },
+ { ':', 0, PH_ASSET_TILESET, 1, 0, 0, 0, 0 },
+ { ';', 0, PH_ASSET_TILESET, 2, 0, 0, 0, 0 },
+ { ',', 0, PH_ASSET_TILESET, 6, 2, 0, 0, 0 },
+ { 'T', 0, PH_ASSET_TILESET, 6, 2, 0, 0, 0 },
+ { 'A', 1, PH_ASSET_TILESET, 9, 4, 0, 0, 0 },
+ { 'B', 1, PH_ASSET_TILESET, 10, 4, 0, 0, 0 },
+ { 'C', 1, PH_ASSET_TILESET, 11, 4, 0, 0, 0 },
+ { 'D', 1, PH_ASSET_TILESET, 9, 5, 0, 0, 0 },
+ { 'E', 1, PH_ASSET_TILESET, 10, 5, 0, 0, 0 },
+ { 'F', 1, PH_ASSET_TILESET, 11, 5, 0, 0, 0 },
+ { 'G', 1, PH_ASSET_TILESET, 9, 6, 0, 0, 0 },
+ { 'H', 1, PH_ASSET_TILESET, 10, 6, 0, 0, 0 },
+ { 'I', 1, PH_ASSET_TILESET, 11, 6, 0, 0, 0 },
+ { .symbol = 'J', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 0, .sprite_tile_y = 16,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'K', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 1, .sprite_tile_y = 16,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'L', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 3, .sprite_tile_y = 16,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'M', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 0, .sprite_tile_y = 17,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'N', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 1, .sprite_tile_y = 17,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'O', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 3, .sprite_tile_y = 17,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'P', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 0, .sprite_tile_y = 18,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'Q', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 1, .sprite_tile_y = 18,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
+ { .symbol = 'R', .blocks_movement = 1, .asset_id = PH_ASSET_TILESET,
+ .sprite_tile_x = 3, .sprite_tile_y = 18,
+ .background_asset_id = PH_ASSET_TILESET,
+ .background_sprite_tile_x = 1, .background_sprite_tile_y = 1 },
};
const PhSpellDef ph_spell_defs[PH_SPELL_DEF_COUNT] = {
@@ -176,7 +212,7 @@ const PhMarkerDef ph_marker_defs[PH_MARKER_DEF_COUNT] = {
{ PH_AREA_MEADOW, '>', 'T', PH_MARKER_PORTAL,
.destination_area_id = PH_AREA_STONEHOLLOW, .destination_symbol = 'e' },
{ PH_AREA_MEADOW, 'e', '.', PH_MARKER_ARRIVAL, .content_id = 0 },
- { PH_AREA_STONEHOLLOW, 'm', '=', PH_MARKER_ENTITY,
+ { PH_AREA_STONEHOLLOW, 'm', ',', PH_MARKER_ENTITY,
PH_DEF_SHOPKEEPER, .amount = 0 },
{ PH_AREA_STONEHOLLOW, '<', 'T', PH_MARKER_PORTAL,
.destination_area_id = PH_AREA_MEADOW, .destination_symbol = 'e' },
diff --git a/src/game/content.h b/src/game/content.h
@@ -73,7 +73,7 @@ enum {
};
enum {
- PH_TILE_DEF_COUNT = 14,
+ PH_TILE_DEF_COUNT = 23,
PH_MARKER_DEF_COUNT = 9,
};
diff --git a/src/game/presentation.c b/src/game/presentation.c
@@ -349,6 +349,7 @@ static void
ph_draw_inventory(SDL_Renderer *renderer, const PhRenderAssets *assets,
const PhWorld *world, const PhInventoryUi *ui)
{
+ const PhEntity *player = ph_world_player(world);
char text[128];
int selected_rank = 0;
int total = 0;
@@ -363,6 +364,10 @@ ph_draw_inventory(SDL_Renderer *renderer, const PhRenderAssets *assets,
}
page = selected_rank / 5;
ph_draw_menu(renderer, "INVENTORY", PH_KEY_INVENTORY);
+ if (player) {
+ snprintf(text, sizeof(text), "GOLD %d", player->gold);
+ SDL_RenderDebugText(renderer, ph_ui_right(96.0f), 22.0f, text);
+ }
for (i = 0; i < world->content.item_count; ++i) {
const PhItemDef *item = &world->content.items[i];
SDL_Texture *texture;
diff --git a/src/tests/smoke.c b/src/tests/smoke.c
@@ -342,7 +342,7 @@ ph_area_shop_test(void)
world.area_id != PH_AREA_STONEHOLLOW ||
world.initialized_area_count != 2) goto fail;
if (!ph_area_tile_blocked(&world.area, 3, 2) ||
- ph_area_tile_blocked(&world.area, 4, 3) ||
+ ph_area_tile_blocked(&world.area, 4, 4) ||
ph_area_tile_blocked(&world.area, 6, 6)) goto fail;
for (i = 0; i < world.entity_count; ++i) {
const PhEntityDef *def = ph_world_entity_def(&world,