diff options
author | Ludvig Strigeus | 2002-04-14 11:00:33 +0000 |
---|---|---|
committer | Ludvig Strigeus | 2002-04-14 11:00:33 +0000 |
commit | a5e3dbb85dad96d8ffb6205e07d12ff8396ba5c7 (patch) | |
tree | c950787281596f75e4259f82fe621c1782109cbe | |
parent | b7fb4888e587114bd90338a10669e99ab9fe385e (diff) | |
download | scummvm-rg350-a5e3dbb85dad96d8ffb6205e07d12ff8396ba5c7.tar.gz scummvm-rg350-a5e3dbb85dad96d8ffb6205e07d12ff8396ba5c7.tar.bz2 scummvm-rg350-a5e3dbb85dad96d8ffb6205e07d12ff8396ba5c7.zip |
fixed alignment bugs and intro freeze in simon2
svn-id: r3936
-rw-r--r-- | simon/simon.cpp | 59 | ||||
-rw-r--r-- | simon/simon.h | 2 |
2 files changed, 37 insertions, 24 deletions
diff --git a/simon/simon.cpp b/simon/simon.cpp index 0a1aeb2aba..ada5890267 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -2154,6 +2154,8 @@ void SimonState::loadTablesIntoMem(uint subr_id) { memcpy(filename, "SFXXXX", 6); readSfxFile(filename); + alignTableMem(); + _tablesheap_ptr_new = _tablesheap_ptr; _tablesheap_curpos_new = _tablesheap_curpos; @@ -2434,7 +2436,7 @@ void SimonState::setup_cond_c_helper() { handle_unk_hitarea(_last_hitarea->fcs); } else if (_last_hitarea->item_ptr != NULL) { _hitarea_object_item = _last_hitarea->item_ptr; - _variableArray[0x78/2] = (_last_hitarea->flags&1) ? (_last_hitarea->flags>>8) : 0xFFFF; + _variableArray[60] = (_last_hitarea->flags&1) ? (_last_hitarea->flags>>8) : 0xFFFF; break; } } @@ -2820,7 +2822,7 @@ bool SimonState::hitarea_proc_2(uint a) { if (_game & GAME_SIMON2) { if (_bit_array[4]&0x8000) { Subroutine *sub; - _variableArray[0xA8/2] = a; + _variableArray[84] = a; sub = getSubroutineByID(5003); if (sub != NULL) startSubroutineEx(sub); @@ -3249,7 +3251,7 @@ if_1:; id = 0xFFFF; if (ha->flags&1) id = ha->flags>>8; - _variableArray[0x78/2] = id; + _variableArray[60] = id; new_current_hitarea(ha); if (_verb_hitarea != 0) break; @@ -3886,8 +3888,11 @@ void SimonState::run_vga_script() { #ifdef DUMP_CONTINOUS_VGASCRIPT if ((void*)_vc_ptr != (void*)&vc_get_out_of_code) { - fprintf(_dump_file,"%.5X: %5d %4d ", _vc_ptr -_cur_vga_file_1, _vga_cur_sprite_id, _vga_cur_file_id); - dump_video_script(_vc_ptr, true); +// if (_vga_cur_sprite_id==62 && _vga_cur_file_id==68 || +// _vga_cur_sprite_id==1 && _vga_cur_file_id==2) { + fprintf(_dump_file,"%.5d %.5X: %5d %4d ", _vga_tick_counter, _vc_ptr -_cur_vga_file_1, _vga_cur_sprite_id, _vga_cur_file_id); + dump_video_script(_vc_ptr, true); +// } } #endif @@ -3908,8 +3913,8 @@ void SimonState::run_vga_script() { } } -int SimonState::vc_read_var_or_word(void *ptr) { - int16 var = READ_BE_UINT16_UNALIGNED(ptr); +int SimonState::vc_read_var_or_word() { + int16 var = vc_read_next_word(); if (var < 0) var = vc_read_var(-var); return var; @@ -3976,7 +3981,7 @@ void SimonState::vc_2() { byte *old_file_1, *old_file_2; byte *b,*bb, *vc_ptr_org; - num = vc_read_var_or_word(_vc_ptr); + num = vc_read_var_or_word(); old_file_1 = _cur_vga_file_1; old_file_2 = _cur_vga_file_2; @@ -4015,7 +4020,7 @@ void SimonState::vc_2() { _cur_vga_file_1 = old_file_1; _cur_vga_file_2 = old_file_2; - _vc_ptr = vc_ptr_org + 2; + _vc_ptr = vc_ptr_org; } void SimonState::vc_3() { @@ -4724,8 +4729,7 @@ void SimonState::vc_12_sleep_variable() { uint num; if (!(_game & GAME_SIMON2)) { - num = vc_read_var_or_word(_vc_ptr); - _vc_ptr += 2; + num = vc_read_var_or_word(); } else { num = vc_read_next_byte() * _vga_base_delay; } @@ -4897,8 +4901,7 @@ void SimonState::vc_23_set_pri() { void SimonState::vc_24_set_image_xy() { VgaSprite *vsp = find_cur_sprite(); - vsp->image = vc_read_var_or_word(_vc_ptr); - _vc_ptr += 2; + vsp->image = vc_read_var_or_word(); if (vsp->id==0) { warning("Trying to set XY of nonexistent sprite '%d'", _vga_cur_sprite_id); @@ -5304,8 +5307,12 @@ void SimonState::vc_55_offset_hit_area() { void SimonState::vc_56_no_op() { /* No-Op in simon1 */ if (_game & GAME_SIMON2) { - uint num = vc_read_var_or_word(_vc_ptr) * _vga_base_delay; - _vc_ptr += 2; + uint num = vc_read_var_or_word() * _vga_base_delay; + +#ifdef DUMP_CONTINOUS_VGASCRIPT + fprintf(_dump_file,"; sleep_ex = %d\n", num + gss->VGA_DELAY_BASE); +#endif + add_vga_timer(num + gss->VGA_DELAY_BASE, _vc_ptr, _vga_cur_sprite_id, _vga_cur_file_id); _vc_ptr = (byte*)&vc_get_out_of_code; } @@ -5417,8 +5424,7 @@ void SimonState::vc_60() { void SimonState::vc_61_sprite_change() { VgaSprite *vsp = find_cur_sprite(); - vsp->image = vc_read_var_or_word(_vc_ptr); - _vc_ptr += 2; + vsp->image = vc_read_var_or_word(); vsp->x += vc_read_next_word(); vsp->y += vc_read_next_word(); @@ -6924,10 +6930,16 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, len_div_3 = (strlen(string_ptr) + 3) / 3; - if (_variableArray[0x11a/2] == 0) - _variableArray[0x11a/2] = 9; + if (!(_game & GAME_SIMON2)) { + if (_variableArray[141] == 0) + _variableArray[141] = 9; + _variableArray[85] = _variableArray[141] * len_div_3; + } else { + if (_variableArray[86] == 0) len_div_3 >>= 1; + if (_variableArray[86] == 2) len_div_3 <<= 1; + _variableArray[85] = len_div_3 * 5; + } - _variableArray[0xAA/2] = _variableArray[0x11A/2] * len_div_3; num_of_rows = strlen(string_ptr) / letters_per_row; while(num_of_rows==1 && j!=-1) { @@ -8066,6 +8078,9 @@ void decompressIcon(byte *dst, byte *src, uint pitch, byte base) { } } +#define SIMON2 +#define SIMON2WIN + static const char * const opcode_name_table[256] = { /* 0 */ "|INV_COND", @@ -8457,8 +8472,6 @@ void SimonState::dumpSubroutines() { } } - - const char * const video_opcode_name_table[] = { /* 0 */ "x|RET", @@ -8540,7 +8553,7 @@ const char * const video_opcode_name_table[] = { "ddd|OFFSET_HIT_AREA", /* 56 */ #ifdef SIMON2 - "d|SLEEP_EX", + "i|SLEEP_EX", #else "|DUMMY_7", #endif diff --git a/simon/simon.h b/simon/simon.h index 8fbcf4d346..a4067dad26 100644 --- a/simon/simon.h +++ b/simon/simon.h @@ -901,7 +901,7 @@ public: void delete_vga_timer(VgaTimerEntry *vte); void vc_resume_thread(byte *code_ptr, uint16 cur_file, uint16 cur_sprite); - int vc_read_var_or_word(void *ptr); + int vc_read_var_or_word(); uint vc_read_next_word(); uint vc_read_next_byte(); uint vc_read_var(uint var); |