scummvm/engines/tsage/blue_force/blueforce_logic.cpp

363 lines
7.5 KiB
C++
Raw Normal View History

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "tsage/blue_force/blueforce_logic.h"
#include "tsage/blue_force/blueforce_scenes0.h"
#include "tsage/blue_force/blueforce_scenes1.h"
#include "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
namespace TsAGE {
namespace BlueForce {
void BlueForceGame::start() {
// Start the game
_globals->_sceneManager.changeScene(50);
_globals->_events.setCursor(CURSOR_WALK);
}
Scene *BlueForceGame::createScene(int sceneNumber) {
switch (sceneNumber) {
/* Scene Group #0 */
case 20:
// Tsunami Title Screen
return new Scene20();
case 50:
return new Scene50();
case 60:
error("Scene group 0 not implemented");
/* Scene Group #1 */
case 100:
// Tsnunami Title Screen #2
return new Scene100();
case 109:
// Introduction Bar Room
return new Scene109();
case 110:
case 114:
case 115:
case 125:
case 140:
case 150:
case 160:
case 180:
case 190:
error("Scene group 1 not implemented");
case 200:
case 210:
case 220:
case 225:
case 265:
case 270:
case 271:
case 280:
error("Scene group 2 not implemented");
case 300:
case 315:
case 325:
case 330:
case 340:
case 342:
case 350:
case 355:
case 360:
case 370:
case 380:
case 385:
case 390:
error("Scene group 3 not implemented");
case 410:
case 415:
case 440:
case 450:
error("Scene group 4 not implemented");
case 550:
case 551:
case 560:
case 570:
case 580:
case 590:
error("Scene group 5 not implemented");
case 600:
case 620:
case 666:
case 690:
error("Scene group 6 not implemented");
case 710:
error("Scene group 7 not implemented");
case 800:
case 810:
case 820:
case 830:
case 840:
case 850:
case 860:
case 870:
case 880:
error("Scene group 8 not implemented");
case 900:
case 910:
case 920:
case 930:
case 935:
case 940:
error("Scene group 9 not implemented");
default:
error("Unknown scene number - %d", sceneNumber);
break;
}
}
/*--------------------------------------------------------------------------*/
AObjectArray::AObjectArray(): EventHandler() {
_inUse = false;
clear();
}
void AObjectArray::clear() {
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
_objList[i] = NULL;
}
void AObjectArray::synchronize(Serializer &s) {
EventHandler::synchronize(s);
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i)
SYNC_POINTER(_objList[i]);
}
void AObjectArray::process(Event &event) {
if (_inUse)
error("Array error");
_inUse = true;
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
if (_objList[i])
_objList[i]->process(event);
}
_inUse = false;
}
void AObjectArray::dispatch() {
if (_inUse)
error("Array error");
_inUse = true;
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
if (_objList[i])
_objList[i]->dispatch();
}
_inUse = false;
}
int AObjectArray::getNewIndex() {
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
if (!_objList[i])
return i;
}
error("AObjectArray too full.");
}
void AObjectArray::add(EventHandler *obj) {
int idx = getNewIndex();
_objList[idx] = obj;
}
void AObjectArray::remove(EventHandler *obj) {
for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) {
if (_objList[i] == obj) {
_objList[i] = NULL;
return;
}
}
}
/*--------------------------------------------------------------------------*/
Timer::Timer() {
_endFrame = 0;
_endAction = NULL;
_tickAction = NULL;
}
void Timer::remove() {
_endFrame = 0;
_endAction = NULL;
((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this);
}
void Timer::signal() {
assert(_endAction);
Action *action = _endAction;
remove();
action->signal();
}
void Timer::dispatch() {
if (_tickAction)
_tickAction->dispatch();
if (_endFrame) {
uint32 frameNumber = BF_GLOBALS._events.getFrameNumber();
if (frameNumber > _endFrame)
// Timer has expired
signal();
}
}
void Timer::set(uint32 delay, Action *action) {
assert(delay != 0);
_endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay;
_endAction = action;
((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this);
}
/*--------------------------------------------------------------------------*/
void SceneItemType1::process(Event &event) {
if (_action)
_action->process(event);
}
void SceneItemType1::startMove(SceneObject *sceneObj, va_list va) {
warning("TODO: sub_1621C");
}
/*--------------------------------------------------------------------------*/
void SceneItemType2::startMove(SceneObject *sceneObj, va_list va) {
}
/*--------------------------------------------------------------------------*/
SceneExt::SceneExt(): Scene() {
warning("TODO: dword_503AA/dword_503AE/dword_53030");
_field372 = 0;
_field37A = 0;
_eventHandler = NULL;
}
void SceneExt::postInit(SceneObjectList *OwnerList) {
Scene::postInit(OwnerList);
if (BF_GLOBALS._v4CEA2) {
// Blank out the bottom portion of the screen
2011-08-16 21:15:18 +10:00
BF_GLOBALS._interfaceY = BF_INTERFACE_Y;
Rect r(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT);
BF_GLOBALS.gfxManager().getSurface().fillRect(r, 0);
}
}
void SceneExt::process(Event &event) {
_objArray2.process(event);
if (!event.handled)
Scene::process(event);
}
void SceneExt::dispatch() {
_timerList.dispatch();
if (_field37A) {
if ((--_field37A == 0) && BF_GLOBALS._v4CEA2) {
if (BF_GLOBALS._v4E238 && (BF_GLOBALS._v4CF9E == 1)) {
warning("sub_1B052");
}
_field37A = 0;
}
}
Scene::dispatch();
}
void SceneExt::loadScene(int sceneNum) {
Scene::loadScene(sceneNum);
_v51C34.top = 0;
_v51C34.bottom = 300;
}
/*--------------------------------------------------------------------------*/
GameScene::GameScene() {
}
void GameScene::postInit(SceneObjectList *OwnerList) {
_field794 = 0;
_field412 = 1;
SceneExt::postInit(OwnerList);
}
void GameScene::remove() {
SceneExt::remove();
if (_field794 == 1) {
for (SynchronizedList<SceneObject *>::iterator i = BF_GLOBALS._sceneObjects->begin();
i != BF_GLOBALS._sceneObjects->end(); ++i)
(*i)->remove();
BF_GLOBALS._sceneObjects->draw();
BF_GLOBALS._scenePalette.loadPalette(2);
BF_GLOBALS._v51C44 = 1;
BF_GLOBALS._v51C42 = 1;
}
BF_GLOBALS._scenePalette._field412 = 1;
}
/*--------------------------------------------------------------------------*/
void SceneHandlerExt::postInit(SceneObjectList *OwnerList) {
SceneHandler::postInit(OwnerList);
// Load the low end palette data
GLOBALS._scenePalette.loadPalette(2);
GLOBALS._scenePalette.refresh();
}
void SceneHandlerExt::process(Event &event) {
SceneHandler::process(event);
// TODO: All the new stuff from Blue Force
}
/*--------------------------------------------------------------------------*/
BlueForceInvObjectList::BlueForceInvObjectList() {
}
} // End of namespace BlueForce
} // End of namespace TsAGE