1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-25 22:18:30 +02:00
VVVVVV/desktop_version/src/main.cpp
Info Teddy 5a316d65e6 Allow using help/graphics/music/game/key/map/obj everywhere
This commit makes `help`, `graphics`, `music`, `game`, `key`, `map`, and
`obj` essentially static global objects that can be used everywhere.
This is useful in case we ever need to add a new function in the future,
so we don't have to bother with passing a new argument in which means we
have to pass a new argument in to the function that calls that function
which means having to pass a new argument into the function that calls
THAT function, etc. which is a real headache when working on fan mods of
the source code.

Note that this changes NONE of the existing function signatures, it
merely just makes those variables accessible everywhere in the same way
`script` and `ed` are.

Also note that some classes had to be initialized after the filesystem
was initialized, but C++ would keep initializing them before the
filesystem got initialized, because I *had* to put them at the top of
`main.cpp`, or else they wouldn't be global variables.

The only way to work around this was to use entityclass's initialization
style (which I'm pretty sure entityclass of all things doesn't need to
be initialized this way), where you actually initialize the class in an
`init()` function, and so then you do `graphics.init()` after the
filesystem initialization, AFTER doing `Graphics graphics` up at the
top.

I've had to do this for `graphics` (but only because its child
GraphicsResources `grphx` needs to be initialized this way), `music`,
and `game`. I don't think this will affect anything. Other than that,
`help`, `key`, and `map` are still using the C++-intended method of
having ClassName::ClassName() functions.
2020-01-29 07:58:23 -05:00

563 lines
17 KiB
C++

#include <SDL.h>
#include "SoundSystem.h"
#include "UtilityClass.h"
#include "Game.h"
#include "Graphics.h"
#include "KeyPoll.h"
#include "titlerender.h"
#include "Tower.h"
#include "WarpClass.h"
#include "Labclass.h"
#include "Finalclass.h"
#include "Map.h"
#include "Screen.h"
#include "Script.h"
#include "Logic.h"
#include "Input.h"
#include "editor.h"
#include "preloader.h"
#include "FileSystemUtils.h"
#include "Network.h"
#include <stdio.h>
#include <string.h>
scriptclass script;
edentities edentity[3000];
editorclass ed;
UtilityClass help;
Graphics graphics;
musicclass music;
Game game;
KeyPoll key;
mapclass map;
entityclass obj;
int main(int argc, char *argv[])
{
if(!FILESYSTEM_init(argv[0]))
{
return 1;
}
SDL_Init(
SDL_INIT_VIDEO |
SDL_INIT_AUDIO |
SDL_INIT_JOYSTICK |
SDL_INIT_GAMECONTROLLER
);
if (argc > 2 && strcmp(argv[1], "-renderer") == 0)
{
SDL_SetHintWithPriority(SDL_HINT_RENDER_DRIVER, argv[2], SDL_HINT_OVERRIDE);
}
NETWORK_init();
Screen gameScreen;
printf("\t\t\n");
printf("\t\t\n");
printf("\t\t VVVVVV\n");
printf("\t\t\n");
printf("\t\t\n");
printf("\t\t 8888888888888888 \n");
printf("\t\t88888888888888888888\n");
printf("\t\t888888 8888 88\n");
printf("\t\t888888 8888 88\n");
printf("\t\t88888888888888888888\n");
printf("\t\t88888888888888888888\n");
printf("\t\t888888 88\n");
printf("\t\t88888888 8888\n");
printf("\t\t 8888888888888888 \n");
printf("\t\t 88888888 \n");
printf("\t\t 8888888888888888 \n");
printf("\t\t88888888888888888888\n");
printf("\t\t88888888888888888888\n");
printf("\t\t88888888888888888888\n");
printf("\t\t8888 88888888 8888\n");
printf("\t\t8888 88888888 8888\n");
printf("\t\t 888888888888 \n");
printf("\t\t 8888 8888 \n");
printf("\t\t 888888 888888 \n");
printf("\t\t 888888 888888 \n");
printf("\t\t 888888 888888 \n");
printf("\t\t\n");
printf("\t\t\n");
//Set up screen
//UtilityClass help;
// Load Ini
//Graphics graphics;
graphics.init();
//musicclass music;
music.init();
//Game game;
game.init();
game.infocus = true;
graphics.MakeTileArray();
graphics.MakeSpriteArray();
graphics.maketelearray();
graphics.images.push_back(graphics.grphx.im_image0);
graphics.images.push_back(graphics.grphx.im_image1);
graphics.images.push_back(graphics.grphx.im_image2);
graphics.images.push_back(graphics.grphx.im_image3);
graphics.images.push_back(graphics.grphx.im_image4);
graphics.images.push_back(graphics.grphx.im_image5);
graphics.images.push_back(graphics.grphx.im_image6);
graphics.images.push_back(graphics.grphx.im_image7);
graphics.images.push_back(graphics.grphx.im_image8);
graphics.images.push_back(graphics.grphx.im_image9);
graphics.images.push_back(graphics.grphx.im_image10);
graphics.images.push_back(graphics.grphx.im_image11);
graphics.images.push_back(graphics.grphx.im_image12);
const SDL_PixelFormat* fmt = gameScreen.GetFormat();
graphics.backBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE ,320 ,240 ,32,fmt->Rmask,fmt->Gmask,fmt->Bmask,fmt->Amask ) ;
SDL_SetSurfaceBlendMode(graphics.backBuffer, SDL_BLENDMODE_NONE);
graphics.footerbuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 10, 32, fmt->Rmask, fmt->Gmask, fmt->Bmask, fmt->Amask);
SDL_SetSurfaceBlendMode(graphics.footerbuffer, SDL_BLENDMODE_BLEND);
SDL_SetSurfaceAlphaMod(graphics.footerbuffer, 127);
FillRect(graphics.footerbuffer, SDL_MapRGB(fmt, 0, 0, 0));
graphics.Makebfont();
graphics.foregroundBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE ,320 ,240 ,fmt->BitsPerPixel,fmt->Rmask,fmt->Gmask,fmt->Bmask,fmt->Amask );
SDL_SetSurfaceBlendMode(graphics.foregroundBuffer, SDL_BLENDMODE_NONE);
graphics.screenbuffer = &gameScreen;
graphics.menubuffer = SDL_CreateRGBSurface(SDL_SWSURFACE ,320 ,240 ,fmt->BitsPerPixel,fmt->Rmask,fmt->Gmask,fmt->Bmask,fmt->Amask );
SDL_SetSurfaceBlendMode(graphics.menubuffer, SDL_BLENDMODE_NONE);
graphics.towerbuffer = SDL_CreateRGBSurface(SDL_SWSURFACE ,320 ,240 ,fmt->BitsPerPixel,fmt->Rmask,fmt->Gmask,fmt->Bmask,fmt->Amask );
SDL_SetSurfaceBlendMode(graphics.towerbuffer, SDL_BLENDMODE_NONE);
graphics.tempBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE ,320 ,240 ,fmt->BitsPerPixel,fmt->Rmask,fmt->Gmask,fmt->Bmask,fmt->Amask );
SDL_SetSurfaceBlendMode(graphics.tempBuffer, SDL_BLENDMODE_NONE);
//Make a temporary rectangle to hold the offsets
// SDL_Rect offset;
//Give the offsets to the rectangle
// offset.x = 60;
// offset.y = 80;
//game.gamestate = TITLEMODE;
//game.gamestate=EDITORMODE;
game.gamestate = PRELOADER; //Remember to uncomment this later!
game.menustart = false;
game.mainmenu = 0;
//KeyPoll key;
//mapclass map;
map.ypos = (700-29) * 8;
map.bypos = map.ypos / 2;
//Moved screensetting init here from main menu V2.1
game.loadstats(map, graphics);
if (game.skipfakeload)
game.gamestate = TITLEMODE;
if(game.usingmmmmmm==0) music.usingmmmmmm=false;
if(game.usingmmmmmm==1) music.usingmmmmmm=true;
if (game.slowdown == 0) game.slowdown = 30;
switch(game.slowdown){
case 30: game.gameframerate=34; break;
case 24: game.gameframerate=41; break;
case 18: game.gameframerate=55; break;
case 12: game.gameframerate=83; break;
default: game.gameframerate=34; break;
}
//Check to see if you've already unlocked some achievements here from before the update
if (game.swnbestrank > 0){
if(game.swnbestrank >= 1) NETWORK_unlockAchievement("vvvvvvsupgrav5");
if(game.swnbestrank >= 2) NETWORK_unlockAchievement("vvvvvvsupgrav10");
if(game.swnbestrank >= 3) NETWORK_unlockAchievement("vvvvvvsupgrav15");
if(game.swnbestrank >= 4) NETWORK_unlockAchievement("vvvvvvsupgrav20");
if(game.swnbestrank >= 5) NETWORK_unlockAchievement("vvvvvvsupgrav30");
if(game.swnbestrank >= 6) NETWORK_unlockAchievement("vvvvvvsupgrav60");
}
if(game.unlock[5]) NETWORK_unlockAchievement("vvvvvvgamecomplete");
if(game.unlock[19]) NETWORK_unlockAchievement("vvvvvvgamecompleteflip");
if(game.unlock[20]) NETWORK_unlockAchievement("vvvvvvmaster");
if (game.bestgamedeaths > -1) {
if (game.bestgamedeaths <= 500) {
NETWORK_unlockAchievement("vvvvvvcomplete500");
}
if (game.bestgamedeaths <= 250) {
NETWORK_unlockAchievement("vvvvvvcomplete250");
}
if (game.bestgamedeaths <= 100) {
NETWORK_unlockAchievement("vvvvvvcomplete100");
}
if (game.bestgamedeaths <= 50) {
NETWORK_unlockAchievement("vvvvvvcomplete50");
}
}
if(game.bestrank[0]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_station1_fixed");
if(game.bestrank[1]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_lab_fixed");
if(game.bestrank[2]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_tower_fixed");
if(game.bestrank[3]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_station2_fixed");
if(game.bestrank[4]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_warp_fixed");
if(game.bestrank[5]>=3) NETWORK_unlockAchievement("vvvvvvtimetrial_final_fixed");
//entityclass obj;
obj.init();
//Quick hack to start in final level ---- //Might be useful to leave this commented in for testing
/*
//game.gamestate=GAMEMODE;
//game.start(obj,music);
//script.startgamemode(8, key, graphics, game, map, obj, help, music);
// map.finalmode = true; //Enable final level mode
//map.finalx = 41; map.finaly = 52; //Midpoint
//map.finalstretch = true;
//map.final_colormode = true;
//map.final_mapcol = 0;
//map.final_colorframe = 0;
//game.starttest(obj, music);
game.savex = 5 * 8; game.savey = 15 * 8; game.saverx = 41; game.savery = 52;
game.savegc = 0; game.savedir = 1;
game.state = 0; game.deathseq = -1; game.lifeseq = 10;
//obj.createentity(game, game.savex, game.savey, 0);
map.gotoroom(game.saverx, game.savery, graphics, game, obj, music);
//music.play(1);
*/
//End hack here ----
volatile Uint32 time, timePrev = 0;
game.infocus = true;
key.isActive = true;
while(!key.quitProgram)
{
//gameScreen.ClearScreen(0x00);
time = SDL_GetTicks();
// Update network per frame.
NETWORK_update();
//framerate limit to 30
Uint32 timetaken = time - timePrev;
if(game.gamestate==EDITORMODE)
{
if (timetaken < 24)
{
volatile Uint32 delay = 24 - timetaken;
SDL_Delay( delay );
time = SDL_GetTicks();
}
timePrev = time;
}else{
if (timetaken < game.gameframerate)
{
volatile Uint32 delay = game.gameframerate - timetaken;
SDL_Delay( delay );
time = SDL_GetTicks();
}
timePrev = time;
}
key.Poll();
if(key.toggleFullscreen)
{
if(!gameScreen.isWindowed)
{
//SDL_WM_GrabInput(SDL_GRAB_ON);
SDL_ShowCursor(SDL_DISABLE);
SDL_ShowCursor(SDL_ENABLE);
}
else
{
SDL_ShowCursor(SDL_ENABLE);
}
if(game.gamestate == EDITORMODE)
{
SDL_ShowCursor(SDL_ENABLE);
}
gameScreen.toggleFullScreen();
game.fullscreen = !game.fullscreen;
key.toggleFullscreen = false;
key.keymap.clear(); //we lost the input due to a new window.
game.press_left = false;
game.press_right = false;
game.press_action = true;
game.press_map = false;
printf("Error: failed: %s\n", SDL_GetError());
}
/*if(key.quitProgram)
{
music.playef(2);
}*/
game.infocus = key.isActive;
if(!game.infocus)
{
if(game.getGlobalSoundVol()> 0)
{
game.setGlobalSoundVol(0);
}
FillRect(graphics.backBuffer, 0x00000000);
graphics.bprint(5, 110, "Game paused", 196 - help.glow, 255 - help.glow, 196 - help.glow, true);
graphics.bprint(5, 120, "[click to resume]", 196 - help.glow, 255 - help.glow, 196 - help.glow, true);
graphics.bprint(5, 230, "Press M to mute in game", 164 - help.glow, 196 - help.glow, 164 - help.glow, true);
graphics.render();
//We are minimised, so lets put a bit of a delay to save CPU
SDL_Delay(100);
}
else
{
switch(game.gamestate)
{
case PRELOADER:
//Render
preloaderrender(graphics, game, help);
break;
case EDITORMODE:
graphics.flipmode = false;
//Input
editorinput(key, graphics, game, map, obj, help, music);
//Render
editorrender(key, graphics, game, map, obj, help);
////Logic
editorlogic(key, graphics, game, obj, music, map, help);
break;
case TITLEMODE:
//Input
titleinput(key, graphics, map, game, obj, help, music);
//Render
titlerender(graphics, map, game, obj, help, music);
////Logic
titlelogic(graphics, game, obj, help, music, map);
break;
case GAMEMODE:
if (map.towermode)
{
gameinput(key, graphics, game, map, obj, help, music);
//if(game.recording==1)
//{
// ///recordinput(key, graphics, game, map, obj, help, music);
//}
//else
//{
//}
towerrender(graphics, game, map, obj, help);
towerlogic(graphics, game, obj, music, map, help);
}
else
{
if (game.recording == 1)
{
//recordinput(key, dwgfx, game, map, obj, help, music);
}
else
{
if (script.running)
{
script.run(key, graphics, game, map, obj, help, music);
}
gameinput(key, graphics, game, map, obj, help, music);
//}
gamerender(graphics,map, game, obj, help);
gamelogic(graphics, game,obj, music, map, help);
}
break;
case MAPMODE:
maprender(graphics, game, map, obj, help);
if (game.recording == 1)
{
//recordinput(key, dwgfx, game, map, obj, help, music); //will implement this later if it's actually needed
}
else
{
mapinput(key, graphics, game, map, obj, help, music);
}
maplogic(graphics, game, obj ,music , map, help );
break;
case TELEPORTERMODE:
teleporterrender(graphics, game, map, obj, help);
if (game.recording == 1)
{
//recordinput(key, graphics, game, map, obj, help, music);
}
else
{
if(game.useteleporter)
{
teleporterinput(key, graphics, game, map, obj, help, music);
}
else
{
if (script.running)
{
script.run(key, graphics, game, map, obj, help, music);
}
gameinput(key, graphics, game, map, obj, help, music);
}
}
maplogic(graphics, game, obj, music, map, help);
break;
case GAMECOMPLETE:
gamecompleterender(graphics, game, obj, help, map);
//Input
gamecompleteinput(key, graphics, game, map, obj, help, music);
//Logic
gamecompletelogic(graphics, game, obj, music, map, help);
break;
case GAMECOMPLETE2:
gamecompleterender2(graphics, game, obj, help);
//Input
gamecompleteinput2(key, graphics, game, map, obj, help, music);
//Logic
gamecompletelogic2(graphics, game, obj, music, map, help);
break;
case CLICKTOSTART:
//dwgfx.bprint(5, 115, "[Click to start]", 196 - help.glow, 196 - help.glow, 255 - help.glow, true);
//dwgfx.drawgui(help);
//dwgfx.render();
//dwgfx.backbuffer.unlock();
help.updateglow();
// if (key.click) {
// dwgfx.textboxremove();
// }
// if (dwgfx.ntextbox == 0) {
// //music.play(6);
// map.ypos = (700-29) * 8;
// map.bypos = map.ypos / 2;
// map.cameramode = 0;
// game.gamestate = TITLEMODE;
// }
break;
default:
break;
}
}
}
//We did editorinput, now it's safe to turn this off
key.linealreadyemptykludge = false;
if (game.savemystats)
{
game.savemystats = false;
game.savestats(map, graphics);
}
//Mute button
if (key.isDown(KEYBOARD_m) && game.mutebutton<=0 && !ed.textentry && ed.scripthelppage != 1)
{
game.mutebutton = 8;
if (game.muted)
{
game.muted = false;
}
else
{
game.muted = true;
}
}
if(game.mutebutton>0)
{
game.mutebutton--;
}
if (game.muted)
{
//if (game.globalsound == 1)
//{
game.globalsound = 0;
Mix_VolumeMusic(0) ;
Mix_Volume(-1,0);
//}
}
if (!game.muted && game.globalsound == 0)
{
game.globalsound = 1;
Mix_VolumeMusic(MIX_MAX_VOLUME) ;
Mix_Volume(-1,MIX_MAX_VOLUME);
}
if(key.resetWindow)
{
key.resetWindow = false;
gameScreen.ResizeScreen(-1, -1);
}
music.processmusic();
graphics.processfade();
game.gameclock();
gameScreen.FlipScreen();
//SDL_FillRect( SDL_GetVideoSurface(), NULL, 0 );
}
//SDL_Delay(300);
//TODO
//Free the loaded image
//SDL_FreeSurface( gameScreen );
//Quit SDL
NETWORK_shutdown();
SDL_Quit();
FILESYSTEM_deinit();
return 0;
}