]> git.mxchange.org Git - quix0rs-blobwars.git/blob - src/main.cpp
Only try to chdir(PAKLOCATION) if it's actually set.
[quix0rs-blobwars.git] / src / main.cpp
1 /*
2 Copyright (C) 2004-2011 Parallel Realities
3 Copyright (C) 2011-2015 Perpendicular Dimensions
4 Copyright (C) 2011-2015 Perpendicular Dimensions
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
15 See the GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 */
22
23 #include "main.h"
24
25 #include <locale.h>
26
27 Audio audio;
28 Config config;
29 Engine engine;
30 Game game;
31 GameData gameData;
32 Graphics graphics;
33 Map map;
34 ReplayData replayData;
35 MedalServer medalServer;
36
37 Entity defEnemy[MAX_ENEMIES];
38 Entity defItem[MAX_ITEMS];
39 Entity player;
40 Weapon weapon[MAX_WEAPONS];
41
42 void showVersion()
43 {
44         printf(_(
45                 "\n"
46                 "Blob Wars, Episode I - Metal Blob Solid (Version %.2f, Release %d)\n"
47                 "Copyright (C) 2004-2011 Parallel Realities\n"
48                 "Copyright (C) 2011-2015 Perpendicular Dimensions\n"
49                 "Licensed under the GNU General Public License (GPL)\n"
50                 "\n"),
51                 VERSION, RELEASE);
52 }
53
54 void showHelp()
55 {
56         showVersion();
57
58         printf(_(
59                 "The Metal Blob Solid gameplay manual can be found in,\n"
60                 "\t%s\n"
61                 "\n"
62                 "Replay Commands\n"
63                 "\t-map <filename>       Play the specified map (use -listmaps to see maps)\n"
64                 "\t-record <filename>    Record a game and output to the specified file\n"
65                 "\t-playback <filename>  Playback the specified recording\n"
66                 "\t-listmaps             List the available maps for playing\n"
67                 "\n"
68                 "Replay Examples\n"
69                 "\tblobwars -map data/grasslands1 -record replay.dat\n"
70                 "\tblobwars -playback replay.dat\n"
71                 "\n"
72                 "Additional Commands\n"
73                 "\t-fullscreen         Start the game in Full Screen mode\n"
74                 "\t-window             Start the game in Window mode\n"
75                 "\t-mono               Use mono sound output instead of stereo\n"
76                 "\t-noaudio            Disables audio\n"
77                 "\t-version            Display version number\n"
78                 "\t--help              This help\n"
79                 "\n"),
80                 GAMEPLAYMANUAL);
81
82         exit(0);
83 }
84
85 void listMaps()
86 {
87         showVersion();
88         
89         printf(_(
90                 "Available Maps\n"
91                 "\tdata/arcticWastes\n"
92                 "\tdata/assimilator\n"
93                 "\tdata/caves1\n"
94                 "\tdata/caves2\n"
95                 "\tdata/caves3\n"
96                 "\tdata/caves4\n"
97                 "\tdata/comm\n"
98                 "\tdata/finalBattle\n"
99                 "\tdata/floodedTunnel1\n"
100                 "\tdata/floodedTunnel2\n"
101                 "\tdata/floodedTunnel3\n"
102                 "\tdata/floodedTunnel4\n"
103                 "\tdata/grasslands1\n"
104                 "\tdata/grasslands2\n"
105                 "\tdata/grasslands3\n"
106                 "\tdata/hq\n"
107                 "\tdata/icecave1\n"
108                 "\tdata/icecave2\n"
109                 "\tdata/spaceStation\n"
110                 "\tdata/supply\n"
111                 "\tdata/tomb1\n"
112                 "\tdata/tomb2\n"
113                 "\tdata/tomb3\n"
114                 "\tdata/tomb4\n"
115                 "\n"));
116         
117         exit(0);
118 }
119
120 int main(int argc, char *argv[])
121 {
122         #if !USEPAK
123         debug(("Not Using PAK...\n"));
124         #endif
125
126         #if RELEASE
127         #ifdef PAKLOCATION
128         if (PAKLOCATION[0] && chdir(PAKLOCATION))
129         {
130                 perror("Could not chdir to '" PAKLOCATION "'");
131                 return 1;
132         }
133         #endif
134         #endif
135         
136         config.engine = &engine;
137         
138         replayData.reset();
139
140         bindtextdomain("blobwars", LOCALEDIR);
141         setlocale(LC_ALL, "");
142         setlocale(LC_NUMERIC, "C");
143         textdomain("blobwars");
144
145         atexit(cleanup);
146
147         bool showSprites = false;
148         bool hub = false;
149         
150         int recordMode = REPLAY_MODE::NONE;
151         int requiredSection = SECTION_INTRO;
152
153         initConfig();
154
155         for (int i = 1 ; i < argc ; i++)
156         {
157                 if (strcmp(argv[i], "-fullscreen") == 0) engine.fullScreen = true;
158                 else if (strcmp(argv[i], "-window") == 0) engine.fullScreen = false;
159                 else if (strcmp(argv[i], "-noaudio") == 0) engine.useAudio = 0;
160                 else if (strcmp(argv[i], "-mono") == 0) engine.useAudio = 1;
161                 else if (strcmp(argv[i], "-version") == 0) {showVersion(); exit(0);}
162                 else if (strcmp(argv[i], "--help") == 0) showHelp();
163                 else if (strcmp(argv[i], "-record") == 0) {recordMode = REPLAY_MODE::RECORD; strlcpy(replayData.filename, argv[++i], sizeof replayData.filename);}
164                 else if (strcmp(argv[i], "-playback") == 0) {recordMode = REPLAY_MODE::PLAYBACK; strlcpy(replayData.filename, argv[++i], sizeof replayData.filename);}
165                 else if (strcmp(argv[i], "-map") == 0) {if (argc > i + 1) {game.setMapName(argv[++i]); requiredSection = SECTION_GAME;}}
166                 else if (strcmp(argv[i], "-listmaps") == 0) listMaps();
167                 else if (strcmp(argv[i], "-credits") == 0) requiredSection = SECTION_CREDITS;
168                 
169                 #if DEBUG
170                 else if (strcmp(argv[i], "-showsprites") == 0) showSprites = true;
171                 else if (strcmp(argv[i], "-hub") == 0) hub = true;
172                 else if (strcmp(argv[i], "-randomscreens") == 0) graphics.takeRandomScreenShots = true;
173                 else if (strcmp(argv[i], "-nomonsters") == 0) engine.devNoMonsters = true;
174                 #endif
175
176                 else {fprintf(stderr, "Unknown argument '%s'\n", argv[i]); showHelp();}
177         }
178         
179         switch (recordMode)
180         {
181                 case REPLAY_MODE::NONE:
182                         // nothing to do...
183                         break;
184                         
185                 case REPLAY_MODE::RECORD:
186                         requiredSection = SECTION_GAME;
187                         strlcpy(replayData.header.map, game.mapName, sizeof replayData.header.map);
188                         replayData.header.skill = game.skill = 3;
189                         replayData.setMode(REPLAY_MODE::RECORD);
190                         break;
191                         
192                 case REPLAY_MODE::PLAYBACK:
193                         requiredSection = SECTION_GAME;
194                         replayData.setMode(REPLAY_MODE::PLAYBACK);
195                         replayData.header.time = 0;
196                         game.setMapName(replayData.header.map);
197                         game.skill = replayData.header.skill;
198                         break;
199         }
200
201         initSystem();
202         
203         // seed the random using the one generated
204         // via the replay data
205         Math::pSeed = replayData.header.randomSeed;
206         
207         player.setName("Player");
208
209         engine.flushInput();
210         
211         engine.allowQuit = true;
212
213         if (hub)
214         {
215                 requiredSection = SECTION_HUB;
216                 loadGame(0);
217                 loadResources();
218         }
219         
220         if (game.skill == 3)
221         {
222                 game.hasAquaLung = game.hasJetPack = true;
223         }
224
225         if (showSprites)
226         {
227                 showAllSprites();
228         }
229
230         while (true)
231         {
232                 switch (requiredSection)
233                 {
234                         case SECTION_INTRO:
235                                 requiredSection = doIntro();
236                                 break;
237
238                         case SECTION_TITLE:
239                                 requiredSection = title();
240                                 break;
241
242                         case SECTION_HUB:
243                                 requiredSection = doHub();
244                                 break;
245
246                         case SECTION_GAME:
247                                 if (!game.continueFromCheckPoint)
248                                 {
249                                         checkStartCutscene();
250                                         loadResources();
251                                 }
252                                 requiredSection = doGame();
253                                 break;
254
255                         case SECTION_GAMEOVER:
256                                 requiredSection = gameover();
257                                 break;
258                                 
259                         case SECTION_EASYOVER:
260                                 map.clear();
261                                 game.clear();
262                                 easyGameFinished();
263                                 requiredSection = SECTION_TITLE;
264                                 break;
265                                 
266                         case SECTION_CREDITS:
267                                 doCredits();
268                                 requiredSection = SECTION_TITLE;
269                                 break;
270                 }
271         }
272
273         return 0;
274 }