MegaGlest/source/glest_game/main/program.h
Mark Vejvoda 4df997d0ca - initial work for a headless server. Currently this code allows you to launch a server with the commandline option: --masterserver-mode
The first client that connects to the server is the administrator and is able to change most settings and launch the game. Still lots of work to do but this is a start.
2011-09-24 07:46:56 +00:00

202 lines
5.5 KiB
C++

// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martio Figueroa
//
// You can redistribute this code 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
// ==============================================================
#ifndef _GLEST_GAME_PROGRAM_H_
#define _GLEST_GAME_PROGRAM_H_
#include "context.h"
#include "platform_util.h"
#include "window_gl.h"
#include "socket.h"
#include "components.h"
#include "window.h"
#include "simple_threads.h"
#include "stats.h"
#include "leak_dumper.h"
using Shared::Platform::MouseButton;
using Shared::Graphics::Context;
using Shared::Platform::WindowGl;
using Shared::Platform::SizeState;
using Shared::Platform::MouseState;
using Shared::PlatformCommon::PerformanceTimer;
using Shared::Platform::Ip;
using namespace Shared::PlatformCommon;
namespace Glest{ namespace Game{
class Program;
class MainWindow;
class GameSettings;
// =====================================================
// class ProgramState
//
/// Base class for all program states:
/// Intro, MainMenu, Game, BattleEnd (State Design pattern)
// =====================================================
class ProgramState {
protected:
Program *program;
int mouseX;
int mouseY;
int mouse2dAnim;
int startX;
int startY;
bool forceMouseRender;
int fps;
int lastFps;
public:
ProgramState(Program *program);
virtual ~ProgramState(){};
int getFps() const { return fps; }
int getLastFps() const { return lastFps; }
//virtual void render()=0;
virtual bool canRender(bool sleepIfCannotRender=true);
virtual void render();
virtual void update();
virtual void updateCamera(){};
virtual void tick();
virtual void init(){};
virtual void load(){};
virtual void end(){};
virtual void mouseDownLeft(int x, int y){};
virtual void mouseUpLeft(int x, int y){};
virtual void mouseUpRight(int x, int y){}
virtual void mouseUpCenter(int x, int y){}
virtual void mouseDownRight(int x, int y){};
virtual void mouseDownCenter(int x, int y){}
virtual void mouseDoubleClickLeft(int x, int y){};
virtual void mouseDoubleClickRight(int x, int y){}
virtual void mouseDoubleClickCenter(int x, int y){}
virtual void eventMouseWheel(int x, int y, int zDelta){}
virtual void mouseMove(int x, int y, const MouseState *mouseState);
virtual void keyDown(SDL_KeyboardEvent key){};
virtual void keyUp(SDL_KeyboardEvent key){};
virtual void keyPress(SDL_KeyboardEvent c){};
virtual void setStartXY(int X,int Y) { startX=X; startY=Y; }
virtual void restoreToStartXY() { SDL_WarpMouse(startX, startY); }
virtual bool isInSpecialKeyCaptureEvent() { return false; }
virtual bool quitTriggered() { return false; }
virtual Stats quitAndToggleState() { return Stats(); };
virtual Program * getProgram() { return program; }
virtual void setForceMouseRender(bool value) { forceMouseRender=value;}
virtual void consoleAddLine(string line) { };
protected:
virtual void incrementFps();
};
// ===============================
// class Program
// ===============================
class Program : public SimpleTaskCallbackInterface {
private:
static const int maxTimes;
SimpleTaskThread *soundThreadManager;
class ShowMessageProgramState : public ProgramState {
GraphicMessageBox msgBox;
int mouseX;
int mouseY;
int mouse2dAnim;
string msg;
bool userWantsExit;
public:
ShowMessageProgramState(Program *program, const char *msg);
virtual void render();
virtual void mouseDownLeft(int x, int y);
virtual void mouseMove(int x, int y, const MouseState &mouseState);
virtual void keyPress(SDL_KeyboardEvent c);
virtual void update();
virtual bool wantExit() { return userWantsExit; }
};
private:
ProgramState *programState;
PerformanceTimer fpsTimer;
PerformanceTimer updateTimer;
PerformanceTimer updateCameraTimer;
WindowGl *window;
static Program *singleton;
GraphicMessageBox msgBox;
int skipRenderFrameCount;
public:
Program();
~Program();
static Program *getInstance() {return singleton;}
GraphicMessageBox * getMsgBox() { return &msgBox; }
void initNormal(WindowGl *window);
void initServer(WindowGl *window,bool autostart=false,bool openNetworkSlots=false,bool masterserverMode=false);
void initServer(WindowGl *window, GameSettings *settings);
void initClient(WindowGl *window, const Ip &serverIp);
void initScenario(WindowGl *window, string autoloadScenarioName);
//main
void keyDown(SDL_KeyboardEvent key);
void keyUp(SDL_KeyboardEvent key);
void keyPress(SDL_KeyboardEvent c);
void loop();
void loopWorker();
void resize(SizeState sizeState);
void showMessage(const char *msg);
bool isMessageShowing();
//misc
void setState(ProgramState *programState,bool cleanupOldState=true);
ProgramState * getState() { return programState;}
WindowGl * getWindow() { return window; }
void init(WindowGl *window, bool initSound=true, bool toggleFullScreen=false);
void exit();
virtual void simpleTask(BaseThread *callingThread);
void mouseDownLeft(int x, int y);
void eventMouseMove(int x, int y, const MouseState *ms);
void renderProgramMsgBox();
bool isInSpecialKeyCaptureEvent() { return programState->isInSpecialKeyCaptureEvent(); }
void reInitGl();
void resetSoundSystem();
void stopSoundSystem();
void startSoundSystem();
virtual void consoleAddLine(string line);
private:
void setDisplaySettings();
void restoreDisplaySettings();
};
}} //end namespace
#endif