aboutsummaryrefslogtreecommitdiff
path: root/awe/engine.cpp
diff options
context:
space:
mode:
authorPaweł Kołodziejski2004-05-05 07:25:32 +0000
committerPaweł Kołodziejski2004-05-05 07:25:32 +0000
commite29ec6e79c325bcea2c95ecbfeb3a64c80a30630 (patch)
treecc532d796c8800d693105ce7c1f9c799111f37fe /awe/engine.cpp
parent06002009806a770198c7e228f8b3e0203439b17d (diff)
downloadscummvm-rg350-e29ec6e79c325bcea2c95ecbfeb3a64c80a30630.tar.gz
scummvm-rg350-e29ec6e79c325bcea2c95ecbfeb3a64c80a30630.tar.bz2
scummvm-rg350-e29ec6e79c325bcea2c95ecbfeb3a64c80a30630.zip
adding initial code for Another World engine
svn-id: r13783
Diffstat (limited to 'awe/engine.cpp')
-rw-r--r--awe/engine.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/awe/engine.cpp b/awe/engine.cpp
new file mode 100644
index 0000000000..ab8b60dea4
--- /dev/null
+++ b/awe/engine.cpp
@@ -0,0 +1,145 @@
+/* AWE - Another World Engine
+ * Copyright (C) 2004 Gregory Montoir
+ * Copyright (C) 2004 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "stdafx.h"
+
+#include "awe.h"
+#include "engine.h"
+#include "file.h"
+#include "serializer.h"
+#include "systemstub.h"
+
+namespace Awe {
+
+Engine::Engine(SystemStub *stub, const char *dataDir, const char *saveDir)
+ : _stub(stub), _log(&_res, &_vid, stub), _res(&_vid, dataDir), _vid(&_res, stub),
+ _dataDir(dataDir), _saveDir(saveDir), _stateSlot(0) {
+}
+
+void Engine::run() {
+ _stub->init("Out Of This World");
+ setup();
+ // XXX
+ _log.restartAt(0x3E80); // demo starts at 0x3E81
+ while (!_stub->_pi.quit) {
+ _log.setupScripts();
+ _log.inp_updatePlayer();
+ processInput();
+ _log.runScripts();
+ }
+ finish();
+ _stub->destroy();
+}
+
+void Engine::setup() {
+ _vid.init();
+ _res.allocMemBlock();
+ _res.readEntries();
+ _log.init();
+}
+
+void Engine::finish() {
+ // XXX
+ _res.freeMemBlock();
+}
+
+void Engine::processInput() {
+ if (_stub->_pi.load) {
+ loadGameState(_stateSlot);
+ _stub->_pi.load = false;
+ }
+ if (_stub->_pi.save) {
+ saveGameState(_stateSlot, "quicksave");
+ _stub->_pi.save = false;
+ }
+ if (_stub->_pi.fastMode) {
+ _log._fastMode = !_log._fastMode;
+ _stub->_pi.fastMode = false;
+ }
+ if (_stub->_pi.stateSlot != 0) {
+ int8 slot = _stateSlot + _stub->_pi.stateSlot;
+ if (slot >= 0 && slot < MAX_SAVE_SLOTS) {
+ _stateSlot = slot;
+ debug(DBG_INFO, "Current game state slot is %d", _stateSlot);
+ }
+ _stub->_pi.stateSlot = 0;
+ }
+}
+
+void Engine::makeGameStateName(uint8 slot, char *buf) {
+ sprintf(buf, "raw.s%02d", slot);
+}
+
+void Engine::saveGameState(uint8 slot, const char *desc) {
+ char stateFile[20];
+ makeGameStateName(slot, stateFile);
+ File f(true);
+ if (!f.open(stateFile, _saveDir, "wb")) {
+ ::warning("Unable to save state file '%s'", stateFile);
+ } else {
+ // header
+ f.writeUint32BE('AWSV');
+ f.writeUint16BE(Serializer::CUR_VER);
+ f.writeUint16BE(0);
+ char hdrdesc[32];
+ strncpy(hdrdesc, desc, sizeof(hdrdesc) - 1);
+ f.write(hdrdesc, sizeof(hdrdesc));
+ // contents
+ Serializer s(&f, Serializer::SM_SAVE, _res._memPtrStart);
+ _log.saveOrLoad(s);
+ _res.saveOrLoad(s);
+ _vid.saveOrLoad(s);
+ if (f.ioErr()) {
+ ::warning("I/O error when saving game state");
+ } else {
+ debug(DBG_INFO, "Saved state to slot %d", _stateSlot);
+ }
+ }
+}
+
+void Engine::loadGameState(uint8 slot) {
+ char stateFile[20];
+ makeGameStateName(slot, stateFile);
+ File f(true);
+ if (!f.open(stateFile, _saveDir, "rb")) {
+ ::warning("Unable to open state file '%s'", stateFile);
+ } else {
+ uint32 id = f.readUint32BE();
+ if (id != 'AWSV') {
+ ::warning("Bad savegame format");
+ } else {
+ uint16 ver = f.readUint16BE();
+ f.readUint16BE();
+ char hdrdesc[32];
+ f.read(hdrdesc, sizeof(hdrdesc));
+ // contents
+ Serializer s(&f, Serializer::SM_LOAD, _res._memPtrStart, ver);
+ _log.saveOrLoad(s);
+ _res.saveOrLoad(s);
+ _vid.saveOrLoad(s);
+ }
+ if (f.ioErr()) {
+ ::warning("I/O error when loading game state");
+ } else {
+ debug(DBG_INFO, "Loaded state from slot %d", _stateSlot);
+ }
+ }
+}
+
+}