summaryrefslogtreecommitdiffhomepage
path: root/Stars45/Game.h
blob: f450d10dc41b262efde3e36f5a8aa25693e0d433 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2022, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo

*/

#ifndef Game_h
#define Game_h

#include "Types.h"
#include "Screen.h"
#include "Video.h"

// +--------------------------------------------------------------------+

void              Print(const char* fmt, ...);

LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);

void              FlushKeys();
void              BufferKey(int vkey);
int               GetKey();
int               GetKeyPlus(int& key, int& shift);
void              ProcessKeyMessage();

extern "C" bool   ProfileGameLoop(void);

// +--------------------------------------------------------------------+

class ContentBundle;
class Locale;
class Universe;
class Sound;
class SoundCard;
class Video;
class VideoFactory;
class VideoSettings;
class Text;

// +--------------------------------------------------------------------+

class Game
{
public:
    static const char* TYPENAME() { return "Game"; }
    enum STATUS { OK, RUN, EXIT, PANIC, INIT_FAILED, TOO_MANY };

    Game();
    virtual ~Game();

    //
    // MAIN GAME FUNCTIONALITY:
    //

    virtual bool      Init(HINSTANCE hi, HINSTANCE hpi, LPSTR cmdline, int nCmdShow);
    virtual int       Run();
    virtual void      Exit();
    virtual bool      OnPaint()      { return false;  }
    virtual bool      OnHelp()       { return false;  }

    virtual void      Activate(bool f);
    virtual void      Pause(bool f);
    int               Status() const { return status; }

    const RenderStats& GetPolyStats() { return stats;  }

    //
    // GENERAL GAME CLASS UTILITY METHODS:
    //

    static void       Panic(const char* msg=0);
    static bool       DisplayModeSupported(int w, int h, int bpp);
    static int        MaxTexSize();
    static int        MaxTexAspect();
    static int        GammaLevel();
    static void       SetGammaLevel(int g);
    static void       SetMaxTexSize(int n);

    static DWORD      RealTime();
    static DWORD      GameTime();
    static DWORD      TimeCompression();
    static void       SetTimeCompression(DWORD comp);
    static DWORD      Frame();
    static void       ResetGameTime();
    static void       SkipGameTime(double seconds);

    static double     FrameRate();
    static double     FrameTime();
    static double     GUITime();
    static void       SetMaxFrameLength(double seconds) { max_frame_length = seconds; }
    static void       SetMinFrameLength(double seconds) { min_frame_length = seconds; }
    static double     GetMaxFrameLength()               { return max_frame_length;    }
    static double     GetMinFrameLength()               { return min_frame_length;    }

    static Game*      GetInstance();
    static Video*     GetVideo();
    static Color      GetScreenColor();
    static void       SetScreenColor(Color c);
    static int        GetScreenWidth();
    static int        GetScreenHeight();

    static bool       Active()       { return active;     }
    static bool       Paused()       { return paused;     }
    static bool       Server()       { return server;     }
    static bool       ShowMouse()    { return show_mouse; }
    static bool       IsWindowed();

    static HINSTANCE  GetHINST();
    static HWND       GetHWND();

    static void       UseLocale(Locale* locale);
    static Text       GetText(const char* key);

    static const char* GetPanicMessage() { return panicbuf; }

    virtual bool      GameLoop();
    virtual void      UpdateWorld();
    virtual void      GameState();
    virtual void      UpdateScreen();
    virtual void      CollectStats();

    virtual bool      InitApplication(HINSTANCE);
    virtual bool      InitInstance(HINSTANCE, int);
    virtual bool      InitContent();
    virtual bool      InitGame();
    virtual bool      InitVideo();
    virtual bool      ResizeVideo();
    virtual bool      ResetVideo();
    virtual bool      ToggleFullscreen();
    virtual bool      AdjustWindowForChange();

    virtual bool      SetupPalette();
    virtual bool      LoadPalette(PALETTEENTRY* pal, BYTE* inv);
    virtual void      ShowStats();

protected:
    friend  bool      ProfileGameLoop(void);
    friend  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM uParam, LPARAM lParam);

    ContentBundle*    content;
    Universe*         world;
    VideoFactory*     video_factory;
    Video*            video;
    VideoSettings*    video_settings;
    SoundCard*        soundcard;
    Screen*           screen;
    int               gamma;
    int               max_tex_size;

    RenderStats       stats;
    DWORD             totaltime;

    PALETTEENTRY      standard_palette[256];
    BYTE              inverse_palette[32768];

    HINSTANCE         hInst;
    HWND              hwnd;
    HMENU             hmenu;
    DWORD             winstyle;

    char*             app_name;
    char*             title_text;
    char*             palette_name;

    // Internal variables for the state of the app
    bool              is_windowed;
    bool              is_active;
    bool              is_device_lost;
    bool              is_minimized;
    bool              is_maximized;
    bool              ignore_size_change;
    bool              is_device_initialized;
    bool              is_device_restored;
    DWORD             window_style;        // Saved window style for mode switches
    RECT              bounds_rect;         // Saved window bounds for mode switches
    RECT              client_rect;         // Saved client area size for mode switches


    double            gui_seconds;
    double            seconds;
    double            frame_rate;
    int               frame_count;
    int               frame_count0;
    int               frame_time;
    int               frame_time0;

    int               status;
    int               exit_code;
    Color             screen_color;

    static bool       active;
    static bool       paused;
    static bool       server;
    static bool       show_mouse;
    static DWORD      base_game_time;
    static DWORD      real_time;
    static DWORD      game_time;
    static DWORD      time_comp;
    static DWORD      frame_number;

    static double     max_frame_length;
    static double     min_frame_length;

    static char       panicbuf[256];
};

// +--------------------------------------------------------------------+

#endif  // Game_h