diff options
Diffstat (limited to 'simon')
-rw-r--r-- | simon/midi.cpp | 215 | ||||
-rw-r--r-- | simon/simon.cpp | 2215 | ||||
-rw-r--r-- | simon/simon.h | 209 | ||||
-rw-r--r-- | simon/simondebug.cpp | 339 | ||||
-rw-r--r-- | simon/simonitems.cpp | 2249 | ||||
-rw-r--r-- | simon/simonres.cpp | 272 | ||||
-rw-r--r-- | simon/simonsys.cpp | 37 | ||||
-rw-r--r-- | simon/simonverb.cpp | 161 | ||||
-rw-r--r-- | simon/simonvga.cpp | 1100 |
9 files changed, 3778 insertions, 3019 deletions
diff --git a/simon/midi.cpp b/simon/midi.cpp index c4acc1390a..b9cf3ac867 100644 --- a/simon/midi.cpp +++ b/simon/midi.cpp @@ -27,57 +27,64 @@ #include "../sound/mixer.h" #include "simon.h" -void MidiPlayer::read_from_file(void *dst, uint size) { +void MidiPlayer::read_from_file(void *dst, uint size) +{ if (fread(dst, size, 1, _input) != 1) error("Midi read error"); } -byte MidiPlayer::read_byte_from_file() { +byte MidiPlayer::read_byte_from_file() +{ byte num; read_from_file(&num, 1); return num; } -uint32 MidiPlayer::read_uint32_from_file() { +uint32 MidiPlayer::read_uint32_from_file() +{ uint32 num; read_from_file(&num, 4); return READ_BE_UINT32(&num); } -uint16 MidiPlayer::read_uint16_from_file() { +uint16 MidiPlayer::read_uint16_from_file() +{ uint16 num; read_from_file(&num, 2); return READ_BE_UINT16(&num); } -void MidiPlayer::read_all_songs(FILE *in) { - uint i,num; - +void MidiPlayer::read_all_songs(FILE *in) +{ + uint i, num; + _input = in; _midi_cur_song_ptr = _midi_songs; num = read_byte_from_file(); - for(i=0; i!=num; i++) { + for (i = 0; i != num; i++) { read_one_song(&_midi_songs[i]); } } -void MidiPlayer::read_all_songs_old(FILE *in) { - uint i,num; - +void MidiPlayer::read_all_songs_old(FILE *in) +{ + uint i, num; + _input = in; _midi_cur_song_ptr = _midi_songs; num = 1; - for(i=0; i!=num; i++) { + for (i = 0; i != num; i++) { read_one_song(&_midi_songs[i]); } } -void MidiPlayer::read_mthd(Song *s, bool old) { +void MidiPlayer::read_mthd(Song *s, bool old) +{ Track *t; uint i; @@ -96,15 +103,15 @@ void MidiPlayer::read_mthd(Song *s, bool old) { read_byte_from_file(); } - s->tracks = t = (Track*)calloc(s->num_tracks, sizeof(Track)); + s->tracks = t = (Track *)calloc(s->num_tracks, sizeof(Track)); if (t == NULL) error("Out of memory when allocating MIDI tracks"); - - for(i=0; i!=s->num_tracks; i++, t++) { + + for (i = 0; i != s->num_tracks; i++, t++) { if (!old) { if (read_uint32_from_file() != 'MTrk') error("Midi track has no 'MTrk'"); - + t->data_size = read_uint32_from_file(); } else { uint32 pos = ftell(_input); @@ -114,7 +121,7 @@ void MidiPlayer::read_mthd(Song *s, bool old) { t->data_size = end - pos; } - t->data_ptr = (byte*)calloc(t->data_size,1); + t->data_ptr = (byte *)calloc(t->data_size, 1); if (t->data_ptr == NULL) error("Out of memory when allocating MIDI track data"); @@ -126,19 +133,20 @@ void MidiPlayer::read_mthd(Song *s, bool old) { t->a = 0; t->last_cmd = 0; t->delay = 0; - + if (t->data_cur_size == 0) { t->a |= 1; continue; } - + t->delay = track_read_gamma(t); } } -void MidiPlayer::read_one_song(Song *s) { +void MidiPlayer::read_one_song(Song *s) +{ _midi_var10 = 0; - + s->ppqn = 0; s->midi_format = 0; s->num_tracks = 0; @@ -146,7 +154,7 @@ void MidiPlayer::read_one_song(Song *s) { uint32 id = read_uint32_from_file(); - switch(id) { + switch (id) { case 'MThd': read_mthd(s, false); break; @@ -162,35 +170,38 @@ void MidiPlayer::read_one_song(Song *s) { } -uint32 MidiPlayer::track_read_gamma(Track *t) { +uint32 MidiPlayer::track_read_gamma(Track *t) +{ uint32 sum; byte b; sum = 0; do { b = track_read_byte(t); - sum = (sum<<7) | (b & 0x7F); + sum = (sum << 7) | (b & 0x7F); } while (b & 0x80); - return sum; + return sum; } -byte MidiPlayer::track_read_byte(Track *t) { +byte MidiPlayer::track_read_byte(Track *t) +{ if (t->a & 1) error("Trying to read byte from MIDI stream when end reached"); - + if (!--t->data_cur_size) { - t->a|=1; + t->a |= 1; } return *t->data_cur_ptr++; } -void MidiPlayer::initialize() { +void MidiPlayer::initialize() +{ int res; int i; - for(i=0; i!=16; i++) + for (i = 0; i != 16; i++) _midi_volume_table[i] = 100; _midi_5 = 0; @@ -199,31 +210,32 @@ void MidiPlayer::initialize() { res = _md->open(MidiDriver::MO_STREAMING); if (res != 0) error("MidiPlayer::initializer, got %s", MidiDriver::get_error_name(res)); - + _midi_var9 = true; } -int MidiPlayer::fill(MidiEvent *me, int num_event) { - uint32 best,j; - Track *best_track,*t; +int MidiPlayer::fill(MidiEvent *me, int num_event) +{ + uint32 best, j; + Track *best_track, *t; bool did_reset; NoteRec midi_tmp_note_rec; int i = 0; did_reset = false; - - for(i=0; i!=num_event;) { + + for (i = 0; i != num_event;) { best_track = NULL; best = 0xFFFFFFFF; /* Locate which track that's next */ t = _midi_cur_song_ptr->tracks; - for(j=_midi_cur_song_ptr->num_tracks; j; j--,t++) { - if (!(t->a&1)) { + for (j = _midi_cur_song_ptr->num_tracks; j; j--, t++) { + if (!(t->a & 1)) { if (t->delay < best) { best = t->delay; best_track = t; - } + } } } @@ -242,70 +254,75 @@ int MidiPlayer::fill(MidiEvent *me, int num_event) { if (fill_helper(&midi_tmp_note_rec, me + i)) i++; - if (midi_tmp_note_rec.sysex_data) free(midi_tmp_note_rec.sysex_data); + if (midi_tmp_note_rec.sysex_data) + free(midi_tmp_note_rec.sysex_data); } return i; } -int MidiPlayer::on_fill(void *param, MidiEvent *ev, int num) { - MidiPlayer *mp = (MidiPlayer*)param; +int MidiPlayer::on_fill(void *param, MidiEvent *ev, int num) +{ + MidiPlayer *mp = (MidiPlayer *) param; return mp->fill(ev, num); } -bool MidiPlayer::fill_helper(NoteRec *nr, MidiEvent *me) { +bool MidiPlayer::fill_helper(NoteRec *nr, MidiEvent *me) +{ uint b; b = nr->delay - _midi_var10; _midi_var10 = nr->delay; - - if (nr->cmd<0xF0) { + + if (nr->cmd < 0xF0) { me->delta = b; - me->event = nr->cmd | (nr->param_1<<8) | (nr->param_2<<16); - - if ((nr->cmd&0xF0) == 0xB0 && nr->param_1 == 7) { - _midi_volume_table[nr->cmd&0xF] = nr->param_2; + me->event = nr->cmd | (nr->param_1 << 8) | (nr->param_2 << 16); + + if ((nr->cmd & 0xF0) == 0xB0 && nr->param_1 == 7) { + _midi_volume_table[nr->cmd & 0xF] = nr->param_2; nr->param_1 = 0x76; - me->event = nr->cmd | (nr->param_1<<8) | (nr->param_2<<16)/* | MEVT_F_CALLBACK*/; + me->event = nr->cmd | (nr->param_1 << 8) | (nr->param_2 << 16) /* | MEVT_F_CALLBACK */ ; } return true; } - - if (nr->cmd==0xF0 || nr->cmd==0xF7 || nr->param_1 != 0x51) { + + if (nr->cmd == 0xF0 || nr->cmd == 0xF7 || nr->param_1 != 0x51) { return false; } - - _midi_tempo = nr->sysex_data[2] | (nr->sysex_data[1]<<8) | (nr->sysex_data[0]<<16); - _midi_var8 = (_midi_cur_song_ptr->ppqn*60000) / _midi_tempo; + + _midi_tempo = nr->sysex_data[2] | (nr->sysex_data[1] << 8) | (nr->sysex_data[0] << 16); + _midi_var8 = (_midi_cur_song_ptr->ppqn * 60000) / _midi_tempo; me->delta = b; - me->event = (MidiDriver::ME_TEMPO << 24) | _midi_tempo; + me->event = (MidiDriver::ME_TEMPO << 24)|_midi_tempo; return true; } -void MidiPlayer::reset_tracks() { +void MidiPlayer::reset_tracks() +{ Track *t; uint i; _midi_var10 = 0; - for(i=0,t=_midi_cur_song_ptr->tracks; i!=_midi_cur_song_ptr->num_tracks; i++,t++) { + for (i = 0, t = _midi_cur_song_ptr->tracks; i != _midi_cur_song_ptr->num_tracks; i++, t++) { t->data_cur_size = t->data_size; t->data_cur_ptr = t->data_ptr; t->a = 0; t->last_cmd = 0; t->delay = 0; - if (t->data_cur_size==0) { - t->a|=1; + if (t->data_cur_size == 0) { + t->a |= 1; } else { t->delay = track_read_gamma(t); } } } -void MidiPlayer::read_next_note(Track *t, NoteRec *nr) { +void MidiPlayer::read_next_note(Track *t, NoteRec *nr) +{ byte cmd_byte; uint i; @@ -315,94 +332,96 @@ void MidiPlayer::read_next_note(Track *t, NoteRec *nr) { nr->param_2 = 0; nr->cmd_length = 0; nr->sysex_data = NULL; - - if(t->a&1 || t->data_cur_size==0) + + if (t->a & 1 || t->data_cur_size == 0) error("read next note when track ended"); /* read next midi byte, but skip any pitch bends. */ - for(;;) { + for (;;) { cmd_byte = track_read_byte(t); - if ((cmd_byte&0xF0) != 0xE0) + if ((cmd_byte & 0xF0) != 0xE0) break; track_read_byte(t); track_read_byte(t); - } - + } + if (!(cmd_byte & 0x80)) { /* running status? */ - if (t->last_cmd==0) + if (t->last_cmd == 0) error("Last cmd = 0"); nr->cmd = t->last_cmd; nr->param_1 = cmd_byte; - cmd_byte = nr->cmd&0xF0; + cmd_byte = nr->cmd & 0xF0; nr->cmd_length = 2; - if (cmd_byte!=0xC0 && cmd_byte!=0xD0) { + if (cmd_byte != 0xC0 && cmd_byte != 0xD0) { nr->param_2 = track_read_byte(t); nr->cmd_length++; } - } else if ((cmd_byte&0xF0)!=0xF0) { + } else if ((cmd_byte & 0xF0) != 0xF0) { nr->cmd = cmd_byte; t->last_cmd = cmd_byte; cmd_byte &= 0xF0; - nr->cmd_length = (cmd_byte==0xC0 || cmd_byte==0xD0) ? 2 : 3; - - if (t->data_cur_size < nr->cmd_length-1) { + nr->cmd_length = (cmd_byte == 0xC0 || cmd_byte == 0xD0) ? 2 : 3; + + if (t->data_cur_size < nr->cmd_length - 1) { error("read_next_note: end of stream"); } - + nr->param_1 = track_read_byte(t); - if (nr->cmd_length==3) + if (nr->cmd_length == 3) nr->param_2 = track_read_byte(t); - } else if (cmd_byte==0xF0 || cmd_byte==0xF7) { + } else if (cmd_byte == 0xF0 || cmd_byte == 0xF7) { nr->cmd = cmd_byte; nr->cmd_length = track_read_gamma(t); if (t->data_cur_size < nr->cmd_length) error("read_next_note: end of stream 2"); - nr->sysex_data = (byte*)malloc(nr->cmd_length); - if (nr->sysex_data==NULL) + nr->sysex_data = (byte *)malloc(nr->cmd_length); + if (nr->sysex_data == NULL) error("read_next_note: out of memory"); - for(i=0; i!=nr->cmd_length; i++) + for (i = 0; i != nr->cmd_length; i++) nr->sysex_data[i] = track_read_byte(t); - } else if (cmd_byte==0xFF) { - + } else if (cmd_byte == 0xFF) { + nr->cmd = cmd_byte; nr->param_1 = track_read_byte(t); nr->cmd_length = track_read_gamma(t); if (nr->cmd_length) { if (t->data_cur_size < nr->cmd_length) error("read_next_note: end of stream 3"); - nr->sysex_data = (byte*)malloc(nr->cmd_length); - if (nr->sysex_data==NULL) + nr->sysex_data = (byte *)malloc(nr->cmd_length); + if (nr->sysex_data == NULL) error("read_next_note: out of memory"); - for(i=0; i!=nr->cmd_length; i++) + for (i = 0; i != nr->cmd_length; i++) nr->sysex_data[i] = track_read_byte(t); } - if (nr->param_1==0x2F) - t->a|=1; + if (nr->param_1 == 0x2F) + t->a |= 1; } else { error("Invalid sysex cmd"); } nr->delay = t->delay; - if (!(t->a&1)) { + if (!(t->a & 1)) { t->delay += track_read_gamma(t); } } -void MidiPlayer::shutdown() { +void MidiPlayer::shutdown() +{ _md->close(); unload(); } -void MidiPlayer::unload() { - uint i,j; +void MidiPlayer::unload() +{ + uint i, j; Song *s; Track *t; - for(i=0,s=_midi_songs; i!=8; i++,s++) { + for (i = 0, s = _midi_songs; i != 8; i++, s++) { if (s->tracks) { - for(j=0,t=s->tracks; j!=s->num_tracks;j++,t++) { + for (j = 0, t = s->tracks; j != s->num_tracks; j++, t++) { if (t->data_ptr) free(t->data_ptr); } @@ -412,14 +431,14 @@ void MidiPlayer::unload() { } } -void MidiPlayer::play() { +void MidiPlayer::play() +{ _md->pause(false); } -void MidiPlayer::set_driver(MidiDriver *md) { +void MidiPlayer::set_driver(MidiDriver *md) +{ _md = md; md->set_stream_callback(this, on_fill); } - - diff --git a/simon/simon.cpp b/simon/simon.cpp index 00a405f351..2ce4dd91dc 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -31,35 +31,47 @@ byte *sdl_buf_attached; SimonState *g_simon; -SimonState *SimonState::create(OSystem *syst, MidiDriver *driver) { - SimonState *s = new SimonState; +SimonState *SimonState::create(OSystem *syst, MidiDriver *driver) +{ + SimonState *s = new SimonState; s->_system = syst; /* Setup midi driver */ s->midi.set_driver(driver); - + /* Setup mixer */ if (!s->_mixer->bind_to_system(syst)) warning("Sound initialization failed. " - "Features of the game that depend on sound synchronization will most likely break"); + "Features of the game that depend on sound synchronization will most likely break"); return s; } -void palette_fadeout(uint32 *pal_values,uint num) { - byte *p = (byte*)pal_values; +void palette_fadeout(uint32 *pal_values, uint num) +{ + byte *p = (byte *)pal_values; do { - if (p[0]>=8) p[0] -= 8; else p[0] = 0; - if (p[1]>=8) p[1] -= 8; else p[1] = 0; - if (p[2]>=8) p[2] -= 8; else p[2] = 0; + if (p[0] >= 8) + p[0] -= 8; + else + p[0] = 0; + if (p[1] >= 8) + p[1] -= 8; + else + p[1] = 0; + if (p[2] >= 8) + p[2] -= 8; + else + p[2] = 0; p += sizeof(uint32); } while (--num); } -byte *SimonState::allocateItem(uint size) { +byte *SimonState::allocateItem(uint size) +{ byte *org = _itemheap_ptr; size = (size + 3) & ~3; @@ -72,16 +84,18 @@ byte *SimonState::allocateItem(uint size) { return org; } -void SimonState::alignTableMem() { +void SimonState::alignTableMem() +{ if ((uint32)_tablesheap_ptr & 3) { _tablesheap_ptr += 2; _tablesheap_curpos += 2; } } -byte *SimonState::allocateTable(uint size) { +byte *SimonState::allocateTable(uint size) +{ byte *org = _tablesheap_ptr; - + size = (size + 1) & ~1; _tablesheap_ptr += size; @@ -93,61 +107,65 @@ byte *SimonState::allocateTable(uint size) { return org; } -int SimonState::allocGamePcVars(FILE *in) { +int SimonState::allocGamePcVars(FILE *in) +{ uint item_array_size, item_array_inited, stringtable_num; uint32 version; uint i; - + item_array_size = fileReadBE32(in); version = fileReadBE32(in); item_array_inited = fileReadBE32(in); stringtable_num = fileReadBE32(in); - item_array_inited += 2; /* first two items are predefined */ + item_array_inited += 2; /* first two items are predefined */ item_array_size += 2; if (version != 0x80) error("Not a runtime database"); - _itemarray_ptr = (Item**)calloc(item_array_size, sizeof(Item*)); + _itemarray_ptr = (Item **)calloc(item_array_size, sizeof(Item *)); if (_itemarray_ptr == NULL) error("Out of memory for Item array"); _itemarray_size = item_array_size; _itemarray_inited = item_array_inited; - for(i=2; i!=item_array_inited; i++) { - _itemarray_ptr[i] = (Item*)allocateItem(sizeof(Item)); + for (i = 2; i != item_array_inited; i++) { + _itemarray_ptr[i] = (Item *)allocateItem(sizeof(Item)); } /* The rest is cleared automatically by calloc */ allocateStringTable(stringtable_num + 10); _stringtab_num = stringtable_num; - return item_array_inited; + return item_array_inited; } -Item *SimonState::allocItem1() { - Item *item = (Item*)allocateItem(sizeof(Item)); +Item *SimonState::allocItem1() +{ + Item *item = (Item *)allocateItem(sizeof(Item)); _itemarray_ptr[1] = item; return item; } -void SimonState::loginPlayerHelper(Item *item, int a, int b) { +void SimonState::loginPlayerHelper(Item *item, int a, int b) +{ Child9 *child; - child = (Child9*)findChildOfType(item, 9); + child = (Child9 *) findChildOfType(item, 9); if (child == NULL) { - child = (Child9*)allocateChildBlock(item, 9, sizeof(Child9)); + child = (Child9 *) allocateChildBlock(item, 9, sizeof(Child9)); } - if (a>=0 && a<=3) + if (a >= 0 && a <= 3) child->array[a] = b; } -void SimonState::loginPlayer() { +void SimonState::loginPlayer() +{ Item *item; Child *child; @@ -156,54 +174,58 @@ void SimonState::loginPlayer() { item->unk1 = 10000; _item_1 = item; - child = (Child*)allocateChildBlock(item, 3, sizeof(Child)); + child = (Child *)allocateChildBlock(item, 3, sizeof(Child)); if (child == NULL) error("player create failure"); loginPlayerHelper(item, 0, 0); } -void SimonState::allocateStringTable(int num) { - _stringtab_ptr = (byte**)calloc(num, sizeof(byte*)); +void SimonState::allocateStringTable(int num) +{ + _stringtab_ptr = (byte **)calloc(num, sizeof(byte *)); _stringtab_pos = 0; _stringtab_numalloc = num; } -void SimonState::setupStringTable(byte *mem, int num) { +void SimonState::setupStringTable(byte *mem, int num) +{ int i = 0; - for(;;) { + for (;;) { _stringtab_ptr[i++] = mem; if (--num == 0) break; - for(;*mem;mem++); + for (; *mem; mem++); mem++; } _stringtab_pos = i; } -void SimonState::setupLocalStringTable(byte *mem, int num) { +void SimonState::setupLocalStringTable(byte *mem, int num) +{ int i = 0; - for(;;) { + for (;;) { _local_stringtable[i++] = mem; if (--num == 0) break; - for(;*mem;mem++); + for (; *mem; mem++); mem++; } } -void SimonState::readSubroutineLine(FILE *in, SubroutineLine *sl, Subroutine *sub) { +void SimonState::readSubroutineLine(FILE *in, SubroutineLine *sl, Subroutine *sub) +{ byte line_buffer[1024], *q = line_buffer; int size; - + if (sub->id == 0) { sl->cond_a = fileReadBE16(in); sl->cond_b = fileReadBE16(in); sl->cond_c = fileReadBE16(in); } - while ( (*q = fileReadByte(in)) != 0xFF) { + while ((*q = fileReadByte(in)) != 0xFF) { if (*q == 87) { fileReadBE16(in); } else { @@ -216,21 +238,22 @@ void SimonState::readSubroutineLine(FILE *in, SubroutineLine *sl, Subroutine *su memcpy(allocateTable(size), line_buffer, size); } -SubroutineLine *SimonState::createSubroutineLine(Subroutine *sub, int where) { +SubroutineLine *SimonState::createSubroutineLine(Subroutine *sub, int where) +{ SubroutineLine *sl, *cur_sl = NULL, *last_sl = NULL; if (sub->id == 0) - sl = (SubroutineLine*)allocateTable(SUBROUTINE_LINE_BIG_SIZE); + sl = (SubroutineLine *)allocateTable(SUBROUTINE_LINE_BIG_SIZE); else - sl = (SubroutineLine*)allocateTable(SUBROUTINE_LINE_SMALL_SIZE); + sl = (SubroutineLine *)allocateTable(SUBROUTINE_LINE_SMALL_SIZE); /* where is what offset to insert the line at, locate the proper beginning line */ if (sub->first != 0) { - cur_sl = (SubroutineLine*) ((byte*)sub + sub->first); + cur_sl = (SubroutineLine *)((byte *)sub + sub->first); while (where) { last_sl = cur_sl; - cur_sl = (SubroutineLine*) ((byte*)sub + cur_sl->next); - if ((byte*)cur_sl == (byte*)sub) + cur_sl = (SubroutineLine *)((byte *)sub + cur_sl->next); + if ((byte *)cur_sl == (byte *)sub) break; where--; } @@ -238,29 +261,31 @@ SubroutineLine *SimonState::createSubroutineLine(Subroutine *sub, int where) { if (last_sl != NULL) { /* Insert the subroutine line in the middle of the link */ - last_sl->next = (byte*)sl - (byte*)sub; - sl->next = (byte*)cur_sl - (byte*)sub; + last_sl->next = (byte *)sl - (byte *)sub; + sl->next = (byte *)cur_sl - (byte *)sub; } else { /* Insert the subroutine line at the head of the link */ sl->next = sub->first; - sub->first = (byte*)sl - (byte*)sub; + sub->first = (byte *)sl - (byte *)sub; } return sl; } -void SimonState::readSubroutine(FILE *in, Subroutine *sub) { +void SimonState::readSubroutine(FILE *in, Subroutine *sub) +{ while (fileReadBE16(in) == 0) { - readSubroutineLine(in,createSubroutineLine(sub, 0xFFFF),sub); + readSubroutineLine(in, createSubroutineLine(sub, 0xFFFF), sub); } } -Subroutine *SimonState::createSubroutine(uint id) { +Subroutine *SimonState::createSubroutine(uint id) +{ Subroutine *sub; - + alignTableMem(); - sub = (Subroutine*)allocateTable(sizeof(Subroutine)); + sub = (Subroutine *)allocateTable(sizeof(Subroutine)); sub->id = id; sub->first = 0; sub->next = _subroutine_list; @@ -268,180 +293,221 @@ Subroutine *SimonState::createSubroutine(uint id) { return sub; } -void SimonState::readSubroutineBlock(FILE *in) { +void SimonState::readSubroutineBlock(FILE *in) +{ while (fileReadBE16(in) == 0) { - readSubroutine(in,createSubroutine(fileReadBE16(in))); + readSubroutine(in, createSubroutine(fileReadBE16(in))); } } -Child *SimonState::findChildOfType(Item *i, uint type) { +Child *SimonState::findChildOfType(Item *i, uint type) +{ Child *child = i->children; - for(;child; child = child->next) + for (; child; child = child->next) if (child->type == type) return child; return NULL; } -bool SimonState::hasChildOfType1(Item *item) { +bool SimonState::hasChildOfType1(Item *item) +{ return findChildOfType1(item) != NULL; } -bool SimonState::hasChildOfType2(Item *item) { +bool SimonState::hasChildOfType2(Item *item) +{ return findChildOfType2(item) != NULL; } -Child1 *SimonState::findChildOfType1(Item *item) { - return (Child1*)findChildOfType(item, 1); +Child1 *SimonState::findChildOfType1(Item *item) +{ + return (Child1 *)findChildOfType(item, 1); } -Child2 *SimonState::findChildOfType2(Item *item) { - return (Child2*)findChildOfType(item, 2); +Child2 *SimonState::findChildOfType2(Item *item) +{ + return (Child2 *)findChildOfType(item, 2); } -Child3 *SimonState::findChildOfType3(Item *item) { - return (Child3*)findChildOfType(item, 3); +Child3 *SimonState::findChildOfType3(Item *item) +{ + return (Child3 *) findChildOfType(item, 3); } -uint SimonState::getOffsetOfChild2Param(Child2 *child, uint prop) { +uint SimonState::getOffsetOfChild2Param(Child2 *child, uint prop) +{ uint m = 1; uint offset = 0; while (m != prop) { if (child->avail_props & m) offset++; - m<<=1; + m <<= 1; } return offset; } -Child *SimonState::allocateChildBlock(Item *i, uint type, uint size) { - Child *child = (Child*)allocateItem(size); +Child *SimonState::allocateChildBlock(Item *i, uint type, uint size) +{ + Child *child = (Child *)allocateItem(size); child->next = i->children; i->children = child; child->type = type; return child; } -void SimonState::allocItemHeap() { +void SimonState::allocItemHeap() +{ _itemheap_size = 10000; _itemheap_curpos = 0; - _itemheap_ptr = (byte*)calloc(10000, 1); + _itemheap_ptr = (byte *)calloc(10000, 1); } -void SimonState::allocTablesHeap() { +void SimonState::allocTablesHeap() +{ _tablesheap_size = gss->TABLES_MEM_SIZE; _tablesheap_curpos = 0; - _tablesheap_ptr = (byte*)calloc(gss->TABLES_MEM_SIZE, 1); + _tablesheap_ptr = (byte *)calloc(gss->TABLES_MEM_SIZE, 1); } -void SimonState::setItemUnk3(Item *item, int value) { +void SimonState::setItemUnk3(Item *item, int value) +{ item->unk3 = value; } -int SimonState::getNextWord() { +int SimonState::getNextWord() +{ _code_ptr += 2; - return (int16)((_code_ptr[-2]<<8) | _code_ptr[-1]); + return (int16)((_code_ptr[-2] << 8) | _code_ptr[-1]); } -uint SimonState::getNextStringID() { +uint SimonState::getNextStringID() +{ return (uint16)getNextWord(); } -uint SimonState::getVarOrByte() { +uint SimonState::getVarOrByte() +{ uint a = *_code_ptr++; - if (a!=255) + if (a != 255) return a; return readVariable(*_code_ptr++); } -uint SimonState::getVarOrWord() { - uint a = (_code_ptr[0]<<8) | _code_ptr[1]; +uint SimonState::getVarOrWord() +{ + uint a = (_code_ptr[0] << 8) | _code_ptr[1]; _code_ptr += 2; - if (a>=30000 && a<30512) + if (a >= 30000 && a < 30512) return readVariable(a - 30000); return a; } -Item *SimonState::getNextItemPtr() { +Item *SimonState::getNextItemPtr() +{ int a = getNextWord(); - switch(a) { - case -1: return _subject_item; - case -3: return _object_item; - case -5: return getItem1Ptr(); - case -7: return getItemPtrB(); - case -9: return derefItem(getItem1Ptr()->parent); + switch (a) { + case -1: + return _subject_item; + case -3: + return _object_item; + case -5: + return getItem1Ptr(); + case -7: + return getItemPtrB(); + case -9: + return derefItem(getItem1Ptr()->parent); default: return derefItem(a); } } -Item *SimonState::getNextItemPtrStrange() { +Item *SimonState::getNextItemPtrStrange() +{ int a = getNextWord(); - switch(a) { - case -1: return _subject_item; - case -3: return _object_item; - case -5: return &_dummy_item_2; - case -7: return NULL; - case -9: return &_dummy_item_3; + switch (a) { + case -1: + return _subject_item; + case -3: + return _object_item; + case -5: + return &_dummy_item_2; + case -7: + return NULL; + case -9: + return &_dummy_item_3; default: return derefItem(a); } } -uint SimonState::getNextItemID() { +uint SimonState::getNextItemID() +{ int a = getNextWord(); - switch(a) { - case -1: return itemPtrToID(_subject_item); - case -3: return itemPtrToID(_object_item); - case -5: return getItem1ID(); - case -7: return 0; - case -9: return getItem1Ptr()->parent; + switch (a) { + case -1: + return itemPtrToID(_subject_item); + case -3: + return itemPtrToID(_object_item); + case -5: + return getItem1ID(); + case -7: + return 0; + case -9: + return getItem1Ptr()->parent; default: return a; } } -Item *SimonState::getItem1Ptr() { +Item *SimonState::getItem1Ptr() +{ if (_item_1_ptr) - return _item_1_ptr; + return _item_1_ptr; return &_dummy_item_1; } -Item *SimonState::getItemPtrB() { +Item *SimonState::getItemPtrB() +{ error("getItemPtrB: is this code ever used?"); if (_item_ptr_B) - return _item_ptr_B; + return _item_ptr_B; return &_dummy_item_1; } -uint SimonState::getNextVarContents() { +uint SimonState::getNextVarContents() +{ return (uint16)readVariable(getVarOrByte()); } -uint SimonState::readVariable(uint variable) { +uint SimonState::readVariable(uint variable) +{ if (variable >= 255) error("Variable %d out of range in read", variable); return _variableArray[variable]; } -void SimonState::writeNextVarContents(uint16 contents) { +void SimonState::writeNextVarContents(uint16 contents) +{ writeVariable(getVarOrByte(), contents); } -void SimonState::writeVariable(uint variable, uint16 contents) { +void SimonState::writeVariable(uint variable, uint16 contents) +{ if (variable >= 256) error("Variable %d out of range in write", variable); _variableArray[variable] = contents; } -void SimonState::setItemParent(Item *item, Item *parent) { +void SimonState::setItemParent(Item *item, Item *parent) +{ Item *old_parent = derefItem(item->parent); - if (item==parent) + if (item == parent) error("Trying to set item as its own parent"); - + /* unlink it if it has a parent */ if (old_parent) unlinkItem(item); @@ -450,16 +516,17 @@ void SimonState::setItemParent(Item *item, Item *parent) { itemChildrenChanged(parent); } -void SimonState::itemChildrenChanged(Item *item) { +void SimonState::itemChildrenChanged(Item *item) +{ int i; FillOrCopyStruct *fcs; if (_no_parent_notify) return; - + lock(); - for(i=0; i!=8; i++) { + for (i = 0; i != 8; i++) { fcs = _fcs_ptr_array_3[i]; if (fcs && fcs->fcs_data && fcs->fcs_data->item_ptr == item) { if (_fcs_data_1[i]) { @@ -468,13 +535,14 @@ void SimonState::itemChildrenChanged(Item *item) { _fcs_data_2[i] = false; fcs_unk_proc_1(i, item, fcs->fcs_data->unk1, fcs->fcs_data->unk2); } - } - } - - unlock(); + } + } + + unlock(); } -void SimonState::unlinkItem(Item *item) { +void SimonState::unlinkItem(Item *item) +{ Item *first, *parent, *next; /* cannot unlink item without parent */ @@ -484,7 +552,7 @@ void SimonState::unlinkItem(Item *item) { /* get parent and first child of parent */ parent = derefItem(item->parent); first = derefItem(parent->child); - + /* the node to remove is first in the parent's children? */ if (first == item) { parent->child = item->sibling; @@ -493,7 +561,7 @@ void SimonState::unlinkItem(Item *item) { return; } - for(;;) { + for (;;) { if (!first) error("unlinkItem: parent empty"); if (first->sibling == 0) @@ -504,13 +572,14 @@ void SimonState::unlinkItem(Item *item) { first->sibling = next->sibling; item->parent = 0; item->sibling = 0; - return; + return; } first = next; } } -void SimonState::linkItem(Item *item, Item *parent) { +void SimonState::linkItem(Item *item, Item *parent) +{ uint id; /* Don't allow that an item that is already linked is relinked */ if (item->parent) @@ -527,11 +596,12 @@ void SimonState::linkItem(Item *item, Item *parent) { } } -const byte *SimonState::getStringPtrByID(uint string_id) { +const byte *SimonState::getStringPtrByID(uint string_id) +{ const byte *string_ptr; byte *dst; - _free_string_slot ^= 1; + _free_string_slot ^= 1; if (string_id < 0x8000) { string_ptr = _stringtab_ptr[string_id]; @@ -540,18 +610,20 @@ const byte *SimonState::getStringPtrByID(uint string_id) { } dst = &_stringReturnBuffer[_free_string_slot][0]; - strcpy((char*)dst, (const char*)string_ptr); + strcpy((char *)dst, (const char *)string_ptr); return dst; } -const byte *SimonState::getLocalStringByID(uint string_id) { +const byte *SimonState::getLocalStringByID(uint string_id) +{ if (string_id < _string_id_local_min || string_id >= _string_id_local_max) { loadTextIntoMem(string_id); } return _local_stringtable[string_id - _string_id_local_min]; } -void SimonState::loadTextIntoMem(uint string_id) { +void SimonState::loadTextIntoMem(uint string_id) +{ byte *p; char filename[30]; int i; @@ -564,21 +636,21 @@ void SimonState::loadTextIntoMem(uint string_id) { /* get filename */ while (*p) { - for(i=0;*p;p++,i++) + for (i = 0; *p; p++, i++) filename[i] = *p; - filename[i] = 0; + filename[i] = 0; p++; - base_max = (p[0]<<8) | p[1]; + base_max = (p[0] << 8) | p[1]; p += 2; if (string_id < base_max) { _string_id_local_min = base_min; _string_id_local_max = base_max; - - _local_stringtable = (byte**)_tablesheap_ptr; - size = (base_max - base_min + 1) * sizeof(byte*); + _local_stringtable = (byte **)_tablesheap_ptr; + + size = (base_max - base_min + 1) * sizeof(byte *); _tablesheap_ptr += size; _tablesheap_curpos += size; @@ -601,7 +673,8 @@ void SimonState::loadTextIntoMem(uint string_id) { error("loadTextIntoMem: didn't find %d", string_id); } -void SimonState::loadTablesIntoMem(uint subr_id) { +void SimonState::loadTablesIntoMem(uint subr_id) +{ byte *p; int i; uint min_num, max_num; @@ -610,22 +683,22 @@ void SimonState::loadTablesIntoMem(uint subr_id) { p = _tbl_list; if (p == NULL) - return; + return; while (*p) { - for(i=0;*p;p++,i++) + for (i = 0; *p; p++, i++) filename[i] = *p; filename[i] = 0; p++; - for(;;) { - min_num = (p[0]<<8) | p[1]; + for (;;) { + min_num = (p[0] << 8) | p[1]; p += 2; - if (min_num==0) + if (min_num == 0) break; - max_num = (p[0]<<8) | p[1]; + max_num = (p[0] << 8) | p[1]; p += 2; if (subr_id >= min_num && subr_id <= max_num) { @@ -643,7 +716,7 @@ void SimonState::loadTablesIntoMem(uint subr_id) { readSfxFile(filename); alignTableMem(); - + _tablesheap_ptr_new = _tablesheap_ptr; _tablesheap_curpos_new = _tablesheap_curpos; @@ -657,17 +730,18 @@ void SimonState::loadTablesIntoMem(uint subr_id) { warning("loadTablesIntoMem: didn't find %d", subr_id); } -Subroutine *SimonState::getSubroutineByID(uint subroutine_id) { +Subroutine *SimonState::getSubroutineByID(uint subroutine_id) +{ Subroutine *cur; - - for(cur=_subroutine_list; cur; cur = cur->next) { + + for (cur = _subroutine_list; cur; cur = cur->next) { if (cur->id == subroutine_id) return cur; } loadTablesIntoMem(subroutine_id); - - for(cur=_subroutine_list; cur; cur = cur->next) { + + for (cur = _subroutine_list; cur; cur = cur->next) { if (cur->id == subroutine_id) return cur; } @@ -676,21 +750,23 @@ Subroutine *SimonState::getSubroutineByID(uint subroutine_id) { return NULL; } -uint SimonState::loadTextFile_gme(const char *filename, byte *dst) { +uint SimonState::loadTextFile_gme(const char *filename, byte *dst) +{ uint res; uint32 offs; uint32 size; res = atoi(filename + 4) + gss->TEXT_INDEX_BASE - 1; offs = _game_offsets_ptr[res]; - size = _game_offsets_ptr[res+1] - offs; + size = _game_offsets_ptr[res + 1] - offs; resfile_read(dst, offs, size); return size; } -FILE *SimonState::openTablesFile_gme(const char *filename) { +FILE *SimonState::openTablesFile_gme(const char *filename) +{ uint res; uint32 offs; @@ -701,23 +777,25 @@ FILE *SimonState::openTablesFile_gme(const char *filename) { return _game_file; } -void SimonState::closeTablesFile_gme(FILE *in) { +void SimonState::closeTablesFile_gme(FILE *in) +{ /* not needed */ } /* Simon1DOS load tables file */ -uint SimonState::loadTextFile_simon1(const char *filename, byte *dst) { +uint SimonState::loadTextFile_simon1(const char *filename, byte *dst) +{ FILE *fo = fopen_maybe_lowercase(filename); uint32 size; - - if (fo==NULL) + + if (fo == NULL) error("loadTextFile: Cannot open '%s'", filename); fseek(fo, 0, SEEK_END); size = ftell(fo); fseek(fo, 0, SEEK_SET); - if (fread(dst, size,1, fo) != 1) + if (fread(dst, size, 1, fo) != 1) error("loadTextFile: fread failed"); fclose(fo); @@ -725,40 +803,46 @@ uint SimonState::loadTextFile_simon1(const char *filename, byte *dst) { } -FILE *SimonState::openTablesFile_simon1(const char *filename) { +FILE *SimonState::openTablesFile_simon1(const char *filename) +{ FILE *fo = fopen_maybe_lowercase(filename); - if (fo==NULL) + if (fo == NULL) error("openTablesFile: Cannot open '%s'", filename); return fo; } -void SimonState::closeTablesFile_simon1(FILE *in) { +void SimonState::closeTablesFile_simon1(FILE *in) +{ fclose(in); } -uint SimonState::loadTextFile(const char *filename, byte *dst) { +uint SimonState::loadTextFile(const char *filename, byte *dst) +{ if (_game == GAME_SIMON1DOS) return loadTextFile_simon1(filename, dst); else return loadTextFile_gme(filename, dst); } -FILE *SimonState::openTablesFile(const char *filename) { +FILE *SimonState::openTablesFile(const char *filename) +{ if (_game == GAME_SIMON1DOS) return openTablesFile_simon1(filename); else return openTablesFile_gme(filename); } -void SimonState::closeTablesFile(FILE *in) { +void SimonState::closeTablesFile(FILE *in) +{ if (_game == GAME_SIMON1DOS) closeTablesFile_simon1(in); else closeTablesFile_gme(in); } -void SimonState::addTimeEvent(uint timeout, uint subroutine_id) { - TimeEvent *te = (TimeEvent*)malloc(sizeof(TimeEvent)), *first, *last = NULL; +void SimonState::addTimeEvent(uint timeout, uint subroutine_id) +{ + TimeEvent *te = (TimeEvent *)malloc(sizeof(TimeEvent)), *first, *last = NULL; time_t cur_time; time(&cur_time); @@ -792,7 +876,8 @@ void SimonState::addTimeEvent(uint timeout, uint subroutine_id) { } } -void SimonState::delTimeEvent(TimeEvent *te) { +void SimonState::delTimeEvent(TimeEvent *te) +{ TimeEvent *cur; if (te == _pending_delete_time_event) @@ -807,8 +892,8 @@ void SimonState::delTimeEvent(TimeEvent *te) { cur = _first_time_struct; if (cur == NULL) error("delTimeEvent: none available"); - - for(;;) { + + for (;;) { if (cur->next == NULL) error("delTimeEvent: no such te"); if (te == cur->next) { @@ -820,16 +905,18 @@ void SimonState::delTimeEvent(TimeEvent *te) { } } -void SimonState::killAllTimers() { +void SimonState::killAllTimers() +{ TimeEvent *cur, *next; - for(cur=_first_time_struct; cur; cur = next) { + for (cur = _first_time_struct; cur; cur = next) { next = cur->next; delTimeEvent(cur); } } -bool SimonState::kickoffTimeEvents() { +bool SimonState::kickoffTimeEvents() +{ time_t cur_time; TimeEvent *te; bool result = false; @@ -837,7 +924,7 @@ bool SimonState::kickoffTimeEvents() { time(&cur_time); cur_time -= _base_time; - while ((te=_first_time_struct) != NULL && te->time<=(uint32)cur_time) { + while ((te = _first_time_struct) != NULL && te->time <= (uint32)cur_time) { result = true; _pending_delete_time_event = te; invokeTimeEvent(te); @@ -850,7 +937,8 @@ bool SimonState::kickoffTimeEvents() { return result; } -void SimonState::invokeTimeEvent(TimeEvent *te) { +void SimonState::invokeTimeEvent(TimeEvent *te) +{ Subroutine *sub; _script_cond_a = 0; @@ -862,17 +950,18 @@ void SimonState::invokeTimeEvent(TimeEvent *te) { _run_script_return_1 = false; } -void SimonState::o_setup_cond_c() { +void SimonState::o_setup_cond_c() +{ Item *item = _item_1; setup_cond_c_helper(); _item_1_ptr = item; _object_item = _hitarea_object_item; - + if (_object_item == &_dummy_item_2) _object_item = getItem1Ptr(); - + if (_object_item == &_dummy_item_3) _object_item = derefItem(getItem1Ptr()->parent); @@ -883,12 +972,13 @@ void SimonState::o_setup_cond_c() { } } -void SimonState::setup_cond_c_helper() { +void SimonState::setup_cond_c_helper() +{ HitArea *last; if ((_game == GAME_SIMON2WIN) || (_game == GAME_SIMON2DOS)) { _mouse_cursor = 0; - if (_hitarea_unk_4!=999) { + if (_hitarea_unk_4 != 999) { _mouse_cursor = 9; _need_hitarea_recalc++; _hitarea_unk_4 = 0; @@ -898,24 +988,24 @@ void SimonState::setup_cond_c_helper() { _last_hitarea = 0; _hitarea_object_item = NULL; _hitarea_unk_6 = true; - + last = _last_hitarea_2_ptr; defocusHitarea(); _last_hitarea_2_ptr = last; - for(;;) { + for (;;) { _last_hitarea = NULL; _last_hitarea_3 = 0; _left_button_down = 0; do { - if (GetAsyncKeyState(VK_F5) != 0 && _bit_array[0]&0x200) { + if (GetAsyncKeyState(VK_F5) != 0 && _bit_array[0] & 0x200) { startSubroutine170(); goto out_of_here; } delay(100); - } while (_last_hitarea_3 == (HitArea*)0xFFFFFFFF || _last_hitarea_3 == 0); + } while (_last_hitarea_3 == (HitArea *) 0xFFFFFFFF || _last_hitarea_3 == 0); if (_last_hitarea == NULL) { } else if (_last_hitarea->id == 0x7FFB) { @@ -924,7 +1014,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[60] = (_last_hitarea->flags&1) ? (_last_hitarea->flags>>8) : 0xFFFF; + _variableArray[60] = (_last_hitarea->flags & 1) ? (_last_hitarea->flags >> 8) : 0xFFFF; break; } } @@ -936,7 +1026,8 @@ out_of_here: _hitarea_unk_6 = false; } -void SimonState::startSubroutine170() { +void SimonState::startSubroutine170() +{ Subroutine *sub; /* XXX: stop speech */ @@ -948,10 +1039,11 @@ void SimonState::startSubroutine170() { _run_script_return_1 = true; } -uint SimonState::get_fcs_ptr_3_index(FillOrCopyStruct *fcs) { +uint SimonState::get_fcs_ptr_3_index(FillOrCopyStruct *fcs) +{ uint i; - for(i=0; i!=ARRAYSIZE(_fcs_ptr_array_3); i++) + for (i = 0; i != ARRAYSIZE(_fcs_ptr_array_3); i++) if (_fcs_ptr_array_3[i] == fcs) return i; @@ -960,15 +1052,17 @@ uint SimonState::get_fcs_ptr_3_index(FillOrCopyStruct *fcs) { -void SimonState::lock() { +void SimonState::lock() +{ _lock_counter++; } -void SimonState::unlock() { +void SimonState::unlock() +{ _lock_word |= 1; if (_lock_counter != 0) { - if (_lock_counter==1) { + if (_lock_counter == 1) { GetAsyncKeyState(VK_LBUTTON); } _lock_counter--; @@ -976,7 +1070,8 @@ void SimonState::unlock() { _lock_word &= ~1; } -void SimonState::handle_mouse_moved() { +void SimonState::handle_mouse_moved() +{ uint x; if (_lock_counter) @@ -986,8 +1081,8 @@ void SimonState::handle_mouse_moved() { if (_mouse_x >= 32768) _mouse_x = 0; - if (_mouse_x >= 638/2) - _mouse_x = 638/2; + if (_mouse_x >= 638 / 2) + _mouse_x = 638 / 2; if (_mouse_y >= 32768) _mouse_y = 0; @@ -1004,14 +1099,14 @@ void SimonState::handle_mouse_moved() { if (_game & GAME_SIMON2) { - if (_bit_array[4]&0x8000) { + if (_bit_array[4] & 0x8000) { if (!_vga_var9) { - if (_mouse_x >= 630/2 || _mouse_x < 9) + if (_mouse_x >= 630 / 2 || _mouse_x < 9) goto get_out2; _vga_var9 = 1; } - if (_vga_var2==0) { - if (_mouse_x >= 631/2) { + if (_vga_var2 == 0) { + if (_mouse_x >= 631 / 2) { if (_x_scroll != _vga_var1) _vga_var3 = 1; } else if (_mouse_x < 8) { @@ -1020,7 +1115,7 @@ void SimonState::handle_mouse_moved() { } } } else { - get_out2:; + get_out2:; _vga_var9 = 0; } } @@ -1034,28 +1129,30 @@ void SimonState::handle_mouse_moved() { _left_button_down = 0; x = 1; } else { - if (_hitarea_unk_3==0 && _need_hitarea_recalc==0) goto get_out; + if (_hitarea_unk_3 == 0 && _need_hitarea_recalc == 0) + goto get_out; } setup_hitarea_from_pos(_mouse_x, _mouse_y, x); _last_hitarea_3 = _last_hitarea; - if (x==1 && _last_hitarea==NULL) - _last_hitarea_3 = (HitArea*)-1; + if (x == 1 && _last_hitarea == NULL) + _last_hitarea_3 = (HitArea *) - 1; get_out: draw_mouse_pointer(); _need_hitarea_recalc = 0; } -void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int unk2) { +void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int unk2) +{ Item *item_ptr_org = item_ptr; FillOrCopyStruct *fcs_ptr; uint width_div_3, height_div_3; - uint j,k,i,num_sibs_with_flag; + uint j, k, i, num_sibs_with_flag; bool item_again; uint x_pos, y_pos; - fcs_ptr = _fcs_ptr_array_3[fcs_index&7]; + fcs_ptr = _fcs_ptr_array_3[fcs_index & 7]; if (!(_game & GAME_SIMON2)) { width_div_3 = fcs_ptr->width / 3; @@ -1073,7 +1170,7 @@ void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int un if (fcs_ptr->fcs_data) fcs_unk1(fcs_index); - fcs_ptr->fcs_data = (FillOrCopyData*)malloc(sizeof(FillOrCopyData)); + fcs_ptr->fcs_data = (FillOrCopyData *) malloc(sizeof(FillOrCopyData)); fcs_ptr->fcs_data->item_ptr = item_ptr; fcs_ptr->fcs_data->unk3 = -1; fcs_ptr->fcs_data->unk4 = -1; @@ -1085,11 +1182,11 @@ void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int un while (item_ptr && unk1-- != 0) { num_sibs_with_flag = 0; while (item_ptr && width_div_3 > num_sibs_with_flag) { - if ((unk2==0 || item_ptr->unk4&unk2) && has_item_childflag_0x10(item_ptr)) + if ((unk2 == 0 || item_ptr->unk4 & unk2) && has_item_childflag_0x10(item_ptr)) if (!(_game & GAME_SIMON2)) { num_sibs_with_flag++; } else { - num_sibs_with_flag+=20; + num_sibs_with_flag += 20; } item_ptr = derefItem(item_ptr->sibling); } @@ -1107,31 +1204,30 @@ void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int un j = 0; while (item_ptr) { - if ((unk2==0 || item_ptr->unk4&unk2) && has_item_childflag_0x10(item_ptr)) { + if ((unk2 == 0 || item_ptr->unk4 & unk2) && has_item_childflag_0x10(item_ptr)) { if (item_again == false) { fcs_ptr->fcs_data->e[k].item = item_ptr; if (!(_game & GAME_SIMON2)) { - draw_icon_c(fcs_ptr, item_get_icon_number(item_ptr), x_pos*3, y_pos); - fcs_ptr->fcs_data->e[k].hit_area = - setup_icon_hit_area(fcs_ptr, x_pos*3, y_pos, - item_get_icon_number(item_ptr), item_ptr); + draw_icon_c(fcs_ptr, item_get_icon_number(item_ptr), x_pos * 3, y_pos); + fcs_ptr->fcs_data->e[k].hit_area = + setup_icon_hit_area(fcs_ptr, x_pos * 3, y_pos, + item_get_icon_number(item_ptr), item_ptr); } else { draw_icon_c(fcs_ptr, item_get_icon_number(item_ptr), x_pos, y_pos); - fcs_ptr->fcs_data->e[k].hit_area = - setup_icon_hit_area(fcs_ptr, x_pos, y_pos, - item_get_icon_number(item_ptr), item_ptr); + fcs_ptr->fcs_data->e[k].hit_area = + setup_icon_hit_area(fcs_ptr, x_pos, y_pos, item_get_icon_number(item_ptr), item_ptr); } k++; } else { fcs_ptr->fcs_data->e[k].item = NULL; j = 1; } - x_pos+= (_game & GAME_SIMON2) ? 20 : 1; + x_pos += (_game & GAME_SIMON2) ? 20 : 1; if (x_pos >= width_div_3) { x_pos = 0; - y_pos+= (_game & GAME_SIMON2) ? 20 : 1; + y_pos += (_game & GAME_SIMON2) ? 20 : 1; if (y_pos >= height_div_3) item_again = true; } @@ -1140,20 +1236,22 @@ void SimonState::fcs_unk_proc_1(uint fcs_index, Item *item_ptr, int unk1, int un } fcs_ptr->fcs_data->e[k].item = NULL; - - if (j!=0 || fcs_ptr->fcs_data->unk1!=0) { + + if (j != 0 || fcs_ptr->fcs_data->unk1 != 0) { fcs_unk_proc_2(fcs_ptr, fcs_index); } } -void SimonState::fcs_unk_proc_2(FillOrCopyStruct *fcs, uint fcs_index) { +void SimonState::fcs_unk_proc_2(FillOrCopyStruct *fcs, uint fcs_index) +{ setup_hit_areas(fcs, fcs_index); fcs->fcs_data->unk3 = _scroll_up_hit_area; fcs->fcs_data->unk4 = _scroll_down_hit_area; } -void SimonState::setup_hit_areas(FillOrCopyStruct *fcs, uint fcs_index) { +void SimonState::setup_hit_areas(FillOrCopyStruct *fcs, uint fcs_index) +{ HitArea *ha; ha = findEmptyHitArea(); @@ -1211,33 +1309,36 @@ void SimonState::setup_hit_areas(FillOrCopyStruct *fcs, uint fcs_index) { } -bool SimonState::has_item_childflag_0x10(Item *item) { +bool SimonState::has_item_childflag_0x10(Item *item) +{ Child2 *child = findChildOfType2(item); return child && (child->avail_props & 0x10) != 0; } -uint SimonState::item_get_icon_number(Item *item) { +uint SimonState::item_get_icon_number(Item *item) +{ Child2 *child = findChildOfType2(item); uint offs; - if (child==NULL || !(child->avail_props & 0x10)) + if (child == NULL || !(child->avail_props & 0x10)) return 0; offs = getOffsetOfChild2Param(child, 0x10); return child->array[offs]; } -void SimonState::loadIconFile() { +void SimonState::loadIconFile() +{ FILE *in = fopen_maybe_lowercase("ICON.DAT"); uint size; - if (in==NULL) + if (in == NULL) error("Cannot open icon.dat"); - + fseek(in, 0, SEEK_END); size = ftell(in); - _icon_file_ptr = (byte*)malloc(size); + _icon_file_ptr = (byte *)malloc(size); if (_icon_file_ptr == NULL) error("Out of icon memory"); @@ -1248,14 +1349,16 @@ void SimonState::loadIconFile() { } -uint SimonState::setup_icon_hit_area(FillOrCopyStruct *fcs,uint x, uint y, uint icon_number, Item *item_ptr) { +uint SimonState::setup_icon_hit_area(FillOrCopyStruct *fcs, uint x, uint y, uint icon_number, + Item *item_ptr) +{ HitArea *ha; ha = findEmptyHitArea(); if (!(_game & GAME_SIMON2)) { - ha->x = (x+fcs->x) << 3; - ha->y = y*25 + fcs->y; + ha->x = (x + fcs->x) << 3; + ha->y = y * 25 + fcs->y; ha->item_ptr = item_ptr; ha->width = 24; ha->height = 24; @@ -1278,7 +1381,8 @@ uint SimonState::setup_icon_hit_area(FillOrCopyStruct *fcs,uint x, uint y, uint return ha - _hit_areas; } -void SimonState::hitarea_stuff() { +void SimonState::hitarea_stuff() +{ HitArea *ha; uint id; @@ -1291,12 +1395,13 @@ void SimonState::hitarea_stuff() { hitarea_proc_1(); startOver: - for(;;) { + for (;;) { _last_hitarea = NULL; _last_hitarea_3 = NULL; - for(;;) { + for (;;) { processSpecialKeys(); - if (_last_hitarea_3 == (HitArea*)0xFFFFFFFF) goto startOver; + if (_last_hitarea_3 == (HitArea *) 0xFFFFFFFF) + goto startOver; if (_last_hitarea_3 != 0) break; hitarea_stuff_helper(); @@ -1306,22 +1411,22 @@ startOver: ha = _last_hitarea; if (ha == NULL) { - } else if(ha->id == 0x7FFB) { + } else if (ha->id == 0x7FFB) { handle_unk2_hitarea(ha->fcs); } else if (ha->id == 0x7FFC) { handle_unk_hitarea(ha->fcs); - } else if (ha->id>=101 && ha->id<113) { + } else if (ha->id >= 101 && ha->id < 113) { _verb_hitarea = ha->unk3; handle_verb_hitarea(ha); _hitarea_unk_4 = 0; } else { - if ( (_verb_hitarea != 0 || _hitarea_subject_item != ha->item_ptr && ha->flags&0x80) && - ha->item_ptr) { -if_1:; + if ((_verb_hitarea != 0 || _hitarea_subject_item != ha->item_ptr && ha->flags & 0x80) && + ha->item_ptr) { + if_1:; _hitarea_subject_item = ha->item_ptr; id = 0xFFFF; - if (ha->flags&1) - id = ha->flags>>8; + if (ha->flags & 1) + id = ha->flags >> 8; _variableArray[60] = id; new_current_hitarea(ha); if (_verb_hitarea != 0) @@ -1329,7 +1434,8 @@ if_1:; } else { /* else 1 */ if (ha->unk3 == 0) { - if(ha->item_ptr) goto if_1; + if (ha->item_ptr) + goto if_1; } else { _verb_hitarea = ha->unk3 & 0xBFFF; if (ha->unk3 & 0x4000) { @@ -1346,28 +1452,29 @@ if_1:; _need_hitarea_recalc++; } -void SimonState::hitarea_stuff_helper() { +void SimonState::hitarea_stuff_helper() +{ time_t cur_time; if (!(_game & GAME_SIMON2)) { - uint subr_id = _variableArray[0x1FC/2]; + uint subr_id = _variableArray[0x1FC / 2]; if (subr_id != 0) { Subroutine *sub = getSubroutineByID(subr_id); if (sub != NULL) { startSubroutineEx(sub); startUp_helper_2(); } - _variableArray[0x1FC/2] = 0; + _variableArray[0x1FC / 2] = 0; _run_script_return_1 = false; } } else { - if (_variableArray[0x1FC/2] || _variableArray[0x1F2/2]) { + if (_variableArray[0x1FC / 2] || _variableArray[0x1F2 / 2]) { hitarea_stuff_helper_2(); } } time(&cur_time); - if ((uint)cur_time != _last_time) { + if ((uint) cur_time != _last_time) { _last_time = cur_time; if (kickoffTimeEvents()) startUp_helper_2(); @@ -1375,42 +1482,44 @@ void SimonState::hitarea_stuff_helper() { } /* Simon 2 specific */ -void SimonState::hitarea_stuff_helper_2() { +void SimonState::hitarea_stuff_helper_2() +{ uint subr_id; Subroutine *sub; - subr_id = _variableArray[0x1F2/2]; + subr_id = _variableArray[0x1F2 / 2]; if (subr_id != 0) { sub = getSubroutineByID(subr_id); if (sub != NULL) { - _variableArray[0x1F2/2] = 0; + _variableArray[0x1F2 / 2] = 0; startSubroutineEx(sub); startUp_helper_2(); } - _variableArray[0x1F2/2] = 0; + _variableArray[0x1F2 / 2] = 0; } - subr_id = _variableArray[0x1FC/2]; + subr_id = _variableArray[0x1FC / 2]; if (subr_id != 0) { sub = getSubroutineByID(subr_id); if (sub != NULL) { - _variableArray[0x1FC/2] = 0; + _variableArray[0x1FC / 2] = 0; startSubroutineEx(sub); startUp_helper_2(); } - _variableArray[0x1FC/2] = 0; + _variableArray[0x1FC / 2] = 0; } _run_script_return_1 = false; } -void SimonState::startUp_helper_2() { +void SimonState::startUp_helper_2() +{ if (!_mortal_flag) { _mortal_flag = true; startUp_helper_3(); _fcs_unk_1 = 0; - if(_fcs_ptr_array_3[0]!=0) { + if (_fcs_ptr_array_3[0] != 0) { _fcs_ptr_1 = _fcs_ptr_array_3[0]; showmessage_helper_3(_fcs_ptr_1->unk6, _fcs_ptr_1->unk7); } @@ -1418,22 +1527,26 @@ void SimonState::startUp_helper_2() { } } -void SimonState::startUp_helper_3() { +void SimonState::startUp_helper_3() +{ showmessage_print_char(0); } -void SimonState::showmessage_helper_3(uint a, uint b) { +void SimonState::showmessage_helper_3(uint a, uint b) +{ _print_char_unk_1 = a; _print_char_unk_2 = b; _num_letters_to_print = 0; } -void SimonState::pollMouseXY() { +void SimonState::pollMouseXY() +{ _mouse_x = sdl_mouse_x; _mouse_y = sdl_mouse_y; } -void SimonState::handle_verb_clicked(uint verb) { +void SimonState::handle_verb_clicked(uint verb) +{ Subroutine *sub; int result; @@ -1470,7 +1583,7 @@ void SimonState::handle_verb_clicked(uint verb) { _script_cond_a = _verb_hitarea; sub = getSubroutineByID(0); - if (sub==NULL) + if (sub == NULL) return; result = startSubroutine(sub); @@ -1480,7 +1593,8 @@ void SimonState::handle_verb_clicked(uint verb) { _run_script_return_1 = false; sub = getSubroutineByID(100); - if(sub) startSubroutine(sub); + if (sub) + startSubroutine(sub); if (_game & GAME_SIMON2) _run_script_return_1 = false; @@ -1488,7 +1602,8 @@ void SimonState::handle_verb_clicked(uint verb) { startUp_helper_2(); } -void SimonState::o_print_str() { +void SimonState::o_print_str() +{ uint num_1 = getVarOrByte(); uint num_2 = getVarOrByte(); uint string_id = getNextStringID(); @@ -1497,7 +1612,7 @@ void SimonState::o_print_str() { ThreeValues *tv; - switch(_game) { + switch (_game) { case GAME_SIMON1WIN: if (string_id != 0xFFFF) string_ptr = getStringPtrByID(string_id); @@ -1524,97 +1639,108 @@ void SimonState::o_print_str() { break; } - switch(num_1) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; + switch (num_1) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; default: error("o_print_str, invalid value %d", num_1); } - switch(_game) { + switch (_game) { case GAME_SIMON1WIN: #ifdef USE_TEXT_HACK if (speech_id != 0) { - if (string_ptr==NULL) + if (string_ptr == NULL) talk_with_speech(speech_id, num_1); - else if(speech_id!=9999) + else if (speech_id != 9999) playVoice(speech_id); } - + if (string_ptr != NULL) { - talk_with_text(num_1, num_2, (char*)string_ptr, tv->a, tv->b, tv->c); + talk_with_text(num_1, num_2, (char *)string_ptr, tv->a, tv->b, tv->c); } #else if (speech_id != 0) { talk_with_speech(speech_id, num_1); - } else if(string_ptr != NULL) { - talk_with_text(num_1, num_2, (char*)string_ptr, tv->a, tv->b, tv->c); + } else if (string_ptr != NULL) { + talk_with_text(num_1, num_2, (char *)string_ptr, tv->a, tv->b, tv->c); } #endif break; case GAME_SIMON1DOS: - talk_with_text(num_1, num_2, (char*)string_ptr, tv->a, tv->b, tv->c); + talk_with_text(num_1, num_2, (char *)string_ptr, tv->a, tv->b, tv->c); break; case GAME_SIMON2DOS: - if (speech_id!=0 && num_1 == 1 && !_vk_t_toggle) + if (speech_id != 0 && num_1 == 1 && !_vk_t_toggle) talk_with_speech(speech_id, num_1); if (speech_id != 0 && !_vk_t_toggle) return; if (speech_id == 0) - o_unk_99_simon2(2, num_1+2); + o_unk_99_simon2(2, num_1 + 2); + + talk_with_text(num_1, num_2, (char *)string_ptr, tv->a, tv->b, tv->c); + break; - talk_with_text(num_1, num_2, (char*)string_ptr, tv->a, tv->b, tv->c); - break; - case GAME_SIMON2WIN: - if (speech_id!=0 && num_1 == 1 && !_vk_t_toggle) + if (speech_id != 0 && num_1 == 1 && !_vk_t_toggle) talk_with_speech(speech_id, num_1); if (speech_id != 0 && !_vk_t_toggle) return; if (speech_id == 0) - o_unk_99_simon2(2, num_1+2); + o_unk_99_simon2(2, num_1 + 2); - talk_with_text(num_1, num_2, (char*)string_ptr, tv->a, tv->b, tv->c); - break; + talk_with_text(num_1, num_2, (char *)string_ptr, tv->a, tv->b, tv->c); + break; } } -void SimonState::ensureVgaResLoadedC(uint vga_res) { +void SimonState::ensureVgaResLoadedC(uint vga_res) +{ _lock_word |= 0x80; ensureVgaResLoaded(vga_res); _lock_word &= ~0x80; } -void SimonState::ensureVgaResLoaded(uint vga_res) { +void SimonState::ensureVgaResLoaded(uint vga_res) +{ VgaPointersEntry *vpe; - + CHECK_BOUNDS(vga_res, _vga_buffer_pointers); vpe = _vga_buffer_pointers + vga_res; if (vpe->vgaFile1 != NULL) return; - vpe->vgaFile2 = read_vga_from_datfile_2(vga_res*2+1); - vpe->vgaFile1 = read_vga_from_datfile_2(vga_res*2); - + vpe->vgaFile2 = read_vga_from_datfile_2(vga_res * 2 + 1); + vpe->vgaFile1 = read_vga_from_datfile_2(vga_res * 2); + } -byte *SimonState::setup_vga_destination(uint32 size) { +byte *SimonState::setup_vga_destination(uint32 size) +{ byte *dest, *end; _video_var_4 = 0; - for(;;) { + for (;;) { dest = _vga_buf_free_start; end = dest + size; @@ -1636,11 +1762,12 @@ byte *SimonState::setup_vga_destination(uint32 size) { } } -void SimonState::setup_vga_file_buf_pointers() { +void SimonState::setup_vga_file_buf_pointers() +{ byte *alloced; - alloced = (byte*)malloc(gss->VGA_MEM_SIZE); - + alloced = (byte *)malloc(gss->VGA_MEM_SIZE); + _vga_buf_free_start = alloced; _vga_buf_start = alloced; _vga_file_buf_org = alloced; @@ -1648,19 +1775,20 @@ void SimonState::setup_vga_file_buf_pointers() { _vga_buf_end = alloced + gss->VGA_MEM_SIZE; } -void SimonState::vga_buf_unk_proc3(byte *end) { +void SimonState::vga_buf_unk_proc3(byte *end) +{ VgaPointersEntry *vpe; - - if (_video_var_7==0xFFFF) + + if (_video_var_7 == 0xFFFF) return; - + if (_video_var_4 == 2) error("vga_buf_unk_proc3: _video_var_4 == 2"); vpe = &_vga_buffer_pointers[_video_var_7]; if (_vga_buf_free_start <= vpe->vgaFile1 && end >= vpe->vgaFile1 || - _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { + _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { _video_var_5 = 1; _video_var_4++; _vga_buf_free_start = vpe->vgaFile1 + 0x5000; @@ -1669,39 +1797,42 @@ void SimonState::vga_buf_unk_proc3(byte *end) { } } -void SimonState::vga_buf_unk_proc1(byte *end) { +void SimonState::vga_buf_unk_proc1(byte *end) +{ VgaSprite *vsp; if (_lock_word & 0x20) return; - for(vsp = _vga_sprites; vsp->id; vsp++) { + for (vsp = _vga_sprites; vsp->id; vsp++) { vga_buf_unk_proc2(vsp->unk7, end); if (_video_var_5 == true) return; } } -void SimonState::delete_memptr_range(byte *end) { +void SimonState::delete_memptr_range(byte *end) +{ uint count = ARRAYSIZE(_vga_buffer_pointers); VgaPointersEntry *vpe = _vga_buffer_pointers; do { if (_vga_buf_free_start <= vpe->vgaFile1 && end >= vpe->vgaFile1 || - _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { - vpe->dd = 0; - vpe->vgaFile1 = NULL; - vpe->vgaFile2 = NULL; + _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { + vpe->dd = 0; + vpe->vgaFile1 = NULL; + vpe->vgaFile2 = NULL; } - } while (++vpe,--count); + } while (++vpe, --count); } -void SimonState::vga_buf_unk_proc2(uint a, byte *end) { +void SimonState::vga_buf_unk_proc2(uint a, byte *end) +{ VgaPointersEntry *vpe; - + vpe = &_vga_buffer_pointers[a]; if (_vga_buf_free_start <= vpe->vgaFile1 && end >= vpe->vgaFile1 || - _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { + _vga_buf_free_start <= vpe->vgaFile2 && end >= vpe->vgaFile2) { _video_var_5 = true; _video_var_4++; _vga_buf_free_start = vpe->vgaFile1 + 0x5000; @@ -1711,9 +1842,10 @@ void SimonState::vga_buf_unk_proc2(uint a, byte *end) { } -void SimonState::o_clear_vgapointer_entry(uint a) { +void SimonState::o_clear_vgapointer_entry(uint a) +{ VgaPointersEntry *vpe; - + vpe = &_vga_buffer_pointers[a]; vpe->dd = 0; @@ -1721,22 +1853,24 @@ void SimonState::o_clear_vgapointer_entry(uint a) { vpe->vgaFile2 = NULL; } -void SimonState::o_set_video_mode(uint mode, uint vga_res) { +void SimonState::o_set_video_mode(uint mode, uint vga_res) +{ if (mode == 4) vc_29_stop_all_sounds(); if (_lock_word & 0x10) { error("o_set_video_mode_ex: _lock_word & 0x10"); -// _unk21_word_array[a] = b; +// _unk21_word_array[a] = b; } else { - set_video_mode(mode,vga_res); + set_video_mode(mode, vga_res); } } -void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { +void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) +{ uint num; VgaPointersEntry *vpe; - byte *bb,*b; + byte *bb, *b; uint16 c; byte *vc_ptr_org; @@ -1757,7 +1891,7 @@ void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { _vga_cur_file_2 = num = vga_res_id / 100; - for(;;) { + for (;;) { vpe = &_vga_buffer_pointers[num]; _cur_vga_file_1 = vpe->vgaFile1; @@ -1772,11 +1906,11 @@ void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { /* ensure flipping complete */ bb = _cur_vga_file_1; - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)bb)->hdr2_start); - c = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)b)->unk1); - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)b)->unk2_offs); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) bb)->hdr2_start); + c = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) b)->unk1); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) b)->unk2_offs); - while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->id) != vga_res_id) + while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->id) != vga_res_id) b += sizeof(VgaFile1Struct0x8); if (!(_game & GAME_SIMON2)) { @@ -1790,21 +1924,21 @@ void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { _vga_var2 = 0; _vga_var3 = 0; _vga_var5 = 134; - if(_variableArray[34] != -1) - _variableArray[502/2] = 0; + if (_variableArray[34] != -1) + _variableArray[502 / 2] = 0; } vc_ptr_org = _vc_ptr; - _vc_ptr = _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->script_offs); -// dump_vga_script(_vc_ptr, num, vga_res_id); + _vc_ptr = _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->script_offs); +// dump_vga_script(_vc_ptr, num, vga_res_id); run_vga_script(); _vc_ptr = vc_ptr_org; if (_game & GAME_SIMON2) { if (!_dx_use_3_or_4_for_lock) { - uint num_lines = _video_palette_mode==4 ? 134: 200; + uint num_lines = _video_palette_mode == 4 ? 134 : 200; _vga_var8 = num_lines; dx_copy_from_attached_to_2(0, 0, 320, num_lines); dx_copy_from_attached_to_3(num_lines); @@ -1812,13 +1946,13 @@ void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { } _dx_use_3_or_4_for_lock = false; } else { - uint num_lines = _video_palette_mode==4 ? 134: 200; + uint num_lines = _video_palette_mode == 4 ? 134 : 200; dx_copy_from_attached_to_2(0, 0, 320, num_lines); dx_copy_from_attached_to_3(num_lines); _sync_flag_2 = 1; _timer_5 = 0; } - + _lock_word &= ~0x20; /* XXX: fix */ @@ -1826,20 +1960,21 @@ void SimonState::set_video_mode_internal(uint mode, uint vga_res_id) { if (!(_game & GAME_SIMON2)) { if (_unk_pal_flag) { _unk_pal_flag = false; - while (*(volatile int*)&_palette_color_count!=0) { + while (*(volatile int *)&_palette_color_count != 0) { delay(10); } } } } -void SimonState::set_video_mode(uint mode, uint vga_res_id) { - +void SimonState::set_video_mode(uint mode, uint vga_res_id) +{ + if (_lock_counter == 0) { lock(); if (_lock_word == 0) { _sync_flag_1 = true; - while ((*(volatile bool*)&_sync_flag_1) == true) { + while ((*(volatile bool *)&_sync_flag_1) == true) { delay(10); } } @@ -1847,9 +1982,9 @@ void SimonState::set_video_mode(uint mode, uint vga_res_id) { _lock_word |= 0x20; -// while ((*(volatile uint16*)&_lock_word) & 2) { -// delay(10); -// } +// while ((*(volatile uint16*)&_lock_word) & 2) { +// delay(10); +// } unlock(); @@ -1861,55 +1996,58 @@ void SimonState::set_video_mode(uint mode, uint vga_res_id) { -void SimonState::o_fade_to_black() { +void SimonState::o_fade_to_black() +{ uint i; - memcpy(_video_buf_1, _palette_backup, 256*sizeof(uint32)); + memcpy(_video_buf_1, _palette_backup, 256 * sizeof(uint32)); i = NUM_PALETTE_FADEOUT; do { - palette_fadeout((uint32*)_video_buf_1, 32); - palette_fadeout((uint32*)_video_buf_1 + 32+16, 144); - palette_fadeout((uint32*)_video_buf_1 + 32+16+144+16, 48); + palette_fadeout((uint32 *)_video_buf_1, 32); + palette_fadeout((uint32 *)_video_buf_1 + 32 + 16, 144); + palette_fadeout((uint32 *)_video_buf_1 + 32 + 16 + 144 + 16, 48); _system->set_palette(_video_buf_1, 0, 256); _system->update_screen(); delay(5); } while (--i); - memcpy(_palette_backup, _video_buf_1, 256*sizeof(uint32)); - memcpy(_palette, _video_buf_1, 256*sizeof(uint32)); + memcpy(_palette_backup, _video_buf_1, 256 * sizeof(uint32)); + memcpy(_palette, _video_buf_1, 256 * sizeof(uint32)); } -void SimonState::delete_vga_timer(VgaTimerEntry *vte) { +void SimonState::delete_vga_timer(VgaTimerEntry * vte) +{ _lock_word |= 1; - - if (vte+1 <= _next_vga_timer_to_process) { + + if (vte + 1 <= _next_vga_timer_to_process) { _next_vga_timer_to_process--; } do { - memcpy(vte,vte+1,sizeof(VgaTimerEntry)); + memcpy(vte, vte + 1, sizeof(VgaTimerEntry)); vte++; } while (vte->delay); - + _lock_word &= ~1; } -void SimonState::expire_vga_timers() { +void SimonState::expire_vga_timers() +{ if (_game & GAME_SIMON2) { VgaTimerEntry *vte = _vga_timer_list; - + _vga_tick_counter++; - + while (vte->delay) { /* not quite ok, good enough */ - if ((int16)(vte->delay-=5)<=0) { + if ((int16)(vte->delay -= 5) <= 0) { uint16 cur_file = vte->cur_vga_file; uint16 cur_unk = vte->sprite_id; byte *script_ptr = vte->script_pointer; - - _next_vga_timer_to_process = vte+1; + + _next_vga_timer_to_process = vte + 1; delete_vga_timer(vte); if (script_ptr == NULL) { @@ -1925,16 +2063,16 @@ void SimonState::expire_vga_timers() { } } else { VgaTimerEntry *vte = _vga_timer_list; - + _vga_tick_counter++; - + while (vte->delay) { if (!--vte->delay) { uint16 cur_file = vte->cur_vga_file; uint16 cur_unk = vte->sprite_id; byte *script_ptr = vte->script_pointer; - - _next_vga_timer_to_process = vte+1; + + _next_vga_timer_to_process = vte + 1; delete_vga_timer(vte); vc_resume_thread(script_ptr, cur_file, cur_unk); @@ -1947,32 +2085,34 @@ void SimonState::expire_vga_timers() { } /* Simon2 specific */ -void SimonState::scroll_timeout() { +void SimonState::scroll_timeout() +{ if (_vga_var2 == 0) return; - + if (_vga_var2 < 0) { - if (_vga_var3!=-1) { + if (_vga_var3 != -1) { _vga_var3 = -1; if (++_vga_var2 == 0) return; } } else { - if (_vga_var3!=1) { + if (_vga_var3 != 1) { _vga_var3 = 1; if (--_vga_var2 == 0) return; } - } + } add_vga_timer(10, NULL, 0, 0); } -void SimonState::vc_resume_thread(byte *code_ptr, uint16 cur_file, uint16 cur_sprite) { +void SimonState::vc_resume_thread(byte *code_ptr, uint16 cur_file, uint16 cur_sprite) +{ VgaPointersEntry *vpe; _vga_cur_sprite_id = cur_sprite; - + _vga_cur_file_id = cur_file; _vga_cur_file_2 = cur_file; vpe = &_vga_buffer_pointers[cur_file]; @@ -1986,14 +2126,16 @@ void SimonState::vc_resume_thread(byte *code_ptr, uint16 cur_file, uint16 cur_sp } -void SimonState::add_vga_timer(uint num, byte *code_ptr, uint cur_sprite, uint cur_file) { +void SimonState::add_vga_timer(uint num, byte *code_ptr, uint cur_sprite, uint cur_file) +{ VgaTimerEntry *vte; -// assert( (uint)READ_BE_UINT16_UNALIGNED(&*(uint16*)code_ptr) <= 63); +// assert( (uint)READ_BE_UINT16_UNALIGNED(&*(uint16*)code_ptr) <= 63); _lock_word |= 1; - for(vte = _vga_timer_list; vte->delay; vte++) { } + for (vte = _vga_timer_list; vte->delay; vte++) { + } vte->delay = num; vte->script_pointer = code_ptr; @@ -2003,41 +2145,47 @@ void SimonState::add_vga_timer(uint num, byte *code_ptr, uint cur_sprite, uint c _lock_word &= ~1; } -void SimonState::o_force_unlock() { - if (_game&GAME_SIMON2 && _bit_array[4]&0x8000) +void SimonState::o_force_unlock() +{ + if (_game & GAME_SIMON2 && _bit_array[4] & 0x8000) _mouse_cursor = 0; _lock_counter = 0; } -void SimonState::o_force_lock() { +void SimonState::o_force_lock() +{ _lock_word |= 0x4000; vc_34(); _lock_word &= ~0x4000; } -void SimonState::o_save_game() { +void SimonState::o_save_game() +{ save_or_load_dialog(false); } -void SimonState::o_load_game() { +void SimonState::o_load_game() +{ save_or_load_dialog(true); } -int SimonState::display_savegame_list(int curpos, bool load, char *dst) { +int SimonState::display_savegame_list(int curpos, bool load, char *dst) +{ int slot, last_slot; FILE *in; showMessageFormat("\xC"); - - memset(dst, 0, 18*6); + + memset(dst, 0, 18 * 6); slot = curpos; while (curpos + 6 > slot) { in = fopen(gen_savename(slot), "rb"); - if (!in) break; + if (!in) + break; fread(dst, 1, 18, in); fclose(in); @@ -2046,7 +2194,7 @@ int SimonState::display_savegame_list(int curpos, bool load, char *dst) { showMessageFormat(" "); showMessageFormat("%d", slot); showMessageFormat(".%s\n", dst); - dst+=18 ; + dst += 18; slot++; } /* while_break */ @@ -2059,7 +2207,7 @@ int SimonState::display_savegame_list(int curpos, bool load, char *dst) { showMessageFormat("%d.\n", slot); } } else { - if (curpos +6 == slot) { + if (curpos + 6 == slot) { in = fopen(gen_savename(slot), "rb"); if (in != NULL) { slot++; @@ -2072,11 +2220,12 @@ int SimonState::display_savegame_list(int curpos, bool load, char *dst) { } -void SimonState::savegame_dialog(char *buf) { +void SimonState::savegame_dialog(char *buf) +{ int i; o_unk_132_helper_3(); - + i = display_savegame_list(_saveload_row_curpos, _save_or_load, buf); _savedialog_flag = true; @@ -2097,7 +2246,8 @@ void SimonState::savegame_dialog(char *buf) { } -void SimonState::save_or_load_dialog(bool load) { +void SimonState::save_or_load_dialog(bool load) +{ time_t save_time; int num = _number_of_savegames; int i; @@ -2113,18 +2263,20 @@ void SimonState::save_or_load_dialog(bool load) { save_time = time(NULL); _copy_partial_mode = 1; - + num = _number_of_savegames; - if (!load) num++; + if (!load) + num++; num -= 6; - if (num<0) num = 0; + if (num < 0) + num = 0; num++; _num_savegame_rows = num; _saveload_row_curpos = 1; if (!load) _saveload_row_curpos = num; - + _saveload_flag = false; restart:; @@ -2132,10 +2284,11 @@ restart:; i = o_unk_132_helper(&b, buf); } while (!b); - if (i == 205) goto get_out; + if (i == 205) + goto get_out; if (!load) { /* if_1 */ -if_1:; + if_1:; unk132_result = i; set_hitarea_bit_0x40(0xd0 + i); @@ -2167,7 +2320,7 @@ if_1:; /* while_1_end */ /* do_3_start */ - for(;;) { + for (;;) { video_putchar(fcs, 0x7f); _saveload_flag = true; @@ -2177,12 +2330,14 @@ if_1:; i = o_unk_132_helper(&b, buf); if (b) { - if (i == 205) goto get_out; + if (i == 205) + goto get_out; clear_hitarea_bit_0x40(0xd0 + unk132_result); if (_saveload_flag) { o_unk_132_helper_2(_fcs_ptr_array_3[5], 8); /* move code */ - } goto if_1; + } + goto if_1; } /* is_not_b */ @@ -2190,24 +2345,25 @@ if_1:; clear_hitarea_bit_0x40(0xd0 + unk132_result); goto restart; } - } while (i >= 0x80 || i == 0); + } while (i >= 0x80 || i == 0); /* after_do_2 */ o_unk_132_helper_2(_fcs_ptr_array_3[5], 8); - if (i==10 || i==13) break; - if (i==8) { + if (i == 10 || i == 13) + break; + if (i == 8) { /* do_backspace */ if (name_len != 0) { int x; name_len--; - - x = (name[name_len] == 'i' || name[name_len]=='l') ? 1 : 8; + + x = (name[name_len] == 'i' || name[name_len] == 'l') ? 1 : 8; name[name_len] = 0; o_unk_132_helper_2(_fcs_ptr_array_3[5], x); } - } else if (i>=32 && name_len!=17) { + } else if (i >= 32 && name_len != 17) { name[name_len++] = i; video_putchar(_fcs_ptr_array_3[5], i); @@ -2224,11 +2380,11 @@ if_1:; get_out:; o_unk_132_helper_3(); -// clear_keydowns(); +// clear_keydowns(); _base_time = time(NULL) - save_time + _base_time; _copy_partial_mode = 0; - + dx_copy_rgn_from_3_to_2(94, 208, 46, 80); i = _timer_4; @@ -2238,7 +2394,8 @@ get_out:; } -void SimonState::o_wait_for_vga(uint a) { +void SimonState::o_wait_for_vga(uint a) +{ _vga_wait_for = a; _timer_1 = 0; _exit_cutscene = false; @@ -2253,30 +2410,31 @@ void SimonState::o_wait_for_vga(uint a) { } delay(10); - -// if (_timer_1 >= 500) { -// warning("wait timed out"); -// break; -// } - + +// if (_timer_1 >= 500) { +// warning("wait timed out"); +// break; +// } + } -// warning("waiting on %d done", a); +// warning("waiting on %d done", a); } -void SimonState::timer_vga_sprites() { +void SimonState::timer_vga_sprites() +{ VgaSprite *vsp; VgaPointersEntry *vpe; byte *vc_ptr_org = _vc_ptr; - uint16 params[5]; /* parameters to vc_10 */ + uint16 params[5]; /* parameters to vc_10 */ if (_video_var_9 == 2) _video_var_9 = 1; #ifdef DRAW_THREE_STARS - fprintf(_dump_file,"***\n"); + fprintf(_dump_file, "***\n"); #endif - if (_game&GAME_SIMON2 && _vga_var3) { + if (_game & GAME_SIMON2 && _vga_var3) { timer_vga_sprites_helper(); } @@ -2295,49 +2453,50 @@ void SimonState::timer_vga_sprites() { params[2] = READ_BE_UINT16_UNALIGNED(&vsp->x); params[3] = READ_BE_UINT16_UNALIGNED(&vsp->y); - if(_game & GAME_SIMON2) { - *(byte*)(¶ms[4]) = (byte)vsp->unk4; + if (_game & GAME_SIMON2) { + *(byte *)(¶ms[4]) = (byte)vsp->unk4; } else { params[4] = READ_BE_UINT16_UNALIGNED(&vsp->unk4); } - _vc_ptr = (byte*)params; + _vc_ptr = (byte *)params; vc_10(); vsp++; } #ifdef DRAW_IMAGES_DEBUG - memset(sdl_buf_attached, 0, 320*200); + memset(sdl_buf_attached, 0, 320 * 200); #endif _video_var_8++; _vc_ptr = vc_ptr_org; } -void SimonState::timer_vga_sprites_helper() { +void SimonState::timer_vga_sprites_helper() +{ byte *dst = dx_lock_2(), *src; uint x; - if (_vga_var3<0) { - memmove(dst+8,dst,320*_vga_var5-8); + if (_vga_var3 < 0) { + memmove(dst + 8, dst, 320 * _vga_var5 - 8); } else { - memmove(dst, dst+8, 320*_vga_var5-8); + memmove(dst, dst + 8, 320 * _vga_var5 - 8); } - x = _x_scroll-1; + x = _x_scroll - 1; - if (_vga_var3>0) { - dst += 320-8; + if (_vga_var3 > 0) { + dst += 320 - 8; x += 41; } - src = _vga_var7 + x*4; - vc_10_helper_8(dst,src+READ_BE_UINT32_UNALIGNED(&*((uint32*)src))); + src = _vga_var7 + x * 4; + vc_10_helper_8(dst, src + READ_BE_UINT32_UNALIGNED(&*((uint32 *)src))); dx_unlock_2(); - memcpy(sdl_buf_attached, sdl_buf, 320*200); + memcpy(sdl_buf_attached, sdl_buf, 320 * 200); dx_copy_from_attached_to_3(_vga_var5); @@ -2349,11 +2508,12 @@ void SimonState::timer_vga_sprites_helper() { } #ifdef DRAW_IMAGES_DEBUG -void SimonState::timer_vga_sprites_2() { +void SimonState::timer_vga_sprites_2() +{ VgaSprite *vsp; VgaPointersEntry *vpe; byte *vc_ptr_org = _vc_ptr; - uint16 params[5]; /* parameters to vc_10 */ + uint16 params[5]; /* parameters to vc_10 */ if (_video_var_9 == 2) _video_var_9 = 1; @@ -2369,21 +2529,21 @@ void SimonState::timer_vga_sprites_2() { _vga_cur_sprite_id = vsp->id; if (vsp->image) - fprintf(_dump_file,"id:%5d image:%3d base-color:%3d x:%3d y:%3d flags:%x\n", - vsp->id, vsp->image, vsp->base_color, vsp->x, vsp->y, vsp->unk4 ); + fprintf(_dump_file, "id:%5d image:%3d base-color:%3d x:%3d y:%3d flags:%x\n", + vsp->id, vsp->image, vsp->base_color, vsp->x, vsp->y, vsp->unk4); params[0] = READ_BE_UINT16_UNALIGNED(&vsp->image); params[1] = READ_BE_UINT16_UNALIGNED(&vsp->base_color); params[2] = READ_BE_UINT16_UNALIGNED(&vsp->x); params[3] = READ_BE_UINT16_UNALIGNED(&vsp->y); params[4] = READ_BE_UINT16_UNALIGNED(&vsp->unk4); - _vc_ptr = (byte*)params; + _vc_ptr = (byte *)params; vc_10(); vsp++; } #ifdef DRAW_THREE_STARS - fprintf(_dump_file,"***\n"); + fprintf(_dump_file, "***\n"); #endif _video_var_8++; @@ -2391,62 +2551,63 @@ void SimonState::timer_vga_sprites_2() { } #endif -void SimonState::timer_proc1() { +void SimonState::timer_proc1() +{ _timer_4++; - - if(_lock_word & 0xC0E9 || _lock_word & 2) + + if (_lock_word & 0xC0E9 || _lock_word & 2) return; _timer_1++; - + _lock_word |= 2; - if (!(_lock_word&0x10)) { + if (!(_lock_word & 0x10)) { if (!(_game & GAME_SIMON2)) { expire_vga_timers(); expire_vga_timers(); - _cepe_flag^=1; + _cepe_flag ^= 1; if (!_cepe_flag) expire_vga_timers(); _sync_flag_2 ^= 1; } else { - _sync_flag_2^=1; + _sync_flag_2 ^= 1; if (!_sync_flag_2) expire_vga_timers(); - - if (_lock_counter!=0 && !_sync_flag_2) { + + if (_lock_counter != 0 && !_sync_flag_2) { _lock_word &= ~2; return; } } -// if (_lock_counter !=0 && _sync_flag_2==1) { -// printf("skipping draw...\n"); -// goto get_out; -// } +// if (_lock_counter !=0 && _sync_flag_2==1) { +// printf("skipping draw...\n"); +// goto get_out; +// } } - + timer_vga_sprites(); #ifdef DRAW_IMAGES_DEBUG timer_vga_sprites_2(); #endif - if (!(_game&GAME_SIMON2)) { + if (!(_game & GAME_SIMON2)) { if (_copy_partial_mode == 1) { - dx_copy_from_2_to_attached(80, 46, 208-80, 94-46); + dx_copy_from_2_to_attached(80, 46, 208 - 80, 94 - 46); } - if (_copy_partial_mode==2) { + if (_copy_partial_mode == 2) { /* copy partial from attached to 2 */ - dx_copy_from_attached_to_2(176, 61, 320-176, 134-61); + dx_copy_from_attached_to_2(176, 61, 320 - 176, 134 - 61); _copy_partial_mode = 0; } } /* XXX: more stuff here */ - if (_video_var_8){ + if (_video_var_8) { handle_mouse_moved(); /* XXX: more stuff here */ dx_update_screen_and_palette(); @@ -2455,27 +2616,29 @@ void SimonState::timer_proc1() { } - _lock_word &= ~2; + _lock_word &= ~2; } -void SimonState::timer_callback() { -// uint32 start, end; +void SimonState::timer_callback() +{ +// uint32 start, end; if (_timer_5 != 0) { _sync_flag_2 = true; - _timer_5 --; + _timer_5--; } else { -// start = timeGetTime(); +// start = timeGetTime(); timer_proc1(); -// end = timeGetTime(); +// end = timeGetTime(); -// if (start + 45 < end) { -// _timer_5 = (uint16)( (end - start) / 45); -// } +// if (start + 45 < end) { +// _timer_5 = (uint16)( (end - start) / 45); +// } } } -void SimonState::checkTimerCallback() { +void SimonState::checkTimerCallback() +{ if (_invoke_timer_callback && !_in_callback) { _in_callback = true; _invoke_timer_callback = 0; @@ -2486,17 +2649,20 @@ void SimonState::checkTimerCallback() { -void SimonState::fcs_proc_1(FillOrCopyStruct *fcs, uint value) { +void SimonState::fcs_proc_1(FillOrCopyStruct *fcs, uint value) +{ fcs->text_color = value; } -void SimonState::o_vga_reset() { +void SimonState::o_vga_reset() +{ _lock_word |= 0x4000; vc_27_reset(); _lock_word &= ~0x4000; } -bool SimonState::vc_maybe_skip_proc_3(uint16 a) { +bool SimonState::vc_maybe_skip_proc_3(uint16 a) +{ Item *item; CHECK_BOUNDS(a, _vc_item_array); @@ -2508,7 +2674,8 @@ bool SimonState::vc_maybe_skip_proc_3(uint16 a) { return getItem1Ptr()->parent == item->parent; } -bool SimonState::vc_maybe_skip_proc_2(uint16 a, uint16 b) { +bool SimonState::vc_maybe_skip_proc_2(uint16 a, uint16 b) +{ Item *item_a, *item_b; CHECK_BOUNDS(a, _vc_item_array); @@ -2523,7 +2690,8 @@ bool SimonState::vc_maybe_skip_proc_2(uint16 a, uint16 b) { return derefItem(item_a->parent) == item_b; } -bool SimonState::vc_maybe_skip_proc_1(uint16 a, int16 b) { +bool SimonState::vc_maybe_skip_proc_1(uint16 a, int16 b) +{ Item *item; CHECK_BOUNDS(a, _vc_item_array); @@ -2536,7 +2704,8 @@ bool SimonState::vc_maybe_skip_proc_1(uint16 a, int16 b) { /* OK */ -void SimonState::fcs_delete(uint a) { +void SimonState::fcs_delete(uint a) +{ if (_fcs_ptr_array_3[a] == NULL) return; fcs_unk1(a); @@ -2549,7 +2718,8 @@ void SimonState::fcs_delete(uint a) { } /* OK */ -void SimonState::fcs_unk_2(uint a) { +void SimonState::fcs_unk_2(uint a) +{ a &= 7; if (_fcs_ptr_array_3[a] == NULL || _fcs_unk_1 == a) @@ -2558,17 +2728,20 @@ void SimonState::fcs_unk_2(uint a) { _fcs_unk_1 = a; startUp_helper_3(); _fcs_ptr_1 = _fcs_ptr_array_3[a]; - + showmessage_helper_3(_fcs_ptr_1->unk6, _fcs_ptr_1->unk7); } /* OK */ -FillOrCopyStruct *SimonState::fcs_alloc(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint unk4) { +FillOrCopyStruct *SimonState::fcs_alloc(uint x, uint y, uint w, uint h, uint flags, uint fill_color, + uint unk4) +{ FillOrCopyStruct *fcs; - + fcs = _fcs_list; - while(fcs->mode != 0) fcs++; + while (fcs->mode != 0) + fcs++; fcs->mode = 2; fcs->x = x; @@ -2585,39 +2758,42 @@ FillOrCopyStruct *SimonState::fcs_alloc(uint x, uint y, uint w, uint h, uint fla return fcs; } -Item *SimonState::derefItem(uint item) { +Item *SimonState::derefItem(uint item) +{ if (item >= _itemarray_size) error("derefItem: invalid item %d", item); return _itemarray_ptr[item]; } -uint SimonState::itemPtrToID(Item *id) { +uint SimonState::itemPtrToID(Item *id) +{ uint i; - for(i = 0; i!=_itemarray_size; i++) + for (i = 0; i != _itemarray_size; i++) if (_itemarray_ptr[i] == id) return i; error("itemPtrToID: not found"); } -void SimonState::o_pathfind(int x,int y,uint var_1,uint var_2) { +void SimonState::o_pathfind(int x, int y, uint var_1, uint var_2) +{ uint16 *p; uint i, j; uint prev_i; uint x_diff, y_diff; - uint best_i=0, best_j=0, best_dist = 0xFFFFFFFF; + uint best_i = 0, best_j = 0, best_dist = 0xFFFFFFFF; if (_game & GAME_SIMON2) { x += _x_scroll * 8; } prev_i = 21 - _variableArray[12]; - for(i=20; i!=0; --i) { - p = (uint16*)_pathfind_array[20-i]; + for (i = 20; i != 0; --i) { + p = (uint16 *)_pathfind_array[20 - i]; if (!p) continue; - for(j=0; READ_BE_UINT16_UNALIGNED(&p[0]) != 999; j++,p+=2) { /* 0xE703 = byteswapped 999 */ - x_diff = abs((int) (READ_BE_UINT16_UNALIGNED(&p[0]) - x)); - y_diff = abs((int) (READ_BE_UINT16_UNALIGNED(&p[1]) - 12 - y)); + for (j = 0; READ_BE_UINT16_UNALIGNED(&p[0]) != 999; j++, p += 2) { /* 0xE703 = byteswapped 999 */ + x_diff = abs((int)(READ_BE_UINT16_UNALIGNED(&p[0]) - x)); + y_diff = abs((int)(READ_BE_UINT16_UNALIGNED(&p[1]) - 12 - y)); if (x_diff < y_diff) { x_diff >>= 2; @@ -2625,36 +2801,37 @@ void SimonState::o_pathfind(int x,int y,uint var_1,uint var_2) { } x_diff += y_diff >> 2; - if (x_diff < best_dist || x_diff==best_dist && prev_i==i) { + if (x_diff < best_dist || x_diff == best_dist && prev_i == i) { best_dist = x_diff; best_i = 21 - i; best_j = j; } } } - + _variableArray[var_1] = best_i; _variableArray[var_2] = best_j; } /* ok */ -void SimonState::fcs_unk1(uint fcs_index) { +void SimonState::fcs_unk1(uint fcs_index) +{ FillOrCopyStruct *fcs; uint16 fcsunk1; uint16 i; - fcs = _fcs_ptr_array_3[fcs_index&7]; + fcs = _fcs_ptr_array_3[fcs_index & 7]; fcsunk1 = _fcs_unk_1; - - if (fcs==NULL || fcs->fcs_data==NULL) + + if (fcs == NULL || fcs->fcs_data == NULL) return; fcs_unk_2(fcs_index); fcs_putchar(12); fcs_unk_2(fcsunk1); - - for(i = 0;fcs->fcs_data->e[i].item != NULL;i++) { + + for (i = 0; fcs->fcs_data->e[i].item != NULL; i++) { delete_hitarea_by_index(fcs->fcs_data->e[i].hit_area); } @@ -2675,25 +2852,29 @@ void SimonState::fcs_unk1(uint fcs_index) { } /* ok */ -void SimonState::fcs_unk_5(FillOrCopyStruct *fcs, uint fcs_index) { +void SimonState::fcs_unk_5(FillOrCopyStruct *fcs, uint fcs_index) +{ if (!(_game & GAME_SIMON2)) { o_unk_99_simon1(0x80); } } -void SimonState::delete_hitarea_by_index(uint index) { +void SimonState::delete_hitarea_by_index(uint index) +{ CHECK_BOUNDS(index, _hit_areas); _hit_areas[index].flags = 0; } /* ok */ -void SimonState::fcs_putchar(uint a) { +void SimonState::fcs_putchar(uint a) +{ if (_fcs_ptr_1 != _fcs_ptr_array_3[0]) video_putchar(_fcs_ptr_1, a); } /* ok */ -void SimonState::video_fill_or_copy_from_3_to_2(FillOrCopyStruct *fcs) { +void SimonState::video_fill_or_copy_from_3_to_2(FillOrCopyStruct *fcs) +{ if (fcs->flags & 0x10) copy_img_from_3_to_2(fcs); else @@ -2706,43 +2887,39 @@ void SimonState::video_fill_or_copy_from_3_to_2(FillOrCopyStruct *fcs) { } /* ok */ -void SimonState::copy_img_from_3_to_2(FillOrCopyStruct *fcs) { +void SimonState::copy_img_from_3_to_2(FillOrCopyStruct *fcs) +{ _lock_word |= 0x8000; if (!(_game & GAME_SIMON2)) { - dx_copy_rgn_from_3_to_2( - fcs->y + fcs->height*8 + ((fcs==_fcs_ptr_array_3[2])?1:0), - (fcs->x+fcs->width)*8, - fcs->y, - fcs->x*8); + dx_copy_rgn_from_3_to_2(fcs->y + fcs->height * 8 + ((fcs == _fcs_ptr_array_3[2]) ? 1 : 0), + (fcs->x + fcs->width) * 8, fcs->y, fcs->x * 8); } else { - if (_vga_var6 && _fcs_ptr_array_3[2]==fcs) { - fcs = _fcs_ptr_array_3[0x18/4]; + if (_vga_var6 && _fcs_ptr_array_3[2] == fcs) { + fcs = _fcs_ptr_array_3[0x18 / 4]; _vga_var6 = 0; } - dx_copy_rgn_from_3_to_2( - fcs->y + fcs->height*8, - (fcs->x+fcs->width)*8, - fcs->y, - fcs->x*8); + dx_copy_rgn_from_3_to_2(fcs->y + fcs->height * 8, + (fcs->x + fcs->width) * 8, fcs->y, fcs->x * 8); } _lock_word &= ~0x8000; } -void SimonState::video_erase(FillOrCopyStruct *fcs) { +void SimonState::video_erase(FillOrCopyStruct *fcs) +{ byte *dst; uint h; - + _lock_word |= 0x8000; dst = dx_lock_2(); - dst += _dx_surface_pitch * fcs->y + fcs->x*8; + dst += _dx_surface_pitch * fcs->y + fcs->x * 8; h = fcs->height * 8; do { - memset(dst, fcs->fill_color, fcs->width*8); + memset(dst, fcs->fill_color, fcs->width * 8); dst += _dx_surface_pitch; } while (--h); @@ -2750,12 +2927,12 @@ void SimonState::video_erase(FillOrCopyStruct *fcs) { _lock_word &= ~0x8000; } -VgaSprite *SimonState::find_cur_sprite() { +VgaSprite *SimonState::find_cur_sprite() +{ if (_game & GAME_SIMON2) { VgaSprite *vsp = _vga_sprites; while (vsp->id) { - if (vsp->id == _vga_cur_sprite_id - && vsp->unk7 == _vga_cur_file_id) + if (vsp->id == _vga_cur_sprite_id && vsp->unk7 == _vga_cur_file_id) break; vsp++; } @@ -2771,11 +2948,12 @@ VgaSprite *SimonState::find_cur_sprite() { } } -bool SimonState::has_vgastruct_with_id(uint16 id, uint16 file) { +bool SimonState::has_vgastruct_with_id(uint16 id, uint16 file) +{ if (_game & GAME_SIMON2) { VgaSprite *vsp = _vga_sprites; while (vsp->id) { - if (vsp->id == id && vsp->unk7==file) + if (vsp->id == id && vsp->unk7 == file) return true; vsp++; } @@ -2791,37 +2969,44 @@ bool SimonState::has_vgastruct_with_id(uint16 id, uint16 file) { } } -void SimonState::processSpecialKeys() { +void SimonState::processSpecialKeys() +{ } -void SimonState::draw_mouse_pointer() { +void SimonState::draw_mouse_pointer() +{ } -void decompress_icon(byte *dst, byte *src, uint w, uint h_org, byte base, uint pitch) { +void decompress_icon(byte *dst, byte *src, uint w, uint h_org, byte base, uint pitch) +{ int8 reps; byte color_1, color_2; byte *dst_org = dst; uint h = h_org; - for(;;) { + for (;;) { reps = *src++; if (reps < 0) { reps--; color_1 = *src >> 4; - if (color_1 != 0) color_1 |= base; + if (color_1 != 0) + color_1 |= base; color_2 = *src++ & 0xF; - if (color_2 != 0) color_2 |= base; - - do { - if (color_1 != 0) *dst = color_1; + if (color_2 != 0) + color_2 |= base; + + do { + if (color_1 != 0) + *dst = color_1; dst += pitch; - if (color_2 != 0) *dst = color_2; + if (color_2 != 0) + *dst = color_2; dst += pitch; /* reached bottom? */ if (--h == 0) { - /* reached right edge? */ + /* reached right edge? */ if (--w == 0) return; dst = ++dst_org; @@ -2829,18 +3014,20 @@ void decompress_icon(byte *dst, byte *src, uint w, uint h_org, byte base, uint p } } while (++reps != 0); } else { - do { + do { color_1 = *src >> 4; - if (color_1 != 0) *dst = color_1 | base; + if (color_1 != 0) + *dst = color_1 | base; dst += pitch; color_2 = *src++ & 0xF; - if (color_2 != 0) *dst = color_2 | base; + if (color_2 != 0) + *dst = color_2 | base; dst += pitch; /* reached bottom? */ if (--h == 0) { - /* reached right edge? */ + /* reached right edge? */ if (--w == 0) return; dst = ++dst_org; @@ -2852,7 +3039,8 @@ void decompress_icon(byte *dst, byte *src, uint w, uint h_org, byte base, uint p } -void SimonState::draw_icon_c(FillOrCopyStruct *fcs, uint icon, uint x, uint y) { +void SimonState::draw_icon_c(FillOrCopyStruct *fcs, uint icon, uint x, uint y) +{ byte *dst; byte *src; @@ -2861,55 +3049,57 @@ void SimonState::draw_icon_c(FillOrCopyStruct *fcs, uint icon, uint x, uint y) { dst = dx_lock_2(); dst += (x + fcs->x) * 8; - dst += (y*25 + fcs->y) * _dx_surface_pitch; + dst += (y * 25 + fcs->y) * _dx_surface_pitch; src = _icon_file_ptr; - src += READ_LE_UINT16(&((uint16*)src)[icon]); + src += READ_LE_UINT16(&((uint16 *)src)[icon]); - decompress_icon(dst, src, 24, 12, 0xE0,_dx_surface_pitch); + decompress_icon(dst, src, 24, 12, 0xE0, _dx_surface_pitch); dx_unlock_2(); _lock_word &= ~0x8000; } else { - _lock_word |= 0x8000; + _lock_word |= 0x8000; dst = dx_lock_2(); dst += 110; dst += x; - dst += (y+fcs->y)*_dx_surface_pitch; + dst += (y + fcs->y) * _dx_surface_pitch; src = _icon_file_ptr; - src += READ_LE_UINT16(&((uint16*)src)[icon*2+0]); - decompress_icon(dst, src, 20, 10, 0xE0,_dx_surface_pitch); + src += READ_LE_UINT16(&((uint16 *)src)[icon * 2 + 0]); + decompress_icon(dst, src, 20, 10, 0xE0, _dx_surface_pitch); src = _icon_file_ptr; - src += READ_LE_UINT16(&((uint16*)src)[icon*2+1]); - decompress_icon(dst, src, 20, 10, 0xD0,_dx_surface_pitch); + src += READ_LE_UINT16(&((uint16 *)src)[icon * 2 + 1]); + decompress_icon(dst, src, 20, 10, 0xD0, _dx_surface_pitch); dx_unlock_2(); _lock_word &= ~0x8000; } } -void SimonState::video_toggle_colors(HitArea *ha, byte a, byte b, byte c, byte d) { +void SimonState::video_toggle_colors(HitArea * ha, byte a, byte b, byte c, byte d) +{ byte *src, color; - uint w,h,i; + uint w, h, i; _lock_word |= 0x8000; - src = dx_lock_2() + ha->y*_dx_surface_pitch + ha->x; + src = dx_lock_2() + ha->y * _dx_surface_pitch + ha->x; w = ha->width; h = ha->height; - if(!(h>0 && w>0 && ha->x + w<=320 && ha->y+h<=200)) { - warning("Invalid coordinates in video_toggle_colors (%d,%d,%d,%d)", ha->x, ha->y,ha->width, ha->height); + if (!(h > 0 && w > 0 && ha->x + w <= 320 && ha->y + h <= 200)) { + warning("Invalid coordinates in video_toggle_colors (%d,%d,%d,%d)", ha->x, ha->y, ha->width, + ha->height); return; } do { - for(i=0; i!=w; ++i) { + for (i = 0; i != w; ++i) { color = src[i]; - if (a>=color && b<color) { + if (a >= color && b < color) { if (c >= color) color += d; else @@ -2918,31 +3108,34 @@ void SimonState::video_toggle_colors(HitArea *ha, byte a, byte b, byte c, byte d } } src += _dx_surface_pitch; - } while(--h); + } while (--h); dx_unlock_2(); _lock_word &= ~0x8000; } -bool SimonState::vc_59_helper() { +bool SimonState::vc_59_helper() +{ #ifdef USE_TEXT_HACK return true; #else - if (_voice_file==NULL) + if (_voice_file == NULL) return false; return _voice_sound == 0; #endif } -void SimonState::video_copy_if_flag_0x8_c(FillOrCopyStruct *fcs) { - if (fcs->flags&8) +void SimonState::video_copy_if_flag_0x8_c(FillOrCopyStruct *fcs) +{ + if (fcs->flags & 8) copy_img_from_3_to_2(fcs); fcs->mode = 0; } -void SimonState::showMessageFormat(const char *s, ...) { - char buf[1024],*str; +void SimonState::showMessageFormat(const char *s, ...) +{ + char buf[1024], *str; va_list va; va_start(va, s); @@ -2959,25 +3152,27 @@ void SimonState::showMessageFormat(const char *s, ...) { _fcs_data_1[_fcs_unk_1] = 1; } - for(str=buf;*str;str++) + for (str = buf; *str; str++) showmessage_print_char(*str); } -void SimonState::showmessage_helper_2() { +void SimonState::showmessage_helper_2() +{ if (_fcs_ptr_1) return; _fcs_ptr_1 = fcs_alloc(8, 0x90, 0x18, 6, 1, 0, 0xF); } -void SimonState::readSfxFile(const char *filename) { +void SimonState::readSfxFile(const char *filename) +{ if (!(_game & GAME_SIMON2)) { FILE *in; uint32 size; in = fopen_maybe_lowercase(filename); - if(in==NULL) { + if (in == NULL) { warning("readSfxFile: Cannot load sfx file %s", filename); return; } @@ -2986,13 +3181,14 @@ void SimonState::readSfxFile(const char *filename) { size = ftell(in); fseek(in, 0, SEEK_SET); - + /* stop all sounds */ _mixer->stop_all(); - if (_sfx_heap) free(_sfx_heap); + if (_sfx_heap) + free(_sfx_heap); - _sfx_heap = (byte*)malloc(size); + _sfx_heap = (byte *)malloc(size); if (_sfx_heap == NULL) error("readSfxFile: Not enough SFX memory"); @@ -3007,29 +3203,31 @@ void SimonState::readSfxFile(const char *filename) { vc_29_stop_all_sounds(); - if (_sfx_heap) free(_sfx_heap); + if (_sfx_heap) + free(_sfx_heap); res = atoi(filename + 6) + gss->SOUND_INDEX_BASE - 1; offs = _game_offsets_ptr[res]; - size = _game_offsets_ptr[res+1] - offs; + size = _game_offsets_ptr[res + 1] - offs; if (size == 0) return; - _sfx_heap = (byte*)malloc(size); + _sfx_heap = (byte *)malloc(size); resfile_read(_sfx_heap, offs, size); } } -void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) { +void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) +{ if (c == 0xC) { video_fill_or_copy_from_3_to_2(fcs); - } else if (c == 0xD || c==0xA) { + } else if (c == 0xD || c == 0xA) { video_putchar_helper(fcs); - } else if (c==8 || c==1) { - int8 val = (c==8) ? 6 : 4; - if (fcs->unk6!=0) { + } else if (c == 8 || c == 1) { + int8 val = (c == 8) ? 6 : 4; + if (fcs->unk6 != 0) { fcs->unk6--; fcs->unk3 -= val; if ((int8)fcs->unk3 < val) { @@ -3037,7 +3235,7 @@ void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) { fcs->unk1--; } } - } else if (c>=0x20) { + } else if (c >= 0x20) { if (fcs->unk6 == fcs->unk7) { video_putchar_helper(fcs); } else if (fcs->unk2 == fcs->height) { @@ -3059,7 +3257,8 @@ void SimonState::video_putchar(FillOrCopyStruct *fcs, byte c) { } } -void SimonState::video_putchar_helper(FillOrCopyStruct *fcs) { +void SimonState::video_putchar_helper(FillOrCopyStruct *fcs) +{ fcs->unk3 = 0; fcs->unk6 = 0; fcs->unk1 = 0; @@ -3069,117 +3268,118 @@ void SimonState::video_putchar_helper(FillOrCopyStruct *fcs) { } static const byte video_font[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 32,112,112, 32, 32, 0, 32, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 0,144, 0, 96,144,144,104, 0, - 0,144, 0, 96,144,144, 96, 0, - 0,144, 0,144,144,144, 96, 0, - 0, 16, 40, 16, 42, 68, 58, 0, - 48, 48, 96, 0, 0, 0, 0, 0, - 0, 4, 8, 8, 8, 8, 4, 0, - 0, 32, 16, 16, 16, 16, 32, 0, - 0, 0, 20, 8, 62, 8, 20, 0, - 0,112,136,240,136,136,240, 0, - 0, 0, 0, 0, 0, 48, 48, 96, - 0, 0, 0,240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 0, - 16, 32, 0,120,112, 64, 56, 0, -112,136,152,168,200,136,112, 0, - 32, 96, 32, 32, 32, 32,112, 0, -112,136, 8, 48, 64,136,248, 0, -112,136, 8, 48, 8,136,112, 0, - 16, 48, 80,144,248, 16, 56, 0, -248,128,240, 8, 8,136,112, 0, - 48, 64,128,240,136,136,112, 0, -248,136, 8, 16, 32, 32, 32, 0, -112,136,136,112,136,136,112, 0, -112,136,136,120, 8, 16, 96, 0, - 0, 0, 48, 48, 0, 48, 48, 0, - 32, 16, 0,112, 8,248,120, 0, - 32, 80, 0,144,144,144,104, 0, - 32, 16, 0,112,248,128,112, 0, - 32, 80, 0,112,248,128,112, 0, -112,136, 8, 16, 32, 0, 32, 0, - 32, 80, 0,192, 64, 64,224, 0, -112,136,136,248,136,136,136, 0, -240, 72, 72,112, 72, 72,240, 0, - 48, 72,128,128,128, 72, 48, 0, -224, 80, 72, 72, 72, 80,224, 0, -248, 72, 64,112, 64, 72,248, 0, -248, 72, 64,112, 64, 64,224, 0, - 48, 72,128,152,136, 72, 56, 0, -136,136,136,248,136,136,136, 0, -248, 32, 32, 32, 32, 32,248, 0, - 24, 8, 8, 8,136,136,112, 0, -200, 72, 80, 96, 80, 72,200, 0, -224, 64, 64, 64, 64, 72,248, 0, -136,216,168,168,136,136,136, 0, -136,200,168,152,136,136,136, 0, -112,136,136,136,136,136,112, 0, -240, 72, 72,112, 64, 64,224, 0, -112,136,136,136,136,168,112, 8, -240, 72, 72,112, 72, 72,200, 0, -112,136,128,112, 8,136,112, 0, -248,168, 32, 32, 32, 32,112, 0, -136,136,136,136,136,136,120, 0, -136,136,136, 80, 80, 32, 32, 0, -136,136,136,136,168,216,136, 0, -136,136, 80, 32, 80,136,136, 0, -136,136,136,112, 32, 32,112, 0, -248,136, 16, 32, 64,136,248, 0, - 0, 14, 8, 8, 8, 8, 14, 0, - 0,128, 64, 32, 16, 8, 4, 0, - 0,112, 16, 16, 16, 16,112, 0, - 0, 48, 72, 64, 72, 48, 16, 48, - 0, 80, 0, 96, 32, 40, 48, 0, - 32, 16, 0,152,144,144,232, 0, - 0, 0,112, 8,120,136,120, 0, -192, 64, 80,104, 72, 72,112, 0, - 0, 0,112,136,128,136,112, 0, - 24, 16, 80,176,144,144,112, 0, - 0, 0,112,136,248,128,112, 0, - 48, 72, 64,224, 64, 64,224, 0, - 0, 0,104,144,144,112,136,112, -192, 64, 80,104, 72, 72,200, 0, - 64, 0,192, 64, 64, 64,224, 0, - 8, 0, 8, 8, 8, 8,136,112, -192, 64, 72, 80, 96, 80,200, 0, -192, 64, 64, 64, 64, 64,224, 0, - 0, 0,144,216,168,136,136, 0, - 0, 0,240,136,136,136,136, 0, - 0, 0,112,136,136,136,112, 0, - 0, 0,176, 72, 72,112, 64,224, - 0, 0,104,144,144,112, 16, 56, - 0, 0,176, 72, 72, 64,224, 0, - 0, 0,120,128,112, 8,240, 0, - 64, 64,240, 64, 64, 72, 48, 0, - 0, 0,144,144,144,144,104, 0, - 0, 0,136,136,136, 80, 32, 0, - 0, 0,136,136,168,216,144, 0, - 0, 0,136, 80, 32, 80,136, 0, - 0, 0,136,136,136,112, 32,192, - 0, 0,248,144, 32, 72,248, 0, - 32, 80, 0, 96,144,144, 96, 0, - 0, 14, 8, 48, 8, 8, 14, 0, - 0, 8, 8, 8, 8, 8, 8, 0, - 0,112, 16, 12, 16, 16,112, 0, - 0, 0, 0, 0, 0, 0,248, 0, -252,252,252,252,252,252,252,252, -240,240,240,240,240,240,240,240, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 112, 112, 32, 32, 0, 32, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 0, 144, 0, 96, 144, 144, 104, 0, + 0, 144, 0, 96, 144, 144, 96, 0, + 0, 144, 0, 144, 144, 144, 96, 0, + 0, 16, 40, 16, 42, 68, 58, 0, + 48, 48, 96, 0, 0, 0, 0, 0, + 0, 4, 8, 8, 8, 8, 4, 0, + 0, 32, 16, 16, 16, 16, 32, 0, + 0, 0, 20, 8, 62, 8, 20, 0, + 0, 112, 136, 240, 136, 136, 240, 0, + 0, 0, 0, 0, 0, 48, 48, 96, + 0, 0, 0, 240, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 0, + 16, 32, 0, 120, 112, 64, 56, 0, + 112, 136, 152, 168, 200, 136, 112, 0, + 32, 96, 32, 32, 32, 32, 112, 0, + 112, 136, 8, 48, 64, 136, 248, 0, + 112, 136, 8, 48, 8, 136, 112, 0, + 16, 48, 80, 144, 248, 16, 56, 0, + 248, 128, 240, 8, 8, 136, 112, 0, + 48, 64, 128, 240, 136, 136, 112, 0, + 248, 136, 8, 16, 32, 32, 32, 0, + 112, 136, 136, 112, 136, 136, 112, 0, + 112, 136, 136, 120, 8, 16, 96, 0, + 0, 0, 48, 48, 0, 48, 48, 0, + 32, 16, 0, 112, 8, 248, 120, 0, + 32, 80, 0, 144, 144, 144, 104, 0, + 32, 16, 0, 112, 248, 128, 112, 0, + 32, 80, 0, 112, 248, 128, 112, 0, + 112, 136, 8, 16, 32, 0, 32, 0, + 32, 80, 0, 192, 64, 64, 224, 0, + 112, 136, 136, 248, 136, 136, 136, 0, + 240, 72, 72, 112, 72, 72, 240, 0, + 48, 72, 128, 128, 128, 72, 48, 0, + 224, 80, 72, 72, 72, 80, 224, 0, + 248, 72, 64, 112, 64, 72, 248, 0, + 248, 72, 64, 112, 64, 64, 224, 0, + 48, 72, 128, 152, 136, 72, 56, 0, + 136, 136, 136, 248, 136, 136, 136, 0, + 248, 32, 32, 32, 32, 32, 248, 0, + 24, 8, 8, 8, 136, 136, 112, 0, + 200, 72, 80, 96, 80, 72, 200, 0, + 224, 64, 64, 64, 64, 72, 248, 0, + 136, 216, 168, 168, 136, 136, 136, 0, + 136, 200, 168, 152, 136, 136, 136, 0, + 112, 136, 136, 136, 136, 136, 112, 0, + 240, 72, 72, 112, 64, 64, 224, 0, + 112, 136, 136, 136, 136, 168, 112, 8, + 240, 72, 72, 112, 72, 72, 200, 0, + 112, 136, 128, 112, 8, 136, 112, 0, + 248, 168, 32, 32, 32, 32, 112, 0, + 136, 136, 136, 136, 136, 136, 120, 0, + 136, 136, 136, 80, 80, 32, 32, 0, + 136, 136, 136, 136, 168, 216, 136, 0, + 136, 136, 80, 32, 80, 136, 136, 0, + 136, 136, 136, 112, 32, 32, 112, 0, + 248, 136, 16, 32, 64, 136, 248, 0, + 0, 14, 8, 8, 8, 8, 14, 0, + 0, 128, 64, 32, 16, 8, 4, 0, + 0, 112, 16, 16, 16, 16, 112, 0, + 0, 48, 72, 64, 72, 48, 16, 48, + 0, 80, 0, 96, 32, 40, 48, 0, + 32, 16, 0, 152, 144, 144, 232, 0, + 0, 0, 112, 8, 120, 136, 120, 0, + 192, 64, 80, 104, 72, 72, 112, 0, + 0, 0, 112, 136, 128, 136, 112, 0, + 24, 16, 80, 176, 144, 144, 112, 0, + 0, 0, 112, 136, 248, 128, 112, 0, + 48, 72, 64, 224, 64, 64, 224, 0, + 0, 0, 104, 144, 144, 112, 136, 112, + 192, 64, 80, 104, 72, 72, 200, 0, + 64, 0, 192, 64, 64, 64, 224, 0, + 8, 0, 8, 8, 8, 8, 136, 112, + 192, 64, 72, 80, 96, 80, 200, 0, + 192, 64, 64, 64, 64, 64, 224, 0, + 0, 0, 144, 216, 168, 136, 136, 0, + 0, 0, 240, 136, 136, 136, 136, 0, + 0, 0, 112, 136, 136, 136, 112, 0, + 0, 0, 176, 72, 72, 112, 64, 224, + 0, 0, 104, 144, 144, 112, 16, 56, + 0, 0, 176, 72, 72, 64, 224, 0, + 0, 0, 120, 128, 112, 8, 240, 0, + 64, 64, 240, 64, 64, 72, 48, 0, + 0, 0, 144, 144, 144, 144, 104, 0, + 0, 0, 136, 136, 136, 80, 32, 0, + 0, 0, 136, 136, 168, 216, 144, 0, + 0, 0, 136, 80, 32, 80, 136, 0, + 0, 0, 136, 136, 136, 112, 32, 192, + 0, 0, 248, 144, 32, 72, 248, 0, + 32, 80, 0, 96, 144, 144, 96, 0, + 0, 14, 8, 48, 8, 8, 14, 0, + 0, 8, 8, 8, 8, 8, 8, 0, + 0, 112, 16, 12, 16, 16, 112, 0, + 0, 0, 0, 0, 0, 0, 248, 0, + 252, 252, 252, 252, 252, 252, 252, 252, + 240, 240, 240, 240, 240, 240, 240, 240, }; -void SimonState::video_putchar_helper_2(FillOrCopyStruct *fcs, uint x, uint y, byte chr) { +void SimonState::video_putchar_helper_2(FillOrCopyStruct *fcs, uint x, uint y, byte chr) +{ const byte *src; byte color, *dst; - uint h,i; + uint h, i; _lock_word |= 0x8000; dst = dx_lock_2(); - dst += y * _dx_surface_pitch + x*8 + fcs->unk3; + dst += y * _dx_surface_pitch + x * 8 + fcs->unk3; - src = video_font + (chr-0x20) * 8; + src = video_font + (chr - 0x20) * 8; color = fcs->text_color; @@ -3188,9 +3388,10 @@ void SimonState::video_putchar_helper_2(FillOrCopyStruct *fcs, uint x, uint y, b int8 b = *src++; i = 0; do { - if (b<0) dst[i] = color; - b<<=1; - } while (++i!=6); + if (b < 0) + dst[i] = color; + b <<= 1; + } while (++i != 6); dst += _dx_surface_pitch; } while (--h); @@ -3199,20 +3400,21 @@ void SimonState::video_putchar_helper_2(FillOrCopyStruct *fcs, uint x, uint y, b _lock_word &= ~0x8000; } -void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, - uint c, uint d, uint f) { +void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, uint c, uint d, uint f) +{ VgaSprite *vsp; VgaPointersEntry *vpe; - byte *p,*pp; + byte *p, *pp; uint count; - + _lock_word |= 0x40; - if (has_vgastruct_with_id(vga_struct_id,vga_res)) + if (has_vgastruct_with_id(vga_struct_id, vga_res)) return; vsp = _vga_sprites; - while(vsp->id!=0) vsp++; + while (vsp->id != 0) + vsp++; vsp->unk6 = b; vsp->unk5 = 0; @@ -3225,7 +3427,7 @@ void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, vsp->id = vga_struct_id; vsp->unk7 = vga_res; - for(;;) { + for (;;) { vpe = &_vga_buffer_pointers[vga_res]; _vga_cur_file_2 = vga_res; _cur_vga_file_1 = vpe->vgaFile1; @@ -3233,21 +3435,21 @@ void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, break; ensureVgaResLoaded(vga_res); } - + pp = _cur_vga_file_1; - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)pp)->hdr2_start); - - count = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)p)->id_count); - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)p)->id_table); - - for(;;) { - if (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->id) == vga_struct_id) { - + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) pp)->hdr2_start); + + count = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) p)->id_count); + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) p)->id_table); + + for (;;) { + if (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->id) == vga_struct_id) { + //dump_vga_script(pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs), vga_res, vga_struct_id); - add_vga_timer(gss->VGA_DELAY_BASE, - pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs), - vga_struct_id, vga_res); + add_vga_timer(gss->VGA_DELAY_BASE, + pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->script_offs), + vga_struct_id, vga_res); break; } p += sizeof(VgaFile1Struct0x6); @@ -3260,12 +3462,13 @@ void SimonState::start_vga_code(uint b, uint vga_res, uint vga_struct_id, _lock_word &= ~0x40; } -void SimonState::talk_with_speech(uint speech_id, uint num_1) { +void SimonState::talk_with_speech(uint speech_id, uint num_1) +{ if (!(_game & GAME_SIMON2)) { if (speech_id == 9999) { - if (!(_bit_array[0] & 0x4000) && !(_bit_array[1]&0x1000)) { - _bit_array[0]|=0x4000; - _variableArray[0xc8/2] = 0xF; + if (!(_bit_array[0] & 0x4000) && !(_bit_array[1] & 0x1000)) { + _bit_array[0] |= 0x4000; + _variableArray[0xc8 / 2] = 0xF; start_vga_code(4, 1, 0x82, 0, 0, 0); o_wait_for_vga(0x82); } @@ -3280,15 +3483,15 @@ void SimonState::talk_with_speech(uint speech_id, uint num_1) { playVoice(speech_id); if (num_1 < 100) { - start_vga_code(4, 2, num_1+201,0,0,0); + start_vga_code(4, 2, num_1 + 201, 0, 0, 0); } } else { - if (speech_id == 0xFFFF) { + if (speech_id == 0xFFFF) { if (_vk_t_toggle) return; - if (!(_bit_array[0] & 0x4000 || _bit_array[1] & 0x1000)) { + if (!(_bit_array[0] & 0x4000 || _bit_array[1] & 0x1000)) { _bit_array[0] |= 0x4000; - + start_vga_code(4, 1, 0x1e, 0, 0, 0); o_wait_for_vga(0x82); } @@ -3297,17 +3500,19 @@ void SimonState::talk_with_speech(uint speech_id, uint num_1) { if (_vk_t_toggle && _scriptvar_2) { start_vga_code(4, 2, 5, 0, 0, 0); o_wait_for_vga(0xcd); - o_unk_99_simon2(2,5); + o_unk_99_simon2(2, 5); } - o_unk_99_simon2(2,num_1+2); + o_unk_99_simon2(2, num_1 + 2); playVoice(speech_id); - start_vga_code(4, 2, num_1+2, 0, 0, 0); + start_vga_code(4, 2, num_1 + 2, 0, 0, 0); } } } -void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, uint threeval_a, int threeval_b, uint width) { +void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, uint threeval_a, + int threeval_b, uint width) +{ char print_str_buf[0x140]; char *char_buf; const char *string_ptr_2, *string_ptr_3; @@ -3316,7 +3521,7 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, uint m, n; uint height; - if (num_1 >= 100) // FIXME: Simon1 Mine - Fix text for dwarf song + if (num_1 >= 100) // FIXME: Simon1 Mine - Fix text for dwarf song num_1 -= 100; char_buf = print_str_buf; @@ -3334,19 +3539,22 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, _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; + if (_variableArray[86] == 0) + len_div_3 >>= 1; + if (_variableArray[86] == 2) + len_div_3 <<= 1; _variableArray[85] = len_div_3 * 5; } num_of_rows = strlen(string_ptr) / letters_per_row; - while(num_of_rows==1 && j!=-1) { + while (num_of_rows == 1 && j != -1) { m = strlen(string_ptr) >> 1; m -= j; string_ptr_2 += m; - while (*string_ptr_2++ != ' ' && m <= letters_per_row) m++; + while (*string_ptr_2++ != ' ' && m <= letters_per_row) + m++; if (m <= letters_per_row && strlen(string_ptr_2) < letters_per_row) { /* if_1 */ @@ -3358,7 +3566,7 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } strncpy(char_buf, string_ptr, m); char_buf += m; - *char_buf++= 10; + *char_buf++ = 10; height += 10; threeval_b -= 10; @@ -3377,15 +3585,16 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } } - if (j != -1 && width*30 > 8000) + if (j != -1 && width * 30 > 8000) num_of_rows = 4; - while (num_of_rows==2 && j!=-1) { + while (num_of_rows == 2 && j != -1) { m = strlen(string_ptr) / 3; m += j; string_ptr_2 += m; - while (*string_ptr_2++ != ' ' && m <= letters_per_row) m++; + while (*string_ptr_2++ != ' ' && m <= letters_per_row) + m++; if (m <= letters_per_row) { /* if_4 */ @@ -3396,17 +3605,18 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } strncpy(char_buf, string_ptr, m); char_buf += m; - *char_buf++= 10; + *char_buf++ = 10; string_ptr = string_ptr_2; string_ptr_2 += m; - while (*string_ptr_2-- != ' ' && m > 0) m--; + while (*string_ptr_2-- != ' ' && m > 0) + m--; /* while_6_end */ string_ptr_2 += 2; - if (strlen(string_ptr_2) <= m && m>0) { + if (strlen(string_ptr_2) <= m && m > 0) { /* if_6 */ n = (letters_per_row - m + 1) >> 1; while (n) { @@ -3419,7 +3629,8 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, height += 20; threeval_b -= 20; - if (threeval_b < 2) threeval_b = 2; + if (threeval_b < 2) + threeval_b = 2; j = -1; } else { /* else_6 */ @@ -3437,20 +3648,21 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } } - if (j!=-1 && width*40 > 8000) + if (j != -1 && width * 40 > 8000) num_of_rows = 4; /* while_8 */ - while (num_of_rows==3 && j!=-1) { + while (num_of_rows == 3 && j != -1) { m = strlen(string_ptr) >> 2; m += j; string_ptr_2 += m; - while (*string_ptr_2++ != ' ' && m <= letters_per_row) m++; + while (*string_ptr_2++ != ' ' && m <= letters_per_row) + m++; if (m <= letters_per_row) { /* if_10 */ n = (letters_per_row - m + 1) >> 1; - while(n) { + while (n) { *char_buf++ = ' '; n--; } @@ -3459,10 +3671,11 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, *char_buf++ = ' '; string_ptr = string_ptr_2; string_ptr_2 += m; - while (*string_ptr_2-- != ' ' && m>0) m--; + while (*string_ptr_2-- != ' ' && m > 0) + m--; string_ptr_2 += 2; - if (strlen(string_ptr_2) < m*2 && m>0) { + if (strlen(string_ptr_2) < m * 2 && m > 0) { /* if_11 */ n = (letters_per_row - m + 1) >> 1; while (n) { @@ -3475,10 +3688,11 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, string_ptr = string_ptr_2; string_ptr_2 += m; - while(*string_ptr_2-- != ' ' && m>0) m--; + while (*string_ptr_2-- != ' ' && m > 0) + m--; string_ptr_2 += 2; - if (strlen(string_ptr_2) <= m && m>0) { + if (strlen(string_ptr_2) <= m && m > 0) { /* if_15 */ n = (letters_per_row - m + 1) >> 1; while (n) { @@ -3490,7 +3704,8 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, *char_buf++ = ' '; height += 30; threeval_b -= 30; - if (threeval_b < 2) threeval_b = 2; + if (threeval_b < 2) + threeval_b = 2; j = -1; } else { /* else_15 */ @@ -3520,7 +3735,8 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, while (strlen(string_ptr) > letters_per_row) { m = letters_per_row; string_ptr_2 += m; - while (*string_ptr_2-- != ' ') m--; + while (*string_ptr_2-- != ' ') + m--; string_ptr_2 += 2; n = (letters_per_row - m + 1) >> 1; while (n) { @@ -3532,13 +3748,14 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, *char_buf++ = 10; height += 10; threeval_b -= 10; - if (threeval_b < 2) threeval_b = 2; + if (threeval_b < 2) + threeval_b = 2; string_ptr = string_ptr_2; } } n = (letters_per_row - strlen(string_ptr_2) + 1) >> 1; - while(n) { + while (n) { *char_buf++ = ' '; n--; } @@ -3556,9 +3773,10 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, if (!(_bit_array[8] & 0x20)) num_of_rows = 3; - - if (threeval_b < 2) threeval_b = 2; // Fixme (pos): look at mine - // ladder, look at gorge, etc + + if (threeval_b < 2) + threeval_b = 2; // Fixme (pos): look at mine + // ladder, look at gorge, etc if (!(_game & GAME_SIMON2)) { start_vga_code(num_of_rows, 2, 199 + num_1, threeval_a >> 3, threeval_b, 12); @@ -3567,9 +3785,10 @@ void SimonState::talk_with_text(uint num_1, uint num_2, const char *string_ptr, } } -void SimonState::render_string(uint num_1, uint color, uint width, uint height, const char *txt) { +void SimonState::render_string(uint num_1, uint color, uint width, uint height, const char *txt) +{ VgaPointersEntry *vpe = &_vga_buffer_pointers[2]; - byte *src,*dst,*p,*dst_org,chr; + byte *src, *dst, *p, *dst_org, chr; uint count; if (num_1 >= 100) { @@ -3585,14 +3804,14 @@ void SimonState::render_string(uint num_1, uint color, uint width, uint height, p = dst + num_1 * 8; - *(uint16*)(p+4) = TO_BE_16(height); - *(uint16*)(p+6) = TO_BE_16(width); + *(uint16 *)(p + 4) = TO_BE_16(height); + *(uint16 *)(p + 6) = TO_BE_16(width); dst += READ_BE_UINT32_UNALIGNED(p); memset(dst, 0, count); dst_org = dst; - while ((chr=*txt++) != 0) { + while ((chr = *txt++) != 0) { if (chr == 10) { dst_org += width * 10; dst = dst_org; @@ -3601,22 +3820,25 @@ void SimonState::render_string(uint num_1, uint color, uint width, uint height, } else { byte *img_hdr = src + 48 + chr * 4; uint img_height = img_hdr[2]; - uint img_width = img_hdr[3],i; + uint img_width = img_hdr[3], i; byte *img = src + READ_LE_UINT16(img_hdr); byte *cur_dst = dst; - assert(img_width > 0 && img_width < 50 && img_height>0 && img_height<50); + assert(img_width > 0 && img_width < 50 && img_height > 0 && img_height < 50); do { - for(i=0; i!=img_width; i++) { + for (i = 0; i != img_width; i++) { chr = *img++; if (chr) { - if (chr == 0xF) chr = 207; else chr += color; + if (chr == 0xF) + chr = 207; + else + chr += color; cur_dst[i] = chr; } } cur_dst += width; - } while(--img_height); + } while (--img_height); dst += img_width - 1; } @@ -3624,25 +3846,26 @@ void SimonState::render_string(uint num_1, uint color, uint width, uint height, } -void SimonState::showmessage_print_char(byte chr) { +void SimonState::showmessage_print_char(byte chr) +{ if (chr == 12) { _num_letters_to_print = 0; _print_char_unk_1 = 0; print_char_helper_1(&chr, 1); print_char_helper_5(_fcs_ptr_1); - } else if (chr==0 || chr==' ' || chr==10) { + } else if (chr == 0 || chr == ' ' || chr == 10) { if (_print_char_unk_2 - _print_char_unk_1 >= _num_letters_to_print) { _print_char_unk_1 += _num_letters_to_print; print_char_helper_1(_letters_to_print_buf, _num_letters_to_print); - + if (_print_char_unk_1 == _print_char_unk_2) { _print_char_unk_1 = 0; } else { if (chr) print_char_helper_1(&chr, 1); - if (chr==10) + if (chr == 10) _print_char_unk_1 = 0; - else if (chr!=0) + else if (chr != 0) _print_char_unk_1++; } } else { @@ -3654,7 +3877,7 @@ void SimonState::showmessage_print_char(byte chr) { print_char_helper_1(&chr, 1); _print_char_unk_1++; } else { - print_char_helper_1(&chr,1); + print_char_helper_1(&chr, 1); _print_char_unk_1 = 0; } } @@ -3664,15 +3887,16 @@ void SimonState::showmessage_print_char(byte chr) { } } -void SimonState::print_char_helper_1(const byte *src, uint len) { +void SimonState::print_char_helper_1(const byte *src, uint len) +{ uint ind; if (_fcs_ptr_1 == NULL) return; while (len-- != 0) { - if (*src != 12 && _fcs_ptr_1->fcs_data!=NULL && - _fcs_data_1[ind=get_fcs_ptr_3_index(_fcs_ptr_1)]!=2) { + if (*src != 12 && _fcs_ptr_1->fcs_data != NULL && + _fcs_data_1[ind = get_fcs_ptr_3_index(_fcs_ptr_1)] != 2) { _fcs_data_1[ind] = 2; _fcs_data_2[ind] = 1; @@ -3682,13 +3906,15 @@ void SimonState::print_char_helper_1(const byte *src, uint len) { } } -void SimonState::print_char_helper_5(FillOrCopyStruct *fcs) { +void SimonState::print_char_helper_5(FillOrCopyStruct *fcs) +{ uint index = get_fcs_ptr_3_index(fcs); print_char_helper_6(index); _fcs_data_1[index] = 0; } -void SimonState::print_char_helper_6(uint i) { +void SimonState::print_char_helper_6(uint i) +{ FillOrCopyStruct *fcs; if (_fcs_data_2[i]) { @@ -3700,16 +3926,17 @@ void SimonState::print_char_helper_6(uint i) { } } -void SimonState::read_vga_from_datfile_1(uint vga_id) { +void SimonState::read_vga_from_datfile_1(uint vga_id) +{ if (_game == GAME_SIMON1DOS) { FILE *in; char buf[50]; uint32 size; - sprintf(buf, "%.3d%d.VGA", vga_id>>1, (vga_id&1)+1); + sprintf(buf, "%.3d%d.VGA", vga_id >> 1, (vga_id & 1) + 1); in = fopen_maybe_lowercase(buf); - if (in==NULL) { + if (in == NULL) { warning("read_vga_from_datfile_1: cannot open %s", buf); return; } @@ -3730,17 +3957,18 @@ void SimonState::read_vga_from_datfile_1(uint vga_id) { } } -byte *SimonState::read_vga_from_datfile_2(uint id) { +byte *SimonState::read_vga_from_datfile_2(uint id) +{ if (_game == GAME_SIMON1DOS) { FILE *in; char buf[50]; uint32 size; byte *dst; - sprintf(buf, "%.3d%d.VGA", id>>1, (id&1)+1); + sprintf(buf, "%.3d%d.VGA", id >> 1, (id & 1) + 1); in = fopen_maybe_lowercase(buf); - if (in==NULL) + if (in == NULL) error("read_vga_from_datfile_2: cannot open %s", buf); fseek(in, 0, SEEK_END); @@ -3767,68 +3995,75 @@ byte *SimonState::read_vga_from_datfile_2(uint id) { } } -void SimonState::resfile_read(void *dst, uint32 offs, uint32 size) { +void SimonState::resfile_read(void *dst, uint32 offs, uint32 size) +{ if (fseek(_game_file, offs, SEEK_SET) != 0) error("resfile_read(%d,%d) seek failed", offs, size); - if (fread(dst, size, 1, _game_file)!=1) + if (fread(dst, size, 1, _game_file) != 1) error("resfile_read(%d,%d) read failed", offs, size); } -void SimonState::openGameFile() { +void SimonState::openGameFile() +{ if (_game != GAME_SIMON1DOS) { _game_file = fopen_maybe_lowercase(gss->gme_filename); - if (_game_file==NULL) + if (_game_file == NULL) error("cannot open game file '%s'", gss->gme_filename); - _game_offsets_ptr = (uint32*)malloc(gss->NUM_GAME_OFFSETS*sizeof(uint32)); + _game_offsets_ptr = (uint32 *)malloc(gss->NUM_GAME_OFFSETS * sizeof(uint32)); if (_game_offsets_ptr == NULL) error("out of memory, game offsets"); - resfile_read(_game_offsets_ptr, 0, gss->NUM_GAME_OFFSETS*sizeof(uint32)); + resfile_read(_game_offsets_ptr, 0, gss->NUM_GAME_OFFSETS * sizeof(uint32)); #if defined(SCUMM_BIG_ENDIAN) - for( int r = 0; r < gss->NUM_GAME_OFFSETS; r++ ) - _game_offsets_ptr[ r ] = READ_LE_UINT32( &_game_offsets_ptr[ r ] ); + for (int r = 0; r < gss->NUM_GAME_OFFSETS; r++) + _game_offsets_ptr[r] = READ_LE_UINT32(&_game_offsets_ptr[r]); #endif } loadIconFile(); - - _system->init_size(320,200); - + + _system->init_size(320, 200); + startUp(1); } -void SimonState::startUp(uint a) { +void SimonState::startUp(uint a) +{ if (a == 1) startUp_helper(); } -void SimonState::startUp_helper() { +void SimonState::startUp_helper() +{ runSubroutine101(); startUp_helper_2(); -} +} -void SimonState::runSubroutine101() { +void SimonState::runSubroutine101() +{ Subroutine *sub; sub = getSubroutineByID(101); if (sub != NULL) startSubroutineEx(sub); - + startUp_helper_2(); } #if 0 -void SimonState::generateSound(byte *ptr, int len) { +void SimonState::generateSound(byte *ptr, int len) +{ uint cur; cur = _voice_size; - if (cur > (uint)len) cur=(uint)len; + if (cur > (uint) len) + cur = (uint) len; _voice_size -= cur; - if (cur!=0) { + if (cur != 0) { fread(ptr, cur, 1, _voice_file); } @@ -3838,12 +4073,13 @@ void SimonState::generateSound(byte *ptr, int len) { if (cur) { uint i; - if (cur > (uint)len) cur = (uint)len; + if (cur > (uint) len) + cur = (uint) len; - for(i=0;i!=cur;i++) { - ptr[i] += _sound_ptr[i] ^0x80; + for (i = 0; i != cur; i++) { + ptr[i] += _sound_ptr[i] ^ 0x80; } - + _sound_size -= cur; _sound_ptr += cur; } @@ -3851,13 +4087,14 @@ void SimonState::generateSound(byte *ptr, int len) { #endif //static void fill_sound(void *userdata, int16 *stream, int len) { -// ((SimonState*)userdata)->generateSound((byte*)stream, len*2); +// ((SimonState*)userdata)->generateSound((byte*)stream, len*2); //} -void SimonState::dx_copy_rgn_from_3_to_2(uint b, uint r, uint y, uint x) { +void SimonState::dx_copy_rgn_from_3_to_2(uint b, uint r, uint y, uint x) +{ byte *dst, *src; uint i; - + dst = dx_lock_2(); src = sdl_buf_3; @@ -3865,74 +4102,80 @@ void SimonState::dx_copy_rgn_from_3_to_2(uint b, uint r, uint y, uint x) { src += y * _dx_surface_pitch; while (y < b) { - for(i=x; i<r; i++) + for (i = x; i < r; i++) dst[i] = src[i]; y++; dst += _dx_surface_pitch; src += _dx_surface_pitch; } - + dx_unlock_2(); } -void SimonState::dx_clear_surfaces(uint num_lines) { - memset(sdl_buf_attached, 0, num_lines*320); - +void SimonState::dx_clear_surfaces(uint num_lines) +{ + memset(sdl_buf_attached, 0, num_lines * 320); + _system->copy_rect(sdl_buf_attached, 320, 0, 0, 320, 200); if (_dx_use_3_or_4_for_lock) { - memset(sdl_buf, 0, num_lines*320); - memset(sdl_buf_3, 0, num_lines*320); + memset(sdl_buf, 0, num_lines * 320); + memset(sdl_buf_3, 0, num_lines * 320); } } -void SimonState::dx_clear_attached_from_top(uint lines) { - memset(sdl_buf_attached, 0, lines*320); +void SimonState::dx_clear_attached_from_top(uint lines) +{ + memset(sdl_buf_attached, 0, lines * 320); } -void SimonState::dx_copy_from_attached_to_2(uint x, uint y, uint w, uint h) { - uint offs = x + y*320; +void SimonState::dx_copy_from_attached_to_2(uint x, uint y, uint w, uint h) +{ + uint offs = x + y * 320; byte *s = sdl_buf_attached + offs; byte *d = sdl_buf + offs; - + do { - memcpy(d,s,w); - d+=320; - s+=320; - } while(--h); + memcpy(d, s, w); + d += 320; + s += 320; + } while (--h); } -void SimonState::dx_copy_from_2_to_attached(uint x, uint y, uint w, uint h) { - uint offs = x + y*320; +void SimonState::dx_copy_from_2_to_attached(uint x, uint y, uint w, uint h) +{ + uint offs = x + y * 320; byte *s = sdl_buf + offs; byte *d = sdl_buf_attached + offs; - + do { - memcpy(d,s,w); - d+=320; - s+=320; - } while(--h); + memcpy(d, s, w); + d += 320; + s += 320; + } while (--h); } -void SimonState::dx_copy_from_attached_to_3(uint lines) { - memcpy(sdl_buf_3, sdl_buf_attached, lines*320); +void SimonState::dx_copy_from_attached_to_3(uint lines) +{ + memcpy(sdl_buf_3, sdl_buf_attached, lines * 320); } -void SimonState::dx_update_screen_and_palette() { +void SimonState::dx_update_screen_and_palette() +{ _num_screen_updates++; - if (_palette_color_count == 0 && _video_var_9==1) { + if (_palette_color_count == 0 && _video_var_9 == 1) { _video_var_9 = 0; - if (memcmp(_palette,_palette_backup,256*4)!=0) { - memcpy(_palette_backup, _palette, 256*4); + if (memcmp(_palette, _palette_backup, 256 * 4) != 0) { + memcpy(_palette_backup, _palette, 256 * 4); _system->set_palette(_palette, 0, 256); } } - if (!_fast_mode || !(rand()&7)) { - + if (!_fast_mode || !(rand() & 7)) { + if (_mouse_pos_changed) { _mouse_pos_changed = false; _system->set_mouse_pos(sdl_mouse_x, sdl_mouse_y); @@ -3941,10 +4184,10 @@ void SimonState::dx_update_screen_and_palette() { _system->update_screen(); } - memcpy(sdl_buf_attached, sdl_buf, 320*200); + memcpy(sdl_buf_attached, sdl_buf, 320 * 200); if (_palette_color_count != 0) { - if (!(_game&GAME_SIMON2) && _use_palette_delay) { + if (!(_game & GAME_SIMON2) && _use_palette_delay) { delay(100); _use_palette_delay = false; } @@ -3953,12 +4196,13 @@ void SimonState::dx_update_screen_and_palette() { } -void SimonState::realizePalette() { - if (_palette_color_count&0x8000) { +void SimonState::realizePalette() +{ + if (_palette_color_count & 0x8000) { error("_palette_color_count&0x8000"); } _video_var_9 = false; - memcpy(_palette_backup, _palette, 256*4); + memcpy(_palette_backup, _palette, 256 * 4); _system->set_palette(_palette, 0, _palette_color_count); _palette_color_count = 0; @@ -3966,21 +4210,22 @@ void SimonState::realizePalette() { } -void SimonState::go() { +void SimonState::go() +{ OSystem::Property prop; if (!_dump_file) _dump_file = stdout; /* allocate buffers */ - sdl_buf_3 = (byte*)calloc(320*200,1); - sdl_buf = (byte*)calloc(320*200,1); - sdl_buf_attached = (byte*)calloc(320*200,1); + sdl_buf_3 = (byte *)calloc(320 * 200, 1); + sdl_buf = (byte *)calloc(320 * 200, 1); + sdl_buf_attached = (byte *)calloc(320 * 200, 1); if (_game == GAME_SIMON2WIN) { gss = &simon2win_settings; - } else if (_game == GAME_SIMON2DOS) { - gss = &simon2dos_settings; + } else if (_game == GAME_SIMON2DOS) { + gss = &simon2dos_settings; } else { gss = &simon1_settings; } @@ -3991,36 +4236,39 @@ void SimonState::go() { setup_vga_file_buf_pointers(); initSound(); - + if (!loadGamePcFile(gss->gamepc_filename)) - error("Error loading gamepc file '%s' (or one of the files it depends on)", gss->gamepc_filename); + error("Error loading gamepc file '%s' (or one of the files it depends on)", + gss->gamepc_filename); addTimeEvent(0, 1); openGameFile(); - _last_music_played = (uint)-1; + _last_music_played = (uint) - 1; _vga_base_delay = 1; _vk_t_toggle = true; prop.show_cursor = true; _system->property(OSystem::PROP_SHOW_DEFAULT_CURSOR, &prop); - while(1) { + while (1) { hitarea_stuff(); handle_verb_clicked(_verb_hitarea); delay(100); } } -void SimonState::shutdown() { +void SimonState::shutdown() +{ if (_game_file) { fclose(_game_file); _game_file = NULL; } } -void SimonState::delay(uint delay) { - OSystem::Event event; +void SimonState::delay(uint delay) +{ + OSystem::Event event; uint32 start = _system->get_msecs(); uint32 cur = start; @@ -4029,9 +4277,9 @@ void SimonState::delay(uint delay) { do { while (!_in_callback && cur >= _last_vga_tick + vga_period) { _last_vga_tick += vga_period; - + /* don't get too many frames behind */ - if (cur >= _last_vga_tick + vga_period*2) + if (cur >= _last_vga_tick + vga_period * 2) _last_vga_tick = cur; _in_callback = true; @@ -4040,38 +4288,36 @@ void SimonState::delay(uint delay) { } while (_system->poll_event(&event)) { - switch(event.event_code) { - case OSystem::EVENT_KEYDOWN: - if (event.kbd.keycode=='t') { + switch (event.event_code) { + case OSystem::EVENT_KEYDOWN:if (event.kbd.keycode == 't') { _vk_t_toggle ^= 1; - } else if (event.kbd.flags==OSystem::KBD_CTRL) { - if (event.kbd.keycode=='f') { - _fast_mode^=1; + } else if (event.kbd.flags == OSystem::KBD_CTRL) { + if (event.kbd.keycode == 'f') { + _fast_mode ^= 1; } } _key_pressed = (byte)event.kbd.ascii; break; - case OSystem::EVENT_MOUSEMOVE: - sdl_mouse_x = event.mouse.x; + case OSystem::EVENT_MOUSEMOVE:sdl_mouse_x = event.mouse.x; sdl_mouse_y = event.mouse.y; _mouse_pos_changed = true; break; - case OSystem::EVENT_LBUTTONDOWN: - _left_button_down++; + case OSystem::EVENT_LBUTTONDOWN:_left_button_down++; break; - case OSystem::EVENT_RBUTTONDOWN: - _exit_cutscene = true; + case OSystem::EVENT_RBUTTONDOWN:_exit_cutscene = true; break; } } - if (delay==0) break; + if (delay == 0) + break; { uint this_delay = _fast_mode ? 1 : 20; - if (this_delay > delay) this_delay = delay; + if (this_delay > delay) + this_delay = delay; _system->delay_msecs(this_delay); } cur = _system->get_msecs(); @@ -4079,40 +4325,41 @@ void SimonState::delay(uint delay) { } -bool SimonState::save_game(uint slot, const char *caption) { +bool SimonState::save_game(uint slot, const char *caption) +{ FILE *f; uint item_index, num_item, i; TimeEvent *te; _lock_word |= 0x100; - + #ifndef _WIN32_WCE errno = 0; #endif - + f = fopen(gen_savename(slot), "wb"); - if (f==NULL) + if (f == NULL) return false; fwrite(caption, 1, 0x12, f); - fileWriteBE32(f, _itemarray_inited-1); + fileWriteBE32(f, _itemarray_inited - 1); fileWriteBE32(f, 0xFFFFFFFF); fileWriteBE32(f, 0); fileWriteBE32(f, 0); - i=0; - for(te = _first_time_struct; te; te = te->next) + i = 0; + for (te = _first_time_struct; te; te = te->next) i++; fileWriteBE32(f, i); - for(te = _first_time_struct; te; te = te->next) { + for (te = _first_time_struct; te; te = te->next) { fileWriteBE32(f, te->time + _base_time); fileWriteBE16(f, te->subroutine_id); } item_index = 1; - for(num_item = _itemarray_inited-1; num_item; num_item--) { + for (num_item = _itemarray_inited - 1; num_item; num_item--) { Item *item = _itemarray_ptr[item_index++]; fileWriteBE16(f, item->parent); @@ -4129,14 +4376,14 @@ bool SimonState::save_game(uint slot, const char *caption) { { Child2 *child2 = findChildOfType2(item); - uint i,j; + uint i, j; if (child2) { fileWriteBE32(f, child2->avail_props); - i = child2->avail_props&1; + i = child2->avail_props & 1; - for(j=1; j<16; j++) { - if ((1<<j) & child2->avail_props) { + for (j = 1; j < 16; j++) { + if ((1 << j) & child2->avail_props) { fileWriteBE16(f, child2->array[i++]); } } @@ -4144,10 +4391,10 @@ bool SimonState::save_game(uint slot, const char *caption) { } { - Child9 *child9 = (Child9*)findChildOfType(item, 9); + Child9 *child9 = (Child9 *) findChildOfType(item, 9); if (child9) { uint i; - for(i=0; i!=4; i++) { + for (i = 0; i != 4; i++) { fileWriteBE16(f, child9->array[i]); } } @@ -4155,19 +4402,19 @@ bool SimonState::save_game(uint slot, const char *caption) { } /* write the 255 variables */ - for(i=0; i!=255; i++) { + for (i = 0; i != 255; i++) { fileWriteBE16(f, readVariable(i)); } /* write the items in array 6 */ - for(i=0; i!=10; i++) { + for (i = 0; i != 10; i++) { fileWriteBE16(f, itemPtrToID(_item_array_6[i])); } - /* Write the bits in array 1 & 2*/ - for(i=0; i!=32; i++) + /* Write the bits in array 1 & 2 */ + for (i = 0; i != 32; i++) fileWriteBE16(f, _bit_array[i]); - + fclose(f); _lock_word &= ~0x100; @@ -4175,14 +4422,16 @@ bool SimonState::save_game(uint slot, const char *caption) { return true; } -char *SimonState::gen_savename(int slot) { +char *SimonState::gen_savename(int slot) +{ static char buf[256]; const char *dir; /* perhaps getenv should be added to OSystem */ #ifndef _WIN32_WCE dir = getenv("SCUMMVM_SAVEPATH"); - if (dir == NULL) dir = ""; + if (dir == NULL) + dir = ""; #else dir = _game_path; #endif @@ -4191,11 +4440,12 @@ char *SimonState::gen_savename(int slot) { return buf; } -bool SimonState::load_game(uint slot) { +bool SimonState::load_game(uint slot) +{ char ident[18]; FILE *f; uint num, item_index, i; - + _lock_word |= 0x100; #ifndef _WIN32_WCE @@ -4203,14 +4453,14 @@ bool SimonState::load_game(uint slot) { #endif f = fopen(gen_savename(slot), "rb"); - if (f==NULL) + if (f == NULL) return false; fread(ident, 1, 18, f); - + num = fileReadBE32(f); - if (fileReadBE32(f) != 0xFFFFFFFF || num != _itemarray_inited-1) { + if (fileReadBE32(f) != 0xFFFFFFFF || num != _itemarray_inited - 1) { fclose(f); return false; } @@ -4220,17 +4470,17 @@ bool SimonState::load_game(uint slot) { _no_parent_notify = true; - + /* add all timers */ killAllTimers(); - for(num = fileReadBE32(f);num;num--) { + for (num = fileReadBE32(f); num; num--) { uint32 timeout = fileReadBE32(f); uint16 func_to_call = fileReadBE16(f); addTimeEvent(timeout, func_to_call); } item_index = 1; - for(num=_itemarray_inited-1; num; num--) { + for (num = _itemarray_inited - 1; num; num--) { Item *item = _itemarray_ptr[item_index++], *parent_item; uint parent = fileReadBE16(f); @@ -4257,13 +4507,13 @@ bool SimonState::load_game(uint slot) { { Child2 *child2 = findChildOfType2(item); - uint i,j; + uint i, j; if (child2 != NULL) { child2->avail_props = fileReadBE32(f); - i = child2->avail_props&1; + i = child2->avail_props & 1; - for(j=1; j<16; j++) { - if ((1<<j) & child2->avail_props) { + for (j = 1; j < 16; j++) { + if ((1 << j) & child2->avail_props) { child2->array[i++] = fileReadBE16(f); } } @@ -4271,31 +4521,31 @@ bool SimonState::load_game(uint slot) { } { - Child9 *child9 = (Child9*)findChildOfType(item, 9); + Child9 *child9 = (Child9 *) findChildOfType(item, 9); if (child9) { uint i; - for(i=0; i!=4; i++) { + for (i = 0; i != 4; i++) { child9->array[i] = fileReadBE16(f); } } } } - + /* read the 255 variables */ - for(i=0; i!=255; i++) { + for (i = 0; i != 255; i++) { writeVariable(i, fileReadBE16(f)); } /* write the items in array 6 */ - for(i=0; i!=10; i++) { + for (i = 0; i != 10; i++) { _item_array_6[i] = derefItem(fileReadBE16(f)); } - /* Write the bits in array 1 & 2*/ - for(i=0; i!=32; i++) + /* Write the bits in array 1 & 2 */ + for (i = 0; i != 32; i++) _bit_array[i] = fileReadBE16(f); - + fclose(f); _no_parent_notify = false; @@ -4310,7 +4560,8 @@ bool SimonState::load_game(uint slot) { return true; } -void SimonState::initSound() { +void SimonState::initSound() +{ /* only read voice file in windows game */ if (_game & GAME_WIN) { const char *s = gss->wav_filename; @@ -4321,18 +4572,18 @@ void SimonState::initSound() { _voice_file = fopen_maybe_lowercase(s); if (_voice_file == NULL) { - warning("Cannot open voice file %s, trying %s",s,s2); + warning("Cannot open voice file %s, trying %s", s, s2); if (s2) { _voice_file = fopen_maybe_lowercase(s2); if (_voice_file == NULL) { - warning("Cannot open voice file %s",s2); + warning("Cannot open voice file %s", s2); return; } } else return; } - _voice_offsets = (uint32*)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32)); + _voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32)); if (_voice_offsets == NULL) error("Out of memory for voice offsets"); @@ -4344,7 +4595,7 @@ void SimonState::initSound() { if (_effects_file == NULL) return; - _effects_offsets = (uint32*)malloc(gss->NUM_EFFECTS_RESOURCES * sizeof(uint32)); + _effects_offsets = (uint32 *)malloc(gss->NUM_EFFECTS_RESOURCES * sizeof(uint32)); if (_effects_offsets == NULL) error("Out of memory for effects offsets"); @@ -4352,19 +4603,19 @@ void SimonState::initSound() { error("Cannot read effects offsets"); #if defined(SCUMM_BIG_ENDIAN) - for( int r = 0; r < gss->NUM_VOICE_RESOURCES; r++ ) - _voice_offsets[ r ] = READ_LE_UINT32( &_voice_offsets[ r ] ); + for (int r = 0; r < gss->NUM_VOICE_RESOURCES; r++) + _voice_offsets[r] = READ_LE_UINT32(&_voice_offsets[r]); if (_effects_offsets) - for( int r = 0; r < gss->NUM_EFFECTS_RESOURCES; r++ ) - _effects_offsets[ r ] = READ_LE_UINT32( &_effects_offsets[ r ] ); + for (int r = 0; r < gss->NUM_EFFECTS_RESOURCES; r++) + _effects_offsets[r] = READ_LE_UINT32(&_effects_offsets[r]); #endif } } #if !defined(__GNUC__) - #pragma START_PACK_STRUCTS -#endif +#pragma START_PACK_STRUCTS +#endif struct WaveHeader { uint32 riff; @@ -4372,7 +4623,7 @@ struct WaveHeader { uint32 wave; uint32 fmt; - uint32 size; + uint32 size; uint16 format_tag; uint16 channels; @@ -4384,113 +4635,115 @@ struct WaveHeader { } GCC_PACK; struct VocHeader { - uint8 desc[20]; - uint16 datablock_offset; - uint16 version; - uint16 id; - uint8 blocktype; + uint8 desc[20]; + uint16 datablock_offset; + uint16 version; + uint16 id; + uint8 blocktype; } GCC_PACK; struct VocBlockHeader { - uint8 tc; - uint8 pack; + uint8 tc; + uint8 pack; } GCC_PACK; #if !defined(__GNUC__) - #pragma END_PACK_STRUCTS -#endif +#pragma END_PACK_STRUCTS +#endif -void SimonState::playVoice(uint voice) { +void SimonState::playVoice(uint voice) +{ _mixer->stop(_voice_sound); fseek(_voice_file, _voice_offsets[voice], SEEK_SET); - if (!_effects_offsets) { /* WAVE audio */ + if (!_effects_offsets) { /* WAVE audio */ WaveHeader wave_hdr; - uint32 data[2]; - - if (fread(&wave_hdr, sizeof(wave_hdr), 1, _voice_file)!=1 || - wave_hdr.riff!=MKID('RIFF') || wave_hdr.wave!=MKID('WAVE') || wave_hdr.fmt!=MKID('fmt ') || - READ_LE_UINT16(&wave_hdr.format_tag)!=1 || READ_LE_UINT16(&wave_hdr.channels)!=1 || - READ_LE_UINT16(&wave_hdr.bits_per_sample)!=8) { - warning("playVoice(%d): cannot read RIFF header", voice); - return; + uint32 data[2]; + + if (fread(&wave_hdr, sizeof(wave_hdr), 1, _voice_file) != 1 || + wave_hdr.riff != MKID('RIFF') || wave_hdr.wave != MKID('WAVE') + || wave_hdr.fmt != MKID('fmt ') || READ_LE_UINT16(&wave_hdr.format_tag) != 1 + || READ_LE_UINT16(&wave_hdr.channels) != 1 + || READ_LE_UINT16(&wave_hdr.bits_per_sample) != 8) { + warning("playVoice(%d): cannot read RIFF header", voice); + return; } fseek(_voice_file, READ_LE_UINT32(&wave_hdr.size) - sizeof(wave_hdr) + 20, SEEK_CUR); data[0] = fileReadLE32(_voice_file); data[1] = fileReadLE32(_voice_file); - if (//fread(data, sizeof(data), 1, _voice_file) != 1 || - data[0] != 'atad' ) { - warning("playVoice(%d): cannot read data header",voice); - return; + if ( //fread(data, sizeof(data), 1, _voice_file) != 1 || + data[0] != 'atad') { + warning("playVoice(%d): cannot read data header", voice); + return; } - byte *buffer = (byte*)malloc(data[1]); + byte *buffer = (byte *)malloc(data[1]); fread(buffer, data[1], 1, _voice_file); - _mixer->play_raw(&_voice_sound, buffer, data[1], READ_LE_UINT32(&wave_hdr.samples_per_sec), SoundMixer::FLAG_UNSIGNED); - } else { /* VOC audio*/ + _mixer->play_raw(&_voice_sound, buffer, data[1], READ_LE_UINT32(&wave_hdr.samples_per_sec), + SoundMixer::FLAG_UNSIGNED); + } else { /* VOC audio */ VocHeader voc_hdr; VocBlockHeader voc_block_hdr; uint32 size; - if (fread(&voc_hdr, sizeof(voc_hdr), 1, _voice_file)!=1 || - strncmp((char *)voc_hdr.desc,"Creative Voice File\x1A",10)!=0) { - warning("playVoice(%d): cannot read voc header", voice); - return; + if (fread(&voc_hdr, sizeof(voc_hdr), 1, _voice_file) != 1 || + strncmp((char *)voc_hdr.desc, "Creative Voice File\x1A", 10) != 0) { + warning("playVoice(%d): cannot read voc header", voice); + return; } fread(&size, 4, 1, _voice_file); size = size & 0xffffff; fseek(_voice_file, -1, SEEK_CUR); fread(&voc_block_hdr, sizeof(voc_block_hdr), 1, _voice_file); - - uint32 samples_per_sec = 1000000L/(256L-(long)voc_block_hdr.tc); - byte *buffer = (byte*)malloc(size); + uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.tc); + + byte *buffer = (byte *)malloc(size); fread(buffer, size, 1, _voice_file); - _mixer->play_raw(&_voice_sound, buffer, size, samples_per_sec, - SoundMixer::FLAG_UNSIGNED); + _mixer->play_raw(&_voice_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED); } } -void SimonState::playSound(uint sound) { +void SimonState::playSound(uint sound) +{ if (_game & GAME_WIN) { - if (_effects_offsets) { /* VOC sound file */ + if (_effects_offsets) { /* VOC sound file */ VocHeader voc_hdr; VocBlockHeader voc_block_hdr; uint32 size; - _mixer->stop(_effects_sound); + _mixer->stop(_effects_sound); fseek(_effects_file, _effects_offsets[sound], SEEK_SET); - - if (fread(&voc_hdr, sizeof(voc_hdr), 1, _effects_file)!=1 || - strncmp((char *)voc_hdr.desc,"Creative Voice File\x1A",10)!=0) { - warning("playSound(%d): cannot read voc header", sound); - return; + + if (fread(&voc_hdr, sizeof(voc_hdr), 1, _effects_file) != 1 || + strncmp((char *)voc_hdr.desc, "Creative Voice File\x1A", 10) != 0) { + warning("playSound(%d): cannot read voc header", sound); + return; } fread(&size, 4, 1, _effects_file); size = size & 0xffffff; fseek(_effects_file, -1, SEEK_CUR); fread(&voc_block_hdr, sizeof(voc_block_hdr), 1, _effects_file); - - uint32 samples_per_sec = 1000000L/(256L-(long)voc_block_hdr.tc); - - byte *buffer = (byte*)malloc(size); + + uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.tc); + + byte *buffer = (byte *)malloc(size); fread(buffer, size, 1, _effects_file); - _mixer->play_raw(&_effects_sound, buffer, size, samples_per_sec, - SoundMixer::FLAG_UNSIGNED); + _mixer->play_raw(&_effects_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED); } else { byte *p; - + _mixer->stop(_playing_sound); /* Check if _sfx_heap is NULL */ @@ -4498,44 +4751,46 @@ void SimonState::playSound(uint sound) { warning("playSound(%d) cannot play. No voice file loaded", sound); return; } - - p = _sfx_heap + READ_LE_UINT32(&((uint32*)_sfx_heap)[sound]); - for(;;) { - p = (byte*)memchr(p, 'd', 1000); + p = _sfx_heap + READ_LE_UINT32(&((uint32 *)_sfx_heap)[sound]); + + for (;;) { + p = (byte *)memchr(p, 'd', 1000); if (!p) { error("playSound(%d): didn't find", sound); return; } - if (p[1]=='a' && p[2]=='t' && p[3]=='a') + if (p[1] == 'a' && p[2] == 't' && p[3] == 'a') break; p++; } - _mixer->play_raw(&_playing_sound, p+8,READ_LE_UINT32(p+4),22050,SoundMixer::FLAG_UNSIGNED); + _mixer->play_raw(&_playing_sound, p + 8, READ_LE_UINT32(p + 4), 22050, + SoundMixer::FLAG_UNSIGNED); } } else { warning("playSound(%d)", sound); } } -void SimonState::playMusic(uint music) { +void SimonState::playMusic(uint music) +{ FILE *f; midi.shutdown(); /* FIXME: not properly implemented */ if (_game & GAME_WIN) { - fseek(_game_file, _game_offsets_ptr[gss->MUSIC_INDEX_BASE + music] - 1,SEEK_SET); + fseek(_game_file, _game_offsets_ptr[gss->MUSIC_INDEX_BASE + music] - 1, SEEK_SET); f = _game_file; - + midi.read_all_songs(f); } else { char buf[50]; sprintf(buf, "MOD%d.MUS", music); f = fopen_maybe_lowercase(buf); - if (f==NULL) { + if (f == NULL) { warning("Cannot load music from '%s'", buf); return; } @@ -4547,27 +4802,33 @@ void SimonState::playMusic(uint music) { midi.play(); } -byte *SimonState::dx_lock_2() { +byte *SimonState::dx_lock_2() +{ _dx_surface_pitch = 320; return sdl_buf; } -void SimonState::dx_unlock_2() { +void SimonState::dx_unlock_2() +{ } -byte *SimonState::dx_lock_attached() { +byte *SimonState::dx_lock_attached() +{ _dx_surface_pitch = 320; return _dx_use_3_or_4_for_lock ? sdl_buf_3 : sdl_buf_attached; } -void SimonState::dx_unlock_attached() { +void SimonState::dx_unlock_attached() +{ } -void SimonState::set_volume(byte volume) { +void SimonState::set_volume(byte volume) +{ _mixer->set_volume(volume * 256 / 100); } -byte SimonState::getByte() { +byte SimonState::getByte() +{ return *_code_ptr++; } diff --git a/simon/simon.h b/simon/simon.h index 68f0688726..5d3d5ce4c7 100644 --- a/simon/simon.h +++ b/simon/simon.h @@ -73,7 +73,7 @@ struct Child1 { struct Child9 { Child hdr; - + uint16 array[4]; }; @@ -86,7 +86,7 @@ struct ThreeValues { }; enum { - CHILD1_SIZE = sizeof(Child1) - sizeof(uint16), + CHILD1_SIZE = sizeof(Child1) - sizeof(uint16), CHILD2_SIZE = sizeof(Child2) - sizeof(int16) }; @@ -96,16 +96,16 @@ struct Item { uint16 sibling; int16 unk1; int16 unk2; - int16 unk3; /* signed int */ + int16 unk3; /* signed int */ uint16 unk4; - uint16 xxx_1; /* unused? */ + uint16 xxx_1; /* unused? */ Child *children; }; struct Subroutine { - uint16 id; /* subroutine ID */ - uint16 first; /* offset from subroutine start to first subroutine line */ - Subroutine *next; /* next subroutine in linked list */ + uint16 id; /* subroutine ID */ + uint16 first; /* offset from subroutine start to first subroutine line */ + Subroutine *next; /* next subroutine in linked list */ }; struct FillOrCopyDataEntry { @@ -126,7 +126,7 @@ struct FillOrCopyStruct { byte mode; byte flags; uint16 x, y; - uint16 width,height; + uint16 width, height; uint16 unk1, unk2; uint8 unk3, unk6, unk7, fill_color, text_color, unk5; FillOrCopyData *fcs_data; @@ -172,8 +172,8 @@ struct VgaSprite { uint16 id; uint16 image; uint16 base_color; - uint16 x,y; /* actually signed numbers */ - uint16 unk4,unk5,unk6,unk7; + uint16 x, y; /* actually signed numbers */ + uint16 unk4, unk5, unk6, unk7; }; struct VgaSleepStruct { @@ -223,10 +223,10 @@ struct VgaFile1Struct0x6 { /* dummy typedefs to make it compile in *nix */ #if defined(UNIX) || defined(UNIX_X11) || defined(__MORPHOS__) || defined(__DC__) || defined(macintosh) -typedef void* HMIDISTRM; -typedef void* HMIDIOUT; +typedef void *HMIDISTRM; +typedef void *HMIDIOUT; typedef uint32 UINT; -typedef void* MIDIHDR; +typedef void *MIDIHDR; typedef uint32 MMRESULT; #define CALLBACK typedef uint32 DWORD; @@ -252,7 +252,7 @@ public: void shutdown(); void play(); void set_driver(MidiDriver *md); - + private: struct Track { uint32 a; @@ -293,7 +293,7 @@ private: uint _midi_var11; uint32 _midi_tempo; - + Track *_midi_tick_track_ptr; Track *_midi_track_ptr; int16 _midi_song_id; @@ -356,7 +356,7 @@ public: char *_game_path; - byte *_vc_ptr; /* video code ptr */ + byte *_vc_ptr; /* video code ptr */ uint32 *_game_offsets_ptr; @@ -400,13 +400,13 @@ public: byte *_tbl_list; byte *_code_ptr; - + byte **_local_stringtable; uint _string_id_local_min, _string_id_local_max; byte *_tablesheap_ptr, *_tablesheap_ptr_org, *_tablesheap_ptr_new; - uint _tablesheap_size,_tablesheap_curpos,_tablesheap_curpos_org; + uint _tablesheap_size, _tablesheap_curpos, _tablesheap_curpos_org; uint _tablesheap_curpos_new; Subroutine *_subroutine_list, *_subroutine_list_org; @@ -443,7 +443,7 @@ public: bool _vga_var9; int16 _script_unk_1; bool _vga_var6; - int _x_scroll,_vga_var1,_vga_var2,_vga_var3,_vga_var5; + int _x_scroll, _vga_var1, _vga_var2, _vga_var3, _vga_var5; byte _vga_var8; uint16 _vc72_var1, _vc72_var2, _vc72_var3; @@ -463,8 +463,8 @@ public: Item *_hitarea_object_item; HitArea *_last_hitarea; - HitArea*_last_hitarea_2_ptr; - HitArea*_last_hitarea_3; + HitArea *_last_hitarea_2_ptr; + HitArea *_last_hitarea_3; byte _left_button_down; Item *_hitarea_subject_item; HitArea *_hitarea_ptr_5, *_hitarea_ptr_7; @@ -516,7 +516,7 @@ public: uint _vga_sprite_changed; - + byte *_vga_buf_free_start, *_vga_buf_end, *_vga_buf_start; byte *_vga_file_buf_org, *_vga_file_buf_org_2; @@ -532,7 +532,7 @@ public: uint16 _vga_cur_sprite_id; VgaTimerEntry *_next_vga_timer_to_process; - + Item *_vc_item_array[20]; Item *_item_array_6[20]; @@ -559,7 +559,7 @@ public: HitArea _hit_areas[90]; VgaPointersEntry _vga_buffer_pointers[180]; - VgaSprite _vga_sprites[180]; + VgaSprite _vga_sprites[180]; VgaSleepStruct _vga_sleep_structs[30]; uint16 *_pathfind_array[20]; @@ -642,7 +642,9 @@ public: Item *getNextItemPtr(); uint getNextItemID(); - uint getItem1ID() { return 1; } + uint getItem1ID() { + return 1; + } Item *getItem1Ptr(); Item *getItemPtrB(); @@ -698,12 +700,12 @@ public: void set_hitarea_x_y(uint hitarea, int x, int y); bool is_hitarea_0x40_clear(uint hitarea); void delete_hitarea(uint hitarea); - void addNewHitArea(int id, int x, int y, int width, int height, - int flags, int unk3,Item *item_ptr); + void addNewHitArea(int id, int x, int y, int width, int height, + int flags, int unk3, Item *item_ptr); HitArea *findEmptyHitArea(); void hitarea_proc_1(); - void handle_verb_hitarea(HitArea *ha); - void hitarea_leave(HitArea *ha); + void handle_verb_hitarea(HitArea * ha); + void hitarea_leave(HitArea * ha); void leaveHitAreaById(uint hitarea_id); void o_unk_114(); @@ -716,13 +718,13 @@ public: void o_unk_137(uint a); void o_unk_138(); void killAllTimers(); - + uint getOffsetOfChild2Param(Child2 *child, uint prop); void o_unk_160(uint a); void o_unk_163(uint a); void o_unk_175(); void o_unk_176(); - void o_pathfind(int x,int y,uint var_1,uint var_2); + void o_pathfind(int x, int y, uint var_1, uint var_2); void o_unk_179(); void o_force_unlock(); void o_force_lock(); @@ -775,14 +777,14 @@ public: void showActionString(uint x, const byte *string); void video_putchar(FillOrCopyStruct *fcs, byte c); void video_fill_or_copy_from_3_to_2(FillOrCopyStruct *fcs); - void video_toggle_colors(HitArea *ha, byte a, byte b, byte c, byte d); + void video_toggle_colors(HitArea * ha, byte a, byte b, byte c, byte d); void read_vga_from_datfile_1(uint vga_id); uint get_fcs_ptr_3_index(FillOrCopyStruct *fcs); void setup_hitarea_from_pos(uint x, uint y, uint mode); - void new_current_hitarea(HitArea *ha); + void new_current_hitarea(HitArea * ha); bool hitarea_proc_2(uint a); bool hitarea_proc_3(Item *item); void hitarea_stuff(); @@ -795,7 +797,7 @@ public: void draw_icon_c(FillOrCopyStruct *fcs, uint icon, uint x, uint y); bool has_item_childflag_0x10(Item *item); uint item_get_icon_number(Item *item); - uint setup_icon_hit_area(FillOrCopyStruct *fcs,uint x, uint y, uint icon_number, Item *item_ptr); + uint setup_icon_hit_area(FillOrCopyStruct *fcs, uint x, uint y, uint icon_number, Item *item_ptr); void fcs_unk_proc_2(FillOrCopyStruct *fcs, uint fcs_index); void loadIconFile(); @@ -814,7 +816,7 @@ public: void o_set_video_mode(uint mode, uint vga_res); void set_video_mode(uint a, uint b); void set_video_mode_internal(uint mode, uint vga_res_id); - + void ensureVgaResLoadedC(uint vga_res); void ensureVgaResLoaded(uint vga_res); @@ -822,8 +824,9 @@ public: void o_unk26_helper(uint a, uint b, uint c, uint d, uint e, uint f, uint g, uint h); void talk_with_speech(uint speech_id, uint num_1); void talk_with_text(uint num_1, uint num_2, const char *string_ptr, uint a, int b, uint c); - FillOrCopyStruct *fcs_alloc(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint unk4); - + FillOrCopyStruct *fcs_alloc(uint x, uint y, uint w, uint h, uint flags, uint fill_color, + uint unk4); + void render_string(uint num_1, uint color, uint width, uint height, const char *txt); void setup_hit_areas(FillOrCopyStruct *fcs, uint fcs_index); @@ -831,7 +834,7 @@ public: byte *setup_vga_destination(uint32 size); void vga_buf_unk_proc3(byte *end); void vga_buf_unk_proc1(byte *end); - void vga_buf_unk_proc2(uint a,byte *end); + void vga_buf_unk_proc2(uint a, byte *end); void delete_memptr_range(byte *end); void setup_vga_file_buf_pointers(); @@ -917,7 +920,7 @@ public: void vc_73(); void vc_74(); - void delete_vga_timer(VgaTimerEntry *vte); + 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(); uint vc_read_next_word(); @@ -999,7 +1002,7 @@ public: byte *vc_10_depack_swap(byte *src, uint w, uint h); - + Item *getNextItemPtrStrange(); bool save_game(uint slot, const char *caption); @@ -1051,93 +1054,91 @@ public: char *gen_savename(int slot); }; - + void NORETURN CDECL error(const char *errmsg, ...); void CDECL warning(const char *errmsg, ...); -void _2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height); -int Init_2xSaI (uint32 BitFormat); -void Super2xSaI (uint8 *srcPtr, uint32 srcPitch, - uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, - int width, int height); +void _2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, + int width, int height); +int Init_2xSaI(uint32 BitFormat); +void Super2xSaI(uint8 *srcPtr, uint32 srcPitch, + uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height); void initializeHardware(); void dx_set_palette(uint32 *colors, uint num); -void palette_fadeout(uint32 *pal_values,uint num); +void palette_fadeout(uint32 *pal_values, uint num); static const GameSpecificSettings simon1_settings = { - 1, /* VGA_DELAY_BASE */ - 1576/4, /* TABLE_INDEX_BASE */ - 1460/4, /* TEXT_INDEX_BASE */ - 1700/4, /* NUM_GAME_OFFSETS */ - 64, /* NUM_VIDEO_OP_CODES */ - 1000000, /* VGA_MEM_SIZE */ - 50000, /* TABLES_MEM_SIZE */ - 3624, /* NUM_VOICE_RESOURCES */ - 141, /* NUM_EFFECT_RESOURCES */ - 1316/4, /* MUSIC_INDEX_BASE */ - 0, /* SOUND_INDEX_BASE */ - "SIMON.GME", /* gme_filename */ - "SIMON.WAV", /* wav_filename */ - "SIMON.VOC", /* wav_filename2 */ - "EFFECTS.VOC", /* effects_filename */ - "GAMEPC", /* gamepc_filename */ + 1, /* VGA_DELAY_BASE */ + 1576 / 4, /* TABLE_INDEX_BASE */ + 1460 / 4, /* TEXT_INDEX_BASE */ + 1700 / 4, /* NUM_GAME_OFFSETS */ + 64, /* NUM_VIDEO_OP_CODES */ + 1000000, /* VGA_MEM_SIZE */ + 50000, /* TABLES_MEM_SIZE */ + 3624, /* NUM_VOICE_RESOURCES */ + 141, /* NUM_EFFECT_RESOURCES */ + 1316 / 4, /* MUSIC_INDEX_BASE */ + 0, /* SOUND_INDEX_BASE */ + "SIMON.GME", /* gme_filename */ + "SIMON.WAV", /* wav_filename */ + "SIMON.VOC", /* wav_filename2 */ + "EFFECTS.VOC", /* effects_filename */ + "GAMEPC", /* gamepc_filename */ }; static const GameSpecificSettings simon2_settings = { - 5, /* VGA_DELAY_BASE */ - 1580/4, /* TABLE_INDEX_BASE */ - 1500/4, /* TEXT_INDEX_BASE */ - 2116/4, /* NUM_GAME_OFFSETS */ - 75, /* NUM_VIDEO_OP_CODES */ - 2000000, /* VGA_MEM_SIZE */ - 100000, /* TABLES_MEM_SIZE */ - 12256, /* NUM_VOICE_RESOURCES */ + 5, /* VGA_DELAY_BASE */ + 1580 / 4, /* TABLE_INDEX_BASE */ + 1500 / 4, /* TEXT_INDEX_BASE */ + 2116 / 4, /* NUM_GAME_OFFSETS */ + 75, /* NUM_VIDEO_OP_CODES */ + 2000000, /* VGA_MEM_SIZE */ + 100000, /* TABLES_MEM_SIZE */ + 12256, /* NUM_VOICE_RESOURCES */ 0, - 1128/4, /* MUSIC_INDEX_BASE */ - 1660/4, /* SOUND_INDEX_BASE */ - "SIMON2.GME", /* gme_filename */ - "SIMON2.WAV", /* wav_filename */ + 1128 / 4, /* MUSIC_INDEX_BASE */ + 1660 / 4, /* SOUND_INDEX_BASE */ + "SIMON2.GME", /* gme_filename */ + "SIMON2.WAV", /* wav_filename */ NULL, "", - "GSPTR30", /* gamepc_filename */ + "GSPTR30", /* gamepc_filename */ }; static const GameSpecificSettings simon2win_settings = { - 5, /* VGA_DELAY_BASE */ - 1580/4, /* TABLE_INDEX_BASE */ - 1500/4, /* TEXT_INDEX_BASE */ - 2116/4, /* NUM_GAME_OFFSETS */ - 75, /* NUM_VIDEO_OP_CODES */ - 2000000, /* VGA_MEM_SIZE */ - 100000, /* TABLES_MEM_SIZE */ - 12256, /* NUM_VOICE_RESOURCES */ + 5, /* VGA_DELAY_BASE */ + 1580 / 4, /* TABLE_INDEX_BASE */ + 1500 / 4, /* TEXT_INDEX_BASE */ + 2116 / 4, /* NUM_GAME_OFFSETS */ + 75, /* NUM_VIDEO_OP_CODES */ + 2000000, /* VGA_MEM_SIZE */ + 100000, /* TABLES_MEM_SIZE */ + 12256, /* NUM_VOICE_RESOURCES */ 0, - 1128/4, /* MUSIC_INDEX_BASE */ - 1660/4, /* SOUND_INDEX_BASE */ - "SIMON2.GME", /* gme_filename */ - "SIMON2.WAV", /* wav_filename */ + 1128 / 4, /* MUSIC_INDEX_BASE */ + 1660 / 4, /* SOUND_INDEX_BASE */ + "SIMON2.GME", /* gme_filename */ + "SIMON2.WAV", /* wav_filename */ NULL, "", - "GSPTR30", /* gamepc_filename */ + "GSPTR30", /* gamepc_filename */ }; static const GameSpecificSettings simon2dos_settings = { - 5, /* VGA_DELAY_BASE */ - 1580/4, /* TABLE_INDEX_BASE */ - 1500/4, /* TEXT_INDEX_BASE */ - 2116/4, /* NUM_GAME_OFFSETS */ - 75, /* NUM_VIDEO_OP_CODES */ - 2000000, /* VGA_MEM_SIZE */ - 100000, /* TABLES_MEM_SIZE */ - 12256, /* NUM_VOICE_RESOURCES */ + 5, /* VGA_DELAY_BASE */ + 1580 / 4, /* TABLE_INDEX_BASE */ + 1500 / 4, /* TEXT_INDEX_BASE */ + 2116 / 4, /* NUM_GAME_OFFSETS */ + 75, /* NUM_VIDEO_OP_CODES */ + 2000000, /* VGA_MEM_SIZE */ + 100000, /* TABLES_MEM_SIZE */ + 12256, /* NUM_VOICE_RESOURCES */ 0, - 1128/4, /* MUSIC_INDEX_BASE */ - 1660/4, /* SOUND_INDEX_BASE */ - "SIMON2.GME", /* gme_filename */ - "SIMON2.WAV", /* wav_filename */ + 1128 / 4, /* MUSIC_INDEX_BASE */ + 1660 / 4, /* SOUND_INDEX_BASE */ + "SIMON2.GME", /* gme_filename */ + "SIMON2.WAV", /* wav_filename */ NULL, "", - "GAME32", /* gamepc_filename */ + "GAME32", /* gamepc_filename */ }; - - diff --git a/simon/simondebug.cpp b/simon/simondebug.cpp index 386fd636ad..a4aa8cba78 100644 --- a/simon/simondebug.cpp +++ b/simon/simondebug.cpp @@ -27,7 +27,7 @@ #define SIMON2 #define SIMON2WIN -static const char * const opcode_name_table[256] = { +static const char *const opcode_name_table[256] = { /* 0 */ "|INV_COND", "IJ|PTRA_PARENT_IS", @@ -205,7 +205,7 @@ static const char * const opcode_name_table[256] = { "W|GET_DUMMY_WORD", "W|GET_WORD_COND_TRUE", "Bww|UNK131", - NULL, /* opcode 131 doesn't exist */ + NULL, /* opcode 131 doesn't exist */ /* 132 */ "|SAVE_GAME", "|LOAD_GAME", @@ -289,8 +289,9 @@ static const char * const opcode_name_table[256] = { #endif }; -byte *SimonState::dumpOpcode(byte *p) { - byte opcode; +byte *SimonState::dumpOpcode(byte *p) +{ + byte opcode; const char *s, *st; opcode = *p++; @@ -301,124 +302,132 @@ byte *SimonState::dumpOpcode(byte *p) { error("INVALID OPCODE %d\n", opcode); return NULL; } - while (*st != '|') st++; - fprintf(_dump_file,"%s ", st+1); + while (*st != '|') + st++; + fprintf(_dump_file, "%s ", st + 1); - for(;;) { - switch(*s++) { + for (;;) { + switch (*s++) { case 'x': - fprintf(_dump_file,"\n"); + fprintf(_dump_file, "\n"); return NULL; case '|': - fprintf(_dump_file,"\n"); + fprintf(_dump_file, "\n"); return p; - case 'B': { - byte b = *p++; - if (b==255) - fprintf(_dump_file,"[%d] ", *p++); - else - fprintf(_dump_file,"%d ", b); - break; - } - case 'V': { - byte b = *p++; - if (b==255) - fprintf(_dump_file,"[[%d]] ", *p++); - else - fprintf(_dump_file,"[%d] ", b); - break; - } + case 'B':{ + byte b = *p++; + if (b == 255) + fprintf(_dump_file, "[%d] ", *p++); + else + fprintf(_dump_file, "%d ", b); + break; + } + case 'V':{ + byte b = *p++; + if (b == 255) + fprintf(_dump_file, "[[%d]] ", *p++); + else + fprintf(_dump_file, "[%d] ", b); + break; + } - case 'W': { - int n = (int16)((p[0]<<8)|p[1]); - p+=2; - if (n>=30000 && n<30512) - fprintf(_dump_file,"[%d] ", n - 30000); - else - fprintf(_dump_file,"%d ", n); - break; - } + case 'W':{ + int n = (int16)((p[0] << 8) | p[1]); + p += 2; + if (n >= 30000 && n < 30512) + fprintf(_dump_file, "[%d] ", n - 30000); + else + fprintf(_dump_file, "%d ", n); + break; + } + + case 'w':{ + int n = (int16)((p[0] << 8) | p[1]); + p += 2; + fprintf(_dump_file, "%d ", n); + break; + } - case 'w': { - int n = (int16)((p[0]<<8)|p[1]); - p+=2; - fprintf(_dump_file,"%d ", n); + case 'I':{ + int n = (int16)((p[0] << 8) | p[1]);; + p += 2; + if (n == -1) + fprintf(_dump_file, "ITEM_M1 "); + else if (n == -3) + fprintf(_dump_file, "ITEM_M3 "); + else if (n == -5) + fprintf(_dump_file, "ITEM_1 "); + else if (n == -7) + fprintf(_dump_file, "ITEM_0 "); + else if (n == -9) + fprintf(_dump_file, "ITEM_A_PARENT "); + else + fprintf(_dump_file, "<%d> ", n); + break; + } + case 'J':{ + fprintf(_dump_file, "-> "); + } break; - } - case 'I': { - int n = (int16)((p[0]<<8)|p[1]);; - p+=2; - if (n == -1) - fprintf(_dump_file,"ITEM_M1 "); - else if (n == -3) - fprintf(_dump_file,"ITEM_M3 "); - else if (n == -5) - fprintf(_dump_file,"ITEM_1 "); - else if (n == -7) - fprintf(_dump_file,"ITEM_0 "); - else if (n == -9) - fprintf(_dump_file,"ITEM_A_PARENT "); - else - fprintf(_dump_file,"<%d> ", n); + + case 'T':{ + uint n = ((p[0] << 8) | p[1]); + p += 2; + if (n != 0xFFFF) + fprintf(_dump_file, "\"%s\"(%d) ", getStringPtrByID(n), n); + else + fprintf(_dump_file, "NULL_STRING "); + } break; } - case 'J': { - fprintf(_dump_file,"-> "); - } break; - - - case 'T': { - uint n = ((p[0]<<8)|p[1]); - p+=2; - if (n != 0xFFFF) - fprintf(_dump_file,"\"%s\"(%d) ", getStringPtrByID(n), n); - else - fprintf(_dump_file,"NULL_STRING "); - } break; - } } } -void SimonState::dumpSubroutineLine(SubroutineLine *sl, Subroutine *sub) { +void SimonState::dumpSubroutineLine(SubroutineLine *sl, Subroutine *sub) +{ byte *p; - - + + printf("; ****\n"); - p = (byte*)sl + SUBROUTINE_LINE_SMALL_SIZE; + p = (byte *)sl + SUBROUTINE_LINE_SMALL_SIZE; if (sub->id == 0) { - fprintf(_dump_file,"; cond_a=%d, cond_b=%d, cond_c=%d\n", sl->cond_a, sl->cond_b, sl->cond_c); - p = (byte*)sl + SUBROUTINE_LINE_BIG_SIZE; + fprintf(_dump_file, "; cond_a=%d, cond_b=%d, cond_c=%d\n", sl->cond_a, sl->cond_b, sl->cond_c); + p = (byte *)sl + SUBROUTINE_LINE_BIG_SIZE; } - for(;;) { + for (;;) { p = dumpOpcode(p); - if (p==NULL) + if (p == NULL) break; } } -void SimonState::dumpSubroutine(Subroutine *sub) { +void SimonState::dumpSubroutine(Subroutine *sub) +{ SubroutineLine *sl; - fprintf(_dump_file,"\n******************************************\n;Subroutine, ID=%d:\nSUB_%d:\n", sub->id, sub->id); - sl = (SubroutineLine*) ((byte*)sub + sub->first); - for(;(byte*)sl != (byte*)sub; sl = (SubroutineLine*) ((byte*)sub + sl->next) ) { + fprintf(_dump_file, + "\n******************************************\n;Subroutine, ID=%d:\nSUB_%d:\n", sub->id, + sub->id); + sl = (SubroutineLine *)((byte *)sub + sub->first); + for (; (byte *)sl != (byte *)sub; sl = (SubroutineLine *)((byte *)sub + sl->next)) { dumpSubroutineLine(sl, sub); } - fprintf(_dump_file,"\nEND ******************************************\n"); + fprintf(_dump_file, "\nEND ******************************************\n"); fflush(_dump_file); } -void SimonState::dumpSubroutines() { +void SimonState::dumpSubroutines() +{ Subroutine *sub = _subroutine_list; - for(;sub;sub = sub->next) { + for (; sub; sub = sub->next) { dumpSubroutine(sub); } } -const char * const video_opcode_name_table[] = { +const char *const video_opcode_name_table[] = { /* 0 */ "x|RET", "ddd|DUMMY", @@ -483,7 +492,7 @@ const char * const video_opcode_name_table[] = { "vd|SLEEP_UNTIL_SET", "d|SKIP_IF_BIT_CLEAR", /* 44 */ - "d|SKIP_IF_BIT_SET", + "d|SKIP_IF_BIT_SET", "v|SET_X_F", "v|SET_Y_F", "vv|ADD_VAR_F", @@ -537,14 +546,15 @@ const char * const video_opcode_name_table[] = { #endif }; -void SimonState::dump_video_script(byte *src, bool one_opcode_only) { +void SimonState::dump_video_script(byte *src, bool one_opcode_only) +{ uint opcode; const char *str, *strn; do { if (!(_game & GAME_SIMON2)) { opcode = READ_BE_UINT16_UNALIGNED(src); - src+=2; + src += 2; } else { opcode = *src++; } @@ -555,19 +565,34 @@ void SimonState::dump_video_script(byte *src, bool one_opcode_only) { } strn = str = video_opcode_name_table[opcode]; - while (*strn != '|') strn++; - fprintf(_dump_file,"%.2d: %s ", opcode, strn + 1); - - for (;*str != '|';str++) { - switch(*str) { - case 'x': fprintf(_dump_file,"\n"); return; - case 'b': fprintf(_dump_file,"%d ", *src++); break; - case 'd': fprintf(_dump_file,"%d ", READ_BE_UINT16_UNALIGNED(src)); src+=2; break; - case 'v': fprintf(_dump_file,"[%d] ", READ_BE_UINT16_UNALIGNED(src)); src+=2; break; - case 'i': fprintf(_dump_file,"%d ", (int16)READ_BE_UINT16_UNALIGNED(src)); src+=2; break; - case 'q': + while (*strn != '|') + strn++; + fprintf(_dump_file, "%.2d: %s ", opcode, strn + 1); + + for (; *str != '|'; str++) { + switch (*str) { + case 'x': + fprintf(_dump_file, "\n"); + return; + case 'b': + fprintf(_dump_file, "%d ", *src++); + break; + case 'd': + fprintf(_dump_file, "%d ", READ_BE_UINT16_UNALIGNED(src)); + src += 2; + break; + case 'v': + fprintf(_dump_file, "[%d] ", READ_BE_UINT16_UNALIGNED(src)); + src += 2; + break; + case 'i': + fprintf(_dump_file, "%d ", (int16)READ_BE_UINT16_UNALIGNED(src)); + src += 2; + break; + case 'q': while (READ_BE_UINT16_UNALIGNED(src) != 999) { - fprintf(_dump_file,"(%d,%d) ", READ_BE_UINT16_UNALIGNED(src), READ_BE_UINT16_UNALIGNED(src+2)); + fprintf(_dump_file, "(%d,%d) ", READ_BE_UINT16_UNALIGNED(src), + READ_BE_UINT16_UNALIGNED(src + 2)); src += 4; } src++; @@ -577,24 +602,27 @@ void SimonState::dump_video_script(byte *src, bool one_opcode_only) { } } - fprintf(_dump_file,"\n"); - } while(!one_opcode_only); + fprintf(_dump_file, "\n"); + } while (!one_opcode_only); } -void SimonState::dump_vga_file(byte *vga) { +void SimonState::dump_vga_file(byte *vga) +{ { byte *pp; byte *p; int count; pp = vga; - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)pp)->hdr2_start); - count = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)p)->id_count); - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)p)->id_table); + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) pp)->hdr2_start); + count = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) p)->id_count); + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) p)->id_table); while (--count >= 0) { - int id = READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->id); + int id = READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->id); - dump_vga_script_always(vga + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs), id/100, id); + dump_vga_script_always(vga + + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->script_offs), + id / 100, id); p += sizeof(VgaFile1Struct0x6); } } @@ -604,14 +632,16 @@ void SimonState::dump_vga_file(byte *vga) { int c; bb = vga; - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)bb)->hdr2_start); - c = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)b)->unk1); - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)b)->unk2_offs); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) bb)->hdr2_start); + c = READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) b)->unk1); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) b)->unk2_offs); while (--c >= 0) { - int id = READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->id); + int id = READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->id); - dump_vga_script_always(vga + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->script_offs), id/100, id); + dump_vga_script_always(vga + + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->script_offs), + id / 100, id); b += sizeof(VgaFile1Struct0x8); } } @@ -620,24 +650,26 @@ void SimonState::dump_vga_file(byte *vga) { const byte bmp_hdr[] = { -0x42,0x4D, -0x9E,0x14,0x00,0x00, /* offset 2, file size */ -0x00,0x00,0x00,0x00, -0x36,0x04,0x00,0x00, -0x28,0x00,0x00,0x00, - -0x3C,0x00,0x00,0x00, /* image width */ -0x46,0x00,0x00,0x00, /* image height */ -0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, - -0x00,0x01,0x00,0x00, -0x00,0x01,0x00,0x00, + 0x42, 0x4D, + 0x9E, 0x14, 0x00, 0x00, /* offset 2, file size */ + 0x00, 0x00, 0x00, 0x00, + 0x36, 0x04, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, + + 0x3C, 0x00, 0x00, 0x00, /* image width */ + 0x46, 0x00, 0x00, 0x00, /* image height */ + 0x01, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, }; -void dump_bmp(const char *filename, int w, int h, const byte *bytes, const uint32 *palette) { +void dump_bmp(const char *filename, int w, int h, const byte *bytes, const uint32 *palette) +{ FILE *out = fopen(filename, "wb"); byte my_hdr[sizeof(bmp_hdr)]; int i; @@ -649,14 +681,14 @@ void dump_bmp(const char *filename, int w, int h, const byte *bytes, const uint3 memcpy(my_hdr, bmp_hdr, sizeof(bmp_hdr)); - *(uint32*)(my_hdr + 2) = w*h + 1024 + sizeof(bmp_hdr); - *(uint32*)(my_hdr + 18) = w; - *(uint32*)(my_hdr + 22) = h; + *(uint32 *)(my_hdr + 2) = w * h + 1024 + sizeof(bmp_hdr); + *(uint32 *)(my_hdr + 18) = w; + *(uint32 *)(my_hdr + 22) = h; + - fwrite(my_hdr, 1, sizeof(my_hdr), out); - - for(i=0; i!=256; i++,palette++) { + + for (i = 0; i != 256; i++, palette++) { byte color[4]; color[0] = (byte)(*palette >> 16); color[1] = (byte)(*palette >> 8); @@ -666,16 +698,18 @@ void dump_bmp(const char *filename, int w, int h, const byte *bytes, const uint3 } while (--h >= 0) { - fwrite(bytes + h * ((w+3)&~3), ((w+3)&~3), 1, out); + fwrite(bytes + h * ((w + 3) & ~3), ((w + 3) & ~3), 1, out); } fclose(out); } -void dump_bitmap(const char *filename, byte *offs, int w, int h, int flags, const byte *palette, byte base) { +void dump_bitmap(const char *filename, byte *offs, int w, int h, int flags, const byte *palette, + byte base) +{ /* allocate */ - byte *b = (byte*)malloc(w*h); - int i,j; + byte *b = (byte *)malloc(w * h); + int i, j; VC10_state state; @@ -684,21 +718,22 @@ void dump_bitmap(const char *filename, byte *offs, int w, int h, int flags, cons state.dh = h; state.y_skip = 0; - for(i=0; i!=w; i+=2) { + for (i = 0; i != w; i += 2) { byte *c = vc_10_depack_column(&state); - for(j=0;j!=h;j++) { + for (j = 0; j != h; j++) { byte pix = c[j]; - b[j*w+i] = (pix>>4)|base; - b[j*w+i+1] = (pix&0xF)|base; + b[j * w + i] = (pix >> 4) | base; + b[j * w + i + 1] = (pix & 0xF) | base; } } - dump_bmp(filename, w, h, b, (uint32*)palette); + dump_bmp(filename, w, h, b, (uint32 *)palette); free(b); } -void SimonState::dump_single_bitmap(int file, int image, byte *offs, int w, int h, byte base) { +void SimonState::dump_single_bitmap(int file, int image, byte *offs, int w, int h, byte base) +{ /* Only supported for win32 atm. mkdir doesn't work otherwise. */ #if defined (WIN32) && !defined(_WIN32_WCE) char buf[255], buf2[255]; @@ -716,15 +751,17 @@ void SimonState::dump_single_bitmap(int file, int image, byte *offs, int w, int #endif } -void SimonState::dump_vga_script_always(byte *ptr, uint res, uint sprite_id) { - fprintf(_dump_file,"; address=%x, vgafile=%d vgasprite=%d\n", - ptr - _vga_buffer_pointers[res].vgaFile1, res, sprite_id); +void SimonState::dump_vga_script_always(byte *ptr, uint res, uint sprite_id) +{ + fprintf(_dump_file, "; address=%x, vgafile=%d vgasprite=%d\n", + ptr - _vga_buffer_pointers[res].vgaFile1, res, sprite_id); dump_video_script(ptr, false); - fprintf(_dump_file,"; end\n"); + fprintf(_dump_file, "; end\n"); } -void SimonState::dump_vga_script(byte *ptr, uint res, uint sprite_id) { - dump_Vga_script_always(ptr,res,sprite_id); +void SimonState::dump_vga_script(byte *ptr, uint res, uint sprite_id) +{ + dump_Vga_script_always(ptr, res, sprite_id); } diff --git a/simon/simonitems.cpp b/simon/simonitems.cpp index 9d39a99783..123d6c568e 100644 --- a/simon/simonitems.cpp +++ b/simon/simonitems.cpp @@ -23,962 +23,1134 @@ #include "stdafx.h" #include "simon.h" -int SimonState::runScript() { +int SimonState::runScript() +{ byte opcode; bool flag, condition; do { #ifdef DUMP_CONTINOUS_MAINSCRIPT - dumpOpcode(_code_ptr); -#endif - - opcode = getByte(); - if (opcode==0xFF) - return 0; - - if (_run_script_return_1) - return 1; + dumpOpcode(_code_ptr); +#endif - /* Invert condition? */ - flag = false; - if (opcode==0) { - flag = true; opcode = getByte(); - if (opcode==0xFF) + if (opcode == 0xFF) return 0; - } - condition = true; - - switch(opcode) { - case 1: { /* ptrA parent is */ - condition = (getItem1Ptr()->parent == getNextItemID()); - } break; - - case 2: { /* ptrA parent is not */ - condition = (getItem1Ptr()->parent != getNextItemID()); - } break; - - case 5: { /* parent is 1 */ - condition = (getNextItemPtr()->parent == getItem1ID()); - } break; - - case 6: { /* parent isnot 1 */ - condition = (getNextItemPtr()->parent != getItem1ID()); - } break; - - case 7: { /* parent is */ - Item *item = getNextItemPtr(); - condition = (item->parent == getNextItemID()); - } break; - - case 11: { /* is zero */ - condition = (getNextVarContents() == 0); - } break; - - case 12: { /* isnot zero */ - condition = (getNextVarContents() != 0); - } break; - - case 13: { /* equal */ - uint tmp = getNextVarContents(); - condition = (tmp == getVarOrWord()); - } break; - - case 14: { /* not equal */ - uint tmp = getNextVarContents(); - condition = (tmp != getVarOrWord()); - } break; - - case 15: { /* is greater */ - uint tmp = getNextVarContents(); - condition = (tmp > getVarOrWord()); - } break; - - case 16: { /* is less */ - uint tmp = getNextVarContents(); - condition = (tmp < getVarOrWord()); - } break; - - case 17: { /* is eq f */ - uint tmp = getNextVarContents(); - condition = (tmp == getNextVarContents()); - } break; - - case 18: { /* is not equal f */ - uint tmp = getNextVarContents(); - condition = (tmp != getNextVarContents()); - } break; - - case 19: { /* is greater f */ - uint tmp = getNextVarContents(); - condition = (tmp < getNextVarContents()); - } break; - - case 20: { /* is less f */ - uint tmp = getNextVarContents(); - condition = (tmp > getNextVarContents()); - } break; - - case 23: { - condition = o_unk_23(getVarOrWord()); - } break; - - case 25: { /* has child of type 1 */ - condition = hasChildOfType1(getNextItemPtr()); - } break; - - case 26: { /* has child of type 2 */ - condition = hasChildOfType2(getNextItemPtr()); - } break; - - case 27: { /* item unk3 is */ - Item *item = getNextItemPtr(); - condition = ((uint)item->unk3 == getVarOrWord()); - } break; - - case 28: { /* item has prop */ - Child2 *child = findChildOfType2(getNextItemPtr()); - byte num = getVarOrByte(); - condition = child!=NULL && (child->avail_props & (1<<num)) != 0; - } break; - - case 31: { /* set no parent */ - setItemParent(getNextItemPtr(), NULL); - } break; - - case 33: { /* set item parent */ - Item *item = getNextItemPtr(); - setItemParent(item, getNextItemPtr()); - } break; - - case 36: { /* copy var */ - uint value = getNextVarContents(); - writeNextVarContents(value); - } break; - - case 41: { /* zero var */ - writeNextVarContents(0); - } break; - - case 42: { /* set var */ - uint var = getVarOrByte(); - writeVariable(var, getVarOrWord()); - } break; - - case 43: { /* add */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) + getVarOrWord()); - } break; - - case 44: { /* sub */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) - getVarOrWord()); - } break; - - case 45: { /* add f */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) + getNextVarContents()); - } break; - - case 46: { /* sub f */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) - getNextVarContents()); - } break; - - case 47: { /* mul */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) * getVarOrWord()); - } break; - - case 48: { /* div */ - uint var = getVarOrByte(); - int value = getVarOrWord(); - if (value == 0) - error("Division by zero in div"); - writeVariable(var, readVariable(var) / value); - } break; - - case 49: { /* mul f */ - uint var = getVarOrByte(); - writeVariable(var, readVariable(var) * getNextVarContents()); - } break; - - case 50: { /* div f */ - uint var = getVarOrByte(); - int value = getNextVarContents(); - if (value == 0) - error("Division by zero in div f"); - writeVariable(var, readVariable(var) / value); - } break; - - case 51: { /* mod */ - uint var = getVarOrByte(); - int value = getVarOrWord(); - if (value == 0) - error("Division by zero in mod"); - writeVariable(var, readVariable(var) % value); - } break; - - case 52: { /* mod f */ - uint var = getVarOrByte(); - int value = getNextVarContents(); - if (value == 0) - error("Division by zero in mod f"); - writeVariable(var, readVariable(var) % value); - } break; - - case 53: { /* random */ - uint var = getVarOrByte(); - uint value = (uint16)getVarOrWord(); - uint rand_value; - - for(;;) { - uint value_2 = value; - rand_value = rand() & 0x7FFF; - - if (value == 0) - error("Invalid random range"); - - value = 0x8000 / value; - - if (value == 0) - error("Invalid random range"); - - if (rand_value / value != value_2) - break; - - value = value_2; + if (_run_script_return_1) + return 1; + + /* Invert condition? */ + flag = false; + if (opcode == 0) { + flag = true; + opcode = getByte(); + if (opcode == 0xFF) + return 0; } - writeVariable(var, rand_value / value); - } break; + condition = true; - case 55: { /* set itemA parent */ - setItemParent(getItem1Ptr(), getNextItemPtr()); - } break; + switch (opcode) { + case 1:{ /* ptrA parent is */ + condition = (getItem1Ptr()->parent == getNextItemID()); + } + break; - case 56: { /* set child2 fr bit */ - Child2 *child = findChildOfType2(getNextItemPtr()); - int value = getVarOrByte(); - if (child != NULL && value >= 0x10) - child->avail_props |= 1<<value; - } break; + case 2:{ /* ptrA parent is not */ + condition = (getItem1Ptr()->parent != getNextItemID()); + } + break; - case 57: { /* clear child2 fr bit */ - Child2 *child = findChildOfType2(getNextItemPtr()); - int value = getVarOrByte(); - if (child != NULL && value >= 0x10) - child->avail_props &= ~(1<<value); - } break; - - case 58: { /* make siblings */ - Item *item = getNextItemPtr(); - setItemParent(item, derefItem(getNextItemPtr()->parent)); - } break; - - case 59: { /* item inc unk3 */ - Item *item = getNextItemPtr(); - if (item->unk3<=30000) - setItemUnk3(item, item->unk3 + 1); - } break; - - case 60: { /* item dec unk3 */ - Item *item = getNextItemPtr(); - if (item->unk3>=0) - setItemUnk3(item, item->unk3 - 1); - } break; - - case 61: { /* item set unk3 */ - Item *item = getNextItemPtr(); - int value = getVarOrWord(); - if (value<0) value = 0; - if (value>30000) value = 30000; - setItemUnk3(item, value); - } break; - - case 62: { /* show int */ - showMessageFormat("%d", getNextVarContents()); - } break; - - case 63: { /* show string nl */ - showMessageFormat("%s\n", getStringPtrByID(getNextStringID())); - } break; - - case 64: { /* show string */ - showMessageFormat("%s", getStringPtrByID(getNextStringID())); - } break; - - case 65: { /* add hit area */ - int id = getVarOrWord(); - int x = getVarOrWord(); - int y = getVarOrWord(); - int w = getVarOrWord(); - int h = getVarOrWord(); - int number = getVarOrByte(); - if (number < 20) - addNewHitArea(id, x, y, w, h, (number<<8) + 129, 0xD0, &_dummy_item_2); - } break; - - case 66: { /* set array 2 */ - uint var = getVarOrByte(); - uint string_id = getNextStringID(); - if (var < 20) - _stringid_array_2[var] = string_id; - } break; - - case 67: { /* set array 3 and 4 */ - if (_game == GAME_SIMON1WIN || _game&GAME_SIMON2) { - uint var = getVarOrByte(); - uint string_id = getNextStringID(); - uint value = getNextWord(); - if (var < 20) { - _stringid_array_3[var] = string_id; - _array_4[var] = value; - } - } else { - uint var = getVarOrByte(); - uint string_id = getNextStringID(); - if (var < 20) { - _stringid_array_3[var] = string_id; + case 5:{ /* parent is 1 */ + condition = (getNextItemPtr()->parent == getItem1ID()); } - } - } break; + break; - case 68: { /* exit interpreter */ - error("Exit interpreter opcode"); - } break; + case 6:{ /* parent isnot 1 */ + condition = (getNextItemPtr()->parent != getItem1ID()); + } + break; - case 69: { /* return 1 */ - return 1; - } + case 7:{ /* parent is */ + Item *item = getNextItemPtr(); + condition = (item->parent == getNextItemID()); + } + break; - case 70: { /* show string from array */ - const char *str = (const char*)getStringPtrByID(_stringid_array_3[getVarOrByte()]); + case 11:{ /* is zero */ + condition = (getNextVarContents() == 0); + } + break; - if (_game & GAME_SIMON2) { - writeVariable(51, strlen(str)/53 * 8 + 8); - } + case 12:{ /* isnot zero */ + condition = (getNextVarContents() != 0); + } + break; - showMessageFormat("%s\n", str); - } break; - - case 71: { /* start subroutine */ - Subroutine *sub = getSubroutineByID(getVarOrWord()); - if (sub != NULL) - startSubroutine(sub); - } break; - - case 76: { /* add event */ - uint timeout = getVarOrWord(); - addTimeEvent(timeout, getVarOrWord()); - } break; - - case 77: { /* has item minus 1 */ - condition = _subject_item != NULL; - } break; - - case 78: { /* has item minus 3 */ - condition = _object_item != NULL; - } break; - - case 79: { /* childstruct fr2 is */ - Child2 *child = findChildOfType2(getNextItemPtr()); - uint string_id = getNextStringID(); - condition = (child != NULL) && child->string_id == string_id; - } break; + case 13:{ /* equal */ + uint tmp = getNextVarContents(); + condition = (tmp == getVarOrWord()); + } + break; - case 80: { /* item equal */ - condition = getNextItemPtr() == getNextItemPtr(); - } break; + case 14:{ /* not equal */ + uint tmp = getNextVarContents(); + condition = (tmp != getVarOrWord()); + } + break; - case 82: { /* dummy opcode? */ - getVarOrByte(); - } break; + case 15:{ /* is greater */ + uint tmp = getNextVarContents(); + condition = (tmp > getVarOrWord()); + } + break; - case 83: { /* restart subroutine */ - return -10; - } + case 16:{ /* is less */ + uint tmp = getNextVarContents(); + condition = (tmp < getVarOrWord()); + } + break; - case 87: { /* dummy opcode? */ - getNextStringID(); - } break; + case 17:{ /* is eq f */ + uint tmp = getNextVarContents(); + condition = (tmp == getNextVarContents()); + } + break; - case 88: { /* or_lock_word */ - _lock_word |= 0x10; - } break; + case 18:{ /* is not equal f */ + uint tmp = getNextVarContents(); + condition = (tmp != getNextVarContents()); + } + break; - case 89: { /* and lock word */ - _lock_word &= ~0x10; - } break; + case 19:{ /* is greater f */ + uint tmp = getNextVarContents(); + condition = (tmp < getNextVarContents()); + } + break; - case 90: { /* set minusitem to parent */ - Item *item = derefItem(getNextItemPtr()->parent); - switch(getVarOrByte()) { - case 0: - _object_item = item; + case 20:{ /* is less f */ + uint tmp = getNextVarContents(); + condition = (tmp > getNextVarContents()); + } break; - case 1: - _subject_item = item; + + case 23:{ + condition = o_unk_23(getVarOrWord()); + } break; - default: - error("set minusitem to parent, invalid subcode"); - } - } break; - case 91: { /* set minusitem to sibling */ - Item *item = derefItem(getNextItemPtr()->sibling); - switch(getVarOrByte()) { - case 0: - _object_item = item; + case 25:{ /* has child of type 1 */ + condition = hasChildOfType1(getNextItemPtr()); + } break; - case 1: - _subject_item = item; + + case 26:{ /* has child of type 2 */ + condition = hasChildOfType2(getNextItemPtr()); + } break; - default: - error("set minusitem to sibling, invalid subcode"); - } - } break; - - case 92: { /* set minusitem to child */ - Item *item = derefItem(getNextItemPtr()->child); - switch(getVarOrByte()) { - case 0: - _object_item = item; + + case 27:{ /* item unk3 is */ + Item *item = getNextItemPtr(); + condition = ((uint) item->unk3 == getVarOrWord()); + } break; - case 1: - _subject_item = item; + + case 28:{ /* item has prop */ + Child2 *child = findChildOfType2(getNextItemPtr()); + byte num = getVarOrByte(); + condition = child != NULL && (child->avail_props & (1 << num)) != 0; + } break; + + case 31:{ /* set no parent */ + setItemParent(getNextItemPtr(), NULL); + } break; - default: - error("set minusitem to child, invalid subcode"); - } - } break; - - case 96: { - uint val = getVarOrWord(); - o_set_video_mode(getVarOrByte(), val); - } break; - - case 97: { /* load vga */ - ensureVgaResLoadedC(getVarOrWord()); - } break; - - case 98: { - if (!(_game & GAME_SIMON2)) { - uint a = getVarOrWord(); - uint b = getVarOrByte(); - uint c = getVarOrWord(); - uint d = getVarOrWord(); - uint f = getVarOrWord(); - start_vga_code(b, a/100, a, c, d, f); - } else { - uint a = getVarOrWord(); - uint b = getVarOrWord(); - uint c = getVarOrByte(); - uint d = getVarOrWord(); - uint e = getVarOrWord(); - uint f = getVarOrWord(); - start_vga_code(c,a,b,d,e,f); - } - } break; - - case 99: { - if (!(_game & GAME_SIMON2)) { - o_unk_99_simon1(getVarOrWord()); - } else { - uint a = getVarOrWord(); - uint b = getVarOrWord(); - o_unk_99_simon2(a,b); - } - } break; - case 100: { - o_vga_reset(); - } break; + case 33:{ /* set item parent */ + Item *item = getNextItemPtr(); + setItemParent(item, getNextItemPtr()); + } + break; - case 101: { - uint a = getVarOrByte(); - uint b = getVarOrWord(); - uint c = getVarOrWord(); - uint d = getVarOrWord(); - uint e = getVarOrWord(); - uint f = getVarOrWord(); - uint g = getVarOrWord(); - o_unk26_helper(a, b, c, d, e, f, g, 0); - } break; - - case 102: { - fcs_unk_2(getVarOrByte() & 7); - } break; - - case 103: { - o_unk_103(); - } break; - - case 104: { - fcs_delete(getVarOrByte() & 7); - } break; - - case 107: { /* ADD_ITEM_HITAREA(id,x,y,w,h,item,unk3) */ - uint flags = 0; - uint id = getVarOrWord(); - uint params = id / 1000; - uint x,y,w,h,unk3; - Item *item; - - id = id % 1000; - - if (params & 1) flags |= 8; - if (params & 2) flags |= 4; - if (params & 4) flags |= 0x80; - if (params & 8) flags |= 1; - if (params & 16) flags |= 0x10; - - x = getVarOrWord(); - y = getVarOrWord(); - w = getVarOrWord(); - h = getVarOrWord(); - item = getNextItemPtrStrange(); - unk3 = getVarOrWord(); - if (x >= 1000) { - unk3 += 0x4000; - x -= 1000; - } - addNewHitArea(id, x, y, w, h, flags, unk3, item); - } break; - - case 108: { /* delete hitarea */ - delete_hitarea(getVarOrWord()); - } break; - - case 109: { /* clear hitarea bit 0x40 */ - clear_hitarea_bit_0x40(getVarOrWord()); - } break; - - case 110: { /* set hitarea bit 0x40 */ - set_hitarea_bit_0x40(getVarOrWord()); - } break; - - case 111: { /* set hitarea xy */ - uint hitarea_id = getVarOrWord(); - uint x = getVarOrWord(); - uint y = getVarOrWord(); - set_hitarea_x_y(hitarea_id, x, y); - } break; - - case 114: { - Item *item = getNextItemPtr(); - uint fcs_index = getVarOrByte(); - lock(); - fcs_unk_proc_1(fcs_index, item, 0, 0); - unlock(); - } break; - - case 115: { /* item has flag */ - Item *item = getNextItemPtr(); - condition = (item->unk4 & (1 << getVarOrByte())) != 0; - } break; - - case 116: { /* item set flag */ - Item *item = getNextItemPtr(); - item->unk4 |= (1 << getVarOrByte()); - } break; - - case 117: { /* item clear flag */ - Item *item = getNextItemPtr(); - item->unk4 &= ~(1 << getVarOrByte()); - } break; - - case 119: { /* WAIT_VGA */ - uint var = getVarOrWord(); - _scriptvar_2 = (var==200); - - if (var!=200 || !_skip_vga_wait) - o_wait_for_vga(var); - _skip_vga_wait = false; - } break; - - case 120: { - o_unk_120(getVarOrWord()); - } break; - - case 121: { /* SET_VGA_ITEM */ - uint slot = getVarOrByte(); - _vc_item_array[slot] = getNextItemPtr(); - } break; - - case 125: { /* item is sibling with item 1 */ - Item *item = getNextItemPtr(); - condition = (getItem1Ptr()->parent == item->parent); - } break; - - case 126: { - Item *item = getNextItemPtr(); - uint fcs_index = getVarOrByte(); - uint a = 1<<getVarOrByte(); - lock(); - fcs_unk_proc_1(fcs_index, item, 1, a); - unlock(); - } break; - - case 127: { /* deals with music */ - o_unk_127(); - } break; - - case 128: { /* dummy instruction? */ - getVarOrWord(); - } break; - - case 129: { /* dummy instruction? */ - getVarOrWord(); - condition = true; - } break; + case 36:{ /* copy var */ + uint value = getNextVarContents(); + writeNextVarContents(value); + } + break; - case 130: { /* set script cond */ - uint a = getVarOrByte(); - if (a == 1) { - getNextWord(); - _script_cond_b = getNextWord(); - } else { - getNextWord(); - _script_cond_c = getNextWord(); - } - } break; - - case 132: { - o_save_game(); - } break; - - case 133: { - o_load_game(); - } break; - - case 134: { - warning("stopMidiMusic: not implemented"); - /* dummy proc */ - } break; - - case 135: { - error("Quit if user presses Y unimplemented"); - } break; - - case 136: { /* set var to item unk3 */ - Item *item = getNextItemPtr(); - writeNextVarContents(item->unk3); - } break; - - case 137: { - o_unk_137(getVarOrByte()); - } break; - - case 138: { - o_unk_138(); - } break; - - case 139: { /* SET_PARENT_SPECIAL */ - Item *item = getNextItemPtr(); - _no_parent_notify = true; - setItemParent(item, getNextItemPtr()); - _no_parent_notify = false; - } break; - - case 140: { - killAllTimers(); - addTimeEvent(3, 0xA0); - } break; - - case 141: { - uint which = getVarOrByte(); - Item *item = getNextItemPtr(); - if(which == 1) { - _subject_item = item; - } else { - _object_item = item; - } - } break; - - case 142: { - condition = is_hitarea_0x40_clear(getVarOrWord()); - } break; - - case 143: { /* start item sub */ - Child1 *child = findChildOfType1(getNextItemPtr()); - if (child != NULL) { - Subroutine *sub = getSubroutineByID(child->subroutine_id); - if (sub) - startSubroutine(sub); - } - } break; - - case 151: { /* set array6 to item */ - uint var = getVarOrByte(); - Item *item = getNextItemPtr(); - _item_array_6[var] = item; - } break; - - case 152: { /* set m1 or m3 to array6 */ - Item *item = _item_array_6[getVarOrByte()]; - uint var = getVarOrByte(); - if (var==1) { - _subject_item = item; - } else { - _object_item = item; - } - } break; + case 41:{ /* zero var */ + writeNextVarContents(0); + } + break; - case 153: { /* set bit */ - uint bit = getVarOrByte(); - _bit_array[bit>>4] |= 1<<(bit&15); - break; - } + case 42:{ /* set var */ + uint var = getVarOrByte(); + writeVariable(var, getVarOrWord()); + } + break; - case 154: { /* clear bit */ - uint bit = getVarOrByte(); - _bit_array[bit>>4] &= ~(1<<(bit&15)); - break; - } + case 43:{ /* add */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) + getVarOrWord()); + } + break; - case 155: { /* is bit clear? */ - uint bit = getVarOrByte(); - condition = (_bit_array[bit>>4] & (1<<(bit&15))) == 0; - } break; - - case 156: { /* is bit set? */ - uint bit = getVarOrByte(); - condition = (_bit_array[bit>>4] & (1<<(bit&15))) != 0; - } break; - - case 157: { /* get item int prop */ - Item *item = getNextItemPtr(); - Child2 *child = findChildOfType2(item); - uint prop = getVarOrByte(); - - if (child != NULL && child->avail_props&(1<<prop) && prop < 16) { - uint offs = getOffsetOfChild2Param(child, 1<<prop); - writeNextVarContents(child->array[offs]); - } else { - writeNextVarContents(0); - } - } break; + case 44:{ /* sub */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) - getVarOrWord()); + } + break; - case 158: { /* set item prop */ - Item *item = getNextItemPtr(); - Child2 *child = findChildOfType2(item); - uint prop = getVarOrByte(); - int value = getVarOrWord(); + case 45:{ /* add f */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) + getNextVarContents()); + } + break; - if (child != NULL && child->avail_props&(1<<prop) && prop < 16) { - uint offs = getOffsetOfChild2Param(child, 1<<prop); - child->array[offs] = value; - } - } break; + case 46:{ /* sub f */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) - getNextVarContents()); + } + break; - case 160: { - o_unk_160(getVarOrByte()); - } break; + case 47:{ /* mul */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) * getVarOrWord()); + } + break; - case 161: { /* setup text */ - uint value = getVarOrByte(); - ThreeValues *tv; + case 48:{ /* div */ + uint var = getVarOrByte(); + int value = getVarOrWord(); + if (value == 0) + error("Division by zero in div"); + writeVariable(var, readVariable(var) / value); + } + break; - switch(value) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; - default: - error("setup text, invalid value %d", value); - } + case 49:{ /* mul f */ + uint var = getVarOrByte(); + writeVariable(var, readVariable(var) * getNextVarContents()); + } + break; - tv->a = getVarOrWord(); - tv->b = getVarOrByte(); - tv->c = getVarOrWord(); - } break; - - case 162: { - o_print_str(); - } break; - - case 163: { - o_unk_163(getVarOrWord()); - } break; - - case 164: { - _show_preposition = true; - o_setup_cond_c(); - _show_preposition = false; - } break; - - case 165: { - Item *item = getNextItemPtr(); - int16 a = getNextWord(), - b = getNextWord(); - condition = (item->unk2 == a && item->unk1 == b); - } break; - - case 166: { /* set bit2 */ - uint bit = getVarOrByte(); - _bit_array[(bit>>4)+16] |= 1<<(bit&15); - } break; - - case 167: { /* clear bit2 */ - uint bit = getVarOrByte(); - _bit_array[(bit>>4)+16] &= ~(1<<(bit&15)); - } break; - - case 168: { /* is bit clear? */ - uint bit = getVarOrByte(); - condition = (_bit_array[(bit>>4)+16] & (1<<(bit&15))) == 0; - } break; - - case 169: { /* is bit set? */ - uint bit = getVarOrByte(); - condition = (_bit_array[(bit>>4)+16] & (1<<(bit&15))) != 0; - } break; - - case 175: { - o_unk_175(); - } break; - - case 176: { - o_unk_176(); - } break; - - case 177: { - o_177(); - } break; - - case 178: { /* path find */ - uint a = getVarOrWord(); - uint b = getVarOrWord(); - uint c = getVarOrByte(); - uint d = getVarOrByte(); - o_pathfind(a,b,c,d); - } break; - - case 179: { - if (_game == GAME_SIMON1WIN) { - uint b = getVarOrByte(); - /*uint c = */getVarOrByte(); - uint a = getVarOrByte(); - uint d = _array_4[a]; - if (d!=0) - talk_with_speech(d, b); - } else if (_game == GAME_SIMON1DOS) { - uint b = getVarOrByte(); - uint c = getVarOrByte(); - uint a = getVarOrByte(); - const char *s = (const char*)getStringPtrByID(_stringid_array_3[a]); - ThreeValues *tv; - - switch(b) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; - default: - error("setup text, invalid value %d", b); + case 50:{ /* div f */ + uint var = getVarOrByte(); + int value = getNextVarContents(); + if (value == 0) + error("Division by zero in div f"); + writeVariable(var, readVariable(var) / value); + } + break; + + case 51:{ /* mod */ + uint var = getVarOrByte(); + int value = getVarOrWord(); + if (value == 0) + error("Division by zero in mod"); + writeVariable(var, readVariable(var) % value); } + break; - talk_with_text(b, c, s, tv->a, tv->b, tv->c); - } else if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) { - uint b = getVarOrByte(); - uint c = getVarOrByte(); - uint a = getVarOrByte(); - uint d; - const char *s = (const char*)getStringPtrByID(_stringid_array_3[a]); - ThreeValues *tv; - - switch(b) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; - default: - error("setup text, invalid value %d", b); + case 52:{ /* mod f */ + uint var = getVarOrByte(); + int value = getNextVarContents(); + if (value == 0) + error("Division by zero in mod f"); + writeVariable(var, readVariable(var) % value); } + break; - d = _array_4[a]; - if (d!=0 && !_vk_t_toggle) - talk_with_speech(d, b); + case 53:{ /* random */ + uint var = getVarOrByte(); + uint value = (uint16)getVarOrWord(); + uint rand_value; - if (s!=NULL && _vk_t_toggle) - talk_with_text(b, c, s, tv->a, tv->b, tv->c); - } - } break; + for (;;) { + uint value_2 = value; + rand_value = rand() & 0x7FFF; + + if (value == 0) + error("Invalid random range"); + + value = 0x8000 / value; + + if (value == 0) + error("Invalid random range"); + + if (rand_value / value != value_2) + break; + + value = value_2; + } + + writeVariable(var, rand_value / value); + } + break; + + case 55:{ /* set itemA parent */ + setItemParent(getItem1Ptr(), getNextItemPtr()); + } + break; + + case 56:{ /* set child2 fr bit */ + Child2 *child = findChildOfType2(getNextItemPtr()); + int value = getVarOrByte(); + if (child != NULL && value >= 0x10) + child->avail_props |= 1 << value; + } + break; + + case 57:{ /* clear child2 fr bit */ + Child2 *child = findChildOfType2(getNextItemPtr()); + int value = getVarOrByte(); + if (child != NULL && value >= 0x10) + child->avail_props &= ~(1 << value); + } + break; + + case 58:{ /* make siblings */ + Item *item = getNextItemPtr(); + setItemParent(item, derefItem(getNextItemPtr()->parent)); + } + break; + + case 59:{ /* item inc unk3 */ + Item *item = getNextItemPtr(); + if (item->unk3 <= 30000) + setItemUnk3(item, item->unk3 + 1); + } + break; + + case 60:{ /* item dec unk3 */ + Item *item = getNextItemPtr(); + if (item->unk3 >= 0) + setItemUnk3(item, item->unk3 - 1); + } + break; + + case 61:{ /* item set unk3 */ + Item *item = getNextItemPtr(); + int value = getVarOrWord(); + if (value < 0) + value = 0; + if (value > 30000) + value = 30000; + setItemUnk3(item, value); + } + break; + + case 62:{ /* show int */ + showMessageFormat("%d", getNextVarContents()); + } + break; + + case 63:{ /* show string nl */ + showMessageFormat("%s\n", getStringPtrByID(getNextStringID())); + } + break; + + case 64:{ /* show string */ + showMessageFormat("%s", getStringPtrByID(getNextStringID())); + } + break; + + case 65:{ /* add hit area */ + int id = getVarOrWord(); + int x = getVarOrWord(); + int y = getVarOrWord(); + int w = getVarOrWord(); + int h = getVarOrWord(); + int number = getVarOrByte(); + if (number < 20) + addNewHitArea(id, x, y, w, h, (number << 8) + 129, 0xD0, &_dummy_item_2); + } + break; + + case 66:{ /* set array 2 */ + uint var = getVarOrByte(); + uint string_id = getNextStringID(); + if (var < 20) + _stringid_array_2[var] = string_id; + } + break; + + case 67:{ /* set array 3 and 4 */ + if (_game == GAME_SIMON1WIN || _game & GAME_SIMON2) { + uint var = getVarOrByte(); + uint string_id = getNextStringID(); + uint value = getNextWord(); + if (var < 20) { + _stringid_array_3[var] = string_id; + _array_4[var] = value; + } + } else { + uint var = getVarOrByte(); + uint string_id = getNextStringID(); + if (var < 20) { + _stringid_array_3[var] = string_id; + } + } + } + break; + + case 68:{ /* exit interpreter */ + error("Exit interpreter opcode"); + } + break; + + case 69:{ /* return 1 */ + return 1; + } + + case 70:{ /* show string from array */ + const char *str = (const char *)getStringPtrByID(_stringid_array_3[getVarOrByte()]); + + if (_game & GAME_SIMON2) { + writeVariable(51, strlen(str) / 53 * 8 + 8); + } + + showMessageFormat("%s\n", str); + } + break; + + case 71:{ /* start subroutine */ + Subroutine *sub = getSubroutineByID(getVarOrWord()); + if (sub != NULL) + startSubroutine(sub); + } + break; + + case 76:{ /* add event */ + uint timeout = getVarOrWord(); + addTimeEvent(timeout, getVarOrWord()); + } + break; + + case 77:{ /* has item minus 1 */ + condition = _subject_item != NULL; + } + break; + + case 78:{ /* has item minus 3 */ + condition = _object_item != NULL; + } + break; + + case 79:{ /* childstruct fr2 is */ + Child2 *child = findChildOfType2(getNextItemPtr()); + uint string_id = getNextStringID(); + condition = (child != NULL) && child->string_id == string_id; + } + break; + + case 80:{ /* item equal */ + condition = getNextItemPtr() == getNextItemPtr(); + } + break; + + case 82:{ /* dummy opcode? */ + getVarOrByte(); + } + break; + + case 83:{ /* restart subroutine */ + return -10; + } + + case 87:{ /* dummy opcode? */ + getNextStringID(); + } + break; + + case 88:{ /* or_lock_word */ + _lock_word |= 0x10; + } + break; + + case 89:{ /* and lock word */ + _lock_word &= ~0x10; + } + break; + + case 90:{ /* set minusitem to parent */ + Item *item = derefItem(getNextItemPtr()->parent); + switch (getVarOrByte()) { + case 0: + _object_item = item; + break; + case 1: + _subject_item = item; + break; + default: + error("set minusitem to parent, invalid subcode"); + } + } + break; + + case 91:{ /* set minusitem to sibling */ + Item *item = derefItem(getNextItemPtr()->sibling); + switch (getVarOrByte()) { + case 0: + _object_item = item; + break; + case 1: + _subject_item = item; + break; + default: + error("set minusitem to sibling, invalid subcode"); + } + } + break; + + case 92:{ /* set minusitem to child */ + Item *item = derefItem(getNextItemPtr()->child); + switch (getVarOrByte()) { + case 0: + _object_item = item; + break; + case 1: + _subject_item = item; + break; + default: + error("set minusitem to child, invalid subcode"); + } + } + break; + + case 96:{ + uint val = getVarOrWord(); + o_set_video_mode(getVarOrByte(), val); + } + break; + + case 97:{ /* load vga */ + ensureVgaResLoadedC(getVarOrWord()); + } + break; + + case 98:{ + if (!(_game & GAME_SIMON2)) { + uint a = getVarOrWord(); + uint b = getVarOrByte(); + uint c = getVarOrWord(); + uint d = getVarOrWord(); + uint f = getVarOrWord(); + start_vga_code(b, a / 100, a, c, d, f); + } else { + uint a = getVarOrWord(); + uint b = getVarOrWord(); + uint c = getVarOrByte(); + uint d = getVarOrWord(); + uint e = getVarOrWord(); + uint f = getVarOrWord(); + start_vga_code(c, a, b, d, e, f); + } + } + break; + + case 99:{ + if (!(_game & GAME_SIMON2)) { + o_unk_99_simon1(getVarOrWord()); + } else { + uint a = getVarOrWord(); + uint b = getVarOrWord(); + o_unk_99_simon2(a, b); + } + } + break; + + case 100:{ + o_vga_reset(); + } + break; + + case 101:{ + uint a = getVarOrByte(); + uint b = getVarOrWord(); + uint c = getVarOrWord(); + uint d = getVarOrWord(); + uint e = getVarOrWord(); + uint f = getVarOrWord(); + uint g = getVarOrWord(); + o_unk26_helper(a, b, c, d, e, f, g, 0); + } + break; + + case 102:{ + fcs_unk_2(getVarOrByte() & 7); + } + break; + + case 103:{ + o_unk_103(); + } + break; + + case 104:{ + fcs_delete(getVarOrByte() & 7); + } + break; + + case 107:{ /* ADD_ITEM_HITAREA(id,x,y,w,h,item,unk3) */ + uint flags = 0; + uint id = getVarOrWord(); + uint params = id / 1000; + uint x, y, w, h, unk3; + Item *item; + + id = id % 1000; + + if (params & 1) + flags |= 8; + if (params & 2) + flags |= 4; + if (params & 4) + flags |= 0x80; + if (params & 8) + flags |= 1; + if (params & 16) + flags |= 0x10; + + x = getVarOrWord(); + y = getVarOrWord(); + w = getVarOrWord(); + h = getVarOrWord(); + item = getNextItemPtrStrange(); + unk3 = getVarOrWord(); + if (x >= 1000) { + unk3 += 0x4000; + x -= 1000; + } + addNewHitArea(id, x, y, w, h, flags, unk3, item); + } + break; + + case 108:{ /* delete hitarea */ + delete_hitarea(getVarOrWord()); + } + break; + + case 109:{ /* clear hitarea bit 0x40 */ + clear_hitarea_bit_0x40(getVarOrWord()); + } + break; + + case 110:{ /* set hitarea bit 0x40 */ + set_hitarea_bit_0x40(getVarOrWord()); + } + break; + + case 111:{ /* set hitarea xy */ + uint hitarea_id = getVarOrWord(); + uint x = getVarOrWord(); + uint y = getVarOrWord(); + set_hitarea_x_y(hitarea_id, x, y); + } + break; + + case 114:{ + Item *item = getNextItemPtr(); + uint fcs_index = getVarOrByte(); + lock(); + fcs_unk_proc_1(fcs_index, item, 0, 0); + unlock(); + } + break; + + case 115:{ /* item has flag */ + Item *item = getNextItemPtr(); + condition = (item->unk4 & (1 << getVarOrByte())) != 0; + } + break; + + case 116:{ /* item set flag */ + Item *item = getNextItemPtr(); + item->unk4 |= (1 << getVarOrByte()); + } + break; + + case 117:{ /* item clear flag */ + Item *item = getNextItemPtr(); + item->unk4 &= ~(1 << getVarOrByte()); + } + break; + + case 119:{ /* WAIT_VGA */ + uint var = getVarOrWord(); + _scriptvar_2 = (var == 200); + + if (var != 200 || !_skip_vga_wait) + o_wait_for_vga(var); + _skip_vga_wait = false; + } + break; + + case 120:{ + o_unk_120(getVarOrWord()); + } + break; + + case 121:{ /* SET_VGA_ITEM */ + uint slot = getVarOrByte(); + _vc_item_array[slot] = getNextItemPtr(); + } + break; + + case 125:{ /* item is sibling with item 1 */ + Item *item = getNextItemPtr(); + condition = (getItem1Ptr()->parent == item->parent); + } + break; + + case 126:{ + Item *item = getNextItemPtr(); + uint fcs_index = getVarOrByte(); + uint a = 1 << getVarOrByte(); + lock(); + fcs_unk_proc_1(fcs_index, item, 1, a); + unlock(); + } + break; + + case 127:{ /* deals with music */ + o_unk_127(); + } + break; + + case 128:{ /* dummy instruction? */ + getVarOrWord(); + } + break; + + case 129:{ /* dummy instruction? */ + getVarOrWord(); + condition = true; + } + break; + + case 130:{ /* set script cond */ + uint a = getVarOrByte(); + if (a == 1) { + getNextWord(); + _script_cond_b = getNextWord(); + } else { + getNextWord(); + _script_cond_c = getNextWord(); + } + } + break; + + case 132:{ + o_save_game(); + } + break; + + case 133:{ + o_load_game(); + } + break; + + case 134:{ + warning("stopMidiMusic: not implemented"); + /* dummy proc */ + } + break; + + case 135:{ + error("Quit if user presses Y unimplemented"); + } + break; + + case 136:{ /* set var to item unk3 */ + Item *item = getNextItemPtr(); + writeNextVarContents(item->unk3); + } + break; + + case 137:{ + o_unk_137(getVarOrByte()); + } + break; + + case 138:{ + o_unk_138(); + } + break; + + case 139:{ /* SET_PARENT_SPECIAL */ + Item *item = getNextItemPtr(); + _no_parent_notify = true; + setItemParent(item, getNextItemPtr()); + _no_parent_notify = false; + } + break; + + case 140:{ + killAllTimers(); + addTimeEvent(3, 0xA0); + } + break; + + case 141:{ + uint which = getVarOrByte(); + Item *item = getNextItemPtr(); + if (which == 1) { + _subject_item = item; + } else { + _object_item = item; + } + } + break; + + case 142:{ + condition = is_hitarea_0x40_clear(getVarOrWord()); + } + break; + + case 143:{ /* start item sub */ + Child1 *child = findChildOfType1(getNextItemPtr()); + if (child != NULL) { + Subroutine *sub = getSubroutineByID(child->subroutine_id); + if (sub) + startSubroutine(sub); + } + } + break; + + case 151:{ /* set array6 to item */ + uint var = getVarOrByte(); + Item *item = getNextItemPtr(); + _item_array_6[var] = item; + } + break; + + case 152:{ /* set m1 or m3 to array6 */ + Item *item = _item_array_6[getVarOrByte()]; + uint var = getVarOrByte(); + if (var == 1) { + _subject_item = item; + } else { + _object_item = item; + } + } + break; + + case 153:{ /* set bit */ + uint bit = getVarOrByte(); + _bit_array[bit >> 4] |= 1 << (bit & 15); + break; + } + + case 154:{ /* clear bit */ + uint bit = getVarOrByte(); + _bit_array[bit >> 4] &= ~(1 << (bit & 15)); + break; + } + + case 155:{ /* is bit clear? */ + uint bit = getVarOrByte(); + condition = (_bit_array[bit >> 4] & (1 << (bit & 15))) == 0; + } + break; + + case 156:{ /* is bit set? */ + uint bit = getVarOrByte(); + condition = (_bit_array[bit >> 4] & (1 << (bit & 15))) != 0; + } + break; - case 180: { - o_force_unlock(); - } break; + case 157:{ /* get item int prop */ + Item *item = getNextItemPtr(); + Child2 *child = findChildOfType2(item); + uint prop = getVarOrByte(); - case 181: { - o_force_lock(); - if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) { - fcs_unk_2(1); - showMessageFormat("\xC"); + if (child != NULL && child->avail_props & (1 << prop) && prop < 16) { + uint offs = getOffsetOfChild2Param(child, 1 << prop); + writeNextVarContents(child->array[offs]); + } else { + writeNextVarContents(0); + } + } + break; + + case 158:{ /* set item prop */ + Item *item = getNextItemPtr(); + Child2 *child = findChildOfType2(item); + uint prop = getVarOrByte(); + int value = getVarOrWord(); + + if (child != NULL && child->avail_props & (1 << prop) && prop < 16) { + uint offs = getOffsetOfChild2Param(child, 1 << prop); + child->array[offs] = value; + } + } + break; + + case 160:{ + o_unk_160(getVarOrByte()); + } + break; + + case 161:{ /* setup text */ + uint value = getVarOrByte(); + ThreeValues *tv; + + switch (value) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; + default: + error("setup text, invalid value %d", value); + } + + tv->a = getVarOrWord(); + tv->b = getVarOrByte(); + tv->c = getVarOrWord(); + } + break; + + case 162:{ + o_print_str(); + } + break; + + case 163:{ + o_unk_163(getVarOrWord()); + } + break; + + case 164:{ + _show_preposition = true; + o_setup_cond_c(); + _show_preposition = false; + } + break; + + case 165:{ + Item *item = getNextItemPtr(); + int16 a = getNextWord(), b = getNextWord(); + condition = (item->unk2 == a && item->unk1 == b); + } break; + + case 166:{ /* set bit2 */ + uint bit = getVarOrByte(); + _bit_array[(bit >> 4) + 16] |= 1 << (bit & 15); + } + break; + + case 167:{ /* clear bit2 */ + uint bit = getVarOrByte(); + _bit_array[(bit >> 4) + 16] &= ~(1 << (bit & 15)); + } + break; + + case 168:{ /* is bit clear? */ + uint bit = getVarOrByte(); + condition = (_bit_array[(bit >> 4) + 16] & (1 << (bit & 15))) == 0; + } + break; + + case 169:{ /* is bit set? */ + uint bit = getVarOrByte(); + condition = (_bit_array[(bit >> 4) + 16] & (1 << (bit & 15))) != 0; + } + break; + + case 175:{ + o_unk_175(); + } + break; + + case 176:{ + o_unk_176(); + } + break; + + case 177:{ + o_177(); + } + break; + + case 178:{ /* path find */ + uint a = getVarOrWord(); + uint b = getVarOrWord(); + uint c = getVarOrByte(); + uint d = getVarOrByte(); + o_pathfind(a, b, c, d); + } + break; + + case 179:{ + if (_game == GAME_SIMON1WIN) { + uint b = getVarOrByte(); + /*uint c = */ getVarOrByte(); + uint a = getVarOrByte(); + uint d = _array_4[a]; + if (d != 0) + talk_with_speech(d, b); + } else if (_game == GAME_SIMON1DOS) { + uint b = getVarOrByte(); + uint c = getVarOrByte(); + uint a = getVarOrByte(); + const char *s = (const char *)getStringPtrByID(_stringid_array_3[a]); + ThreeValues *tv; + + switch (b) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; + default: + error("setup text, invalid value %d", b); + } + + talk_with_text(b, c, s, tv->a, tv->b, tv->c); + } else if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) { + uint b = getVarOrByte(); + uint c = getVarOrByte(); + uint a = getVarOrByte(); + uint d; + const char *s = (const char *)getStringPtrByID(_stringid_array_3[a]); + ThreeValues *tv; + + switch (b) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; + default: + error("setup text, invalid value %d", b); + } + + d = _array_4[a]; + if (d != 0 && !_vk_t_toggle) + talk_with_speech(d, b); + + if (s != NULL && _vk_t_toggle) + talk_with_text(b, c, s, tv->a, tv->b, tv->c); + } + } + break; + + case 180:{ + o_force_unlock(); + } + break; + + case 181:{ + o_force_lock(); + if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) { + fcs_unk_2(1); + showMessageFormat("\xC"); + } + } + break; + + case 182:{ + if (_game & GAME_SIMON2) + goto invalid_opcode; + o_read_vgares_328(); + } + break; + + case 183:{ + if (_game & GAME_SIMON2) + goto invalid_opcode; + o_read_vgares_23(); + } + break; + + case 184:{ + o_clear_vgapointer_entry(getVarOrWord()); + } + break; + + case 185:{ + if (_game & GAME_SIMON2) + goto invalid_opcode; + getVarOrWord(); + } + break; + + case 186:{ + o_unk_186(); + } + break; + + case 187:{ + if (_game & GAME_SIMON2) + goto invalid_opcode; + o_fade_to_black(); + } + break; + + case 188: + if (!(_game & GAME_SIMON2)) + goto invalid_opcode; + { + uint i = getVarOrByte(); + uint str = getNextStringID(); + condition = (str < 20 && _stringid_array_2[i] == str); + } + break; + + case 189:{ + if (!(_game & GAME_SIMON2)) + goto invalid_opcode; + _op_189_flags = 0; + } + break; + + case 190:{ + uint i; + if (!(_game & GAME_SIMON2)) + goto invalid_opcode; + i = getVarOrByte(); + if (!(_op_189_flags & (1 << i))) + o_190_helper(i); + } + break; + + default: + invalid_opcode:; + error("Invalid opcode '%d'", opcode); } - } break; - - case 182: { - if (_game & GAME_SIMON2) goto invalid_opcode; - o_read_vgares_328(); - } break; - - case 183: { - if (_game & GAME_SIMON2) goto invalid_opcode; - o_read_vgares_23(); - } break; - - case 184: { - o_clear_vgapointer_entry(getVarOrWord()); - } break; - - case 185: { - if (_game & GAME_SIMON2) goto invalid_opcode; - getVarOrWord(); - } break; - - case 186: { - o_unk_186(); - } break; - - case 187: { - if (_game & GAME_SIMON2) goto invalid_opcode; - o_fade_to_black(); - } break; - - case 188: - if (!(_game & GAME_SIMON2)) goto invalid_opcode; - { - uint i = getVarOrByte(); - uint str = getNextStringID(); - condition = (str<20 && _stringid_array_2[i] == str); - } break; - - case 189: { - if (!(_game & GAME_SIMON2)) goto invalid_opcode; - _op_189_flags = 0; - } break; - - case 190: { - uint i; - if (!(_game & GAME_SIMON2)) goto invalid_opcode; - i = getVarOrByte(); - if (!(_op_189_flags&(1<<i))) - o_190_helper(i); - } break; - - default: -invalid_opcode:; - error("Invalid opcode '%d'", opcode); - } } while (condition != flag); return 0; } -int SimonState::startSubroutine(Subroutine *sub) { +int SimonState::startSubroutine(Subroutine *sub) +{ int result = -1; SubroutineLine *sl; byte *old_code_ptr; @@ -992,29 +1164,32 @@ int SimonState::startSubroutine(Subroutine *sub) { if (++_recursion_depth > 40) error("Recursion error"); - sl = (SubroutineLine*)((byte*)sub + sub->first); + sl = (SubroutineLine *)((byte *)sub + sub->first); - while ((byte*)sl != (byte*)sub) { + while ((byte *)sl != (byte *)sub) { if (checkIfToRunSubroutineLine(sl, sub)) { result = 0; - _code_ptr = (byte*)sl; - if (sub->id) _code_ptr += 2; else _code_ptr += 8; + _code_ptr = (byte *)sl; + if (sub->id) + _code_ptr += 2; + else + _code_ptr += 8; #ifdef DUMP_CONTINOUS_MAINSCRIPT - fprintf(_dump_file,"; %d\n", sub->id); + fprintf(_dump_file, "; %d\n", sub->id); #endif result = runScript(); if (result != 0) { /* result -10 means restart subroutine */ if (result == -10) { - delay(0); /* maybe leave control to the VGA */ - sl = (SubroutineLine*)((byte*)sub + sub->first); + delay(0); /* maybe leave control to the VGA */ + sl = (SubroutineLine *)((byte *)sub + sub->first); continue; } break; } } - sl = (SubroutineLine*)((byte*)sub + sl->next); + sl = (SubroutineLine *)((byte *)sub + sl->next); } _code_ptr = old_code_ptr; @@ -1023,36 +1198,40 @@ int SimonState::startSubroutine(Subroutine *sub) { return result; } -int SimonState::startSubroutineEx(Subroutine *sub) { +int SimonState::startSubroutineEx(Subroutine *sub) +{ _item_1_ptr = _item_1; return startSubroutine(sub); } -bool SimonState::checkIfToRunSubroutineLine(SubroutineLine *sl, Subroutine *sub) { +bool SimonState::checkIfToRunSubroutineLine(SubroutineLine *sl, Subroutine *sub) +{ if (sub->id) return true; if (sl->cond_a != -1 && sl->cond_a != _script_cond_a && - (sl->cond_a != -2 || _script_cond_a != -1)) + (sl->cond_a != -2 || _script_cond_a != -1)) return false; - + if (sl->cond_b != -1 && sl->cond_b != _script_cond_b && - (sl->cond_b != -2 || _script_cond_b != -1)) + (sl->cond_b != -2 || _script_cond_b != -1)) return false; if (sl->cond_c != -1 && sl->cond_c != _script_cond_c && - (sl->cond_c != -2 || _script_cond_c != -1)) + (sl->cond_c != -2 || _script_cond_c != -1)) return false; return true; } -void SimonState::o_190_helper(uint i) { +void SimonState::o_190_helper(uint i) +{ warning("o_190_helper not implemented"); } -bool SimonState::o_unk_23(uint a) { +bool SimonState::o_unk_23(uint a) +{ if (a == 0) return 0; @@ -1060,12 +1239,12 @@ bool SimonState::o_unk_23(uint a) { return 1; a += _script_unk_1; - if (a<=0) { + if (a <= 0) { _script_unk_1 = 0; return 0; } - - if (((uint)(rand()>>5))%100 < a) { + + if (((uint) (rand() >> 5)) % 100 < a) { if (_script_unk_1 <= 0) _script_unk_1 -= 5; else @@ -1081,43 +1260,52 @@ bool SimonState::o_unk_23(uint a) { return 0; } -void SimonState::o_177() { +void SimonState::o_177() +{ if (_game == GAME_SIMON1WIN) { uint a = getVarOrByte(); - /*uint b = */getVarOrByte(); + /*uint b = */ getVarOrByte(); uint offs; Child2 *child = findChildOfType2(getNextItemPtr()); - if (child != NULL && child->avail_props&0x200) { + if (child != NULL && child->avail_props & 0x200) { offs = getOffsetOfChild2Param(child, 0x200); talk_with_speech(child->array[offs], a); - } else if (child != NULL && child->avail_props&0x100) { + } else if (child != NULL && child->avail_props & 0x100) { offs = getOffsetOfChild2Param(child, 0x100); - talk_with_speech(child->array[offs]+3550, a); + talk_with_speech(child->array[offs] + 3550, a); } } else if (_game == GAME_SIMON1DOS) { uint a = getVarOrByte(); uint b = getVarOrByte(); Child2 *child = findChildOfType2(getNextItemPtr()); - if (child!=NULL && child->avail_props&1) { - const char *s = (const char*)getStringPtrByID(child->array[0]); + if (child != NULL && child->avail_props & 1) { + const char *s = (const char *)getStringPtrByID(child->array[0]); ThreeValues *tv; char buf[256]; - switch(a) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; + switch (a) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; default: error("setup text, invalid value %d", a); } - if (child->avail_props&0x100) { - uint x = getOffsetOfChild2Param(child,0x100); - sprintf(buf,"%d%s",child->array[x],s); + if (child->avail_props & 0x100) { + uint x = getOffsetOfChild2Param(child, 0x100); + sprintf(buf, "%d%s", child->array[x], s); s = buf; } - talk_with_text(a,b,s,tv->a, tv->b,tv->c); + talk_with_text(a, b, s, tv->a, tv->b, tv->c); } } else if (_game == GAME_SIMON2WIN || _game == GAME_SIMON2DOS) { uint a = getVarOrByte(); @@ -1127,38 +1315,67 @@ void SimonState::o_177() { ThreeValues *tv = NULL; char buf[256]; - if (child != NULL && child->avail_props&1) { - s = (const char*)getStringPtrByID(child->array[0]); - switch(a) { - case 1: tv = &_threevalues_1; break; - case 2: tv = &_threevalues_2; break; - case 101: tv = &_threevalues_3; break; - case 102: tv = &_threevalues_4; break; + if (child != NULL && child->avail_props & 1) { + s = (const char *)getStringPtrByID(child->array[0]); + switch (a) { + case 1: + tv = &_threevalues_1; + break; + case 2: + tv = &_threevalues_2; + break; + case 101: + tv = &_threevalues_3; + break; + case 102: + tv = &_threevalues_4; + break; default: error("setup text, invalid value %d", a); } } - if (child != NULL && child->avail_props&0x200) { + if (child != NULL && child->avail_props & 0x200) { uint var200 = child->array[getOffsetOfChild2Param(child, 0x200)]; - if (child->avail_props&0x100) { + if (child->avail_props & 0x100) { uint var100 = child->array[getOffsetOfChild2Param(child, 0x100)]; - if (var200 == 116) var200 = var100 + 115; - if (var200 == 92) var200 = var100 + 98; - if (var200 == 99) var200 = 9; + if (var200 == 116) + var200 = var100 + 115; + if (var200 == 92) + var200 = var100 + 98; + if (var200 == 99) + var200 = 9; if (var200 == 97) { - switch(var100) { - case 12: var200 = 109; break; - case 14: var200 = 108; break; - case 18: var200 = 107; break; - case 20: var200 = 106; break; - case 22: var200 = 105; break; - case 28: var200 = 104; break; - case 90: var200 = 103; break; - case 92: var200 = 102; break; - case 100: var200 = 51; break; + switch (var100) { + case 12: + var200 = 109; + break; + case 14: + var200 = 108; + break; + case 18: + var200 = 107; + break; + case 20: + var200 = 106; + break; + case 22: + var200 = 105; + break; + case 28: + var200 = 104; + break; + case 90: + var200 = 103; + break; + case 92: + var200 = 102; + break; + case 100: + var200 = 51; + break; default: error("o_177: invalid case %d", var100); } @@ -1167,25 +1384,26 @@ void SimonState::o_177() { if (!_vk_t_toggle) talk_with_speech(var200, a); - } + } if (!_vk_t_toggle) return; - if (child==NULL || !(child->avail_props&1)) + if (child == NULL || !(child->avail_props & 1)) return; - - if (child->avail_props&0x100) { + + if (child->avail_props & 0x100) { sprintf(buf, "%d%s", child->array[getOffsetOfChild2Param(child, 0x100)], s); s = buf; } - - talk_with_text(a,b,s,tv->a, tv->b,tv->c); + + talk_with_text(a, b, s, tv->a, tv->b, tv->c); } } -void SimonState::o_unk_137(uint fcs_index) { +void SimonState::o_unk_137(uint fcs_index) +{ FillOrCopyStruct *fcs; fcs = _fcs_ptr_array_3[fcs_index & 7]; @@ -1194,37 +1412,42 @@ void SimonState::o_unk_137(uint fcs_index) { fcs_unk_proc_1(fcs_index, fcs->fcs_data->item_ptr, fcs->fcs_data->unk1, fcs->fcs_data->unk2); } -void SimonState::o_unk_138() { +void SimonState::o_unk_138() +{ _vga_buf_start = _vga_buf_free_start; _vga_file_buf_org = _vga_buf_free_start; } -void SimonState::o_unk_186() { +void SimonState::o_unk_186() +{ _vga_buf_free_start = _vga_file_buf_org_2; _vga_buf_start = _vga_file_buf_org_2; _vga_file_buf_org = _vga_file_buf_org_2; } -void SimonState::o_unk_175() { +void SimonState::o_unk_175() +{ _vga_buf_start = _vga_buf_free_start; } -void SimonState::o_unk_176() { +void SimonState::o_unk_176() +{ _vga_buf_free_start = _vga_file_buf_org; _vga_buf_start = _vga_file_buf_org; } -int SimonState::o_unk_132_helper(bool *b, char *buf) { +int SimonState::o_unk_132_helper(bool *b, char *buf) +{ HitArea *ha; - + *b = true; - + if (!_saveload_flag) { -strange_jump:; + strange_jump:; _saveload_flag = false; savegame_dialog(buf); - } + } start_over:; _key_pressed = 0; @@ -1235,7 +1458,7 @@ start_over_2:; do { if (_key_pressed != 0) { if (_saveload_flag) { - *b = false; + *b = false; return _key_pressed; } goto start_over; @@ -1245,125 +1468,143 @@ start_over_2:; ha = _last_hitarea; - if (ha == NULL || ha->id < 205) goto start_over_2; + if (ha == NULL || ha->id < 205) + goto start_over_2; - if (ha->id == 205) return ha->id; + if (ha->id == 205) + return ha->id; if (ha->id == 206) { - if (_saveload_row_curpos == 1) goto start_over_2; - if (_saveload_row_curpos < 7) _saveload_row_curpos = 1; - else _saveload_row_curpos -= 6; + if (_saveload_row_curpos == 1) + goto start_over_2; + if (_saveload_row_curpos < 7) + _saveload_row_curpos = 1; + else + _saveload_row_curpos -= 6; goto strange_jump; } - + if (ha->id == 207) { - if (!_savedialog_flag) goto start_over_2; + if (!_savedialog_flag) + goto start_over_2; _saveload_row_curpos += 6; -// if (_saveload_row_curpos >= _num_savegame_rows) -// _saveload_row_curpos = _num_savegame_rows; +// if (_saveload_row_curpos >= _num_savegame_rows) +// _saveload_row_curpos = _num_savegame_rows; goto strange_jump; } - - if (ha->id >= 214) goto start_over_2; + + if (ha->id >= 214) + goto start_over_2; return ha->id - 208; } -void SimonState::o_unk_132_helper_3() { - for(int i=208; i!=208+6; i++) +void SimonState::o_unk_132_helper_3() +{ + for (int i = 208; i != 208 + 6; i++) set_hitarea_bit_0x40(i); } -void SimonState::o_unk_132_helper_2(FillOrCopyStruct *fcs, int x) { +void SimonState::o_unk_132_helper_2(FillOrCopyStruct *fcs, int x) +{ byte old_text; video_putchar(fcs, x); old_text = fcs->text_color; fcs->text_color = fcs->fill_color; - + x += 120; - if (x != 128) x=129; + if (x != 128) + x = 129; video_putchar(fcs, x); fcs->text_color = old_text; video_putchar(fcs, 8); } -void SimonState::o_unk_127() { +void SimonState::o_unk_127() +{ if (_game & GAME_SIMON2) { uint a = getVarOrWord(); uint b = getVarOrWord(); uint c = getVarOrByte(); - warning("o_unk_127(%d,%d,%d) not implemented properly", a, b, c); + warning("o_unk_127(%d,%d,%d) not implemented properly", a, b, c); - if (a!=_last_music_played) { + if (a != _last_music_played) { _last_music_played = a; playMusic(a); } } else { uint a = getVarOrWord(); - /*uint b = */getVarOrWord(); + /*uint b = */ getVarOrWord(); - if (a!=_last_music_played) { + if (a != _last_music_played) { _last_music_played = a; playMusic(a); } } } -void SimonState::o_unk_120(uint a) { +void SimonState::o_unk_120(uint a) +{ uint16 id = TO_BE_16(a); _lock_word |= 0x4000; - _vc_ptr = (byte*)&id; + _vc_ptr = (byte *)&id; vc_15_start_funkystruct_by_id(); _lock_word &= ~0x4000; } -void SimonState::o_unk_163(uint a) { +void SimonState::o_unk_163(uint a) +{ playSound(a); } -void SimonState::o_unk_160(uint a) { +void SimonState::o_unk_160(uint a) +{ fcs_proc_1(_fcs_ptr_array_3[_fcs_unk_1], a); } -void SimonState::o_unk_103() { +void SimonState::o_unk_103() +{ lock(); fcs_unk1(_fcs_unk_1); showMessageFormat("\x0C"); unlock(); } -void SimonState::o_unk_99_simon1(uint a) { +void SimonState::o_unk_99_simon1(uint a) +{ uint16 b = TO_BE_16(a); _lock_word |= 0x4000; - _vc_ptr = (byte*)&b; + _vc_ptr = (byte *)&b; vc_60(); _lock_word &= ~0x4000; } -void SimonState::o_unk_99_simon2(uint a, uint b) { +void SimonState::o_unk_99_simon2(uint a, uint b) +{ uint16 items[2]; - + items[0] = TO_BE_16(a); items[1] = TO_BE_16(a); _lock_word |= 0x4000; - _vc_ptr = (byte*)&items; + _vc_ptr = (byte *)&items; vc_60(); _lock_word &= ~0x4000; } /* OK */ -void SimonState::o_unk26_helper(uint a, uint b, uint c, uint d, uint e, uint f, uint g, uint h) { +void SimonState::o_unk26_helper(uint a, uint b, uint c, uint d, uint e, uint f, uint g, uint h) +{ a &= 7; if (_fcs_ptr_array_3[a]) fcs_delete(a); - _fcs_ptr_array_3[a] = fcs_alloc(b,c,d,e,f,g,h); - + _fcs_ptr_array_3[a] = fcs_alloc(b, c, d, e, f, g, h); + if (a == _fcs_unk_1) { _fcs_ptr_1 = _fcs_ptr_array_3[a]; showmessage_helper_3(_fcs_ptr_1->unk6, _fcs_ptr_1->unk7); diff --git a/simon/simonres.cpp b/simon/simonres.cpp index 8b8002759e..f580ae2741 100644 --- a/simon/simonres.cpp +++ b/simon/simonres.cpp @@ -24,104 +24,128 @@ #include "simon.h" // Script opcodes to load into memory -static const char * const opcode_arg_table_simon1win[256] = { -" ","I ","I ","I ","I ","I ","I ","II ","II ","II ","II ","B ","B ","BN ","BN ","BN ", -"BN ","BB ","BB ","BB ","BB ","II ","II ","N ","I ","I ","I ","IN ","IB ","II ","I ","I ", -"II ","II ","IBB ","BIB ","BB ","B ","BI ","IB ","B ","B ","BN ","BN ","BN ","BB ","BB ","BN ", -"BN ","BB ","BB ","BN ","BB ","BN ","B ","I ","IB ","IB ","II ","I ","I ","IN ","B ","T ", -"T ","NNNNNB ","BT ","BTS ","T "," ","B ","N ","IBN ","I ","I ","I ","NN "," "," ","IT ", -"II ","I ","B "," ","IB ","IBB ","IIB ","T "," "," ","IB ","IB ","IB ","B ","BB ","IBB ", -"NB ","N ","NBNNN ","N "," ","BNNNNNN ","B "," ","B ","B ","BB ","NNNNNIN ","N ","N ","N ","NNN ", -"NBNN ","IBNN ","IB ","IB ","IB ","IB ","N ","N ","N ","BI "," "," ","N ","I ","IBB ","NN ", -"N ","N ","Ban ","BB "," "," "," "," ","IB ","B "," ","II "," ","BI ","N ","I ", -"IB ","IB ","IB ","IB ","IB ","IB ","IB ","BI ","BB ","B ","B ","B ","B ","IBB ","IBN ","IB ", -"B ","BNBN ","BBTS ","N "," ","Ian ","B ","B ","B ","B ","T ","T ","B "," ","I "," ", -" ","BBI ","NNBB ","BBB "," "," "," "," ","N ","N "," "," ", +static const char *const opcode_arg_table_simon1win[256] = { + " ", "I ", "I ", "I ", "I ", "I ", "I ", "II ", "II ", "II ", "II ", "B ", "B ", "BN ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BB ", "BB ", "II ", "II ", "N ", "I ", "I ", "I ", "IN ", "IB ", + "II ", "I ", "I ", "II ", "II ", "IBB ", "BIB ", "BB ", "B ", "BI ", "IB ", "B ", "B ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BN ", "BN ", "BB ", "BB ", "BN ", "BB ", "BN ", "B ", "I ", "IB ", + "IB ", "II ", "I ", "I ", "IN ", "B ", "T ", "T ", "NNNNNB ", "BT ", "BTS ", "T ", " ", "B ", + "N ", "IBN ", "I ", "I ", "I ", "NN ", " ", " ", "IT ", "II ", "I ", "B ", " ", "IB ", "IBB ", + "IIB ", "T ", " ", " ", "IB ", "IB ", "IB ", "B ", "BB ", "IBB ", "NB ", "N ", "NBNNN ", "N ", + " ", "BNNNNNN ", "B ", " ", "B ", "B ", "BB ", "NNNNNIN ", "N ", "N ", "N ", "NNN ", "NBNN ", + "IBNN ", "IB ", "IB ", "IB ", "IB ", "N ", "N ", "N ", "BI ", " ", " ", "N ", "I ", "IBB ", + "NN ", "N ", "N ", "Ban ", "BB ", " ", " ", " ", " ", "IB ", "B ", " ", "II ", " ", "BI ", "N ", + "I ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "BI ", "BB ", "B ", "B ", "B ", "B ", + "IBB ", "IBN ", "IB ", "B ", "BNBN ", "BBTS ", "N ", " ", "Ian ", "B ", "B ", "B ", "B ", "T ", + "T ", "B ", " ", "I ", " ", " ", "BBI ", "NNBB ", "BBB ", " ", " ", " ", " ", "N ", "N ", " ", + " ", }; -static const char * const opcode_arg_table_simon1dos[256] = { -" ","I ","I ","I ","I ","I ","I ","II ","II ","II ","II ","B ","B ","BN ","BN ","BN ", -"BN ","BB ","BB ","BB ","BB ","II ","II ","N ","I ","I ","I ","IN ","IB ","II ","I ","I ", -"II ","II ","IBB ","BIB ","BB ","B ","BI ","IB ","B ","B ","BN ","BN ","BN ","BB ","BB ","BN ", -"BN ","BB ","BB ","BN ","BB ","BN ","B ","I ","IB ","IB ","II ","I ","I ","IN ","B ","T ", -"T ","NNNNNB ","BT ","BT ","T "," ","B ","N ","IBN ","I ","I ","I ","NN "," "," ","IT ", -"II ","I ","B "," ","IB ","IBB ","IIB ","T "," "," ","IB ","IB ","IB ","B ","BB ","IBB ", -"NB ","N ","NBNNN ","N "," ","BNNNNNN ","B "," ","B ","B ","BB ","NNNNNIN ","N ","N ","N ","NNN ", -"NBNN ","IBNN ","IB ","IB ","IB ","IB ","N ","N ","N ","BI "," "," ","N ","I ","IBB ","NN ", -"N ","N ","Ban ","BB "," "," "," "," ","IB ","B "," ","II "," ","BI ","N ","I ", -"IB ","IB ","IB ","IB ","IB ","IB ","IB ","BI ","BB ","B ","B ","B ","B ","IBB ","IBN ","IB ", -"B ","BNBN ","BBT ","N "," ","Ian ","B ","B ","B ","B ","T ","T ","B "," ","I "," ", -" ","BBI ","NNBB ","BBB "," "," "," "," ","N ","N "," "," ", +static const char *const opcode_arg_table_simon1dos[256] = { + " ", "I ", "I ", "I ", "I ", "I ", "I ", "II ", "II ", "II ", "II ", "B ", "B ", "BN ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BB ", "BB ", "II ", "II ", "N ", "I ", "I ", "I ", "IN ", "IB ", + "II ", "I ", "I ", "II ", "II ", "IBB ", "BIB ", "BB ", "B ", "BI ", "IB ", "B ", "B ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BN ", "BN ", "BB ", "BB ", "BN ", "BB ", "BN ", "B ", "I ", "IB ", + "IB ", "II ", "I ", "I ", "IN ", "B ", "T ", "T ", "NNNNNB ", "BT ", "BT ", "T ", " ", "B ", + "N ", "IBN ", "I ", "I ", "I ", "NN ", " ", " ", "IT ", "II ", "I ", "B ", " ", "IB ", "IBB ", + "IIB ", "T ", " ", " ", "IB ", "IB ", "IB ", "B ", "BB ", "IBB ", "NB ", "N ", "NBNNN ", "N ", + " ", "BNNNNNN ", "B ", " ", "B ", "B ", "BB ", "NNNNNIN ", "N ", "N ", "N ", "NNN ", "NBNN ", + "IBNN ", "IB ", "IB ", "IB ", "IB ", "N ", "N ", "N ", "BI ", " ", " ", "N ", "I ", "IBB ", + "NN ", "N ", "N ", "Ban ", "BB ", " ", " ", " ", " ", "IB ", "B ", " ", "II ", " ", "BI ", "N ", + "I ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "BI ", "BB ", "B ", "B ", "B ", "B ", + "IBB ", "IBN ", "IB ", "B ", "BNBN ", "BBT ", "N ", " ", "Ian ", "B ", "B ", "B ", "B ", "T ", + "T ", "B ", " ", "I ", " ", " ", "BBI ", "NNBB ", "BBB ", " ", " ", " ", " ", "N ", "N ", " ", + " ", }; -static const char * const opcode_arg_table_simon2win[256] = { -" ","I ","I ","I ","I ","I ","I ","II ","II ","II ","II ","B ","B ","BN ","BN ","BN ", -"BN ","BB ","BB ","BB ","BB ","II ","II ","N ","I ","I ","I ","IN ","IB ","II ","I ","I ", -"II ","II ","IBB ","BIB ","BB ","B ","BI ","IB ","B ","B ","BN ","BN ","BN ","BB ","BB ","BN ", -"BN ","BB ","BB ","BN ","BB ","BN ","B ","I ","IB ","IB ","II ","I ","I ","IN ","B ","T ", -"T ","NNNNNB ","BT ","BTS ","T "," ","B ","N ","IBN ","I ","I ","I ","NN "," "," ","IT ", -"II ","I ","B "," ","IB ","IBB ","IIB ","T "," "," ","IB ","IB ","IB ","B ","BB ","IBB ", -"NB ","N ","NNBNNN ","NN "," ","BNNNNNN ","B "," ","B ","B ","BB ","NNNNNIN ","N ","N ","N ","NNN ", -"NBNN ","IBNN ","IB ","IB ","IB ","IB ","N ","N ","N ","BI "," "," ","N ","I ","IBB ","NNB ", -"N ","N ","Ban ","BB "," "," "," "," ","IB ","B "," ","II "," ","BI ","N ","I ", -"IB ","IB ","IB ","IB ","IB ","IB ","IB ","BI ","BB ","B ","B ","B ","B ","IBB ","IBN ","IB ", -"B ","BNBN ","BBTS ","N "," ","Ian ","B ","B ","B ","B ","T ","T ","B "," ","I "," ", -" ","BBI ","NNBB ","BBB "," "," "," "," ","N ","N "," "," ","BT "," ","B "}; - -static const char * const opcode_arg_table_simon2dos[256] = { -" ","I ","I ","I ","I ","I ","I ","II ","II ","II ","II ","B ","B ","BN ","BN ","BN ", -"BN ","BB ","BB ","BB ","BB ","II ","II ","N ","I ","I ","I ","IN ","IB ","II ","I ","I ", -"II ","II ","IBB ","BIB ","BB ","B ","BI ","IB ","B ","B ","BN ","BN ","BN ","BB ","BB ","BN ", -"BN ","BB ","BB ","BN ","BB ","BN ","B ","I ","IB ","IB ","II ","I ","I ","IN ","B ","T ", -"T ","NNNNNB ","BT ","BT ","T "," ","B ","N ","IBN ","I ","I ","I ","NN "," "," ","IT ", -"II ","I ","B "," ","IB ","IBB ","IIB ","T "," "," ","IB ","IB ","IB ","B ","BB ","IBB ", -"NB ","N ","NNBNNN ","NN "," ","BNNNNNN ","B "," ","B ","B ","BB ","NNNNNIN ","N ","N ","N ","NNN ", -"NBNN ","IBNN ","IB ","IB ","IB ","IB ","N ","N ","N ","BI "," "," ","N ","I ","IBB ","NNB ", -"N ","N ","Ban ","BB "," "," "," "," ","IB ","B "," ","II "," ","BI ","N ","I ", -"IB ","IB ","IB ","IB ","IB ","IB ","IB ","BI ","BB ","B ","B ","B ","B ","IBB ","IBN ","IB ", -"B ","BNBN ","BBT ","N "," ","Ian ","B ","B ","B ","B ","T ","T ","B "," ","I "," ", -" ","BBI ","NNBB ","BBB "," "," "," "," ","N ","N "," "," ","BT "," ","B "}; - -FILE *SimonState::fopen_maybe_lowercase(const char *filename) { +static const char *const opcode_arg_table_simon2win[256] = { + " ", "I ", "I ", "I ", "I ", "I ", "I ", "II ", "II ", "II ", "II ", "B ", "B ", "BN ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BB ", "BB ", "II ", "II ", "N ", "I ", "I ", "I ", "IN ", "IB ", + "II ", "I ", "I ", "II ", "II ", "IBB ", "BIB ", "BB ", "B ", "BI ", "IB ", "B ", "B ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BN ", "BN ", "BB ", "BB ", "BN ", "BB ", "BN ", "B ", "I ", "IB ", + "IB ", "II ", "I ", "I ", "IN ", "B ", "T ", "T ", "NNNNNB ", "BT ", "BTS ", "T ", " ", "B ", + "N ", "IBN ", "I ", "I ", "I ", "NN ", " ", " ", "IT ", "II ", "I ", "B ", " ", "IB ", "IBB ", + "IIB ", "T ", " ", " ", "IB ", "IB ", "IB ", "B ", "BB ", "IBB ", "NB ", "N ", "NNBNNN ", "NN ", + " ", "BNNNNNN ", "B ", " ", "B ", "B ", "BB ", "NNNNNIN ", "N ", "N ", "N ", "NNN ", "NBNN ", + "IBNN ", "IB ", "IB ", "IB ", "IB ", "N ", "N ", "N ", "BI ", " ", " ", "N ", "I ", "IBB ", + "NNB ", "N ", "N ", "Ban ", "BB ", " ", " ", " ", " ", "IB ", "B ", " ", "II ", " ", "BI ", + "N ", "I ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "BI ", "BB ", "B ", "B ", "B ", + "B ", "IBB ", "IBN ", "IB ", "B ", "BNBN ", "BBTS ", "N ", " ", "Ian ", "B ", "B ", "B ", "B ", + "T ", "T ", "B ", " ", "I ", " ", " ", "BBI ", "NNBB ", "BBB ", " ", " ", " ", " ", "N ", "N ", + " ", " ", "BT ", " ", "B " +}; + +static const char *const opcode_arg_table_simon2dos[256] = { + " ", "I ", "I ", "I ", "I ", "I ", "I ", "II ", "II ", "II ", "II ", "B ", "B ", "BN ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BB ", "BB ", "II ", "II ", "N ", "I ", "I ", "I ", "IN ", "IB ", + "II ", "I ", "I ", "II ", "II ", "IBB ", "BIB ", "BB ", "B ", "BI ", "IB ", "B ", "B ", "BN ", + "BN ", "BN ", "BB ", "BB ", "BN ", "BN ", "BB ", "BB ", "BN ", "BB ", "BN ", "B ", "I ", "IB ", + "IB ", "II ", "I ", "I ", "IN ", "B ", "T ", "T ", "NNNNNB ", "BT ", "BT ", "T ", " ", "B ", + "N ", "IBN ", "I ", "I ", "I ", "NN ", " ", " ", "IT ", "II ", "I ", "B ", " ", "IB ", "IBB ", + "IIB ", "T ", " ", " ", "IB ", "IB ", "IB ", "B ", "BB ", "IBB ", "NB ", "N ", "NNBNNN ", "NN ", + " ", "BNNNNNN ", "B ", " ", "B ", "B ", "BB ", "NNNNNIN ", "N ", "N ", "N ", "NNN ", "NBNN ", + "IBNN ", "IB ", "IB ", "IB ", "IB ", "N ", "N ", "N ", "BI ", " ", " ", "N ", "I ", "IBB ", + "NNB ", "N ", "N ", "Ban ", "BB ", " ", " ", " ", " ", "IB ", "B ", " ", "II ", " ", "BI ", + "N ", "I ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "IB ", "BI ", "BB ", "B ", "B ", "B ", + "B ", "IBB ", "IBN ", "IB ", "B ", "BNBN ", "BBT ", "N ", " ", "Ian ", "B ", "B ", "B ", "B ", + "T ", "T ", "B ", " ", "I ", " ", " ", "BBI ", "NNBB ", "BBB ", " ", " ", " ", " ", "N ", "N ", + " ", " ", "BT ", " ", "B " +}; + +FILE *SimonState::fopen_maybe_lowercase(const char *filename) +{ FILE *in; char buf[256], dotbuf[256], *e; const char *s = _game_path; - strcpy(buf, s); strcat(buf, filename); - strcpy(dotbuf, buf); strcat(dotbuf, "."); // '.' appended version - // for dumb vfat drivers - + strcpy(buf, s); + strcat(buf, filename); + strcpy(dotbuf, buf); + strcat(dotbuf, "."); // '.' appended version + // for dumb vfat drivers + /* original filename */ in = fopen(buf, "rb"); - if (in) return in; + if (in) + return in; /* lowercase original filename */ - e = buf + strlen(s); do *e = tolower(*e); while(*e++); - in = fopen(buf, "rb"); - if (in) return in; + e = buf + strlen(s); + do + *e = tolower(*e); + while (*e++); + in = fopen(buf, "rb"); + if (in) + return in; if (strchr(buf, '.')) return NULL; /* dot appended original filename */ in = fopen(dotbuf, "rb"); - if (in) return in; + if (in) + return in; /* lowercase dot appended */ - e = dotbuf + strlen(s); do *e = tolower(*e); while(*e++); + e = dotbuf + strlen(s); + do + *e = tolower(*e); + while (*e++); in = fopen(dotbuf, "rb"); - return in; + return in; } -bool SimonState::loadGamePcFile(const char *filename) { +bool SimonState::loadGamePcFile(const char *filename) +{ FILE *in; int num_inited_objects; int i, file_size; /* read main gamepc file */ in = fopen_maybe_lowercase(filename); - if (in==NULL) return false; + if (in == NULL) + return false; num_inited_objects = allocGamePcVars(in); @@ -129,7 +153,7 @@ bool SimonState::loadGamePcFile(const char *filename) { loginPlayer(); readGamePcText(in); - for(i=2; i<num_inited_objects; i++) { + for (i = 2; i < num_inited_objects; i++) { readItemFromGamePc(in, _itemarray_ptr[i]); } @@ -139,12 +163,13 @@ bool SimonState::loadGamePcFile(const char *filename) { /* Read list of TABLE resources */ in = fopen_maybe_lowercase("TBLLIST"); - if (in==NULL) return false; + if (in == NULL) + return false; fseek(in, 0, SEEK_END); file_size = ftell(in); - _tbl_list = (byte*)malloc(file_size); + _tbl_list = (byte *)malloc(file_size); if (_tbl_list == NULL) error("Out of memory for strip table list"); fseek(in, 0, SEEK_SET); @@ -155,14 +180,15 @@ bool SimonState::loadGamePcFile(const char *filename) { _subroutine_list_org = _subroutine_list; _tablesheap_ptr_org = _tablesheap_ptr; _tablesheap_curpos_org = _tablesheap_curpos; - + /* Read list of TEXT resources */ in = fopen_maybe_lowercase("STRIPPED.TXT"); - if (in==NULL) return false; + if (in == NULL) + return false; fseek(in, 0, SEEK_END); file_size = ftell(in); - _stripped_txt_mem = (byte*)malloc(file_size); + _stripped_txt_mem = (byte *)malloc(file_size); if (_stripped_txt_mem == NULL) error("Out of memory for strip text list"); fseek(in, 0, SEEK_SET); @@ -172,12 +198,13 @@ bool SimonState::loadGamePcFile(const char *filename) { return true; } -void SimonState::readGamePcText(FILE *in) { +void SimonState::readGamePcText(FILE *in) +{ uint text_size; byte *text_mem; _text_size = text_size = fileReadBE32(in); - text_mem = (byte*)malloc(text_size); + text_mem = (byte *)malloc(text_size); if (text_mem == NULL) error("Out of text memory"); @@ -186,7 +213,8 @@ void SimonState::readGamePcText(FILE *in) { setupStringTable(text_mem, _stringtab_num); } -void SimonState::readItemFromGamePc(FILE *in, Item *item) { +void SimonState::readItemFromGamePc(FILE *in, Item *item) +{ uint32 type; item->unk2 = fileReadBE16(in); @@ -199,7 +227,7 @@ void SimonState::readItemFromGamePc(FILE *in, Item *item) { item->unk4 = fileReadBE16(in); item->children = NULL; - type = fileReadBE32(in); + type = fileReadBE32(in); while (type) { type = fileReadBE16(in); if (type != 0) @@ -207,7 +235,8 @@ void SimonState::readItemFromGamePc(FILE *in, Item *item) { } } -void SimonState::readItemChildren(FILE *in, Item *item, uint type) { +void SimonState::readItemChildren(FILE *in, Item *item, uint type) +{ if (type == 1) { uint fr1 = fileReadBE16(in); uint fr2 = fileReadBE16(in); @@ -216,36 +245,36 @@ void SimonState::readItemChildren(FILE *in, Item *item, uint type) { Child1 *child; size = CHILD1_SIZE; - for(i=0,j=fr2; i!=6; i++, j>>=2) - if (j&3) + for (i = 0, j = fr2; i != 6; i++, j >>= 2) + if (j & 3) size += sizeof(child->array[0]); - child = (Child1*)allocateChildBlock(item, 1, size); + child = (Child1 *)allocateChildBlock(item, 1, size); child->subroutine_id = fr1; child->fr2 = fr2; - for(i=k=0,j=fr2; i!=6; i++, j>>=2) - if (j&3) + for (i = k = 0, j = fr2; i != 6; i++, j >>= 2) + if (j & 3) child->array[k++] = (uint16)fileReadItemID(in); } else if (type == 2) { uint32 fr = fileReadBE32(in); - uint i,k,size; + uint i, k, size; Child2 *child; size = CHILD2_SIZE; - for(i=0; i!=16; i++) - if (fr & (1<<i)) + for (i = 0; i != 16; i++) + if (fr & (1 << i)) size += sizeof(child->array[0]); - child = (Child2*)allocateChildBlock(item, 2, size); + child = (Child2 *)allocateChildBlock(item, 2, size); child->avail_props = fr; k = 0; if (fr & 1) { child->array[k++] = (uint16)fileReadBE32(in); } - for(i=1; i!=16; i++) - if(fr & (1<<i)) + for (i = 1; i != 16; i++) + if (fr & (1 << i)) child->array[k++] = fileReadBE16(in); child->string_id = (uint16)fileReadBE32(in); @@ -254,25 +283,36 @@ void SimonState::readItemChildren(FILE *in, Item *item, uint type) { } } -uint fileReadItemID(FILE *in) { +uint fileReadItemID(FILE *in) +{ uint32 val = fileReadBE32(in); - if (val==0xFFFFFFFF) + if (val == 0xFFFFFFFF) return 0; return val + 2; } -byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) { - int i,l; +byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) +{ + int i, l; const char *string_ptr; uint val; - const char * const *table; - - switch(_game) { - case GAME_SIMON1WIN: table = opcode_arg_table_simon1win; break; - case GAME_SIMON2DOS: table = opcode_arg_table_simon2win; printf("right opcode table\n"); break; - case GAME_SIMON2WIN: table = opcode_arg_table_simon2win; break; - case GAME_SIMON1DOS: table = opcode_arg_table_simon1dos; break; + const char *const *table; + + switch (_game) { + case GAME_SIMON1WIN: + table = opcode_arg_table_simon1win; + break; + case GAME_SIMON2DOS: + table = opcode_arg_table_simon2win; + printf("right opcode table\n"); + break; + case GAME_SIMON2WIN: + table = opcode_arg_table_simon2win; + break; + case GAME_SIMON1DOS: + table = opcode_arg_table_simon1dos; + break; default: error("Invalid game specified"); } @@ -283,12 +323,12 @@ byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) { if (!string_ptr) error("Unable to locate opcode table. Perhaps you are using the wrong game target?"); - for(;;) { + for (;;) { if (string_ptr[i] == ' ') return ptr; l = string_ptr[i++]; - switch(l) { + switch (l) { case 'N': case 'S': case 'a': @@ -299,7 +339,7 @@ byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) { *ptr++ = val >> 8; *ptr++ = val & 255; break; - + case 'B': *ptr++ = fileReadByte(in); if (ptr[-1] == 0xFF) { @@ -309,12 +349,22 @@ byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) { case 'I': val = fileReadBE16(in); - switch(val) { - case 1: val = 0xFFFF; break; - case 3: val = 0xFFFD; break; - case 5: val = 0xFFFB; break; - case 7: val = 0xFFF9; break; - case 9: val = 0xFFF7; break; + switch (val) { + case 1: + val = 0xFFFF; + break; + case 3: + val = 0xFFFD; + break; + case 5: + val = 0xFFFB; + break; + case 7: + val = 0xFFF9; + break; + case 9: + val = 0xFFF7; + break; default: val = fileReadItemID(in);; } @@ -324,7 +374,7 @@ byte *SimonState::readSingleOpcode(FILE *in, byte *ptr) { case 'T': val = fileReadBE16(in); - switch(val) { + switch (val) { case 0: val = 0xFFFF; break; diff --git a/simon/simonsys.cpp b/simon/simonsys.cpp index 446059ab67..14a5585553 100644 --- a/simon/simonsys.cpp +++ b/simon/simonsys.cpp @@ -22,53 +22,58 @@ #include "stdafx.h" #include "simon.h" -uint fileReadByte(FILE *in) { +uint fileReadByte(FILE *in) +{ byte b; fread(&b, sizeof(b), 1, in); return b; } -uint fileReadBE16(FILE *in) { +uint fileReadBE16(FILE *in) +{ byte b[2]; fread(b, sizeof(b), 1, in); - return (b[0]<<8) | b[1]; + return (b[0] << 8) | b[1]; } -uint fileReadLE16(FILE *in) { +uint fileReadLE16(FILE *in) +{ byte b[2]; fread(b, sizeof(b), 1, in); - return (b[1]<<8) | b[0]; + return (b[1] << 8) | b[0]; } -uint32 fileReadBE32(FILE *in) { +uint32 fileReadBE32(FILE *in) +{ byte b[4]; fread(b, sizeof(b), 1, in); - return (b[0]<<24)|(b[1]<<16)|(b[2]<<8)|b[3]; + return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; } -uint32 fileReadLE32(FILE *in) { +uint32 fileReadLE32(FILE *in) +{ byte b[4]; fread(b, sizeof(b), 1, in); - return (b[3]<<24)|(b[2]<<16)|(b[1]<<8)|b[0]; + return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0]; } -void fileWriteBE32(FILE *in, uint32 value) { - value = TO_BE_32(value); +void fileWriteBE32(FILE *in, uint32 value) +{ + value = TO_BE_32(value); fwrite(&value, sizeof(value), 1, in); } -void fileWriteBE16(FILE *in, uint16 value) { +void fileWriteBE16(FILE *in, uint16 value) +{ value = TO_BE_16(value); fwrite(&value, sizeof(value), 1, in); } - - - #ifndef WIN32 /* GetAsyncKeyState for unix */ -int GetAsyncKeyState(int key) { +int GetAsyncKeyState(int key) +{ return 0; } #endif diff --git a/simon/simonverb.cpp b/simon/simonverb.cpp index 29918be49b..dfd69deffb 100644 --- a/simon/simonverb.cpp +++ b/simon/simonverb.cpp @@ -23,18 +23,19 @@ #include "stdafx.h" #include "simon.h" -void SimonState::defocusHitarea() { +void SimonState::defocusHitarea() +{ HitArea *last; HitArea *ha; if ((_game == GAME_SIMON2WIN) || (_game == GAME_SIMON2DOS)) { - if (_bit_array[4]&0x8000) { + if (_bit_array[4] & 0x8000) { o_unk_120(202); _last_hitarea_2_ptr = NULL; return; } } - + last = _hitarea_ptr_5; if (last == _hitarea_ptr_7) @@ -44,12 +45,11 @@ void SimonState::defocusHitarea() { _hitarea_ptr_7 = last; if (last != NULL && _hitarea_unk_6 && - (ha = findHitAreaByID(200)) && (ha->flags&0x40) && - !(last->flags&0x40)) - focusVerb(last->id); + (ha = findHitAreaByID(200)) && (ha->flags & 0x40) && !(last->flags & 0x40)) + focusVerb(last->id); } -static const char * const verb_names[] = { +static const char *const verb_names[] = { "Walk to", "Look at", "Open", @@ -66,50 +66,53 @@ static const char * const verb_names[] = { "Give" }; -static const char * const verb_prep_names[] = { - "","","","", - "","","","with what ?", - "","","","to whom ?" +static const char *const verb_prep_names[] = { + "", "", "", "", + "", "", "", "with what ?", + "", "", "", "to whom ?" }; -void SimonState::focusVerb(uint hitarea_id) { +void SimonState::focusVerb(uint hitarea_id) +{ uint x; const char *txt; hitarea_id -= 101; CHECK_BOUNDS(hitarea_id, verb_prep_names); - + if (_show_preposition) { txt = verb_prep_names[hitarea_id]; } else { txt = verb_names[hitarea_id]; } x = (53 - strlen(txt)) * 3; - showActionString(x, (const byte*)txt); + showActionString(x, (const byte *)txt); } -void SimonState::showActionString(uint x, const byte *string) { +void SimonState::showActionString(uint x, const byte *string) +{ FillOrCopyStruct *fcs; fcs = _fcs_ptr_array_3[1]; - if (fcs == NULL || fcs->text_color==0) + if (fcs == NULL || fcs->text_color == 0) return; fcs->unk1 = x >> 3; fcs->unk3 = x & 7; - for(;*string;string++) + for (; *string; string++) video_putchar(fcs, *string); } -void SimonState::hitareaChangedHelper() { +void SimonState::hitareaChangedHelper() +{ FillOrCopyStruct *fcs; if ((_game == GAME_SIMON2WIN) || (_game == GAME_SIMON2WIN)) { - if (_bit_array[4]&0x8000) + if (_bit_array[4] & 0x8000) return; } @@ -121,35 +124,39 @@ void SimonState::hitareaChangedHelper() { _hitarea_ptr_7 = NULL; } -HitArea *SimonState::findHitAreaByID(uint hitarea_id) { +HitArea *SimonState::findHitAreaByID(uint hitarea_id) +{ HitArea *ha = _hit_areas; uint count = ARRAYSIZE(_hit_areas); - - do{ + + do { if (ha->id == hitarea_id) return ha; - } while(ha++,--count); + } while (ha++, --count); return NULL; } -HitArea *SimonState::findEmptyHitArea() { +HitArea *SimonState::findEmptyHitArea() +{ HitArea *ha = _hit_areas; uint count = ARRAYSIZE(_hit_areas); - - do{ + + do { if (ha->flags == 0) return ha; - } while(ha++,--count); + } while (ha++, --count); return NULL; } -void SimonState::clear_hitarea_bit_0x40(uint hitarea) { +void SimonState::clear_hitarea_bit_0x40(uint hitarea) +{ HitArea *ha = findHitAreaByID(hitarea); if (ha != NULL) ha->flags &= ~0x40; } -void SimonState::set_hitarea_bit_0x40(uint hitarea) { +void SimonState::set_hitarea_bit_0x40(uint hitarea) +{ HitArea *ha = findHitAreaByID(hitarea); if (ha != NULL) { ha->flags |= 0x40; @@ -159,7 +166,8 @@ void SimonState::set_hitarea_bit_0x40(uint hitarea) { } } -void SimonState::set_hitarea_x_y(uint hitarea, int x, int y) { +void SimonState::set_hitarea_x_y(uint hitarea, int x, int y) +{ HitArea *ha = findHitAreaByID(hitarea); if (ha != NULL) { ha->x = x; @@ -167,7 +175,8 @@ void SimonState::set_hitarea_x_y(uint hitarea, int x, int y) { } } -void SimonState::delete_hitarea(uint hitarea) { +void SimonState::delete_hitarea(uint hitarea) +{ HitArea *ha = findHitAreaByID(hitarea); if (ha != NULL) { ha->flags = 0; @@ -177,16 +186,18 @@ void SimonState::delete_hitarea(uint hitarea) { } } -bool SimonState::is_hitarea_0x40_clear(uint hitarea) { +bool SimonState::is_hitarea_0x40_clear(uint hitarea) +{ HitArea *ha = findHitAreaByID(hitarea); if (ha == NULL) return false; return (ha->flags & 0x40) == 0; } -void SimonState::addNewHitArea(int id, int x, int y, int width, int height, - int flags, int unk3,Item *item_ptr) { - +void SimonState::addNewHitArea(int id, int x, int y, int width, int height, + int flags, int unk3, Item *item_ptr) +{ + HitArea *ha; delete_hitarea(id); @@ -203,13 +214,14 @@ void SimonState::addNewHitArea(int id, int x, int y, int width, int height, _need_hitarea_recalc++; } -void SimonState::hitarea_proc_1() { +void SimonState::hitarea_proc_1() +{ uint id; HitArea *ha; if (_game & GAME_SIMON2) { - id=2; - if (!(_bit_array[4]&0x8000)) + id = 2; + if (!(_bit_array[4] & 0x8000)) id = (_mouse_y >= 136) ? 102 : 101; } else { id = (_mouse_y >= 136) ? 102 : 101; @@ -231,10 +243,11 @@ void SimonState::hitarea_proc_1() { } } -void SimonState::handle_verb_hitarea(HitArea *ha) { +void SimonState::handle_verb_hitarea(HitArea * ha) +{ HitArea *tmp = _hitarea_ptr_5; - if (ha == tmp) + if (ha == tmp) return; if (!(_game & GAME_SIMON2)) { @@ -248,10 +261,10 @@ void SimonState::handle_verb_hitarea(HitArea *ha) { else video_toggle_colors(ha, 0xdf, 0xda, 0xda, 0xA); - ha->flags &= ~ (2 + 8); + ha->flags &= ~(2 + 8); } else { - if (ha->id<101) + if (ha->id < 101) return; _mouse_cursor = ha->id - 101; _need_hitarea_recalc++; @@ -261,7 +274,8 @@ void SimonState::handle_verb_hitarea(HitArea *ha) { _hitarea_ptr_5 = ha; } -void SimonState::hitarea_leave(HitArea *ha) { +void SimonState::hitarea_leave(HitArea * ha) +{ if (!(_game & GAME_SIMON2)) { video_toggle_colors(ha, 0xdf, 0xd5, 0xda, 5); } else { @@ -269,13 +283,15 @@ void SimonState::hitarea_leave(HitArea *ha) { } } -void SimonState::leaveHitAreaById(uint hitarea_id) { +void SimonState::leaveHitAreaById(uint hitarea_id) +{ HitArea *ha = findHitAreaByID(hitarea_id); if (ha) hitarea_leave(ha); } -void SimonState::handle_unk2_hitarea(FillOrCopyStruct *fcs) { +void SimonState::handle_unk2_hitarea(FillOrCopyStruct *fcs) +{ uint index; index = get_fcs_ptr_3_index(fcs); @@ -284,27 +300,27 @@ void SimonState::handle_unk2_hitarea(FillOrCopyStruct *fcs) { return; lock(); - fcs_unk_proc_1(index, fcs->fcs_data->item_ptr, - fcs->fcs_data->unk1-1, fcs->fcs_data->unk2); + fcs_unk_proc_1(index, fcs->fcs_data->item_ptr, fcs->fcs_data->unk1 - 1, fcs->fcs_data->unk2); unlock(); } -void SimonState::handle_unk_hitarea(FillOrCopyStruct *fcs) { +void SimonState::handle_unk_hitarea(FillOrCopyStruct *fcs) +{ uint index; index = get_fcs_ptr_3_index(fcs); lock(); - fcs_unk_proc_1(index, fcs->fcs_data->item_ptr, - fcs->fcs_data->unk1+1, fcs->fcs_data->unk2); + fcs_unk_proc_1(index, fcs->fcs_data->item_ptr, fcs->fcs_data->unk1 + 1, fcs->fcs_data->unk2); unlock(); } -void SimonState::setup_hitarea_from_pos(uint x, uint y, uint mode) { +void SimonState::setup_hitarea_from_pos(uint x, uint y, uint mode) +{ HitArea *best_ha; if (_game & GAME_SIMON2) { - if (_bit_array[4]&0x8000 || y < 134) { + if (_bit_array[4] & 0x8000 || y < 134) { x += _x_scroll * 8; } } @@ -318,25 +334,24 @@ void SimonState::setup_hitarea_from_pos(uint x, uint y, uint mode) { best_ha = NULL; - do{ + do { if (ha->flags & 0x20) { if (!(ha->flags & 0x40)) { - if (x_ >= ha->x && y_ >= ha->y && - x_ - ha->x < ha->width && y_- ha->y < ha->height && - layer <= ha->layer) { - layer = ha->layer; - best_ha = ha; + if (x_ >= ha->x && y_ >= ha->y && + x_ - ha->x < ha->width && y_ - ha->y < ha->height && layer <= ha->layer) { + layer = ha->layer; + best_ha = ha; } else { if (ha->flags & 2) { hitarea_leave(ha); - ha->flags &=~2; + ha->flags &= ~2; } } } else { ha->flags &= ~2; } } - } while(ha++,--count); + } while (ha++, --count); } if (best_ha == NULL) { @@ -350,13 +365,13 @@ void SimonState::setup_hitarea_from_pos(uint x, uint y, uint mode) { _variableArray[2] = y; } - if (best_ha->flags&4) { + if (best_ha->flags & 4) { defocusHitarea(); } else if (best_ha != _last_hitarea_2_ptr) { new_current_hitarea(best_ha); } - if (best_ha->flags&8 && !(best_ha->flags&2)) { + if (best_ha->flags & 8 && !(best_ha->flags & 2)) { hitarea_leave(best_ha); best_ha->flags |= 2; } @@ -364,26 +379,28 @@ void SimonState::setup_hitarea_from_pos(uint x, uint y, uint mode) { return; } -void SimonState::new_current_hitarea(HitArea *ha) { +void SimonState::new_current_hitarea(HitArea * ha) +{ bool result; hitareaChangedHelper(); if (ha->flags & 1) { - result = hitarea_proc_2(ha->flags>>8); + result = hitarea_proc_2(ha->flags >> 8); } else { result = hitarea_proc_3(ha->item_ptr); - } + } if (result) _last_hitarea_2_ptr = ha; } -bool SimonState::hitarea_proc_2(uint a) { +bool SimonState::hitarea_proc_2(uint a) +{ uint x; const byte *string_ptr; if (_game & GAME_SIMON2) { - if (_bit_array[4]&0x8000) { + if (_bit_array[4] & 0x8000) { Subroutine *sub; _variableArray[84] = a; sub = getSubroutineByID(5003); @@ -397,18 +414,19 @@ bool SimonState::hitarea_proc_2(uint a) { return false; string_ptr = getStringPtrByID(_stringid_array_2[a]); - x = (53 - (strlen((const char*)string_ptr) - 1)) * 3; + x = (53 - (strlen((const char *)string_ptr) - 1)) * 3; showActionString(x, string_ptr); return true; } -bool SimonState::hitarea_proc_3(Item *item) { +bool SimonState::hitarea_proc_3(Item *item) +{ Child2 *child2; uint x; const byte *string_ptr; - if (item == 0 || item==&_dummy_item_2 || item == &_dummy_item_3) + if (item == 0 || item == &_dummy_item_2 || item == &_dummy_item_3) return false; child2 = findChildOfType2(item); @@ -416,8 +434,7 @@ bool SimonState::hitarea_proc_3(Item *item) { return false; string_ptr = getStringPtrByID(child2->string_id); - x = (53 - (strlen((const char*)string_ptr) - 1)) * 3; + x = (53 - (strlen((const char *)string_ptr) - 1)) * 3; showActionString(x, string_ptr); return true; } - diff --git a/simon/simonvga.cpp b/simon/simonvga.cpp index c188b75513..c5a534968f 100644 --- a/simon/simonvga.cpp +++ b/simon/simonvga.cpp @@ -23,101 +23,102 @@ #include "stdafx.h" #include "simon.h" -typedef void (SimonState::*VgaOpcodeProc)(); +typedef void (SimonState::*VgaOpcodeProc) (); static const uint16 vc_get_out_of_code = 0; // Opcode tables static const VgaOpcodeProc vga_opcode_table[] = { - NULL, - &SimonState::vc_1, - &SimonState::vc_2, - &SimonState::vc_3, - &SimonState::vc_4, - &SimonState::vc_5, - &SimonState::vc_6_maybe_skip_3_inv, - &SimonState::vc_7_maybe_skip_3, - &SimonState::vc_8_maybe_skip_2, - &SimonState::vc_9_maybe_skip, - &SimonState::vc_10, - &SimonState::vc_11_clear_pathfind_array, - &SimonState::vc_12_sleep_variable, - &SimonState::vc_13_offset_x, - &SimonState::vc_14_offset_y, - &SimonState::vc_15_start_funkystruct_by_id, - &SimonState::vc_16_setup_funkystruct, - &SimonState::vc_17_set_pathfind_item, - &SimonState::vc_18_jump_rel, - &SimonState::vc_19, - &SimonState::vc_20, - &SimonState::vc_21, - &SimonState::vc_22, - &SimonState::vc_23_set_pri, - &SimonState::vc_24_set_image_xy, - &SimonState::vc_25_del_sprite_and_get_out, - &SimonState::vc_26, - &SimonState::vc_27_reset, - &SimonState::vc_28, - &SimonState::vc_29_stop_all_sounds, - &SimonState::vc_30_set_base_delay, - &SimonState::vc_31_set_palette_mode, - &SimonState::vc_32_copy_var, - &SimonState::vc_33, - &SimonState::vc_34, - &SimonState::vc_35, - &SimonState::vc_36, - &SimonState::vc_37_sprite_unk3_add, - &SimonState::vc_38_skip_if_var_zero, - &SimonState::vc_39_set_var, - &SimonState::vc_40_var_add, - &SimonState::vc_41_var_sub, - &SimonState::vc_42_delay_if_not_eq, - &SimonState::vc_43_skip_if_bit_clear, - &SimonState::vc_44_skip_if_bit_set, - &SimonState::vc_45_set_x, - &SimonState::vc_46_set_y, - &SimonState::vc_47_add_var_f, - &SimonState::vc_48, - &SimonState::vc_49_set_bit, - &SimonState::vc_50_clear_bit, - &SimonState::vc_51_clear_hitarea_bit_0x40, - &SimonState::vc_52, - &SimonState::vc_53_no_op, - &SimonState::vc_54_no_op, - &SimonState::vc_55_offset_hit_area, - &SimonState::vc_56_no_op, - &SimonState::vc_57_no_op, - &SimonState::vc_58, - &SimonState::vc_59, - &SimonState::vc_60, - &SimonState::vc_61_sprite_change, - &SimonState::vc_62, - &SimonState::vc_63, - - &SimonState::vc_64, - &SimonState::vc_65, - &SimonState::vc_66, - &SimonState::vc_67, - &SimonState::vc_68, - &SimonState::vc_69, - &SimonState::vc_70, - &SimonState::vc_71, - &SimonState::vc_72, - &SimonState::vc_73, - &SimonState::vc_74, + NULL, + &SimonState::vc_1, + &SimonState::vc_2, + &SimonState::vc_3, + &SimonState::vc_4, + &SimonState::vc_5, + &SimonState::vc_6_maybe_skip_3_inv, + &SimonState::vc_7_maybe_skip_3, + &SimonState::vc_8_maybe_skip_2, + &SimonState::vc_9_maybe_skip, + &SimonState::vc_10, + &SimonState::vc_11_clear_pathfind_array, + &SimonState::vc_12_sleep_variable, + &SimonState::vc_13_offset_x, + &SimonState::vc_14_offset_y, + &SimonState::vc_15_start_funkystruct_by_id, + &SimonState::vc_16_setup_funkystruct, + &SimonState::vc_17_set_pathfind_item, + &SimonState::vc_18_jump_rel, + &SimonState::vc_19, + &SimonState::vc_20, + &SimonState::vc_21, + &SimonState::vc_22, + &SimonState::vc_23_set_pri, + &SimonState::vc_24_set_image_xy, + &SimonState::vc_25_del_sprite_and_get_out, + &SimonState::vc_26, + &SimonState::vc_27_reset, + &SimonState::vc_28, + &SimonState::vc_29_stop_all_sounds, + &SimonState::vc_30_set_base_delay, + &SimonState::vc_31_set_palette_mode, + &SimonState::vc_32_copy_var, + &SimonState::vc_33, + &SimonState::vc_34, + &SimonState::vc_35, + &SimonState::vc_36, + &SimonState::vc_37_sprite_unk3_add, + &SimonState::vc_38_skip_if_var_zero, + &SimonState::vc_39_set_var, + &SimonState::vc_40_var_add, + &SimonState::vc_41_var_sub, + &SimonState::vc_42_delay_if_not_eq, + &SimonState::vc_43_skip_if_bit_clear, + &SimonState::vc_44_skip_if_bit_set, + &SimonState::vc_45_set_x, + &SimonState::vc_46_set_y, + &SimonState::vc_47_add_var_f, + &SimonState::vc_48, + &SimonState::vc_49_set_bit, + &SimonState::vc_50_clear_bit, + &SimonState::vc_51_clear_hitarea_bit_0x40, + &SimonState::vc_52, + &SimonState::vc_53_no_op, + &SimonState::vc_54_no_op, + &SimonState::vc_55_offset_hit_area, + &SimonState::vc_56_no_op, + &SimonState::vc_57_no_op, + &SimonState::vc_58, + &SimonState::vc_59, + &SimonState::vc_60, + &SimonState::vc_61_sprite_change, + &SimonState::vc_62, + &SimonState::vc_63, + &SimonState::vc_64, + &SimonState::vc_65, + &SimonState::vc_66, + &SimonState::vc_67, + &SimonState::vc_68, + &SimonState::vc_69, + &SimonState::vc_70, + &SimonState::vc_71, + &SimonState::vc_72, + &SimonState::vc_73, + &SimonState::vc_74, }; // Script parser -void SimonState::run_vga_script() { - for(;;) { +void SimonState::run_vga_script() +{ + for (;;) { uint opcode; #ifdef DUMP_CONTINOUS_VGASCRIPT - if ((void*)_vc_ptr != (void*)&vc_get_out_of_code) { -// 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); -// } + if ((void *)_vc_ptr != (void *)&vc_get_out_of_code) { +// 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 @@ -134,34 +135,38 @@ void SimonState::run_vga_script() { if (opcode == 0) return; - (this->*vga_opcode_table[opcode])(); + (this->*vga_opcode_table[opcode]) (); } } -int SimonState::vc_read_var_or_word() { +int SimonState::vc_read_var_or_word() +{ int16 var = vc_read_next_word(); if (var < 0) var = vc_read_var(-var); return var; } -uint SimonState::vc_read_next_word() { +uint SimonState::vc_read_next_word() +{ uint a = READ_BE_UINT16_UNALIGNED(_vc_ptr); _vc_ptr += 2; return a; } -uint SimonState::vc_read_next_byte() { +uint SimonState::vc_read_next_byte() +{ return *_vc_ptr++; } -void SimonState::vc_skip_next_instruction() { +void SimonState::vc_skip_next_instruction() +{ static const byte opcode_param_len_simon1[] = { - 0, 6, 2,10, 6, 4, 2, 2, - 4, 4,10, 0, 2, 2, 2, 2, + 0, 6, 2, 10, 6, 4, 2, 2, + 4, 4, 10, 0, 2, 2, 2, 2, 2, 0, 2, 0, 4, 2, 4, 2, - 8, 0,10, 0, 8, 0, 2, 2, + 8, 0, 10, 0, 8, 0, 2, 2, 4, 0, 0, 4, 4, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2, 4, 0, 2, 2, 2, 2, 4, 6, 6, @@ -190,11 +195,12 @@ void SimonState::vc_skip_next_instruction() { } #ifdef DUMP_CONTINOUS_VGASCRIPT - fprintf(_dump_file,"; skipped\n"); + fprintf(_dump_file, "; skipped\n"); #endif } -void SimonState::o_read_vgares_23() { // Simon1 Only +void SimonState::o_read_vgares_23() +{ // Simon1 Only if (_vga_res_328_loaded == true) { _vga_res_328_loaded = false; _lock_word |= 0x4000; @@ -203,7 +209,8 @@ void SimonState::o_read_vgares_23() { // Simon1 Only } } -void SimonState::o_read_vgares_328() { // Simon1 Only +void SimonState::o_read_vgares_328() +{ // Simon1 Only if (_vga_res_328_loaded == false) { _vga_res_328_loaded = true; _lock_word |= 0x4000; @@ -214,24 +221,26 @@ void SimonState::o_read_vgares_328() { // Simon1 Only // VGA Script commands -void SimonState::vc_1() { +void SimonState::vc_1() +{ /* dummy opcode */ _vc_ptr += 6; } -void SimonState::vc_2() { +void SimonState::vc_2() +{ VgaPointersEntry *vpe; uint num; uint res; byte *old_file_1, *old_file_2; - byte *b,*bb, *vc_ptr_org; + byte *b, *bb, *vc_ptr_org; num = vc_read_var_or_word(); old_file_1 = _cur_vga_file_1; old_file_2 = _cur_vga_file_2; - for(;;) { + for (;;) { res = num / 100; vpe = &_vga_buffer_pointers[res]; @@ -244,57 +253,59 @@ void SimonState::vc_2() { ensureVgaResLoaded(res); _video_var_7 = 0xFFFF; - } + } + - bb = _cur_vga_file_1; - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)bb)->hdr2_start); - b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)b)->unk2_offs); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) bb)->hdr2_start); + b = bb + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) b)->unk2_offs); - while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->id) != num) + while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->id) != num) b += sizeof(VgaFile1Struct0x8); vc_ptr_org = _vc_ptr; - _vc_ptr = _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8*)b)->script_offs); - - -// dump_vga_script(_vc_ptr, res, num); + _vc_ptr = _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x8 *) b)->script_offs); + + +// dump_vga_script(_vc_ptr, res, num); run_vga_script(); - + _cur_vga_file_1 = old_file_1; _cur_vga_file_2 = old_file_2; _vc_ptr = vc_ptr_org; } -void SimonState::vc_3() { - uint16 a,b,c,d,e,f; +void SimonState::vc_3() +{ + uint16 a, b, c, d, e, f; uint16 res; VgaSprite *vsp; VgaPointersEntry *vpe; - byte *p,*pp; + byte *p, *pp; - a = vc_read_next_word(); /* 0 */ + a = vc_read_next_word(); /* 0 */ if (_game & GAME_SIMON2) { - f = vc_read_next_word(); /* 0 */ - b = vc_read_next_word(); /* 2 */ + f = vc_read_next_word(); /* 0 */ + b = vc_read_next_word(); /* 2 */ } else { - b = vc_read_next_word(); /* 2 */ + b = vc_read_next_word(); /* 2 */ f = b / 100; } - c = vc_read_next_word(); /* 4 */ - d = vc_read_next_word(); /* 6 */ - e = vc_read_next_word(); /* 8 */ + c = vc_read_next_word(); /* 4 */ + d = vc_read_next_word(); /* 6 */ + e = vc_read_next_word(); /* 8 */ /* 2nd param ignored with simon1 */ - if (has_vgastruct_with_id(b,f)) + if (has_vgastruct_with_id(b, f)) return; vsp = _vga_sprites; - while (vsp->id) vsp++; + while (vsp->id) + vsp++; vsp->base_color = e; vsp->unk6 = a; @@ -306,7 +317,7 @@ void SimonState::vc_3() { vsp->id = b; vsp->unk7 = res = f; - for(;;) { + for (;;) { vpe = &_vga_buffer_pointers[res]; _cur_vga_file_1 = vpe->vgaFile1; @@ -320,78 +331,85 @@ void SimonState::vc_3() { } pp = _cur_vga_file_1; - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header*)pp)->hdr2_start); - p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2*)p)->id_table); - - while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->id) != b) + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header *) pp)->hdr2_start); + p = pp + READ_BE_UINT16_UNALIGNED(&((VgaFile1Header2 *) p)->id_table); + + while (READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->id) != b) p += sizeof(VgaFile1Struct0x6); #ifdef DUMP_FILE_NR -{ - static bool dumped=false; - if (res == DUMP_FILE_NR && !dumped) { - dumped = true; - dump_vga_file(_cur_vga_file_1); + { + static bool dumped = false; + if (res == DUMP_FILE_NR && !dumped) { + dumped = true; + dump_vga_file(_cur_vga_file_1); + } } -} #endif #ifdef DUMP_BITMAPS_FILE_NR -{ - static bool dumped=false; - if (res == DUMP_BITMAPS_FILE_NR && !dumped) { - dumped = true; - dump_vga_bitmaps(_cur_vga_file_2, _cur_vga_file_1, res); + { + static bool dumped = false; + if (res == DUMP_BITMAPS_FILE_NR && !dumped) { + dumped = true; + dump_vga_bitmaps(_cur_vga_file_2, _cur_vga_file_1, res); + } } -} #endif -// dump_vga_script(_cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs), res, b); +// dump_vga_script(_cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs), res, b); - add_vga_timer(gss->VGA_DELAY_BASE, - _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6*)p)->script_offs),b , res); + add_vga_timer(gss->VGA_DELAY_BASE, + _cur_vga_file_1 + READ_BE_UINT16_UNALIGNED(&((VgaFile1Struct0x6 *) p)->script_offs), + b, res); } -void SimonState::vc_4() { +void SimonState::vc_4() +{ /* dummy opcode */ _vc_ptr += 6; } -void SimonState::vc_5() { +void SimonState::vc_5() +{ uint var = vc_read_next_word(); uint value = vc_read_next_word(); if (vc_read_var(var) != value) vc_skip_next_instruction(); } -void SimonState::vc_6_maybe_skip_3_inv() { +void SimonState::vc_6_maybe_skip_3_inv() +{ if (!vc_maybe_skip_proc_3(vc_read_next_word())) vc_skip_next_instruction(); } -void SimonState::vc_7_maybe_skip_3() { +void SimonState::vc_7_maybe_skip_3() +{ if (vc_maybe_skip_proc_3(vc_read_next_word())) vc_skip_next_instruction(); } -void SimonState::vc_8_maybe_skip_2() { +void SimonState::vc_8_maybe_skip_2() +{ uint a = vc_read_next_word(); uint b = vc_read_next_word(); - if (!vc_maybe_skip_proc_2(a,b)) + if (!vc_maybe_skip_proc_2(a, b)) vc_skip_next_instruction(); } -void SimonState::vc_9_maybe_skip() { +void SimonState::vc_9_maybe_skip() +{ uint a = vc_read_next_word(); uint b = vc_read_next_word(); - if (!vc_maybe_skip_proc_1(a,b)) + if (!vc_maybe_skip_proc_1(a, b)) vc_skip_next_instruction(); } struct VC10_state { int image; uint16 e; - int x,y; + int x, y; byte base_color; @@ -404,7 +422,7 @@ struct VC10_state { byte *surf_addr; uint surf_pitch; - byte dl,dh; + byte dl, dh; byte *depack_src; int8 depack_cont; @@ -412,7 +430,8 @@ struct VC10_state { byte depack_dest[200]; }; -byte *vc_10_depack_column(VC10_state *vs) { +byte *vc_10_depack_column(VC10_state * vs) +{ int8 a = vs->depack_cont; byte *src = vs->depack_src; byte *dst = vs->depack_dest; @@ -422,30 +441,30 @@ byte *vc_10_depack_column(VC10_state *vs) { if (a != -0x80) goto start_here; - for(;;) { + for (;;) { a = *src++; -start_here:; - if (a>=0) { + start_here:; + if (a >= 0) { color = *src++; do { *dst++ = color; if (!--dh) { - if (--a<0) + if (--a < 0) a = -0x80; else src--; goto get_out; } - } while(--a>=0); + } while (--a >= 0); } else { do { *dst++ = *src++; if (!--dh) { - if (++a==0) + if (++a == 0) a = -0x80; goto get_out; } - } while (++a!=0); + } while (++a != 0); } } @@ -455,16 +474,18 @@ get_out:; return vs->depack_dest + vs->y_skip; } -void vc_10_skip_cols(VC10_state *vs) { +void vc_10_skip_cols(VC10_state * vs) +{ vs->depack_cont = -0x80; - while(vs->x_skip) { + while (vs->x_skip) { vc_10_depack_column(vs); vs->x_skip--; } } -byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) { - w<<=3; +byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) +{ + w <<= 3; { byte *dst_org = _video_buf_1 + w; @@ -475,11 +496,11 @@ byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) { do { byte *dst = dst_org; uint h_cur = h; - + if (cur == -0x80) cur = *src++; - - for(;;) { + + for (;;) { if (cur >= 0) { /* rle_same */ color = *src++; @@ -487,13 +508,13 @@ byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) { *dst = color; dst += w; if (!--h_cur) { - if (--cur<0) + if (--cur < 0) cur = -0x80; else src--; goto next_line; } - } while (--cur>=0); + } while (--cur >= 0); } else { /* rle_diff */ do { @@ -508,22 +529,22 @@ byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) { } cur = *src++; } - next_line: + next_line: dst_org++; - } while(--w_cur); + } while (--w_cur); } { byte *dst_org, *src_org; uint i; - + src_org = dst_org = _video_buf_1 + w; do { byte *dst = dst_org; - for(i=0; i!=w; ++i) { + for (i = 0; i != w; ++i) { byte b = src_org[i]; - b = (b>>4) | (b<<4); + b = (b >> 4) | (b << 4); *--dst = b; } @@ -537,54 +558,56 @@ byte *SimonState::vc_10_depack_swap(byte *src, uint w, uint h) { } -byte *vc_10_no_depack_swap(byte *src) { +byte *vc_10_no_depack_swap(byte *src) +{ error("vc_10_no_depack_swap unimpl"); } /* must not be const */ static uint16 _video_windows[128] = { 0, 0, 20, 200, - 0, 0, 3, 136, - 17,0, 3, 136, + 0, 0, 3, 136, + 17, 0, 3, 136, 0, 0, 20, 200, 0, 0, 20, 134 }; /* simon2 specific */ -void SimonState::vc_10_helper_8(byte *dst, byte *src) { +void SimonState::vc_10_helper_8(byte *dst, byte *src) +{ const uint pitch = _dx_surface_pitch; int8 reps = (int8)0x80; byte color; byte *dst_org = dst; uint h = _vga_var5, w = 8; - - for(;;) { + + for (;;) { reps = *src++; if (reps >= 0) { color = *src++; - - do { + + do { *dst = color; dst += pitch; /* reached bottom? */ if (--h == 0) { - /* reached right edge? */ + /* reached right edge? */ if (--w == 0) return; dst = ++dst_org; h = _vga_var5; } - } while (--reps >=0); + } while (--reps >= 0); } else { - - do { + + do { *dst = *src++; dst += pitch; /* reached bottom? */ if (--h == 0) { - /* reached right edge? */ + /* reached right edge? */ if (--w == 0) return; dst = ++dst_org; @@ -595,23 +618,24 @@ void SimonState::vc_10_helper_8(byte *dst, byte *src) { } } -void SimonState::vc_10() { +void SimonState::vc_10() +{ byte *p2; - uint width,height; + uint width, height; byte flags; const uint16 *vlut; VC10_state state; - + int cur; state.image = (int16)vc_read_next_word(); - if (state.image==0) + if (state.image == 0) return; -// if (_vga_cur_sprite_id != 802) -// return; +// if (_vga_cur_sprite_id != 802) +// return; - state.base_color = (_vc_ptr[1]<<4); + state.base_color = (_vc_ptr[1] << 4); _vc_ptr += 2; state.x = (int16)vc_read_next_word(); if (_game & GAME_SIMON2) { @@ -629,37 +653,38 @@ void SimonState::vc_10() { state.image = vc_read_var(-state.image); p2 = _cur_vga_file_2 + state.image * 8; - state.depack_src = _cur_vga_file_2 + READ_BE_UINT32_UNALIGNED(&*(uint32*)p2); + state.depack_src = _cur_vga_file_2 + READ_BE_UINT32_UNALIGNED(&*(uint32 *)p2); - width = READ_BE_UINT16_UNALIGNED(p2+6)>>4; + width = READ_BE_UINT16_UNALIGNED(p2 + 6) >> 4; height = p2[5]; flags = p2[4]; - if (height==0 || width==0) + if (height == 0 || width == 0) return; #ifdef DUMP_DRAWN_BITMAPS - dump_single_bitmap(_vga_cur_file_id, state.image, state.depack_src, width*16, height, state.base_color); + dump_single_bitmap(_vga_cur_file_id, state.image, state.depack_src, width * 16, height, + state.base_color); #endif - if (flags&0x80 && !(state.e&0x10)) { - if (state.e&1) { - state.e&=~1; - state.e|=0x10; + if (flags & 0x80 && !(state.e & 0x10)) { + if (state.e & 1) { + state.e &= ~1; + state.e |= 0x10; } else { - state.e|=0x8; + state.e |= 0x8; } } - if (_game & GAME_SIMON2 && width>=21) { - byte *src,*dst; + if (_game & GAME_SIMON2 && width >= 21) { + byte *src, *dst; uint w; - _vga_var1 = width*2-40; + _vga_var1 = width * 2 - 40; _vga_var7 = state.depack_src; _vga_var5 = height; - if (_variableArray[34]==-1) - state.x = _variableArray[502/2]; + if (_variableArray[34] == -1) + state.x = _variableArray[502 / 2]; _x_scroll = state.x; @@ -667,69 +692,73 @@ void SimonState::vc_10() { dst = dx_lock_attached(); src = state.depack_src + _x_scroll * 4; - + w = 40; do { - vc_10_helper_8(dst, src + READ_BE_UINT32_UNALIGNED(&*(uint32*)src)); + vc_10_helper_8(dst, src + READ_BE_UINT32_UNALIGNED(&*(uint32 *)src)); dst += 8; src += 4; } while (--w); - + dx_unlock_attached(); - - return; + + return; } - if (state.e&0x10) + if (state.e & 0x10) state.depack_src = vc_10_depack_swap(state.depack_src, width, height); - else if (state.e&1) + else if (state.e & 1) state.depack_src = vc_10_no_depack_swap(state.depack_src); vlut = &_video_windows[_video_palette_mode * 4]; - state.draw_width = width << 1; /* cl */ - state.draw_height = height; /* ch */ + state.draw_width = width << 1; /* cl */ + state.draw_height = height; /* ch */ + + state.x_skip = 0; /* colums to skip = bh */ + state.y_skip = 0; /* rows to skip = bl */ - state.x_skip = 0; /* colums to skip = bh */ - state.y_skip = 0; /* rows to skip = bl */ - cur = state.x; if (cur < 0) { do { - if (!--state.draw_width) return; + if (!--state.draw_width) + return; state.x_skip++; - } while(++cur); + } while (++cur); } state.x = cur; - cur += state.draw_width - (vlut[2]<<1); + cur += state.draw_width - (vlut[2] << 1); if (cur > 0) { do { - if (!--state.draw_width) return; + if (!--state.draw_width) + return; } while (--cur); } - + cur = state.y; if (cur < 0) { do { - if (!--state.draw_height) return; + if (!--state.draw_height) + return; state.y_skip++; - } while(++cur); + } while (++cur); } state.y = cur; cur += state.draw_height - vlut[3]; if (cur > 0) { do { - if (!--state.draw_height) return; + if (!--state.draw_height) + return; } while (--cur); } - assert(state.draw_width!=0 && state.draw_height!=0); + assert(state.draw_width != 0 && state.draw_height != 0); - state.draw_width<<=2; + state.draw_width <<= 2; state.surf2_addr = dx_lock_2(); state.surf2_pitch = _dx_surface_pitch; @@ -738,7 +767,7 @@ void SimonState::vc_10() { state.surf_pitch = _dx_surface_pitch; { - uint offs = ((vlut[0] - _video_windows[16])*2 + state.x) * 8; + uint offs = ((vlut[0] - _video_windows[16]) * 2 + state.x) * 8; uint offs2 = (vlut[1] - _video_windows[17] + state.y); state.surf2_addr += offs + offs2 * state.surf2_pitch; @@ -750,59 +779,61 @@ void SimonState::vc_10() { byte h; uint w; - state.x_skip<<=2; + state.x_skip <<= 2; state.dl = width; state.dh = height; - + vc_10_skip_cols(&state); - + /* XXX: implement transparency */ w = 0; do { - mask = vc_10_depack_column(&state); /* esi */ - src = state.surf2_addr + w*2; /* ebx */ - dst = state.surf_addr + w*2; /* edi */ + mask = vc_10_depack_column(&state); /* esi */ + src = state.surf2_addr + w * 2; /* ebx */ + dst = state.surf_addr + w * 2; /* edi */ h = state.draw_height; do { - if (mask[0] & 0xF0) dst[0] = src[0]; - if (mask[0] & 0x0F) dst[1] = src[1]; + if (mask[0] & 0xF0) + dst[0] = src[0]; + if (mask[0] & 0x0F) + dst[1] = src[1]; mask++; dst += state.surf_pitch; src += state.surf2_pitch; - } while(--h); - } while(++w != state.draw_width); + } while (--h); + } while (++w != state.draw_width); /* vc_10_helper_5 */ - } else if (_lock_word&0x20 && state.base_color==0 || state.base_color==0xC0) { - byte *src,*dst; - uint h,i; - - if (!(state.e&8)) { - src = state.depack_src + (width * state.y_skip<<4) + (state.x_skip<<3); + } else if (_lock_word & 0x20 && state.base_color == 0 || state.base_color == 0xC0) { + byte *src, *dst; + uint h, i; + + if (!(state.e & 8)) { + src = state.depack_src + (width * state.y_skip << 4) + (state.x_skip << 3); dst = state.surf_addr; state.draw_width *= 2; - - if(state.e&2) { + + if (state.e & 2) { /* no transparency */ h = state.draw_height; do { - memcpy(dst,src,state.draw_width); + memcpy(dst, src, state.draw_width); dst += 320; src += width * 16; - } while(--h); + } while (--h); } else { /* transparency */ h = state.draw_height; do { - for(i=0; i!=state.draw_width; i++) - if(src[i]) + for (i = 0; i != state.draw_width; i++) + if (src[i]) dst[i] = src[i]; dst += 320; src += width * 16; - } while(--h); + } while (--h); } } else { @@ -811,26 +842,26 @@ void SimonState::vc_10() { /* AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE * aaaaabbb bbcccccd ddddeeee efffffgg ggghhhhh */ - + if (state.e & 2) { /* no transparency */ do { - uint count = state.draw_width>>2; - + uint count = state.draw_width >> 2; + dst = dst_org; do { - uint32 bits = (src[0]<<24) | (src[1]<<16) | (src[2]<<8) | (src[3]); - - dst[0] = (byte)((bits >> (32-5)) & 31); - dst[1] = (byte)((bits >> (32-10)) & 31); - dst[2] = (byte)((bits >> (32-15)) & 31); - dst[3] = (byte)((bits >> (32-20)) & 31); - dst[4] = (byte)((bits >> (32-25)) & 31); - dst[5] = (byte)((bits >> (32-30)) & 31); - - bits = (bits<<8) | src[4]; - - dst[6] = (byte)((bits >> (40-35)) & 31); + uint32 bits = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | (src[3]); + + dst[0] = (byte)((bits >> (32 - 5)) & 31); + dst[1] = (byte)((bits >> (32 - 10)) & 31); + dst[2] = (byte)((bits >> (32 - 15)) & 31); + dst[3] = (byte)((bits >> (32 - 20)) & 31); + dst[4] = (byte)((bits >> (32 - 25)) & 31); + dst[5] = (byte)((bits >> (32 - 30)) & 31); + + bits = (bits << 8) | src[4]; + + dst[6] = (byte)((bits >> (40 - 35)) & 31); dst[7] = (byte)((bits) & 31); dst += 8; @@ -841,61 +872,77 @@ void SimonState::vc_10() { } else { /* transparency */ do { - uint count = state.draw_width>>2; - + uint count = state.draw_width >> 2; + dst = dst_org; do { - uint32 bits = (src[0]<<24) | (src[1]<<16) | (src[2]<<8) | (src[3]); + uint32 bits = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | (src[3]); byte tmp; - - tmp = (byte)((bits >> (32-5)) & 31); if (tmp) dst[0] = tmp; - tmp = (byte)((bits >> (32-10)) & 31); if (tmp) dst[1] = tmp; - tmp = (byte)((bits >> (32-15)) & 31); if (tmp) dst[2] = tmp; - tmp = (byte)((bits >> (32-20)) & 31); if (tmp) dst[3] = tmp; - tmp = (byte)((bits >> (32-25)) & 31); if (tmp) dst[4] = tmp; - tmp = (byte)((bits >> (32-30)) & 31); if (tmp) dst[5] = tmp; - - bits = (bits<<8) | src[4]; - tmp = (byte)((bits >> (40-35)) & 31); if (tmp) dst[6] = tmp; - tmp = (byte)((bits) & 31); if (tmp) dst[7] = tmp; + tmp = (byte)((bits >> (32 - 5)) & 31); + if (tmp) + dst[0] = tmp; + tmp = (byte)((bits >> (32 - 10)) & 31); + if (tmp) + dst[1] = tmp; + tmp = (byte)((bits >> (32 - 15)) & 31); + if (tmp) + dst[2] = tmp; + tmp = (byte)((bits >> (32 - 20)) & 31); + if (tmp) + dst[3] = tmp; + tmp = (byte)((bits >> (32 - 25)) & 31); + if (tmp) + dst[4] = tmp; + tmp = (byte)((bits >> (32 - 30)) & 31); + if (tmp) + dst[5] = tmp; + + bits = (bits << 8) | src[4]; + + tmp = (byte)((bits >> (40 - 35)) & 31); + if (tmp) + dst[6] = tmp; + tmp = (byte)((bits) & 31); + if (tmp) + dst[7] = tmp; dst += 8; src += 5; - } while (--count); + } while (--count); dst_org += 320; } while (--state.draw_height); } } /* vc_10_helper_4 */ } else { - if (_game&GAME_SIMON2 && state.e&0x4 && _bit_array[10]&0x800) { + if (_game & GAME_SIMON2 && state.e & 0x4 && _bit_array[10] & 0x800) { state.surf_addr = state.surf2_addr; state.surf_pitch = state.surf2_pitch; warning("vc_10: (state.e&0x4)"); - } - + } + if (state.e & 0x8) { - uint w,h; - byte *src, *dst,*dst_org; + uint w, h; + byte *src, *dst, *dst_org; - state.x_skip <<= 2; /* reached */ + state.x_skip <<= 2; /* reached */ state.dl = width; state.dh = height; vc_10_skip_cols(&state); - if (state.e&2) { + if (state.e & 2) { dst_org = state.surf_addr; w = 0; do { src = vc_10_depack_column(&state); dst = dst_org; - + h = 0; do { dst[0] = (*src >> 4) | state.base_color; - dst[1] = (*src&15) | state.base_color; + dst[1] = (*src & 15) | state.base_color; dst += 320; src++; } while (++h != state.draw_height); @@ -903,7 +950,7 @@ void SimonState::vc_10() { } while (++w != state.draw_width); } else { dst_org = state.surf_addr; - if (state.e & 0x40) { /* reached */ + if (state.e & 0x40) { /* reached */ dst_org += vc_read_var(252); } w = 0; @@ -912,44 +959,48 @@ void SimonState::vc_10() { src = vc_10_depack_column(&state); dst = dst_org; - + h = 0; do { color = (*src >> 4); - if (color) dst[0] = color | state.base_color; - color = (*src&15); - if (color) dst[1] = color | state.base_color; + if (color) + dst[0] = color | state.base_color; + color = (*src & 15); + if (color) + dst[1] = color | state.base_color; dst += 320; src++; } while (++h != state.draw_height); dst_org += 2; - } while (++w != state.draw_width); + } while (++w != state.draw_width); } /* vc_10_helper_6 */ } else { - byte *src,*dst; + byte *src, *dst; uint count; src = state.depack_src + (width * state.y_skip) * 8; dst = state.surf_addr; state.x_skip <<= 2; - if (state.e&2) { + if (state.e & 2) { do { - for(count=0; count!=state.draw_width; count++) { - dst[count*2] = (src[count+state.x_skip]>>4) | state.base_color; - dst[count*2+1] = (src[count+state.x_skip]&15) | state.base_color; + for (count = 0; count != state.draw_width; count++) { + dst[count * 2] = (src[count + state.x_skip] >> 4) | state.base_color; + dst[count * 2 + 1] = (src[count + state.x_skip] & 15) | state.base_color; } dst += 320; src += width * 8; } while (--state.draw_height); } else { do { - for(count=0; count!=state.draw_width; count++) { + for (count = 0; count != state.draw_width; count++) { byte color; - color = (src[count+state.x_skip]>>4); - if(color) dst[count*2] = color | state.base_color; - color = (src[count+state.x_skip]&15); - if (color) dst[count*2+1] = color | state.base_color; + color = (src[count + state.x_skip] >> 4); + if (color) + dst[count * 2] = color | state.base_color; + color = (src[count + state.x_skip] & 15); + if (color) + dst[count * 2 + 1] = color | state.base_color; } dst += 320; src += width * 8; @@ -966,11 +1017,13 @@ void SimonState::vc_10() { } -void SimonState::vc_11_clear_pathfind_array() { +void SimonState::vc_11_clear_pathfind_array() +{ memset(&_pathfind_array, 0, sizeof(_pathfind_array)); } -void SimonState::vc_12_sleep_variable() { +void SimonState::vc_12_sleep_variable() +{ uint num; if (!(_game & GAME_SIMON2)) { @@ -980,17 +1033,19 @@ void SimonState::vc_12_sleep_variable() { } 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; + _vc_ptr = (byte *)&vc_get_out_of_code; } -void SimonState::vc_13_offset_x() { +void SimonState::vc_13_offset_x() +{ VgaSprite *vsp = find_cur_sprite(); int16 a = vc_read_next_word(); vsp->x += a; _vga_sprite_changed++; } -void SimonState::vc_14_offset_y() { +void SimonState::vc_14_offset_y() +{ VgaSprite *vsp = find_cur_sprite(); int16 a = vc_read_next_word(); vsp->y += a; @@ -998,7 +1053,8 @@ void SimonState::vc_14_offset_y() { } /* wakeup_id */ -void SimonState::vc_15_start_funkystruct_by_id() { +void SimonState::vc_15_start_funkystruct_by_id() +{ VgaSleepStruct *vfs = _vga_sleep_structs, *vfs_tmp; uint16 id = vc_read_next_word(); while (vfs->ident != 0) { @@ -1021,7 +1077,8 @@ void SimonState::vc_15_start_funkystruct_by_id() { /* sleep_on_id */ -void SimonState::vc_16_setup_funkystruct() { +void SimonState::vc_16_setup_funkystruct() +{ VgaSleepStruct *vfs = _vga_sleep_structs; while (vfs->ident) vfs++; @@ -1030,26 +1087,29 @@ void SimonState::vc_16_setup_funkystruct() { vfs->code_ptr = _vc_ptr; vfs->sprite_id = _vga_cur_sprite_id; vfs->cur_vga_file = _vga_cur_file_id; - - _vc_ptr = (byte*)&vc_get_out_of_code; + + _vc_ptr = (byte *)&vc_get_out_of_code; } -void SimonState::vc_17_set_pathfind_item() { +void SimonState::vc_17_set_pathfind_item() +{ uint a = vc_read_next_word(); - _pathfind_array[a - 1] = (uint16*)_vc_ptr; - while ( READ_BE_UINT16_UNALIGNED(_vc_ptr) != 999) + _pathfind_array[a - 1] = (uint16 *)_vc_ptr; + while (READ_BE_UINT16_UNALIGNED(_vc_ptr) != 999) _vc_ptr += 4; _vc_ptr += 2; } -void SimonState::vc_18_jump_rel() { +void SimonState::vc_18_jump_rel() +{ int16 offs = vc_read_next_word(); _vc_ptr += offs; } /* chain to script? */ -void SimonState::vc_19() { - /* XXX: not implemented */ +void SimonState::vc_19() +{ + /* XXX: not implemented */ error("vc_19: chain to script not implemented"); } @@ -1057,25 +1117,29 @@ void SimonState::vc_19() { /* helper routines */ /* write unaligned 16-bit */ -static void write_16_le(void *p, uint16 a) { - ((byte*)p)[0] = (byte) (a); - ((byte*)p)[1] = (byte) (a >> 8); +static void write_16_le(void *p, uint16 a) +{ + ((byte *)p)[0] = (byte)(a); + ((byte *)p)[1] = (byte)(a >> 8); } /* read unaligned 16-bit */ -static uint16 read_16_le(void *p) { - return ((byte*)p)[0] | (((byte*)p)[1] << 8); +static uint16 read_16_le(void *p) +{ + return ((byte *)p)[0] | (((byte *)p)[1] << 8); } /* FIXME: unaligned access */ -void SimonState::vc_20() { +void SimonState::vc_20() +{ uint16 a = vc_read_next_word(); write_16_le(_vc_ptr, a); _vc_ptr += 2; } /* FIXME: unaligned access */ -void SimonState::vc_21() { +void SimonState::vc_21() +{ if (!(_game & GAME_SIMON2)) { int16 a = vc_read_next_word(); byte *tmp = _vc_ptr + a; @@ -1097,20 +1161,21 @@ void SimonState::vc_21() { } } -void SimonState::vc_22() { +void SimonState::vc_22() +{ uint a = vc_read_next_word(); uint b = vc_read_next_word(); - uint num = a==0 ? 0x20 : 0x10; + uint num = a == 0 ? 0x20 : 0x10; byte *palptr, *src; - - palptr = &_palette[(a<<6)]; - src = _cur_vga_file_1 + 6 + b*96; - + palptr = &_palette[(a << 6)]; + + src = _cur_vga_file_1 + 6 + b * 96; + do { - palptr[0] = src[0]<<2; - palptr[1] = src[1]<<2; - palptr[2] = src[2]<<2; + palptr[0] = src[0] << 2; + palptr[1] = src[1] << 2; + palptr[2] = src[2] << 2; palptr[3] = 0; palptr += 4; @@ -1121,7 +1186,8 @@ void SimonState::vc_22() { _vga_sprite_changed++; } -void SimonState::vc_23_set_pri() { +void SimonState::vc_23_set_pri() +{ VgaSprite *vsp = find_cur_sprite(), *vus2; uint16 pri = vc_read_next_word(); VgaSprite bak; @@ -1130,7 +1196,7 @@ void SimonState::vc_23_set_pri() { warning("tried to set pri for unknown id %d", _vga_cur_sprite_id); return; } - + memcpy(&bak, vsp, sizeof(bak)); bak.unk5 = pri; bak.unk6 |= 0x8000; @@ -1142,15 +1208,15 @@ void SimonState::vc_23_set_pri() { vsp--; } while (vsp != _vga_sprites && pri < vsp[-1].unk5); do { - memcpy(vus2, vus2-1, sizeof(VgaSprite)); + memcpy(vus2, vus2 - 1, sizeof(VgaSprite)); } while (--vus2 != vsp); memcpy(vus2, &bak, sizeof(VgaSprite)); - } else if (vsp[1].id!=0 && pri >= vsp[1].unk5) { + } else if (vsp[1].id != 0 && pri >= vsp[1].unk5) { do { vsp++; - } while (vsp[1].id!=0 && pri >= vsp[1].unk5); + } while (vsp[1].id != 0 && pri >= vsp[1].unk5); do { - memcpy(vus2, vus2+1,sizeof(VgaSprite)); + memcpy(vus2, vus2 + 1, sizeof(VgaSprite)); } while (++vus2 != vsp); memcpy(vus2, &bak, sizeof(VgaSprite)); } else { @@ -1159,11 +1225,12 @@ void SimonState::vc_23_set_pri() { _vga_sprite_changed++; } -void SimonState::vc_24_set_image_xy() { +void SimonState::vc_24_set_image_xy() +{ VgaSprite *vsp = find_cur_sprite(); vsp->image = vc_read_var_or_word(); - if (vsp->id==0) { + if (vsp->id == 0) { warning("Trying to set XY of nonexistent sprite '%d'", _vga_cur_sprite_id); } @@ -1178,37 +1245,40 @@ void SimonState::vc_24_set_image_xy() { _vga_sprite_changed++; } -void SimonState::vc_25_del_sprite_and_get_out() { +void SimonState::vc_25_del_sprite_and_get_out() +{ VgaSprite *vsp = find_cur_sprite(); while (vsp->id != 0) { - memcpy(vsp,vsp+1,sizeof(VgaSprite)); + memcpy(vsp, vsp + 1, sizeof(VgaSprite)); vsp++; } - _vc_ptr = (byte*)&vc_get_out_of_code; + _vc_ptr = (byte *)&vc_get_out_of_code; _vga_sprite_changed++; } -void SimonState::vc_26() { - uint16 *as = &_video_windows[vc_read_next_word()*4]; +void SimonState::vc_26() +{ + uint16 *as = &_video_windows[vc_read_next_word() * 4]; as[0] = vc_read_next_word(); as[1] = vc_read_next_word(); as[2] = vc_read_next_word(); as[3] = vc_read_next_word(); } -void SimonState::vc_27_reset_simon1() { - VgaSprite bak,*vsp; +void SimonState::vc_27_reset_simon1() +{ + VgaSprite bak, *vsp; VgaSleepStruct *vfs; - VgaTimerEntry *vte,*vte2; + VgaTimerEntry *vte, *vte2; _lock_word |= 8; - memset(&bak,0,sizeof(bak)); + memset(&bak, 0, sizeof(bak)); vsp = _vga_sprites; while (vsp->id) { if (vsp->id == 128) { - memcpy(&bak,vsp,sizeof(VgaSprite)); + memcpy(&bak, vsp, sizeof(VgaSprite)); } vsp->id = 0; vsp++; @@ -1223,13 +1293,13 @@ void SimonState::vc_27_reset_simon1() { vfs++; } - + vte = _vga_timer_list; while (vte->delay) { if (vte->sprite_id != 0x80) { vte2 = vte; while (vte2->delay) { - memcpy(vte2,vte2+1,sizeof(VgaTimerEntry)); + memcpy(vte2, vte2 + 1, sizeof(VgaTimerEntry)); vte2++; } } else { @@ -1238,14 +1308,15 @@ void SimonState::vc_27_reset_simon1() { } vc_write_var(0xFE, 0); - + _lock_word &= ~8; } -void SimonState::vc_27_reset_simon2() { +void SimonState::vc_27_reset_simon2() +{ _lock_word |= 8; - + { VgaSprite *vsp = _vga_sprites; while (vsp->id) { @@ -1262,80 +1333,92 @@ void SimonState::vc_27_reset_simon2() { } } - { + { VgaTimerEntry *vte = _vga_timer_list; while (vte->delay) { VgaTimerEntry *vte2 = vte; while (vte2->delay) { - memcpy(vte2,vte2+1,sizeof(VgaTimerEntry)); + memcpy(vte2, vte2 + 1, sizeof(VgaTimerEntry)); vte2++; } } } vc_write_var(0xFE, 0); - + _lock_word &= ~8; } -void SimonState::vc_27_reset() { +void SimonState::vc_27_reset() +{ if (!(_game & GAME_SIMON2)) vc_27_reset_simon1(); else vc_27_reset_simon2(); } -void SimonState::vc_28() { +void SimonState::vc_28() +{ /* dummy opcode */ _vc_ptr += 8; } -void SimonState::vc_29_stop_all_sounds() { +void SimonState::vc_29_stop_all_sounds() +{ _mixer->stop_all(); } -void SimonState::vc_30_set_base_delay() { +void SimonState::vc_30_set_base_delay() +{ _vga_base_delay = vc_read_next_word(); } -void SimonState::vc_31_set_palette_mode() { +void SimonState::vc_31_set_palette_mode() +{ _video_palette_mode = vc_read_next_word(); } -uint SimonState::vc_read_var(uint var) { - assert(var<255); +uint SimonState::vc_read_var(uint var) +{ + assert(var < 255); return (uint16)_variableArray[var]; } -void SimonState::vc_write_var(uint var, int16 value) { +void SimonState::vc_write_var(uint var, int16 value) +{ _variableArray[var] = value; } -void SimonState::vc_32_copy_var() { +void SimonState::vc_32_copy_var() +{ uint16 a = vc_read_var(vc_read_next_word()); vc_write_var(vc_read_next_word(), a); } -void SimonState::vc_33() { +void SimonState::vc_33() +{ if (_lock_counter != 0) { _lock_counter = 1; unlock(); } } -void SimonState::vc_34() { +void SimonState::vc_34() +{ lock(); _lock_counter = 200; _left_button_down = 0; } -void SimonState::vc_35() { +void SimonState::vc_35() +{ /* not used? */ _vc_ptr += 4; _vga_sprite_changed++; } -void SimonState::vc_36() { +void SimonState::vc_36() +{ uint vga_res = vc_read_next_word(); uint mode = vc_read_next_word(); @@ -1343,43 +1426,49 @@ void SimonState::vc_36() { if (mode == 16) { _copy_partial_mode = 2; } else { - set_video_mode_internal(mode,vga_res); + set_video_mode_internal(mode, vga_res); } } else { - set_video_mode_internal(mode,vga_res); + set_video_mode_internal(mode, vga_res); } } -void SimonState::vc_37_sprite_unk3_add() { +void SimonState::vc_37_sprite_unk3_add() +{ VgaSprite *vsp = find_cur_sprite(); vsp->y += vc_read_var(vc_read_next_word()); - _vga_sprite_changed++; + _vga_sprite_changed++; } -void SimonState::vc_38_skip_if_var_zero() { +void SimonState::vc_38_skip_if_var_zero() +{ uint var = vc_read_next_word(); if (vc_read_var(var) == 0) vc_skip_next_instruction(); } -void SimonState::vc_39_set_var() { +void SimonState::vc_39_set_var() +{ uint var = vc_read_next_word(); int16 value = vc_read_next_word(); - vc_write_var(var,value); + vc_write_var(var, value); } -void SimonState::vc_40_var_add() { +void SimonState::vc_40_var_add() +{ uint var = vc_read_next_word(); int16 value = vc_read_var(var) + vc_read_next_word(); - if (_game&GAME_SIMON2 && var==0xF && !(_bit_array[5]&1)) { + if (_game & GAME_SIMON2 && var == 0xF && !(_bit_array[5] & 1)) { int16 tmp; - if (_vga_var2!=0) { - if (_vga_var2>=0) goto no_scroll; + if (_vga_var2 != 0) { + if (_vga_var2 >= 0) + goto no_scroll; _vga_var2 = 0; } else { - if (_vga_var3 != 0) goto no_scroll; + if (_vga_var3 != 0) + goto no_scroll; } if (value - _x_scroll >= 30) { @@ -1387,7 +1476,7 @@ void SimonState::vc_40_var_add() { tmp = _vga_var1 - _x_scroll; if (tmp < 20) _vga_var2 = tmp; - add_vga_timer(10, NULL, 0, 0); /* special timer */ + add_vga_timer(10, NULL, 0, 0); /* special timer */ } } no_scroll:; @@ -1395,18 +1484,21 @@ no_scroll:; vc_write_var(var, value); } -void SimonState::vc_41_var_sub() { +void SimonState::vc_41_var_sub() +{ uint var = vc_read_next_word(); int16 value = vc_read_var(var) - vc_read_next_word(); - if (_game&GAME_SIMON2 && var==0xF && !(_bit_array[5]&1)) { + if (_game & GAME_SIMON2 && var == 0xF && !(_bit_array[5] & 1)) { int16 tmp; - if (_vga_var2!=0) { - if (_vga_var2<0) goto no_scroll; + if (_vga_var2 != 0) { + if (_vga_var2 < 0) + goto no_scroll; _vga_var2 = 0; } else { - if (_vga_var3 != 0) goto no_scroll; + if (_vga_var3 != 0) + goto no_scroll; } if ((uint16)(value - _x_scroll) < 11) { @@ -1414,7 +1506,7 @@ void SimonState::vc_41_var_sub() { tmp = _vga_var1 - _x_scroll; if (_x_scroll < 20) _vga_var2 = -_x_scroll; - add_vga_timer(10, NULL, 0, 0); /* special timer */ + add_vga_timer(10, NULL, 0, 0); /* special timer */ } } no_scroll:; @@ -1422,101 +1514,114 @@ no_scroll:; vc_write_var(var, value); } -void SimonState::vc_42_delay_if_not_eq() { +void SimonState::vc_42_delay_if_not_eq() +{ uint val = vc_read_var(vc_read_next_word()); if (val == vc_read_next_word()) { - + add_vga_timer(_vga_base_delay + 1, _vc_ptr - 4, _vga_cur_sprite_id, _vga_cur_file_id); - _vc_ptr = (byte*)&vc_get_out_of_code; + _vc_ptr = (byte *)&vc_get_out_of_code; } } -void SimonState::vc_43_skip_if_bit_clear() { +void SimonState::vc_43_skip_if_bit_clear() +{ if (!vc_get_bit(vc_read_next_word())) { vc_skip_next_instruction(); } } -void SimonState::vc_44_skip_if_bit_set() { +void SimonState::vc_44_skip_if_bit_set() +{ if (vc_get_bit(vc_read_next_word())) { vc_skip_next_instruction(); } } -void SimonState::vc_45_set_x() { +void SimonState::vc_45_set_x() +{ VgaSprite *vsp = find_cur_sprite(); vsp->x = vc_read_var(vc_read_next_word()); _vga_sprite_changed++; } -void SimonState::vc_46_set_y() { +void SimonState::vc_46_set_y() +{ VgaSprite *vsp = find_cur_sprite(); vsp->y = vc_read_var(vc_read_next_word()); _vga_sprite_changed++; } -void SimonState::vc_47_add_var_f() { +void SimonState::vc_47_add_var_f() +{ uint var = vc_read_next_word(); vc_write_var(var, vc_read_var(var) + vc_read_var(vc_read_next_word())); } -void SimonState::vc_48() { +void SimonState::vc_48() +{ uint a = (uint16)_variableArray[12]; uint b = (uint16)_variableArray[13]; int c = _variableArray[14]; - uint16 *p = _pathfind_array[a-1]; + uint16 *p = _pathfind_array[a - 1]; int step; - int y1,y2; + int y1, y2; int16 *vp; - p += b*2 + 1; + p += b * 2 + 1; step = 2; - if (c<0) { + if (c < 0) { c = -c; step = -2; } vp = &_variableArray[20]; - do{ + do { y2 = READ_BE_UINT16_UNALIGNED(p); p += step; y1 = READ_BE_UINT16_UNALIGNED(p) - y2; -// assert(READ_BE_UINT16_UNALIGNED(&p[1]) != 999); +// assert(READ_BE_UINT16_UNALIGNED(&p[1]) != 999); - vp[0] = y1>>1; - vp[1] = y1 - (y1>>1); + vp[0] = y1 >> 1; + vp[1] = y1 - (y1 >> 1); vp += 2; } while (--c); } -void SimonState::vc_set_bit_to(uint bit, bool value) { - uint16 *bits = &_bit_array[bit>>4]; - *bits = (*bits & ~(1<<(bit&15))) | (value << (bit&15)); +void SimonState::vc_set_bit_to(uint bit, bool value) +{ + uint16 *bits = &_bit_array[bit >> 4]; + *bits = (*bits & ~(1 << (bit & 15))) | (value << (bit & 15)); } -bool SimonState::vc_get_bit(uint bit) { - uint16 *bits = &_bit_array[bit>>4]; - return (*bits & (1<<(bit&15))) != 0; +bool SimonState::vc_get_bit(uint bit) +{ + uint16 *bits = &_bit_array[bit >> 4]; + return (*bits & (1 << (bit & 15))) != 0; } -void SimonState::vc_49_set_bit() { +void SimonState::vc_49_set_bit() +{ vc_set_bit_to(vc_read_next_word(), true); } -void SimonState::vc_50_clear_bit() { +void SimonState::vc_50_clear_bit() +{ vc_set_bit_to(vc_read_next_word(), false); } -void SimonState::vc_51_clear_hitarea_bit_0x40() { +void SimonState::vc_51_clear_hitarea_bit_0x40() +{ clear_hitarea_bit_0x40(vc_read_next_word()); } -void SimonState::vc_52() { +void SimonState::vc_52() +{ uint16 a = vc_read_next_word(); if (!(_game & GAME_SIMON2)) { @@ -1524,29 +1629,32 @@ void SimonState::vc_52() { } else { if (a >= 0x8000) { a = -a; - warning("vc_52(%d): unimpl"); + warning("vc_52(%d): unimpl"); } else { playSound(a); } } } -void SimonState::vc_53_no_op() { +void SimonState::vc_53_no_op() +{ /* no op */ } -void SimonState::vc_54_no_op() { +void SimonState::vc_54_no_op() +{ /* no op */ } -void SimonState::vc_55_offset_hit_area() { +void SimonState::vc_55_offset_hit_area() +{ HitArea *ha = _hit_areas; uint count = ARRAYSIZE(_hit_areas); uint16 id = vc_read_next_word(); int16 x = vc_read_next_word(); int16 y = vc_read_next_word(); - for(;;) { + for (;;) { if (ha->id == id) { ha->x += x; ha->y += y; @@ -1556,30 +1664,32 @@ void SimonState::vc_55_offset_hit_area() { if (!--count) break; } - + _need_hitarea_recalc++; } -void SimonState::vc_56_no_op() { +void SimonState::vc_56_no_op() +{ /* No-Op in simon1 */ if (_game & GAME_SIMON2) { 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); + 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; + _vc_ptr = (byte *)&vc_get_out_of_code; } } -void SimonState::vc_59() { +void SimonState::vc_59() +{ if (_game & GAME_SIMON2) { uint file = vc_read_next_word(); uint start = vc_read_next_word(); uint end = vc_read_next_word() + 1; - + do { vc_kill_thread(file, start); } while (++start != end); @@ -1589,19 +1699,20 @@ void SimonState::vc_59() { } } -void SimonState::vc_58() { +void SimonState::vc_58() +{ uint sprite = _vga_cur_sprite_id; uint file = _vga_cur_file_id; byte *vc_ptr; uint16 tmp; - + _vga_cur_file_id = vc_read_next_word(); _vga_cur_sprite_id = vc_read_next_word(); tmp = TO_BE_16(vc_read_next_word()); - + vc_ptr = _vc_ptr; - _vc_ptr = (byte*)&tmp; + _vc_ptr = (byte *)&tmp; vc_23_set_pri(); _vc_ptr = vc_ptr; @@ -1609,12 +1720,14 @@ void SimonState::vc_58() { _vga_cur_file_id = file; } -void SimonState::vc_57_no_op() { +void SimonState::vc_57_no_op() +{ /* no op */ - + } -void SimonState::vc_kill_thread(uint file, uint sprite) { +void SimonState::vc_kill_thread(uint file, uint sprite) +{ uint16 old_sprite_id, old_cur_file_id; VgaSleepStruct *vfs; VgaSprite *vsp; @@ -1624,17 +1737,17 @@ void SimonState::vc_kill_thread(uint file, uint sprite) { old_sprite_id = _vga_cur_sprite_id; old_cur_file_id = _vga_cur_file_id; vc_org = _vc_ptr; - + _vga_cur_file_id = file; _vga_cur_sprite_id = sprite; - + vfs = _vga_sleep_structs; while (vfs->ident != 0) { if (vfs->sprite_id == _vga_cur_sprite_id - && (vfs->cur_vga_file == _vga_cur_file_id || !(_game & GAME_SIMON2)) - ) { - while (vfs->ident != 0){ - memcpy(vfs, vfs+1, sizeof(VgaSleepStruct)); + && (vfs->cur_vga_file == _vga_cur_file_id || !(_game & GAME_SIMON2)) + ) { + while (vfs->ident != 0) { + memcpy(vfs, vfs + 1, sizeof(VgaSleepStruct)); vfs++; } break; @@ -1642,15 +1755,15 @@ void SimonState::vc_kill_thread(uint file, uint sprite) { vfs++; } - vsp = find_cur_sprite(); + vsp = find_cur_sprite(); if (vsp->id) { vc_25_del_sprite_and_get_out(); vte = _vga_timer_list; while (vte->delay != 0) { if (vte->sprite_id == _vga_cur_sprite_id - && (vte->cur_vga_file == _vga_cur_file_id || !(_game & GAME_SIMON2) ) - ) { + && (vte->cur_vga_file == _vga_cur_file_id || !(_game & GAME_SIMON2)) + ) { delete_vga_timer(vte); break; } @@ -1665,7 +1778,8 @@ void SimonState::vc_kill_thread(uint file, uint sprite) { /* kill thread */ -void SimonState::vc_60() { +void SimonState::vc_60() +{ uint file; if (_game & GAME_SIMON2) { @@ -1677,8 +1791,9 @@ void SimonState::vc_60() { vc_kill_thread(file, sprite); } -void SimonState::vc_61_sprite_change() { - VgaSprite *vsp = find_cur_sprite(); +void SimonState::vc_61_sprite_change() +{ + VgaSprite *vsp = find_cur_sprite(); vsp->image = vc_read_var_or_word(); @@ -1689,30 +1804,31 @@ void SimonState::vc_61_sprite_change() { _vga_sprite_changed++; } -void SimonState::vc_62() { +void SimonState::vc_62() +{ uint i; byte *vc_ptr_org = _vc_ptr; vc_29_stop_all_sounds(); - -// if (!_video_var_3) { - _video_var_3 = true; - _video_num_pal_colors = 256; - if (_video_palette_mode == 4) - _video_num_pal_colors = 208; -// } + +// if (!_video_var_3) { + _video_var_3 = true; + _video_num_pal_colors = 256; + if (_video_palette_mode == 4) + _video_num_pal_colors = 208; +// } memcpy(_video_buf_1, _palette_backup, _video_num_pal_colors * sizeof(uint32)); - for(i=NUM_PALETTE_FADEOUT;i!=0;--i) { - palette_fadeout((uint32*)_video_buf_1, _video_num_pal_colors); + for (i = NUM_PALETTE_FADEOUT; i != 0; --i) { + palette_fadeout((uint32 *)_video_buf_1, _video_num_pal_colors); _system->set_palette(_video_buf_1, 0, _video_num_pal_colors); _system->update_screen(); delay(5); } - if (!(_game & GAME_SIMON2)) { - uint16 params[5]; /* parameters to vc_10 */ + if (!(_game & GAME_SIMON2)) { + uint16 params[5]; /* parameters to vc_10 */ VgaSprite *vsp; VgaPointersEntry *vpe; @@ -1733,7 +1849,7 @@ void SimonState::vc_62() { params[2] = READ_BE_UINT16_UNALIGNED(&vsp->x); params[3] = READ_BE_UINT16_UNALIGNED(&vsp->y); params[4] = READ_BE_UINT16_UNALIGNED(&vsp->unk4); - _vc_ptr = (byte*)params; + _vc_ptr = (byte *)params; vc_10(); _video_palette_mode = palmode; @@ -1745,29 +1861,33 @@ void SimonState::vc_62() { } } - dx_clear_surfaces(_video_palette_mode==4 ? 134 : 200); + dx_clear_surfaces(_video_palette_mode == 4 ? 134 : 200); _vc_ptr = vc_ptr_org; } -void SimonState::vc_63() { +void SimonState::vc_63() +{ _palette_color_count = 208; - if(_video_palette_mode != 4) { + if (_video_palette_mode != 4) { _palette_color_count = 256; } _video_var_3 = false; } -void SimonState::vc_64() { // Simon2 +void SimonState::vc_64() +{ // Simon2 if (vc_59_helper()) vc_skip_next_instruction(); } -void SimonState::vc_65() { // Simon2 +void SimonState::vc_65() +{ // Simon2 error("vc_65 unimplemented"); } -void SimonState::vc_66() { // Simon2 +void SimonState::vc_66() +{ // Simon2 uint a = vc_read_next_word(); uint b = vc_read_next_word(); @@ -1775,7 +1895,8 @@ void SimonState::vc_66() { // Simon2 vc_skip_next_instruction(); } -void SimonState::vc_67() { // Simon2 +void SimonState::vc_67() +{ // Simon2 uint a = vc_read_next_word(); uint b = vc_read_next_word(); @@ -1783,7 +1904,8 @@ void SimonState::vc_67() { // Simon2 vc_skip_next_instruction(); } -void SimonState::vc_68() { // Simon2 +void SimonState::vc_68() +{ // Simon2 uint a = vc_read_next_word(); uint b = vc_read_next_word(); @@ -1791,30 +1913,34 @@ void SimonState::vc_68() { // Simon2 vc_skip_next_instruction(); } -void SimonState::vc_69() { // Simon2 +void SimonState::vc_69() +{ // Simon2 uint16 a = vc_read_next_word(); uint16 b = vc_read_next_word(); warning("vc_69(%d,%d): music stuff?", a, b); } -void SimonState::vc_70() { // Simon2 +void SimonState::vc_70() +{ // Simon2 uint16 a = vc_read_next_word(); uint16 b = vc_read_next_word(); _vc70_var1 = a; _vc70_var2 = b; - + warning("vc_70(%d,%d): music stuff?", a, b); } -void SimonState::vc_71() { // Simon2 - if (_vc72_var3==0xFFFF && _vc72_var1==0xFFFF) +void SimonState::vc_71() +{ // Simon2 + if (_vc72_var3 == 0xFFFF && _vc72_var1 == 0xFFFF) vc_skip_next_instruction(); } -void SimonState::vc_72() { // Simon2 +void SimonState::vc_72() +{ // Simon2 uint16 a = vc_read_next_word(); uint16 b = vc_read_next_word(); if (a != _vc72_var1) { @@ -1825,12 +1951,14 @@ void SimonState::vc_72() { // Simon2 warning("vc_72(%d,%d): music stuff?", a, b); } -void SimonState::vc_73() { // Simon2 +void SimonState::vc_73() +{ // Simon2 vc_read_next_byte(); - _op_189_flags |= 1<<vc_read_next_byte(); + _op_189_flags |= 1 << vc_read_next_byte(); } -void SimonState::vc_74() { // Simon2 +void SimonState::vc_74() +{ // Simon2 vc_read_next_byte(); - _op_189_flags &= ~(1<<vc_read_next_byte()); + _op_189_flags &= ~(1 << vc_read_next_byte()); } |