aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tsage')
-rw-r--r--engines/tsage/converse.cpp13
-rw-r--r--engines/tsage/converse.h3
-rw-r--r--engines/tsage/core.cpp4
-rw-r--r--engines/tsage/core.h2
-rw-r--r--engines/tsage/events.cpp8
-rw-r--r--engines/tsage/graphics.cpp23
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp22
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.h9
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.cpp239
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes0.h14
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.cpp447
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes1.h18
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.cpp2
-rw-r--r--engines/tsage/saveload.cpp2
14 files changed, 648 insertions, 158 deletions
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index ec14ff330d..753a835389 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -556,7 +556,7 @@ void Obj44::load(const byte *dataP) {
_mode = s.readSint16LE();
_lookupValue = s.readSint16LE();
_lookupIndex = s.readSint16LE();
- _field6 = s.readSint16LE();
+ _exitMode = s.readSint16LE();
_speakerMode = s.readSint16LE();
}
@@ -592,7 +592,7 @@ void Obj44::synchronize(Serializer &s) {
s.syncAsSint16LE(_mode);
s.syncAsSint16LE(_lookupValue);
s.syncAsSint16LE(_lookupIndex);
- s.syncAsSint16LE(_field6);
+ s.syncAsSint16LE(_exitMode);
s.syncAsSint16LE(_speakerMode);
for (int i = 0; i < 11; ++i)
@@ -648,6 +648,7 @@ void StripManager::reset() {
_activeSpeaker = NULL;
_textShown = false;
_callbackObject = NULL;
+ _exitMode = 0;
_obj44List.clear();
if (!_script.empty()) {
@@ -695,6 +696,8 @@ void StripManager::synchronize(Serializer &s) {
s.syncAsByte(_textShown);
s.syncAsByte(_field2E6);
s.syncAsSint32LE(_field2E8);
+ if (g_vm->getGameID() == GType_Ringworld2)
+ s.syncAsSint16LE(_exitMode);
// Synchronize the item list
int arrSize = _obj44List.size();
@@ -725,7 +728,7 @@ void StripManager::synchronize(Serializer &s) {
void StripManager::remove() {
if (g_vm->getGameID() == GType_Ringworld2) {
- for (int i = 0; i < _speakerList.size(); ++i) {
+ for (uint i = 0; i < _speakerList.size(); ++i) {
if (_activeSpeaker != _speakerList[i])
_speakerList[i]->proc16();
}
@@ -790,8 +793,8 @@ void StripManager::signal() {
if (g_vm->getGameID() == GType_Ringworld2) {
// Return to Ringworld specific handling
- if (obj44._field6)
- _field2E8 = obj44._field6;
+ if (obj44._exitMode)
+ _exitMode = obj44._exitMode;
switch (obj44._mode) {
case 1:
diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h
index 00c1f44051..5aef0d8a7f 100644
--- a/engines/tsage/converse.h
+++ b/engines/tsage/converse.h
@@ -194,7 +194,7 @@ public:
// Return to Ringworld specific field
int _mode;
- int _lookupValue, _lookupIndex, _field6;
+ int _lookupValue, _lookupIndex, _exitMode;
int _speakerMode;
int _field16[11];
public:
@@ -223,6 +223,7 @@ public:
bool _textShown;
bool _field2E6;
int _field2E8;
+ int _exitMode;
Common::Array<Obj44> _obj44List;
Common::Array<byte> _script;
StripProc _onBegin;
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 7ca529f2ed..6b4e2963a5 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -2762,8 +2762,8 @@ void BackgroundSceneObject::setup2(int visage, int stripFrameNum, int frameNum,
fixPriority(priority);
}
-void BackgroundSceneObject::proc27() {
- warning("STUB: BackgroundSceneObject::proc27()");
+void BackgroundSceneObject::copySceneToBackground() {
+ GLOBALS._sceneManager._scene->_backSurface.copyFrom(g_globals->gfxManager().getSurface(), 0, 0);
}
/*--------------------------------------------------------------------------*/
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 1f9d7cd3a5..f7a5a43b16 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -613,7 +613,7 @@ public:
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void draw();
void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority, int32 arg10);
- void proc27();
+ static void copySceneToBackground();
};
class SceneText : public SceneObject {
diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp
index 8f07a8243b..5ca531fdb9 100644
--- a/engines/tsage/events.cpp
+++ b/engines/tsage/events.cpp
@@ -277,7 +277,7 @@ void EventsClass::setCursor(CursorType cursorType) {
GfxSurface s = surfaceFromRes(cursor);
Graphics::Surface surface = s.lockSurface();
- const byte *cursorData = (const byte *)surface.getBasePtr(0, 0);
+ const byte *cursorData = (const byte *)surface.getPixels();
CursorMan.replaceCursor(cursorData, surface.w, surface.h, s._centroid.x, s._centroid.y, s._transColor);
s.unlockSurface();
@@ -333,7 +333,7 @@ void EventsClass::pushCursor(CursorType cursorType) {
GfxSurface s = surfaceFromRes(cursor);
Graphics::Surface surface = s.lockSurface();
- const byte *cursorData = (const byte *)surface.getBasePtr(0, 0);
+ const byte *cursorData = (const byte *)surface.getPixels();
CursorMan.pushCursor(cursorData, surface.w, surface.h, s._centroid.x, s._centroid.y, s._transColor);
s.unlockSurface();
@@ -346,7 +346,7 @@ void EventsClass::popCursor() {
}
void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Common::Point &hotspot, CursorType cursorId) {
- const byte *cursorData = (const byte *)cursor.getBasePtr(0, 0);
+ const byte *cursorData = (const byte *)cursor.getPixels();
CursorMan.replaceCursor(cursorData, cursor.w, cursor.h, hotspot.x, hotspot.y, transColor);
_currentCursor = cursorId;
@@ -355,7 +355,7 @@ void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Com
void EventsClass::setCursor(GfxSurface &cursor) {
Graphics::Surface s = cursor.lockSurface();
- const byte *cursorData = (const byte *)s.getBasePtr(0, 0);
+ const byte *cursorData = (const byte *)s.getPixels();
CursorMan.replaceCursor(cursorData, cursor.getBounds().width(), cursor.getBounds().height(),
cursor._centroid.x, cursor._centroid.y, cursor._transColor);
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp
index ce19502524..1815c3d751 100644
--- a/engines/tsage/graphics.cpp
+++ b/engines/tsage/graphics.cpp
@@ -47,7 +47,7 @@ GfxSurface *surfaceGetArea(GfxSurface &src, const Rect &bounds) {
Graphics::Surface destSurface = dest->lockSurface();
byte *srcP = (byte *)srcSurface.getBasePtr(bounds.left, bounds.top);
- byte *destP = (byte *)destSurface.getBasePtr(0, 0);
+ byte *destP = (byte *)destSurface.getPixels();
for (int y = bounds.top; y < bounds.bottom; ++y, srcP += srcSurface.pitch, destP += destSurface.pitch)
Common::copy(srcP, srcP + destSurface.pitch, destP);
@@ -76,7 +76,7 @@ GfxSurface surfaceFromRes(const byte *imgData) {
const byte *srcP = imgData + 10;
Graphics::Surface destSurface = s.lockSurface();
- byte *destP = (byte *)destSurface.getBasePtr(0, 0);
+ byte *destP = (byte *)destSurface.getPixels();
if (!rleEncoded) {
Common::copy(srcP, srcP + (r.width() * r.height()), destP);
@@ -316,7 +316,7 @@ void GfxSurface::create(int width, int height) {
}
_customSurface = new Graphics::Surface();
_customSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
- Common::fill((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0);
+ Common::fill((byte *)_customSurface->getPixels(), (byte *)_customSurface->getBasePtr(0, height), 0);
_bounds = Rect(0, 0, width, height);
}
@@ -332,12 +332,7 @@ Graphics::Surface GfxSurface::lockSurface() {
// Setup the returned surface either as one pointing to the same pixels as the source, or
// as a subset of the source one based on the currently set bounds
Graphics::Surface result;
- result.w = _bounds.width();
- result.h = _bounds.height();
- result.pitch = src->pitch;
- result.format = src->format;
- result.pixels = src->getBasePtr(_bounds.left, _bounds.top);
-
+ result.init(_bounds.width(), _bounds.height(), src->pitch, src->getBasePtr(_bounds.left, _bounds.top), src->format);
return result;
}
@@ -363,7 +358,7 @@ void GfxSurface::synchronize(Serializer &s) {
if (_customSurface) {
s.syncAsSint16LE(_customSurface->w);
s.syncAsSint16LE(_customSurface->h);
- s.syncBytes((byte *)_customSurface->pixels, _customSurface->w * _customSurface->h);
+ s.syncBytes((byte *)_customSurface->getPixels(), _customSurface->w * _customSurface->h);
} else {
int zero = 0;
s.syncAsSint16LE(zero);
@@ -380,7 +375,7 @@ void GfxSurface::synchronize(Serializer &s) {
_customSurface = NULL;
} else {
create(w, h);
- s.syncBytes((byte *)_customSurface->pixels, w * h);
+ s.syncBytes((byte *)_customSurface->getPixels(), w * h);
}
}
}
@@ -417,8 +412,8 @@ GfxSurface &GfxSurface::operator=(const GfxSurface &s) {
// Surface owns the internal data, so replicate it so new surface owns it's own
_customSurface = new Graphics::Surface();
_customSurface->create(s._customSurface->w, s._customSurface->h, Graphics::PixelFormat::createFormatCLUT8());
- const byte *srcP = (const byte *)s._customSurface->getBasePtr(0, 0);
- byte *destP = (byte *)_customSurface->getBasePtr(0, 0);
+ const byte *srcP = (const byte *)s._customSurface->getPixels();
+ byte *destP = (byte *)_customSurface->getPixels();
Common::copy(srcP, srcP + (_bounds.width() * _bounds.height()), destP);
}
@@ -581,7 +576,7 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi
Graphics::Surface destSurface = srcImage.lockSurface();
const byte *srcP = (const byte *)srcSurface.getBasePtr(srcBounds.left, srcBounds.top);
- byte *destP = (byte *)destSurface.pixels;
+ byte *destP = (byte *)destSurface.getPixels();
for (int yp = srcBounds.top; yp < srcBounds.bottom; ++yp, srcP += srcSurface.pitch, destP += destSurface.pitch) {
Common::copy(srcP, srcP + srcBounds.width(), destP);
}
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index ac6ba523f6..f1f9f9fe5a 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -108,7 +108,8 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
/* Scene group #1 */
//
case 1000:
- error("Missing scene %d from group 1", sceneNumber);
+ // Cutscene scene
+ return new Scene1000();
case 1010:
// Cutscene - trip in space
return new Scene1010();
@@ -322,6 +323,12 @@ SceneExt::SceneExt(): Scene() {
_savedUiEnabled = false;
_savedCanWalk = false;
_focusObject = NULL;
+
+ // WORKAROUND: In the original, playing animations don't reset the global _animationCtr
+ // counter as scene changes unless the playing animation explicitly finishes. For now,
+ // to make inter-scene debugging easier, I'm explicitly resetting the _animationCtr
+ // on scene start, since scene objects aren't drawn while it's non-zero
+ R2_GLOBALS._animationCtr = 0;
}
void SceneExt::postInit(SceneObjectList *OwnerList) {
@@ -521,7 +528,7 @@ void SceneExt::refreshBackground(int xAmount, int yAmount) {
assert(screenSize == (s.w * s.h));
// Copy the data
- byte *destP = (byte *)s.getBasePtr(0, 0);
+ byte *destP = (byte *)s.getPixels();
Common::copy(dataP, dataP + (s.w * s.h), destP);
_backSurface.unlockSurface();
@@ -569,6 +576,13 @@ void SceneExt::scalePalette(int RFactor, int GFactor, int BFactor) {
}
}
+void SceneExt::loadBlankScene() {
+ _backSurface.create(SCREEN_WIDTH, SCREEN_HEIGHT * 3 / 2);
+ _backSurface.fillRect(_backSurface.getBounds(), 0);
+
+ R2_GLOBALS._screenSurface.fillRect(R2_GLOBALS._screenSurface.getBounds(), 0);
+}
+
/*--------------------------------------------------------------------------*/
void SceneHandlerExt::postInit(SceneObjectList *OwnerList) {
@@ -1749,7 +1763,7 @@ AnimationPlayer::~AnimationPlayer() {
void AnimationPlayer::synchronize(Serializer &s) {
EventHandler::synchronize(s);
- warning("TODO AnimationPlayer::load");
+ warning("TODO AnimationPlayer::synchronize");
}
void AnimationPlayer::remove() {
@@ -2454,6 +2468,8 @@ void ScannerDialog::proc12(int visage, int stripFrameNum, int frameNum, int posX
}
}
+/*--------------------------------------------------------------------------*/
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h
index 2cf48f3cf3..1b4b7fca1f 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.h
+++ b/engines/tsage/ringworld2/ringworld2_logic.h
@@ -108,6 +108,7 @@ public:
void fadeOut();
void clearScreen();
void scalePalette(int RFactor, int GFactor, int BFactor);
+ void loadBlankScene();
};
class SceneHandlerExt: public SceneHandler {
@@ -392,6 +393,8 @@ public:
enum AnimationPaletteMode { ANIMPALMODE_REPLACE_PALETTE = 0, ANIMPALMODE_CURR_PALETTE = 1,
ANIMPALMODE_NONE = 2 };
+enum AnimationObjectMode { ANIMOBJMODE_1 = 1, ANIMOBJMODE_2 = 2, ANIMOBJMODE_42 = 42 };
+
class AnimationPlayer: public EventHandler {
private:
void rleDecode(const byte *pSrc, byte *pDest, int size);
@@ -406,8 +409,9 @@ public:
Common::File _resourceFile;
Rect _rect1, _screenBounds;
int _field38;
- int _field3A, _paletteMode;
- int _objectMode;
+ int _field3A;
+ AnimationPaletteMode _paletteMode;
+ AnimationObjectMode _objectMode;
int _field58, _sliceHeight;
byte _palIndexes[256];
ScenePalette _palette;
@@ -432,6 +436,7 @@ public:
virtual void changePane() {}
virtual void closing() {}
+
bool load(int animId, Action *endAction = NULL);
bool isCompleted();
void close();
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
index 9cfa53ed22..8d35fc7222 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp
@@ -573,23 +573,23 @@ void Scene125::Icon::hideIcon() {
/*--------------------------------------------------------------------------*/
-bool Scene125::Item4::startAction(CursorType action, Event &event) {
+bool Scene125::DiskSlot::startAction(CursorType action, Event &event) {
Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
switch (action) {
case CURSOR_USE:
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 126;
- scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_object7, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_infoDisk, NULL);
return true;
}
break;
case R2_OPTO_DISK:
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) {
R2_GLOBALS._player.disableControl();
- scene->_object7.postInit();
+ scene->_infoDisk.postInit();
scene->_sceneMode = 125;
- scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_object7, NULL);
+ scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_infoDisk, NULL);
return true;
}
break;
@@ -626,16 +626,16 @@ void Scene125::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._player.disableControl();
if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) {
- _object7.postInit();
- _object7.setup(160, 3, 5);
- _object7.setPosition(Common::Point(47, 167));
+ _infoDisk.postInit();
+ _infoDisk.setup(160, 3, 5);
+ _infoDisk.setPosition(Common::Point(47, 167));
}
_object6.postInit();
_object6.setup(162, 1, 1);
_object6.setPosition(Common::Point(214, 168));
- _item4.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL);
+ _diskSlot.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL);
_item3.setDetails(Rect(144, 119, 286, 167), 126, 6, 7, 8, 1, NULL);
_item2.setDetails(1, 126, 3, 4, 5);
_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 126, 0, 1, -1, 1, NULL);
@@ -782,10 +782,11 @@ void Scene125::signal() {
break;
case 125:
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, R2_GLOBALS._player._oldCharacterScene[1]);
+ R2_GLOBALS._player.enableControl();
break;
case 126:
R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
- _object7.remove();
+ _infoDisk.remove();
R2_GLOBALS._player.enableControl();
R2_GLOBALS._player._canWalk = false;
break;
@@ -1553,7 +1554,7 @@ void Scene180::signal() {
R2_GLOBALS._sceneManager._hasPalette = true;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._v = 1;
- _animationPlayer._objectMode = 1;
+ _animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 1;
_animationPlayer.load(1);
@@ -1596,7 +1597,7 @@ void Scene180::signal() {
case 5:
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._v = 1;
- _animationPlayer._objectMode = 1;
+ _animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 2;
_animationPlayer.load(2);
@@ -1701,7 +1702,7 @@ void Scene180::signal() {
_field412 = 1;
_animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE;
_animationPlayer._v = 1;
- _animationPlayer._objectMode = 42;
+ _animationPlayer._objectMode = ANIMOBJMODE_42;
R2_GLOBALS._scene180Mode = 3;
_animationPlayer.load(3);
break;
@@ -1800,7 +1801,7 @@ void Scene180::signal() {
case 40:
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
- _animationPlayer._objectMode = 1;
+ _animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 4;
if (_animationPlayer.load(4)) {
_animationPlayer.dispatch();
@@ -1839,7 +1840,7 @@ void Scene180::signal() {
_field412 = 1;
_animationPlayer._paletteMode = ANIMPALMODE_NONE;
_animationPlayer._v = 1;
- _animationPlayer._objectMode = 1;
+ _animationPlayer._objectMode = ANIMOBJMODE_1;
R2_GLOBALS._scene180Mode = 15;
_animationPlayer.load(15, NULL);
@@ -2311,19 +2312,6 @@ void Scene205::Action1::textLoop() {
/*--------------------------------------------------------------------------*/
-Scene205::Object::Object(): SceneObject() {
- _x100 = _y100 = 0;
-}
-
-void Scene205::Object::synchronize(Serializer &s) {
- EventHandler::synchronize(s);
-
- s.syncAsSint32LE(_x100);
- s.syncAsSint32LE(_y100);
-}
-
-/*--------------------------------------------------------------------------*/
-
Scene205::Scene205(): SceneExt() {
_yp = 0;
_textIndex = 1;
@@ -2988,7 +2976,7 @@ bool Scene300::Miranda::startAction(CursorType action, Event &event) {
} else if (!R2_GLOBALS.getFlag(55)) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
scene->_sceneMode = 10;
- scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
+ scene->_stripManager.start3(201, scene, R2_GLOBALS._stripManager_lookupList);
} else {
scene->_sceneMode = 16;
@@ -3092,10 +3080,10 @@ bool Scene300::Seeker::startAction(CursorType action, Event &event) {
} else {
R2_GLOBALS._player.disableControl();
scene->_stripId = 171;
- }
- scene->_sceneMode = 310;
- scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
+ scene->_sceneMode = 310;
+ scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
+ }
return true;
case R2_READER:
@@ -3369,7 +3357,7 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
break;
case 325:
if (!R2_GLOBALS.getFlag(44) || R2_GLOBALS.getFlag(25))
- setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL);
+ setAction(&_sequenceManager1, this, 307, &R2_GLOBALS._player, NULL);
else {
R2_GLOBALS.setFlag(60);
R2_GLOBALS._player.setup(302, 3, 1);
@@ -3406,9 +3394,11 @@ void Scene300::postInit(SceneObjectList *OwnerList) {
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
if (R2_GLOBALS.getFlag(51)) {
+ // Things don't seem right
_sceneMode = 13;
_stripManager.start3(300, this, R2_GLOBALS._stripManager_lookupList);
} else {
+ // Back in Ringworld space
_sceneMode = 11;
_stripManager.start3(200, this, R2_GLOBALS._stripManager_lookupList);
}
@@ -3488,27 +3478,27 @@ void Scene300::remove() {
void Scene300::signal() {
switch (_sceneMode) {
case 10:
- switch (_stripManager._field2E8) {
- case 0:
+ switch (_stripManager._exitMode) {
+ case 1:
R2_GLOBALS._sound1.changeSound(10);
R2_GLOBALS.setFlag(38);
break;
- case 1:
+ case 2:
R2_GLOBALS.setFlag(3);
break;
- case 2:
+ case 3:
R2_GLOBALS.setFlag(4);
break;
- case 3:
+ case 4:
R2_GLOBALS.setFlag(13);
if (R2_GLOBALS._stripManager_lookupList[1] == 6)
R2_GLOBALS.setFlag(40);
break;
- case 4:
+ case 5:
if (R2_GLOBALS._stripManager_lookupList[1] == 6)
R2_GLOBALS.setFlag(40);
break;
- case 5:
+ case 6:
R2_GLOBALS._sceneManager.changeScene(1000);
break;
default:
@@ -3897,7 +3887,7 @@ Scene325::Scene325(): SceneExt() {
_field412 = 7;
_iconFontNumber = 50;
_field416 = _field418 = 0;
- _field41A = _field41C = _field41E = _field420 = 0;
+ _field41A = _field41C = _field41E = _scannerLocation = 0;
_soundCount = _soundIndex = 0;
for (int idx = 0; idx < 10; ++idx)
@@ -3905,8 +3895,8 @@ Scene325::Scene325(): SceneExt() {
}
void Scene325::postInit(SceneObjectList *OwnerList) {
- SceneExt::postInit();
loadScene(325);
+ SceneExt::postInit();
R2_GLOBALS.clearFlag(50);
_stripManager.addSpeaker(&_quinnSpeaker);
@@ -3932,7 +3922,7 @@ void Scene325::synchronize(Serializer &s) {
s.syncAsSint16LE(_field41A);
s.syncAsSint16LE(_field41C);
s.syncAsSint16LE(_field41E);
- s.syncAsSint16LE(_field420);
+ s.syncAsSint16LE(_scannerLocation);
s.syncAsSint16LE(_soundCount);
s.syncAsSint16LE(_soundIndex);
@@ -4033,19 +4023,19 @@ void Scene325::signal() {
if (R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51)) {
if (v != 13) {
- setMessage(328, 0);
+ setMessage(328, v);
} else {
- _field420 = 864;
+ _scannerLocation = 864;
_object12.postInit();
- _object2.setup(326, 4, 1);
+ _object12.setup(326, 4, 1);
_object12.setPosition(Common::Point(149, 128));
_object12.fixPriority(20);
- _object13.postInit();
- _object13.setup(326, 4, 2);
- _object13.setPosition(Common::Point(149, (int)(_field420 * ADJUST_FACTOR)));
- _object13.fixPriority(21);
+ _scannerTab.postInit();
+ _scannerTab.setup(326, 4, 2);
+ _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
+ _scannerTab.fixPriority(21);
_object10.postInit();
_object10.setup(326, 1, 1);
@@ -4055,7 +4045,7 @@ void Scene325::signal() {
_object1.postInit();
_object1.setup(326, 1, 1);
_object1.setPosition(Common::Point(210, 32));
- _object10.fixPriority(10);
+ _object1.fixPriority(10);
_object2.postInit();
_object2.setup(326, 1, 1);
@@ -4105,7 +4095,7 @@ void Scene325::signal() {
} else if (R2_GLOBALS.getFlag(51)) {
setMessage(329, (v == 12) ? 10 : v);
} else {
- setMessage(327, (v < 15) ? 1 : v);
+ setMessage(327, (v >= 15) ? 1 : v);
}
break;
}
@@ -4146,12 +4136,12 @@ void Scene325::signal() {
setMessage(128, _field416);
break;
default:
- R2_GLOBALS._player.enableControl();
- R2_GLOBALS._player._canWalk = false;
- _field416 = 105;
- setMessage(128, _field416);
+ _field416 = 0;
break;
}
+
+ R2_GLOBALS._player.enableControl();
+ R2_GLOBALS._player._canWalk = false;
break;
case 10:
R2_GLOBALS._player.enableControl();
@@ -4233,31 +4223,50 @@ void Scene325::consoleAction(int id) {
_icon1.hideIcon();
_icon2.hideIcon();
_icon3.hideIcon();
- // TODO: Finish
- break;
- case 3:
- _icon1.setIcon(5);
- _icon2.setIcon(6);
- _icon3.setIcon(R2_GLOBALS.getFlag(50) ? 16 : 15);
- break;
- case 4:
- case 5:
- _field418 = id;
- _icon1.setIcon(17);
- _icon2.setIcon(18);
- _icon3.setIcon(19);
- break;
- case 7:
- consoleAction(((_field412 == 5) || (_field412 == 6) || (_field412 == 15)) ? 4 : 7);
+
+ if (id == 2 || (id == 19 && _field418 == 5 && R2_GLOBALS.getFlag(50) &&
+ R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51))) {
+ _icon5.setIcon(13);
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(14);
+ _icon4._object2.hide();
+
+ } else {
+ _icon4.hideIcon();
+ _icon5.hideIcon();
+ }
+
+ _icon6.setIcon(12);
+ _sceneMode = 10;
+ _palette.loadPalette(161);
+ BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
- case 8:
- R2_GLOBALS._sceneManager.changeScene(300);
- case 9:
- case 10:
- _iconFontNumber = (id - 1) == 9 ? 50 : 52;
- _text1.remove();
- _icon6.setIcon(7);
+
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ R2_GLOBALS._player.disableControl();
+ consoleAction(2);
+ _field412 = id;
+ _icon1.hideIcon();
+ _icon2.hideIcon();
+ _icon3.hideIcon();
+ _icon4.hideIcon();
+
+ _icon5.setIcon(13);
+ _icon4.setPosition(Common::Point(52, 107));
+ _icon4._sceneRegionId = 9;
+ _icon4.setIcon(14);
+ _icon4._object2.hide();
+
+ _icon6.setIcon(12);
+ _sceneMode = 10;
+ _palette.loadPalette(161);
+ BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
break;
+
case 11:
if (R2_GLOBALS.getFlag(57) && (R2_GLOBALS._player._characterIndex == 1) && !R2_GLOBALS.getFlag(25)) {
R2_GLOBALS._player.disableControl();
@@ -4266,6 +4275,7 @@ void Scene325::consoleAction(int id) {
_stripManager.start(403, this);
} else {
R2_GLOBALS._player.disableControl();
+ id = 8;
_text1.remove();
_icon4.setPosition(Common::Point(80, 62));
@@ -4273,7 +4283,7 @@ void Scene325::consoleAction(int id) {
_icon4.hideIcon();
_object12.remove();
- _object13.remove();
+ _scannerTab.remove();
_object10.remove();
_object1.remove();
_object2.remove();
@@ -4292,6 +4302,31 @@ void Scene325::consoleAction(int id) {
BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
}
break;
+
+ case 3:
+ _icon1.setIcon(5);
+ _icon2.setIcon(6);
+ _icon3.setIcon(R2_GLOBALS.getFlag(50) ? 16 : 15);
+ break;
+ case 4:
+ case 5:
+ _field418 = id;
+ _icon1.setIcon(17);
+ _icon2.setIcon(18);
+ _icon3.setIcon(19);
+ _icon4.setIcon(20);
+ break;
+ case 7:
+ consoleAction(((_field412 == 5) || (_field412 == 6) || (_field412 == 15)) ? 4 : 7);
+ break;
+ case 8:
+ R2_GLOBALS._sceneManager.changeScene(300);
+ case 9:
+ case 10:
+ _iconFontNumber = (id - 1) == 9 ? 50 : 52;
+ _text1.remove();
+ _icon6.setIcon(7);
+ break;
case 12:
_icon4.setIcon(14);
_icon4._object2.hide();
@@ -4301,7 +4336,7 @@ void Scene325::consoleAction(int id) {
case 18:
case 19:
case 20:
- if (_field420) {
+ if (_scannerLocation) {
R2_GLOBALS._player.disableControl();
_field41A = 1296;
_field41E = 1;
@@ -4321,7 +4356,7 @@ void Scene325::consoleAction(int id) {
case 18:
case 19:
case 20:
- if (_field420 < 1620) {
+ if (_scannerLocation < 1620) {
R2_GLOBALS._player.disableControl();
_field41A = 1296;
_field41E = -1;
@@ -4343,31 +4378,6 @@ void Scene325::consoleAction(int id) {
consoleAction(4);
id = 4;
break;
- case 22:
- case 23:
- case 24:
- case 25:
- R2_GLOBALS._player.disableControl();
- consoleAction(2);
- _field412 = id;
-
- _icon1.hideIcon();
- _icon2.hideIcon();
- _icon3.hideIcon();
- _icon4.hideIcon();
-
- _icon5.setIcon(13);
- _icon4.setPosition(Common::Point(52, 107));
- _icon4._sceneRegionId = 9;
- _icon4.setIcon(14);
- _icon4._object2.hide();
-
- _icon6.setIcon(12);
- _sceneMode = 10;
- _palette.loadPalette(161);
-
- BF_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
- break;
case 6:
default:
_icon1.setIcon(1);
@@ -4442,21 +4452,21 @@ void Scene325::dispatch() {
if (yp >= 30) {
yp -= 12;
- --_field420;
+ --_scannerLocation;
flag = true;
}
if (yp <= 10) {
yp += 12;
- ++_field420;
+ ++_scannerLocation;
flag = true;
}
- _object3.setPosition(Common::Point(149, (int)(_field420 * ADJUST_FACTOR) + 22));
+ _scannerTab.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
for (int idx = 0; idx < 4; ++idx)
_objList[idx].remove();
if (flag) {
- int v = _field420 - 758;
+ int v = _scannerLocation - 758;
_object10.setFrame((v++ <= 0) ? 1 : v);
_object1.setFrame((v++ <= 0) ? 1 : v);
_object2.setFrame((v++ <= 0) ? 1 : v);
@@ -4496,7 +4506,7 @@ void Scene325::dispatch() {
R2_GLOBALS._sound3.stop();
_field41C = 0;
- if (_field420 == 756) {
+ if (_scannerLocation == 756) {
R2_GLOBALS._player.disableControl();
R2_GLOBALS._events.setCursor(CURSOR_USE);
_sceneMode = 12;
@@ -5411,9 +5421,9 @@ GfxSurface Scene600::Actor4::getFrame() {
// Translate the frame using the scene's pixel map
byte *pixelMap = static_cast<Scene600 *>(R2_GLOBALS._sceneManager._scene)->_pixelMap;
Graphics::Surface surface = frame.lockSurface();
- byte *srcP = (byte *)surface.pixels;
+ byte *srcP = (byte *)surface.getPixels();
- while (srcP < ((byte *)surface.pixels + (surface.w * surface.h))) {
+ while (srcP < ((byte *)surface.getBasePtr(0, surface.h))) {
*srcP = pixelMap[*srcP];
srcP++;
}
@@ -6874,8 +6884,9 @@ void Scene825::doButtonPress(int buttonId) {
_sceneText.setup(NO_TREATMENT_REQUIRED);
} else {
_button6._buttonId = 5;
-
+ _sceneMode = 827;
_object5.postInit();
+
setAction(&_sequenceManager1, this, 827, &_object5, NULL);
}
} else {
diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h
index 51cdd88cc1..bc30743aca 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes0.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes0.h
@@ -126,7 +126,7 @@ class Scene125: public SceneExt {
};
/* Items */
- class Item4: public NamedHotspot {
+ class DiskSlot: public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
@@ -135,8 +135,8 @@ public:
ScenePalette _palette;
ASoundExt _sound1;
NamedHotspot _background, _item2, _item3;
- Item4 _item4;
- SceneActor _object1, _object2, _object3, _object4, _object5, _object6, _object7;
+ DiskSlot _diskSlot;
+ SceneActor _object1, _object2, _object3, _object4, _object5, _object6, _infoDisk;
Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
SequenceManager _sequenceManager;
SceneText _sceneText;
@@ -277,9 +277,7 @@ class Scene205: public SceneExt {
public:
int _x100, _y100;
public:
- Object();
-
- virtual void synchronize(Serializer &s);
+ // TODO: Check if this derives from DataManager? and flesh out
};
private:
void setup();
@@ -453,7 +451,7 @@ private:
Common::String parseMessage(const Common::String &msg);
public:
int _field412, _iconFontNumber, _field416, _field418;
- int _field41A, _field41C, _field41E, _field420;
+ int _field41A, _field41C, _field41E, _scannerLocation;
int _soundCount, _soundIndex;
int _soundQueue[10];
SpeakerQuinn _quinnSpeaker;
@@ -461,7 +459,7 @@ public:
SceneHotspot _background, _item2;
SceneObject _object1, _object2, _object3, _object4, _object5;
SceneObject _object6, _object7, _object8, _object9, _object10;
- SceneObject _object11, _object12, _object13;
+ SceneObject _object11, _object12, _scannerTab;
SceneObject _objList[4];
Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6;
ASoundExt _sound1;
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
index ba62a119a8..6ea53d0852 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
@@ -30,9 +30,452 @@ namespace TsAGE {
namespace Ringworld2 {
/*--------------------------------------------------------------------------
+ * Scene 1000 - Cutscene scene
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene1000::Scene1000(): SceneExt() {
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ R2_GLOBALS._uiElements._active = false;
+ _gameTextSpeaker._displayMode = 9;
+ _fieldD2E = 0;
+}
+
+void Scene1000::postInit(SceneObjectList *OwnerList) {
+ loadBlankScene();
+ SceneExt::postInit();
+
+ _stripManager.addSpeaker(&_gameTextSpeaker);
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.hide();
+ R2_GLOBALS._player.disableControl();
+
+ switch (R2_GLOBALS._sceneManager._previousScene) {
+ case 300:
+ _sceneMode = R2_GLOBALS.getFlag(57) ? 40 : 0;
+ break;
+ case 1010:
+ _sceneMode = 30;
+ break;
+ case 1100:
+ _sceneMode = 10;
+ break;
+ case 1530:
+ _sceneMode = 20;
+ break;
+ case 2500:
+ _sceneMode = 100;
+ break;
+ case 2800:
+ _sceneMode = 2800;
+ break;
+ case 3100:
+ if (R2_GLOBALS._player._oldCharacterScene[R2_QUINN] == 1000)
+ _sceneMode = 90;
+ else
+ _sceneMode = 80;
+ break;
+ case 3500:
+ _sceneMode = 50;
+ break;
+ case 3700:
+ _sceneMode = 60;
+ break;
+ default:
+ _sceneMode = 999;
+ break;
+ }
+
+ R2_GLOBALS._uiElements._active = false;
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+}
+
+void Scene1000::remove() {
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._scenePalette.setEntry(255, 0xff, 0xff, 0xff);
+ SceneExt::remove();
+}
+
+void Scene1000::signal() {
+ ScenePalette scenePalette1, scenePalette2;
+ uint32 black = 0;
+
+ switch (_sceneMode++) {
+ case 0:
+ // TODO: Sort out values
+ R2_GLOBALS._gfxColors.foreground = 191;
+ R2_GLOBALS._gfxColors.background = 144;
+ R2_GLOBALS._fontColors.background = 224;
+ R2_GLOBALS._fontColors.foreground = 119;
+
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer.load(5, this);
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+
+ _animationPlayer.dispatch();
+ _fieldD2E = 1;
+
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound1.play(67);
+ break;
+
+ case 1:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+
+ // TODO: Sort out values
+ R2_GLOBALS._gfxColors.foreground = 191;
+ R2_GLOBALS._gfxColors.background = 144;
+ R2_GLOBALS._fontColors.background = 224;
+ R2_GLOBALS._fontColors.foreground = 119;
+
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ loadScene(9999);
+
+ R2_GLOBALS._player.setup(1140, 1, 1);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 100));
+ R2_GLOBALS._player.show();
+
+ _field412 = 0;
+ _stripManager.start(29, this);
+ break;
+
+ case 2:
+ if (R2_GLOBALS._speechSubtitles & SPEECH_TEXT) {
+ setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+ } else {
+ if (++_field412 < 3)
+ _sceneMode = 2;
+
+ setAction(&_sequenceManager1, this, 2, &R2_GLOBALS._player, NULL);
+ }
+ break;
+
+ case 3:
+ // TODO: Sort out values
+ R2_GLOBALS._gfxColors.foreground = 191;
+ R2_GLOBALS._gfxColors.background = 144;
+ R2_GLOBALS._fontColors.background = 224;
+ R2_GLOBALS._fontColors.foreground = 119;
+
+ for (int percent = 100; percent >= 0; percent -= 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(7, this);
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound2.play(81);
+ R2_GLOBALS._sound1.play(80);
+ break;
+
+ case 4:
+ // TODO: Sort out values
+ R2_GLOBALS._gfxColors.foreground = 191;
+ R2_GLOBALS._gfxColors.background = 144;
+ R2_GLOBALS._fontColors.background = 224;
+ R2_GLOBALS._fontColors.foreground = 119;
+
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sceneManager.changeScene(1100);
+ break;
+
+ case 10:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(6, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound1.play(55);
+ break;
+
+ case 11:
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+
+ case 20:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(8, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 21:
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(1530);
+ break;
+
+ case 30:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(17, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound2.play(91);
+ break;
+
+ case 31:
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS.setFlag(51);
+ R2_GLOBALS._sceneManager.changeScene(300);
+ break;
+
+ case 40:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(18, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound2.play(90);
+ break;
+
+ case 41:
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(1010);
+ break;
+
+ case 50:
+ R2_GLOBALS._sound2.play(306);
+ for (int percent = 100; percent >= 0; percent -= 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(13, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 51:
+ R2_GLOBALS._sound2.stop();
+ R2_GLOBALS._sound2.play(307);
+ R2_GLOBALS._sound1.play(308);
+
+ for (int percent = 100; percent >= 0; percent -= 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(14, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 52:
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(3350);
+ break;
+
+ case 60:
+ R2_GLOBALS._sound1.play(333);
+
+ for (int percent = 100; percent >= 0; percent -= 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(12, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 61:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(160);
+ break;
+
+ case 70:
+ R2_GLOBALS._sound2.play(113);
+ for (int percent = 100; percent >= 0; percent -= 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(9, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 71:
+ case 81:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(3100);
+ break;
+
+ case 80:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(10, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound1.play(242);
+ R2_GLOBALS._sound2.play(286);
+ break;
+
+ case 90:
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(11, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+
+ R2_GLOBALS._sound1.play(277);
+ break;
+
+ case 91:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._player._characterIndex = R2_SEEKER;
+ R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 3100;
+ R2_GLOBALS._sceneManager.changeScene(2500);
+ break;
+
+ case 100:
+ R2_GLOBALS._sound1.play(304);
+ R2_GLOBALS._sound2.play(82);
+
+ _animationPlayer._paletteMode = ANIMPALMODE_NONE;
+ _animationPlayer._objectMode = ANIMOBJMODE_2;
+ _animationPlayer.load(19, this);
+
+ R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);
+ R2_GLOBALS._sceneManager._hasPalette = false;
+ _animationPlayer.dispatch();
+
+ _fieldD2E = 1;
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, 1, 0);
+ for (int percent = 0; percent < 100; percent += 5)
+ R2_GLOBALS._scenePalette.fade((const byte *)&black, true, percent);
+ break;
+
+ case 101:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ R2_GLOBALS._scenePalette.loadPalette(0);
+ R2_GLOBALS._sceneManager.changeScene(3500);
+ break;
+ }
+}
+
+void Scene1000::dispatch() {
+ if (_fieldD2E) {
+ if (_animationPlayer.isCompleted()) {
+ _fieldD2E = 0;
+ _animationPlayer.close();
+ _animationPlayer.remove();
+
+ if (_sceneMode == 52)
+ _endHandler = this;
+ } else {
+ _animationPlayer.dispatch();
+ }
+ }
+
+ Scene::dispatch();
+}
+
+
+/*--------------------------------------------------------------------------
* Scene 1010 - Cutscene: A pixel lost in space!
*
*--------------------------------------------------------------------------*/
+
void Scene1010::postInit(SceneObjectList *OwnerList) {
SceneExt::postInit();
loadScene(1010);
@@ -619,7 +1062,7 @@ void Scene1100::signal() {
setAction(&_sequenceManager1, this, 1105, &R2_GLOBALS._player, &_actor10, &_actor11, &_actor18, NULL);
break;
case 9:
- _object1.proc27();
+ _object1.copySceneToBackground();
_actor15.postInit();
_actor15.setup(1103, 2, 1);
@@ -633,7 +1076,7 @@ void Scene1100::signal() {
_actor13.setAction(&_sequenceManager2, this, 1108, &_actor13, NULL);
break;
case 11: {
- setAction(&_sequenceManager1, this, 1116, &_actor11, &_actor10, &_actor12, NULL);
+ setAction(&_sequenceManager1, this, 1106, &_actor11, &_actor10, &_actor12, NULL);
R2_GLOBALS._player._effect = 5;
R2_GLOBALS._player.setup(1102, 3, 2);
R2_GLOBALS._player.setPosition(Common::Point(-50, 131));
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h
index 0da6b3f93d..23ebb2c276 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes1.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.h
@@ -39,6 +39,24 @@ namespace Ringworld2 {
using namespace TsAGE;
+class Scene1000 : public SceneExt {
+public:
+ SequenceManager _sequenceManager1;
+ SequenceManager _sequenceManager2;
+ SpeakerGameText _gameTextSpeaker;
+ AnimationPlayer _animationPlayer;
+
+ int _field412;
+ int _fieldD2E;
+public:
+ Scene1000();
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void signal();
+ virtual void dispatch();
+};
+
class Scene1010 : public SceneExt {
public:
SequenceManager _sequenceManager;
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp
index b8d593b90a..cd2ff669ff 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.cpp
+++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp
@@ -76,7 +76,7 @@ void VisualSpeaker::signal() {
if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) {
// TODO: Check global that is passed
- setFrame2(/* word_55F90 */ 0);
+ setFrame2(/* word_55F90 */ 1);
}
} else if (_action && _object2) {
_action->setDelay(1);
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index af2f3566ad..7143305586 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -289,7 +289,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h
// Create a thumbnail and save it
Graphics::Surface *thumb = new Graphics::Surface();
Graphics::Surface s = g_globals->_screenSurface.lockSurface();
- ::createThumbnail(thumb, (const byte *)s.pixels, SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette);
+ ::createThumbnail(thumb, (const byte *)s.getPixels(), SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette);
Graphics::saveThumbnail(*out, *thumb);
g_globals->_screenSurface.unlockSurface();
thumb->free();