diff options
author | Eugene Sandulenko | 2006-09-29 08:37:24 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2006-09-29 08:37:24 +0000 |
commit | 798c7ee6822517601ef3c4096ad76a2fc0eefb50 (patch) | |
tree | 02b63f44348a35d6e3b6ab53540e94b2e45738e7 /engines/simon/subroutine.cpp | |
parent | 8e2c703baba570b18aec9d871fdc8ee7efe49e57 (diff) | |
download | scummvm-rg350-798c7ee6822517601ef3c4096ad76a2fc0eefb50.tar.gz scummvm-rg350-798c7ee6822517601ef3c4096ad76a2fc0eefb50.tar.bz2 scummvm-rg350-798c7ee6822517601ef3c4096ad76a2fc0eefb50.zip |
Phase 2 of Simon renaming. Simon directory renaming
svn-id: r24009
Diffstat (limited to 'engines/simon/subroutine.cpp')
-rw-r--r-- | engines/simon/subroutine.cpp | 479 |
1 files changed, 0 insertions, 479 deletions
diff --git a/engines/simon/subroutine.cpp b/engines/simon/subroutine.cpp deleted file mode 100644 index b5a7c1f9f7..0000000000 --- a/engines/simon/subroutine.cpp +++ /dev/null @@ -1,479 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2006 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/stdafx.h" - -#include "agos/agos.h" -#include "agos/intern.h" - -using Common::File; - -namespace Simon { - -Subroutine *SimonEngine::getSubroutineByID(uint subroutine_id) { - Subroutine *cur; - - _subroutine = subroutine_id; - - for (cur = _subroutineList; cur; cur = cur->next) { - if (cur->id == subroutine_id) - return cur; - } - - if (loadXTablesIntoMem(subroutine_id)) { - for (cur = _subroutineList; cur; cur = cur->next) { - if (cur->id == subroutine_id) - return cur; - } - } - - if (loadTablesIntoMem(subroutine_id)) { - for (cur = _subroutineList; cur; cur = cur->next) { - if (cur->id == subroutine_id) - return cur; - } - } - - if (subroutine_id != 160) - debug(0,"getSubroutineByID: subroutine %d not found", subroutine_id); - return NULL; -} - -void SimonEngine::alignTableMem() { - if ((unsigned long)_tablesHeapPtr & 3) { - _tablesHeapPtr += 2; - _tablesHeapCurPos += 2; - } -} - -byte *SimonEngine::allocateTable(uint size) { - byte *org = _tablesHeapPtr; - - size = (size + 1) & ~1; - - _tablesHeapPtr += size; - _tablesHeapCurPos += size; - - if (_tablesHeapCurPos > _tablesHeapSize) - error("Tablesheap overflow"); - - return org; -} - -File *SimonEngine::openTablesFile(const char *filename) { - if (getFeatures() & GF_OLD_BUNDLE) - return openTablesFile_simon1(filename); - else - return openTablesFile_gme(filename); -} - -File *SimonEngine::openTablesFile_simon1(const char *filename) { - File *fo = new File(); - fo->open(filename); - if (fo->isOpen() == false) - error("openTablesFile: Can't open '%s'", filename); - return fo; -} - -File *SimonEngine::openTablesFile_gme(const char *filename) { - uint res; - uint32 offs; - - res = atoi(filename + 6) + _tableIndexBase - 1; - offs = _gameOffsetsPtr[res]; - - _gameFile->seek(offs, SEEK_SET); - return _gameFile; -} - -bool SimonEngine::loadTablesIntoMem(uint subr_id) { - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) - return loadTablesOldIntoMem(subr_id); - else - return loadTablesNewIntoMem(subr_id); -} - - -bool SimonEngine::loadTablesOldIntoMem(uint subr_id) { - byte *p; - uint16 min_num, max_num, file_num; - File *in; - char filename[30]; - - if (_tblList == NULL) - return 0; - - p = _tblList + 32; - - min_num = READ_BE_UINT16(p); - max_num = READ_BE_UINT16(p + 2); - file_num = *(p + 4); - p += 6; - - while (min_num) { - if ((subr_id >= min_num) && (subr_id <= max_num)) { - _subroutineList = _subroutineListOrg; - _tablesHeapPtr = _tablesHeapPtrOrg; - _tablesHeapCurPos = _tablesHeapCurPosOrg; - _stringIdLocalMin = 1; - _stringIdLocalMax = 0; - - sprintf(filename, "TABLES%.2d", file_num); - in = openTablesFile(filename); - readSubroutineBlock(in); - closeTablesFile(in); - - alignTableMem(); - - _tablesheapPtrNew = _tablesHeapPtr; - _tablesHeapCurPosNew = _tablesHeapCurPos; - - if (_tablesHeapCurPos > _tablesHeapSize) - error("loadTablesOldIntoMem: Out of table memory"); - return 1; - } - - min_num = READ_BE_UINT16(p); - max_num = READ_BE_UINT16(p + 2); - file_num = *(p + 4); - p += 6; - } - - debug(1,"loadTablesOldIntoMem: didn't find %d", subr_id); - return 0; -} - -bool SimonEngine::loadTablesNewIntoMem(uint subr_id) { - byte *p; - int i; - uint min_num, max_num; - char filename[30]; - File *in; - - p = _tblList; - if (p == NULL) - return 0; - - while (*p) { - for (i = 0; *p; p++, i++) - filename[i] = *p; - filename[i] = 0; - p++; - - for (;;) { - min_num = READ_BE_UINT16(p); p += 2; - if (min_num == 0) - break; - - max_num = READ_BE_UINT16(p); p += 2; - - if (subr_id >= min_num && subr_id <= max_num) { - _subroutineList = _subroutineListOrg; - _tablesHeapPtr = _tablesHeapPtrOrg; - _tablesHeapCurPos = _tablesHeapCurPosOrg; - _stringIdLocalMin = 1; - _stringIdLocalMax = 0; - - in = openTablesFile(filename); - readSubroutineBlock(in); - closeTablesFile(in); - if (getGameType() == GType_SIMON2) { - _sound->loadSfxTable(_gameFile, _gameOffsetsPtr[atoi(filename + 6) - 1 + _soundIndexBase]); - } else if (getGameType() == GType_SIMON1 && getPlatform() == Common::kPlatformWindows) { - memcpy(filename, "SFXXXX", 6); - if (atoi(filename + 6) != 1 && atoi(filename + 6) != 30) - _sound->readSfxFile(filename); - } - - alignTableMem(); - - _tablesheapPtrNew = _tablesHeapPtr; - _tablesHeapCurPosNew = _tablesHeapCurPos; - - if (_tablesHeapCurPos > _tablesHeapSize) - error("loadTablesNewIntoMem: Out of table memory"); - return 1; - } - } - } - - debug(1,"loadTablesNewIntoMem: didn't find %d", subr_id); - return 0; -} - -bool SimonEngine::loadXTablesIntoMem(uint subr_id) { - byte *p; - int i; - uint min_num, max_num; - char filename[30]; - File *in; - - p = _xtblList; - if (p == NULL) - return 0; - - while (*p) { - for (i = 0; *p; p++, i++) - filename[i] = *p; - filename[i] = 0; - p++; - - for (;;) { - min_num = READ_BE_UINT16(p); - p += 2; - - if (min_num == 0) - break; - - max_num = READ_BE_UINT16(p); - p += 2; - - if (subr_id >= min_num && subr_id <= max_num) { - _subroutineList = _xsubroutineListOrg; - _tablesHeapPtr = _xtablesHeapPtrOrg; - _tablesHeapCurPos = _xtablesHeapCurPosOrg; - _stringIdLocalMin = 1; - _stringIdLocalMax = 0; - - in = openTablesFile(filename); - readSubroutineBlock(in); - closeTablesFile(in); - - alignTableMem(); - - _subroutineListOrg = _subroutineList; - _tablesHeapPtrOrg = _tablesHeapPtr; - _tablesHeapCurPosOrg = _tablesHeapCurPos; - _tablesheapPtrNew = _tablesHeapPtr; - _tablesHeapCurPosNew = _tablesHeapCurPos; - - return 1; - } - } - } - - debug(1,"loadXTablesIntoMem: didn't find %d", subr_id); - return 0; -} - -void SimonEngine::closeTablesFile(File *in) { - if (getFeatures() & GF_OLD_BUNDLE) { - in->close(); - delete in; - } -} - -Subroutine *SimonEngine::createSubroutine(uint id) { - Subroutine *sub; - - alignTableMem(); - - sub = (Subroutine *)allocateTable(sizeof(Subroutine)); - sub->id = id; - sub->first = 0; - sub->next = _subroutineList; - _subroutineList = sub; - return sub; -} - -SubroutineLine *SimonEngine::createSubroutineLine(Subroutine *sub, int where) { - SubroutineLine *sl, *cur_sl = NULL, *last_sl = NULL; - - if (sub->id == 0) - sl = (SubroutineLine *)allocateTable(SUBROUTINE_LINE_BIG_SIZE); - else - 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); - while (where) { - last_sl = cur_sl; - cur_sl = (SubroutineLine *)((byte *)sub + cur_sl->next); - if ((byte *)cur_sl == (byte *)sub) - break; - 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; - } else { - // Insert the subroutine line at the head of the link - sl->next = sub->first; - sub->first = (byte *)sl - (byte *)sub; - } - - return sl; -} - -void SimonEngine::runSubroutine101() { - Subroutine *sub; - - sub = getSubroutineByID(101); - if (sub != NULL) - startSubroutineEx(sub); - - permitInput(); -} - -int SimonEngine::startSubroutine(Subroutine *sub) { - int result = -1; - SubroutineLine *sl; - const byte *old_code_ptr; - - if (_startMainScript) - dumpSubroutine(sub); - - old_code_ptr = _codePtr; - - if (++_recursionDepth > 40) - error("Recursion error"); - - // WORKAROUND: Bit Flag 171 isn't set when Simon rides the lion to the - // goblin camp in non-English versions. Bit Flag 171 is required to display - // the red trail between locations on the map, during the ride. - if (getGameType() == GType_SIMON2) { - if (sub->id == 13020) - setBitFlag(171, true); - if (sub->id == 13021) - setBitFlag(171, false); - } - - sl = (SubroutineLine *)((byte *)sub + sub->first); - - while ((byte *)sl != (byte *)sub) { - if (checkIfToRunSubroutineLine(sl, sub)) { - result = 0; - _codePtr = (byte *)sl; - if (sub->id) - _codePtr += 2; - else - _codePtr += 8; - - if (_continousMainScript) - printf("; %d\n", sub->id); - 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); - continue; - } - break; - } - } - sl = (SubroutineLine *)((byte *)sub + sl->next); - } - - _codePtr = old_code_ptr; - - _recursionDepth--; - return result; -} - -int SimonEngine::startSubroutineEx(Subroutine *sub) { - return startSubroutine(sub); -} - -bool SimonEngine::checkIfToRunSubroutineLine(SubroutineLine *sl, Subroutine *sub) { - if (sub->id) - return true; - - if (sl->verb != -1 && sl->verb != _scriptVerb && - (sl->verb != -2 || _scriptVerb != -1)) - return false; - - if (sl->noun1 != -1 && sl->noun1 != _scriptNoun1 && - (sl->noun1 != -2 || _scriptNoun1 != -1)) - return false; - - if (sl->noun2 != -1 && sl->noun2 != _scriptNoun2 && - (sl->noun2 != -2 || _scriptNoun2 != -1)) - return false; - - return true; -} - -void SimonEngine::readSubroutine(File *in, Subroutine *sub) { - while (in->readUint16BE() == 0) { - readSubroutineLine(in, createSubroutineLine(sub, 0xFFFF), sub); - } -} - -void SimonEngine::readSubroutineLine(File *in, SubroutineLine *sl, Subroutine *sub) { - byte line_buffer[2048], *q = line_buffer; - int size; - - if (sub->id == 0) { - sl->verb = in->readUint16BE(); - sl->noun1 = in->readUint16BE(); - sl->noun2 = in->readUint16BE(); - } else if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { - in->readUint16BE(); - in->readUint16BE(); - in->readUint16BE(); - } - - if (getGameType() == GType_ELVIRA || getGameType() == GType_ELVIRA2) { - int16 tmp; - - tmp = in->readUint16BE(); - WRITE_BE_UINT16(q, tmp); - while (tmp != 10000) { - if (READ_BE_UINT16(q) == 0xC6) { - in->readUint16BE(); - } else { - q = readSingleOpcode(in, q); - } - - tmp = in->readUint16BE(); - WRITE_BE_UINT16(q, tmp); - } - - size = (q - line_buffer + 1) * 2; - memcpy(allocateTable(size), line_buffer, size); - } else { - while ((*q = in->readByte()) != 0xFF) { - if (*q == 87) { - in->readUint16BE(); - } else { - q = readSingleOpcode(in, q); - } - } - - size = (q - line_buffer + 1); - memcpy(allocateTable(size), line_buffer, size); - } -} - -void SimonEngine::readSubroutineBlock(File *in) { - while (in->readUint16BE() == 0) { - readSubroutine(in, createSubroutine(in->readUint16BE())); - } -} - -} // End of namespace Simon |