2012-02-28 13:09:12 +01:00
|
|
|
/*! \file main.h
|
|
|
|
* \brief Headers of main file of SuperDerpy engine.
|
|
|
|
*
|
|
|
|
* Contains basic functions shared by all views.
|
|
|
|
*/
|
2012-03-04 13:32:42 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) Sebastian Krzyszkowiak <dos@dosowisko.net>
|
|
|
|
*
|
|
|
|
* This program 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 2 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
|
|
|
|
* 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 this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
2012-02-16 15:40:58 +01:00
|
|
|
#ifndef MAIN_H
|
|
|
|
#define MAIN_H
|
|
|
|
|
|
|
|
#include <allegro5/allegro.h>
|
|
|
|
#include <allegro5/allegro_audio.h>
|
|
|
|
#include <allegro5/allegro_acodec.h>
|
|
|
|
#include <allegro5/allegro_image.h>
|
|
|
|
#include <allegro5/allegro_font.h>
|
|
|
|
#include <allegro5/allegro_ttf.h>
|
2012-05-09 10:58:45 +02:00
|
|
|
#include "allegro_utils.h"
|
2012-02-16 15:40:58 +01:00
|
|
|
|
2012-05-19 18:09:20 +02:00
|
|
|
/*! \brief Declares variables used by displaying progress bar on loading screen.
|
|
|
|
* Takes number of loading steps as parameter.
|
|
|
|
*/
|
2012-05-18 18:34:07 +02:00
|
|
|
#define PROGRESS_INIT(a) float load_p = 0, load_a = a;
|
2012-05-19 18:09:20 +02:00
|
|
|
/*! \brief Increments progress of loading. */
|
2012-05-18 18:34:07 +02:00
|
|
|
#define PROGRESS if (progress) (*progress)(game, load_p+=1/load_a);
|
|
|
|
|
2012-05-03 13:20:25 +02:00
|
|
|
struct Game;
|
|
|
|
|
2012-02-28 13:09:12 +01:00
|
|
|
/*! \brief Enum of all available gamestates. */
|
2012-02-16 15:40:58 +01:00
|
|
|
enum gamestate_enum {
|
2012-03-02 16:52:13 +01:00
|
|
|
GAMESTATE_PAUSE,
|
2012-02-16 15:40:58 +01:00
|
|
|
GAMESTATE_LOADING,
|
2012-02-17 00:19:21 +01:00
|
|
|
GAMESTATE_MENU,
|
|
|
|
GAMESTATE_ABOUT,
|
2012-02-18 05:53:39 +01:00
|
|
|
GAMESTATE_INTRO,
|
2012-02-21 23:33:02 +01:00
|
|
|
GAMESTATE_MAP,
|
2012-07-08 15:52:56 +02:00
|
|
|
GAMESTATE_LEVEL,
|
|
|
|
GAMESTATE_DISCLAIMER
|
2012-02-16 15:40:58 +01:00
|
|
|
};
|
|
|
|
|
2012-03-07 22:06:19 +01:00
|
|
|
/*! \brief Enum of menu states in Menu and Pause game states. */
|
|
|
|
enum menustate_enum {
|
|
|
|
MENUSTATE_MAIN,
|
|
|
|
MENUSTATE_OPTIONS,
|
|
|
|
MENUSTATE_CONTROLS,
|
|
|
|
MENUSTATE_VIDEO,
|
2012-03-13 12:42:28 +01:00
|
|
|
MENUSTATE_PAUSE,
|
|
|
|
MENUSTATE_AUDIO
|
2012-03-07 22:06:19 +01:00
|
|
|
};
|
|
|
|
|
2012-02-28 13:09:12 +01:00
|
|
|
/*! \brief Resources used by Menu state. */
|
2012-02-16 15:40:58 +01:00
|
|
|
struct Menu {
|
2012-09-03 02:25:32 +02:00
|
|
|
ALLEGRO_BITMAP *image; /*!< Bitmap with lower portion of menu landscape. */
|
|
|
|
ALLEGRO_BITMAP *cloud; /*!< Bitmap with bigger cloud. */
|
|
|
|
ALLEGRO_BITMAP *cloud2; /*!< Bitmap with small cloud. */
|
|
|
|
ALLEGRO_BITMAP *pie; /*!< Unscaled bitmap with pie. */
|
|
|
|
ALLEGRO_BITMAP *pie_bitmap; /*!< Scaled and "rendered" bitmap with pies. */
|
|
|
|
ALLEGRO_BITMAP *pinkcloud_bitmap; /*!< Scaled bitmap with pinkcloud and home. */
|
|
|
|
ALLEGRO_BITMAP *pinkcloud; /*!< Unscaled bitmap with pinkcloud and home. */
|
|
|
|
ALLEGRO_BITMAP *rain; /*!< Unscaled bitmap with rain drop. */
|
|
|
|
ALLEGRO_BITMAP *rain_bitmap; /*!< Scaled and "rendered" bitmap with rain drops. */
|
|
|
|
ALLEGRO_BITMAP *mountain; /*!< Flashing mountain in background bitmap. */
|
|
|
|
ALLEGRO_BITMAP *logo; /*!< Logo displayed in the background. */
|
|
|
|
ALLEGRO_BITMAP *logoblur; /*!< Prerendered blurred logo. */
|
|
|
|
ALLEGRO_BITMAP *glass; /*!< Texture used for glass effect in the logo. */
|
|
|
|
ALLEGRO_BITMAP *blurbg; /*!< Temporary bitmap used for blur effect in glass logo. */
|
|
|
|
ALLEGRO_BITMAP *blurbg2; /*!< Temporary bitmap used for blur effect in glass logo. */
|
|
|
|
float cloud_position; /*!< Position of bigger cloud. */
|
|
|
|
float cloud2_position; /*!< Position of small cloud. */
|
|
|
|
int mountain_position; /*!< Position of flashing mountain. */
|
|
|
|
ALLEGRO_SAMPLE *sample; /*!< Background music sample. */
|
|
|
|
ALLEGRO_SAMPLE *rain_sample; /*!< Rain sound sample. */
|
|
|
|
ALLEGRO_SAMPLE *click_sample; /*!< Click sound sample. */
|
|
|
|
ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */
|
|
|
|
ALLEGRO_SAMPLE_INSTANCE *rain_sound; /*!< Sample instance with rain sound. */
|
|
|
|
ALLEGRO_SAMPLE_INSTANCE *click; /*!< Sample instance with click sound. */
|
|
|
|
ALLEGRO_FONT *font_title; /*!< Font of "Super Derpy" text. */
|
|
|
|
ALLEGRO_FONT *font_subtitle; /*!< Font of "Muffin Attack" text. */
|
|
|
|
ALLEGRO_FONT *font; /*!< Font of standard menu item. */
|
|
|
|
ALLEGRO_FONT *font_selected; /*!< Font of selected menu item. */
|
|
|
|
int selected; /*!< Number of selected menu item. */
|
|
|
|
enum menustate_enum menustate; /*!< Current menu page. */
|
|
|
|
bool loaded; /*!< True if Menu state has been already loaded. */
|
|
|
|
struct {
|
|
|
|
bool fullscreen;
|
|
|
|
int fps;
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
} options; /*!< Options which can be changed in menu. */
|
2012-02-16 15:40:58 +01:00
|
|
|
};
|
|
|
|
|
2012-02-28 13:09:12 +01:00
|
|
|
/*! \brief Resources used by Loading state. */
|
2012-02-16 15:40:58 +01:00
|
|
|
struct Loading {
|
2012-09-03 02:25:32 +02:00
|
|
|
ALLEGRO_BITMAP *loading_bitmap; /*!< Rendered loading bitmap. */
|
|
|
|
ALLEGRO_BITMAP *image; /*!< Loading background. */
|
2012-02-16 15:40:58 +01:00
|
|
|
};
|
|
|
|
|
2012-02-18 04:14:35 +01:00
|
|
|
|
2012-09-21 13:55:21 +02:00
|
|
|
/*! \brief Main struct of the game. */
|
2012-02-16 15:40:58 +01:00
|
|
|
struct Game {
|
2012-09-03 02:25:32 +02:00
|
|
|
ALLEGRO_DISPLAY *display; /*!< Main Allegro display. */
|
|
|
|
ALLEGRO_FONT *font; /*!< Main font used in game. */
|
|
|
|
ALLEGRO_FONT *font_console; /*!< Font used in game console. */
|
|
|
|
enum gamestate_enum gamestate; /*!< Current game state. */
|
|
|
|
enum gamestate_enum loadstate; /*!< Game state to be loaded. */
|
|
|
|
ALLEGRO_EVENT_QUEUE *event_queue; /*!< Main event queue. */
|
2012-12-24 01:48:36 +01:00
|
|
|
ALLEGRO_TIMER *timer; /*!< Main LPS timer. */
|
2012-09-03 02:25:32 +02:00
|
|
|
ALLEGRO_BITMAP *console; /*!< Bitmap with game console. */
|
|
|
|
int viewportWidth; /*!< Actual available width of viewport. */
|
|
|
|
int viewportHeight; /*!< Actual available height of viewport. */
|
|
|
|
bool showconsole; /*!< If true, game console is rendered on screen. */
|
|
|
|
int fx; /*!< Effects volume. */
|
|
|
|
int music; /*!< Music volume. */
|
|
|
|
int voice; /*!< Voice volume. */
|
|
|
|
bool fullscreen; /*!< Fullscreen toggle. */
|
|
|
|
bool debug; /*!< Toggles debug mode. */
|
|
|
|
int fps; /*!< FPS limit */
|
|
|
|
int width; /*!< Width of window as being set in configuration. */
|
|
|
|
int height; /*!< Height of window as being set in configuration. */
|
|
|
|
bool shuttingdown; /*!< If true then shut down of the game is pending. */
|
|
|
|
bool restart; /*!< If true then restart of the game is pending. */
|
|
|
|
struct Menu menu; /*!< Resources used by Menu state. */
|
|
|
|
struct Loading loading; /*!< Resources used by Menu state. */
|
|
|
|
struct {
|
|
|
|
ALLEGRO_VOICE *v; /*!< Main voice used by the game. */
|
|
|
|
ALLEGRO_MIXER *mixer; /*!< Main mixer of the game. */
|
|
|
|
ALLEGRO_MIXER *music; /*!< Music mixer. */
|
|
|
|
ALLEGRO_MIXER *voice; /*!< Voice mixer. */
|
|
|
|
ALLEGRO_MIXER *fx; /*!< Effects mixer. */
|
|
|
|
} audio; /*!< Audio resources. */
|
2012-12-23 14:29:54 +01:00
|
|
|
struct {
|
|
|
|
double old_time, fps;
|
|
|
|
int frames_done;
|
|
|
|
} fps_count;
|
2012-02-16 15:40:58 +01:00
|
|
|
};
|
|
|
|
|
2012-02-28 13:09:12 +01:00
|
|
|
/*! \brief Preloads gamestate set in game->loadstate. */
|
2012-05-18 18:34:07 +02:00
|
|
|
void PreloadGameState(struct Game *game, void (*progress)(struct Game*, float));
|
2012-02-28 13:09:12 +01:00
|
|
|
|
|
|
|
/*! \brief Unloads gamestate set in game->gamestate. */
|
2012-02-16 15:40:58 +01:00
|
|
|
void UnloadGameState(struct Game *game);
|
2012-02-28 13:09:12 +01:00
|
|
|
|
|
|
|
/*! \brief Loads gamestate set in game->loadstate. */
|
2012-02-16 15:40:58 +01:00
|
|
|
void LoadGameState(struct Game *game);
|
2012-02-28 13:09:12 +01:00
|
|
|
|
2012-09-26 20:00:11 +02:00
|
|
|
/*! \brief Pauses gamestate set in game->loadstate. */
|
|
|
|
void PauseGameState(struct Game *game);
|
|
|
|
|
|
|
|
/*! \brief Resumes gamestate set in game->loadstate. */
|
|
|
|
void ResumeGameState(struct Game *game);
|
|
|
|
|
2012-09-03 02:08:12 +02:00
|
|
|
/*! \brief Finds path for data file. */
|
|
|
|
char* GetDataFilePath(char* filename);
|
|
|
|
|
2012-02-28 13:09:12 +01:00
|
|
|
/*! \brief Print some message on game console.
|
2012-09-03 02:25:32 +02:00
|
|
|
*
|
2012-02-28 13:09:12 +01:00
|
|
|
* Draws message on console bitmap, so it'll be displayed when calling DrawConsole.
|
|
|
|
* If game->debug is true, then it also prints given message on stdout.
|
|
|
|
* It needs to be called in printf style.
|
|
|
|
*/
|
2012-02-19 22:54:33 +01:00
|
|
|
void PrintConsole(struct Game *game, char* format, ...);
|
2012-02-28 13:09:12 +01:00
|
|
|
|
|
|
|
/*! \brief Draws console bitmap on screen. */
|
2012-02-17 13:25:06 +01:00
|
|
|
void DrawConsole(struct Game *game);
|
2012-02-16 15:40:58 +01:00
|
|
|
|
2012-05-19 18:09:20 +02:00
|
|
|
/*! \brief Loads bitmap into memory and scales it with software linear filtering. */
|
2012-03-04 15:57:23 +01:00
|
|
|
ALLEGRO_BITMAP* LoadScaledBitmap(char* filename, int width, int height);
|
2012-05-19 18:09:20 +02:00
|
|
|
|
|
|
|
/*! \brief Draws frame from current gamestate. */
|
2012-03-02 16:52:13 +01:00
|
|
|
void DrawGameState(struct Game *game);
|
|
|
|
|
2012-09-26 03:08:58 +02:00
|
|
|
/*! \brief Processes logic of current gamestate. */
|
|
|
|
void LogicGameState(struct Game *game);
|
|
|
|
|
|
|
|
/*! \brief Displays fade in or fade out animation on current gamestate. */
|
|
|
|
void FadeGameState(struct Game *game, bool in);
|
|
|
|
|
2012-05-19 18:09:20 +02:00
|
|
|
/*! \brief Load shared resources. */
|
2012-03-08 22:21:02 +01:00
|
|
|
int Shared_Load(struct Game *game);
|
2012-05-19 18:09:20 +02:00
|
|
|
|
|
|
|
/*! \brief Unload shared resources. */
|
2012-03-08 22:21:02 +01:00
|
|
|
void Shared_Unload(struct Game *game);
|
|
|
|
|
2012-08-04 20:58:24 +02:00
|
|
|
/*! \brief Setups letterbox viewport if necessary. */
|
|
|
|
void SetupViewport(struct Game *game);
|
|
|
|
|
2012-02-26 00:47:41 +01:00
|
|
|
#endif
|