/* * 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 "game.h" #include "main-menu.h" #include "main.h" #include "output.h" #include "util.h" static SDL_Texture * _db_main_menu_text(TTF_Font *font, const char *text, SDL_Color *color, int width, SDL_Renderer *renderer, SDL_Rect *rect) { SDL_Surface *surface; SDL_Texture *texture; surface = TTF_RenderText_Blended_Wrapped(font, text, *color, width); if (surface == NULL) { db_err("Failed to create surface (%s)", TTF_GetError()); return NULL; } texture = SDL_CreateTextureFromSurface(renderer, surface); if (texture == NULL) { db_err("Failed to create texture (%s)", SDL_GetError()); return NULL; } rect->w = surface->w; rect->h = surface->h; SDL_FreeSurface(surface); return texture; } void db_main_menu(void) { const char *games_dir; char *font_path; SDL_Renderer *renderer; SDL_Color text_color; SDL_Color over_color; SDL_Rect dest_rect; TTF_Font *font; SDL_Texture *texture_title; struct db_game **games; int n; char *name_desc; SDL_Texture **texture_games_text; SDL_Texture **texture_games_over; int i; games_dir = db_get_games_dir(); font_path = db_strcat(db_get_fonts_dir(), "/UbuntuTitling-Bold.ttf"); renderer = db_get_renderer(); /* Render background */ SDL_SetRenderDrawColor(renderer, 0x7F, 0x7F, 0x7F, 0xFF); SDL_RenderClear(renderer); text_color.r = 0x00; text_color.g = 0x00; text_color.b = 0xFF; text_color.a = 0xFF; over_color.r = 0xFF; over_color.g = 0xFF; over_color.b = 0xFF; over_color.a = 0xFF; /* Render title text */ font = TTF_OpenFont(font_path, 48); if (font == NULL) { db_err("Failed to open font (%s)", TTF_GetError()); free(font_path); return; } texture_title = _db_main_menu_text(font, "Dodge Balls", &text_color, 0, renderer, &dest_rect); if (texture_title == NULL) { n = 0; goto err; } dest_rect.x = 16; dest_rect.y = 16; SDL_RenderCopy(renderer, texture_title, NULL, &dest_rect); SDL_DestroyTexture(texture_title); TTF_CloseFont(font); font = TTF_OpenFont(font_path, 16); if (font == NULL) { db_err("Failed to open font (%s)", TTF_GetError()); free(font_path); return; } /* Find games */ n = db_games_find(games_dir, &games); if (n > 0) { texture_games_text = calloc(n, sizeof(*texture_games_text)); if (texture_games_text == NULL) { goto err; } texture_games_over = calloc(n, sizeof(*texture_games_over)); if (texture_games_over == NULL) { goto err; } for (i = 0; i < n; ++i) { name_desc = malloc((strlen(db_game_get_name(games[i])) + strlen(db_game_get_desc( games[i])) + 2) * sizeof(*name_desc)); if (name_desc == NULL) { db_err("Failed to allocate memory"); goto err; } sprintf(name_desc, "%s\n%s", db_game_get_name(games[i]), db_game_get_desc(games[i])); texture_games_text[i] = _db_main_menu_text(font, name_desc, &text_color, 608, renderer, &dest_rect); if (texture_games_text[i] == NULL) { free(name_desc); goto err; } dest_rect.x = 16; dest_rect.y = 80 + 48 * i; SDL_RenderCopy(renderer, texture_games_text[i], NULL, &dest_rect); texture_games_over[i] = _db_main_menu_text(font, name_desc, &over_color, 608, renderer, &dest_rect); free(name_desc); if (texture_games_over[i] == NULL) { goto err; } } } SDL_RenderPresent(renderer); SDL_Delay(1000); err: if (n > 0) { for (i = 0; i < n; ++i) { db_game_free(games[i]); } free(games); } free(font_path); TTF_CloseFont(font); }