commit ce5dbcc5331579d5a41633654d3b69e2d974a446 parent 76344983a86970e742dac6dbc7ac6645f5fc26a9 Author: beep <beep@wimdupont.com> Date: Sat, 4 Apr 2026 16:47:02 +0000 Render meadow with OGA grass biome tileset Diffstat:
13 files changed, 344 insertions(+), 18 deletions(-)
diff --git a/Makefile b/Makefile @@ -4,6 +4,8 @@ OBJDIR = obj MAPDIR = $(OBJDIR)/maps MAPSRC = data/maps/ashen-meadow.txt MAPBIN = $(MAPSRC:data/maps/%.txt=$(MAPDIR)/%.phmap) +TILESET_SRC = assets/vendor/overworld-grass-biome/TilesetGrass/overworld_tileset_grass.png +TILESET_BMP = $(OBJDIR)/assets/overworld_tileset_grass.bmp SRC = \ src/engine/world.c \ @@ -31,9 +33,9 @@ endif .PHONY: all clean render-smoke smoke -all: $(BIN) $(MAPBIN) +all: $(BIN) $(MAPBIN) $(TILESET_BMP) -$(BIN): $(OBJ) $(MAPBIN) +$(BIN): $(OBJ) $(MAPBIN) $(TILESET_BMP) @mkdir -p $(dir $@) $(CC) $(OBJ) -o $@ $(LDLIBS) @@ -49,6 +51,10 @@ $(MAPDIR)/%.phmap: data/maps/%.txt $(MAPC) @mkdir -p $(dir $@) $(MAPC) $< $@ +$(TILESET_BMP): $(TILESET_SRC) + @mkdir -p $(dir $@) + magick $< -alpha off BMP3:$@ + smoke: $(BIN) $(BIN) --smoke-test diff --git a/assets/vendor/overworld-grass-biome/SOURCE.txt b/assets/vendor/overworld-grass-biome/SOURCE.txt @@ -0,0 +1,4 @@ +Overworld - Grass Biome +Author: Beast +License: CC0 +Source: https://opengameart.org/content/overworld-grass-biome diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass.zip b/assets/vendor/overworld-grass-biome/TilesetGrass.zip Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/grass_biome.tsx b/assets/vendor/overworld-grass-biome/TilesetGrass/grass_biome.tsx @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<tileset name="grass_biome" tilewidth="16" tileheight="16" tilecount="252" columns="12"> + <image source="overworld_tileset_grass.png" width="192" height="336"/> + <terraintypes> + <terrain name="Grass" tile="13"/> + <terrain name="Water" tile="0"/> + <terrain name="Forest" tile="0"/> + <terrain name="Swampgrass" tile="0"/> + <terrain name="Swamp" tile="0"/> + </terraintypes> + <tile id="0" terrain="0,0,0,0" probability="20"/> + <tile id="1" terrain="0,0,0,0"/> + <tile id="2" terrain="0,0,0,0"/> + <tile id="3" terrain="0,0,0,0"/> + <tile id="4" terrain="0,0,0,0"/> + <tile id="13" terrain="0,0,0,0"/> + <tile id="14" terrain="0,0,0,0"/> + <tile id="25" terrain="0,0,0,0"/> + <tile id="26" terrain="0,0,0,0"/> + <tile id="37" terrain="0,0,0,0"/> + <tile id="38" terrain="0,0,0,0"/> + <tile id="48" terrain="0,0,0,1"/> + <tile id="49" terrain="0,0,1,1"/> + <tile id="50" terrain="0,0,1,0"/> + <tile id="51" terrain="3,3,3,4"/> + <tile id="52" terrain="3,3,4,4"/> + <tile id="53" terrain="3,3,4,3"/> + <tile id="57" terrain="0,0,0,2"/> + <tile id="58" terrain="0,0,2,2"/> + <tile id="59" terrain="0,0,2,0"/> + <tile id="60" terrain="0,1,0,1"/> + <tile id="61" terrain="1,1,1,1"/> + <tile id="62" terrain="1,0,1,0"/> + <tile id="63" terrain="3,4,3,4"/> + <tile id="64" terrain="4,4,4,4"/> + <tile id="65" terrain="4,3,4,3"/> + <tile id="69" terrain="0,2,0,2"/> + <tile id="70" terrain="2,2,2,2"/> + <tile id="71" terrain="2,0,2,0"/> + <tile id="72" terrain="0,1,0,0"/> + <tile id="73" terrain="1,1,0,0"/> + <tile id="74" terrain="1,0,0,0"/> + <tile id="75" terrain="3,4,3,3"/> + <tile id="76" terrain="4,4,3,3"/> + <tile id="77" terrain="4,3,3,3"/> + <tile id="81" terrain="0,2,0,0"/> + <tile id="82" terrain="2,2,0,0"/> + <tile id="83" terrain="2,0,0,0"/> + <tile id="84" terrain="1,1,1,0"/> + <tile id="85" terrain="1,1,0,1"/> + <tile id="87" terrain="4,4,4,3"/> + <tile id="88" terrain="4,4,3,4"/> + <tile id="89" terrain="3,3,3,3"/> + <tile id="93" terrain="2,2,2,0"/> + <tile id="94" terrain="2,2,0,2"/> + <tile id="96" terrain="1,0,1,1"/> + <tile id="97" terrain="0,1,1,1"/> + <tile id="99" terrain="4,3,4,4"/> + <tile id="100" terrain="3,4,4,4"/> + <tile id="105" terrain="2,0,2,2"/> + <tile id="106" terrain="0,2,2,2"/> + <tile id="123" terrain="3,3,3,3"/> + <tile id="124" terrain="3,3,3,3"/> + <tile id="125" terrain="3,3,3,3"/> + <tile id="135" terrain="3,3,3,3"/> + <tile id="136" terrain="3,3,3,3"/> + <tile id="137" terrain="3,3,3,3"/> +</tileset> diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/map1.png b/assets/vendor/overworld-grass-biome/TilesetGrass/map1.png Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/map1.tmx b/assets/vendor/overworld-grass-biome/TilesetGrass/map1.tmx @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8"?> +<map version="1.0" tiledversion="1.1.3" orientation="orthogonal" renderorder="right-down" width="21" height="42" tilewidth="16" tileheight="16" infinite="0" nextobjectid="1"> + <tileset firstgid="1" source="grass_biome.tsx"/> + <layer name="Kachelebene 1" width="21" height="42"> + <data encoding="csv"> +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,85,74,74,74,74,74,74,86,62,62,62,62,62,62,62,62, +62,62,62,85,74,75,2,1,4,1,1,38,61,62,62,62,62,62,62,62,62, +62,62,62,63,3,1,1,1,2,39,1,39,73,74,86,62,62,62,62,62,62, +62,62,85,75,127,56,56,56,56,56,57,3,1,15,73,74,86,62,62,62,62, +62,62,63,58,59,59,60,55,56,57,69,1,1,3,1,1,73,86,62,62,62, +62,62,63,70,71,71,72,67,116,69,69,1,26,1,1,14,1,73,86,62,62, +62,62,63,82,83,83,84,79,80,81,69,157,158,159,160,1,1,1,61,62,62, +62,62,63,1,139,92,1,91,80,80,81,169,170,171,172,14,38,1,61,62,62, +62,85,75,1,1,142,143,144,1,1,1,181,182,183,184,1,1,2,61,62,62, +62,63,1,1,1,1,1,58,59,59,59,60,1,42,7,20,3,1,61,62,62, +62,63,1,1,1,1,1,70,71,71,71,106,60,1,1,29,1,15,61,62,62, +62,97,51,1,1,1,1,70,71,71,71,71,106,60,1,1,15,1,61,62,62, +62,62,63,1,39,186,1,82,83,83,95,71,71,106,60,21,1,1,73,86,62, +62,62,97,51,39,29,39,96,49,51,70,71,71,71,72,33,1,1,1,61,62, +62,62,62,63,39,29,39,96,73,75,70,71,71,71,72,33,58,59,60,61,62, +62,62,62,63,1,42,7,20,1,1,82,95,71,71,72,33,70,71,72,61,62, +62,62,62,97,50,51,1,42,10,24,2,82,83,83,84,33,82,83,84,61,62, +62,62,62,62,62,97,51,1,1,46,11,11,11,11,11,48,1,1,1,61,62, +62,62,62,62,62,62,63,1,3,4,3,4,1,1,1,5,1,1,1,61,62, +62,62,62,62,62,62,63,1,1,1,2,5,23,27,13,58,59,60,1,61,62, +62,62,62,62,85,74,75,1,58,59,59,60,33,4,58,107,71,72,1,61,62, +62,62,62,85,75,1,1,58,107,71,71,72,33,58,107,71,71,72,1,61,62, +62,62,62,63,1,1,58,107,71,71,71,72,33,70,71,71,94,84,49,98,62, +62,62,85,75,1,58,107,71,71,71,94,84,33,70,71,94,84,1,61,62,62, +62,85,75,1,58,107,71,71,71,71,72,1,33,82,83,84,1,49,98,62,62, +62,63,1,1,70,71,71,71,71,71,72,1,4,1,1,1,1,61,62,62,62, +62,63,1,1,70,71,94,95,71,71,106,60,1,1,1,1,49,98,62,62,62, +62,63,1,1,82,83,84,82,83,95,71,72,1,1,5,49,98,62,62,62,62, +62,97,51,1,1,1,1,1,1,70,71,72,1,1,1,61,62,62,62,62,62, +62,62,97,50,51,1,1,1,1,82,83,84,1,1,49,98,62,62,62,62,62, +62,62,62,62,97,50,50,50,51,1,1,1,1,49,98,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,97,50,50,50,50,98,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62, +62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62 +</data> + </layer> + <layer name="Tile Layer 2" width="21" height="42"> + <data encoding="csv"> +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,145,146,147,148,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,149,150,151,0,0,0,0,0,116,0,0,0,0,0,0,0,0, +0,0,0,0,161,162,163,0,0,0,0,0,0,96,0,0,0,0,0,0,0, +0,0,0,0,173,174,175,0,0,0,0,0,0,0,0,29,0,0,0,0,0, +0,0,0,0,185,0,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,116,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,164,165,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,23,176,177,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,33,188,189,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,96,0,33,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,108,29,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,108,29,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +</data> + </layer> +</map> diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/map2.png b/assets/vendor/overworld-grass-biome/TilesetGrass/map2.png Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/map2.tmx b/assets/vendor/overworld-grass-biome/TilesetGrass/map2.tmx @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<map version="1.0" tiledversion="1.1.3" orientation="orthogonal" renderorder="right-down" width="15" height="15" tilewidth="16" tileheight="16" infinite="0" nextobjectid="1"> + <tileset firstgid="1" source="grass_biome.tsx"/> + <layer name="Tile Layer 1" width="15" height="15"> + <data encoding="csv"> +1,1,1,1,1,28,28,40,64,65,88,77,78,40,16, +91,140,80,141,16,1,28,40,76,77,78,40,40,16,1, +69,16,16,28,16,1,1,16,16,28,40,40,28,58,59, +81,116,1,16,132,1,1,49,50,51,16,16,16,70,71, +80,80,80,80,81,116,49,98,62,63,1,1,1,82,83, +1,1,1,1,1,49,98,62,62,97,50,51,1,1,1, +1,1,1,1,1,61,62,62,62,62,62,97,50,50,50, +1,1,1,1,1,73,74,86,62,62,62,62,62,62,62, +108,1,1,1,1,1,1,73,74,74,74,86,62,62,62, +59,60,1,42,7,7,20,4,1,166,168,73,74,86,62, +71,72,120,4,13,38,29,2,17,216,58,59,60,73,74, +71,72,96,5,25,38,30,7,44,1,70,71,106,59,59, +71,72,108,1,37,27,29,4,58,59,107,71,71,71,71, +71,106,59,60,120,38,29,1,70,71,71,71,71,71,71, +71,71,71,72,120,1,29,1,70,71,71,71,71,71,71 +</data> + </layer> + <layer name="Tile Layer 2" width="15" height="15"> + <data encoding="csv"> +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,145,146,147,148,0,0,0,0,0,0,0,0,0,0, +0,157,158,159,160,0,0,0,0,0,0,0,0,0,0, +0,169,170,171,172,0,0,0,0,0,0,0,0,0,0, +0,181,182,183,184,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,196,197,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +</data> + </layer> +</map> diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/overworld_tileset_grass.ase b/assets/vendor/overworld-grass-biome/TilesetGrass/overworld_tileset_grass.ase Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/overworld_tileset_grass.png b/assets/vendor/overworld-grass-biome/TilesetGrass/overworld_tileset_grass.png Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/palette.ase b/assets/vendor/overworld-grass-biome/TilesetGrass/palette.ase Binary files differ. diff --git a/assets/vendor/overworld-grass-biome/TilesetGrass/preview.png b/assets/vendor/overworld-grass-biome/TilesetGrass/preview.png Binary files differ. diff --git a/src/game/main.c b/src/game/main.c @@ -24,6 +24,14 @@ enum { }; #define PH_START_MAP_PATH "obj/maps/ashen-meadow.phmap" +#define PH_TILESET_PATH "obj/assets/overworld_tileset_grass.bmp" +#define PH_RENDER_SMOKE_PATH "obj/render-smoke.bmp" + +enum { + PH_TILESET_COLUMNS = 12, + PH_TILE_GRASS = 13, + PH_TILE_BLOCKED = 61, +}; static int ph_make_world(PhWorld *world) @@ -106,8 +114,29 @@ ph_run_smoke_test(void) } #if PH_USE_SDL +static SDL_Texture * +ph_load_tileset(SDL_Renderer *renderer, const char *path) +{ + SDL_Surface *surface; + SDL_Texture *texture; + + surface = SDL_LoadBMP(path); + if (!surface) { + fprintf(stderr, "SDL_LoadBMP failed for %s: %s\n", path, SDL_GetError()); + return NULL; + } + + SDL_SetSurfaceColorKey(surface, true, SDL_MapSurfaceRGB(surface, 0, 0, 0)); + texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_DestroySurface(surface); + if (!texture) { + fprintf(stderr, "SDL_CreateTextureFromSurface failed: %s\n", SDL_GetError()); + } + return texture; +} + static void -ph_draw_area(SDL_Renderer *renderer, const PhWorld *world) +ph_draw_area(SDL_Renderer *renderer, SDL_Texture *tileset, const PhWorld *world) { int tx; int ty; @@ -120,13 +149,16 @@ ph_draw_area(SDL_Renderer *renderer, const PhWorld *world) .w = (float)PH_TILE_SIZE, .h = (float)PH_TILE_SIZE, }; + int tile_id = ph_area_tile_blocked(&world->area, tx, ty) ? + PH_TILE_BLOCKED : PH_TILE_GRASS; + SDL_FRect src = { + .x = (float)((tile_id % PH_TILESET_COLUMNS) * PH_TILE_SIZE), + .y = (float)((tile_id / PH_TILESET_COLUMNS) * PH_TILE_SIZE), + .w = (float)PH_TILE_SIZE, + .h = (float)PH_TILE_SIZE, + }; - if (ph_area_tile_blocked(&world->area, tx, ty)) { - SDL_SetRenderDrawColor(renderer, 38, 44, 58, 255); - } else { - SDL_SetRenderDrawColor(renderer, 74, 114, 84, 255); - } - SDL_RenderFillRect(renderer, &rect); + SDL_RenderTexture(renderer, tileset, &src, &rect); } } } @@ -184,6 +216,19 @@ ph_draw_entities(SDL_Renderer *renderer, const PhWorld *world) } } +static void +ph_render_frame(SDL_Renderer *renderer, SDL_Texture *tileset, PhWorld *world, PhInput input, float dt) +{ + ph_world_tick(world, input, dt); + + SDL_SetRenderDrawColor(renderer, 16, 18, 24, 255); + SDL_RenderClear(renderer); + ph_draw_area(renderer, tileset, world); + ph_draw_items(renderer, world); + ph_draw_entities(renderer, world); + SDL_RenderPresent(renderer); +} + static PhInput ph_read_input(const bool *keys) { @@ -209,10 +254,72 @@ ph_read_input(const bool *keys) } static int +ph_run_render_smoke_test(void) +{ + SDL_Surface *surface; + SDL_Renderer *renderer; + SDL_Texture *tileset; + PhWorld world; + int i; + + if (!SDL_Init(SDL_INIT_VIDEO)) { + fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); + return 1; + } + + surface = SDL_CreateSurface(PH_VIEW_W, PH_VIEW_H, SDL_PIXELFORMAT_ARGB8888); + if (!surface) { + fprintf(stderr, "SDL_CreateSurface failed: %s\n", SDL_GetError()); + SDL_Quit(); + return 1; + } + + renderer = SDL_CreateSoftwareRenderer(surface); + if (!renderer) { + fprintf(stderr, "SDL_CreateSoftwareRenderer failed: %s\n", SDL_GetError()); + SDL_DestroySurface(surface); + SDL_Quit(); + return 1; + } + + if (ph_make_world(&world) < 0) { + SDL_DestroyRenderer(renderer); + SDL_DestroySurface(surface); + SDL_Quit(); + return 1; + } + + tileset = ph_load_tileset(renderer, PH_TILESET_PATH); + if (!tileset) { + ph_area_free(&world.area); + SDL_DestroyRenderer(renderer); + SDL_DestroySurface(surface); + SDL_Quit(); + return 1; + } + + for (i = 0; i < 8; ++i) { + ph_render_frame(renderer, tileset, &world, (PhInput){ 0 }, 1.0f / 60.0f); + } + + if (!SDL_SaveBMP(surface, PH_RENDER_SMOKE_PATH)) { + fprintf(stderr, "SDL_SaveBMP failed: %s\n", SDL_GetError()); + } + + SDL_DestroyTexture(tileset); + ph_area_free(&world.area); + SDL_DestroyRenderer(renderer); + SDL_DestroySurface(surface); + SDL_Quit(); + return 0; +} + +static int ph_run_game(int frame_limit) { SDL_Window *window; SDL_Renderer *renderer; + SDL_Texture *tileset; PhWorld world; Uint64 last_ticks; int frame_count = 0; @@ -228,6 +335,15 @@ ph_run_game(int frame_limit) return 1; } + tileset = ph_load_tileset(renderer, PH_TILESET_PATH); + if (!tileset) { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + ph_area_free(&world.area); + SDL_Quit(); + return 1; + } + if (!SDL_CreateWindowAndRenderer("phantasia", PH_VIEW_W * PH_SCALE, PH_VIEW_H * PH_SCALE, @@ -265,14 +381,7 @@ ph_run_game(int frame_limit) last_ticks = now_ticks; input = ph_read_input(SDL_GetKeyboardState(NULL)); - ph_world_tick(&world, input, dt); - - SDL_SetRenderDrawColor(renderer, 16, 18, 24, 255); - SDL_RenderClear(renderer); - ph_draw_area(renderer, &world); - ph_draw_items(renderer, &world); - ph_draw_entities(renderer, &world); - SDL_RenderPresent(renderer); + ph_render_frame(renderer, tileset, &world, input, dt); ++frame_count; if (frame_limit > 0 && frame_count >= frame_limit) { running = 0; @@ -280,6 +389,7 @@ ph_run_game(int frame_limit) SDL_Delay(16); } + SDL_DestroyTexture(tileset); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); ph_area_free(&world.area); @@ -297,7 +407,7 @@ main(int argc, char **argv) #if PH_USE_SDL if (argc > 1 && strcmp(argv[1], "--render-smoke-test") == 0) { - return ph_run_game(8); + return ph_run_render_smoke_test(); } return ph_run_game(0); #else