mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-22 18:02:05 +00:00
254 lines
6.4 KiB
C++
254 lines
6.4 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 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.
|
|
*
|
|
* $URL$
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include "common/config-manager.h"
|
|
#include "tsage/ringworld_scenes4.h"
|
|
#include "tsage/scenes.h"
|
|
#include "tsage/tsage.h"
|
|
#include "tsage/staticres.h"
|
|
|
|
namespace tSage {
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3500 - Ringworld Scan
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3500::Action1::signal() {
|
|
Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
|
|
|
|
switch (_actionIndex++) {
|
|
case 0:
|
|
setDelay(10);
|
|
break;
|
|
case 1:
|
|
scene->_stripManager.start(3500, this);
|
|
break;
|
|
case 2:
|
|
setDelay(3);
|
|
break;
|
|
case 3:
|
|
_globals->_sceneManager.changeScene(9999);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene3500::Action2::signal() {
|
|
Scene3500 *scene = (Scene3500 *)_globals->_sceneManager._scene;
|
|
|
|
switch (_actionIndex++) {
|
|
case 0:
|
|
setDelay(10);
|
|
break;
|
|
case 1:
|
|
scene->_stripManager.start(3501, this);
|
|
break;
|
|
case 2:
|
|
setDelay(3);
|
|
break;
|
|
case 3:
|
|
_globals->_sceneManager.changeScene(2012);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3500::postInit(SceneObjectList *OwnerList) {
|
|
loadScene((_globals->_stripNum == 3600) ? 3600 : 3500);
|
|
Scene::postInit();
|
|
|
|
_stripManager.addSpeaker(&_speakerQText);
|
|
_stripManager.addSpeaker(&_speakerMText);
|
|
_stripManager.addSpeaker(&_speakerSText);
|
|
|
|
_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
|
|
_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.top / 160) * 160;
|
|
|
|
setAction((_globals->_stripNum == 3600) ? (Action *)&_action2 : (Action *)&_action1);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Scene 3700 - Remote Viewer
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define VIEW_FRAME_DELAY 10
|
|
|
|
Scene3700::Viewer::Viewer() {
|
|
_images1.setVisage(3705, 1);
|
|
_images2.setVisage(3705, 2);
|
|
|
|
_frameList[0] = 1;
|
|
for (int idx = 1; idx <= 3; ++idx)
|
|
_frameList[idx] = _globals->_randomSource.getRandomNumber(4) + 1;
|
|
|
|
_active = true;
|
|
_countdownCtr = 0;
|
|
_percentList[0] = 120;
|
|
_percentList[1] = 50;
|
|
_percentList[2] = 75;
|
|
_percentList[3] = 114;
|
|
}
|
|
|
|
void Scene3700::Viewer::synchronise(Serialiser &s) {
|
|
SceneObject::synchronise(s);
|
|
s.syncAsByte(_active);
|
|
s.syncAsSint16LE(_countdownCtr);
|
|
for (int idx = 0; idx < 4; ++idx) {
|
|
s.syncAsSint16LE(_frameList[idx]);
|
|
s.syncAsSint16LE(_percentList[idx]);
|
|
}
|
|
}
|
|
|
|
void Scene3700::Viewer::dispatch() {
|
|
if (_active) {
|
|
if (_countdownCtr-- <= 0) {
|
|
_countdownCtr = VIEW_FRAME_DELAY;
|
|
|
|
for (int idx = 3; idx > 1; --idx)
|
|
_frameList[idx] = _frameList[idx - 1];
|
|
|
|
int newFrame;
|
|
do {
|
|
newFrame = _globals->_randomSource.getRandomNumber(4) + 1;
|
|
} while (newFrame == _frameList[2]);
|
|
|
|
_frameList[1] = newFrame;
|
|
_flags |= OBJFLAG_PANES;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene3700::Viewer::reposition() {
|
|
_bounds = Rect(123, 40, 285, 123);
|
|
}
|
|
|
|
void Scene3700::Viewer::draw() {
|
|
Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(1);
|
|
|
|
for (int idx = 0; idx < 4; ++idx) {
|
|
Visage &v = (idx == 0) ? _images1 : _images2;
|
|
|
|
GfxSurface img = v.getFrame(_frameList[idx]);
|
|
Rect destRect = img.getBounds();
|
|
destRect.resize(img, (_position.x - _globals->_sceneOffset.x),
|
|
(_position.y - _globals->_sceneOffset.y - _yDiff), _percentList[idx]);
|
|
|
|
destRect.translate(-_globals->_sceneManager._scene->_sceneBounds.left,
|
|
-_globals->_sceneManager._scene->_sceneBounds.top);
|
|
|
|
_globals->gfxManager().copyFrom(img, destRect, priorityRegion);
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3700::Action1::signal() {
|
|
Scene3700 *scene = (Scene3700 *)_globals->_sceneManager._scene;
|
|
|
|
switch (_actionIndex++) {
|
|
case 0:
|
|
setDelay(10);
|
|
break;
|
|
case 1:
|
|
scene->_stripManager.start(2162, this);
|
|
break;
|
|
case 2:
|
|
scene->_viewer._active = false;
|
|
setDelay(90);
|
|
break;
|
|
case 3:
|
|
scene->_soundHandler.startSound(196);
|
|
scene->_viewer.hide();
|
|
|
|
scene->_hotspot1.postInit();
|
|
scene->_hotspot1.setVisage(3710);
|
|
scene->_hotspot1.setStrip(1);
|
|
scene->_hotspot1.setFrame(1);
|
|
scene->_hotspot1.setPosition(Common::Point(204, 120));
|
|
|
|
setDelay(90);
|
|
break;
|
|
case 4:
|
|
scene->_soundHandler.startSound(197);
|
|
scene->_hotspot1.hide();
|
|
|
|
scene->_hotspot2.postInit();
|
|
scene->_hotspot2.setVisage(3710);
|
|
scene->_hotspot2.setStrip(2);
|
|
scene->_hotspot2.setFrame(1);
|
|
scene->_hotspot2.setPosition(Common::Point(204, 120));
|
|
|
|
setDelay(30);
|
|
break;
|
|
case 5:
|
|
scene->_soundHandler.startSound(198);
|
|
scene->_hotspot2.hide();
|
|
scene->_hotspot1.show();
|
|
setDelay(90);
|
|
break;
|
|
case 6:
|
|
scene->_stripManager.start(2166, this);
|
|
break;
|
|
case 7:
|
|
setDelay(60);
|
|
break;
|
|
case 8:
|
|
scene->_hotspot1.remove();
|
|
scene->_hotspot2.show();
|
|
_globals->setFlag(59);
|
|
setDelay(30);
|
|
break;
|
|
case 9:
|
|
_globals->_sceneManager.changeScene(2100);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void Scene3700::postInit(tSage::SceneObjectList *OwnerList) {
|
|
Scene::postInit();
|
|
loadScene(3700);
|
|
|
|
_stripManager.addSpeaker(&_speakerSText);
|
|
_stripManager.addSpeaker(&_speakerMText);
|
|
_stripManager.addSpeaker(&_speakerMR);
|
|
_speakerSText.setTextPos(Common::Point(20, 15));
|
|
_speakerMText.setTextPos(Common::Point(20, 15));
|
|
|
|
_viewer.postInit();
|
|
_viewer.setVisage(3705);
|
|
_viewer.setStrip(1);
|
|
_viewer.setFrame(2);
|
|
_viewer.setPosition(Common::Point(195, 83));
|
|
|
|
setAction(&_action1);
|
|
_globals->_soundHandler.startSound(195);
|
|
}
|
|
|
|
} // End of namespace tSage
|