2011-08-24 14:14:44 +02:00
|
|
|
/*
|
|
|
|
Copyright (C) 2003 Parallel Realities
|
2015-03-01 21:37:32 +01:00
|
|
|
Copyright (C) 2011, 2012, 2013 Guus Sliepen
|
2020-05-24 03:10:45 +02:00
|
|
|
Copyright (C) 2012, 2015-2020 Layla Marchant <diligentcircle@riseup.net>
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
2015-02-26 17:20:36 +01:00
|
|
|
as published by the Free Software Foundation; either version 3
|
2011-08-24 14:14:44 +02:00
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2015-02-26 17:20:36 +01:00
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2015-02-26 17:20:36 +01:00
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2011-08-24 14:14:44 +02:00
|
|
|
*/
|
|
|
|
|
2019-06-07 06:18:24 +02:00
|
|
|
#include <libintl.h>
|
2017-01-25 16:48:29 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2017-01-25 16:48:29 +01:00
|
|
|
#include "SDL.h"
|
|
|
|
|
|
|
|
#include "colors.h"
|
2016-11-26 00:21:31 +01:00
|
|
|
#include "defs.h"
|
|
|
|
#include "structs.h"
|
|
|
|
|
2017-01-25 16:48:29 +01:00
|
|
|
#include "alien.h"
|
|
|
|
#include "audio.h"
|
|
|
|
#include "engine.h"
|
|
|
|
#include "explosion.h"
|
|
|
|
#include "game.h"
|
|
|
|
#include "gfx.h"
|
|
|
|
#include "player.h"
|
|
|
|
#include "renderer.h"
|
|
|
|
#include "save.h"
|
|
|
|
#include "screen.h"
|
|
|
|
#include "title.h"
|
|
|
|
#include "window.h"
|
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
static int showGameMenu(int continueSaveSlot)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_START_NEW_GAME, -1, MENU_Y);
|
|
|
|
screen_blitText(TS_LOAD_GAME, -1, MENU_Y + MENU_SPACING);
|
2015-03-03 05:32:48 +01:00
|
|
|
if (continueSaveSlot != -1)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_CONTINUE_CURRENT_GAME, -1, MENU_Y + 2 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_OPTIONS, -1, MENU_Y + 3 * MENU_SPACING);
|
|
|
|
screen_blitText(TS_CREDITS, -1, MENU_Y + 4 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
if (engine.cheat)
|
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
gfx_textSprites[TS_QUIT].y = MENU_SPACING;
|
|
|
|
screen_blitText(TS_CHEAT_OPTIONS, -1, MENU_Y + 5 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-06-01 21:12:02 +02:00
|
|
|
gfx_textSprites[TS_QUIT].y = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_QUIT, -1, MENU_Y + 5 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (engine.cheat)
|
2016-11-25 23:23:23 +01:00
|
|
|
return 7;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-25 23:23:23 +01:00
|
|
|
return 6;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
static int showLoadMenu()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2016-01-07 02:35:37 +01:00
|
|
|
int rtn = 1;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-03-03 05:32:48 +01:00
|
|
|
for (int i = TS_SAVESLOT_0 ; i <= TS_SAVESLOT_5 ; i++)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2015-03-03 05:32:48 +01:00
|
|
|
rtn++;
|
2016-01-04 04:39:16 +01:00
|
|
|
if (gfx_textSprites[i].image != NULL)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(i, -1, MENU_Y);
|
|
|
|
gfx_textSprites[TS_BACK_TO_MAIN_MENU].y = gfx_textSprites[i].y + 2 * MENU_SPACING;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_BACK_TO_MAIN_MENU, -1, MENU_Y);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
return rtn;
|
|
|
|
}
|
|
|
|
|
2012-12-09 16:11:55 +01:00
|
|
|
static void createDifficultyMenu()
|
|
|
|
{
|
2019-06-07 06:18:24 +02:00
|
|
|
char difficulty[STRMAX_SHORT];
|
|
|
|
char menutext[STRMAX_SHORT];
|
|
|
|
|
|
|
|
gfx_createTextObject(TS_START_GAME, _("START GAME"), 0, 0, FONT_WHITE);
|
|
|
|
|
|
|
|
game_getDifficultyText(difficulty, game.difficulty);
|
|
|
|
|
|
|
|
/// Difficulty menu option.
|
|
|
|
/// Retain "%s" as-is. It is replaced with the difficulty chosen.
|
|
|
|
snprintf(menutext, STRMAX_SHORT, _("DIFFICULTY - %s"), difficulty);
|
|
|
|
gfx_createTextObject(TS_DIFFICULTY, menutext, 0, 0, FONT_WHITE);
|
2012-12-09 16:11:55 +01:00
|
|
|
}
|
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
static int showDifficultyMenu()
|
2012-12-09 16:11:55 +01:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_START_GAME, -1, MENU_Y);
|
|
|
|
screen_blitText(TS_DIFFICULTY, -1, MENU_Y + MENU_SPACING);
|
2019-06-02 05:04:19 +02:00
|
|
|
gfx_textSprites[TS_BACK_TO_MAIN_MENU].y = 0;
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_BACK_TO_MAIN_MENU, -1, MENU_Y + 3 * MENU_SPACING);
|
2012-12-09 16:11:55 +01:00
|
|
|
|
2015-02-27 02:51:30 +01:00
|
|
|
return 3;
|
2012-12-09 16:11:55 +01:00
|
|
|
}
|
|
|
|
|
2011-08-26 21:29:04 +02:00
|
|
|
static void createOptionsMenu()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2011-08-26 22:48:52 +02:00
|
|
|
if (engine.useSound)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_SOUND, _("SOUND - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_SOUND, _("SOUND - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2011-08-26 22:48:52 +02:00
|
|
|
if (engine.useMusic)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_MUSIC, _("MUSIC - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_MUSIC, _("MUSIC - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2011-08-26 22:48:52 +02:00
|
|
|
if (engine.fullScreen)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_FULLSCREEN, _("FULLSCREEN - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_FULLSCREEN, _("FULLSCREEN - OFF"), 0, 0, FONT_WHITE);
|
2015-05-22 00:49:04 +02:00
|
|
|
|
|
|
|
if (engine.autoPause)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_AUTOPAUSE, _("AUTOPAUSE - ON"), 0, 0, FONT_WHITE);
|
2015-05-22 00:49:04 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_AUTOPAUSE, _("AUTOPAUSE - OFF"), 0, 0, FONT_WHITE);
|
2020-07-16 19:22:16 +02:00
|
|
|
|
|
|
|
if (engine.radioLife == RADIO_LIFE_INSTANT)
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - INSTANT"), 0, 0, FONT_WHITE);
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_FAST)
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - FAST"), 0, 0, FONT_WHITE);
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_NORMAL)
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - NORMAL"), 0, 0, FONT_WHITE);
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_SLOW)
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - SLOW"), 0, 0, FONT_WHITE);
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_SLOTH)
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - SLOTH"), 0, 0, FONT_WHITE);
|
|
|
|
else // Shouldn't happen, but adding this just in case
|
|
|
|
gfx_createTextObject(TS_RADIO_SPEED, _("MESSAGE SPEED - ERROR"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
static int showOptionsMenu()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_SOUND, -1, MENU_Y);
|
|
|
|
screen_blitText(TS_MUSIC, -1, MENU_Y + MENU_SPACING);
|
|
|
|
screen_blitText(TS_FULLSCREEN, -1, MENU_Y + 2 * MENU_SPACING);
|
|
|
|
screen_blitText(TS_AUTOPAUSE, -1, MENU_Y + 3 * MENU_SPACING);
|
2020-07-16 19:22:16 +02:00
|
|
|
screen_blitText(TS_RADIO_SPEED, -1, MENU_Y + 4 * MENU_SPACING);
|
2019-06-02 05:04:19 +02:00
|
|
|
gfx_textSprites[TS_BACK_TO_MAIN_MENU].y = 0;
|
2020-07-16 19:22:16 +02:00
|
|
|
screen_blitText(TS_BACK_TO_MAIN_MENU, -1, MENU_Y + 6 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2020-07-16 19:22:16 +02:00
|
|
|
return 6;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2011-08-26 21:29:04 +02:00
|
|
|
static void createCheatMenu()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
|
|
|
if (engine.cheatShield)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_SHIELD, _("UNLIMITED SHIELD - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_SHIELD, _("UNLIMITED SHIELD - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (engine.cheatAmmo)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_AMMO, _("UNLIMITED AMMO - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_AMMO, _("UNLIMITED AMMO - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (engine.cheatCash)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_CASH, _("UNLIMITED CASH - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_CASH, _("UNLIMITED CASH - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (engine.cheatTime)
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_TIME, _("UNLIMITED TIME - ON"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_UNLIMITED_TIME, _("UNLIMITED TIME - OFF"), 0, 0, FONT_WHITE);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
static int showCheatMenu()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_UNLIMITED_SHIELD, -1, MENU_Y);
|
|
|
|
screen_blitText(TS_UNLIMITED_AMMO, -1, MENU_Y + MENU_SPACING);
|
|
|
|
screen_blitText(TS_UNLIMITED_CASH, -1, MENU_Y + 2 * MENU_SPACING);
|
|
|
|
screen_blitText(TS_UNLIMITED_TIME, -1, MENU_Y + 3 * MENU_SPACING);
|
2019-06-02 05:04:19 +02:00
|
|
|
gfx_textSprites[TS_BACK_TO_MAIN_MENU].y = 0;
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_blitText(TS_BACK_TO_MAIN_MENU, -1, MENU_Y + 5 * MENU_SPACING);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
return 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
This is the main title screen, with the stars whirling past and the
|
|
|
|
"Parallel Realities, Present..." text. Nothing too special.
|
|
|
|
*/
|
2016-11-25 23:10:08 +01:00
|
|
|
int title_show()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-05-31 00:02:33 +02:00
|
|
|
int continueSaveSlot;
|
2016-01-07 02:35:37 +01:00
|
|
|
|
|
|
|
int then;
|
|
|
|
int now;
|
2019-06-05 01:10:24 +02:00
|
|
|
int x;
|
|
|
|
int y;
|
2016-01-07 02:35:37 +01:00
|
|
|
|
|
|
|
int redGlow = 255;
|
|
|
|
int redDir = -2;
|
2020-03-05 22:44:13 +01:00
|
|
|
char buildVersion[STRMAX_SHORT];
|
2016-01-07 02:35:37 +01:00
|
|
|
|
|
|
|
int selectedOption = 1;
|
2016-11-19 17:43:50 +01:00
|
|
|
int skip = 0;
|
2016-11-25 23:23:23 +01:00
|
|
|
int listLength = 6; // menu list length
|
2016-01-07 02:35:37 +01:00
|
|
|
int menuType = MENU_MAIN;
|
2019-06-06 04:13:48 +02:00
|
|
|
|
2019-06-05 01:10:24 +02:00
|
|
|
SDL_Surface *copyrightText;
|
|
|
|
SDL_Surface *infoText;
|
2016-01-07 02:35:37 +01:00
|
|
|
|
2015-05-21 01:41:43 +02:00
|
|
|
game_init();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
engine.gameSection = SECTION_TITLE;
|
|
|
|
|
2015-11-02 23:53:05 +01:00
|
|
|
screen_flushBuffer();
|
2016-01-02 22:59:48 +01:00
|
|
|
gfx_free();
|
2016-11-23 03:16:49 +01:00
|
|
|
engine_resetLists();
|
2019-06-06 04:13:48 +02:00
|
|
|
|
2011-08-24 14:14:44 +02:00
|
|
|
// required to stop the title screen crashing
|
2015-05-21 01:41:43 +02:00
|
|
|
game.system = 0;
|
|
|
|
game.area = MISN_START;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-25 18:50:32 +01:00
|
|
|
gfx_loadSprites();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-11-07 03:35:07 +01:00
|
|
|
screen_clear(black);
|
2015-10-27 01:07:31 +01:00
|
|
|
renderer_update();
|
2015-11-07 03:35:07 +01:00
|
|
|
screen_clear(black);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2019-05-31 00:02:33 +02:00
|
|
|
continueSaveSlot = save_initSlots();
|
|
|
|
|
2016-11-25 18:50:32 +01:00
|
|
|
gfx_loadBackground("gfx/spirit.jpg");
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
SDL_Surface *prlogo, *sflogo;
|
2016-01-02 22:59:48 +01:00
|
|
|
prlogo = gfx_loadImage("gfx/prlogo.png");
|
|
|
|
sflogo = gfx_loadImage("gfx/sflogo.png");
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2019-06-01 21:12:02 +02:00
|
|
|
gfx_createTextObject(TS_PRESENTS, "PRESENTS", 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_AN_SDL_GAME, "AN SDL GAME", 0, 0, FONT_WHITE);
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_START_NEW_GAME, _("START NEW GAME"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_LOAD_GAME, _("LOAD GAME"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_CONTINUE_CURRENT_GAME, _("CONTINUE CURRENT GAME"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_OPTIONS, _("OPTIONS"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_CREDITS, _("CREDITS"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_CHEAT_OPTIONS, _("CHEAT OPTIONS"), 0, 0, FONT_WHITE);
|
|
|
|
gfx_createTextObject(TS_QUIT, _("QUIT"), 0, 0, FONT_WHITE);
|
2019-05-31 00:02:33 +02:00
|
|
|
|
|
|
|
createOptionsMenu();
|
|
|
|
createDifficultyMenu();
|
2019-06-07 06:18:24 +02:00
|
|
|
gfx_createTextObject(TS_BACK_TO_MAIN_MENU, _("BACK TO MAIN MENU"), 0, 0, FONT_WHITE);
|
2019-05-31 00:02:33 +02:00
|
|
|
|
|
|
|
createCheatMenu();
|
|
|
|
|
2019-06-06 04:13:48 +02:00
|
|
|
copyrightText = gfx_createSurface(screen->w, 3 * MENU_SPACING);
|
2019-06-05 01:10:24 +02:00
|
|
|
gfx_renderString("Copyright Parallel Realities 2003",
|
|
|
|
5, 0, FONT_WHITE, 0, copyrightText);
|
|
|
|
gfx_renderString("Copyright Guus Sliepen, Astrid S. de Wijn and others 2012",
|
2019-06-06 04:13:48 +02:00
|
|
|
5, MENU_SPACING, FONT_WHITE, 0, copyrightText);
|
2020-05-24 03:10:45 +02:00
|
|
|
gfx_renderString("Copyright 2015-2020 Layla Marchant",
|
2019-06-06 04:13:48 +02:00
|
|
|
5, 2 * MENU_SPACING, FONT_WHITE, 0, copyrightText);
|
2019-06-05 01:10:24 +02:00
|
|
|
|
2020-03-05 22:44:13 +01:00
|
|
|
snprintf(buildVersion, STRMAX_SHORT, "Version %s", VERSION );
|
2019-06-06 04:13:48 +02:00
|
|
|
infoText = gfx_createSurface(strlen(buildVersion) * (PIXFONT_W + 1) + 6, MENU_SPACING);
|
2019-06-05 01:10:24 +02:00
|
|
|
gfx_renderString(buildVersion, 0, 0, FONT_WHITE, 0, infoText);
|
|
|
|
|
2011-08-24 14:14:44 +02:00
|
|
|
// Set the star motion
|
|
|
|
engine.ssx = -0.5;
|
|
|
|
engine.ssy = 0;
|
2015-02-27 05:23:08 +01:00
|
|
|
engine.smx = 0;
|
|
|
|
engine.smy = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-01-07 02:35:37 +01:00
|
|
|
then = SDL_GetTicks();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
for (int i = 0 ; i < 15 ; i++)
|
|
|
|
{
|
2015-03-07 15:42:24 +01:00
|
|
|
aliens[i] = alien_defs[rand() % 3];
|
2011-08-24 14:14:44 +02:00
|
|
|
if ((rand() % 5) == 0)
|
2015-03-07 15:42:24 +01:00
|
|
|
aliens[i] = alien_defs[CD_TRANSPORTSHIP];
|
2011-08-24 14:14:44 +02:00
|
|
|
if ((rand() % 5) == 0)
|
2015-03-07 15:42:24 +01:00
|
|
|
aliens[i] = alien_defs[CD_MINER];
|
|
|
|
aliens[i].x = rand() % screen->w;
|
|
|
|
aliens[i].y = rand() % (screen->h - 40);
|
|
|
|
aliens[i].dx = 1 + rand() % 3;
|
|
|
|
aliens[i].face = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
SDL_Rect optionRec;
|
2019-05-31 00:02:33 +02:00
|
|
|
|
2019-06-07 06:18:24 +02:00
|
|
|
optionRec.x = screen->w / 2 - MENU_W / 2;
|
2019-06-06 04:13:48 +02:00
|
|
|
optionRec.y = MENU_Y - 5;
|
|
|
|
optionRec.h = MENU_SPACING + 2;
|
2019-06-07 06:18:24 +02:00
|
|
|
optionRec.w = MENU_W;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2019-05-31 00:02:33 +02:00
|
|
|
if (continueSaveSlot != -1)
|
|
|
|
{
|
|
|
|
selectedOption = 3;
|
|
|
|
optionRec.y += 40;
|
|
|
|
}
|
|
|
|
|
2015-11-07 01:43:34 +01:00
|
|
|
screen_drawBackground();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_RUNNING;
|
2016-11-26 00:01:36 +01:00
|
|
|
player_flushInput();
|
2013-09-30 16:52:43 +02:00
|
|
|
engine.keyState[KEY_FIRE] = engine.keyState[KEY_ALTFIRE] = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-03-08 15:38:58 +01:00
|
|
|
audio_playMusic("music/walking_among_androids.ogg", 1);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
while (!engine.done)
|
|
|
|
{
|
2015-10-27 01:07:31 +01:00
|
|
|
renderer_update();
|
2015-11-02 23:53:05 +01:00
|
|
|
screen_unBuffer();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
now = SDL_GetTicks();
|
|
|
|
|
2015-06-20 17:58:37 +02:00
|
|
|
game_doStars();
|
2015-05-01 00:51:26 +02:00
|
|
|
game_doExplosions();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
for (int i = 0 ; i < 15 ; i++)
|
|
|
|
{
|
2015-05-01 00:51:26 +02:00
|
|
|
explosion_addEngine(&aliens[i]);
|
2015-03-07 15:42:24 +01:00
|
|
|
aliens[i].x += aliens[i].dx;
|
2015-09-26 14:49:21 +02:00
|
|
|
screen_blit(aliens[i].image[0], (int)aliens[i].x, (int)aliens[i].y);
|
2016-01-04 00:19:20 +01:00
|
|
|
if (aliens[i].x > screen->w + 30)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2015-03-07 15:42:24 +01:00
|
|
|
aliens[i].x = -40;
|
|
|
|
aliens[i].y = rand() % (screen->h - 20);
|
|
|
|
aliens[i].dx = 1 + rand() % 3;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((now - then > 2000) && (now - then < 8000) && (!skip))
|
|
|
|
{
|
2019-06-01 21:12:02 +02:00
|
|
|
screen_blit(prlogo, ((screen->w - prlogo->w) / 2), ((screen->h - prlogo->h) / 2));
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else if ((now - then > 9000) && (now - then < 15000) && (!skip))
|
|
|
|
{
|
2019-06-01 21:12:02 +02:00
|
|
|
screen_blitText(TS_PRESENTS, -1, screen->h / 2);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else if ((now - then > 16000) && (now - then < 21000) && (!skip))
|
|
|
|
{
|
2019-06-01 21:12:02 +02:00
|
|
|
screen_blitText(TS_AN_SDL_GAME, -1, screen->h / 2);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else if ((now - then > 25500) || (skip))
|
|
|
|
{
|
2019-06-01 21:12:02 +02:00
|
|
|
screen_blit(sflogo, ((screen->w - sflogo->w) / 2), ((screen->h - sflogo->h) / 3));
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if ((now - then >= 27500) || (skip))
|
|
|
|
{
|
2019-06-07 06:18:24 +02:00
|
|
|
optionRec.x = screen->w / 2 - optionRec.w / 2;
|
2019-06-06 04:13:48 +02:00
|
|
|
optionRec.y = (MENU_Y - 4 - MENU_SPACING) + MENU_SPACING * selectedOption;
|
2019-06-01 21:12:02 +02:00
|
|
|
if (menuType > MENU_MAIN)
|
|
|
|
if (selectedOption == listLength)
|
2019-06-06 04:13:48 +02:00
|
|
|
optionRec.y += MENU_SPACING;
|
|
|
|
|
2015-12-31 16:47:27 +01:00
|
|
|
screen_drawRect(optionRec.x, optionRec.y, optionRec.w, optionRec.h, redGlow, 0x00, 0x00);
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_addBuffer(optionRec.x, optionRec.y, optionRec.w + 1, optionRec.h + 1);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
switch(menuType)
|
|
|
|
{
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_MAIN:
|
2011-08-24 14:14:44 +02:00
|
|
|
listLength = showGameMenu(continueSaveSlot);
|
|
|
|
break;
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_DIFFICULTY:
|
|
|
|
listLength = showDifficultyMenu();
|
|
|
|
break;
|
|
|
|
case MENU_LOAD:
|
2011-08-24 14:14:44 +02:00
|
|
|
listLength = showLoadMenu();
|
|
|
|
break;
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_OPTIONS:
|
2011-08-24 14:14:44 +02:00
|
|
|
listLength = showOptionsMenu();
|
|
|
|
break;
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_CHEAT:
|
2011-08-24 14:14:44 +02:00
|
|
|
listLength = showCheatMenu();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-06-06 04:13:48 +02:00
|
|
|
screen_addBuffer(optionRec.x - 1, MENU_Y, optionRec.w + 2, listLength * MENU_SPACING);
|
|
|
|
|
2011-08-24 14:14:44 +02:00
|
|
|
redGlow += redDir;
|
|
|
|
if (redGlow <= 0) {redDir = 2; redGlow = 0;}
|
|
|
|
if (redGlow >= 255) {redDir = -2; redGlow = 255;}
|
|
|
|
|
2013-09-30 16:52:43 +02:00
|
|
|
if (engine.keyState[KEY_UP])
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2013-09-30 16:52:43 +02:00
|
|
|
engine.keyState[KEY_UP] = 0;
|
2015-03-24 23:51:12 +01:00
|
|
|
WRAP_ADD(selectedOption, -1, 1, listLength + 1);
|
2019-05-31 00:02:33 +02:00
|
|
|
if (menuType == MENU_MAIN)
|
|
|
|
if (selectedOption == 3)
|
|
|
|
if (continueSaveSlot == -1)
|
|
|
|
selectedOption = 2;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
2013-09-30 16:52:43 +02:00
|
|
|
if (engine.keyState[KEY_DOWN])
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2013-09-30 16:52:43 +02:00
|
|
|
engine.keyState[KEY_DOWN] = 0;
|
2015-03-24 23:51:12 +01:00
|
|
|
WRAP_ADD(selectedOption, 1, 0, listLength);
|
2015-03-03 05:32:48 +01:00
|
|
|
if (menuType == MENU_MAIN)
|
2016-01-10 04:30:25 +01:00
|
|
|
if (selectedOption == 3)
|
2015-03-03 05:32:48 +01:00
|
|
|
if (continueSaveSlot == -1)
|
2011-08-24 14:14:44 +02:00
|
|
|
selectedOption = 4;
|
|
|
|
}
|
|
|
|
|
2019-06-05 01:10:24 +02:00
|
|
|
x = 0;
|
|
|
|
y = screen->h - copyrightText->h;
|
|
|
|
screen_blit(copyrightText, x, y);
|
|
|
|
screen_addBuffer(x, y, copyrightText->w, copyrightText->h);
|
2019-06-06 04:13:48 +02:00
|
|
|
|
2019-06-05 01:10:24 +02:00
|
|
|
x = screen->w - infoText->w;
|
|
|
|
y = screen->h - infoText->h;
|
|
|
|
screen_blit(infoText, x, y);
|
|
|
|
screen_addBuffer(x, y, infoText->w, infoText->h);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-26 00:01:36 +01:00
|
|
|
player_getInput();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2013-09-30 16:52:43 +02:00
|
|
|
if ((engine.keyState[KEY_FIRE] || engine.keyState[KEY_ALTFIRE]))
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
|
|
|
if ((now - then <= 27500) && (!skip))
|
|
|
|
{
|
2016-11-19 17:43:50 +01:00
|
|
|
skip = 1;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-03-03 05:32:48 +01:00
|
|
|
switch (menuType)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_MAIN:
|
2012-12-09 16:11:55 +01:00
|
|
|
if (selectedOption == 1)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_DIFFICULTY;
|
|
|
|
selectedOption = 1;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 2)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_LOAD;
|
|
|
|
selectedOption = 1;
|
|
|
|
}
|
2012-12-09 16:11:55 +01:00
|
|
|
else if (selectedOption == 3)
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 4)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_OPTIONS;
|
2020-07-16 19:22:16 +02:00
|
|
|
selectedOption = 6;
|
2015-03-03 05:32:48 +01:00
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 5)
|
2016-11-25 23:23:23 +01:00
|
|
|
{
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2016-11-25 23:23:23 +01:00
|
|
|
}
|
|
|
|
else if (selectedOption == 6)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
|
|
|
if (engine.cheat)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_CHEAT;
|
|
|
|
selectedOption = 1;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
2016-11-25 23:23:23 +01:00
|
|
|
else if (selectedOption == 7)
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2011-08-24 14:14:44 +02:00
|
|
|
break;
|
|
|
|
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_DIFFICULTY:
|
|
|
|
if (selectedOption == 1)
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2015-03-03 05:32:48 +01:00
|
|
|
else if (selectedOption == 2)
|
|
|
|
{
|
2015-05-21 01:41:43 +02:00
|
|
|
game.difficulty++;
|
|
|
|
game.difficulty %= DIFFICULTY_MAX;
|
2015-03-03 05:32:48 +01:00
|
|
|
}
|
|
|
|
else if (selectedOption == listLength)
|
|
|
|
{
|
|
|
|
menuType = MENU_MAIN;
|
|
|
|
selectedOption = 1;
|
|
|
|
}
|
|
|
|
createDifficultyMenu();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MENU_LOAD:
|
2011-08-24 14:14:44 +02:00
|
|
|
if (selectedOption != listLength)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_CLOSING;
|
2015-03-03 05:32:48 +01:00
|
|
|
continueSaveSlot = selectedOption - 1;
|
|
|
|
selectedOption = 3;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_MAIN;
|
|
|
|
selectedOption = 1;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
break;
|
|
|
|
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_OPTIONS:
|
2011-08-24 14:14:44 +02:00
|
|
|
if ((selectedOption == 1) && (engine.useAudio))
|
2017-02-05 18:31:08 +01:00
|
|
|
{
|
2011-08-26 22:48:52 +02:00
|
|
|
engine.useSound = !engine.useSound;
|
2017-02-05 18:31:08 +01:00
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else if ((selectedOption == 2) && (engine.useAudio))
|
|
|
|
{
|
2011-08-26 22:48:52 +02:00
|
|
|
engine.useMusic = !engine.useMusic;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2011-08-26 22:48:52 +02:00
|
|
|
if (engine.useMusic)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2019-06-07 06:18:24 +02:00
|
|
|
audio_playMusic("music/walking_among_androids.ogg", 1);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-03-08 15:38:58 +01:00
|
|
|
audio_haltMusic();
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (selectedOption == 3)
|
|
|
|
{
|
2017-02-05 18:24:22 +01:00
|
|
|
engine.fullScreen = !engine.fullScreen;
|
|
|
|
SDL_SetWindowFullscreen(window,
|
2017-02-05 22:40:59 +01:00
|
|
|
(engine.fullScreen ? FULLSCREEN : 0));
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
2015-05-22 00:49:04 +02:00
|
|
|
else if (selectedOption == 4)
|
|
|
|
{
|
|
|
|
engine.autoPause = !engine.autoPause;
|
|
|
|
}
|
2020-07-16 19:22:16 +02:00
|
|
|
else if (selectedOption == 5)
|
|
|
|
{
|
|
|
|
if (engine.radioLife == RADIO_LIFE_INSTANT)
|
|
|
|
engine.radioLife = RADIO_LIFE_FAST;
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_FAST)
|
|
|
|
engine.radioLife = RADIO_LIFE_NORMAL;
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_NORMAL)
|
|
|
|
engine.radioLife = RADIO_LIFE_SLOW;
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_SLOW)
|
|
|
|
engine.radioLife = RADIO_LIFE_SLOTH;
|
|
|
|
else if (engine.radioLife == RADIO_LIFE_SLOTH)
|
|
|
|
engine.radioLife = RADIO_LIFE_INSTANT;
|
|
|
|
else // Just in case
|
|
|
|
engine.radioLife = RADIO_LIFE_NORMAL;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == listLength)
|
2015-03-03 05:32:48 +01:00
|
|
|
{
|
|
|
|
menuType = MENU_MAIN;
|
2017-02-05 18:31:08 +01:00
|
|
|
selectedOption = 4;
|
2015-03-03 05:32:48 +01:00
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
createOptionsMenu();
|
|
|
|
break;
|
|
|
|
|
2015-03-03 05:32:48 +01:00
|
|
|
case MENU_CHEAT:
|
2011-08-24 14:14:44 +02:00
|
|
|
if (selectedOption == 1)
|
2011-08-26 16:14:58 +02:00
|
|
|
engine.cheatShield = !engine.cheatShield;
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 2)
|
2011-08-26 16:14:58 +02:00
|
|
|
engine.cheatAmmo = !engine.cheatAmmo;
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 3)
|
2011-08-26 16:14:58 +02:00
|
|
|
engine.cheatCash = !engine.cheatCash;
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == 4)
|
2011-08-26 16:14:58 +02:00
|
|
|
engine.cheatTime = !engine.cheatTime;
|
2011-08-24 14:14:44 +02:00
|
|
|
else if (selectedOption == listLength)
|
2015-02-28 01:52:55 +01:00
|
|
|
{
|
2015-03-03 05:32:48 +01:00
|
|
|
menuType = MENU_MAIN;
|
|
|
|
selectedOption = 1;
|
2015-02-28 01:52:55 +01:00
|
|
|
}
|
2015-03-03 05:32:48 +01:00
|
|
|
createCheatMenu();
|
2012-12-09 16:11:55 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2015-03-03 05:32:48 +01:00
|
|
|
menuType = MENU_MAIN;
|
|
|
|
selectedOption = 1;
|
2011-08-24 14:14:44 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2017-02-05 18:24:22 +01:00
|
|
|
engine.keyState[KEY_FIRE] = 0;
|
|
|
|
engine.keyState[KEY_ALTFIRE] = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2015-11-07 03:35:07 +01:00
|
|
|
game_delayFrame();
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2015-03-08 15:38:58 +01:00
|
|
|
audio_haltMusic();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
SDL_FreeSurface(prlogo);
|
|
|
|
SDL_FreeSurface(sflogo);
|
2019-06-05 01:10:24 +02:00
|
|
|
SDL_FreeSurface(copyrightText);
|
|
|
|
SDL_FreeSurface(infoText);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2017-02-05 18:24:22 +01:00
|
|
|
engine.keyState[KEY_FIRE] = 0;
|
|
|
|
engine.keyState[KEY_ALTFIRE] = 0;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-23 03:16:49 +01:00
|
|
|
engine_resetLists();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (selectedOption == 1)
|
2015-02-27 02:51:30 +01:00
|
|
|
{
|
2015-05-21 01:41:43 +02:00
|
|
|
game_init();
|
2011-08-24 14:14:44 +02:00
|
|
|
selectedOption = 2; // go straight to mission 0
|
2015-02-27 02:51:30 +01:00
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
if (selectedOption == 3)
|
|
|
|
{
|
2015-05-21 01:41:43 +02:00
|
|
|
game_init();
|
2016-11-17 01:43:03 +01:00
|
|
|
selectedOption = save_load(continueSaveSlot);
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2016-11-25 23:23:23 +01:00
|
|
|
if (selectedOption == 5)
|
|
|
|
{
|
|
|
|
title_showCredits();
|
|
|
|
selectedOption = 0;
|
|
|
|
}
|
|
|
|
|
2011-08-24 14:14:44 +02:00
|
|
|
// Send back a negative number...
|
2016-11-25 23:23:23 +01:00
|
|
|
if (selectedOption > 5)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
|
|
|
selectedOption = -1;
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return selectedOption;
|
|
|
|
}
|
|
|
|
|
2016-11-25 23:10:08 +01:00
|
|
|
void title_showCredits()
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2016-11-25 18:50:32 +01:00
|
|
|
gfx_loadBackground("gfx/credits.jpg");
|
2015-11-02 23:53:05 +01:00
|
|
|
screen_flushBuffer();
|
2016-01-02 22:59:48 +01:00
|
|
|
gfx_free();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
FILE *fp;
|
2019-06-12 17:25:03 +02:00
|
|
|
int lastCredit;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
|
|
|
int yPos = 0;
|
2012-03-12 04:16:56 +01:00
|
|
|
int yPos2 = screen->h;
|
2019-06-02 17:28:26 +02:00
|
|
|
char text[STRMAX];
|
2015-02-27 23:59:25 +01:00
|
|
|
int i;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-26 00:35:25 +01:00
|
|
|
TextObject *credit;
|
2019-06-12 17:25:03 +02:00
|
|
|
int nCredit;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-11-07 03:35:07 +01:00
|
|
|
screen_clear(black);
|
2015-10-27 01:07:31 +01:00
|
|
|
renderer_update();
|
2015-11-07 03:35:07 +01:00
|
|
|
screen_clear(black);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-11-07 01:43:34 +01:00
|
|
|
screen_drawBackground();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-03-08 15:38:58 +01:00
|
|
|
audio_playMusic("music/rise_of_spirit.ogg", 1);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2015-02-27 23:59:25 +01:00
|
|
|
fp = fopen("data/credits.txt", "rb");
|
2019-06-12 17:25:03 +02:00
|
|
|
|
|
|
|
nCredit = 0;
|
|
|
|
while (fscanf(fp, "%d %[^\n]%*c", &yPos, text) == 2)
|
|
|
|
{
|
|
|
|
nCredit++;
|
|
|
|
}
|
|
|
|
fseek(fp, 0, SEEK_SET);
|
|
|
|
|
|
|
|
credit = malloc(nCredit * sizeof(*credit));
|
2019-05-23 17:25:54 +02:00
|
|
|
if (credit == NULL)
|
|
|
|
{
|
|
|
|
engine_warn("Failed to allocate memory for credits");
|
|
|
|
return;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2019-06-12 17:25:03 +02:00
|
|
|
lastCredit = -1;
|
2015-02-27 23:59:25 +01:00
|
|
|
while (fscanf(fp, "%d %[^\n]%*c", &yPos, text) == 2)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2015-02-27 23:59:25 +01:00
|
|
|
lastCredit++;
|
2019-06-12 17:25:03 +02:00
|
|
|
if (lastCredit < nCredit)
|
|
|
|
{
|
|
|
|
credit[lastCredit].image = gfx_createTextSurface(text, FONT_WHITE);
|
|
|
|
credit[lastCredit].x = (screen->w - credit[lastCredit].image->w) / 2;
|
|
|
|
yPos2 += yPos;
|
|
|
|
credit[lastCredit].y = yPos2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
engine_warn("Credit size reached, but still scanning the file!");
|
|
|
|
lastCredit--;
|
|
|
|
break;
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2015-02-27 23:59:25 +01:00
|
|
|
fclose(fp);
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2020-05-24 03:10:45 +02:00
|
|
|
engine.done = ENGINE_RUNNING;
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2013-09-30 16:52:43 +02:00
|
|
|
engine.keyState[KEY_ESCAPE] = 0;
|
2015-05-20 16:53:10 +02:00
|
|
|
engine.keyState[KEY_FIRE] = 0;
|
|
|
|
engine.keyState[KEY_ALTFIRE] = 0;
|
2016-11-26 00:01:36 +01:00
|
|
|
player_flushInput();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-19 17:43:50 +01:00
|
|
|
while (1)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2015-10-27 01:07:31 +01:00
|
|
|
renderer_update();
|
2015-11-02 23:53:05 +01:00
|
|
|
screen_unBuffer();
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2016-11-26 00:01:36 +01:00
|
|
|
player_getInput();
|
2020-11-23 05:03:38 +01:00
|
|
|
if (engine.keyState[KEY_ESCAPE] || engine.keyState[KEY_FIRE]
|
|
|
|
|| engine.keyState[KEY_ALTFIRE])
|
2011-08-24 14:14:44 +02:00
|
|
|
break;
|
2020-12-26 02:06:41 +01:00
|
|
|
|
|
|
|
// Check to see if we need to reposition credits
|
|
|
|
if (credit[0].x != (screen->w - credit[0].image->w) / 2) {
|
|
|
|
for (i=0; i< nCredit; i++) {
|
|
|
|
credit[i].x = (screen->w - credit[i].image->w) / 2;
|
|
|
|
}
|
|
|
|
}
|
2011-08-24 14:14:44 +02:00
|
|
|
|
2011-08-27 00:29:23 +02:00
|
|
|
float speed = 0.5;
|
2019-05-30 17:32:50 +02:00
|
|
|
if (engine.keyState[KEY_DOWN])
|
2011-08-27 00:29:23 +02:00
|
|
|
speed = 2;
|
2019-05-30 17:32:50 +02:00
|
|
|
else if (engine.keyState[KEY_UP])
|
2011-08-27 00:29:23 +02:00
|
|
|
speed = -2;
|
|
|
|
|
2015-02-27 23:59:25 +01:00
|
|
|
for (i = 0 ; i <= lastCredit ; i++)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
2012-03-12 04:16:56 +01:00
|
|
|
if ((credit[i].y > -10) && (credit[i].y < (screen->h + 10)))
|
2015-09-26 14:49:21 +02:00
|
|
|
screen_blit(credit[i].image, (int)credit[i].x, (int)credit[i].y);
|
2012-03-14 17:02:04 +01:00
|
|
|
if (speed > 0 && credit[lastCredit].y > ((screen->h / 2) + 100))
|
2011-08-27 00:29:23 +02:00
|
|
|
credit[i].y -= speed;
|
2012-03-12 04:16:56 +01:00
|
|
|
else if(speed < 0 && credit[0].y < screen->h)
|
2011-08-27 00:29:23 +02:00
|
|
|
credit[i].y -= speed;
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2015-11-07 03:35:07 +01:00
|
|
|
game_delayFrame();
|
2011-08-24 14:14:44 +02:00
|
|
|
}
|
|
|
|
|
2015-02-27 23:59:25 +01:00
|
|
|
for (i = 0 ; i <= lastCredit ; i++)
|
2011-08-24 14:14:44 +02:00
|
|
|
{
|
|
|
|
SDL_FreeSurface(credit[i].image);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(credit);
|
|
|
|
}
|
|
|
|
|