phantasia

Phantasia - 2D SDL3 RPG prototype.
git clone git://git.beep.wimdupont.com/phantasia.git
Log | Files | Refs | README | LICENSE

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:
Mdata/maps/ashen-meadow.txt | 48++++++++++++++++++++++++------------------------
Mdata/maps/stonehollow.txt | 48++++++++++++++++++++++++------------------------
Msrc/engine/render.c | 13+++++++++++++
Msrc/engine/world.h | 3+++
Msrc/game/content.c | 66+++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/game/content.h | 2+-
Msrc/game/presentation.c | 5+++++
Msrc/tests/smoke.c | 2+-
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,