@@ 127,8 127,8 @@ void labyrinth_coord_to_screen_coord(const int x, const int y,
const float startx, const float starty, float* to_x, float* to_y);
void labyrinth_coord_to_screen_coordF(const float x, const float y,
const float startx, const float starty, float* to_x, float* to_y);
-void load_textures(void);
-void load_labyrinth(const char* pathname);
+int load_textures(void);
+int load_labyrinth(const char* pathname);
int location_pop(SDL_Point* location);
void location_push(const SDL_Point* location);
void next_step(void);
@@ 137,6 137,7 @@ void print_debug(const char* fmt, ...);
void print_error(const char* fmt, ...);
void reset(void);
void step_animation(void);
+SDL_Surface* try_load(const char* filename);
void
assign_pointIF(const SDL_Point* from, SDL_FPoint* to)
@@ 571,19 572,14 @@ labyrinth_coord_to_screen_coordF(const float x, const float y,
*to_y = starty + y * CELL_SIZE;
}
-void
+int
load_textures(void)
{
SDL_Surface* surface = NULL;
- /* TODO: Tre DATADIR, then ., then fail */
- surface = IMG_Load(SPRITES_PNG);
+ surface = try_load(SPRITES_PNG);
if (!surface)
- {
- print_error("IMG_Load failed: %s", IMG_GetError());
- exit(1);
- }
-
+ return -1;
sprites = SDL_CreateTextureFromSurface(renderer, surface);
if (!sprites)
{
@@ 592,15 588,10 @@ load_textures(void)
exit(1);
}
SDL_FreeSurface(surface);
- surface = NULL;
- surface = IMG_Load(TER16_PNG);
+ surface = try_load(TER16_PNG);
if (!surface)
- {
- print_error("IMG_Load failed: %s", IMG_GetError());
- exit(1);
- }
-
+ return -1;
ter16_texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!ter16_texture)
{
@@ 610,9 601,11 @@ load_textures(void)
}
SDL_FreeSurface(surface);
+
+ return 0;
}
-void
+int
load_labyrinth(const char* pathname)
{
FILE* input = NULL;
@@ 621,11 614,7 @@ load_labyrinth(const char* pathname)
input = fopen(pathname, "rt");
if (!input)
- {
- print_error("load_labyrinth: fopen failed: %s (%s)",
- strerror(errno), pathname);
- exit(1);
- }
+ return -1;
labyrinth.cells = (char**)calloc(LABYRINTH_MAXHEIGHT, sizeof(char*));
if (!labyrinth.cells)
@@ 696,6 685,8 @@ load_labyrinth(const char* pathname)
labyrinth.cells[end.y][end.x] = CELL_END;
fclose(input);
+
+ return 0;
}
int
@@ 868,11 859,38 @@ step_animation(void)
}
}
+SDL_Surface*
+try_load(const char* filename)
+{
+ char tex_pathname[4096];
+ SDL_Surface* surface = NULL;
+
+ sprintf(tex_pathname, "%s/%s", DATADIR, filename);
+ surface = IMG_Load(tex_pathname);
+ if (!surface)
+ {
+ print_debug("try_load: IMG_Load failed (%s): %s", tex_pathname,
+ IMG_GetError());
+ sprintf(tex_pathname, "./%s", filename);
+ print_debug("try_load: trying %s", tex_pathname);
+ surface = IMG_Load(tex_pathname);
+ if (!surface)
+ {
+ print_error("try_load: IMG_Load failed (%s): %s",
+ tex_pathname, IMG_GetError());
+ exit(1);
+ }
+ }
+
+ return surface;
+}
+
int
main(int argc, char** argv)
{
SDL_Event event;
int px, py;
+ char datafile_pathname[4096];
atexit(&cleanup);
@@ 898,11 916,31 @@ main(int argc, char** argv)
SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC, "1", SDL_HINT_OVERRIDE);
SDL_RenderSetLogicalSize(renderer, DEFAULT_WIDTH, DEFAULT_HEIGHT);
- load_textures();
+ if (load_textures() < 0)
+ exit(1);
+
if (argc > 1)
- load_labyrinth(*(argv + 1));
+ {
+ if (load_labyrinth(*(argv + 1)) < 0)
+ exit(1);
+ }
else
- load_labyrinth(DEFAULT_DATAFILE);
+ {
+ sprintf(datafile_pathname, "%s/%s", DATADIR, DEFAULT_DATAFILE);
+ if (load_labyrinth(datafile_pathname) < 0)
+ {
+ print_debug("fopen failed: %s (%s)", strerror(errno),
+ datafile_pathname);
+ sprintf(datafile_pathname, "./%s", DEFAULT_DATAFILE);
+ print_debug("trying %s", datafile_pathname);
+ if (load_labyrinth(datafile_pathname) < 0)
+ {
+ print_error("fopen failed: %s (%s)",
+ strerror(errno), datafile_pathname);
+ exit(1);
+ }
+ }
+ }
location_stack
= (SDL_Point*)calloc(LOCATION_STACK_MAX, sizeof(SDL_Point));
animation.active = 0;