mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-06-25 22:18:30 +02:00
I've decided to call dwgfx/game/map/obj/key/help/music the "global args". Because they're essentially global variables that are being passed around in args. This commit removes global args from all functions on the Game class, and deals with updating the callsites of said functions accordingly. It also renames all usages of 'dwgfx' in Game.cpp to 'graphics', since the global variable is called 'graphics' now. Interesting to note, I was removing the class defines from Game.h, but it turns out that Graphics.h depends on the mapclass and entityclass defines from Game.h. And also Graphics.h spelled mapclass wrong (it forgot the "class") so I just decided to use that existing line instead. This is only temporary and after all is said and done, at the end of this pull request those class defines will be gone.
575 lines
18 KiB
C++
575 lines
18 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;
|
|
|
|
#if !defined(NO_CUSTOM_LEVELS)
|
|
std::vector<edentities> edentity;
|
|
editorclass ed;
|
|
#endif
|
|
|
|
UtilityClass help;
|
|
Graphics graphics;
|
|
musicclass music;
|
|
Game game;
|
|
KeyPoll key;
|
|
mapclass map;
|
|
entityclass obj;
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
char* baseDir = NULL;
|
|
char* assetsPath = NULL;
|
|
|
|
for (int i = 1; i < argc; ++i) {
|
|
if (strcmp(argv[i], "-renderer") == 0) {
|
|
++i;
|
|
SDL_SetHintWithPriority(SDL_HINT_RENDER_DRIVER, argv[i], SDL_HINT_OVERRIDE);
|
|
} else if (strcmp(argv[i], "-basedir") == 0) {
|
|
++i;
|
|
baseDir = argv[i];
|
|
} else if (strcmp(argv[i], "-assets") == 0) {
|
|
++i;
|
|
assetsPath = argv[i];
|
|
}
|
|
}
|
|
|
|
if(!FILESYSTEM_init(argv[0], baseDir, assetsPath))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
SDL_Init(
|
|
SDL_INIT_VIDEO |
|
|
SDL_INIT_AUDIO |
|
|
SDL_INIT_JOYSTICK |
|
|
SDL_INIT_GAMECONTROLLER
|
|
);
|
|
|
|
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, fmt->BitsPerPixel, fmt->Rmask, fmt->Gmask, fmt->Bmask, fmt->Amask);
|
|
SDL_SetSurfaceBlendMode(graphics.backBuffer, SDL_BLENDMODE_NONE);
|
|
graphics.footerbuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 10, fmt->BitsPerPixel, 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();
|
|
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_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;
|
|
}
|
|
|
|
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;
|
|
#if !defined(NO_CUSTOM_LEVELS)
|
|
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;
|
|
#endif
|
|
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();
|
|
}
|
|
|
|
//Mute button
|
|
#if !defined(NO_CUSTOM_LEVELS)
|
|
bool inEditor = ed.textentry || ed.scripthelppage == 1;
|
|
#else
|
|
bool inEditor = false;
|
|
#endif
|
|
if (key.isDown(KEYBOARD_m) && game.mutebutton<=0 && !inEditor)
|
|
{
|
|
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
|
|
game.savestats();
|
|
NETWORK_shutdown();
|
|
SDL_Quit();
|
|
FILESYSTEM_deinit();
|
|
|
|
return 0;
|
|
}
|