00001
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028 #include <string.h>
00029 #include <assert.h>
00030
00031 #include "main.h"
00032 #include "resources.h"
00033 #include "sdlengine.h"
00034 #include "images.h"
00035 #include "music.h"
00036 #include "menu.h"
00037 #include "interface.h"
00038 #include "movies.h"
00039 #include "hqrdepack.h"
00040 #include "scene.h"
00041 #include "grid.h"
00042 #include "lbaengine.h"
00043 #include "redraw.h"
00044 #include "dialogues.h"
00045
00047 const char* ENGINE_VERSION = "0.1.0";
00048
00050 #define EUROPE_VERSION 0
00051
00052 #define USA_VERSION 1
00053
00054 #define MODIFICATION_VERSION 2
00055
00056
00058 const char* CONFIG_FILENAME = "lba.cfg";
00059
00066 const char* SETUP_FILENAME = "setup.lst";
00067
00073 char CFGList[][18]=
00074 {
00075 "Language:",
00076 "LanguageCD:",
00077 "FlagDisplayText:",
00078 "FlagKeepVoice:",
00079 "SvgaDriver:",
00080 "MidiDriver:",
00081 "MidiExec:",
00082 "MidiBase:",
00083 "MidiType:",
00084 "MidiIRQ:",
00085 "MidiDMA:",
00086 "WaveDriver:",
00087 "WaveExec:",
00088 "WaveBase:",
00089 "WaveIRQ:",
00090 "WaveDMA:",
00091 "WaveRate:",
00092 "MixerDriver:",
00093 "MixerBase:",
00094 "WaveVolume:",
00095 "VoiceVolume:",
00096 "MusicVolume:",
00097 "CDVolume:",
00098 "LineVolume:",
00099 "MasterVolume:",
00100 "Version:",
00101 "FullScreen:",
00102 "UseCD:",
00103 "NoSound:",
00104 "UseHQSnd:",
00105 "UseMP3:",
00106 "FLAwide:",
00107 "UseFLAPCX:",
00108 "UseAVI:",
00109 "CrossFade:",
00110 "Fps:",
00111 "Debug:",
00112 "UseAutoSaving:"
00113 };
00114
00115
00117 void allocate_video_memory()
00118 {
00119 int i, j, k;
00120
00121 workVideoBuffer = (unsigned char *) malloc((SCREEN_WIDTH*SCREEN_HEIGHT) * sizeof(unsigned char));
00122 frontVideoBuffer = frontVideoBufferbis = (unsigned char *) malloc(sizeof(unsigned char) * SCREEN_WIDTH*SCREEN_HEIGHT);
00123 init_screen_buffer(frontVideoBuffer, SCREEN_WIDTH, SCREEN_HEIGHT);
00124
00125 j = 0;
00126 k = 0;
00127 for (i = SCREEN_HEIGHT; i > 0; i--)
00128 {
00129 screenLockupTable[j] = k;
00130 j++;
00131 k += SCREEN_WIDTH;
00132 }
00133
00134
00135 }
00136
00140 int get_config_type_index(char* lineBuffer)
00141 {
00142 int i;
00143 char buffer[256];
00144 char* ptr;
00145
00146 strcpy(buffer,lineBuffer);
00147
00148 ptr = strchr(buffer,' ');
00149
00150 if(ptr)
00151 {
00152 *ptr = 0;
00153 }
00154
00155 for(i=0;i<=(sizeof(CFGList)/18);i++)
00156 {
00157 if(strlen(CFGList[i]))
00158 {
00159 if(!strcmp(CFGList[i],buffer)){
00160 return i;
00161 }
00162 }
00163 }
00164
00165 return -1;
00166 }
00167
00169 void init_configurations()
00170 {
00171 FILE *fd;
00172 char buffer[256];
00173 int cfgtype=-1;
00174
00175 fd = fopen(CONFIG_FILENAME, "rb");
00176 if(!fd)
00177 printf("Error: Can't find config file %s\n",CONFIG_FILENAME);
00178
00179
00180 while(fgets(buffer,256,fd) != NULL)
00181 {
00182 *strchr(buffer,0x0D0A) = 0;
00183 cfgtype = get_config_type_index(buffer);
00184 if(cfgtype!=-1)
00185 {
00186 switch(cfgtype)
00187 {
00188 case 0: sscanf(buffer,"Language: %s",cfgfile.Language); break;
00189 case 1: sscanf(buffer,"LanguageCD: %s",cfgfile.LanguageCD); break;
00190 case 2: sscanf(buffer,"FlagDisplayText: %s",cfgfile.FlagDisplayText); break;
00191 case 3: sscanf(buffer,"FlagKeepVoice: %s",cfgfile.FlagKeepVoice); break;
00192
00193 case 19: sscanf(buffer,"WaveVolume: %d",&cfgfile.WaveVolume); break;
00194 case 20: sscanf(buffer,"VoiceVolume: %d",&cfgfile.VoiceVolume); break;
00195 case 21: sscanf(buffer,"MusicVolume: %d",&cfgfile.MusicVolume); break;
00196 case 22: sscanf(buffer,"CDVolume: %d",&cfgfile.CDVolume); break;
00197 case 23: sscanf(buffer,"LineVolume: %d",&cfgfile.LineVolume); break;
00198 case 24: sscanf(buffer,"MasterVolume: %d",&cfgfile.MasterVolume); break;
00199 case 25: sscanf(buffer,"Version: %d",&cfgfile.Version); break;
00200 case 26: sscanf(buffer,"FullScreen: %d",&cfgfile.FullScreen); break;
00201 case 27: sscanf(buffer,"UseCD: %d",&cfgfile.UseCD); break;
00202 case 28: sscanf(buffer,"NoSound: %d",&cfgfile.NoSound); break;
00203 case 29: sscanf(buffer,"UseHQSnd: %d",&cfgfile.UseHQSnd); break;
00204 case 30: sscanf(buffer,"UseMP3: %d",&cfgfile.UseMP3); break;
00205 case 31: sscanf(buffer,"FLAwide: %d",&cfgfile.FLAwide); break;
00206 case 32: sscanf(buffer,"UseFLAPCX: %d",&cfgfile.UseFLAPCX); break;
00207 case 33: sscanf(buffer,"UseAVI: %d",&cfgfile.UseAVI); break;
00208 case 34: sscanf(buffer,"CrossFade: %d",&cfgfile.CrossFade); break;
00209 case 35: sscanf(buffer,"Fps: %d",&cfgfile.Fps); break;
00210 case 36: sscanf(buffer,"Debug: %d",&cfgfile.Debug); break;
00211 case 37: sscanf(buffer,"UseAutoSaving: %d",&cfgfile.UseAutoSaving); break;
00212 }
00213 }
00214 }
00215
00216 if(!cfgfile.Fps)
00217 cfgfile.Fps = DEFAULT_FRAMES_PER_SECOND;
00218
00219 fclose(fd);
00220 }
00221
00223 void init_engine()
00224 {
00225
00226 init_configurations();
00227
00228
00229 printf("Prequengine v%s\n",ENGINE_VERSION);
00230 printf("(c)2008 The Prequel Engine dev-team. Refer to AUTHORS file for further details.\n");
00231 printf("Released under the terms of the GNU GPL license version 2 (or, at your opinion, any later). See COPYING file.\n\n");
00232 printf("The original Little Big Adventure game is:\n\t(c)1994 by Adeline Software International, All Rights Reserved.\n\n");
00233
00234 if(cfgfile.Debug)
00235 printf("Compiled the %s at %s\n", __DATE__, __TIME__);
00236
00237 sdl_initialize();
00238
00239 allocate_video_memory();
00240
00241
00242 toggle_fullscreen();
00243
00244
00245 init_cdrom();
00246
00247 #ifndef _DEBUG
00248
00249
00250 adeline_logo();
00251
00252
00253 if(cfgfile.Version==EUROPE_VERSION)
00254 {
00255
00256 load_image_delay(RESSHQR_LBAIMG,3);
00257
00258 load_image_delay(RESSHQR_EAIMG,2);
00259 }
00260 else if (cfgfile.Version==USA_VERSION)
00261 {
00262
00263 load_image_delay(RESSHQR_RELLENTIMG,3);
00264
00265 load_image_delay(RESSHQR_EAIMG,2);
00266 }
00267 else if (cfgfile.Version==MODIFICATION_VERSION)
00268 {
00269
00270 load_image_delay(RESSHQR_RELLENTIMG,2);
00271
00272 }
00273
00274 play_movie(FLA_DRAGON3);
00275
00276 #endif
00277
00278 load_menu_image();
00279
00280 main_menu();
00281 }
00282
00284 void init_keymap()
00285 {
00286 pressedKeyMap[0] = 0x48;
00287 pressedKeyMap[1] = 0x50;
00288 pressedKeyMap[2] = 0x4B;
00289 pressedKeyMap[3] = 0x4D;
00290 pressedKeyMap[4] = 0x47;
00291 pressedKeyMap[5] = 0x49;
00292 pressedKeyMap[6] = 0x51;
00293 pressedKeyMap[7] = 0x4F;
00294
00295 pressedKeyMap[8] = 0x39;
00296 pressedKeyMap[9] = 0x1C;
00297 pressedKeyMap[10] = 0x1D;
00298 pressedKeyMap[11] = 0x38;
00299 pressedKeyMap[12] = 0x53;
00300 pressedKeyMap[13] = 0x2A;
00301 pressedKeyMap[14] = 0x36;
00302
00303 pressedKeyMap[15] = 0x3B;
00304 pressedKeyMap[16] = 0x3C;
00305 pressedKeyMap[17] = 0x3D;
00306 pressedKeyMap[18] = 0x3E;
00307 pressedKeyMap[19] = 0x3F;
00308 pressedKeyMap[20] = 0x40;
00309 pressedKeyMap[21] = 0x41;
00310 pressedKeyMap[22] = 0x42;
00311 pressedKeyMap[23] = 0x43;
00312 pressedKeyMap[24] = 0x44;
00313 pressedKeyMap[25] = 0x57;
00314 pressedKeyMap[26] = 0x58;
00315 pressedKeyMap[27] = 0x2A;
00316 pressedKeyMap[28] = 0x0;
00317
00318 pressedKeyCharMap[0] = 0x0100;
00319 pressedKeyCharMap[1] = 0x0200;
00320 pressedKeyCharMap[2] = 0x0400;
00321 pressedKeyCharMap[3] = 0x0800;
00322 pressedKeyCharMap[4] = 0x0500;
00323 pressedKeyCharMap[5] = 0x0900;
00324 pressedKeyCharMap[6] = 0x0A00;
00325 pressedKeyCharMap[7] = 0x0600;
00326
00327 pressedKeyCharMap[8] = 0x0101;
00328 pressedKeyCharMap[9] = 0x0201;
00329 pressedKeyCharMap[10] = 0x0401;
00330 pressedKeyCharMap[11] = 0x0801;
00331 pressedKeyCharMap[12] = 0x1001;
00332 pressedKeyCharMap[13] = 0x2001;
00333 pressedKeyCharMap[14] = 0x2001;
00334
00335 pressedKeyCharMap[15] = 0x0102;
00336 pressedKeyCharMap[16] = 0x0202;
00337 pressedKeyCharMap[17] = 0x0402;
00338 pressedKeyCharMap[18] = 0x0802;
00339 pressedKeyCharMap[19] = 0x1002;
00340 pressedKeyCharMap[20] = 0x2002;
00341 pressedKeyCharMap[21] = 0x4002;
00342 pressedKeyCharMap[22] = 0x8002;
00343
00344 pressedKeyCharMap[23] = 0x0103;
00345 pressedKeyCharMap[24] = 0x0203;
00346 pressedKeyCharMap[25] = 0x0403;
00347 pressedKeyCharMap[26] = 0x0803;
00348 pressedKeyCharMap[27] = 0x00FF;
00349 pressedKeyCharMap[28] = 0x00FF;
00350 pressedKeyCharMap[29] = 0x0;
00351 pressedKeyCharMap[30] = 0x0;
00352 }
00353
00354 void init_resources()
00355 {
00356 int size=0;
00357
00358
00359 size = hqr_entry_size(HQR_RESS_FILE,RESSHQR_LBAFONT);
00360 fontPtr = (unsigned char *)malloc(size);
00361 hqr_get_entry(fontPtr, HQR_RESS_FILE, RESSHQR_LBAFONT);
00362
00363 set_font_parameters(2, 8);
00364 set_font_color(14);
00365 set_dialogue_cross_color(136, 143, 2);
00366
00367
00368 size = hqr_entry_size(HQR_RESS_FILE,RESSHQR_SPRITEBOXDATA);
00369 spriteBoundingBoxPtr = (unsigned char *)malloc(size);
00370 hqr_get_entry(spriteBoundingBoxPtr, HQR_RESS_FILE, RESSHQR_SPRITEBOXDATA);
00371
00372 preload_sprites();
00373 }
00374
00375 void init_vars()
00376 {
00377 set_camera_position(40,40,128,200,200);
00378
00379 needChangeScene = 0;
00380 reqBgRedraw = 1;
00381 currentSceneIdx = 0;
00382 currentTextBank = -1;
00383 currMenuTextIndex = -1;
00384 currMenuTextBank = -1;
00385 isUsingOrhoProjection = 1;
00386
00387 sceneHero = &sceneActors[0];
00388
00389 useCellingGrid = -1;
00390 cellingGridIdx = 0;
00391
00392 currentlyFollowedActor = 0;
00393
00394
00395
00396
00397
00398 setSomethingVar1 = 311;
00399 setSomethingVar2 = 240;
00400 setSomethingVar3 = 512;
00401
00402 renderLeft = 0;
00403 renderTop = 0;
00404 renderRight = SCREEN_TEXTLIMIT_RIGHT;
00405 renderBottom = SCREEN_TEXTLIMIT_BOTTOM;
00406
00407 rightMouse=0;
00408 leftMouse=0;
00409 }
00410
00411 void init_grid_buffer()
00412 {
00413 blockBuffer = (unsigned char *)malloc(204800);
00414 brickBuffer = (unsigned char *)malloc(361472);
00415 }
00416
00418 void init_all()
00419 {
00420 init_grid_buffer();
00421
00422 init_keymap();
00423 init_resources();
00424 init_vars();
00425 }
00426
00430 int main(int argc, char *argv[])
00431 {
00432 init_all();
00433 init_engine();
00434 sdl_close();
00435 printf("\n\nLBA/Relentless < %s / %s >\n\nOK.\n\n",__DATE__,__TIME__);
00436 printf("Prequengine v%s closed\n",ENGINE_VERSION);
00437 if(cfgfile.Debug)
00438 {
00439 printf("\nPress <ENTER> to quit debug mode\n");
00440
00441 }
00442 return 0;
00443 }
00444
00445