diff options
Diffstat (limited to 'engines/sword2/startup.cpp')
-rw-r--r-- | engines/sword2/startup.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/engines/sword2/startup.cpp b/engines/sword2/startup.cpp new file mode 100644 index 0000000000..2e1dd7b0ae --- /dev/null +++ b/engines/sword2/startup.cpp @@ -0,0 +1,173 @@ +/* Copyright (C) 1994-1998 Revolution Software Ltd. + * Copyright (C) 2003-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 "common/file.h" + +#include "sword2/sword2.h" +#include "sword2/defs.h" +#include "sword2/logic.h" +#include "sword2/maketext.h" +#include "sword2/memory.h" +#include "sword2/resman.h" +#include "sword2/router.h" +#include "sword2/sound.h" + +namespace Sword2 { + +bool Sword2Engine::initStartMenu() { + // Print out a list of all the start points available. + // There should be a linc produced file called startup.txt. + // This file should contain ascii numbers of all the resource game + // objects that are screen managers. + // We query each in turn and setup an array of start structures. + // If the file doesn't exist then we say so and return a 0. + + Common::File fp; + + // ok, load in the master screen manager file + + _totalStartups = 0; + _totalScreenManagers = 0; + + if (!fp.open("startup.inf")) { + warning("Cannot open startup.inf - the debugger won't have a start menu"); + return false; + } + + // The startup.inf file which contains a list of all the files. Now + // extract the filenames + + int start_ids[MAX_starts]; + + while (1) { + bool done = false; + + start_ids[_totalScreenManagers] = 0; + + // Scan the string until the LF in CRLF + + int b; + + do { + b = fp.readByte(); + + if (fp.ioFailed()) { + done = true; + break; + } + + if (isdigit(b)) { + start_ids[_totalScreenManagers] *= 10; + start_ids[_totalScreenManagers] += (b - '0'); + } + } while (b != 10); + + if (done) + break; + + _totalScreenManagers++; + + if (_totalScreenManagers == MAX_starts) { + warning("MAX_starts exceeded"); + break; + } + } + + fp.close(); + + // Using this method the Gode generated resource.inf must have #0d0a + // on the last entry + + debug(1, "%d screen manager objects", _totalScreenManagers); + + // Open each object and make a query call. The object must fill in a + // startup structure. It may fill in several if it wishes - for + // instance a startup could be set for later in the game where + // specific vars are set + + for (uint i = 0; i < _totalScreenManagers; i++) { + _startRes = start_ids[i]; + + debug(2, "Querying screen manager %d", _startRes); + + // Open each one and run through the interpreter. Script 0 is + // the query request script + + // if the resource number is within range & it's not a null + // resource + // - need to check in case un-built sections included in + // start list + + if (_resman->checkValid(_startRes)) { + _logic->runResScript(_startRes, 0); + } else + warning("Start menu resource %d invalid", _startRes); + } + + return 1; +} + +void Sword2Engine::registerStartPoint(int32 key, char *name) { + assert(_totalStartups < MAX_starts); + + _startList[_totalStartups].start_res_id = _startRes; + _startList[_totalStartups].key = key; + + strncpy(_startList[_totalStartups].description, name, MAX_description); + _startList[_totalStartups].description[MAX_description - 1] = 0; + + _totalStartups++; +} + +void Sword2Engine::runStart(int start) { + // Restarting - stop sfx, music & speech! + + _sound->clearFxQueue(); + _logic->fnStopMusic(NULL); + _sound->unpauseSpeech(); + _sound->stopSpeech(); + + // Remove all resources from memory, including player object and global + // variables + + _resman->removeAll(); + + // Reopen global variables resource and player object + setupPersistentResources(); + + // Free all the route memory blocks from previous game + _logic->_router->freeAllRouteMem(); + + // If there was speech text, kill the text block + if (_logic->_speechTextBlocNo) { + _fontRenderer->killTextBloc(_logic->_speechTextBlocNo); + _logic->_speechTextBlocNo = 0; + } + + _logic->runResObjScript(_startList[start].start_res_id, CUR_PLAYER_ID, _startList[start].key & 0xffff); + + // Make sure there's a mouse, in case restarting while mouse not + // available + _logic->fnAddHuman(NULL); +} + +} // End of namespace Sword2 |