From fa27d6fe69e9cc2901e1de9ac9fffc59107363dc Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 12 Oct 2011 07:58:08 +1100 Subject: TSAGE: Bugfix for overriden named hotspots no longer working in Ringworld --- engines/tsage/core.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index c237548547..bc20f221c2 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1742,27 +1742,21 @@ bool NamedHotspot::startAction(CursorType action, Event &event) { // Nothing return false; case CURSOR_LOOK: - if (_lookLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) + if ((g_vm->getGameID() == GType_Ringworld) || (_lookLineNum == -1)) + doAction(action); + else SceneItem::display2(_resNum, _lookLineNum); - else - SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); return true; case CURSOR_USE: - if (_useLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) + if ((g_vm->getGameID() == GType_Ringworld) || (_useLineNum == -1)) + doAction(action); + else SceneItem::display2(_resNum, _useLineNum); - else - SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); return true; case CURSOR_TALK: - if (_talkLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) - SceneItem::display2(_resNum, _talkLineNum); - else + if ((g_vm->getGameID() == GType_Ringworld) || (_talkLineNum == -1)) + doAction(action); + else SceneItem::display2(_resNum, _talkLineNum); return true; default: -- cgit v1.2.3 From 271a1018993c30ad7ba74fa5a1d7d6dd78ed7869 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 12 Oct 2011 08:18:11 +1100 Subject: TSAGE: Further cleanup of the prior NamedHotspot bugfix --- engines/tsage/core.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index bc20f221c2..3441c81222 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1742,22 +1742,31 @@ bool NamedHotspot::startAction(CursorType action, Event &event) { // Nothing return false; case CURSOR_LOOK: - if ((g_vm->getGameID() == GType_Ringworld) || (_lookLineNum == -1)) - doAction(action); - else + if (g_vm->getGameID() == GType_Ringworld) { + if (_lookLineNum == -1) + doAction(action); + else + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else SceneItem::display2(_resNum, _lookLineNum); return true; case CURSOR_USE: - if ((g_vm->getGameID() == GType_Ringworld) || (_useLineNum == -1)) - doAction(action); - else + if (g_vm->getGameID() == GType_Ringworld) { + if (_useLineNum == -1) + doAction(action); + else + SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + } else SceneItem::display2(_resNum, _useLineNum); return true; case CURSOR_TALK: - if ((g_vm->getGameID() == GType_Ringworld) || (_talkLineNum == -1)) - doAction(action); - else - SceneItem::display2(_resNum, _talkLineNum); + if (g_vm->getGameID() == GType_Ringworld) { + if (_talkLineNum == -1) + doAction(action); + else + SceneItem::display2(_resNum, _talkLineNum); + } else + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); return true; default: return SceneHotspot::startAction(action, event); -- cgit v1.2.3 From 8a8fd94f100ec4e8891bf8c81a2c4de70d1bfd87 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 12 Oct 2011 21:12:34 +1100 Subject: TSAGE: Separated the NamedHotspot class into separate versions for Ringworld and Blue Force This fixes bug #3422141, which was also caused by special checks introduced to try and handle Blue Force hotspots differently --- engines/tsage/core.cpp | 106 ------------------------------------------------- 1 file changed, 106 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 3441c81222..f4118cb45e 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1731,112 +1731,6 @@ void SceneHotspot::doAction(int action) { /*--------------------------------------------------------------------------*/ -NamedHotspot::NamedHotspot() : SceneHotspot() { - _resNum = 0; - _lookLineNum = _useLineNum = _talkLineNum = -1; -} - -bool NamedHotspot::startAction(CursorType action, Event &event) { - switch (action) { - case CURSOR_WALK: - // Nothing - return false; - case CURSOR_LOOK: - if (g_vm->getGameID() == GType_Ringworld) { - if (_lookLineNum == -1) - doAction(action); - else - SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else - SceneItem::display2(_resNum, _lookLineNum); - return true; - case CURSOR_USE: - if (g_vm->getGameID() == GType_Ringworld) { - if (_useLineNum == -1) - doAction(action); - else - SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - } else - SceneItem::display2(_resNum, _useLineNum); - return true; - case CURSOR_TALK: - if (g_vm->getGameID() == GType_Ringworld) { - if (_talkLineNum == -1) - doAction(action); - else - SceneItem::display2(_resNum, _talkLineNum); - } else - SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - default: - return SceneHotspot::startAction(action, event); - } -} - -void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { - setBounds(ys, xe, ye, xs); - _resNum = resnum; - _lookLineNum = lookLineNum; - _useLineNum = useLineNum; - _talkLineNum = -1; - g_globals->_sceneItems.addItems(this, NULL); -} - -void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { - setBounds(bounds); - _resNum = resNum; - _lookLineNum = lookLineNum; - _talkLineNum = talkLineNum; - _useLineNum = useLineNum; - - switch (mode) { - case 2: - g_globals->_sceneItems.push_front(this); - break; - case 4: - g_globals->_sceneItems.addBefore(item, this); - break; - case 5: - g_globals->_sceneItems.addAfter(item, this); - break; - default: - g_globals->_sceneItems.push_back(this); - break; - } -} - -void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { - _sceneRegionId = sceneRegionId; - _resNum = resNum; - _lookLineNum = lookLineNum; - _talkLineNum = talkLineNum; - _useLineNum = useLineNum; - - // Handle adding hotspot to scene items list as necessary - switch (mode) { - case 2: - GLOBALS._sceneItems.push_front(this); - break; - case 3: - break; - default: - GLOBALS._sceneItems.push_back(this); - break; - } -} - -void NamedHotspot::synchronize(Serializer &s) { - SceneHotspot::synchronize(s); - s.syncAsSint16LE(_resNum); - s.syncAsSint16LE(_lookLineNum); - s.syncAsSint16LE(_useLineNum); - - if (g_vm->getGameID() == GType_BlueForce) - s.syncAsSint16LE(_talkLineNum); -} - -/*--------------------------------------------------------------------------*/ - void SceneObjectWrapper::setSceneObject(SceneObject *so) { _sceneObject = so; so->_strip = 1; -- cgit v1.2.3 From 0af554b891eb35a222688d5e3df3639afaa3f097 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 16 Oct 2011 08:29:46 +1100 Subject: TSAGE: Workaround for script bug in Blue Force using invalid visage rlb indexes. This affects the inspection cut-scene on Day 2 --- engines/tsage/core.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index f4118cb45e..6029a91daa 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2814,6 +2814,11 @@ void Visage::setVisage(int resNum, int rlbNum) { if (rlbNum == 0) rlbNum = 1; + // Check how many slots there are + uint16 count = READ_LE_UINT16(indexData); + if (rlbNum > count) + rlbNum = count; + // Get the flags/rlbNum to use uint32 v = READ_LE_UINT32(indexData + (rlbNum - 1) * 4 + 2); int flags = v >> 30; -- cgit v1.2.3 From 0d135faf6cfd42cabe794bf00098d61e8530607c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Oct 2011 08:08:52 +1100 Subject: TSAGE: Bugfix for Lyle walking to Warehouse in BF Scene 910 --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 6029a91daa..61a413f307 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2032,7 +2032,7 @@ int SceneObject::checkRegion(const Common::Point &pt) { if ((objYDiff >= yPos) && (objYDiff <= newY) && ((*i)->_xs < tempRect.right) && ((*i)->_xe > tempRect.left)) { // Found index - regionIndex = -1; //****DEBUG*** = *i; + regionIndex = (*i)->_regionIndex; break; } } -- cgit v1.2.3 From d3193687a73b92213095db6b8bbf6b6b4614af12 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Oct 2011 20:44:26 +1100 Subject: TSAGE: Beginnings of support for Return to Ringworld --- engines/tsage/core.cpp | 70 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 17 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 61a413f307..b40c5af91b 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -66,6 +66,16 @@ InvObject::InvObject(int visage, int strip, int frame) { _iconResNum = 10; } +InvObject::InvObject(int strip, int frame) { + assert(g_vm->getGameID() == GType_Ringworld2); + _strip = strip; + _frame = frame; + + _visage = 0; + _sceneNumber = 0; + _iconResNum = 10; +} + void InvObject::setCursor() { if (g_vm->getGameID() == GType_BlueForce) { // Blue Force cursor handling @@ -1523,8 +1533,8 @@ void SceneItem::display(int resNum, int lineNum, ...) { Common::String msg = (!resNum || (resNum == -1)) ? Common::String() : g_resourceManager->getMessage(resNum, lineNum); - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.hide(); + if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) { g_globals->_sceneText.remove(); @@ -1655,9 +1665,9 @@ void SceneItem::display(int resNum, int lineNum, ...) { g_globals->_sceneText.remove(); } - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) { + if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) { // Show user interface - BF_GLOBALS._uiElements.show(); + T2_GLOBALS._uiElements.show(); // Re-show the cursor BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); @@ -1689,13 +1699,15 @@ void SceneItem::display(const Common::String &msg) { /*--------------------------------------------------------------------------*/ bool SceneHotspot::startAction(CursorType action, Event &event) { - if (g_vm->getGameID() != GType_BlueForce) - return SceneItem::startAction(action, event); - else { + switch (action) { + case GType_BlueForce: { BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene; assert(scene); return scene->display(action); } + default: + return SceneItem::startAction(action, event); + } } void SceneHotspot::doAction(int action) { @@ -2423,6 +2435,13 @@ void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, i fixPriority(priority); } +void SceneObject::setup(int visage, int stripFrameNum, int frameNum) { + postInit(); + setVisage(visage); + setStrip(stripFrameNum); + setFrame(frameNum); +} + /*--------------------------------------------------------------------------*/ void BackgroundSceneObject::postInit(SceneObjectList *OwnerList) { @@ -2765,7 +2784,7 @@ void SceneText::updateScreen() { // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface // has been re-activated after showing some scene text if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < BF_INTERFACE_Y) || - !BF_GLOBALS._uiElements._visible) + !T2_GLOBALS._uiElements._visible) SceneObject::updateScreen(); } @@ -2898,16 +2917,38 @@ void Player::disableControl() { g_globals->_events.setCursor(CURSOR_NONE); _enabled = false; - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.hide(); + if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); } void Player::enableControl() { + CursorType cursor; + _canWalk = true; _uiEnabled = true; _enabled = true; - if (g_vm->getGameID() == GType_Ringworld) { + switch (g_vm->getGameID()) { + case GType_BlueForce: + cursor = g_globals->_events.getCursor(); + g_globals->_events.setCursor(cursor); + + if (T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); + break; + + case GType_Ringworld2: + cursor = g_globals->_events.getCursor(); + g_globals->_events.setCursor(cursor); + + /* + if (R2_GLOBALS._uiElements._active) + R2_GLOBALS._uiElements.show(); + */ + break; + + default: + // Ringworld g_globals->_events.setCursor(CURSOR_WALK); switch (g_globals->_events.getCursor()) { @@ -2921,12 +2962,7 @@ void Player::enableControl() { g_globals->_events.setCursor(CURSOR_WALK); break; } - } else { - CursorType cursor = g_globals->_events.getCursor(); - g_globals->_events.setCursor(cursor); - - if (BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.show(); + break; } } -- cgit v1.2.3 From 1c4bc2f567a7d31e0f716d5dfb8f57efb7875be1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Oct 2011 22:41:05 +1100 Subject: TSAGE: Hooking up Return to Ringworld to display the user interface --- engines/tsage/core.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index b40c5af91b..dbc087c53f 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1434,7 +1434,7 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { } Rect tempRect = bounds; - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() != GType_Ringworld) tempRect.setHeight(BF_GLOBALS._interfaceY); g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, @@ -1533,7 +1533,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { Common::String msg = (!resNum || (resNum == -1)) ? Common::String() : g_resourceManager->getMessage(resNum, lineNum); - if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) T2_GLOBALS._uiElements.hide(); if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) { @@ -1665,7 +1665,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { g_globals->_sceneText.remove(); } - if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) { + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) { // Show user interface T2_GLOBALS._uiElements.show(); @@ -1678,7 +1678,7 @@ void SceneItem::display2(int resNum, int lineNum) { if (g_vm->getGameID() == GType_BlueForce) display(resNum, lineNum, SET_WIDTH, 312, SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); else @@ -1691,7 +1691,7 @@ void SceneItem::display(const Common::String &msg) { display(-1, -1, msg.c_str(), SET_WIDTH, 312, SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); } @@ -2783,7 +2783,7 @@ void SceneText::synchronize(Serializer &s) { void SceneText::updateScreen() { // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface // has been re-activated after showing some scene text - if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < BF_INTERFACE_Y) || + if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < UI_INTERFACE_Y) || !T2_GLOBALS._uiElements._visible) SceneObject::updateScreen(); } @@ -2825,7 +2825,7 @@ void Visage::setVisage(int resNum, int rlbNum) { // In Ringworld, we immediately get the data _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum); } else { - // Blue Force has an extra indirection via the visage index file + // Games after Ringworld have an extra indirection via the visage index file byte *indexData = g_resourceManager->getResource(RES_VISAGE, resNum, 9999); if (rlbNum == 9999) { _data = indexData; @@ -2930,6 +2930,7 @@ void Player::enableControl() { switch (g_vm->getGameID()) { case GType_BlueForce: + case GType_Ringworld2: cursor = g_globals->_events.getCursor(); g_globals->_events.setCursor(cursor); @@ -2937,16 +2938,6 @@ void Player::enableControl() { T2_GLOBALS._uiElements.show(); break; - case GType_Ringworld2: - cursor = g_globals->_events.getCursor(); - g_globals->_events.setCursor(cursor); - - /* - if (R2_GLOBALS._uiElements._active) - R2_GLOBALS._uiElements.show(); - */ - break; - default: // Ringworld g_globals->_events.setCursor(CURSOR_WALK); -- cgit v1.2.3 From 4cfafcdf8ba658dc208a62e26288c80309b39fd7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 22 Oct 2011 23:46:23 +1100 Subject: TSAGE: Added quick keys for selecting the different actions --- engines/tsage/core.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index dbc087c53f..495d122995 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -3777,6 +3777,30 @@ void SceneHandler::process(Event &event) { g_vm->_debugger->onFrame(); } + if ((event.eventType == EVENT_KEYPRESS) && g_globals->_player._enabled && g_globals->_player._canWalk) { + // Keyboard shortcuts for different actions + switch (event.kbd.keycode) { + case Common::KEYCODE_w: + g_globals->_events.setCursor(CURSOR_WALK); + event.handled = true; + break; + case Common::KEYCODE_l: + g_globals->_events.setCursor(CURSOR_LOOK); + event.handled = true; + break; + case Common::KEYCODE_u: + g_globals->_events.setCursor(CURSOR_USE); + event.handled = true; + break; + case Common::KEYCODE_t: + g_globals->_events.setCursor(CURSOR_TALK); + event.handled = true; + break; + default: + break; + } + } + // Mouse press handling bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled : g_globals->_player._uiEnabled; -- cgit v1.2.3 From 32ed9a99e92b88be665a6012efa50c0e5666095d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 23 Oct 2011 22:10:06 +1100 Subject: TSAGE: Changed SceneItem::display2 to handle Ringworld 2 --- engines/tsage/core.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 495d122995..a56b30ad4d 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1675,14 +1675,21 @@ void SceneItem::display(int resNum, int lineNum, ...) { } void SceneItem::display2(int resNum, int lineNum) { - if (g_vm->getGameID() == GType_BlueForce) + switch (g_vm->getGameID()) { + case GType_BlueForce: display(resNum, lineNum, SET_WIDTH, 312, SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); - else + break; + case GType_Ringworld2: + display(resNum, lineNum, SET_WIDTH, 280, SET_X, 20, SET_Y, 20, SET_EXT_BGCOLOR, 60, LIST_END); + break; + default: display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + } } void SceneItem::display(const Common::String &msg) { -- cgit v1.2.3 From 8b66b16c0e352c945474afe46980ed54e1aaf389 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 24 Oct 2011 21:45:08 +1100 Subject: TSAGE: Further work on standardising user interface for use in Blue Force and Return to Ringworld --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index a56b30ad4d..59027e68c9 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -71,7 +71,7 @@ InvObject::InvObject(int strip, int frame) { _strip = strip; _frame = frame; - _visage = 0; + _visage = 7; _sceneNumber = 0; _iconResNum = 10; } -- cgit v1.2.3 From 06e02a196b47377f4f9d2d2369cc89e4e4d88c1c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 25 Oct 2011 19:46:46 +1100 Subject: TSAGE: Bugfix for black areas appearing in the user interface area --- engines/tsage/core.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 59027e68c9..90db858378 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2412,6 +2412,11 @@ void SceneObject::updateScreen() { srcRect.right = ((srcRect.right + 3) / 4) * 4; srcRect.clip(g_globals->_sceneManager._scene->_sceneBounds); + if (g_vm->getGameID() != GType_Ringworld) { + if (T2_GLOBALS._uiElements._visible) + srcRect.bottom = MIN(srcRect.bottom, T2_GLOBALS._interfaceY); + } + if (srcRect.isValidRect()) { Rect destRect = srcRect; destRect.translate(-sceneBounds.left, -sceneBounds.top); -- cgit v1.2.3 From e3fefd16a0ee7ade5e075ff3cf2aa69e29fbd90b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 25 Oct 2011 20:01:39 +1100 Subject: TSAGE: Bugfix for not being able to walk around in some BF scenes --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 90db858378..9cfa817946 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1706,7 +1706,7 @@ void SceneItem::display(const Common::String &msg) { /*--------------------------------------------------------------------------*/ bool SceneHotspot::startAction(CursorType action, Event &event) { - switch (action) { + switch (g_vm->getGameID()) { case GType_BlueForce: { BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene; assert(scene); -- cgit v1.2.3 From 9ccb2eea32e4b85394295f4eed9884f05bf75c08 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 25 Oct 2011 20:45:38 +1100 Subject: TSAGE: Added R2 _shade and _effect fields to scene objects class. --- engines/tsage/core.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 9cfa817946..ea6cc9f795 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1835,6 +1835,8 @@ SceneObject::SceneObject() : SceneHotspot() { _visage = 0; _strip = 0; _frame = 0; + _effect = 0; + _shade = 0; } SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() { @@ -2137,6 +2139,14 @@ SceneObject *SceneObject::clone() const { return obj; } +void SceneObject::copy(SceneObject *src) { + *this = *src; + + _objectWrapper = NULL; + _mover = NULL; + _endAction = NULL; +} + void SceneObject::checkAngle(const SceneObject *obj) { checkAngle(obj->_position); } @@ -2203,6 +2213,11 @@ void SceneObject::synchronize(Serializer &s) { s.syncAsSint32LE(_moveRate); SYNC_POINTER(_endAction); s.syncAsUint32LE(_regionBitList); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_effect); + s.syncAsSint16LE(_shade); + } } void SceneObject::postInit(SceneObjectList *OwnerList) { -- cgit v1.2.3 From e93c847df76b87cbed8201f68feeba9fd258999d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 25 Oct 2011 21:00:41 +1100 Subject: TSAGE: Expanded a lot of game Id checks for Blue Force to include Ringworld 2 as well --- engines/tsage/core.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index ea6cc9f795..455550f6a4 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2810,7 +2810,7 @@ void SceneText::synchronize(Serializer &s) { void SceneText::updateScreen() { // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface // has been re-activated after showing some scene text - if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < UI_INTERFACE_Y) || + if ((g_vm->getGameID() == GType_Ringworld) || (_bounds.top < UI_INTERFACE_Y) || !T2_GLOBALS._uiElements._visible) SceneObject::updateScreen(); } @@ -2944,7 +2944,7 @@ void Player::disableControl() { g_globals->_events.setCursor(CURSOR_NONE); _enabled = false; - if ((g_vm->getGameID() == GType_BlueForce) && T2_GLOBALS._uiElements._active) + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) T2_GLOBALS._uiElements.hide(); } @@ -2992,7 +2992,7 @@ void Player::process(Event &event) { (g_globals->_events.getCursor() == CURSOR_WALK) && g_globals->_player._canWalk && (_position != event.mousePos) && g_globals->_sceneObjects->contains(this)) { - if ((g_vm->getGameID() == GType_BlueForce) && !BF_GLOBALS._player._enabled) + if ((g_vm->getGameID() != GType_Ringworld) && !BF_GLOBALS._player._enabled) return; PlayerMover *newMover = new PlayerMover(); @@ -3011,7 +3011,7 @@ void Player::synchronize(Serializer &s) { s.syncAsByte(_uiEnabled); s.syncAsSint16LE(_field8C); - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() != GType_Ringworld) s.syncAsByte(_enabled); } @@ -3829,7 +3829,7 @@ void SceneHandler::process(Event &event) { } // Mouse press handling - bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled : + bool enabled = (g_vm->getGameID() != GType_Ringworld) ? g_globals->_player._enabled : g_globals->_player._uiEnabled; if (enabled && (event.eventType == EVENT_BUTTON_DOWN) && !g_globals->_sceneItems.empty()) { // Check if the mouse is on the player @@ -3861,7 +3861,7 @@ void SceneHandler::process(Event &event) { g_globals->_events.setCursor(CURSOR_USE); } - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() != GType_Ringworld) event.handled = true; } else if (g_vm->getGameID() != GType_Ringworld) { event.handled = true; @@ -3917,7 +3917,7 @@ void SceneHandler::dispatch() { do { process(event); } while (g_globals->_events.getEvent(event)); - } else if (g_vm->getGameID() == GType_BlueForce) { + } else if (g_vm->getGameID() != GType_Ringworld) { // For Blue Force, 'none' events need to be generated in the absence of any event.eventType = EVENT_NONE; event.mousePos = g_globals->_events._mousePos; -- cgit v1.2.3 From 44e4e16819186d45e3a1adeed311218b92bbf283 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 27 Oct 2011 19:32:27 +1100 Subject: TSAGE: Implemented walk regions enabling/disabling for Blue Force --- engines/tsage/core.cpp | 59 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 11 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 455550f6a4..5a51a9c9ef 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -896,24 +896,28 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg // Check every connected region until we find a route to the destination (or we have no more to check). int bestDistance = 31990; while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) { - int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute); + // Only check the region if it isn't in the list of explicitly disabled regions + if (!contains(g_globals->_walkRegions._disabledRegions, (int)currDest)) { + int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute); - if ((newDistance <= bestDistance) || foundRoute) { - // We found a shorter possible route, or one leading to the destination. + if ((newDistance <= bestDistance) || foundRoute) { + // We found a shorter possible route, or one leading to the destination. - // Overwrite the route with this new one. - routeList[0] = ourListSize - 1; + // Overwrite the route with this new one. + routeList[0] = ourListSize - 1; - for (int i = ourListSize; i <= tempList[0]; ++i) { - routeList[i] = tempList[i]; - ++routeList[0]; + for (int i = ourListSize; i <= tempList[0]; ++i) { + routeList[i] = tempList[i]; + ++routeList[0]; + } + + bestDistance = newDistance; } - bestDistance = newDistance; + // Truncate our local list to the size it was before the call. + tempList[0] = ourListSize; } - // Truncate our local list to the size it was before the call. - tempList[0] = ourListSize; ++foundIndex; } @@ -3626,6 +3630,39 @@ int WalkRegions::indexOf(const Common::Point &pt, const Common::List *index return -1; } +void WalkRegions::synchronize(Serializer &s) { + // Synchronise the list of disabled regions as a list of values terminated with a '-1' + int regionId; + if (s.isLoading()) { + _disabledRegions.clear(); + + s.syncAsSint16LE(regionId); + while (regionId != -1) { + _disabledRegions.push_back(regionId); + s.syncAsSint16LE(regionId); + } + } else { + Common::List::iterator i; + for (i = _disabledRegions.begin(); i != _disabledRegions.end(); ++i) { + regionId = *i; + s.syncAsSint16LE(regionId); + } + + regionId = -1; + s.syncAsSint16LE(regionId); + } +} + +void WalkRegions::disableRegion(int regionId) { + if (!contains(_disabledRegions, regionId)) + _disabledRegions.push_back(regionId); +} + +void WalkRegions::enableRegion(int regionId) { + _disabledRegions.remove(regionId); +} + + /*--------------------------------------------------------------------------*/ void ScenePriorities::load(int resNum) { -- cgit v1.2.3 From d7af9b517e9c131c84f6c50a7dc4c4a639b2206e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 29 Oct 2011 19:51:01 +1100 Subject: TSAGE: Bugfix to clear the list of disabled regions when the scene changes --- engines/tsage/core.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 5a51a9c9ef..dd5c604b29 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -3458,6 +3458,7 @@ void WalkRegions::clear() { _field18.clear(); _idxList.clear(); _idxList2.clear(); + _disabledRegions.clear(); } void WalkRegions::load(int sceneNum) { -- cgit v1.2.3 From b3bd18668c7215620c4e1481819c8f87742f2338 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 30 Oct 2011 09:10:34 +1100 Subject: TSAGE: Fixed palette rotation effects in Blue Force --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index dd5c604b29..da8450e499 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1081,7 +1081,7 @@ void PaletteRotation::signal() { uint32 frameNumber = g_globals->_events.getFrameNumber(); if (frameNumber >= _frameNumber) { - _delayCtr = frameNumber - _frameNumber; + _delayCtr -= frameNumber - _frameNumber; _frameNumber = frameNumber; if (_delayCtr < 0) -- cgit v1.2.3 From 7ec4052c1b0ef9a83c4bb79b7d9fccc701fd0046 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 30 Oct 2011 19:47:51 +1100 Subject: TSAGE: In progress implementation of R2RW scene 125 - Console --- engines/tsage/core.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index da8450e499..7ad4eff585 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2929,6 +2929,16 @@ Player::Player(): SceneObject() { _enabled = false; _uiEnabled = false; _field8C = 0; + + // Return to Ringworld specific fields + _characterIndex = 0; + _oldSceneNumber = 0; + + for (int i = 0; i < MAX_CHARACTERS; ++i) { + _characterScene[i] = 0; + _characterStrip[i] = 0; + _characterFrame[i] = 0; + } } void Player::postInit(SceneObjectList *OwnerList) { @@ -3017,6 +3027,19 @@ void Player::synchronize(Serializer &s) { if (g_vm->getGameID() != GType_Ringworld) s.syncAsByte(_enabled); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_characterIndex); + s.syncAsSint16LE(_oldSceneNumber); + + for (int i = 0; i < MAX_CHARACTERS; ++i) { + s.syncAsSint16LE(_characterScene[i]); + s.syncAsSint16LE(_characterPos[i].x); + s.syncAsSint16LE(_characterPos[i].y); + s.syncAsSint16LE(_characterStrip[i]); + s.syncAsSint16LE(_characterFrame[i]); + } + } } /*--------------------------------------------------------------------------*/ -- cgit v1.2.3 From ef1f96b674fe4840c553e915f02eae45666cdf3b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 31 Oct 2011 10:44:37 +1100 Subject: TSAGE: Added skeleton for Geekwad --- engines/tsage/core.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 7ad4eff585..84ab98d4e0 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1438,8 +1438,8 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { } Rect tempRect = bounds; - if (g_vm->getGameID() != GType_Ringworld) - tempRect.setHeight(BF_GLOBALS._interfaceY); + if ((g_vm->getGameID() != GType_Ringworld) && (g_vm->getGameID() != GType_Geekwad)) + tempRect.setHeight(T2_GLOBALS._interfaceY); g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, tempRect, Rect(0, 0, tempRect.width(), tempRect.height()), NULL); -- cgit v1.2.3 From c15a67879ca65daa21c58c794c2f66e12edad0c8 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 31 Oct 2011 15:11:27 +1100 Subject: TSAGE: Added inventory item cursor support for R2RW --- engines/tsage/core.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 84ab98d4e0..0ada457224 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -77,8 +77,8 @@ InvObject::InvObject(int strip, int frame) { } void InvObject::setCursor() { - if (g_vm->getGameID() == GType_BlueForce) { - // Blue Force cursor handling + if (g_vm->getGameID() != GType_Ringworld) { + // All other games _cursorId = (CursorType)BF_GLOBALS._inventory->indexOf(this); g_globals->_events.setCursor(_cursorId); } else { -- cgit v1.2.3 From 79a9973b4af6acc6146ed33087962327845502c6 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 31 Oct 2011 15:52:18 +1100 Subject: TSAGE: Bugfixes for R2RW scene 125 - Console --- engines/tsage/core.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 0ada457224..724f9059f5 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2998,6 +2998,11 @@ void Player::enableControl() { } } +void Player::enableControl(CursorType cursor) { + enableControl(); + R2_GLOBALS._events.setCursor(cursor); +} + void Player::process(Event &event) { if ((g_vm->getGameID() != GType_Ringworld) && _action) _action->process(event); -- cgit v1.2.3 From bb694c9e1c3bd05b91f60617dc4112d2031c627e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 31 Oct 2011 17:12:28 +1100 Subject: TSAGE: Implemented changes to SceneItem::display for R2RW --- engines/tsage/core.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 724f9059f5..cd8e07e44e 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1551,6 +1551,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { int maxWidth = 120; bool keepOnscreen = false; bool centerText = g_vm->getGameID() == GType_Ringworld; + Common::List playList; if (resNum != 0) { va_list va; @@ -1559,6 +1560,17 @@ void SceneItem::display(int resNum, int lineNum, ...) { if (resNum == -1) msg = Common::String(va_arg(va, const char *)); + if (g_vm->getGameID() == GType_Ringworld2) { + // Pre-process the string for any sound information + while (msg.hasPrefix("!")) { + msg.deleteChar(0); + playList.push_back(atoi(msg.c_str())); + + while (!msg.empty() && (*msg.c_str() >= '0' && *msg.c_str() <= '9')) + msg.deleteChar(0); + } + } + int mode; do { // Get next instruction @@ -1666,6 +1678,12 @@ void SceneItem::display(int resNum, int lineNum, ...) { g_system->delayMillis(10); } + // For Return to Ringworld, play the voice overs in sequence + if ((g_vm->getGameID() == GType_Ringworld2) && !playList.empty() && !R2_GLOBALS._playStream.isPlaying()) { + R2_GLOBALS._playStream.play(*playList.begin(), NULL); + playList.pop_front(); + } + g_globals->_sceneText.remove(); } @@ -1688,7 +1706,8 @@ void SceneItem::display2(int resNum, int lineNum) { SET_EXT_FGCOLOR, 13, LIST_END); break; case GType_Ringworld2: - display(resNum, lineNum, SET_WIDTH, 280, SET_X, 20, SET_Y, 20, SET_EXT_BGCOLOR, 60, LIST_END); + display(resNum, lineNum, SET_WIDTH, 280, SET_X, 160, SET_Y, 20, SET_POS_MODE, ALIGN_CENTER, + SET_EXT_BGCOLOR, 60, LIST_END); break; default: display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); @@ -2754,6 +2773,7 @@ SceneText::SceneText() : SceneObject() { _fontNumber = 2; _width = 160; _textMode = ALIGN_LEFT; + _color1 = 0; _color2 = 0; _color3 = 0; } -- cgit v1.2.3 From acdeb1fb31021f0d563318639b4a261e3b370476 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 1 Nov 2011 21:06:57 +1100 Subject: TSAGE: Added support for semi-transparent dialogs used in R2RW --- engines/tsage/core.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index cd8e07e44e..4061705707 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1298,6 +1298,15 @@ void ScenePalette::setPalette(int index, int count) { g_system->getPaletteManager()->setPalette((const byte *)&_palette[index * 3], index, count); } +/** + * Get a palette entry + */ +void ScenePalette::getEntry(int index, uint *r, uint *g, uint *b) { + *r = _palette[index * 3]; + *g = _palette[index * 3 + 1]; + *b = _palette[index * 3 + 2]; +} + /** * Set a palette entry */ -- cgit v1.2.3 From ebc3763d64c5192b04c35d27b876adeb88b5ef47 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Tue, 1 Nov 2011 21:59:43 +1100 Subject: TSAGE: Removed game stubs for Geekwad --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 4061705707..dbea7e8d98 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1447,7 +1447,7 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { } Rect tempRect = bounds; - if ((g_vm->getGameID() != GType_Ringworld) && (g_vm->getGameID() != GType_Geekwad)) + if (g_vm->getGameID() != GType_Ringworld) tempRect.setHeight(T2_GLOBALS._interfaceY); g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, -- cgit v1.2.3 From ec6a9d28727071c73e7de113d0530a71ef24b7d6 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 4 Nov 2011 00:41:36 +0200 Subject: TSAGE: Removed duplicate assignments --- engines/tsage/core.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index dbea7e8d98..5a43a3b6c0 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1855,7 +1855,6 @@ SceneObject::SceneObject() : SceneHotspot() { _moveDiff.x = 5; _moveDiff.y = 3; _numFrames = 10; - _numFrames = 10; _moveRate = 10; _regionBitList = 0; _sceneRegionId = 0; -- cgit v1.2.3 From 4c3c8f8ce3403f67d683959b947b8eb560c55bae Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 17 Nov 2011 22:04:10 +1100 Subject: TSAGE: Added new properties and stubs needed for new R2RW functionality --- engines/tsage/core.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 5a43a3b6c0..679fb59ef9 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1061,6 +1061,8 @@ PaletteRotation::PaletteRotation() : PaletteModifierCached() { _percent = 0; _delayCtr = 0; _frameNumber = g_globals->_events.getFrameNumber(); + _idxChange = 1; + _countdown = 0; } void PaletteRotation::synchronize(Serializer &s) { @@ -1074,9 +1076,19 @@ void PaletteRotation::synchronize(Serializer &s) { s.syncAsSint32LE(_rotationMode); s.syncAsSint32LE(_duration); s.syncBytes(&_palette[0], 256 * 3); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_idxChange); + s.syncAsSint16LE(_countdown); + } } void PaletteRotation::signal() { + if (_countdown > 0) { + --_countdown; + return; + } + if (_delayCtr) { uint32 frameNumber = g_globals->_events.getFrameNumber(); @@ -1098,21 +1110,24 @@ void PaletteRotation::signal() { bool flag = true; switch (_rotationMode) { case -1: - if (--_currIndex < _start) { + _currIndex -= _idxChange; + if (_currIndex < _start) { flag = decDuration(); if (flag) _currIndex = _end - 1; } break; case 1: - if (++_currIndex >= _end) { + _currIndex += _idxChange; + if (_currIndex >= _end) { flag = decDuration(); if (flag) _currIndex = _start; } break; case 2: - if (++_currIndex >= _end) { + _currIndex += _idxChange; + if (_currIndex >= _end) { flag = decDuration(); if (flag) { _currIndex = _end - 2; @@ -1121,7 +1136,8 @@ void PaletteRotation::signal() { } break; case 3: - if (--_currIndex < _start) { + _currIndex -= _idxChange; + if (_currIndex < _start) { flag = decDuration(); if (flag) { _currIndex = _start + 1; @@ -1144,7 +1160,9 @@ void PaletteRotation::signal() { void PaletteRotation::remove() { Action *action = _action; - g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start); + + if (_idxChange) + g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start); _scenePalette->_listeners.remove(this); @@ -2961,6 +2979,7 @@ Player::Player(): SceneObject() { // Return to Ringworld specific fields _characterIndex = 0; _oldSceneNumber = 0; + _fieldBC = 0; for (int i = 0; i < MAX_CHARACTERS; ++i) { _characterScene[i] = 0; @@ -3064,6 +3083,7 @@ void Player::synchronize(Serializer &s) { if (g_vm->getGameID() == GType_Ringworld2) { s.syncAsSint16LE(_characterIndex); s.syncAsSint16LE(_oldSceneNumber); + s.syncAsSint16LE(_fieldBC); for (int i = 0; i < MAX_CHARACTERS; ++i) { s.syncAsSint16LE(_characterScene[i]); -- cgit v1.2.3 From 04ae8dbf207ab45dc6018517ad55c6f14a086321 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 19 Nov 2011 16:28:47 +1100 Subject: TSAGE: Properly update user interface when switching between characters in R2RW --- engines/tsage/core.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 679fb59ef9..ff7b9e3228 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -94,6 +94,10 @@ void InvObject::setCursor() { } } +bool InvObject::inInventory() const { + return _sceneNumber == ((g_vm->getGameID() != GType_Ringworld2) ? 1 : g_globals->_player._characterIndex); +} + /*--------------------------------------------------------------------------*/ InvObjectList::InvObjectList() { -- cgit v1.2.3 From 8a2500cd64afa063557014b3d0e9490abd6c1096 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Wed, 23 Nov 2011 10:52:08 +0100 Subject: TSAGE: R2R - Replace oldSceneNumber by an array, as each character has its own --- engines/tsage/core.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index ff7b9e3228..b991e4677b 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2982,13 +2982,12 @@ Player::Player(): SceneObject() { // Return to Ringworld specific fields _characterIndex = 0; - _oldSceneNumber = 0; - _fieldBC = 0; for (int i = 0; i < MAX_CHARACTERS; ++i) { _characterScene[i] = 0; _characterStrip[i] = 0; _characterFrame[i] = 0; + _oldCharacterScene[i] = 0; } } @@ -3086,11 +3085,9 @@ void Player::synchronize(Serializer &s) { if (g_vm->getGameID() == GType_Ringworld2) { s.syncAsSint16LE(_characterIndex); - s.syncAsSint16LE(_oldSceneNumber); - s.syncAsSint16LE(_fieldBC); - for (int i = 0; i < MAX_CHARACTERS; ++i) { s.syncAsSint16LE(_characterScene[i]); + s.syncAsSint16LE(_oldCharacterScene[i]); s.syncAsSint16LE(_characterPos[i].x); s.syncAsSint16LE(_characterPos[i].y); s.syncAsSint16LE(_characterStrip[i]); -- cgit v1.2.3 From 5518721a17e751a2ac6deefe56ef0ce446f184ab Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Sun, 27 Nov 2011 13:59:10 +0100 Subject: TSAGE: Work around some uninitialized use warnings They were false positives, but easy to work around. --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index b991e4677b..266d39a907 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -3710,7 +3710,7 @@ int WalkRegions::indexOf(const Common::Point &pt, const Common::List *index void WalkRegions::synchronize(Serializer &s) { // Synchronise the list of disabled regions as a list of values terminated with a '-1' - int regionId; + int regionId = 0; if (s.isLoading()) { _disabledRegions.clear(); -- cgit v1.2.3 From 8a72581bc830a124823e00f9e5a660d5f5d981f0 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 3 Dec 2011 08:01:40 +1100 Subject: TSAGE: Fixed the R2R player initialisation. This fixes the problem where the player wouldn't face in the direction they were walking in. --- engines/tsage/core.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 266d39a907..0ad1c43e8c 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2998,8 +2998,25 @@ void Player::postInit(SceneObjectList *OwnerList) { _uiEnabled = true; _percent = 100; _field8C = 10; - _moveDiff.x = 4; - _moveDiff.y = 2; + + if (g_vm->getGameID() != GType_Ringworld2) + { + _moveDiff.x = 4; + _moveDiff.y = 2; + } + else + { + _moveDiff.x = 3; + _moveDiff.y = 2; + _effect = 1; + _shade = 0; + + setObjectWrapper(new SceneObjectWrapper()); + setPosition(_characterPos[_characterIndex]); + setStrip(_characterStrip[_characterIndex]); + setFrame(_characterFrame[_characterIndex]); + _characterScene[_characterIndex] = GLOBALS._sceneManager._sceneNumber; + } } void Player::disableControl() { -- cgit v1.2.3 From 481ebbf2d9636c3114d41b65f1e278acbcc1f399 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 8 Dec 2011 10:59:48 +1100 Subject: TSAGE: Bugfix to correctly horizontally center text in R2R --- engines/tsage/core.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 0ad1c43e8c..6a84b2521b 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1675,10 +1675,14 @@ void SceneItem::display(int resNum, int lineNum, ...) { if (resNum) { // Get required bounding size - g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth); - textRect.center(pos.x, pos.y); + GfxFont font; + font.setFontNumber(g_globals->_sceneText._fontNumber); + font.getStringBounds(msg.c_str(), textRect, maxWidth); + // Center the text at the specified position, and then constrain it to be- + textRect.center(pos.x, pos.y); textRect.contain(g_globals->gfxManager()._bounds); + if (centerText) { g_globals->_sceneText._color1 = g_globals->_sceneText._color2; g_globals->_sceneText._color2 = 0; -- cgit v1.2.3 From 86514cfe46830ea5861b42f5450cea6ce92123d3 Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 8 Dec 2011 05:37:03 +0100 Subject: TSAGE: Remove unused variable. --- engines/tsage/core.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 6a84b2521b..79a34fa4e3 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1576,7 +1576,6 @@ void SceneItem::display(int resNum, int lineNum, ...) { g_globals->_sceneObjects->draw(); } - GfxFontBackup font; Common::Point pos(160, 100); Rect textRect; int maxWidth = 120; -- cgit v1.2.3 From 7d3c622f6aa36f5a2e2e57cfe6b607e1d9472d7f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 8 Dec 2011 17:25:34 +1100 Subject: TSAGE: Bugfix for centering R2R on-screen text by default --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 79a34fa4e3..eb7c734074 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1580,7 +1580,7 @@ void SceneItem::display(int resNum, int lineNum, ...) { Rect textRect; int maxWidth = 120; bool keepOnscreen = false; - bool centerText = g_vm->getGameID() == GType_Ringworld; + bool centerText = g_vm->getGameID() != GType_BlueForce; Common::List playList; if (resNum != 0) { -- cgit v1.2.3 From a2da8e6b397a76e2efef41b4d07b1baef78a6abc Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 9 Dec 2011 10:13:06 +1100 Subject: TSAGE: Got rid of goto in TsAGE engine. --- engines/tsage/core.cpp | 75 +++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 35 deletions(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index eb7c734074..88121c4d16 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2661,43 +2661,48 @@ void SceneObjectList::draw() { } g_globals->_paneRegions[paneNum].setRect(0, 0, 0, 0); -redraw: - // Main draw loop - for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { - SceneObject *obj = objList[objIndex]; - - if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) { - obj->_paneRects[paneNum] = obj->_bounds; - obj->draw(); + + // FIXME: Currently, removing objects causes screen flickers when the removed object intersects + // another drawn object, since the background is briefly redrawn over the object. For now, I'm + // using a forced jump back to redraw objects. In the long term, I should figure out how the + // original game does this properly + bool redrawFlag = true; + while (redrawFlag) { + redrawFlag = false; + + // Main draw loop + for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { + SceneObject *obj = objList[objIndex]; + + if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) { + obj->_paneRects[paneNum] = obj->_bounds; + obj->draw(); + } } - } - // Update the palette - g_globals->_sceneManager.fadeInIfNecessary(); - g_globals->_sceneManager._loadMode = 0; - g_globals->_paneRefreshFlag[paneNum] = 0; - - // Loop through the object list, removing any objects and refreshing the screen as necessary - for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { - SceneObject *obj = objList[objIndex]; - - if (obj->_flags & OBJFLAG_HIDE) - obj->_flags |= OBJFLAG_HIDING; - obj->_flags &= ~flagMask; - if (obj->_flags & OBJFLAG_REMOVE) { - obj->_flags |= OBJFLAG_PANES; - - checkIntersection(objList, objIndex, CURRENT_PANENUM); - - obj->updateScreen(); - obj->removeObject(); - - // FIXME: Currently, removing objects causes screen flickers when the removed object intersects - // another drawn object, since the background is briefly redrawn over the object. For now, I'm - // using a forced jump back to redraw objects. In the long term, I should figure out how the - // original game does this properly - objList.remove_at(objIndex); - goto redraw; + // Update the palette + g_globals->_sceneManager.fadeInIfNecessary(); + g_globals->_sceneManager._loadMode = 0; + g_globals->_paneRefreshFlag[paneNum] = 0; + + // Loop through the object list, removing any objects and refreshing the screen as necessary + for (uint objIndex = 0; objIndex < objList.size() && !redrawFlag; ++objIndex) { + SceneObject *obj = objList[objIndex]; + + if (obj->_flags & OBJFLAG_HIDE) + obj->_flags |= OBJFLAG_HIDING; + obj->_flags &= ~flagMask; + if (obj->_flags & OBJFLAG_REMOVE) { + obj->_flags |= OBJFLAG_PANES; + + checkIntersection(objList, objIndex, CURRENT_PANENUM); + + obj->updateScreen(); + obj->removeObject(); + + objList.remove_at(objIndex); + redrawFlag = true; + } } } } -- cgit v1.2.3 From 518d4cd429924f145626401c194f42fd76783c03 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 11 Dec 2011 17:46:58 +1100 Subject: TSAGE: Changed the Player characterIndex int field to be a proper enum --- engines/tsage/core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/tsage/core.cpp') diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 88121c4d16..9d7c8abf0a 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -2989,7 +2989,7 @@ Player::Player(): SceneObject() { _field8C = 0; // Return to Ringworld specific fields - _characterIndex = 0; + _characterIndex = R2_NONE; for (int i = 0; i < MAX_CHARACTERS; ++i) { _characterScene[i] = 0; -- cgit v1.2.3