Files
scummvm-cursorfix/engines/awe/engine.cpp
2026-02-02 04:50:13 +01:00

265 lines
6.0 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "awe/engine.h"
#include "awe/gfx.h"
#include "awe/resource_nth.h"
#include "awe/system_stub.h"
namespace Awe {
static const uint16 RESTART_POS[36 * 2] = {
16008, 0, 16001, 0, 16002, 10, 16002, 12, 16002, 14,
16003, 20, 16003, 24, 16003, 26, 16004, 30, 16004, 31,
16004, 32, 16004, 33, 16004, 34, 16004, 35, 16004, 36,
16004, 37, 16004, 38, 16004, 39, 16004, 40, 16004, 41,
16004, 42, 16004, 43, 16004, 44, 16004, 45, 16004, 46,
16004, 47, 16004, 48, 16004, 49, 16006, 64, 16006, 65,
16006, 66, 16006, 67, 16006, 68, 16005, 50, 16006, 60,
16007, 0
};
Engine::Engine(Sound *sound, DataType dataType, int partNum) :
_sound(sound), _script(sound, &_res, &_ply, &_vid),
_res(&_vid, dataType), _ply(&_res), _vid(&_res),
_partNum(partNum) {
sound->setPlayer(&_ply);
}
void Engine::setSystemStub(SystemStub *stub, Gfx *graphics) {
_stub = stub;
_script._stub = stub;
_graphics = graphics;
}
void Engine::run() {
switch (_state) {
case kStateLogo3DO:
doThreeScreens();
scrollText(0, 380, Video::NOTE_TEXT_3DO);
playCinepak("Logo.Cine");
playCinepak("Spintitle.Cine");
break;
case kStateTitle3DO:
titlePage();
break;
case kStateEnd3DO:
doEndCredits();
break;
case kStateGame:
_script.setupTasks();
_script.updateInput();
processInput();
_script.runTasks();
#if 0
_mix.update();
#endif
if (_res.getDataType() == DT_3DO) {
switch (_res._nextPart) {
case 16009:
_state = kStateEnd3DO;
break;
case 16000:
_state = kStateTitle3DO;
break;
default:
break;
}
}
break;
default:
break;
}
}
void Engine::setup(Language lang, int graphicsType) {
_vid._graphics = _graphics;
int w = GFX_W;
int h = GFX_H;
if (_res.getDataType() != DT_3DO) {
_vid._graphics->_fixUpPalette = FIXUP_PALETTE_REDRAW;
}
_vid.init();
_res._lang = lang;
_res.allocMemBlock();
_res.readEntries();
_res.dumpEntries();
const bool isNth = !Gfx::_is1991 && (_res.getDataType() == DT_15TH_EDITION || _res.getDataType() == DT_20TH_EDITION);
if (isNth) {
// get HD background bitmaps resolution
_res._nth->getBitmapSize(&w, &h);
}
_graphics->init(w, h);
if (isNth) {
_res.loadFont();
_res.loadHeads();
} else {
_vid.setDefaultFont();
}
_script.init();
switch (_res.getDataType()) {
case DT_DOS:
case DT_AMIGA:
case DT_ATARI:
case DT_ATARI_DEMO:
switch (lang) {
case Common::FR_FRA:
_vid._stringsTable = Video::STRINGS_TABLE_FR;
break;
case Common::IT_ITA:
_vid._stringsTable = Video::STRINGS_TABLE_ITA;
break;
case Common::EN_ANY:
default:
_vid._stringsTable = Video::STRINGS_TABLE_ENG;
break;
}
break;
case DT_WIN31:
case DT_15TH_EDITION:
case DT_20TH_EDITION:
case DT_3DO:
break;
}
if (_res._copyProtection) {
switch (_res.getDataType()) {
case DT_DOS:
if (!_res._hasPasswordScreen) {
break;
}
/* fall-through */
case DT_AMIGA:
case DT_ATARI:
case DT_WIN31:
_partNum = kPartCopyProtection;
break;
default:
break;
}
}
if (_res.getDataType() == DT_3DO && _partNum == kPartIntro) {
_state = kStateLogo3DO;
} else {
_state = kStateGame;
const int num = _partNum;
if (num < 36) {
_script.restartAt(RESTART_POS[num * 2], RESTART_POS[num * 2 + 1]);
} else {
_script.restartAt(num);
}
}
}
void Engine::finish() {
_graphics->fini();
_ply.stop();
_sound->stopAll();
_res.freeMemBlock();
}
void Engine::processInput() {
if (_stub->_pi.fastMode) {
_script._fastMode = !_script._fastMode;
_stub->_pi.fastMode = false;
}
}
void Engine::doThreeScreens() {
_script.snd_playMusic(1, 0, 0);
static const int BITMAPS[] = { 67, 68, 69, -1 };
for (int i = 0; BITMAPS[i] != -1 && !_stub->_pi.quit; ++i) {
_res.loadBmp(BITMAPS[i]);
_vid.updateDisplay(0, _stub);
while (!_stub->_pi.quit) {
_stub->processEvents();
if (_stub->_pi.action) {
_stub->_pi.action = false;
break;
}
_stub->sleep(50);
}
}
_state = kStateTitle3DO;
}
void Engine::doEndCredits() {
scrollText(0, 380, Video::END_TEXT_3DO);
_script.snd_playMusic(0, 0, 0);
playCinepak("ootw2.cine");
_state = kStateTitle3DO;
}
void Engine::playCinepak(const char *name) {
warning("STUB: Engine::playCinepak()");
}
void Engine::scrollText(int a, int b, const char *text) {
warning("STUB: Engine::scrollText()");
}
void Engine::titlePage() {
_res.loadBmp(70);
static const int kCursorColor = 0;
_vid.setPaletteColor(kCursorColor, 255, 0, 0);
static const uint16 YPOS[] = { 97, 123, 149 };
int y = 0;
while (!_stub->_pi.quit) {
_vid.copyPage(0, 1, 0);
_vid.drawRect(1, kCursorColor, 97, YPOS[y], 210, YPOS[y + 1]);
_stub->processEvents();
if (_stub->_pi.dirMask & PlayerInput::DIR_DOWN) {
_stub->_pi.dirMask &= ~PlayerInput::DIR_DOWN;
_partNum = kPartPassword;
y = 1;
}
if (_stub->_pi.dirMask & PlayerInput::DIR_UP) {
_stub->_pi.dirMask &= ~PlayerInput::DIR_UP;
_partNum = kPartIntro;
y = 0;
}
if (_stub->_pi.action) {
_stub->_pi.action = false;
_script.restartAt(_partNum);
break;
}
_vid.updateDisplay(1, _stub);
_stub->sleep(50);
}
_state = kStateGame;
}
void Engine::saveGameState(uint8 slot, const char *desc) {
warning("STUB: Engine::saveGameState()");
}
void Engine::loadGameState(uint8 slot) {
warning("STUB: Engine::loadGameState()");
}
} // namespace Awe