adding initial code for Another World engine
svn-id: r13783
This commit is contained in:
parent
0600200980
commit
e29ec6e79c
30 changed files with 3863 additions and 10 deletions
|
@ -91,6 +91,12 @@ else
|
||||||
MODULES += kyra
|
MODULES += kyra
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef DISABLE_AWE
|
||||||
|
DEFINES += -DDISABLE_AWE
|
||||||
|
else
|
||||||
|
MODULES += awe
|
||||||
|
endif
|
||||||
|
|
||||||
# After the game specific modules follow the shared modules
|
# After the game specific modules follow the shared modules
|
||||||
MODULES += \
|
MODULES += \
|
||||||
gui \
|
gui \
|
||||||
|
|
130
awe/awe.cpp
Normal file
130
awe/awe.cpp
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
/* 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 "common/stdafx.h"
|
||||||
|
|
||||||
|
#include "base/gameDetector.h"
|
||||||
|
#include "base/plugins.h"
|
||||||
|
#include "backends/fs/fs.h"
|
||||||
|
|
||||||
|
#include "sound/mixer.h"
|
||||||
|
#include "common/file.h"
|
||||||
|
#include "common/config-manager.h"
|
||||||
|
|
||||||
|
#include "awe/awe.h"
|
||||||
|
#include "awe/engine.h"
|
||||||
|
#include "awe/systemstub.h"
|
||||||
|
#include "awe/util.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct AWEGameSettings {
|
||||||
|
const char *name;
|
||||||
|
const char *description;
|
||||||
|
byte id;
|
||||||
|
uint32 features;
|
||||||
|
const char *detectname;
|
||||||
|
GameSettings toGameSettings() const {
|
||||||
|
GameSettings dummy = { name, description, features };
|
||||||
|
return dummy;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AWEGameSettings awe_settings[] = {
|
||||||
|
/* Another World - Out of this World - Europe DOS version */
|
||||||
|
{ "worlde", "Another World - Out of this World - (Europe, DOS)", Awe::GID_WORLDE, MDT_ADLIB, "bank01" },
|
||||||
|
{ NULL, NULL, 0, 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
GameList Engine_AWE_gameList() {
|
||||||
|
const AWEGameSettings *g = awe_settings;
|
||||||
|
GameList games;
|
||||||
|
while (g->name) {
|
||||||
|
games.push_back(g->toGameSettings());
|
||||||
|
g++;
|
||||||
|
}
|
||||||
|
return games;
|
||||||
|
}
|
||||||
|
|
||||||
|
DetectedGameList Engine_AWE_detectGames(const FSList &fslist) {
|
||||||
|
DetectedGameList detectedGames;
|
||||||
|
const AWEGameSettings *g;
|
||||||
|
|
||||||
|
for (g = awe_settings; g->name; ++g) {
|
||||||
|
// Iterate over all files in the given directory
|
||||||
|
for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
|
||||||
|
const char *gameName = file->displayName().c_str();
|
||||||
|
|
||||||
|
if (0 == scumm_stricmp(g->detectname, gameName)) {
|
||||||
|
// Match found, add to list of candidates, then abort inner loop.
|
||||||
|
detectedGames.push_back(g->toGameSettings());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return detectedGames;
|
||||||
|
}
|
||||||
|
|
||||||
|
Engine *Engine_AWE_create(GameDetector *detector, OSystem *syst) {
|
||||||
|
return new Awe::AweEngine(detector, syst);
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_PLUGIN("AWE Engine", Engine_AWE_gameList, Engine_AWE_create, Engine_AWE_detectGames)
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
AweEngine::AweEngine(GameDetector *detector, OSystem *syst)
|
||||||
|
: Engine(syst) {
|
||||||
|
|
||||||
|
// Setup mixer
|
||||||
|
if (!_mixer->isReady()) {
|
||||||
|
::warning("Sound initialization failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_mixer->setVolume(ConfMan.getInt("sfx_volume") * ConfMan.getInt("master_volume") / 255);
|
||||||
|
|
||||||
|
_dataPath = getGameDataPath();
|
||||||
|
_savePath = getSavePath();
|
||||||
|
|
||||||
|
// Initialize backend
|
||||||
|
syst->initSize(320, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
AweEngine::~AweEngine() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AweEngine::errorString(const char *buf1, char *buf2) {
|
||||||
|
strcpy(buf2, buf1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AweEngine::go() {
|
||||||
|
g_debugMask = DBG_INFO;
|
||||||
|
SystemStub *stub = SystemStub_SDL_create();
|
||||||
|
debug(0, "%s %s", _dataPath, _savePath);
|
||||||
|
Awe::Engine *e = new Awe::Engine(stub, _dataPath, _savePath);
|
||||||
|
e->run();
|
||||||
|
delete e;
|
||||||
|
delete stub;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AweEngine::shutdown() {
|
||||||
|
_system->quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
57
awe/awe.h
Normal file
57
awe/awe.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AWE_H
|
||||||
|
#define AWE_H
|
||||||
|
|
||||||
|
#include "common/stdafx.h"
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
#include "base/engine.h"
|
||||||
|
#include "base/gameDetector.h"
|
||||||
|
#include "common/util.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
#define BYPASS_PROTECTION
|
||||||
|
|
||||||
|
enum AWEGameId {
|
||||||
|
GID_WORLDE
|
||||||
|
};
|
||||||
|
|
||||||
|
class AweEngine : public ::Engine {
|
||||||
|
|
||||||
|
void errorString( const char *buf_input, char *buf_output);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void go();
|
||||||
|
void shutdown();
|
||||||
|
|
||||||
|
const char *_dataPath;
|
||||||
|
const char *_savePath;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
AweEngine(GameDetector *detector, OSystem *syst);
|
||||||
|
virtual ~AweEngine();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
140
awe/bank.cpp
Normal file
140
awe/bank.cpp
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
/* 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 "common/stdafx.h"
|
||||||
|
|
||||||
|
#include "awe/awe.h"
|
||||||
|
#include "awe/bank.h"
|
||||||
|
#include "awe/file.h"
|
||||||
|
#include "awe/resource.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
Bank::Bank(const char *dataDir)
|
||||||
|
: _dataDir(dataDir) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Bank::read(const MemEntry *me, uint8 *buf) {
|
||||||
|
bool ret = false;
|
||||||
|
char bankName[10];
|
||||||
|
sprintf(bankName, "bank%02x", me->bankNum);
|
||||||
|
File f;
|
||||||
|
if (f.open(bankName, _dataDir)) {
|
||||||
|
f.seek(me->bankPos);
|
||||||
|
if (me->packedSize == me->unpackedSize) {
|
||||||
|
f.read(buf, me->packedSize);
|
||||||
|
ret = true;
|
||||||
|
} else {
|
||||||
|
f.read(buf, me->packedSize);
|
||||||
|
_startBuf = buf;
|
||||||
|
_iBuf = buf + me->packedSize - 4;
|
||||||
|
ret = unpack();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
::error("Bank::read() unable to open '%s'", bankName);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Bank::decUnk1(uint8 numChunks, uint8 addCount) {
|
||||||
|
uint16 count = getCode(numChunks) + addCount + 1;
|
||||||
|
debug(DBG_BANK, "Bank::decUnk1(%d, %d) count=%d", numChunks, addCount, count);
|
||||||
|
_unpCtx.datasize -= count;
|
||||||
|
while (count--) {
|
||||||
|
assert(_oBuf >= _iBuf && _oBuf >= _startBuf);
|
||||||
|
*_oBuf = (uint8)getCode(8);
|
||||||
|
--_oBuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Bank::decUnk2(uint8 numChunks) {
|
||||||
|
uint16 i = getCode(numChunks);
|
||||||
|
uint16 count = _unpCtx.size + 1;
|
||||||
|
debug(DBG_BANK, "Bank::decUnk2(%d) i=%d count=%d", numChunks, i, count);
|
||||||
|
_unpCtx.datasize -= count;
|
||||||
|
while (count--) {
|
||||||
|
assert(_oBuf >= _iBuf && _oBuf >= _startBuf);
|
||||||
|
*_oBuf = *(_oBuf + i);
|
||||||
|
--_oBuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Bank::unpack() {
|
||||||
|
_unpCtx.size = 0;
|
||||||
|
_unpCtx.datasize = READ_BE_UINT32(_iBuf); _iBuf -= 4;
|
||||||
|
_oBuf = _startBuf + _unpCtx.datasize - 1;
|
||||||
|
_unpCtx.crc = READ_BE_UINT32(_iBuf); _iBuf -= 4;
|
||||||
|
_unpCtx.chk = READ_BE_UINT32(_iBuf); _iBuf -= 4;
|
||||||
|
_unpCtx.crc ^= _unpCtx.chk;
|
||||||
|
do {
|
||||||
|
if (!nextChunk()) {
|
||||||
|
_unpCtx.size = 1;
|
||||||
|
if (!nextChunk()) {
|
||||||
|
decUnk1(3, 0);
|
||||||
|
} else {
|
||||||
|
decUnk2(8);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uint16 c = getCode(2);
|
||||||
|
if (c == 3) {
|
||||||
|
decUnk1(8, 8);
|
||||||
|
} else {
|
||||||
|
if (c < 2) {
|
||||||
|
_unpCtx.size = c + 2;
|
||||||
|
decUnk2(c + 9);
|
||||||
|
} else {
|
||||||
|
_unpCtx.size = getCode(8);
|
||||||
|
decUnk2(12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (_unpCtx.datasize > 0);
|
||||||
|
return (_unpCtx.crc == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 Bank::getCode(uint8 numChunks) {
|
||||||
|
uint16 c = 0;
|
||||||
|
while (numChunks--) {
|
||||||
|
c <<= 1;
|
||||||
|
if (nextChunk()) {
|
||||||
|
c |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Bank::nextChunk() {
|
||||||
|
bool CF = rcr(false);
|
||||||
|
if (_unpCtx.chk == 0) {
|
||||||
|
assert(_iBuf >= _startBuf);
|
||||||
|
_unpCtx.chk = READ_BE_UINT32(_iBuf); _iBuf -= 4;
|
||||||
|
_unpCtx.crc ^= _unpCtx.chk;
|
||||||
|
CF = rcr(true);
|
||||||
|
}
|
||||||
|
return CF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Bank::rcr(bool CF) {
|
||||||
|
bool rCF = (_unpCtx.chk & 1);
|
||||||
|
_unpCtx.chk >>= 1;
|
||||||
|
if (CF) _unpCtx.chk |= 0x80000000;
|
||||||
|
return rCF;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
56
awe/bank.h
Normal file
56
awe/bank.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BANK_H__
|
||||||
|
#define __BANK_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct MemEntry;
|
||||||
|
|
||||||
|
struct UnpackContext {
|
||||||
|
uint16 size;
|
||||||
|
uint32 crc;
|
||||||
|
uint32 chk;
|
||||||
|
int32 datasize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Bank {
|
||||||
|
UnpackContext _unpCtx;
|
||||||
|
const char *_dataDir;
|
||||||
|
uint8 *_iBuf, *_oBuf, *_startBuf;
|
||||||
|
|
||||||
|
Bank(const char *dataDir);
|
||||||
|
|
||||||
|
bool read(const MemEntry *me, uint8 *buf);
|
||||||
|
void decUnk1(uint8 numChunks, uint8 addCount);
|
||||||
|
void decUnk2(uint8 numChunks);
|
||||||
|
bool unpack();
|
||||||
|
uint16 getCode(uint8 numChunks);
|
||||||
|
bool nextChunk();
|
||||||
|
bool rcr(bool CF);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
145
awe/engine.cpp
Normal file
145
awe/engine.cpp
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
60
awe/engine.h
Normal file
60
awe/engine.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ENGINE_H__
|
||||||
|
#define __ENGINE_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
#include "logic.h"
|
||||||
|
#include "resource.h"
|
||||||
|
#include "video.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct SystemStub;
|
||||||
|
|
||||||
|
struct Engine {
|
||||||
|
enum {
|
||||||
|
MAX_SAVE_SLOTS = 100
|
||||||
|
};
|
||||||
|
|
||||||
|
SystemStub *_stub;
|
||||||
|
Logic _log;
|
||||||
|
Resource _res;
|
||||||
|
Video _vid;
|
||||||
|
const char *_dataDir, *_saveDir;
|
||||||
|
uint8 _stateSlot;
|
||||||
|
|
||||||
|
Engine(SystemStub *stub, const char *dataDir, const char *saveDir);
|
||||||
|
|
||||||
|
void run();
|
||||||
|
void setup();
|
||||||
|
void finish();
|
||||||
|
void processInput();
|
||||||
|
|
||||||
|
void makeGameStateName(uint8 slot, char *buf);
|
||||||
|
void saveGameState(uint8 slot, const char *desc);
|
||||||
|
void loadGameState(uint8 slot);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
190
awe/file.cpp
Normal file
190
awe/file.cpp
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/* 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 "zlib.h"
|
||||||
|
#include "file.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct File_impl {
|
||||||
|
bool _ioErr;
|
||||||
|
File_impl() : _ioErr(false) {}
|
||||||
|
virtual bool open(const char *path, const char *mode) = 0;
|
||||||
|
virtual void close() = 0;
|
||||||
|
virtual void seek(int32 off) = 0;
|
||||||
|
virtual void read(void *ptr, uint32 size) = 0;
|
||||||
|
virtual void write(void *ptr, uint32 size) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stdFile : File_impl {
|
||||||
|
FILE *_fp;
|
||||||
|
stdFile() : _fp(0) {}
|
||||||
|
bool open(const char *path, const char *mode) {
|
||||||
|
_ioErr = false;
|
||||||
|
_fp = fopen(path, mode);
|
||||||
|
return (_fp != NULL);
|
||||||
|
}
|
||||||
|
void close() {
|
||||||
|
if (_fp) {
|
||||||
|
fclose(_fp);
|
||||||
|
_fp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void seek(int32 off) {
|
||||||
|
if (_fp) {
|
||||||
|
fseek(_fp, off, SEEK_SET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void read(void *ptr, uint32 size) {
|
||||||
|
if (_fp) {
|
||||||
|
uint32 r = fread(ptr, 1, size, _fp);
|
||||||
|
if (r != size) {
|
||||||
|
_ioErr = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void write(void *ptr, uint32 size) {
|
||||||
|
if (_fp) {
|
||||||
|
uint32 r = fwrite(ptr, 1, size, _fp);
|
||||||
|
if (r != size) {
|
||||||
|
_ioErr = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct zlibFile : File_impl {
|
||||||
|
gzFile _fp;
|
||||||
|
zlibFile() : _fp(0) {}
|
||||||
|
bool open(const char *path, const char *mode) {
|
||||||
|
_ioErr = false;
|
||||||
|
_fp = gzopen(path, mode);
|
||||||
|
return (_fp != NULL);
|
||||||
|
}
|
||||||
|
void close() {
|
||||||
|
if (_fp) {
|
||||||
|
gzclose(_fp);
|
||||||
|
_fp = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void seek(int32 off) {
|
||||||
|
if (_fp) {
|
||||||
|
gzseek(_fp, off, SEEK_SET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void read(void *ptr, uint32 size) {
|
||||||
|
if (_fp) {
|
||||||
|
uint32 r = gzread(_fp, ptr, size);
|
||||||
|
if (r != size) {
|
||||||
|
_ioErr = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void write(void *ptr, uint32 size) {
|
||||||
|
if (_fp) {
|
||||||
|
uint32 r = gzwrite(_fp, ptr, size);
|
||||||
|
if (r != size) {
|
||||||
|
_ioErr = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
File::File(bool gzipped) {
|
||||||
|
if (gzipped) {
|
||||||
|
_impl = new zlibFile;
|
||||||
|
} else {
|
||||||
|
_impl = new stdFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
File::~File() {
|
||||||
|
_impl->close();
|
||||||
|
delete _impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::open(const char *filename, const char *directory, const char *mode) {
|
||||||
|
_impl->close();
|
||||||
|
char buf[512];
|
||||||
|
sprintf(buf, "%s/%s", directory, filename);
|
||||||
|
char *p = buf + strlen(directory) + 1;
|
||||||
|
string_lower(p);
|
||||||
|
bool opened = _impl->open(buf, mode);
|
||||||
|
if (!opened) { // let's try uppercase
|
||||||
|
string_upper(p);
|
||||||
|
opened = _impl->open(buf, mode);
|
||||||
|
}
|
||||||
|
return opened;
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::close() {
|
||||||
|
_impl->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool File::ioErr() const {
|
||||||
|
return _impl->_ioErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::seek(int32 off) {
|
||||||
|
_impl->seek(off);
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::read(void *ptr, uint32 size) {
|
||||||
|
_impl->read(ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 File::readByte() {
|
||||||
|
uint8 b;
|
||||||
|
read(&b, 1);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 File::readUint16BE() {
|
||||||
|
uint8 hi = readByte();
|
||||||
|
uint8 lo = readByte();
|
||||||
|
return (hi << 8) | lo;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 File::readUint32BE() {
|
||||||
|
uint16 hi = readUint16BE();
|
||||||
|
uint16 lo = readUint16BE();
|
||||||
|
return (hi << 16) | lo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::write(void *ptr, uint32 size) {
|
||||||
|
_impl->write(ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::writeByte(uint8 b) {
|
||||||
|
write(&b, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::writeUint16BE(uint16 n) {
|
||||||
|
writeByte(n >> 8);
|
||||||
|
writeByte(n & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void File::writeUint32BE(uint32 n) {
|
||||||
|
writeUint16BE(n >> 16);
|
||||||
|
writeUint16BE(n & 0xFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
53
awe/file.h
Normal file
53
awe/file.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __FILE_H__
|
||||||
|
#define __FILE_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct File_impl;
|
||||||
|
|
||||||
|
struct File {
|
||||||
|
File_impl *_impl;
|
||||||
|
|
||||||
|
File(bool gzipped = false);
|
||||||
|
~File();
|
||||||
|
|
||||||
|
bool open(const char *filename, const char *directory, const char *mode="rb");
|
||||||
|
void close();
|
||||||
|
bool ioErr() const;
|
||||||
|
void seek(int32 off);
|
||||||
|
void read(void *ptr, uint32 size);
|
||||||
|
uint8 readByte();
|
||||||
|
uint16 readUint16BE();
|
||||||
|
uint32 readUint32BE();
|
||||||
|
void write(void *ptr, uint32 size);
|
||||||
|
void writeByte(uint8 b);
|
||||||
|
void writeUint16BE(uint16 n);
|
||||||
|
void writeUint32BE(uint32 n);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
67
awe/intern.h
Normal file
67
awe/intern.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __INTERN_H__
|
||||||
|
#define __INTERN_H__
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void SWAP(T &a, T &b) {
|
||||||
|
T tmp = a;
|
||||||
|
a = b;
|
||||||
|
b = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Ptr {
|
||||||
|
uint8 *pc;
|
||||||
|
|
||||||
|
uint8 fetchByte() {
|
||||||
|
return *pc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 fetchWord() {
|
||||||
|
uint16 i = READ_BE_UINT16(pc);
|
||||||
|
pc += 2;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
int16 x, y;
|
||||||
|
|
||||||
|
Point() : x(0), y(0) {}
|
||||||
|
Point(int16 xx, int16 yy) : x(xx), y(yy) {}
|
||||||
|
Point(const Point &p) : x(p.x), y(p.y) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
512
awe/logic.cpp
Normal file
512
awe/logic.cpp
Normal file
|
@ -0,0 +1,512 @@
|
||||||
|
/* 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 <ctime>
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "awe.h"
|
||||||
|
#include "logic.h"
|
||||||
|
#include "resource.h"
|
||||||
|
#include "video.h"
|
||||||
|
#include "serializer.h"
|
||||||
|
#include "systemstub.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
Logic::Logic(Resource *res, Video *vid, SystemStub *stub)
|
||||||
|
: _res(res), _vid(vid), _stub(stub) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::init() {
|
||||||
|
memset(_scriptVars, 0, sizeof(_scriptVars));
|
||||||
|
_scriptVars[0x54] = 0x81;
|
||||||
|
_scriptVars[VAR_RANDOM_SEED] = time(0);
|
||||||
|
_fastMode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_movConst() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
int16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_movConst(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_mov() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint8 j = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_mov(0x%02X, 0x%02X)", i, j);
|
||||||
|
_scriptVars[i] = _scriptVars[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_add() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint8 j = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_add(0x%02X, 0x%02X)", i, j);
|
||||||
|
_scriptVars[i] += _scriptVars[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_addConst() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
int16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_addConst(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_call() {
|
||||||
|
uint16 off = _scriptPtr.fetchWord();
|
||||||
|
uint8 sp = _stackPtr;
|
||||||
|
debug(DBG_LOGIC, "Logic::op_call(0x%X)", off);
|
||||||
|
_scriptStackCalls[sp] = _scriptPtr.pc - _res->_segCode;
|
||||||
|
++_stackPtr;
|
||||||
|
_scriptPtr.pc = _res->_segCode + off;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_ret() {
|
||||||
|
debug(DBG_LOGIC, "Logic::op_ret()");
|
||||||
|
--_stackPtr;
|
||||||
|
uint8 sp = _stackPtr;
|
||||||
|
_scriptPtr.pc = _res->_segCode + _scriptStackCalls[sp];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_break() {
|
||||||
|
debug(DBG_LOGIC, "Logic::op_break()");
|
||||||
|
_scriptHalted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_jmp() {
|
||||||
|
uint16 off = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_jmp(0x%02X)", off);
|
||||||
|
_scriptPtr.pc = _res->_segCode + off;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_setScriptPos() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_setScriptPos(0x%X, 0x%X)", i, n);
|
||||||
|
_scriptPos[1][i] = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_jnz() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_jnz(0x%02X)", i);
|
||||||
|
--_scriptVars[i];
|
||||||
|
if (_scriptVars[i] != 0) {
|
||||||
|
op_jmp();
|
||||||
|
} else {
|
||||||
|
_scriptPtr.fetchWord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_condJmp() {
|
||||||
|
#ifdef BYPASS_PROTECTION
|
||||||
|
if (_res->_curPtrsId == 0x3E80 && _scriptPtr.pc == _res->_segCode + 0xCB9) {
|
||||||
|
// (0x0CB8) condJmp(0x80, VAR(41), VAR(30), 0xCD3)
|
||||||
|
*(_scriptPtr.pc + 0x00) = 0x81;
|
||||||
|
*(_scriptPtr.pc + 0x03) = 0x0D;
|
||||||
|
*(_scriptPtr.pc + 0x04) = 0x24;
|
||||||
|
// (0x0D4E) condJmp(0x4, VAR(50), 6, 0xDBC)
|
||||||
|
*(_scriptPtr.pc + 0x99) = 0x0D;
|
||||||
|
*(_scriptPtr.pc + 0x9A) = 0x5A;
|
||||||
|
::warning("Logic::op_condJmp() bypassing protection");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
uint8 op = _scriptPtr.fetchByte();
|
||||||
|
int16 b = _scriptVars[_scriptPtr.fetchByte()];
|
||||||
|
int16 a = _scriptPtr.fetchByte();
|
||||||
|
if (op & 0x80) {
|
||||||
|
a = _scriptVars[a];
|
||||||
|
} else {
|
||||||
|
if (op & 0x40) {
|
||||||
|
a = (a << 8) | _scriptPtr.fetchByte();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug(DBG_LOGIC, "Logic::op_condJmp(%d, 0x%02X, 0x%02X)", op, b, a);
|
||||||
|
bool expr = false;
|
||||||
|
switch (op & 7) {
|
||||||
|
case 0: // jz
|
||||||
|
expr = (b == a);
|
||||||
|
break;
|
||||||
|
case 1: // jnz
|
||||||
|
expr = (b != a);
|
||||||
|
break;
|
||||||
|
case 2: // jg
|
||||||
|
expr = (b > a);
|
||||||
|
break;
|
||||||
|
case 3: // jge
|
||||||
|
expr = (b >= a);
|
||||||
|
break;
|
||||||
|
case 4: // jl
|
||||||
|
expr = (b < a);
|
||||||
|
break;
|
||||||
|
case 5: // jle
|
||||||
|
expr = (b <= a);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
::warning("Logic::op_condJmp() invalid condition %d", (op & 7));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (expr) {
|
||||||
|
op_jmp();
|
||||||
|
} else {
|
||||||
|
_scriptPtr.fetchWord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_setPalette() {
|
||||||
|
uint16 i = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_changePalette(%d)", i);
|
||||||
|
_vid->_newPal = i >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_resetScript() {
|
||||||
|
uint8 j = _scriptPtr.fetchByte();
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
int8 n = (i & 0x3F) - j;
|
||||||
|
if (n < 0) {
|
||||||
|
::warning("Logic::op_resetScript() ec=0x%X (n < 0)", 0x880);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
++n;
|
||||||
|
uint8 _al = _scriptPtr.fetchByte();
|
||||||
|
|
||||||
|
debug(DBG_LOGIC, "Logic::op_resetScript(%d, %d, %d)", j, i, _al);
|
||||||
|
|
||||||
|
if (_al == 2) {
|
||||||
|
uint16 *_si = &_scriptPos[1][j];
|
||||||
|
while (n--) {
|
||||||
|
*_si = 0xFFFE;
|
||||||
|
++_si;
|
||||||
|
}
|
||||||
|
} else if (_al < 2) {
|
||||||
|
uint8 *_si = &_scriptPaused[1][j];
|
||||||
|
while (n--) {
|
||||||
|
*_si = _al;
|
||||||
|
++_si;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_selectPage() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_selectPage(%d)", i);
|
||||||
|
_vid->changePagePtr1(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_fillPage() {
|
||||||
|
uint8 screen = _scriptPtr.fetchByte();
|
||||||
|
uint8 color = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_fillPage(%d, %d)", screen, color);
|
||||||
|
_vid->fillPage(screen, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_copyPage() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint8 j = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_copyPage(%d, %d)", i, j);
|
||||||
|
_vid->copyPage(i, j, _scriptVars[VAR_SCROLL_Y]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_updateDisplay() {
|
||||||
|
uint8 page = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_updateDisplay(%d)", page);
|
||||||
|
inp_handleSpecialKeys();
|
||||||
|
if (_res->_curPtrsId == 0x3E80 && _scriptVars[0x67] == 1) {
|
||||||
|
_scriptVar_0xBF = _scriptVars[0xBF];
|
||||||
|
_scriptVars[0xDC] = 0x21;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32 tstamp = 0;
|
||||||
|
if (!_fastMode) {
|
||||||
|
// XXX experimental
|
||||||
|
int32 delay = _stub->getTimeStamp() - tstamp;
|
||||||
|
int32 pause = _scriptVars[VAR_PAUSE_SLICES] * 20 - delay;
|
||||||
|
if (pause > 0) {
|
||||||
|
_stub->sleep(pause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_scriptVars[0xF7] = 0;
|
||||||
|
|
||||||
|
_vid->updateDisplay(page);
|
||||||
|
tstamp = _stub->getTimeStamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_halt() {
|
||||||
|
debug(DBG_LOGIC, "Logic::op_halt()");
|
||||||
|
_scriptPtr.pc = _res->_segCode + 0xFFFF;
|
||||||
|
_scriptHalted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_drawString() {
|
||||||
|
uint16 strId = _scriptPtr.fetchWord();
|
||||||
|
uint16 x = _scriptPtr.fetchByte();
|
||||||
|
uint16 y = _scriptPtr.fetchByte();
|
||||||
|
uint16 col = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_drawString(0x%03X, %d, %d, %d)", strId, x, y, col);
|
||||||
|
_vid->drawString(col, x, y, strId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_sub() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint8 j = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_sub(0x%02X, 0x%02X)", i, j);
|
||||||
|
_scriptVars[i] -= _scriptVars[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_and() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_and(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] = (uint16)_scriptVars[i] & n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_or() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_or(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] = (uint16)_scriptVars[i] | n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_shl() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_shl(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] = (uint16)_scriptVars[i] << n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_shr() {
|
||||||
|
uint8 i = _scriptPtr.fetchByte();
|
||||||
|
uint16 n = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_shr(0x%02X, %d)", i, n);
|
||||||
|
_scriptVars[i] = (uint16)_scriptVars[i] >> n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_soundUnk1() {
|
||||||
|
uint16 b = _scriptPtr.fetchWord();
|
||||||
|
uint16 c = _scriptPtr.fetchWord();
|
||||||
|
uint8 a = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_soundUnk1(0x%X, 0x%X, %d)", b, c, a);
|
||||||
|
// XXX
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_updateMemList() {
|
||||||
|
uint16 num = _scriptPtr.fetchWord();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_updateMemList(%d)", num);
|
||||||
|
_res->update(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::op_soundUnk2() {
|
||||||
|
uint16 b = _scriptPtr.fetchWord();
|
||||||
|
uint16 c = _scriptPtr.fetchWord();
|
||||||
|
uint8 a = _scriptPtr.fetchByte();
|
||||||
|
debug(DBG_LOGIC, "Logic::op_soundUnk2(0x%X, 0x%X, %d)", b, c, a);
|
||||||
|
// XXX
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::restartAt(uint16 ptrId) {
|
||||||
|
// XXX
|
||||||
|
_scriptVars[0xE4] = 0x14;
|
||||||
|
_res->setupPtrs(ptrId);
|
||||||
|
memset((uint8 *)_scriptPos, 0xFF, sizeof(_scriptPos));
|
||||||
|
memset((uint8 *)_scriptPaused, 0, sizeof(_scriptPaused));
|
||||||
|
_scriptPos[0][0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::setupScripts() {
|
||||||
|
if (_res->_newPtrsId != 0) {
|
||||||
|
restartAt(_res->_newPtrsId);
|
||||||
|
_res->_newPtrsId = 0;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 0x40; ++i) {
|
||||||
|
_scriptPaused[0][i] = _scriptPaused[1][i];
|
||||||
|
uint16 n = _scriptPos[1][i];
|
||||||
|
if (n != 0xFFFF) {
|
||||||
|
_scriptPos[0][i] = (n == 0xFFFE) ? 0xFFFF : n;
|
||||||
|
_scriptPos[1][i] = 0xFFFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::runScripts() {
|
||||||
|
for (int i = 0; i < 0x40; ++i) {
|
||||||
|
if (_scriptPaused[0][i] == 0) {
|
||||||
|
uint16 n = _scriptPos[0][i];
|
||||||
|
if (n != 0xFFFF) {
|
||||||
|
_scriptPtr.pc = _res->_segCode + n;
|
||||||
|
_stackPtr = 0;
|
||||||
|
_scriptHalted = false;
|
||||||
|
debug(DBG_LOGIC, "Logic::runScripts() i=0x%02X n=0x%02X *p=0x%02X", i, n, *_scriptPtr.pc);
|
||||||
|
executeScript();
|
||||||
|
_scriptPos[0][i] = _scriptPtr.pc - _res->_segCode;
|
||||||
|
debug(DBG_LOGIC, "Logic::runScripts() i=0x%02X pos=0x%X", i, _scriptPos[0][i]);
|
||||||
|
if (_stub->_pi.quit) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::executeScript() {
|
||||||
|
while (!_scriptHalted) {
|
||||||
|
uint8 opcode = _scriptPtr.fetchByte();
|
||||||
|
if (opcode & 0x80) {
|
||||||
|
uint16 off = ((opcode << 8) | _scriptPtr.fetchByte()) * 2;
|
||||||
|
_res->_useSegVideo2 = false;
|
||||||
|
int16 x = _scriptPtr.fetchByte();
|
||||||
|
int16 y = _scriptPtr.fetchByte();
|
||||||
|
int16 h = y - 199;
|
||||||
|
if (h > 0) {
|
||||||
|
y = 199;
|
||||||
|
x += h;
|
||||||
|
}
|
||||||
|
debug(DBG_VIDEO, "vid_opcd_0x80 : opcode=0x%X off=0x%X x=%d y=%d", opcode, off, x, y);
|
||||||
|
_vid->setDataBuffer(_res->_segVideo1, off);
|
||||||
|
_vid->drawShape(0xFF, 0x40, Point(x,y));
|
||||||
|
} else if (opcode & 0x40) {
|
||||||
|
int16 x, y;
|
||||||
|
uint16 off = _scriptPtr.fetchWord() * 2;
|
||||||
|
x = _scriptPtr.fetchByte();
|
||||||
|
_res->_useSegVideo2 = false;
|
||||||
|
if (!(opcode & 0x20)) {
|
||||||
|
if (!(opcode & 0x10)) {
|
||||||
|
x = (x << 8) | _scriptPtr.fetchByte();
|
||||||
|
} else {
|
||||||
|
x = _scriptVars[x];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (opcode & 0x10) {
|
||||||
|
x += 0x100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y = _scriptPtr.fetchByte();
|
||||||
|
if (!(opcode & 8)) {
|
||||||
|
if (!(opcode & 4)) {
|
||||||
|
y = (y << 8) | _scriptPtr.fetchByte();
|
||||||
|
} else {
|
||||||
|
y = _scriptVars[y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint16 zoom = _scriptPtr.fetchByte();
|
||||||
|
if (!(opcode & 2)) {
|
||||||
|
if (!(opcode & 1)) {
|
||||||
|
--_scriptPtr.pc;
|
||||||
|
zoom = 0x40;
|
||||||
|
} else {
|
||||||
|
zoom = _scriptVars[zoom];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (opcode & 1) {
|
||||||
|
_res->_useSegVideo2 = true;
|
||||||
|
--_scriptPtr.pc;
|
||||||
|
zoom = 0x40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug(DBG_VIDEO, "vid_opcd_0x40 : off=0x%X x=%d y=%d", off, x, y);
|
||||||
|
_vid->setDataBuffer(_res->_useSegVideo2 ? _res->_segVideo2 : _res->_segVideo1, off);
|
||||||
|
_vid->drawShape(0xFF, zoom, Point(x, y));
|
||||||
|
} else {
|
||||||
|
if (opcode > 0x1A) {
|
||||||
|
::error("Logic::executeScript() ec=0x%X invalid opcode=0x%X", 0xFFF, opcode);
|
||||||
|
} else {
|
||||||
|
(this->*_opTable[opcode])();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::inp_updatePlayer() {
|
||||||
|
_stub->processEvents();
|
||||||
|
if (_res->_curPtrsId == 0x3E89) {
|
||||||
|
char c = _stub->_pi.lastChar;
|
||||||
|
if (c == 8 || /*c == 0xD ||*/ c == 0 || (c >= 'a' && c <= 'z')) {
|
||||||
|
_scriptVars[VAR_LAST_KEYCHAR] = c & ~0x20;
|
||||||
|
_stub->_pi.lastChar = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int16 lr = 0;
|
||||||
|
int16 m = 0;
|
||||||
|
int16 ud = 0;
|
||||||
|
if (_stub->_pi.dirMask & PlayerInput::DIR_RIGHT) {
|
||||||
|
lr = 1;
|
||||||
|
m |= 1;
|
||||||
|
}
|
||||||
|
if (_stub->_pi.dirMask & PlayerInput::DIR_LEFT) {
|
||||||
|
lr = -1;
|
||||||
|
m |= 2;
|
||||||
|
}
|
||||||
|
if (_stub->_pi.dirMask & PlayerInput::DIR_DOWN) {
|
||||||
|
ud = 1;
|
||||||
|
m |= 4;
|
||||||
|
}
|
||||||
|
_scriptVars[VAR_HERO_POS_UP_DOWN] = ud;
|
||||||
|
if (_stub->_pi.dirMask & PlayerInput::DIR_UP) {
|
||||||
|
_scriptVars[VAR_HERO_POS_UP_DOWN] = -1;
|
||||||
|
}
|
||||||
|
if (_stub->_pi.dirMask & PlayerInput::DIR_UP) { // inpJump
|
||||||
|
ud = -1;
|
||||||
|
m |= 8;
|
||||||
|
}
|
||||||
|
_scriptVars[VAR_HERO_POS_JUMP_DOWN] = ud;
|
||||||
|
_scriptVars[VAR_HERO_POS_LEFT_RIGHT] = lr;
|
||||||
|
_scriptVars[VAR_HERO_POS_MASK] = m;
|
||||||
|
int16 button = 0;
|
||||||
|
if (_stub->_pi.button) { // inpButton
|
||||||
|
button = 1;
|
||||||
|
m |= 0x80;
|
||||||
|
}
|
||||||
|
_scriptVars[VAR_HERO_ACTION] = button;
|
||||||
|
_scriptVars[VAR_HERO_ACTION_POS_MASK] = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::inp_handleSpecialKeys() {
|
||||||
|
if (_stub->_pi.pause) {
|
||||||
|
if (_res->_curPtrsId != 0x3E80 && _res->_curPtrsId != 0x3E81) {
|
||||||
|
_stub->_pi.pause = false;
|
||||||
|
while (!_stub->_pi.pause) {
|
||||||
|
_stub->processEvents();
|
||||||
|
_stub->sleep(200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_stub->_pi.pause = false;
|
||||||
|
}
|
||||||
|
if (_stub->_pi.code) {
|
||||||
|
_stub->_pi.code = false;
|
||||||
|
if (_res->_curPtrsId != 0x3E89 && _res->_curPtrsId != 0x3E80) {
|
||||||
|
_res->_newPtrsId = 0x3E89;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// XXX
|
||||||
|
if (_scriptVars[0xC9] == 1) {
|
||||||
|
::warning("Logic::inp_handleSpecialKeys() unhandled case (_scriptVars[0xC9] == 1)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logic::saveOrLoad(Serializer &ser) {
|
||||||
|
Serializer::Entry entries[] = {
|
||||||
|
SE_ARRAY(_scriptVars, 0x100, Serializer::SES_INT16, VER(1)),
|
||||||
|
SE_ARRAY(_scriptStackCalls, 0x100, Serializer::SES_INT16, VER(1)),
|
||||||
|
SE_ARRAY(_scriptPos, 0x40 * 2, Serializer::SES_INT16, VER(1)),
|
||||||
|
SE_ARRAY(_scriptPaused, 0x40 * 2, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_END()
|
||||||
|
};
|
||||||
|
ser.saveOrLoadEntries(entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
114
awe/logic.h
Normal file
114
awe/logic.h
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LOGIC_H__
|
||||||
|
#define __LOGIC_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct Resource;
|
||||||
|
struct Serializer;
|
||||||
|
struct SystemStub;
|
||||||
|
struct Video;
|
||||||
|
|
||||||
|
struct Logic {
|
||||||
|
typedef void (Logic::*OpcodeStub)();
|
||||||
|
|
||||||
|
enum ScriptVars {
|
||||||
|
VAR_RANDOM_SEED = 0x3C,
|
||||||
|
|
||||||
|
VAR_LAST_KEYCHAR = 0xDA,
|
||||||
|
|
||||||
|
VAR_HERO_POS_UP_DOWN = 0xE5,
|
||||||
|
|
||||||
|
VAR_SCROLL_Y = 0xF9,
|
||||||
|
VAR_HERO_ACTION = 0xFA,
|
||||||
|
VAR_HERO_POS_JUMP_DOWN = 0xFB,
|
||||||
|
VAR_HERO_POS_LEFT_RIGHT = 0xFC,
|
||||||
|
VAR_HERO_POS_MASK = 0xFD,
|
||||||
|
VAR_HERO_ACTION_POS_MASK = 0xFE,
|
||||||
|
VAR_PAUSE_SLICES = 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static const OpcodeStub _opTable[];
|
||||||
|
|
||||||
|
Resource *_res;
|
||||||
|
Video *_vid;
|
||||||
|
SystemStub *_stub;
|
||||||
|
|
||||||
|
int16 _scriptVar_0xBF;
|
||||||
|
int16 _scriptVars[0x100];
|
||||||
|
uint16 _scriptStackCalls[0x40];
|
||||||
|
uint16 _scriptPos[2][0x40];
|
||||||
|
uint8 _scriptPaused[2][0x40];
|
||||||
|
Ptr _scriptPtr;
|
||||||
|
uint8 _stackPtr;
|
||||||
|
bool _scriptHalted;
|
||||||
|
bool _fastMode;
|
||||||
|
|
||||||
|
Logic(Resource *res, Video *vid, SystemStub *stub);
|
||||||
|
void init();
|
||||||
|
|
||||||
|
void op_movConst();
|
||||||
|
void op_mov();
|
||||||
|
void op_add();
|
||||||
|
void op_addConst();
|
||||||
|
void op_call();
|
||||||
|
void op_ret();
|
||||||
|
void op_break();
|
||||||
|
void op_jmp();
|
||||||
|
void op_setScriptPos();
|
||||||
|
void op_jnz();
|
||||||
|
void op_condJmp();
|
||||||
|
void op_setPalette();
|
||||||
|
void op_resetScript();
|
||||||
|
void op_selectPage();
|
||||||
|
void op_fillPage();
|
||||||
|
void op_copyPage();
|
||||||
|
void op_updateDisplay();
|
||||||
|
void op_halt();
|
||||||
|
void op_drawString();
|
||||||
|
void op_sub();
|
||||||
|
void op_and();
|
||||||
|
void op_or();
|
||||||
|
void op_shl();
|
||||||
|
void op_shr();
|
||||||
|
void op_soundUnk1();
|
||||||
|
void op_updateMemList();
|
||||||
|
void op_soundUnk2();
|
||||||
|
|
||||||
|
void restartAt(uint16 ptrId);
|
||||||
|
void setupPtrs(uint16 ptrId);
|
||||||
|
void setupScripts();
|
||||||
|
void runScripts();
|
||||||
|
void executeScript();
|
||||||
|
|
||||||
|
void inp_updatePlayer();
|
||||||
|
void inp_handleSpecialKeys();
|
||||||
|
|
||||||
|
void saveOrLoad(Serializer &ser);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
25
awe/module.mk
Normal file
25
awe/module.mk
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
MODULE := awe
|
||||||
|
|
||||||
|
MODULE_OBJS = \
|
||||||
|
awe/awe.o \
|
||||||
|
awe/bank.o \
|
||||||
|
awe/engine.o \
|
||||||
|
awe/file.o \
|
||||||
|
awe/logic.o \
|
||||||
|
awe/resource.o \
|
||||||
|
awe/sdlstub.o \
|
||||||
|
awe/serializer.o \
|
||||||
|
awe/staticres.o \
|
||||||
|
awe/util.o \
|
||||||
|
awe/video.o
|
||||||
|
|
||||||
|
MODULE_DIRS += \
|
||||||
|
awe
|
||||||
|
|
||||||
|
# This module can be built as a plugin
|
||||||
|
ifdef BUILD_PLUGINS
|
||||||
|
PLUGIN := 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Include common rules
|
||||||
|
include $(srcdir)/common.rules
|
277
awe/resource.cpp
Normal file
277
awe/resource.cpp
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
/* 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 "resource.h"
|
||||||
|
#include "bank.h"
|
||||||
|
#include "file.h"
|
||||||
|
#include "serializer.h"
|
||||||
|
#include "video.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
Resource::Resource(Video *vid, const char *dataDir)
|
||||||
|
: _vid(vid), _dataDir(dataDir) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::readBank(const MemEntry *me, uint8 *dstBuf) {
|
||||||
|
uint16 n = me - _memList;
|
||||||
|
debug(DBG_BANK, "Resource::readBank(%d)", n);
|
||||||
|
#ifdef USE_UNPACKED
|
||||||
|
char bankEntryName[64];
|
||||||
|
sprintf(bankEntryName, "ootw-%02X-%d.dump", n, me->type);
|
||||||
|
File f;
|
||||||
|
if (!f.open(bankEntryName, _dataDir)) {
|
||||||
|
::error("Resource::readBank() unable to open '%s' file\n", bankEntryName);
|
||||||
|
}
|
||||||
|
f.read(dstBuf, me->unpackedSize);
|
||||||
|
#else
|
||||||
|
Bank bk(_dataDir);
|
||||||
|
if (!bk.read(me, dstBuf)) {
|
||||||
|
::error("Resource::readBank() unable to unpack entry %d\n", n);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::readEntries() {
|
||||||
|
File f;
|
||||||
|
if (!f.open("memlist.bin", _dataDir)) {
|
||||||
|
::error("Resource::readEntries() unable to open 'memlist.bin' file\n");
|
||||||
|
}
|
||||||
|
_numMemList = 0;
|
||||||
|
MemEntry *me = _memList;
|
||||||
|
while (1) {
|
||||||
|
assert(_numMemList < ARRAYSIZE(_memList));
|
||||||
|
me->valid = f.readByte();
|
||||||
|
me->type = f.readByte();
|
||||||
|
me->bufPtr = 0; f.readUint16BE();
|
||||||
|
me->unk4 = f.readUint16BE();
|
||||||
|
me->rankNum = f.readByte();
|
||||||
|
me->bankNum = f.readByte();
|
||||||
|
me->bankPos = f.readUint32BE();
|
||||||
|
me->unkC = f.readUint16BE();
|
||||||
|
me->packedSize = f.readUint16BE();
|
||||||
|
me->unk10 = f.readUint16BE();
|
||||||
|
me->unpackedSize = f.readUint16BE();
|
||||||
|
if (me->valid == 0xFF) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++_numMemList;
|
||||||
|
++me;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::load() {
|
||||||
|
while (1) {
|
||||||
|
MemEntry *it = _memList;
|
||||||
|
MemEntry *me = 0;
|
||||||
|
|
||||||
|
// get resource with max rankNum
|
||||||
|
uint8 maxNum = 0;
|
||||||
|
uint16 i = _numMemList;
|
||||||
|
while (i--) {
|
||||||
|
if (it->valid == 2 && maxNum <= it->rankNum) {
|
||||||
|
maxNum = it->rankNum;
|
||||||
|
me = it;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
if (me == 0) {
|
||||||
|
break; // no entry found
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 *memPtr = 0;
|
||||||
|
// XXX if (_audio_no_sound != 0 && _audio_use_roland != 0 && me->type < 2) {
|
||||||
|
// XXX me->valid = 0;
|
||||||
|
// XXX continue;
|
||||||
|
// XXX }
|
||||||
|
if (me->type == 2) {
|
||||||
|
memPtr = _vidCurPtr;
|
||||||
|
} else {
|
||||||
|
memPtr = _scriptCurPtr;
|
||||||
|
if (me->unpackedSize > _vidBakPtr - _scriptCurPtr) {
|
||||||
|
::warning("Resource::load() not enough memory");
|
||||||
|
me->valid = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (me->bankNum == 0) {
|
||||||
|
::warning("Resource::load() ec=0x%X (me->bankNum == 0)", 0xF00);
|
||||||
|
me->valid = 0;
|
||||||
|
} else {
|
||||||
|
debug(DBG_BANK, "Resource::load() bufPos=%X size=%X type=%X pos=%X bankNum=%X", memPtr - _memPtrStart, me->packedSize, me->type, me->bankPos, me->bankNum);
|
||||||
|
readBank(me, memPtr);
|
||||||
|
if(me->type == 2) {
|
||||||
|
_vid->copyPagePtr(_vidCurPtr);
|
||||||
|
me->valid = 0;
|
||||||
|
} else {
|
||||||
|
me->bufPtr = memPtr;
|
||||||
|
me->valid = 1;
|
||||||
|
_scriptCurPtr += me->unpackedSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::invalidateRes() {
|
||||||
|
// XXX call ds:sound_stub_1_ptr
|
||||||
|
MemEntry *me = _memList;
|
||||||
|
uint16 i = _numMemList;
|
||||||
|
while (i--) {
|
||||||
|
if (me->type <= 2 || me->type > 6) {
|
||||||
|
me->valid = 0;
|
||||||
|
}
|
||||||
|
++me;
|
||||||
|
}
|
||||||
|
_scriptCurPtr = _scriptBakPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::invalidateAll() {
|
||||||
|
MemEntry *me = _memList;
|
||||||
|
uint16 i = _numMemList;
|
||||||
|
while (i--) {
|
||||||
|
me->valid = 0;
|
||||||
|
++me;
|
||||||
|
}
|
||||||
|
_scriptCurPtr = _memPtrStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::update(uint16 num) {
|
||||||
|
if (num == 0) {
|
||||||
|
invalidateRes();
|
||||||
|
} else {
|
||||||
|
if (num > _numMemList) {
|
||||||
|
_newPtrsId = num;
|
||||||
|
} else {
|
||||||
|
if (false) { // XXX (_audio_use_pro_or_adlib == 1 || _audio_use_spk == 1) {
|
||||||
|
for (const uint16 *ml = _memListAudio; *ml != 0xFFFF; ++ml) {
|
||||||
|
if (*ml == num)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MemEntry *me = &_memList[num];
|
||||||
|
if (me->valid == 0) {
|
||||||
|
me->valid = 2;
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::setupPtrs(uint16 ptrId) {
|
||||||
|
if (ptrId != _curPtrsId) {
|
||||||
|
uint8 ipal = 0;
|
||||||
|
uint8 icod = 0;
|
||||||
|
uint8 ivd1 = 0;
|
||||||
|
uint8 ivd2 = 0;
|
||||||
|
if (ptrId >= 0x3E80 && ptrId <= 0x3E89) {
|
||||||
|
uint16 part = ptrId - 0x3E80;
|
||||||
|
ipal = _memListParts[part][0];
|
||||||
|
icod = _memListParts[part][1];
|
||||||
|
ivd1 = _memListParts[part][2];
|
||||||
|
ivd2 = _memListParts[part][3];
|
||||||
|
} else {
|
||||||
|
::error("Resource::setupPtrs() ec=0x%X invalid ptrId", 0xF07);
|
||||||
|
}
|
||||||
|
invalidateAll();
|
||||||
|
_memList[ipal].valid = 2;
|
||||||
|
_memList[icod].valid = 2;
|
||||||
|
_memList[ivd1].valid = 2;
|
||||||
|
if (ivd2 != 0) {
|
||||||
|
_memList[ivd2].valid = 2;
|
||||||
|
}
|
||||||
|
load();
|
||||||
|
_segVideoPal = _memList[ipal].bufPtr;
|
||||||
|
_segCode = _memList[icod].bufPtr;
|
||||||
|
_segVideo1 = _memList[ivd1].bufPtr;
|
||||||
|
if (ivd2 != 0) {
|
||||||
|
_segVideo2 = _memList[ivd2].bufPtr;
|
||||||
|
}
|
||||||
|
_curPtrsId = ptrId;
|
||||||
|
}
|
||||||
|
_scriptBakPtr = _scriptCurPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::allocMemBlock() {
|
||||||
|
_memPtrStart = (uint8 *)malloc(MEM_BLOCK_SIZE);
|
||||||
|
_scriptBakPtr = _scriptCurPtr = _memPtrStart;
|
||||||
|
_vidBakPtr = _vidCurPtr = _memPtrStart + MEM_BLOCK_SIZE - 0x800 * 16;
|
||||||
|
_useSegVideo2 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::freeMemBlock() {
|
||||||
|
free(_memPtrStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Resource::saveOrLoad(Serializer &ser) {
|
||||||
|
uint8 loadedList[64];
|
||||||
|
if (ser._mode == Serializer::SM_SAVE) {
|
||||||
|
memset(loadedList, 0, sizeof(loadedList));
|
||||||
|
uint8 *p = loadedList;
|
||||||
|
uint8 *q = _memPtrStart;
|
||||||
|
while (1) {
|
||||||
|
MemEntry *it = _memList;
|
||||||
|
MemEntry *me = 0;
|
||||||
|
uint16 num = _numMemList;
|
||||||
|
while (num--) {
|
||||||
|
if (it->valid == 1 && it->bufPtr == q) {
|
||||||
|
me = it;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
if (me == 0) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
assert(p < loadedList + 64);
|
||||||
|
*p++ = me - _memList;
|
||||||
|
q += me->unpackedSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serializer::Entry entries[] = {
|
||||||
|
SE_ARRAY(loadedList, 64, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_INT(&_curPtrsId, Serializer::SES_INT16, VER(1)),
|
||||||
|
SE_PTR(&_scriptBakPtr, VER(1)),
|
||||||
|
SE_PTR(&_scriptCurPtr, VER(1)),
|
||||||
|
SE_PTR(&_vidBakPtr, VER(1)),
|
||||||
|
SE_PTR(&_vidCurPtr, VER(1)),
|
||||||
|
SE_INT(&_useSegVideo2, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_PTR(&_segVideoPal, VER(1)),
|
||||||
|
SE_PTR(&_segCode, VER(1)),
|
||||||
|
SE_PTR(&_segVideo1, VER(1)),
|
||||||
|
SE_PTR(&_segVideo2, VER(1)),
|
||||||
|
SE_END()
|
||||||
|
};
|
||||||
|
ser.saveOrLoadEntries(entries);
|
||||||
|
if (ser._mode == Serializer::SM_LOAD) {
|
||||||
|
uint8 *p = loadedList;
|
||||||
|
uint8 *q = _memPtrStart;
|
||||||
|
while (*p) {
|
||||||
|
MemEntry *me = &_memList[*p++];
|
||||||
|
readBank(me, q);
|
||||||
|
me->bufPtr = q;
|
||||||
|
me->valid = 1;
|
||||||
|
q += me->unpackedSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
92
awe/resource.h
Normal file
92
awe/resource.h
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __RESOURCE_H__
|
||||||
|
#define __RESOURCE_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct MemEntry {
|
||||||
|
uint8 valid; // 0x0
|
||||||
|
uint8 type; // 0x1, Resource::ResType
|
||||||
|
uint8 *bufPtr; // 0x2
|
||||||
|
uint16 unk4; // 0x4, unused ?
|
||||||
|
uint8 rankNum; // 0x6
|
||||||
|
uint8 bankNum; // 0x7
|
||||||
|
uint32 bankPos; // 0x8 0xA
|
||||||
|
uint16 unkC; // 0xC, unused ?
|
||||||
|
uint16 packedSize; // 0xE
|
||||||
|
uint16 unk10; // 0x10, unused ?
|
||||||
|
uint16 unpackedSize; // 0x12
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Serializer;
|
||||||
|
struct Video;
|
||||||
|
|
||||||
|
struct Resource {
|
||||||
|
enum ResType {
|
||||||
|
RT_SOUND = 0,
|
||||||
|
RT_MUSIC = 1,
|
||||||
|
RT_VIDBUF = 2, // full screen video buffer, size=0x7D00
|
||||||
|
RT_PAL = 3, // palette (1024=vga + 1024=ega), size=2048
|
||||||
|
RT_SCRIPT = 4,
|
||||||
|
RT_VBMP = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MEM_BLOCK_SIZE = 600 * 1024
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint16 _memListAudio[];
|
||||||
|
static const uint16 _memListParts[][4];
|
||||||
|
|
||||||
|
Video *_vid;
|
||||||
|
const char *_dataDir;
|
||||||
|
MemEntry _memList[150];
|
||||||
|
uint16 _numMemList;
|
||||||
|
uint16 _curPtrsId, _newPtrsId;
|
||||||
|
uint8 *_memPtrStart, *_scriptBakPtr, *_scriptCurPtr, *_vidBakPtr, *_vidCurPtr;
|
||||||
|
bool _useSegVideo2;
|
||||||
|
uint8 *_segVideoPal;
|
||||||
|
uint8 *_segCode;
|
||||||
|
uint8 *_segVideo1;
|
||||||
|
uint8 *_segVideo2;
|
||||||
|
|
||||||
|
Resource(Video *vid, const char *dataDir);
|
||||||
|
|
||||||
|
void readBank(const MemEntry *me, uint8 *dstBuf);
|
||||||
|
void readEntries();
|
||||||
|
void load();
|
||||||
|
void invalidateAll();
|
||||||
|
void invalidateRes();
|
||||||
|
void update(uint16 num);
|
||||||
|
void setupPtrs(uint16 ptrId);
|
||||||
|
void allocMemBlock();
|
||||||
|
void freeMemBlock();
|
||||||
|
|
||||||
|
void saveOrLoad(Serializer &ser);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
324
awe/sdlstub.cpp
Normal file
324
awe/sdlstub.cpp
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
/* 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 "common/util.h"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include "awe.h"
|
||||||
|
#include "systemstub.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct SDLStub : SystemStub {
|
||||||
|
typedef void (SDLStub::*ScaleProc)(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SCREEN_W = 320,
|
||||||
|
SCREEN_H = 200
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Scaler {
|
||||||
|
const char *name;
|
||||||
|
ScaleProc proc;
|
||||||
|
uint8 factor;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Scaler _scalers[];
|
||||||
|
|
||||||
|
uint8 *_offscreen;
|
||||||
|
SDL_Surface *_screen;
|
||||||
|
SDL_Surface *_sclscreen;
|
||||||
|
bool _fullscreen;
|
||||||
|
uint8 _scaler;
|
||||||
|
uint16 _pal[16];
|
||||||
|
|
||||||
|
virtual ~SDLStub() {}
|
||||||
|
virtual void init(const char *title);
|
||||||
|
virtual void destroy();
|
||||||
|
virtual void setPalette(uint8 s, uint8 n, const uint8 *buf);
|
||||||
|
virtual void copyRect(uint16 x, uint16 y, uint16 w, uint16 h, const uint8 *buf, uint32 pitch);
|
||||||
|
virtual void processEvents();
|
||||||
|
virtual void sleep(uint32 duration);
|
||||||
|
virtual uint32 getTimeStamp();
|
||||||
|
|
||||||
|
void prepareGfxMode();
|
||||||
|
void cleanupGfxMode();
|
||||||
|
void switchGfxMode(bool fullscreen, uint8 scaler);
|
||||||
|
|
||||||
|
void point1x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h);
|
||||||
|
void point2x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h);
|
||||||
|
void point3x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h);
|
||||||
|
};
|
||||||
|
|
||||||
|
const SDLStub::Scaler SDLStub::_scalers[] = {
|
||||||
|
{ "Point1x", &SDLStub::point1x, 1 },
|
||||||
|
{ "Point2x", &SDLStub::point2x, 2 },
|
||||||
|
{ "Point3x", &SDLStub::point3x, 3 }
|
||||||
|
};
|
||||||
|
|
||||||
|
SystemStub *SystemStub_SDL_create() {
|
||||||
|
return new SDLStub();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::init(const char *title) {
|
||||||
|
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
|
||||||
|
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
SDL_WM_SetCaption(title, NULL);
|
||||||
|
memset(&_pi, 0, sizeof(_pi));
|
||||||
|
_offscreen = (uint8 *)malloc(SCREEN_W * SCREEN_H * 2);
|
||||||
|
if (!_offscreen) {
|
||||||
|
::error("Unable to allocate offscreen buffer");
|
||||||
|
}
|
||||||
|
_fullscreen = false;
|
||||||
|
_scaler = 1;
|
||||||
|
prepareGfxMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::destroy() {
|
||||||
|
cleanupGfxMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::setPalette(uint8 s, uint8 n, const uint8 *buf) {
|
||||||
|
assert(s + n <= 16);
|
||||||
|
for (int i = s; i < s + n; ++i) {
|
||||||
|
uint8 c[3];
|
||||||
|
for (int j = 0; j < 3; ++j) {
|
||||||
|
uint8 col = buf[i * 3 + j];
|
||||||
|
c[j] = (col << 2) | (col & 3);
|
||||||
|
}
|
||||||
|
_pal[i] = SDL_MapRGB(_screen->format, c[0], c[1], c[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::copyRect(uint16 x, uint16 y, uint16 w, uint16 h, const uint8 *buf, uint32 pitch) {
|
||||||
|
buf += y * pitch + x;
|
||||||
|
uint16 *p = (uint16 *)_offscreen;
|
||||||
|
while (h--) {
|
||||||
|
for (int i = 0; i < w / 2; ++i) {
|
||||||
|
uint8 p1 = *(buf + i) >> 4;
|
||||||
|
uint8 p2 = *(buf + i) & 0xF;
|
||||||
|
*(p + i * 2 + 0) = _pal[p1];
|
||||||
|
*(p + i * 2 + 1) = _pal[p2];
|
||||||
|
}
|
||||||
|
p += SCREEN_W;
|
||||||
|
buf += pitch;
|
||||||
|
}
|
||||||
|
SDL_LockSurface(_sclscreen);
|
||||||
|
(this->*_scalers[_scaler].proc)((uint16 *)_sclscreen->pixels, _sclscreen->pitch, (uint16 *)_offscreen, SCREEN_W, SCREEN_W, SCREEN_H);
|
||||||
|
SDL_UnlockSurface(_sclscreen);
|
||||||
|
SDL_BlitSurface(_sclscreen, NULL, _screen, NULL);
|
||||||
|
SDL_UpdateRect(_screen, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::processEvents() {
|
||||||
|
SDL_Event ev;
|
||||||
|
while(SDL_PollEvent(&ev)) {
|
||||||
|
switch (ev.type) {
|
||||||
|
case SDL_QUIT:
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
switch(ev.key.keysym.sym) {
|
||||||
|
case SDLK_LEFT:
|
||||||
|
_pi.dirMask &= ~PlayerInput::DIR_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
_pi.dirMask &= ~PlayerInput::DIR_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
_pi.dirMask &= ~PlayerInput::DIR_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
_pi.dirMask &= ~PlayerInput::DIR_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_SPACE:
|
||||||
|
case SDLK_RETURN:
|
||||||
|
_pi.button = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
if (ev.key.keysym.mod & KMOD_ALT) {
|
||||||
|
if (ev.key.keysym.sym == SDLK_RETURN) {
|
||||||
|
switchGfxMode(!_fullscreen, _scaler);
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_KP_PLUS) {
|
||||||
|
uint8 s = _scaler + 1;
|
||||||
|
if (s < ARRAYSIZE(_scalers)) {
|
||||||
|
switchGfxMode(_fullscreen, s);
|
||||||
|
}
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_KP_MINUS) {
|
||||||
|
int8 s = _scaler - 1;
|
||||||
|
if (_scaler > 0) {
|
||||||
|
switchGfxMode(_fullscreen, s);
|
||||||
|
}
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_x) {
|
||||||
|
_pi.quit = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if (ev.key.keysym.mod & KMOD_CTRL) {
|
||||||
|
if (ev.key.keysym.sym == SDLK_s) {
|
||||||
|
_pi.save = true;
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_l) {
|
||||||
|
_pi.load = true;
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_f) {
|
||||||
|
_pi.fastMode = true;
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_KP_PLUS) {
|
||||||
|
_pi.stateSlot = 1;
|
||||||
|
} else if (ev.key.keysym.sym == SDLK_KP_MINUS) {
|
||||||
|
_pi.stateSlot = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_pi.lastChar = ev.key.keysym.sym;
|
||||||
|
switch(ev.key.keysym.sym) {
|
||||||
|
case SDLK_LEFT:
|
||||||
|
_pi.dirMask |= PlayerInput::DIR_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
_pi.dirMask |= PlayerInput::DIR_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_UP:
|
||||||
|
_pi.dirMask |= PlayerInput::DIR_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
_pi.dirMask |= PlayerInput::DIR_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_SPACE:
|
||||||
|
case SDLK_RETURN:
|
||||||
|
_pi.button = true;
|
||||||
|
break;
|
||||||
|
case SDLK_c:
|
||||||
|
_pi.code = true;
|
||||||
|
break;
|
||||||
|
case SDLK_p:
|
||||||
|
_pi.pause = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::sleep(uint32 duration) {
|
||||||
|
SDL_Delay(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 SDLStub::getTimeStamp() {
|
||||||
|
return SDL_GetTicks();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::prepareGfxMode() {
|
||||||
|
int w = SCREEN_W * _scalers[_scaler].factor;
|
||||||
|
int h = SCREEN_H * _scalers[_scaler].factor;
|
||||||
|
_screen = SDL_SetVideoMode(w, h, 16, _fullscreen ? (SDL_FULLSCREEN | SDL_HWSURFACE) : SDL_HWSURFACE);
|
||||||
|
if (!_screen) {
|
||||||
|
::error("SDLStub::prepareGfxMode() unable to allocate _screen buffer");
|
||||||
|
}
|
||||||
|
_sclscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 16,
|
||||||
|
_screen->format->Rmask,
|
||||||
|
_screen->format->Gmask,
|
||||||
|
_screen->format->Bmask,
|
||||||
|
_screen->format->Amask);
|
||||||
|
if (!_sclscreen) {
|
||||||
|
::error("SDLStub::prepareGfxMode() unable to allocate _sclscreen buffer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::cleanupGfxMode() {
|
||||||
|
if (_offscreen) {
|
||||||
|
free(_offscreen);
|
||||||
|
_offscreen = 0;
|
||||||
|
}
|
||||||
|
if (_sclscreen) {
|
||||||
|
SDL_FreeSurface(_sclscreen);
|
||||||
|
_sclscreen = 0;
|
||||||
|
}
|
||||||
|
if (_screen) {
|
||||||
|
SDL_FreeSurface(_screen);
|
||||||
|
_screen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::switchGfxMode(bool fullscreen, uint8 scaler) {
|
||||||
|
SDL_Surface *prev_sclscreen = _sclscreen;
|
||||||
|
SDL_FreeSurface(_screen);
|
||||||
|
_fullscreen = fullscreen;
|
||||||
|
_scaler = scaler;
|
||||||
|
prepareGfxMode();
|
||||||
|
SDL_BlitSurface(prev_sclscreen, NULL, _sclscreen, NULL);
|
||||||
|
SDL_FreeSurface(prev_sclscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::point1x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h) {
|
||||||
|
dstPitch >>= 1;
|
||||||
|
while (h--) {
|
||||||
|
memcpy(dst, src, w * 2);
|
||||||
|
dst += dstPitch;
|
||||||
|
src += dstPitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::point2x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h) {
|
||||||
|
dstPitch >>= 1;
|
||||||
|
while (h--) {
|
||||||
|
uint16 *p = dst;
|
||||||
|
for (int i = 0; i < w; ++i, p += 2) {
|
||||||
|
uint16 c = *(src + i);
|
||||||
|
*(p + 0) = c;
|
||||||
|
*(p + 1) = c;
|
||||||
|
*(p + 0 + dstPitch) = c;
|
||||||
|
*(p + 1 + dstPitch) = c;
|
||||||
|
}
|
||||||
|
dst += dstPitch * 2;
|
||||||
|
src += srcPitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLStub::point3x(uint16 *dst, uint16 dstPitch, const uint16 *src, uint16 srcPitch, uint16 w, uint16 h) {
|
||||||
|
dstPitch >>= 1;
|
||||||
|
while (h--) {
|
||||||
|
uint16 *p = dst;
|
||||||
|
for (int i = 0; i < w; ++i, p += 3) {
|
||||||
|
uint16 c = *(src + i);
|
||||||
|
*(p + 0) = c;
|
||||||
|
*(p + 1) = c;
|
||||||
|
*(p + 2) = c;
|
||||||
|
*(p + 0 + dstPitch) = c;
|
||||||
|
*(p + 1 + dstPitch) = c;
|
||||||
|
*(p + 2 + dstPitch) = c;
|
||||||
|
*(p + 0 + dstPitch * 2) = c;
|
||||||
|
*(p + 1 + dstPitch * 2) = c;
|
||||||
|
*(p + 2 + dstPitch * 2) = c;
|
||||||
|
}
|
||||||
|
dst += dstPitch * 3;
|
||||||
|
src += srcPitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
127
awe/serializer.cpp
Normal file
127
awe/serializer.cpp
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/* 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 "serializer.h"
|
||||||
|
#include "file.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
Serializer::Serializer(File *stream, Mode mode, uint8 *ptrBlock, uint16 saveVer)
|
||||||
|
: _stream(stream), _mode(mode), _ptrBlock(ptrBlock), _saveVer(saveVer) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serializer::saveOrLoadEntries(Entry *entry) {
|
||||||
|
switch (_mode) {
|
||||||
|
case SM_SAVE:
|
||||||
|
saveEntries(entry);
|
||||||
|
break;
|
||||||
|
case SM_LOAD:
|
||||||
|
loadEntries(entry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serializer::saveEntries(Entry *entry) {
|
||||||
|
for (; entry->type != SET_END; ++entry) {
|
||||||
|
if (entry->maxVer == CUR_VER) {
|
||||||
|
switch (entry->type) {
|
||||||
|
case SET_INT:
|
||||||
|
saveInt(entry->size, entry->data);
|
||||||
|
break;
|
||||||
|
case SET_ARRAY:
|
||||||
|
if (entry->size == Serializer::SES_INT8) {
|
||||||
|
_stream->write(entry->data, entry->n);
|
||||||
|
} else {
|
||||||
|
uint8 *p = (uint8 *)entry->data;
|
||||||
|
for (int i = 0; i < entry->n; ++i) {
|
||||||
|
saveInt(entry->size, p);
|
||||||
|
p += entry->size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SET_PTR:
|
||||||
|
_stream->writeUint32BE(*(uint8 **)(entry->data) - _ptrBlock);
|
||||||
|
break;
|
||||||
|
case SET_END:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serializer::loadEntries(Entry *entry) {
|
||||||
|
for (; entry->type != SET_END; ++entry) {
|
||||||
|
if (_saveVer >= entry->minVer && _saveVer <= entry->maxVer) {
|
||||||
|
switch (entry->type) {
|
||||||
|
case SET_INT:
|
||||||
|
loadInt(entry->size, entry->data);
|
||||||
|
break;
|
||||||
|
case SET_ARRAY:
|
||||||
|
if (entry->size == Serializer::SES_INT8) {
|
||||||
|
_stream->read(entry->data, entry->n);
|
||||||
|
} else {
|
||||||
|
uint8 *p = (uint8 *)entry->data;
|
||||||
|
for (int i = 0; i < entry->n; ++i) {
|
||||||
|
loadInt(entry->size, p);
|
||||||
|
p += entry->size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SET_PTR:
|
||||||
|
*(uint8 **)(entry->data) = _ptrBlock + _stream->readUint32BE();
|
||||||
|
break;
|
||||||
|
case SET_END:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serializer::saveInt(uint8 es, void *p) {
|
||||||
|
switch (es) {
|
||||||
|
case SES_INT8:
|
||||||
|
_stream->writeByte(*(uint8 *)p);
|
||||||
|
break;
|
||||||
|
case SES_INT16:
|
||||||
|
_stream->writeUint16BE(*(uint16 *)p);
|
||||||
|
break;
|
||||||
|
case SES_INT32:
|
||||||
|
_stream->writeUint32BE(*(uint32 *)p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Serializer::loadInt(uint8 es, void *p) {
|
||||||
|
switch (es) {
|
||||||
|
case SES_INT8:
|
||||||
|
*(uint8 *)p = _stream->readByte();
|
||||||
|
break;
|
||||||
|
case SES_INT16:
|
||||||
|
*(uint16 *)p = _stream->readUint16BE();
|
||||||
|
break;
|
||||||
|
case SES_INT32:
|
||||||
|
*(uint32 *)p = _stream->readUint32BE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
88
awe/serializer.h
Normal file
88
awe/serializer.h
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SERIALIZER_H__
|
||||||
|
#define __SERIALIZER_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
#define VER(x) x
|
||||||
|
|
||||||
|
#define SE_INT(i,sz,ver) { Serializer::SET_INT, sz, 1, i, ver, Serializer::CUR_VER }
|
||||||
|
#define SE_ARRAY(a,n,sz,ver) { Serializer::SET_ARRAY, sz, n, a, ver, Serializer::CUR_VER }
|
||||||
|
#define SE_PTR(p,ver) { Serializer::SET_PTR, 0, 0, p, ver, Serializer::CUR_VER }
|
||||||
|
#define SE_END() { Serializer::SET_END, 0, 0, 0, 0, 0 }
|
||||||
|
|
||||||
|
struct File;
|
||||||
|
|
||||||
|
struct Serializer {
|
||||||
|
enum {
|
||||||
|
CUR_VER = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum EntryType {
|
||||||
|
SET_INT,
|
||||||
|
SET_ARRAY,
|
||||||
|
SET_PTR,
|
||||||
|
SET_END
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SES_INT8 = 1,
|
||||||
|
SES_INT16 = 2,
|
||||||
|
SES_INT32 = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Mode {
|
||||||
|
SM_SAVE,
|
||||||
|
SM_LOAD
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Entry {
|
||||||
|
EntryType type;
|
||||||
|
uint8 size;
|
||||||
|
uint16 n;
|
||||||
|
void *data;
|
||||||
|
uint16 minVer;
|
||||||
|
uint16 maxVer;
|
||||||
|
};
|
||||||
|
|
||||||
|
File *_stream;
|
||||||
|
Mode _mode;
|
||||||
|
uint8 *_ptrBlock;
|
||||||
|
uint16 _saveVer;
|
||||||
|
|
||||||
|
Serializer(File *stream, Mode mode, uint8 *ptrBlock, uint16 saveVer = CUR_VER);
|
||||||
|
|
||||||
|
void saveOrLoadEntries(Entry *entry);
|
||||||
|
|
||||||
|
void saveEntries(Entry *entry);
|
||||||
|
void loadEntries(Entry *entry);
|
||||||
|
|
||||||
|
void saveInt(uint8 es, void *p);
|
||||||
|
void loadInt(uint8 es, void *p);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
403
awe/staticres.cpp
Normal file
403
awe/staticres.cpp
Normal file
|
@ -0,0 +1,403 @@
|
||||||
|
/* 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 "logic.h"
|
||||||
|
#include "resource.h"
|
||||||
|
#include "video.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
const Logic::OpcodeStub Logic::_opTable[] = {
|
||||||
|
/* 0x00 */
|
||||||
|
&Logic::op_movConst,
|
||||||
|
&Logic::op_mov,
|
||||||
|
&Logic::op_add,
|
||||||
|
&Logic::op_addConst,
|
||||||
|
/* 0x04 */
|
||||||
|
&Logic::op_call,
|
||||||
|
&Logic::op_ret,
|
||||||
|
&Logic::op_break,
|
||||||
|
&Logic::op_jmp,
|
||||||
|
/* 0x08 */
|
||||||
|
&Logic::op_setScriptPos,
|
||||||
|
&Logic::op_jnz,
|
||||||
|
&Logic::op_condJmp,
|
||||||
|
&Logic::op_setPalette,
|
||||||
|
/* 0x0C */
|
||||||
|
&Logic::op_resetScript,
|
||||||
|
&Logic::op_selectPage,
|
||||||
|
&Logic::op_fillPage,
|
||||||
|
&Logic::op_copyPage,
|
||||||
|
/* 0x10 */
|
||||||
|
&Logic::op_updateDisplay,
|
||||||
|
&Logic::op_halt,
|
||||||
|
&Logic::op_drawString,
|
||||||
|
&Logic::op_sub,
|
||||||
|
/* 0x14 */
|
||||||
|
&Logic::op_and,
|
||||||
|
&Logic::op_or,
|
||||||
|
&Logic::op_shl,
|
||||||
|
&Logic::op_shr,
|
||||||
|
/* 0x18 */
|
||||||
|
&Logic::op_soundUnk1,
|
||||||
|
&Logic::op_updateMemList,
|
||||||
|
&Logic::op_soundUnk2
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16 Resource::_memListAudio[] = {
|
||||||
|
8, 0x10, 0x61, 0x66, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16 Resource::_memListParts[][4] = {
|
||||||
|
{ 0x14, 0x15, 0x16, 0x00 }, // protection screens
|
||||||
|
{ 0x17, 0x18, 0x19, 0x00 }, // introduction
|
||||||
|
{ 0x1A, 0x1B, 0x1C, 0x11 },
|
||||||
|
{ 0x1D, 0x1E, 0x1F, 0x11 },
|
||||||
|
{ 0x20, 0x21, 0x22, 0x11 },
|
||||||
|
{ 0x23, 0x24, 0x25, 0x00 },
|
||||||
|
{ 0x26, 0x27, 0x28, 0x11 },
|
||||||
|
{ 0x29, 0x2A, 0x2B, 0x11 },
|
||||||
|
{ 0x7D, 0x7E, 0x7F, 0x00 },
|
||||||
|
{ 0x7D, 0x7E, 0x7F, 0x00 } // password screen
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8 Video::_font[] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00,
|
||||||
|
0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x7E, 0x24, 0x24, 0x7E, 0x24, 0x00,
|
||||||
|
0x08, 0x3E, 0x48, 0x3C, 0x12, 0x7C, 0x10, 0x00, 0x42, 0xA4, 0x48, 0x10, 0x24, 0x4A, 0x84, 0x00,
|
||||||
|
0x60, 0x90, 0x90, 0x70, 0x8A, 0x84, 0x7A, 0x00, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x06, 0x08, 0x10, 0x10, 0x10, 0x08, 0x06, 0x00, 0xC0, 0x20, 0x10, 0x10, 0x10, 0x20, 0xC0, 0x00,
|
||||||
|
0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0x10, 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,
|
||||||
|
0x78, 0x84, 0x8C, 0x94, 0xA4, 0xC4, 0x78, 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x7C, 0x00,
|
||||||
|
0x78, 0x84, 0x04, 0x08, 0x30, 0x40, 0xFC, 0x00, 0x78, 0x84, 0x04, 0x38, 0x04, 0x84, 0x78, 0x00,
|
||||||
|
0x08, 0x18, 0x28, 0x48, 0xFC, 0x08, 0x08, 0x00, 0xFC, 0x80, 0xF8, 0x04, 0x04, 0x84, 0x78, 0x00,
|
||||||
|
0x38, 0x40, 0x80, 0xF8, 0x84, 0x84, 0x78, 0x00, 0xFC, 0x04, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00,
|
||||||
|
0x78, 0x84, 0x84, 0x78, 0x84, 0x84, 0x78, 0x00, 0x78, 0x84, 0x84, 0x7C, 0x04, 0x08, 0x70, 0x00,
|
||||||
|
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x10, 0x10, 0x60,
|
||||||
|
0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00,
|
||||||
|
0x20, 0x10, 0x08, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7C, 0x82, 0x02, 0x0C, 0x10, 0x00, 0x10, 0x00,
|
||||||
|
0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, 0x00,
|
||||||
|
0xF8, 0x84, 0x84, 0xF8, 0x84, 0x84, 0xF8, 0x00, 0x78, 0x84, 0x80, 0x80, 0x80, 0x84, 0x78, 0x00,
|
||||||
|
0xF8, 0x84, 0x84, 0x84, 0x84, 0x84, 0xF8, 0x00, 0x7C, 0x40, 0x40, 0x78, 0x40, 0x40, 0x7C, 0x00,
|
||||||
|
0xFC, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, 0x00, 0x7C, 0x80, 0x80, 0x8C, 0x84, 0x84, 0x7C, 0x00,
|
||||||
|
0x84, 0x84, 0x84, 0xFC, 0x84, 0x84, 0x84, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00,
|
||||||
|
0x04, 0x04, 0x04, 0x04, 0x84, 0x84, 0x78, 0x00, 0x8C, 0x90, 0xA0, 0xE0, 0x90, 0x88, 0x84, 0x00,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFC, 0x00, 0x82, 0xC6, 0xAA, 0x92, 0x82, 0x82, 0x82, 0x00,
|
||||||
|
0x84, 0xC4, 0xA4, 0x94, 0x8C, 0x84, 0x84, 0x00, 0x78, 0x84, 0x84, 0x84, 0x84, 0x84, 0x78, 0x00,
|
||||||
|
0xF8, 0x84, 0x84, 0xF8, 0x80, 0x80, 0x80, 0x00, 0x78, 0x84, 0x84, 0x84, 0x84, 0x8C, 0x7C, 0x03,
|
||||||
|
0xF8, 0x84, 0x84, 0xF8, 0x90, 0x88, 0x84, 0x00, 0x78, 0x84, 0x80, 0x78, 0x04, 0x84, 0x78, 0x00,
|
||||||
|
0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x78, 0x00,
|
||||||
|
0x84, 0x84, 0x84, 0x84, 0x84, 0x48, 0x30, 0x00, 0x82, 0x82, 0x82, 0x82, 0x92, 0xAA, 0xC6, 0x00,
|
||||||
|
0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, 0x00, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00,
|
||||||
|
0xFC, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFC, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00,
|
||||||
|
0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00,
|
||||||
|
0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
|
||||||
|
0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x38, 0x04, 0x3C, 0x44, 0x3C, 0x00,
|
||||||
|
0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x40, 0x40, 0x3C, 0x00,
|
||||||
|
0x04, 0x04, 0x3C, 0x44, 0x44, 0x44, 0x3C, 0x00, 0x00, 0x00, 0x38, 0x44, 0x7C, 0x40, 0x3C, 0x00,
|
||||||
|
0x38, 0x44, 0x40, 0x60, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C, 0x04, 0x78,
|
||||||
|
0x40, 0x40, 0x58, 0x64, 0x44, 0x44, 0x44, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
|
||||||
|
0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x42, 0x3C, 0x40, 0x40, 0x46, 0x48, 0x70, 0x48, 0x46, 0x00,
|
||||||
|
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0xEC, 0x92, 0x92, 0x92, 0x92, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C, 0x04, 0x04,
|
||||||
|
0x00, 0x00, 0x4C, 0x70, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x3C, 0x40, 0x38, 0x04, 0x78, 0x00,
|
||||||
|
0x10, 0x10, 0x3C, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x78, 0x00,
|
||||||
|
0x00, 0x00, 0x44, 0x44, 0x44, 0x28, 0x10, 0x00, 0x00, 0x00, 0x82, 0x82, 0x92, 0xAA, 0xC6, 0x00,
|
||||||
|
0x00, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x42, 0x22, 0x24, 0x18, 0x08, 0x30,
|
||||||
|
0x00, 0x00, 0x7C, 0x08, 0x10, 0x20, 0x7C, 0x00, 0x60, 0x90, 0x20, 0x40, 0xF0, 0x00, 0x00, 0x00,
|
||||||
|
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x38, 0x44, 0xBA, 0xA2, 0xBA, 0x44, 0x38, 0x00,
|
||||||
|
0x38, 0x44, 0x82, 0x82, 0x44, 0x28, 0xEE, 0x00, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA
|
||||||
|
};
|
||||||
|
|
||||||
|
const StrEntry Video::_stringsTableEng[] = {
|
||||||
|
{ 0x001, "P E A N U T 3000" },
|
||||||
|
{ 0x002, "Copyright } 1990 Peanut Computer, Inc.\nAll rights reserved.\n\nCDOS Version 5.01" },
|
||||||
|
{ 0x003, "2" },
|
||||||
|
{ 0x004, "3" },
|
||||||
|
{ 0x005, "." },
|
||||||
|
{ 0x006, "A" },
|
||||||
|
{ 0x007, "@" },
|
||||||
|
{ 0x008, "PEANUT 3000" },
|
||||||
|
{ 0x00A, "R" },
|
||||||
|
{ 0x00B, "U" },
|
||||||
|
{ 0x00C, "N" },
|
||||||
|
{ 0x00D, "P" },
|
||||||
|
{ 0x00E, "R" },
|
||||||
|
{ 0x00F, "O" },
|
||||||
|
{ 0x010, "J" },
|
||||||
|
{ 0x011, "E" },
|
||||||
|
{ 0x012, "C" },
|
||||||
|
{ 0x013, "T" },
|
||||||
|
{ 0x014, "Shield 9A.5f Ok" },
|
||||||
|
{ 0x015, "Flux % 5.0177 Ok" },
|
||||||
|
{ 0x016, "CDI Vector ok" },
|
||||||
|
{ 0x017, " %%%ddd ok" },
|
||||||
|
{ 0x018, "Race-Track ok" },
|
||||||
|
{ 0x019, "SYNCHROTRON" },
|
||||||
|
{ 0x01A, "E: 23%\ng: .005\n\nRK: 77.2L\n\nopt: g+\n\n Shield:\n1: OFF\n2: ON\n3: ON\n\nP~: 1\n" },
|
||||||
|
{ 0x01B, "ON" },
|
||||||
|
{ 0x01C, "-" },
|
||||||
|
{ 0x021, "|" },
|
||||||
|
{ 0x022, "--- Theoretical study ---" },
|
||||||
|
{ 0x023, " THE EXPERIMENT WILL BEGIN IN SECONDS" },
|
||||||
|
{ 0x024, " 20" },
|
||||||
|
{ 0x025, " 19" },
|
||||||
|
{ 0x026, " 18" },
|
||||||
|
{ 0x027, " 4" },
|
||||||
|
{ 0x028, " 3" },
|
||||||
|
{ 0x029, " 2" },
|
||||||
|
{ 0x02A, " 1" },
|
||||||
|
{ 0x02B, " 0" },
|
||||||
|
{ 0x02C, "L E T ' S G O" },
|
||||||
|
{ 0x031, "- Phase 0:\nINJECTION of particles\ninto synchrotron" },
|
||||||
|
{ 0x032, "- Phase 1:\nParticle ACCELERATION." },
|
||||||
|
{ 0x033, "- Phase 2:\nEJECTION of particles\non the shield." },
|
||||||
|
{ 0x034, "A N A L Y S I S" },
|
||||||
|
{ 0x035, "- RESULT:\nProbability of creating:\n ANTIMATTER: 91.V %\n NEUTRINO 27: 0.04 %\n NEUTRINO 424: 18 %\n" },
|
||||||
|
{ 0x036, " Practical verification Y/N ?" },
|
||||||
|
{ 0x037, "SURE ?" },
|
||||||
|
{ 0x038, "MODIFICATION OF PARAMETERS\nRELATING TO PARTICLE\nACCELERATOR (SYNCHROTRON)." },
|
||||||
|
{ 0x039, " RUN EXPERIMENT ?" },
|
||||||
|
{ 0x03C, "t---t" },
|
||||||
|
{ 0x03D, "000 ~" },
|
||||||
|
{ 0x03E, ".20x14dd" },
|
||||||
|
{ 0x03F, "gj5r5r" },
|
||||||
|
{ 0x040, "tilgor 25%" },
|
||||||
|
{ 0x041, "12% 33% checked" },
|
||||||
|
{ 0x042, "D=4.2158005584" },
|
||||||
|
{ 0x043, "d=10.00001" },
|
||||||
|
{ 0x044, "+" },
|
||||||
|
{ 0x045, "*" },
|
||||||
|
{ 0x046, "% 304" },
|
||||||
|
{ 0x047, "gurgle 21" },
|
||||||
|
{ 0x048, "{{{{" },
|
||||||
|
{ 0x049, "Delphine Software" },
|
||||||
|
{ 0x04A, "By Eric Chahi" },
|
||||||
|
{ 0x04B, " 5" },
|
||||||
|
{ 0x04C, " 17" },
|
||||||
|
{ 0x12C, "0" },
|
||||||
|
{ 0x12D, "1" },
|
||||||
|
{ 0x12E, "2" },
|
||||||
|
{ 0x12F, "3" },
|
||||||
|
{ 0x130, "4" },
|
||||||
|
{ 0x131, "5" },
|
||||||
|
{ 0x132, "6" },
|
||||||
|
{ 0x133, "7" },
|
||||||
|
{ 0x134, "8" },
|
||||||
|
{ 0x135, "9" },
|
||||||
|
{ 0x136, "A" },
|
||||||
|
{ 0x137, "B" },
|
||||||
|
{ 0x138, "C" },
|
||||||
|
{ 0x139, "D" },
|
||||||
|
{ 0x13A, "E" },
|
||||||
|
{ 0x13B, "F" },
|
||||||
|
{ 0x13C, " ACCESS CODE:" },
|
||||||
|
{ 0x13D, "PRESS BUTTON OR RETURN TO CONTINUE" },
|
||||||
|
{ 0x13E, " ENTER ACCESS CODE" },
|
||||||
|
{ 0x13F, " INVALID PASSWORD !" },
|
||||||
|
{ 0x140, "ANNULER" },
|
||||||
|
{ 0x141, " INSERT DISK ?\n\n\n\n\n\n\n\n\nPRESS ANY KEY TO CONTINUE" },
|
||||||
|
{ 0x142, " SELECT SYMBOLS CORRESPONDING TO\n THE POSITION\n ON THE CODE WHEEL" },
|
||||||
|
{ 0x143, " LOADING..." },
|
||||||
|
{ 0x144, " ERROR" },
|
||||||
|
{ 0x15E, "LDKD" },
|
||||||
|
{ 0x15F, "HTDC" },
|
||||||
|
{ 0x160, "CLLD" },
|
||||||
|
{ 0x161, "FXLC" },
|
||||||
|
{ 0x162, "KRFK" },
|
||||||
|
{ 0x163, "XDDJ" },
|
||||||
|
{ 0x164, "LBKG" },
|
||||||
|
{ 0x165, "KLFB" },
|
||||||
|
{ 0x166, "TTCT" },
|
||||||
|
{ 0x167, "DDRX" },
|
||||||
|
{ 0x168, "TBHK" },
|
||||||
|
{ 0x169, "BRTD" },
|
||||||
|
{ 0x16A, "CKJL" },
|
||||||
|
{ 0x16B, "LFCK" },
|
||||||
|
{ 0x16C, "BFLX" },
|
||||||
|
{ 0x16D, "XJRT" },
|
||||||
|
{ 0x16E, "HRTB" },
|
||||||
|
{ 0x16F, "HBHK" },
|
||||||
|
{ 0x170, "JCGB" },
|
||||||
|
{ 0x171, "HHFL" },
|
||||||
|
{ 0x172, "TFBB" },
|
||||||
|
{ 0x173, "TXHF" },
|
||||||
|
{ 0x174, "JHJL" },
|
||||||
|
{ 0x181, " BY" },
|
||||||
|
{ 0x182, "ERIC CHAHI" },
|
||||||
|
{ 0x183, " MUSIC AND SOUND EFFECTS" },
|
||||||
|
{ 0x184, " " },
|
||||||
|
{ 0x185, "JEAN-FRANCOIS FREITAS" },
|
||||||
|
{ 0x186, "IBM PC VERSION" },
|
||||||
|
{ 0x187, " BY" },
|
||||||
|
{ 0x188, " DANIEL MORAIS" },
|
||||||
|
{ 0x18B, " THEN PRESS FIRE" },
|
||||||
|
{ 0x18C, " PUT THE PADDLE ON THE UPPER LEFT CORNER" },
|
||||||
|
{ 0x18D, "PUT THE PADDLE IN CENTRAL POSITION" },
|
||||||
|
{ 0x18E, "PUT THE PADDLE ON THE LOWER RIGHT CORNER" },
|
||||||
|
{ 0x258, " Designed by ..... Eric Chahi" },
|
||||||
|
{ 0x259, " Programmed by...... Eric Chahi" },
|
||||||
|
{ 0x25A, " Artwork ......... Eric Chahi" },
|
||||||
|
{ 0x25B, "Music by ........ Jean-francois Freitas" },
|
||||||
|
{ 0x25C, " Sound effects" },
|
||||||
|
{ 0x25D, " Jean-Francois Freitas\n Eric Chahi" },
|
||||||
|
{ 0x263, " Thanks To" },
|
||||||
|
{ 0x264, " Jesus Martinez\n\n Daniel Morais\n\n Frederic Savoir\n\n Cecile Chahi\n\n Philippe Delamarre\n\n Philippe Ulrich\n\nSebastien Berthet\n\nPierre Gousseau" },
|
||||||
|
{ 0x265, "Now Go Out Of This World" },
|
||||||
|
{ 0x190, "Good evening professor." },
|
||||||
|
{ 0x191, "I see you have driven here in your\nFerrari." },
|
||||||
|
{ 0x192, "IDENTIFICATION" },
|
||||||
|
{ 0x193, "Monsieur est en parfaite sante." },
|
||||||
|
{ 0x194, "Y\n" },
|
||||||
|
{ 0x193, "AU BOULOT !!!\n" },
|
||||||
|
{ 0xFFFF, "" }
|
||||||
|
};
|
||||||
|
|
||||||
|
const StrEntry Video::_stringsTableDemo[] = {
|
||||||
|
{ 0x001, "P E A N U T 3000" },
|
||||||
|
{ 0x002, "Copyright } 1990 Peanut Computer, Inc.\nAll rights reserved.\n\nCDOS Version 5.01" },
|
||||||
|
{ 0x003, "2" },
|
||||||
|
{ 0x004, "3" },
|
||||||
|
{ 0x005, "." },
|
||||||
|
{ 0x006, "A" },
|
||||||
|
{ 0x007, "@" },
|
||||||
|
{ 0x008, "PEANUT 3000" },
|
||||||
|
{ 0x00A, "R" },
|
||||||
|
{ 0x00B, "U" },
|
||||||
|
{ 0x00C, "N" },
|
||||||
|
{ 0x00D, "P" },
|
||||||
|
{ 0x00E, "R" },
|
||||||
|
{ 0x00F, "O" },
|
||||||
|
{ 0x010, "J" },
|
||||||
|
{ 0x011, "E" },
|
||||||
|
{ 0x012, "C" },
|
||||||
|
{ 0x013, "T" },
|
||||||
|
{ 0x014, "Shield 9A.5f Ok" },
|
||||||
|
{ 0x015, "Flux % 5.0177 Ok" },
|
||||||
|
{ 0x016, "CDI Vector ok" },
|
||||||
|
{ 0x017, " %%%ddd ok" },
|
||||||
|
{ 0x018, "Race-Track ok" },
|
||||||
|
{ 0x019, "SYNCHROTRON" },
|
||||||
|
{ 0x01A, "E: 23%\ng: .005\n\nRK: 77.2L\n\nopt: g+\n\n Shield:\n1: OFF\n2: ON\n3: ON\n\nP~: 1\n" },
|
||||||
|
{ 0x01B, "ON" },
|
||||||
|
{ 0x01C, "-" },
|
||||||
|
{ 0x021, "|" },
|
||||||
|
{ 0x022, "--- Theoretical study ---" },
|
||||||
|
{ 0x023, " THE EXPERIMENT WILL BEGIN IN SECONDS" },
|
||||||
|
{ 0x024, " 20" },
|
||||||
|
{ 0x025, " 19" },
|
||||||
|
{ 0x026, " 18" },
|
||||||
|
{ 0x027, " 4" },
|
||||||
|
{ 0x028, " 3" },
|
||||||
|
{ 0x029, " 2" },
|
||||||
|
{ 0x02A, " 1" },
|
||||||
|
{ 0x02B, " 0" },
|
||||||
|
{ 0x02C, "L E T ' S G O" },
|
||||||
|
{ 0x031, "- Phase 0:\nINJECTION of particles\ninto synchrotron" },
|
||||||
|
{ 0x032, "- Phase 1:\nParticle ACCELERATION." },
|
||||||
|
{ 0x033, "- Phase 2:\nEJECTION of particles\non the shield." },
|
||||||
|
{ 0x034, "A N A L Y S I S" },
|
||||||
|
{ 0x035, "- RESULT:\nProbability of creating:\n ANTIMATTER: 91.V %\n NEUTRINO 27: 0.04 %\n NEUTRINO 424: 18 %\n" },
|
||||||
|
{ 0x036, " Practical verification Y/N ?" },
|
||||||
|
{ 0x037, "SURE ?" },
|
||||||
|
{ 0x038, "MODIFICATION OF PARAMETERS\nRELATING TO PARTICLE\nACCELERATOR (SYNCHROTRON)." },
|
||||||
|
{ 0x039, " RUN EXPERIMENT ?" },
|
||||||
|
{ 0x03C, "t---t" },
|
||||||
|
{ 0x03D, "000 ~" },
|
||||||
|
{ 0x03E, ".20x14dd" },
|
||||||
|
{ 0x03F, "gj5r5r" },
|
||||||
|
{ 0x040, "tilgor 25%" },
|
||||||
|
{ 0x041, "12% 33% checked" },
|
||||||
|
{ 0x042, "D=4.2158005584" },
|
||||||
|
{ 0x043, "d=10.00001" },
|
||||||
|
{ 0x044, "+" },
|
||||||
|
{ 0x045, "*" },
|
||||||
|
{ 0x046, "% 304" },
|
||||||
|
{ 0x047, "gurgle 21" },
|
||||||
|
{ 0x048, "{{{{" },
|
||||||
|
{ 0x049, "Delphine Software" },
|
||||||
|
{ 0x04A, "By Eric Chahi" },
|
||||||
|
{ 0x04B, " 5" },
|
||||||
|
{ 0x04C, " 17" },
|
||||||
|
{ 0x12C, "0" },
|
||||||
|
{ 0x12D, "1" },
|
||||||
|
{ 0x12E, "2" },
|
||||||
|
{ 0x12F, "3" },
|
||||||
|
{ 0x130, "4" },
|
||||||
|
{ 0x131, "5" },
|
||||||
|
{ 0x132, "6" },
|
||||||
|
{ 0x133, "7" },
|
||||||
|
{ 0x134, "8" },
|
||||||
|
{ 0x135, "9" },
|
||||||
|
{ 0x136, "A" },
|
||||||
|
{ 0x137, "B" },
|
||||||
|
{ 0x138, "C" },
|
||||||
|
{ 0x139, "D" },
|
||||||
|
{ 0x13A, "E" },
|
||||||
|
{ 0x13B, "F" },
|
||||||
|
{ 0x13D, "PRESS BUTTON OR RETURN TO CONTINUE" },
|
||||||
|
{ 0x13E, " ENTER ACCESS CODE" },
|
||||||
|
{ 0x13F, " INVALID PASSWORD !" },
|
||||||
|
{ 0x140, "ANNULER" },
|
||||||
|
{ 0x141, " INSERT DISK ?" },
|
||||||
|
{ 0x142, " SELECT SYMBOLS CORRESPONDING TO\n THE POSITION\n ON THE CODE WHEEL" },
|
||||||
|
{ 0x143, " LOADING..." },
|
||||||
|
{ 0x144, " ERROR" },
|
||||||
|
{ 0x181, " BY" },
|
||||||
|
{ 0x182, "ERIC CHAHI" },
|
||||||
|
{ 0x183, " MUSIC AND SOUND EFFECTS" },
|
||||||
|
{ 0x184, " " },
|
||||||
|
{ 0x185, "JEAN-FRANCOIS FREITAS" },
|
||||||
|
{ 0x186, "IBM PC VERSION" },
|
||||||
|
{ 0x187, " BY" },
|
||||||
|
{ 0x188, " DANIEL MORAIS" },
|
||||||
|
{ 0x18B, " THEN PRESS FIRE" },
|
||||||
|
{ 0x18C, " PUT THE PADDLE ON THE UPPER LEFT CORNER" },
|
||||||
|
{ 0x18D, "PUT THE PADDLE IN CENTRAL POSITION" },
|
||||||
|
{ 0x18E, "PUT THE PADDLE ON THE LOWER RIGHT CORNER" },
|
||||||
|
{ 0x1F4, "Over Two Years in the Making" },
|
||||||
|
{ 0x1F5, " A New, State\nof the Art, Polygon\n Graphics System" },
|
||||||
|
{ 0x1F6, " Comes to the\nComputer With Full\n Screen Graphics" },
|
||||||
|
{ 0x1F7, "While conducting a nuclear fission\nexperiment at your local\nparticle accelerator ..." },
|
||||||
|
{ 0x1F8, "Nature decides to put a little\n extra spin on the ball" },
|
||||||
|
{ 0x1F9, "And sends you ..." },
|
||||||
|
{ 0x1FA, " Out of this World\nA Cinematic Action Adventure\n Coming soon to a computer\n screen near you\n from Interplay Productions\n coming soon to the IBM" },
|
||||||
|
{ 0x258, " Designed by ..... Eric Chahi" },
|
||||||
|
{ 0x259, " Programmed by...... Eric Chahi" },
|
||||||
|
{ 0x25A, " Artwork ......... Eric Chahi" },
|
||||||
|
{ 0x25B, "Music by ........ Jean-francois Freitas" },
|
||||||
|
{ 0x25C, " Sound effects" },
|
||||||
|
{ 0x25D, " Jean-Francois Freitas\n Eric Chahi" },
|
||||||
|
{ 0x263, " Thanks To" },
|
||||||
|
{ 0x264, " Jesus Martinez\n\n Daniel Morais\n\n Frederic Savoir\n\n Cecile Chahi\n\n Philippe Delamarre\n\n Philippe Ulrich\n\nSebastien Berthet\n\nPierre Gousseau" },
|
||||||
|
{ 0x265, "Now Go Out Of This World" },
|
||||||
|
{ 0x190, "Good evening professor." },
|
||||||
|
{ 0x191, "I see you have driven here in your\nFerrari." },
|
||||||
|
{ 0x192, "IDENTIFICATION" },
|
||||||
|
{ 0x193, "Monsieur est en parfaite sante." },
|
||||||
|
{ 0x194, "Y\n" },
|
||||||
|
{ 0x193, "AU BOULOT !!!\n" },
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
68
awe/systemstub.h
Normal file
68
awe/systemstub.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SYSTEMSTUB_H__
|
||||||
|
#define __SYSTEMSTUB_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct PlayerInput {
|
||||||
|
enum {
|
||||||
|
DIR_LEFT = 1 << 0,
|
||||||
|
DIR_RIGHT = 1 << 1,
|
||||||
|
DIR_UP = 1 << 2,
|
||||||
|
DIR_DOWN = 1 << 3
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8 dirMask;
|
||||||
|
bool button;
|
||||||
|
bool code;
|
||||||
|
bool pause;
|
||||||
|
bool quit;
|
||||||
|
char lastChar;
|
||||||
|
bool save, load;
|
||||||
|
bool fastMode;
|
||||||
|
int8 stateSlot;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SystemStub {
|
||||||
|
PlayerInput _pi;
|
||||||
|
|
||||||
|
virtual ~SystemStub() {}
|
||||||
|
|
||||||
|
virtual void init(const char *title) = 0;
|
||||||
|
virtual void destroy() = 0;
|
||||||
|
|
||||||
|
virtual void setPalette(uint8 s, uint8 n, const uint8 *buf) = 0;
|
||||||
|
virtual void copyRect(uint16 x, uint16 y, uint16 w, uint16 h, const uint8 *buf, uint32 pitch) = 0;
|
||||||
|
|
||||||
|
virtual void processEvents() = 0;
|
||||||
|
virtual void sleep(uint32 duration) = 0;
|
||||||
|
virtual uint32 getTimeStamp() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern SystemStub *SystemStub_SDL_create();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
58
awe/util.cpp
Normal file
58
awe/util.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/* 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 <cstdarg>
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
uint16 g_debugMask;
|
||||||
|
|
||||||
|
void debug(uint16 cm, const char *msg, ...) {
|
||||||
|
char buf[1024];
|
||||||
|
if (cm & g_debugMask) {
|
||||||
|
va_list va;
|
||||||
|
va_start(va, msg);
|
||||||
|
vsprintf(buf, msg, va);
|
||||||
|
va_end(va);
|
||||||
|
printf("%s\n", buf);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void string_lower(char *p) {
|
||||||
|
for (; *p; ++p) {
|
||||||
|
if (*p >= 'A' && *p <= 'Z') {
|
||||||
|
*p += 'a' - 'A';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void string_upper(char *p) {
|
||||||
|
for (; *p; ++p) {
|
||||||
|
if (*p >= 'a' && *p <= 'z') {
|
||||||
|
*p += 'A' - 'a';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
47
awe/util.h
Normal file
47
awe/util.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __UTIL_H__
|
||||||
|
#define __UTIL_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
enum {
|
||||||
|
DBG_LOGIC = 1 << 0,
|
||||||
|
DBG_BANK = 1 << 1,
|
||||||
|
DBG_VIDEO = 1 << 2,
|
||||||
|
DBG_INFO = 1 << 3
|
||||||
|
};
|
||||||
|
|
||||||
|
extern uint16 g_debugMask;
|
||||||
|
|
||||||
|
extern void debug(uint16 cm, const char *msg, ...);
|
||||||
|
extern void error(const char *msg, ...);
|
||||||
|
extern void warning(const char *msg, ...);
|
||||||
|
|
||||||
|
extern void string_lower(char *p);
|
||||||
|
extern void string_upper(char *p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
516
awe/video.cpp
Normal file
516
awe/video.cpp
Normal file
|
@ -0,0 +1,516 @@
|
||||||
|
/* 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 "video.h"
|
||||||
|
#include "resource.h"
|
||||||
|
#include "serializer.h"
|
||||||
|
#include "systemstub.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
void Polygon::init(const uint8 *p, uint16 zoom) {
|
||||||
|
bbw = (*p++) * zoom / 64;
|
||||||
|
bbh = (*p++) * zoom / 64;
|
||||||
|
numPoints = *p++;
|
||||||
|
assert((numPoints & 1) == 0 && numPoints < MAX_POINTS);
|
||||||
|
for (int i = 0; i < numPoints; ++i) {
|
||||||
|
Point *pt = &points[i];
|
||||||
|
pt->x = (*p++) * zoom / 64;
|
||||||
|
pt->y = (*p++) * zoom / 64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Video::Video(Resource *res, SystemStub *stub)
|
||||||
|
: _res(res), _stub(stub) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::init() {
|
||||||
|
_newPal = 0xFF;
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
_pagePtrs[i] = allocPage();
|
||||||
|
}
|
||||||
|
_curPagePtr3 = getPagePtr(1);
|
||||||
|
_curPagePtr2 = getPagePtr(2);
|
||||||
|
changePagePtr1(0xFE);
|
||||||
|
_interpTable[0] = 0x4000;
|
||||||
|
for (int i = 1; i < 0x400; ++i) {
|
||||||
|
_interpTable[i] = 0x4000 / i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::setDataBuffer(uint8 *dataBuf, uint16 offset) {
|
||||||
|
_dataBuf = dataBuf;
|
||||||
|
_pData.pc = dataBuf + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawShape(uint8 color, uint16 zoom, const Point &pt) {
|
||||||
|
uint8 i = _pData.fetchByte();
|
||||||
|
if (i >= 0xC0) {
|
||||||
|
if (color & 0x80) {
|
||||||
|
color = i & 0x3F;
|
||||||
|
}
|
||||||
|
_pg.init(_pData.pc, zoom);
|
||||||
|
fillPolygon(color, zoom, pt);
|
||||||
|
} else {
|
||||||
|
i &= 0x3F;
|
||||||
|
if (i == 1) {
|
||||||
|
::warning("Video::drawShape() ec=0x%X (i != 2)", 0xF80);
|
||||||
|
} else if (i == 2) {
|
||||||
|
drawShapeParts(zoom, pt);
|
||||||
|
} else {
|
||||||
|
::warning("Video::drawShape() ec=0x%X (i != 2)", 0xFBB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::fillPolygon(uint16 color, uint16 zoom, const Point &pt) {
|
||||||
|
if (_pg.bbw == 0 && _pg.bbh == 1 && _pg.numPoints == 4) {
|
||||||
|
drawPoint(color, pt.x, pt.y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16 x1 = pt.x - _pg.bbw / 2;
|
||||||
|
int16 x2 = pt.x + _pg.bbw / 2;
|
||||||
|
int16 y1 = pt.y - _pg.bbh / 2;
|
||||||
|
int16 y2 = pt.y + _pg.bbh / 2;
|
||||||
|
|
||||||
|
if (x1 > 319 || x2 < 0 || y1 > 199 || y2 < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_hliney = y1;
|
||||||
|
|
||||||
|
uint16 i, j;
|
||||||
|
i = 0;
|
||||||
|
j = _pg.numPoints - 1;
|
||||||
|
|
||||||
|
x2 = _pg.points[i].x + x1;
|
||||||
|
x1 = _pg.points[j].x + x1;
|
||||||
|
|
||||||
|
++i;
|
||||||
|
--j;
|
||||||
|
|
||||||
|
drawLine pdl;
|
||||||
|
if (color < 0x10) {
|
||||||
|
pdl = &Video::drawLineN;
|
||||||
|
} else if (color > 0x10) {
|
||||||
|
pdl = &Video::drawLineP;
|
||||||
|
} else {
|
||||||
|
pdl = &Video::drawLineT;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 cpt1 = x1 << 16;
|
||||||
|
uint32 cpt2 = x2 << 16;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
_pg.numPoints -= 2;
|
||||||
|
if (_pg.numPoints == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint16 h;
|
||||||
|
int32 step1 = calcStep(_pg.points[j + 1], _pg.points[j], h);
|
||||||
|
int32 step2 = calcStep(_pg.points[i - 1], _pg.points[i], h);
|
||||||
|
|
||||||
|
++i;
|
||||||
|
--j;
|
||||||
|
|
||||||
|
cpt1 = (cpt1 & 0xFFFF0000) | 0x7FFF;
|
||||||
|
cpt2 = (cpt2 & 0xFFFF0000) | 0x8000;
|
||||||
|
|
||||||
|
if (h == 0) {
|
||||||
|
cpt1 += step1;
|
||||||
|
cpt2 += step2;
|
||||||
|
} else {
|
||||||
|
for (; h != 0; --h) {
|
||||||
|
if (_hliney >= 0) {
|
||||||
|
x1 = cpt1 >> 16;
|
||||||
|
x2 = cpt2 >> 16;
|
||||||
|
if (x1 <= 319 && x2 >= 0) {
|
||||||
|
if (x1 < 0) x1 = 0;
|
||||||
|
if (x2 > 319) x2 = 319;
|
||||||
|
(this->*pdl)(x1, x2, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cpt1 += step1;
|
||||||
|
cpt2 += step2;
|
||||||
|
++_hliney;
|
||||||
|
if (_hliney > 199) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawShapeParts(uint16 zoom, const Point &pgc) {
|
||||||
|
Point pt(pgc);
|
||||||
|
pt.x -= _pData.fetchByte() * zoom / 64;
|
||||||
|
pt.y -= _pData.fetchByte() * zoom / 64;
|
||||||
|
int16 n = _pData.fetchByte();
|
||||||
|
debug(DBG_VIDEO, "Video::drawShapeParts n=%d", n);
|
||||||
|
for ( ; n >= 0; --n) {
|
||||||
|
uint16 off = _pData.fetchWord();
|
||||||
|
Point po(pt);
|
||||||
|
po.x += _pData.fetchByte() * zoom / 64;
|
||||||
|
po.y += _pData.fetchByte() * zoom / 64;
|
||||||
|
uint16 color = 0xFF;
|
||||||
|
uint16 _bp = off;
|
||||||
|
off &= 0x7FFF;
|
||||||
|
if (_bp & 0x8000) {
|
||||||
|
color = *_pData.pc & 0x7F;
|
||||||
|
_pData.pc += 2;
|
||||||
|
}
|
||||||
|
uint8 *bak = _pData.pc;
|
||||||
|
_pData.pc = _dataBuf + off * 2;
|
||||||
|
drawShape(color, zoom, po);
|
||||||
|
_pData.pc = bak;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 Video::calcStep(const Point &p1, const Point &p2, uint16 &dy) {
|
||||||
|
dy = p2.y - p1.y;
|
||||||
|
return (p2.x - p1.x) * _interpTable[dy] * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawString(uint8 color, uint16 x, uint16 y, uint16 strId) {
|
||||||
|
const StrEntry *se = _stringsTableEng;
|
||||||
|
while (se->id != 0xFFFF && se->id != strId) ++se;
|
||||||
|
debug(DBG_VIDEO, "drawString(%d, %d, %d, '%s')", color, x, y, se->str);
|
||||||
|
uint16 xx = x;
|
||||||
|
int len = strlen(se->str);
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
if (se->str[i] == '\n') {
|
||||||
|
y += 8;
|
||||||
|
x = xx;
|
||||||
|
} else {
|
||||||
|
drawChar(se->str[i], x, y, color, _curPagePtr1);
|
||||||
|
++x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawChar(uint8 c, uint16 x, uint16 y, uint8 color, uint8 *buf) {
|
||||||
|
if (x <= 39 && y <= 192) {
|
||||||
|
const uint8 *ft = _font + (c - 0x20) * 8;
|
||||||
|
uint8 *p = buf + x * 4 + y * 160;
|
||||||
|
for (int j = 0; j < 8; ++j) {
|
||||||
|
uint8 ch = *(ft + j);
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
uint8 b = *(p + i);
|
||||||
|
uint8 cmask = 0xFF;
|
||||||
|
uint8 colb = 0;
|
||||||
|
if (ch & 0x80) {
|
||||||
|
colb |= color << 4;
|
||||||
|
cmask &= 0x0F;
|
||||||
|
}
|
||||||
|
ch <<= 1;
|
||||||
|
if (ch & 0x80) {
|
||||||
|
colb |= color;
|
||||||
|
cmask &= 0xF0;
|
||||||
|
}
|
||||||
|
ch <<= 1;
|
||||||
|
*(p + i) = (b & cmask) | colb;
|
||||||
|
}
|
||||||
|
p += 160;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawPoint(uint8 color, int16 x, int16 y) {
|
||||||
|
debug(DBG_VIDEO, "drawPoint(%d, %d, %d)", color, x, y);
|
||||||
|
if (x >= 0 && x <= 319 && y >= 0 && y <= 199) {
|
||||||
|
uint16 off = y * 160 + x / 2;
|
||||||
|
|
||||||
|
uint8 cmasko, cmaskn;
|
||||||
|
if (x & 1) {
|
||||||
|
cmaskn = 0x0F;
|
||||||
|
cmasko = 0xF0;
|
||||||
|
} else {
|
||||||
|
cmaskn = 0xF0;
|
||||||
|
cmasko = 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 colb = (color << 4) | color;
|
||||||
|
if (color == 0x10) {
|
||||||
|
cmaskn &= 0x88;
|
||||||
|
cmasko = ~cmaskn;
|
||||||
|
colb = 0x88;
|
||||||
|
} else if (color == 0x11) {
|
||||||
|
colb = *(_pagePtrs[0] + off);
|
||||||
|
}
|
||||||
|
uint8 b = *(_curPagePtr1 + off);
|
||||||
|
*(_curPagePtr1 + off) = (b & cmasko) | (colb & cmaskn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawLineT(int16 x1, int16 x2, uint8 color) {
|
||||||
|
debug(DBG_VIDEO, "drawLineT(%d, %d, %d)", x1, x2, color);
|
||||||
|
int16 xmax = MAX(x1, x2);
|
||||||
|
int16 xmin = MIN(x1, x2);
|
||||||
|
uint8 *p = _curPagePtr1 + _hliney * 160 + xmin / 2;
|
||||||
|
|
||||||
|
uint16 w = xmax / 2 - xmin / 2 + 1;
|
||||||
|
uint8 cmaske = 0;
|
||||||
|
uint8 cmasks = 0;
|
||||||
|
if (xmin & 1) {
|
||||||
|
--w;
|
||||||
|
cmasks = 0xF7;
|
||||||
|
}
|
||||||
|
if (!(xmax & 1)) {
|
||||||
|
--w;
|
||||||
|
cmaske = 0x7F;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmasks != 0) {
|
||||||
|
*p = (*p & cmasks) | 0x08;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
while (w--) {
|
||||||
|
*p = (*p & 0x77) | 0x88;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
if (cmaske != 0) {
|
||||||
|
*p = (*p & cmaske) | 0x80;
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawLineN(int16 x1, int16 x2, uint8 color) {
|
||||||
|
debug(DBG_VIDEO, "drawLineN(%d, %d, %d)", x1, x2, color);
|
||||||
|
int16 xmax = MAX(x1, x2);
|
||||||
|
int16 xmin = MIN(x1, x2);
|
||||||
|
uint8 *p = _curPagePtr1 + _hliney * 160 + xmin / 2;
|
||||||
|
|
||||||
|
uint16 w = xmax / 2 - xmin / 2 + 1;
|
||||||
|
uint8 cmaske = 0;
|
||||||
|
uint8 cmasks = 0;
|
||||||
|
if (xmin & 1) {
|
||||||
|
--w;
|
||||||
|
cmasks = 0xF0;
|
||||||
|
}
|
||||||
|
if (!(xmax & 1)) {
|
||||||
|
--w;
|
||||||
|
cmaske = 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 colb = ((color & 0xF) << 4) | (color & 0xF);
|
||||||
|
if (cmasks != 0) {
|
||||||
|
*p = (*p & cmasks) | (colb & 0x0F);
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
while (w--) {
|
||||||
|
*p++ = colb;
|
||||||
|
}
|
||||||
|
if (cmaske != 0) {
|
||||||
|
*p = (*p & cmaske) | (colb & 0xF0);
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::drawLineP(int16 x1, int16 x2, uint8 color) {
|
||||||
|
debug(DBG_VIDEO, "drawLineP(%d, %d, %d)", x1, x2, color);
|
||||||
|
int16 xmax = MAX(x1, x2);
|
||||||
|
int16 xmin = MIN(x1, x2);
|
||||||
|
uint16 off = _hliney * 160 + xmin / 2;
|
||||||
|
uint8 *p = _curPagePtr1 + off;
|
||||||
|
uint8 *q = _pagePtrs[0] + off;
|
||||||
|
|
||||||
|
uint8 w = xmax / 2 - xmin / 2 + 1;
|
||||||
|
uint8 cmaske = 0;
|
||||||
|
uint8 cmasks = 0;
|
||||||
|
if (xmin & 1) {
|
||||||
|
--w;
|
||||||
|
cmasks = 0xF0;
|
||||||
|
}
|
||||||
|
if (!(xmax & 1)) {
|
||||||
|
--w;
|
||||||
|
cmaske = 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmasks != 0) {
|
||||||
|
*p = (*p & cmasks) | (*q & 0x0F);
|
||||||
|
++p;
|
||||||
|
++q;
|
||||||
|
}
|
||||||
|
while (w--) {
|
||||||
|
*p++ = *q++;
|
||||||
|
}
|
||||||
|
if (cmaske != 0) {
|
||||||
|
*p = (*p & cmaske) | (*q & 0xF0);
|
||||||
|
++p;
|
||||||
|
++q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 *Video::getPagePtr(uint8 page) {
|
||||||
|
uint8 *p;
|
||||||
|
if (page <= 3) {
|
||||||
|
p = _pagePtrs[page];
|
||||||
|
} else {
|
||||||
|
switch (page) {
|
||||||
|
case 0xFF:
|
||||||
|
p = _curPagePtr3;
|
||||||
|
break;
|
||||||
|
case 0xFE:
|
||||||
|
p = _curPagePtr2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
p = _pagePtrs[0]; // XXX check
|
||||||
|
::warning("Video::getPagePtr() p != [0,1,2,3,0xFF,0xFE] == 0x%X", page);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::changePagePtr1(uint8 page) {
|
||||||
|
debug(DBG_VIDEO, "Video::changePagePtr1(%d)", page);
|
||||||
|
_curPagePtr1 = getPagePtr(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::fillPage(uint8 page, uint8 color) {
|
||||||
|
debug(DBG_VIDEO, "Video::fillPage(%d, %d)", page, color);
|
||||||
|
uint8 *p = getPagePtr(page);
|
||||||
|
uint8 c = (color << 4) | color;
|
||||||
|
memset(p, c, VID_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::copyPage(uint8 src, uint8 dst, int16 vscroll) {
|
||||||
|
debug(DBG_VIDEO, "Video::copyPage(%d, %d)", src, dst);
|
||||||
|
if (src >= 0xFE || !((src &= 0xBF) & 0x80)) {
|
||||||
|
uint8 *p = getPagePtr(src);
|
||||||
|
uint8 *q = getPagePtr(dst);
|
||||||
|
if (p != q) {
|
||||||
|
memcpy(q, p, VID_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uint8 *p = getPagePtr(src & 3);
|
||||||
|
uint8 *q = getPagePtr(dst);
|
||||||
|
if (p != q && vscroll >= -199 && vscroll <= 199) {
|
||||||
|
uint16 h = 200;
|
||||||
|
if (vscroll < 0) {
|
||||||
|
h += vscroll;
|
||||||
|
p += -vscroll * 160;
|
||||||
|
} else {
|
||||||
|
h -= vscroll;
|
||||||
|
q += vscroll * 160;
|
||||||
|
}
|
||||||
|
memcpy(q, p, h * 160);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::copyPagePtr(const uint8 *src) {
|
||||||
|
debug(DBG_VIDEO, "Video::copyPagePtr()");
|
||||||
|
uint8 *dst = _pagePtrs[0];
|
||||||
|
int h = 200;
|
||||||
|
while (h--) {
|
||||||
|
int w = 40;
|
||||||
|
while (w--) {
|
||||||
|
uint8 p[] = {
|
||||||
|
*(src + 8000 * 3),
|
||||||
|
*(src + 8000 * 2),
|
||||||
|
*(src + 8000 * 1),
|
||||||
|
*(src + 8000 * 0)
|
||||||
|
};
|
||||||
|
for(int j = 0; j < 4; ++j) {
|
||||||
|
uint8 acc = 0;
|
||||||
|
for (int i = 0; i < 8; ++i) {
|
||||||
|
acc <<= 1;
|
||||||
|
acc |= (p[i & 3] & 0x80) ? 1 : 0;
|
||||||
|
p[i & 3] <<= 1;
|
||||||
|
}
|
||||||
|
*dst++ = acc;
|
||||||
|
}
|
||||||
|
++src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 *Video::allocPage() {
|
||||||
|
uint8 *buf = (uint8 *)malloc(VID_PAGE_SIZE);
|
||||||
|
memset(buf, 0, VID_PAGE_SIZE);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::changePal(uint8 palNum) {
|
||||||
|
if (palNum < 32) {
|
||||||
|
uint8 *p = _res->_segVideoPal + palNum * 32;
|
||||||
|
uint8 pal[16 * 3];
|
||||||
|
for (int i = 0; i < 16; ++i) {
|
||||||
|
uint8 c1 = *(p + 0);
|
||||||
|
uint8 c2 = *(p + 1);
|
||||||
|
p += 2;
|
||||||
|
pal[i * 3 + 0] = ((c1 & 0x0F) << 2) | ((c1 & 0x0F) >> 2); // r
|
||||||
|
pal[i * 3 + 1] = ((c2 & 0xF0) >> 2) | ((c2 & 0xF0) >> 6); // g
|
||||||
|
pal[i * 3 + 2] = ((c2 & 0x0F) >> 2) | ((c2 & 0x0F) << 2); // b
|
||||||
|
}
|
||||||
|
_stub->setPalette(0, 16, pal);
|
||||||
|
_curPal = palNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::updateDisplay(uint8 page) {
|
||||||
|
debug(DBG_VIDEO, "Video::updateDisplay(%d)", page);
|
||||||
|
if (page != 0xFE) {
|
||||||
|
if (page == 0xFF) {
|
||||||
|
SWAP(_curPagePtr2, _curPagePtr3);
|
||||||
|
} else {
|
||||||
|
_curPagePtr2 = getPagePtr(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_newPal != 0xFF) {
|
||||||
|
changePal(_newPal);
|
||||||
|
_newPal = 0xFF;
|
||||||
|
}
|
||||||
|
_stub->copyRect(0, 0, 320, 200, _curPagePtr2, 160);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Video::saveOrLoad(Serializer &ser) {
|
||||||
|
uint8 mask = 0;
|
||||||
|
if (ser._mode == Serializer::SM_SAVE) {
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
if (_pagePtrs[i] == _curPagePtr1)
|
||||||
|
mask |= i << 4;
|
||||||
|
if (_pagePtrs[i] == _curPagePtr2)
|
||||||
|
mask |= i << 2;
|
||||||
|
if (_pagePtrs[i] == _curPagePtr3)
|
||||||
|
mask |= i << 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serializer::Entry entries[] = {
|
||||||
|
SE_INT(&_curPal, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_INT(&_newPal, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_INT(&mask, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_ARRAY(_pagePtrs[0], Video::VID_PAGE_SIZE, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_ARRAY(_pagePtrs[1], Video::VID_PAGE_SIZE, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_ARRAY(_pagePtrs[2], Video::VID_PAGE_SIZE, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_ARRAY(_pagePtrs[3], Video::VID_PAGE_SIZE, Serializer::SES_INT8, VER(1)),
|
||||||
|
SE_END()
|
||||||
|
};
|
||||||
|
ser.saveOrLoadEntries(entries);
|
||||||
|
if (ser._mode == Serializer::SM_LOAD) {
|
||||||
|
_curPagePtr1 = _pagePtrs[(mask >> 4) & 0x3];
|
||||||
|
_curPagePtr2 = _pagePtrs[(mask >> 2) & 0x3];
|
||||||
|
_curPagePtr3 = _pagePtrs[(mask >> 0) & 0x3];
|
||||||
|
changePal(_curPal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
102
awe/video.h
Normal file
102
awe/video.h
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __VIDEO_H__
|
||||||
|
#define __VIDEO_H__
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "intern.h"
|
||||||
|
|
||||||
|
namespace Awe {
|
||||||
|
|
||||||
|
struct StrEntry {
|
||||||
|
uint16 id;
|
||||||
|
const char *str;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Polygon {
|
||||||
|
enum {
|
||||||
|
MAX_POINTS = 50
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16 bbw, bbh;
|
||||||
|
uint8 numPoints;
|
||||||
|
Point points[MAX_POINTS];
|
||||||
|
|
||||||
|
void init(const uint8 *p, uint16 zoom);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Resource;
|
||||||
|
struct Serializer;
|
||||||
|
struct SystemStub;
|
||||||
|
|
||||||
|
struct Video {
|
||||||
|
typedef void (Video::*drawLine)(int16 x1, int16 x2, uint8 col);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
VID_PAGE_SIZE = 320 * 200 / 2
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint8 _font[];
|
||||||
|
static const StrEntry _stringsTableEng[];
|
||||||
|
static const StrEntry _stringsTableDemo[];
|
||||||
|
|
||||||
|
Resource *_res;
|
||||||
|
SystemStub *_stub;
|
||||||
|
|
||||||
|
uint8 _newPal, _curPal;
|
||||||
|
uint8 *_pagePtrs[4];
|
||||||
|
uint8 *_curPagePtr1, *_curPagePtr2, *_curPagePtr3;
|
||||||
|
Polygon _pg;
|
||||||
|
int16 _hliney;
|
||||||
|
uint16 _interpTable[0x400];
|
||||||
|
Ptr _pData;
|
||||||
|
uint8 *_dataBuf;
|
||||||
|
|
||||||
|
Video(Resource *res, SystemStub *stub);
|
||||||
|
void init();
|
||||||
|
|
||||||
|
void setDataBuffer(uint8 *dataBuf, uint16 offset);
|
||||||
|
void drawShape(uint8 color, uint16 zoom, const Point &pt);
|
||||||
|
void fillPolygon(uint16 color, uint16 zoom, const Point &pt);
|
||||||
|
void drawShapeParts(uint16 zoom, const Point &pt);
|
||||||
|
int32 calcStep(const Point &p1, const Point &p2, uint16 &dy);
|
||||||
|
|
||||||
|
void drawString(uint8 color, uint16 x, uint16 y, uint16 strId);
|
||||||
|
void drawChar(uint8 c, uint16 x, uint16 y, uint8 color, uint8 *buf);
|
||||||
|
void drawPoint(uint8 color, int16 x, int16 y);
|
||||||
|
void drawLineT(int16 x1, int16 x2, uint8 color);
|
||||||
|
void drawLineN(int16 x1, int16 x2, uint8 color);
|
||||||
|
void drawLineP(int16 x1, int16 x2, uint8 color);
|
||||||
|
uint8 *getPagePtr(uint8 page);
|
||||||
|
void changePagePtr1(uint8 page);
|
||||||
|
void fillPage(uint8 page, uint8 color);
|
||||||
|
void copyPage(uint8 src, uint8 dst, int16 vscroll);
|
||||||
|
void copyPagePtr(const uint8 *src);
|
||||||
|
uint8 *allocPage();
|
||||||
|
void changePal(uint8 pal);
|
||||||
|
void updateDisplay(uint8 page);
|
||||||
|
|
||||||
|
void saveOrLoad(Serializer &ser);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -252,6 +252,10 @@ void PluginManager::loadPlugins() {
|
||||||
#ifndef DISABLE_SAGA
|
#ifndef DISABLE_SAGA
|
||||||
LOAD_MODULE("saga", SAGA);
|
LOAD_MODULE("saga", SAGA);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_AWE
|
||||||
|
LOAD_MODULE("awe", AWE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::unloadPlugins() {
|
void PluginManager::unloadPlugins() {
|
||||||
|
|
|
@ -173,6 +173,10 @@ DECLARE_PLUGIN(KYRA)
|
||||||
DECLARE_PLUGIN(SAGA)
|
DECLARE_PLUGIN(SAGA)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_AWE
|
||||||
|
DECLARE_PLUGIN(AWE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
12
configure
vendored
12
configure
vendored
|
@ -40,6 +40,7 @@ _build_sword2=yes
|
||||||
_build_queen=yes
|
_build_queen=yes
|
||||||
_build_kyra=no
|
_build_kyra=no
|
||||||
_build_saga=no
|
_build_saga=no
|
||||||
|
_build_awe=no
|
||||||
_need_memalign=no
|
_need_memalign=no
|
||||||
_build_plugins=no
|
_build_plugins=no
|
||||||
# more defaults
|
# more defaults
|
||||||
|
@ -222,6 +223,7 @@ Optional Features:
|
||||||
--disable-queen don't build the Flight of the Amazon Queen engine
|
--disable-queen don't build the Flight of the Amazon Queen engine
|
||||||
--enable-kyra build the Legend of Kyrandia engine
|
--enable-kyra build the Legend of Kyrandia engine
|
||||||
--enable-saga build the SAGA engine
|
--enable-saga build the SAGA engine
|
||||||
|
--enable-awe build the Another World engine
|
||||||
--enable-plugins build engines as loadable modules instead of
|
--enable-plugins build engines as loadable modules instead of
|
||||||
static linking them
|
static linking them
|
||||||
|
|
||||||
|
@ -272,6 +274,7 @@ for ac_option in $@; do
|
||||||
--disable-queen) _build_queen=no ;;
|
--disable-queen) _build_queen=no ;;
|
||||||
--enable-kyra) _build_kyra=yes ;;
|
--enable-kyra) _build_kyra=yes ;;
|
||||||
--enable-saga) _build_saga=yes ;;
|
--enable-saga) _build_saga=yes ;;
|
||||||
|
--enable-awe) _build_awe=yes ;;
|
||||||
--enable-alsa) _alsa=yes ;;
|
--enable-alsa) _alsa=yes ;;
|
||||||
--disable-alsa) _alsa=no ;;
|
--disable-alsa) _alsa=no ;;
|
||||||
--enable-vorbis) _vorbis=yes ;;
|
--enable-vorbis) _vorbis=yes ;;
|
||||||
|
@ -509,6 +512,11 @@ else
|
||||||
_mak_saga='# DISABLE_SAGA = 1'
|
_mak_saga='# DISABLE_SAGA = 1'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$_build_awe" = no ; then
|
||||||
|
_mak_awe='DISABLE_AWE = 1'
|
||||||
|
else
|
||||||
|
_mak_awe='# DISABLE_AWE = 1'
|
||||||
|
fi
|
||||||
|
|
||||||
if test -n "$_host"; then
|
if test -n "$_host"; then
|
||||||
# Cross-compiling mode - add your target here if needed
|
# Cross-compiling mode - add your target here if needed
|
||||||
|
@ -892,6 +900,10 @@ fi
|
||||||
if test "$_build_kyra" = yes ; then
|
if test "$_build_kyra" = yes ; then
|
||||||
echo " Legend of Kyrandia"
|
echo " Legend of Kyrandia"
|
||||||
fi
|
fi
|
||||||
|
if test "$_build_awe" = yes ; then
|
||||||
|
echo " Another World"
|
||||||
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
echo_n "Backend... "
|
echo_n "Backend... "
|
||||||
|
|
169
dists/msvc7/awe.vcproj
Normal file
169
dists/msvc7/awe.vcproj
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
<?xml version="1.0" encoding = "windows-1250"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="7.00"
|
||||||
|
Name="awe"
|
||||||
|
ProjectGUID="{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}"
|
||||||
|
Keyword="Win32Proj">
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"/>
|
||||||
|
</Platforms>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="awe_Debug"
|
||||||
|
IntermediateDirectory="awe_Debug"
|
||||||
|
ConfigurationType="4"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="../../;../../common"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;USE_ZLIB;USE_MAD;USE_VORBIS"
|
||||||
|
MinimalRebuild="TRUE"
|
||||||
|
ExceptionHandling="TRUE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="1"
|
||||||
|
BufferSecurityCheck="TRUE"
|
||||||
|
EnableFunctionLevelLinking="TRUE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="4"
|
||||||
|
WarnAsError="TRUE"
|
||||||
|
SuppressStartupBanner="FALSE"
|
||||||
|
DebugInformationFormat="4"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile="$(OutDir)/awe.lib"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="awe_Release"
|
||||||
|
IntermediateDirectory="awe_Release"
|
||||||
|
ConfigurationType="4"
|
||||||
|
CharacterSet="2"
|
||||||
|
WholeProgramOptimization="FALSE">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
OmitFramePointers="TRUE"
|
||||||
|
AdditionalIncludeDirectories="../../;../../common"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;USE_ZLIB;USE_MAD;USE_VORBIS"
|
||||||
|
StringPooling="TRUE"
|
||||||
|
ExceptionHandling="TRUE"
|
||||||
|
RuntimeLibrary="0"
|
||||||
|
BufferSecurityCheck="FALSE"
|
||||||
|
EnableFunctionLevelLinking="FALSE"
|
||||||
|
ForceConformanceInForLoopScope="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="4"
|
||||||
|
WarnAsError="TRUE"
|
||||||
|
DebugInformationFormat="0"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile="$(OutDir)/awe.lib"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<Files>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\awe.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\awe.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\bank.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\bank.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\engine.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\engine.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\file.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\file.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\intern.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\logic.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\logic.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\resource.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\resource.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\sdlstub.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\serializer.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\serializer.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\staticres.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\systemstub.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\util.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\util.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\video.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\awe\video.h">
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
|
@ -17,20 +17,23 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kyra", "kyra.vcproj", "{9D9
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saga", "saga.vcproj", "{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "saga", "saga.vcproj", "{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "awe", "awe.vcproj", "{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
ConfigName.0 = Debug
|
ConfigName.0 = Debug
|
||||||
ConfigName.1 = Release
|
ConfigName.1 = Release
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectDependencies) = postSolution
|
GlobalSection(ProjectDependencies) = postSolution
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.0 = {C8AAE83E-198B-4ECA-A877-166827953979}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.0 = {9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.1 = {676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.1 = {9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.2 = {B5527758-2F51-4CCD-AAE1-B0E28654BD6A}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.2 = {C8AAE83E-198B-4ECA-A877-166827953979}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.3 = {E0EC9C72-A33E-49DA-B1DC-BB44B9799BFA}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.3 = {676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.4 = {B6AFD548-63D2-40CD-A652-E87095AFCBAF}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.4 = {B5527758-2F51-4CCD-AAE1-B0E28654BD6A}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.5 = {6A55AF61-7CA1-49E0-9385-59C1FE9D4DB7}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.5 = {E0EC9C72-A33E-49DA-B1DC-BB44B9799BFA}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.6 = {6CC3E421-779D-4E80-8100-520886A0F9FF}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.6 = {B6AFD548-63D2-40CD-A652-E87095AFCBAF}
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.7 = {9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.7 = {6A55AF61-7CA1-49E0-9385-59C1FE9D4DB7}
|
||||||
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.8 = {6CC3E421-779D-4E80-8100-520886A0F9FF}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
GlobalSection(ProjectConfiguration) = postSolution
|
||||||
{8434CB15-D08F-427D-9E6D-581AE5B28440}.Debug.ActiveCfg = Debug|Win32
|
{8434CB15-D08F-427D-9E6D-581AE5B28440}.Debug.ActiveCfg = Debug|Win32
|
||||||
|
@ -69,6 +72,10 @@ Global
|
||||||
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Debug.Build.0 = Debug|Win32
|
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Debug.Build.0 = Debug|Win32
|
||||||
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Release.ActiveCfg = Release|Win32
|
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Release.ActiveCfg = Release|Win32
|
||||||
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Release.Build.0 = Release|Win32
|
{676DB4C5-9A3E-4EE1-8483-EBB79DC0700E}.Release.Build.0 = Release|Win32
|
||||||
|
{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}.Debug.ActiveCfg = Debug|Win32
|
||||||
|
{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}.Debug.Build.0 = Debug|Win32
|
||||||
|
{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}.Release.ActiveCfg = Release|Win32
|
||||||
|
{9D9A98A0-F88F-4CA2-B8FF-462470EBE3EC}.Release.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="winmm.lib sdl.lib libz.lib libmad.lib vorbisfile_static.lib vorbis_static.lib ogg_static.lib libmpeg2.lib sword1_debug/sword1.lib sword2_debug/sword2.lib kyra_debug/kyra.lib queen_debug/queen.lib scumm_debug/scumm.lib simon_debug/simon.lib sky_debug/sky.lib"
|
AdditionalDependencies="winmm.lib sdl.lib libz.lib libmad.lib vorbisfile_static.lib vorbis_static.lib ogg_static.lib libmpeg2.lib awe_debug/awe.lib sword1_debug/sword1.lib sword2_debug/sword2.lib kyra_debug/kyra.lib queen_debug/queen.lib saga_debug/saga.lib scumm_debug/scumm.lib simon_debug/simon.lib sky_debug/sky.lib"
|
||||||
OutputFile="$(OutDir)/scummvm.exe"
|
OutputFile="$(OutDir)/scummvm.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
IgnoreDefaultLibraryNames="libcmtd.lib"
|
IgnoreDefaultLibraryNames="libcmtd.lib"
|
||||||
|
@ -93,7 +93,7 @@
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
AdditionalDependencies="winmm.lib sdl.lib libz.lib libmad.lib vorbisfile_static.lib vorbis_static.lib ogg_static.lib libmpeg2.lib sword1_release/sword1.lib sword2_release/sword2.lib kyra_release/kyra.lib queen_release/queen.lib scumm_release/scumm.lib simon_release/simon.lib sky_release/sky.lib"
|
AdditionalDependencies="winmm.lib sdl.lib libz.lib libmad.lib vorbisfile_static.lib vorbis_static.lib ogg_static.lib libmpeg2.lib awe_release/awe.lib saga_release/saga.lib sword1_release/sword1.lib sword2_release/sword2.lib kyra_release/kyra.lib queen_release/queen.lib scumm_release/scumm.lib simon_release/simon.lib sky_release/sky.lib"
|
||||||
OutputFile="$(OutDir)/scummvm.exe"
|
OutputFile="$(OutDir)/scummvm.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
SuppressStartupBanner="TRUE"
|
SuppressStartupBanner="TRUE"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue