scummvm/engines/sword2/startup.cpp

173 lines
4.7 KiB
C++
Raw Normal View History

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
2003-07-28 01:44:38 +00:00
*
* Additional copyright for this file:
* Copyright (C) 1994-1998 Revolution Software Ltd.
*
2003-07-28 01:44:38 +00:00
* 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.
2003-07-28 01:44:38 +00:00
*
* $URL$
* $Id$
2003-07-28 01:44:38 +00:00
*/
#include "common/stdafx.h"
#include "common/file.h"
2004-11-14 15:00:01 +00:00
#include "sword2/sword2.h"
#include "sword2/defs.h"
#include "sword2/header.h"
#include "sword2/logic.h"
#include "sword2/maketext.h"
2004-11-14 15:00:01 +00:00
#include "sword2/memory.h"
#include "sword2/resman.h"
2004-11-14 15:00:01 +00:00
#include "sword2/router.h"
#include "sword2/sound.h"
2003-07-28 01:44:38 +00:00
2003-10-04 00:52:27 +00:00
namespace Sword2 {
bool Sword2Engine::initStartMenu() {
2003-09-20 17:00:14 +00:00
// 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.
2003-07-28 01:44:38 +00:00
Common::File fp;
2003-09-20 17:00:14 +00:00
// ok, load in the master screen manager file
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
_totalStartups = 0;
_totalScreenManagers = 0;
2003-07-28 01:44:38 +00:00
if (!fp.open("startup.inf")) {
2004-04-27 08:59:58 +00:00
warning("Cannot open startup.inf - the debugger won't have a start menu");
return false;
2003-07-28 01:44:38 +00:00
}
// The startup.inf file which contains a list of all the files. Now
// extract the filenames
2004-04-27 08:59:58 +00:00
int start_ids[MAX_starts];
char buf[10];
2004-04-27 08:59:58 +00:00
int lineno = 0;
while (fp.readLine(buf, sizeof(buf))) {
char *errptr;
int id;
lineno++;
id = strtol(buf, &errptr, 10);
if (*errptr) {
warning("startup.inf:%d: Invalid string '%s'", lineno, buf);
continue;
}
if (!_resman->checkValid(id)) {
warning("startup.inf:%d: Invalid resource %d", lineno, id);
continue;
}
if (_resman->fetchType(id) != SCREEN_MANAGER) {
2006-07-08 20:45:01 +00:00
warning("startup.inf:%d: '%s' (%d) is not a screen manager", lineno, _resman->fetchName(id), id);
continue;
}
start_ids[_totalScreenManagers] = id;
if (++_totalScreenManagers >= MAX_starts) {
warning("Too many entries in startup.inf");
2003-07-28 01:44:38 +00:00
break;
}
}
fp.close();
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
// Using this method the Gode generated resource.inf must have #0d0a
2003-09-20 17:00:14 +00:00
// on the last entry
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
debug(1, "%d screen manager objects", _totalScreenManagers);
2003-07-28 01:44:38 +00:00
2003-09-20 17:00:14 +00:00
// 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
2003-07-28 01:44:38 +00:00
for (uint i = 0; i < _totalScreenManagers; i++) {
2004-04-27 08:59:58 +00:00
_startRes = start_ids[i];
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
debug(2, "Querying screen manager %d", _startRes);
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
// Open each one and run through the interpreter. Script 0 is
// the query request script. We have already made reasonably
// sure the resource is ok.
2003-07-28 01:44:38 +00:00
_logic->runResScript(_startRes, 0);
2003-07-28 01:44:38 +00:00
}
2003-09-20 17:00:14 +00:00
return 1;
}
2003-07-28 01:44:38 +00:00
void Sword2Engine::registerStartPoint(int32 key, char *name) {
2004-04-27 08:59:58 +00:00
assert(_totalStartups < MAX_starts);
2003-07-28 01:44:38 +00:00
_startList[_totalStartups].start_res_id = _startRes;
_startList[_totalStartups].key = key;
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
strncpy(_startList[_totalStartups].description, name, MAX_description);
_startList[_totalStartups].description[MAX_description - 1] = 0;
2003-07-28 01:44:38 +00:00
_totalStartups++;
2003-07-28 01:44:38 +00:00
}
void Sword2Engine::runStart(int start) {
2004-04-27 08:59:58 +00:00
// Restarting - stop sfx, music & speech!
2003-09-20 17:00:14 +00:00
_sound->clearFxQueue(true);
_logic->fnStopMusic(NULL);
_sound->unpauseSpeech();
_sound->stopSpeech();
2003-09-20 17:00:14 +00:00
2004-04-27 08:59:58 +00:00
// Remove all resources from memory, including player object and global
// variables
2003-09-20 17:00:14 +00:00
_resman->removeAll();
2003-07-28 01:44:38 +00:00
// Reopen global variables resource and player object
setupPersistentResources();
2003-07-28 01:44:38 +00:00
2004-04-27 08:59:58 +00:00
// Free all the route memory blocks from previous game
_logic->_router->freeAllRouteMem();
2003-09-20 17:00:14 +00:00
2004-04-27 08:59:58 +00:00
// If there was speech text, kill the text block
if (_logic->_speechTextBlocNo) {
_fontRenderer->killTextBloc(_logic->_speechTextBlocNo);
_logic->_speechTextBlocNo = 0;
2004-04-27 08:59:58 +00:00
}
2003-09-20 17:00:14 +00:00
_logic->runResObjScript(_startList[start].start_res_id, CUR_PLAYER_ID, _startList[start].key & 0xffff);
2003-09-20 17:00:14 +00:00
2004-04-27 08:59:58 +00:00
// Make sure there's a mouse, in case restarting while mouse not
// available
_logic->fnAddHuman(NULL);
2003-09-20 17:00:14 +00:00
}
2003-10-04 00:52:27 +00:00
} // End of namespace Sword2