/* * Copyright (C) 2021 P. J. McDermott * * This file is part of Dodge Balls * * Dodge Balls is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dodge Balls is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dodge Balls. If not, see . */ #include #include #include #include #include #include #include "game.h" #include "output.h" static void _db_find_dirs(char *program_name, const char **games_dir, const char **fonts_dir) { char *program_dir; program_dir = realpath(dirname(program_name), NULL); if (strcmp(program_dir, ABS_BUILDDIR) == 0) { /* Running in place */ *games_dir = ABS_BUILDDIR "/games"; *fonts_dir = ABS_BUILDDIR "/fonts"; } else { /* Running from installation */ *games_dir = GAMESDIR; *fonts_dir = FONTSDIR; } free(program_dir); } static int _db_init(SDL_Window **window, SDL_Renderer **renderer, SDL_Texture **texture) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { db_err("Failed to initialize SDL (%s)", SDL_GetError()); return -1; } if (TTF_Init() < 0) { db_err("Failed to initialize SDL_ttf (%s)", TTF_GetError()); return -1; } *window = SDL_CreateWindow("Dodge Balls", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0); if (*window == NULL) { db_err("Failed to create window (%s)", SDL_GetError()); SDL_Quit(); return -1; } *renderer = SDL_CreateRenderer(*window, -1, 0); if (*renderer == NULL) { db_err("Failed to create renderer (%s)", SDL_GetError()); SDL_DestroyWindow(*window); SDL_Quit(); return -1; } *texture = SDL_CreateTexture(*renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 640, 480); if (*texture == NULL) { db_err("Failed to create texture (%s)", SDL_GetError()); SDL_DestroyRenderer(*renderer); SDL_DestroyWindow(*window); SDL_Quit(); return -1; } SDL_DisableScreenSaver(); return 0; } static void _db_quit(SDL_Window *window, SDL_Renderer *renderer, SDL_Texture *texture) { SDL_EnableScreenSaver(); SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); SDL_Quit(); } int main(int argc, char *argv[]) { const char *games_dir; const char *fonts_dir; SDL_Window *window; SDL_Renderer *renderer; SDL_Texture *texture; struct db_game **games; int n; int i; /* Find data directories */ _db_find_dirs(argv[0], &games_dir, &fonts_dir); /* Initialize SDL libraries */ if (_db_init(&window, &renderer, &texture) < 0) { return EXIT_FAILURE; } /* Find games */ n = db_games_find(games_dir, &games); if (n > 0) { printf("%d games:\n", n); for (i = 0; i < n; ++i) { printf("\t%s - %s\n", db_game_get_name(games[i]), db_game_get_desc(games[i])); db_game_free(games[i]); } free(games); } SDL_SetRenderDrawColor(renderer, 0x7F, 0x7F, 0x7F, 0xFF); SDL_RenderClear(renderer); SDL_RenderPresent(renderer); SDL_Delay(1000); /* Quit SDL libraries */ _db_quit(window, renderer, texture); return EXIT_SUCCESS; }