diff --git a/sky/disk.cpp b/sky/disk.cpp index 056276d9e11..fd1b62b8f91 100644 --- a/sky/disk.cpp +++ b/sky/disk.cpp @@ -8,7 +8,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License @@ -28,7 +28,7 @@ #define no_of_files_hd 1600 #define no_of_files_cd 5200 -#define max_files_in_list 60 +#define max_files_in_list 60 int UnpackM1(void *, void *, uint16); @@ -44,169 +44,166 @@ File *dnr_handle = new File(); void SkyState::initialise_disk() { - uint32 entries_read; - - dnr_handle->open(dinner_file_name, _gameDataPath); - if (dnr_handle->isOpen() == false) - error("Could not open %s%s!\n", _gameDataPath, dinner_file_name); - - if (!(dinner_table_size = dnr_handle->readUint32LE())) - error("Error reading from sky.dnr!\n"); //even though it was opened correctly?! - - debug(1, "Entries in dinner table: %d", dinner_table_size); - - dinner_table_area = (uint8 *)malloc(dinner_table_size*8); - entries_read = dnr_handle->read(dinner_table_area, 8*dinner_table_size) / 8; + uint32 entries_read; - if (entries_read != dinner_table_size) - warning("bytes_read != dinner_table_entries. [%d/%d]\n", entries_read, dinner_table_size); - - data_disk_handle->open(data_file_name, _gameDataPath); - if (data_disk_handle->isOpen() == false) - error("Error opening %s%s!\n", _gameDataPath, data_file_name); + dnr_handle->open(dinner_file_name, _gameDataPath); + if (dnr_handle->isOpen() == false) + error("Could not open %s%s!\n", _gameDataPath, dinner_file_name); + + if (!(dinner_table_size = dnr_handle->readUint32LE())) + error("Error reading from sky.dnr!\n"); //even though it was opened correctly?! + + debug(1, "Entries in dinner table: %d", dinner_table_size); + + dinner_table_area = (uint8 *)malloc(dinner_table_size*8); + entries_read = dnr_handle->read(dinner_table_area, 8*dinner_table_size) / 8; + + if (entries_read != dinner_table_size) + warning("bytes_read != dinner_table_entries. [%d/%d]\n", entries_read, dinner_table_size); + + data_disk_handle->open(data_file_name, _gameDataPath); + if (data_disk_handle->isOpen() == false) + error("Error opening %s%s!\n", _gameDataPath, data_file_name); } //load in file file_nr to address dest //if dest == NULL, then allocate memory for this file uint16 *SkyState::load_file(uint16 file_nr, uint8 *dest) { - uint8 cflag; - uint32 eax, ecx; - int32 bytes_read; - uint8 *file_ptr, *esiptr, *ediptr; - dataFileHeader file_header; + uint8 cflag; + uint32 eax, ecx; + int32 bytes_read; + uint8 *file_ptr, *esiptr, *ediptr; + dataFileHeader file_header; - #ifdef file_order_chk - warning("File order checking not implemented yet!\n"); - #endif - + #ifdef file_order_chk + warning("File order checking not implemented yet!\n"); + #endif + comp_file = file_nr; debug(1, "load file %d,%d (%d)", (file_nr>>11), (file_nr&2047), file_nr); - - - file_ptr = (uint8 *)get_file_info(file_nr); - if (file_ptr == NULL) { - printf("File %d not found!\n", file_nr); - return NULL; - } - - eax = READ_LE_UINT32((file_ptr+5)); - file_flags = eax; - eax &= 0x03fffff; - file_size = eax; - - ecx = READ_LE_UINT32((file_ptr+2)); - ecx &= 0x0ffffff; - - cflag = (uint8)((ecx >> (23)) & 0x1); - ecx = (((1 << (23)) ^ 0xFFFFFFFF) & ecx); - - if (cflag) - ecx = ecx << 4; - file_offset = ecx; - fixed_dest = dest; - file_dest = dest; - comp_dest = dest; + + file_ptr = (uint8 *)get_file_info(file_nr); + if (file_ptr == NULL) { + printf("File %d not found!\n", file_nr); + return NULL; + } + + eax = READ_LE_UINT32((file_ptr+5)); + file_flags = eax; + eax &= 0x03fffff; + file_size = eax; - if (dest == NULL) //we need to allocate memory for this file - file_dest = (uint8 *)malloc(eax); - - data_disk_handle->seek(file_offset, SEEK_SET); + ecx = READ_LE_UINT32((file_ptr+2)); + ecx &= 0x0ffffff; - #ifdef file_order_chk - warning("File order checking not implemented yet!\n"); - #endif - - //now read in the data - bytes_read = data_disk_handle->read(file_dest, 1*file_size); - - if (bytes_read != (int32)file_size) - printf("ERROR: Unable to read %d bytes from datadisk (%d bytes read)\n", file_size, bytes_read); - - cflag = (uint8)((file_flags >> (23)) & 0x1); - - //if cflag == 0 then file is compressed, 1 == uncompressed - - if (!cflag) - { - debug(1, "File is compressed..."); - - memcpy(&file_header, file_dest, sizeof(struct dataFileHeader)); - if ( (uint8)((FROM_LE_16(file_header.flag) >> 7) & 0x1) ) { - debug(1, "with RNC!"); - - eax = FROM_LE_16(file_header.flag); - eax &= 0xFFFFFF00; //clear al - eax = eax << 8; - eax |= FROM_LE_16((uint16)file_header.s_tot_size); - - decomp_size = eax; - - if (fixed_dest == NULL) // is this valid? - comp_dest = (uint8 *)malloc(eax); - - esiptr = file_dest; - ediptr = comp_dest; + cflag = (uint8)((ecx >> (23)) & 0x1); + ecx = (((1 << (23)) ^ 0xFFFFFFFF) & ecx); + + if (cflag) + ecx = ecx << 4; - if ( (uint8)(file_flags >> (22) & 0x1) ) //do we include the header? - esiptr += sizeof(struct dataFileHeader); - else { - memcpy(ediptr, esiptr, sizeof(struct dataFileHeader)); - esiptr += sizeof(struct dataFileHeader); - ediptr += sizeof(struct dataFileHeader); - } + file_offset = ecx; + fixed_dest = dest; + file_dest = dest; + comp_dest = dest; - eax = UnpackM1(esiptr, ediptr, 0); - - debug(2, "UnpackM1 returned: %d", eax); + if (dest == NULL) //we need to allocate memory for this file + file_dest = (uint8 *)malloc(eax); + + data_disk_handle->seek(file_offset, SEEK_SET); - if (eax == 0) { //Unpack returned 0: file was probably not packed. - if (fixed_dest == NULL) - free(comp_dest); - - return (uint16 *)file_dest; - } - - if (! (uint8)(file_flags >> (22) & 0x1) ) { //include header? - eax += sizeof(struct dataFileHeader); - - if (eax != decomp_size) - { - debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", eax, decomp_size); + #ifdef file_order_chk + warning("File order checking not implemented yet!\n"); + #endif + + //now read in the data + bytes_read = data_disk_handle->read(file_dest, 1*file_size); + + if (bytes_read != (int32)file_size) + printf("ERROR: Unable to read %d bytes from datadisk (%d bytes read)\n", file_size, bytes_read); + + cflag = (uint8)((file_flags >> (23)) & 0x1); + + //if cflag == 0 then file is compressed, 1 == uncompressed + + if (!cflag) + { + debug(1, "File is compressed..."); + + memcpy(&file_header, file_dest, sizeof(struct dataFileHeader)); + if ( (uint8)((FROM_LE_16(file_header.flag) >> 7) & 0x1) ) { + debug(1, "with RNC!"); + + eax = FROM_LE_16(file_header.flag); + eax &= 0xFFFFFF00; //clear al + eax = eax << 8; + eax |= FROM_LE_16((uint16)file_header.s_tot_size); + + decomp_size = eax; + + if (fixed_dest == NULL) // is this valid? + comp_dest = (uint8 *)malloc(eax); + + esiptr = file_dest; + ediptr = comp_dest; + + if ( (uint8)(file_flags >> (22) & 0x1) ) //do we include the header? + esiptr += sizeof(struct dataFileHeader); + else { + memcpy(ediptr, esiptr, sizeof(struct dataFileHeader)); + esiptr += sizeof(struct dataFileHeader); + ediptr += sizeof(struct dataFileHeader); + } + + eax = UnpackM1(esiptr, ediptr, 0); + + debug(2, "UnpackM1 returned: %d", eax); + + if (eax == 0) { //Unpack returned 0: file was probably not packed. + if (fixed_dest == NULL) + free(comp_dest); + + return (uint16 *)file_dest; + } + + if (! (uint8)(file_flags >> (22) & 0x1) ) { // include header? + eax += sizeof(struct dataFileHeader); + + if (eax != decomp_size) { + debug(1, "ERROR: invalid decomp size! (was: %d, should be: %d)", eax, decomp_size); + } + } + + if (fixed_dest == NULL) + free(file_dest); + } - } - - if (fixed_dest == NULL) - free(file_dest); - + else + debug(1, "but not with RNC! (?!)"); + } else - debug(1, "but not with RNC! (?!)"); - - } - else - return (uint16 *)file_dest; - - return (uint16 *)comp_dest; + return (uint16 *)file_dest; + + return (uint16 *)comp_dest; } uint16 *SkyState::get_file_info(uint16 file_nr) { - uint16 i; - uint16 *dnr_tbl_16_ptr = (uint16 *)dinner_table_area; - - for (i = 0; i < dinner_table_size/2; i++) - { - if (READ_LE_UINT16(dnr_tbl_16_ptr+(i*4)) == file_nr) - { - debug(1, "file %d found!", file_nr); - return (dnr_tbl_16_ptr+(i*4)); + uint16 i; + uint16 *dnr_tbl_16_ptr = (uint16 *)dinner_table_area; + + for (i = 0; i < dinner_table_size/2; i++) { + if (READ_LE_UINT16(dnr_tbl_16_ptr+(i*4)) == file_nr) { + debug(1, "file %d found!", file_nr); + return (dnr_tbl_16_ptr+(i*4)); + } } - } - - //if file is speech file then return NULL if not found - printf("get_file_info() - speech file support not implemented yet!\n"); - return (uint16 *)NULL; + + // if file is speech file then return NULL if not found + printf("get_file_info() - speech file support not implemented yet!\n"); + return (uint16 *)NULL; } diff --git a/sky/intro.cpp b/sky/intro.cpp index 17e88edb5c9..6fe7d360121 100644 --- a/sky/intro.cpp +++ b/sky/intro.cpp @@ -25,38 +25,38 @@ #include "sky/skydefs.h" #include "sky/sky.h" -#define intro_text_width 128 +#define intro_text_width 128 -#define fn_a_pal 60080 -#define fn_1a_log 60081 -#define fn_1a 60082 -#define fn_1b 60083 -#define fn_1c 60084 -#define fn_1d 60085 -#define fn_1e 60086 -#define fn_4a 60087 -#define fn_4b_log 60088 -#define fn_4b 60089 -#define fn_4c_log 60090 -#define fn_4c 60091 -#define fn_5_pal 60092 -#define fn_5_log 60093 -#define fn_5 60094 -#define fn_6_pal 60095 -#define fn_6_log 60096 -#define fn_6a 60097 -#define fn_6b 60098 +#define fn_a_pal 60080 +#define fn_1a_log 60081 +#define fn_1a 60082 +#define fn_1b 60083 +#define fn_1c 60084 +#define fn_1d 60085 +#define fn_1e 60086 +#define fn_4a 60087 +#define fn_4b_log 60088 +#define fn_4b 60089 +#define fn_4c_log 60090 +#define fn_4c 60091 +#define fn_5_pal 60092 +#define fn_5_log 60093 +#define fn_5 60094 +#define fn_6_pal 60095 +#define fn_6_log 60096 +#define fn_6a 60097 +#define fn_6b 60098 #ifdef short_intro_start -#define virgin_time_1 3 -#define viring_time_2 3 -#define rev_time 8 -#define gibb_time 6 +#define virgin_time_1 3 +#define viring_time_2 3 +#define rev_time 8 +#define gibb_time 6 #else -#define virgin_time_1 (3*50) -#define virgin_time_2 ((3*50)+8) -#define rev_time ((8*50)+8) -#define gibb_time ((6*50)+8) +#define virgin_time_1 (3*50) +#define virgin_time_2 ((3*50)+8) +#define rev_time ((8*50)+8) +#define gibb_time ((6*50)+8) #endif void prepare_text(void); @@ -85,20 +85,20 @@ uint8 *work_base; uint8 *work_screen; uint8 *work_screen_end; -uint8 *intro_text_space; //space for storing text messages -uint8 *intro_text_save; //save screen data here +uint8 *intro_text_space; //space for storing text messages +uint8 *intro_text_save; //save screen data here uint8 *vga_pointer; uint8 *diff_pointer; -uint32 no_frames; //number of frames in scrolling intro +uint32 no_frames; //number of frames in scrolling intro uint32 frame_counter; -#define ic_prepare_text 0 -#define ic_show_text 1 -#define ic_remove_text 2 -#define ic_make_sound 3 -#define ic_fx_volume 4 +#define ic_prepare_text 0 +#define ic_show_text 1 +#define ic_remove_text 2 +#define ic_make_sound 3 +#define ic_fx_volume 4 typedef void (*pfc)(void); @@ -106,7 +106,7 @@ pfc command_routines[] = { &prepare_text, &show_intro_text, &remove_text, &intro uint32 cockpit_commands[] = { - 1000, //do straight away + 1000, //do straight away ic_prepare_text, 77, 220, @@ -223,22 +223,22 @@ void SkyState::init_virgin() { _temp_pal = (uint8 *)load_file(60111, NULL); if (_temp_pal != NULL) - set_palette(_temp_pal); + set_palette(_temp_pal); _work_screen = (uint8 *)load_file(60110, NULL); if (_work_screen != NULL) - show_screen(); + show_screen(); - //free the memory that was malloc'ed indirectly via load_file - free (_work_screen); - free (_temp_pal); + // free the memory that was malloc'ed indirectly via load_file + free(_work_screen); + free(_temp_pal); } void SkyState::show_screen(void) { - _system->copy_rect(_work_screen, 320, 0, 0, 320, 200); - _system->update_screen(); + _system->copy_rect(_work_screen, 320, 0, 0, 320, 200); + _system->update_screen(); } void prepare_text(void) diff --git a/sky/screen.cpp b/sky/screen.cpp index 81f3d292233..4cebc3fb635 100644 --- a/sky/screen.cpp +++ b/sky/screen.cpp @@ -8,7 +8,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License @@ -25,73 +25,73 @@ #include "sky/skydefs.h" #include "sky/sky.h" -#define fade_jump 2 -#define scroll_jump 16 +#define fade_jump 2 +#define scroll_jump 16 -#define vga_colours 256 -#define game_colours 240 +#define vga_colours 256 +#define game_colours 240 uint8 top_16_colours[] = { - 0, 0, 0, - 38, 38, 38, - 63, 63, 63, - 0, 0, 0, - 0, 0, 0, - 0, 0, 0, - 0, 0, 0, - 54, 54, 54, - 45, 47, 49, - 32, 31, 41, - 29, 23, 37, - 23, 18, 30, - 49, 11, 11, - 39, 5, 5, - 29, 1, 1, - 63, 63, 63 + 0, 0, 0, + 38, 38, 38, + 63, 63, 63, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 54, 54, 54, + 45, 47, 49, + 32, 31, 41, + 29, 23, 37, + 23, 18, 30, + 49, 11, 11, + 39, 5, 5, + 29, 1, 1, + 63, 63, 63 }; void SkyState::initialise_screen(void) { - int i; - uint8 tmp_pal[1024]; - - _system->init_size(full_screen_width, full_screen_height); - _backscreen = (uint8 *)malloc(full_screen_width*full_screen_height); - _game_grid = (uint8 *)malloc(GRID_X*GRID_Y*2); - _work_palette = (uint8 *)malloc(vga_colours*3); + int i; + uint8 tmp_pal[1024]; + + _system->init_size(full_screen_width, full_screen_height); + _backscreen = (uint8 *)malloc(full_screen_width*full_screen_height); + _game_grid = (uint8 *)malloc(GRID_X*GRID_Y*2); + _work_palette = (uint8 *)malloc(vga_colours*3); - //blank the first 240 colors of the palette - memset(tmp_pal, 0, game_colours * 4); + //blank the first 240 colors of the palette + memset(tmp_pal, 0, game_colours * 4); - //set the remaining colors - for (i=0; i<(vga_colours-game_colours); i++) { - tmp_pal[game_colours+i*4] = (top_16_colours[i*3] << 2) + (top_16_colours[i*3] & 3); - tmp_pal[game_colours+i*4+1] = (top_16_colours[i*3+1] << 2) + (top_16_colours[i*3+1] & 3); - tmp_pal[game_colours+i*4+2] = (top_16_colours[i*3+2] << 2) + (top_16_colours[i*3+2] & 3); - tmp_pal[game_colours+i*4+3] = 0x00; - } + //set the remaining colors + for (i = 0; i < (vga_colours-game_colours); i++) { + tmp_pal[game_colours+i*4] = (top_16_colours[i*3] << 2) + (top_16_colours[i*3] & 3); + tmp_pal[game_colours+i*4+1] = (top_16_colours[i*3+1] << 2) + (top_16_colours[i*3+1] & 3); + tmp_pal[game_colours+i*4+2] = (top_16_colours[i*3+2] << 2) + (top_16_colours[i*3+2] & 3); + tmp_pal[game_colours+i*4+3] = 0x00; + } - //set the palette - _system->set_palette(tmp_pal, 0, 256); + //set the palette + _system->set_palette(tmp_pal, 0, 256); } //set a new palette, pal is a pointer to dos vga rgb components 0..63 void SkyState::set_palette(uint8 *pal) { - convert_palette(pal, _palette); - _system->set_palette(_palette, 0, 256); + convert_palette(pal, _palette); + _system->set_palette(_palette, 0, 256); } void SkyState::convert_palette(uint8 *inpal, uint8* outpal) //convert 3 byte 0..63 rgb to 4byte 0..255 rgbx { - int i; + int i; - for (i = 0; i < vga_colours; i++) { - outpal[4*i] = (inpal[3*i] << 2) + (inpal[3*i] & 3); - outpal[4*i+1] = (inpal[3*i+1] << 2) + (inpal[3*i+1] & 3); - outpal[4*i+2] = (inpal[3*i+2] << 2) + (inpal[3*i+2] & 3); - outpal[4*i+3] = 0x00; - } + for (i = 0; i < vga_colours; i++) { + outpal[4*i] = (inpal[3*i] << 2) + (inpal[3*i] & 3); + outpal[4*i+1] = (inpal[3*i+1] << 2) + (inpal[3*i+1] & 3); + outpal[4*i+2] = (inpal[3*i+2] << 2) + (inpal[3*i+2] & 3); + outpal[4*i+3] = 0x00; + } } diff --git a/sky/sky.cpp b/sky/sky.cpp index 414c222e6af..7e54abf96e6 100644 --- a/sky/sky.cpp +++ b/sky/sky.cpp @@ -8,7 +8,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License @@ -57,7 +57,7 @@ SkyState::SkyState(GameDetector *detector, OSystem *syst) _debugMode = detector->_debugMode; _debugLevel = detector->_debugLevel; - _language = detector->_language; + _language = detector->_language; } SkyState::~SkyState() @@ -85,13 +85,13 @@ void SkyState::go() void SkyState::initialise(void) { - //initialise_memory(); - //init_timer(); - //init_music(); - initialise_disk(); - initialise_screen(); - init_virgin(); - + //initialise_memory(); + //init_timer(); + //init_music(); + initialise_disk(); + initialise_screen(); + init_virgin(); + } void SkyState::delay(uint amount) //copied and mutilated from Simon.cpp