aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/fullpipe/constants.h1
-rw-r--r--engines/fullpipe/fullpipe.cpp8
-rw-r--r--engines/fullpipe/fullpipe.h7
-rw-r--r--engines/fullpipe/input.cpp66
-rw-r--r--engines/fullpipe/inventory.cpp17
-rw-r--r--engines/fullpipe/inventory.h2
-rw-r--r--engines/tsage/globals.cpp4
-rw-r--r--engines/tsage/globals.h2
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp2
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.cpp203
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.h20
11 files changed, 229 insertions, 103 deletions
diff --git a/engines/fullpipe/constants.h b/engines/fullpipe/constants.h
index 4f389f80a8..796764d0a9 100644
--- a/engines/fullpipe/constants.h
+++ b/engines/fullpipe/constants.h
@@ -30,6 +30,7 @@ namespace Fullpipe {
#define ANI_INV_MAP 5321
#define ANI_LIFTBUTTON 2751
#define ANI_MAN 322
+#define MSG_CMN_WINARCADE 4778
#define MSG_DISABLESAVES 5201
#define MSG_ENABLESAVES 5202
#define MSG_HMRKICK_METAL 4764
diff --git a/engines/fullpipe/fullpipe.cpp b/engines/fullpipe/fullpipe.cpp
index 11808e95c2..6a4a587ff7 100644
--- a/engines/fullpipe/fullpipe.cpp
+++ b/engines/fullpipe/fullpipe.cpp
@@ -71,6 +71,11 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc)
_inputController = 0;
_inputDisabled = false;
+ _normalSpeed = true;
+
+ _currentCheat = -1;
+ _currentCheatPos = 0;
+
_modalObject = 0;
_gameContinue = true;
@@ -201,7 +206,8 @@ Common::Error FullpipeEngine::run() {
_needRestart = false;
}
- _system->delayMillis(10);
+ if (_normalSpeed)
+ _system->delayMillis(10);
_system->updateScreen();
}
diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h
index f688151267..348ac2c9c5 100644
--- a/engines/fullpipe/fullpipe.h
+++ b/engines/fullpipe/fullpipe.h
@@ -127,6 +127,9 @@ public:
CInputController *_inputController;
bool _inputDisabled;
+ int _currentCheat;
+ int _currentCheatPos;
+
void defHandleKeyDown(int key);
SoundList *_currSoundList1[11];
@@ -171,6 +174,7 @@ public:
bool _needRestart;
bool _flgPlayIntro;
int _musicAllowed;
+ bool _normalSpeed;
void enableSaves() { _isSaveAllowed = true; }
void disableSaves(ExCommand *ex);
@@ -222,6 +226,9 @@ public:
void openHelp();
void openMainMenu();
+ void winArcade();
+ void getAllInventory();
+
int lift_getButtonIdP(int objid);
public:
diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp
index 8cc7654f52..c4af54ddc3 100644
--- a/engines/fullpipe/input.cpp
+++ b/engines/fullpipe/input.cpp
@@ -145,8 +145,72 @@ void FullpipeEngine::setCursor(int id) {
_inputController->setCursor(id);
}
+const char *input_cheats[] = {
+ "HELP",
+ "STUFF",
+ "FASTER",
+ "OHWAIT",
+ "MUSOFF",
+ ""
+};
+
void FullpipeEngine::defHandleKeyDown(int key) {
- warning("STUB: FullpipeEngine::defHandleKeyDown(%d)", key);
+ if (_currentCheat == -1) {
+ for (int i = 0; input_cheats[i][0]; i++)
+ if (toupper(key) == input_cheats[i][0]) {
+ _currentCheat = i;
+ _currentCheatPos = 1;
+ }
+
+ return;
+ }
+
+ warning("%d %d", _currentCheat, _currentCheatPos);
+ if (toupper(key) != input_cheats[_currentCheat][_currentCheatPos]) {
+ _currentCheat = -1;
+
+ return;
+ }
+
+ _currentCheatPos++;
+ warning("%d %d", _currentCheat, _currentCheatPos);
+
+ if (!input_cheats[_currentCheat][_currentCheatPos]) {
+ switch (_currentCheat) {
+ case 0: // HELP
+ winArcade();
+ break;
+ case 1: // STUFF
+ getAllInventory();
+ break;
+ case 2: // FASTER
+ _normalSpeed = !_normalSpeed;
+ break;
+ case 3: // OHWAIT
+ _gamePaused = 1;
+ _flgGameIsRunning = 0;
+ break;
+ case 4: // MUSOFF
+ if (_musicAllowed & 2)
+ setMusicAllowed(_musicAllowed & 0xFFFFFFFD);
+ else
+ setMusicAllowed(_musicAllowed | 2);
+ break;
+ default:
+ break;
+ }
+
+ _currentCheatPos = 0;
+ _currentCheat = -1;
+ }
+}
+
+void FullpipeEngine::winArcade() {
+ ExCommand *ex = new ExCommand(0, 17, MSG_CMN_WINARCADE, 0, 0, 0, 1, 0, 0, 0);
+ ex->_excFlags |= 3;
+
+ ex->postMessage();
+
}
void FullpipeEngine::updateCursorsCommon() {
diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp
index 1e229f3408..ccedb57ce2 100644
--- a/engines/fullpipe/inventory.cpp
+++ b/engines/fullpipe/inventory.cpp
@@ -138,6 +138,10 @@ int CInventory2::getInventoryItemIndexById(int itemId) {
return -1;
}
+int CInventory2::getInventoryPoolItemIdAtIndex(int itemId) {
+ return _itemsPool[itemId]->id;
+}
+
int CInventory2::getInventoryPoolItemFieldCById(int itemId) {
for (uint i = 0; i < _itemsPool.size(); i++) {
if (_itemsPool[i]->id == itemId)
@@ -417,4 +421,17 @@ int CInventory2::getHoveredItem(Common::Point *point) {
return 0;
}
+void FullpipeEngine::getAllInventory() {
+ CInventory2 *inv = getGameLoaderInventory();
+
+ for (uint i = 0; i < inv->getItemsPoolCount(); ++i ) {
+ int id = inv->getInventoryPoolItemIdAtIndex(i);
+
+ if (inv->getCountItemsWithId(id) < 1)
+ inv->addItem(id, 1);
+ }
+
+ inv->rebuildItemRects();
+}
+
} // End of namespace Fullpipe
diff --git a/engines/fullpipe/inventory.h b/engines/fullpipe/inventory.h
index f84d27dde5..5f1030398c 100644
--- a/engines/fullpipe/inventory.h
+++ b/engines/fullpipe/inventory.h
@@ -52,6 +52,7 @@ class CInventory : public CObject {
virtual bool load(MfcArchive &file);
int getInventoryPoolItemIndexById(int itemId);
+ uint getItemsPoolCount() { return _itemsPool.size(); }
bool setItemFlags(int itemId, int flags);
};
@@ -102,6 +103,7 @@ class CInventory2 : public CInventory {
void removeItem2(Scene *sceneObj, int itemId, int x, int y, int priority);
int getInventoryItemIndexById(int itemId);
+ int getInventoryPoolItemIdAtIndex(int itemId);
int getInventoryPoolItemFieldCById(int itemId);
int getCountItemsWithId(int itemId);
int getItemFlags(int itemId);
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index 8f70c2926e..6976a6b249 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -461,7 +461,7 @@ void Ringworld2Globals::reset() {
for (int i = 0; i < 1000; i++)
_v566AB[i] = 0;
_v56A93 = -1;
- _v56A99 = 5;
+ _balloonAltitude = 5;
_scene1925CurrLevel = 0; //_v56A9C
_v56A9E = 0;
_v56AA0 = 0;
@@ -568,7 +568,7 @@ void Ringworld2Globals::synchronize(Serializer &s) {
s.syncAsByte(_spillLocation[i]);
for (i = 0; i < 1000; ++i)
s.syncAsByte(_v566AB[i]);
- s.syncAsByte(_v56A99);
+ s.syncAsByte(_balloonAltitude);
for (i = 0; i < 12; ++i)
s.syncAsByte(_stripManager_lookupList[i]);
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index cf4649247e..22820d0118 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -280,7 +280,7 @@ public:
byte _v566AA;
byte _v566AB[1000];
int _v56A93;
- byte _v56A99;
+ byte _balloonAltitude;
int _scene1925CurrLevel; //_v56A9C
int _v56A9E;
byte _v56AA0;
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index ae83c08966..e679b3835c 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -525,6 +525,8 @@ void SceneExt::refreshBackground(int xAmount, int yAmount) {
Common::copy(dataP, dataP + (s.w * s.h), destP);
_backSurface.unlockSurface();
+ R2_GLOBALS._screenSurface.addDirtyRect(_backSurface.getBounds());
+
// Free the resource data
DEALLOCATE(dataP);
}
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
index d2c4f3d8c0..5570e3e975 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
@@ -4608,15 +4608,19 @@ bool Scene2900::KnobLeft::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (scene->_field416 != 0 || scene->_field414 != 0 || scene->_field425 != scene->_field426) {
+ if (scene->_field416 || scene->_altitudeChanging ||
+ scene->_field425 != scene->_field426) {
+ // Let your altitude stablize first
SceneItem::display2(2900, 17);
- } else if (R2_GLOBALS._v56A99 / 48 == 0) {
+ } else if (R2_GLOBALS._balloonAltitude / 48 == 0) {
+ // Maximum altitude
SceneItem::display2(2900, 15);
} else {
+ // Increase altitude
R2_GLOBALS._sound2.fadeSound(282);
- scene->_field414 = 1;
- scene->_field41E = -1;
- scene->_field426 = 100 - ((R2_GLOBALS._v56A99 / 48) - 1) * 25;
+ scene->_altitudeChanging = true;
+ scene->_altitudeMajorChange = -1;
+ scene->_field426 = 100 - ((R2_GLOBALS._balloonAltitude / 48) - 1) * 25;
}
break;
@@ -4641,15 +4645,19 @@ bool Scene2900::KnobRight::startAction(CursorType action, Event &event) {
switch (action) {
case CURSOR_USE:
- if (scene->_field416 != 0 || scene->_field414 != 0 || scene->_field425 != scene->_field426) {
+ if (scene->_field416 || scene->_altitudeChanging ||
+ scene->_field425 != scene->_field426) {
+ // Let your altitude stablize first
SceneItem::display2(2900, 17);
- } else if (R2_GLOBALS._v56A99 / 48 == 0) {
+ } else if (R2_GLOBALS._balloonAltitude / 48 >= 3) {
+ // Altitude is too low - cannot land here
SceneItem::display2(2900, 16);
} else {
+ // Decrease altitude
R2_GLOBALS._sound2.fadeSound(212);
- scene->_field414 = 1;
- scene->_field41E = 1;
- scene->_field426 = 100 - ((R2_GLOBALS._v56A99 / 48) + 1) * 25;
+ scene->_altitudeChanging = true;
+ scene->_altitudeMajorChange = 1;
+ scene->_field426 = 100 - ((R2_GLOBALS._balloonAltitude / 48) + 1) * 25;
}
break;
@@ -4675,10 +4683,10 @@ void Scene2900::Action1::signal() {
Scene2900 *scene = (Scene2900 *)R2_GLOBALS._sceneManager._scene;
setDelay(3);
- if (scene->_field416 == 0 && scene->_field414 == 0) {
+ if (!scene->_field416 && !scene->_altitudeChanging) {
scene->_field427 = 2;
scene->_field412 = 0;
- } else if (scene->_field416 != 0) {
+ } else if (scene->_field416) {
R2_GLOBALS._sound2.fadeOut2(NULL);
} else if (scene->_field427 == 0) {
R2_GLOBALS._sound2.fadeOut2(NULL);
@@ -4704,7 +4712,7 @@ Scene2900::Map::Map() {
_fieldA = 0;
_resNum = 0;
_xV = _yV = 0;
- _rect = Rect(40, 0, 280, 150);
+ _bounds = Rect(40, 0, 280, 150);
}
void Scene2900::Map::load(int resNum) {
@@ -4718,58 +4726,67 @@ void Scene2900::Map::load(int resNum) {
DEALLOCATE(data);
}
-Common::Point Scene2900::Map::setPosition(const Common::Point &pos, int v3) {
- Rect rect2;
- Rect blockRect(0, 0, 160, 100);
- int xHalfCount = _mapWidth / 160;
- int yHalfCount = _mapHeight / 100;
+Common::Point Scene2900::Map::setPosition(const Common::Point &pos, bool initialFlag) {
Common::Point p = pos;
+ Rect updateRect;
if (p.x >= 0) {
- int xRight = p.x + _rect.width();
+ int xRight = p.x + _bounds.width();
if (xRight > _mapWidth) {
- p.x = _mapWidth - _rect.width();
+ p.x = _mapWidth - _bounds.width();
}
} else {
p.x = 0;
}
if (p.y >= 0) {
- int yBottom = p.y + _rect.height();
+ int yBottom = p.y + _bounds.height();
if (yBottom > _mapHeight) {
- p.y = _mapHeight - _rect.height();
+ p.y = _mapHeight - _bounds.height();
}
} else {
p.y = 0;
}
- if ((p.x != 0 || p.y != 0) && !v3) {
- rect2 = _rect;
- moveArea(rect2, _xV - p.x, _yV - p.y);
+ if ((p.x != 0 || p.y != 0) && !initialFlag) {
+ moveArea(updateRect, _xV - p.x, _yV - p.y);
+ redraw(&updateRect);
+ } else {
+ redraw();
}
_xV = p.x;
_yV = p.y;
- Rect screenRect = _rect;
- screenRect.translate(_xV - _rect.left, _yV - _rect.top);
+ return Common::Point(_xV, _yV);
+}
+
+void Scene2900::Map::redraw(Rect *updateRect) {
+ int xHalfCount = _mapWidth / 160;
+ int yHalfCount = _mapHeight / 100;
int rlbNum = 0;
+ Rect blockRect(0, 0, 160, 100);
+ Rect screenRect = _bounds;
+ screenRect.translate(_xV - _bounds.left, _yV - _bounds.top);
+
+ Rect modifyRect;
+ if (updateRect)
+ modifyRect = *updateRect;
+
for (int xCtr = 0; xCtr < xHalfCount; ++xCtr) {
for (int yCtr = 0; yCtr < yHalfCount; ++yCtr, ++rlbNum) {
blockRect.moveTo(160 * xCtr, 100 * yCtr);
if (blockRect.intersects(screenRect)) {
// The block of the map is at least partially on-screen, so needs drawing
- blockRect.translate(_rect.left - _xV, _rect.top - _yV);
+ blockRect.translate(_bounds.left - _xV, _bounds.top - _yV);
byte *data = g_resourceManager->getResource(RES_BITMAP, _resNum, rlbNum);
- drawBlock(data, blockRect.left, blockRect.top, _rect, rect2);
+ drawBlock(data, blockRect.left, blockRect.top, _bounds, modifyRect);
DEALLOCATE(data);
}
}
}
-
- return Common::Point(_xV, _yV);
}
void Scene2900::Map::synchronize(Serializer &s) {
@@ -4777,7 +4794,7 @@ void Scene2900::Map::synchronize(Serializer &s) {
s.syncAsUint16LE(_mapHeight);
s.syncAsSint16LE(_xV);
s.syncAsSint16LE(_yV);
- _rect.synchronize(s);
+ _bounds.synchronize(s);
}
int Scene2900::Map::adjustRect(Common::Rect &r1, const Common::Rect &r2) {
@@ -4812,19 +4829,20 @@ int Scene2900::Map::adjustRect(Common::Rect &r1, const Common::Rect &r2) {
return -1;
}
-void Scene2900::Map::drawBlock(const byte *data, int xp, int yp, const Rect &r1, const Rect &r2) {
+void Scene2900::Map::drawBlock(const byte *data, int xp, int yp,
+ const Rect &bounds, const Rect &updateRect) {
Rect blockRect(xp, yp, xp + 160, yp + 100);
const byte *src = data;
- if (blockRect.intersects(r1)) {
- blockRect.clip(r1);
+ if (blockRect.intersects(bounds)) {
+ blockRect.clip(bounds);
- if (adjustRect(blockRect, r2) != 0) {
+ if (adjustRect(blockRect, updateRect) != 0) {
int width = blockRect.width();
int height = blockRect.height();
src += (blockRect.top - yp) * 160 + blockRect.left - xp;
- GfxSurface &surface = R2_GLOBALS.gfxManager().getSurface();
+ GfxSurface &surface = R2_GLOBALS._sceneManager._scene->_backSurface;
Graphics::Surface s = surface.lockSurface();
for (int yCtr = 0; yCtr < height; ++yCtr, src += 160) {
@@ -4833,7 +4851,7 @@ void Scene2900::Map::drawBlock(const byte *data, int xp, int yp, const Rect &r1,
}
surface.unlockSurface();
- surface.addDirtyRect(blockRect);
+ R2_GLOBALS.gfxManager().copyFrom(surface, blockRect, blockRect);
}
}
}
@@ -4897,30 +4915,30 @@ void Scene2900::Map::moveLine(int xpSrc, int ypSrc, int xpDest, int ypDest, int
Scene2900::Scene2900(): SceneExt() {
_field412 = 0;
- _field414 = 0;
- _field416 = 0;
+ _altitudeChanging = false;
+ _field416 = false;
_offsetPos = Common::Point(550, 550);
_field41C = 0;
- _field41E = 0;
+ _altitudeMajorChange = 0;
_pos = Common::Point(160, 100);
- _field424 = 0;
+ _newAltitude = 0;
_field425 = 100;
_field426 = 100;
_field427 = 0;
- _field8F8 = 0;
+ _field8F8 = false;
}
void Scene2900::synchronize(Serializer &s) {
s.syncAsSint16LE(_field412);
- s.syncAsSint16LE(_field414);
+ s.syncAsSint16LE(_altitudeChanging);
s.syncAsSint16LE(_field416);
s.syncAsSint16LE(_field41C);
- s.syncAsSint16LE(_field41E);
+ s.syncAsSint16LE(_altitudeMajorChange);
s.syncAsSint16LE(_offsetPos.x);
s.syncAsSint16LE(_offsetPos.y);
s.syncAsSint16LE(_pos.x);
s.syncAsSint16LE(_pos.y);
- s.syncAsSint16LE(_field424);
+ s.syncAsSint16LE(_newAltitude);
s.syncAsSint16LE(_field425);
s.syncAsSint16LE(_field426);
s.syncAsSint16LE(_field427);
@@ -4940,6 +4958,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
loadScene(2900);
SceneExt::postInit();
+ R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
_leftEdge.setup(2900, 6, 1, 22, 0, 25);
_rightEdge.setup(2900, 6, 1, 280, 0, 25);
@@ -4971,7 +4990,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
_knobLeft.setDetails(Rect(165, 160, 228, 200), 2900, -1, -1, -1, 2, (SceneItem *)NULL);
_knobRight.setDetails(Rect(228, 160, 285, 200), 2900, -1, -1, -1, 2, (SceneItem *)NULL);
-//**DEBUG** setAction(&_action1);
+ setAction(&_action1);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.setVisage(2900);
R2_GLOBALS._player.setStrip2(3);
@@ -4982,7 +5001,7 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
if (R2_GLOBALS._sceneManager._previousScene == 2350 &&
R2_GLOBALS._balloonPosition.x == 0 && R2_GLOBALS._balloonPosition.y == 0) {
- R2_GLOBALS._v56A99 = 5;
+ R2_GLOBALS._balloonAltitude = 5;
_map.setPosition(Common::Point(_offsetPos.x - 120, _offsetPos.y - 100));
_sceneMode = 10;
@@ -4995,9 +5014,9 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
_offsetPos.x = R2_GLOBALS._balloonPosition.x + 120;
_offsetPos.y = R2_GLOBALS._balloonPosition.y + 100;
- if ((R2_GLOBALS._v56A99 % 8) == 0)
+ if ((R2_GLOBALS._balloonAltitude % 8) == 0)
_offsetPos.x -= 70;
- else if ((R2_GLOBALS._v56A99 % 8) == 7)
+ else if ((R2_GLOBALS._balloonAltitude % 8) == 7)
_offsetPos.x += 70;
if (_offsetPos.x <= 120)
@@ -5005,12 +5024,12 @@ void Scene2900::postInit(SceneObjectList *OwnerList) {
else if (_offsetPos.x >= 680)
_pos.x = _offsetPos.x - 520;
- if ((R2_GLOBALS._v56A99 / 6) == 5)
+ if ((R2_GLOBALS._balloonAltitude / 6) == 5)
_offsetPos.y -= 50;
if (_offsetPos.y <= 100)
_pos.y = _offsetPos.y;
- _field425 = _field426 = 100 - (R2_GLOBALS._v56A99 / 48) * 25;
+ _field425 = _field426 = 100 - (R2_GLOBALS._balloonAltitude / 48) * 25;
_map.setPosition(Common::Point(_offsetPos.x - 120, _offsetPos.y - 100));
_sceneMode = 11;
@@ -5036,7 +5055,8 @@ void Scene2900::remove() {
R2_GLOBALS._sound1.fadeOut2(NULL);
R2_GLOBALS._sound2.stop();
-
+
+ R2_GLOBALS._interfaceY = UI_INTERFACE_Y;
SceneExt::remove();
}
@@ -5057,35 +5077,35 @@ void Scene2900::signal() {
void Scene2900::dispatch() {
if (_sceneMode == 11) {
- _offsetPos.x += balloonData[R2_GLOBALS._v56A99].x;
- _offsetPos.y += balloonData[R2_GLOBALS._v56A99].y;
- _field41C = balloonData[R2_GLOBALS._v56A99].v3;
+ _offsetPos.x += balloonData[R2_GLOBALS._balloonAltitude].x;
+ _offsetPos.y += balloonData[R2_GLOBALS._balloonAltitude].y;
+ _field41C = balloonData[R2_GLOBALS._balloonAltitude].v3;
if (_field41C == 0) {
- _field416 = 0;
+ _field416 = false;
} else {
- _field416 = 1;
- _field414 = 0;
- _field41C += R2_GLOBALS._v56A99 / 48;
+ _field416 = true;
+ _altitudeChanging = false;
+ _field41C += R2_GLOBALS._balloonAltitude / 48;
_field426 = 100 - (_field41C * 25);
}
if (_field425 == _field426) {
- _field416 = 0;
+ _field416 = false;
} else {
- if (_field416 == 0) {
- _field425 = _field425 - _field41E;
+ if (!_field416) {
+ _field425 = _field425 - _altitudeMajorChange;
} else {
_field425 = _field425 - _field41C;
}
- if (_field41C == -1 || _field41E == -1) {
+ if (_field41C == -1 || _altitudeMajorChange == -1) {
if (_altimeterContent._frame == 1) {
_altimeterContent.setFrame2(10);
} else {
_altimeterContent.setFrame2(_altimeterContent._frame - 1);
}
- } else if (_field41C == -1 || _field41E == 1) {
+ } else if (_field41C == -1 || _altitudeMajorChange == 1) {
if (_altimeterContent._frame == 10)
_altimeterContent.setFrame2(1);
else
@@ -5096,16 +5116,14 @@ void Scene2900::dispatch() {
R2_GLOBALS._player.changeZoom(_field425);
}
- if (_field8F8 == 0) {
+ if (!_field8F8) {
R2_GLOBALS._scenePalette.loadPalette(2950);
R2_GLOBALS._scenePalette.refresh();
}
- // TODO: Verify param 3
R2_GLOBALS._balloonPosition = _map.setPosition(
- Common::Point(_offsetPos.x - 120, _offsetPos.y - 100),
- _field8F8 + (_field8F8 ? 1 : 0));
- _field8F8 = 1;
+ Common::Point(_offsetPos.x - 120, _offsetPos.y - 100), !_field8F8);
+ _field8F8 = true;
if (_offsetPos.x <= 120)
_pos.x = _offsetPos.x + 40;
@@ -5117,33 +5135,34 @@ void Scene2900::dispatch() {
R2_GLOBALS._player.setPosition(_pos);
- if ((_offsetPos.y % 100) == 50 && _field416 == 0) {
- _field424 = R2_GLOBALS._v56A99;
- if (_field414 != 0) {
- _field424 += _field41E * 48;
- _field414 = 0;
+ if ((_offsetPos.x % 100) == 50 && (_offsetPos.y % 100) == 50 && !_field416) {
+ _newAltitude = R2_GLOBALS._balloonAltitude;
+ if (_altitudeChanging) {
+ _newAltitude += _altitudeMajorChange * 48;
+ _altitudeChanging = false;
}
- if (balloonData[R2_GLOBALS._v56A99].x > 0) {
- ++_field424;
- } else if (balloonData[R2_GLOBALS._v56A99].x < 0) {
- --_field424;
+ if (balloonData[R2_GLOBALS._balloonAltitude].x > 0) {
+ ++_newAltitude;
+ } else if (balloonData[R2_GLOBALS._balloonAltitude].x < 0) {
+ --_newAltitude;
}
- if (balloonData[R2_GLOBALS._v56A99].y > 0) {
- _field424 += 240;
- } else if (balloonData[R2_GLOBALS._v56A99].x < 0) {
- _field424 += 8;
+ if (balloonData[R2_GLOBALS._balloonAltitude].y > 0) {
+ _newAltitude += 240;
+ } else if (balloonData[R2_GLOBALS._balloonAltitude].x < 0) {
+ _newAltitude += 8;
}
- if (balloonData[R2_GLOBALS._v56A99].v3 > 0) {
- _field424 += 48;
- } else if (balloonData[R2_GLOBALS._v56A99].v3 < 0) {
- _field424 += 208;
+ if (balloonData[R2_GLOBALS._balloonAltitude].v3 > 0) {
+ _newAltitude += 48;
+ } else if (balloonData[R2_GLOBALS._balloonAltitude].v3 < 0) {
+ _newAltitude += 208;
}
- R2_GLOBALS._v56A99 = _field424;
- if (R2_GLOBALS._v56A99 == 189) {
+ R2_GLOBALS._balloonAltitude = _newAltitude;
+ if (R2_GLOBALS._balloonAltitude == 189) {
+ // Finally reached landing point
_sceneMode = 12;
R2_GLOBALS._player.disableControl();
@@ -5155,5 +5174,11 @@ void Scene2900::dispatch() {
Scene::dispatch();
}
+void Scene2900::refreshBackground(int xAmount, int yAmount) {
+ SceneExt::refreshBackground(xAmount, yAmount);
+
+ _map.redraw();
+}
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h
index 55c3d55365..a4d309960c 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.h
@@ -701,6 +701,8 @@ class Scene2900 : public SceneExt {
private:
void moveArea(Rect &r, int xAmt, int yAmt);
void moveLine(int xpSrc, int ypSrc, int xpDest, int ypDest, int width);
+ int adjustRect(Common::Rect &r1, const Common::Rect &r2);
+ void drawBlock(const byte *data, int xp, int yp, const Rect &r1, const Rect &r2);
public:
int _mapWidth, _mapHeight;
int _field4;
@@ -709,14 +711,13 @@ class Scene2900 : public SceneExt {
int _fieldA;
int _resNum;
int _xV, _yV;
- Rect _rect;
+ Rect _bounds;
Map();
void load(int resNum);
- Common::Point setPosition(const Common::Point &pos, int v3 = 0);
+ Common::Point setPosition(const Common::Point &pos, bool initialFlag = false);
void synchronize(Serializer &s);
- int adjustRect(Common::Rect &r1, const Common::Rect &r2);
- void drawBlock(const byte *data, int xp, int yp, const Rect &r1, const Rect &r2);
+ void redraw(Rect *updateRect = NULL);
};
public:
SceneObject _leftEdge;
@@ -734,17 +735,17 @@ public:
Map _map;
int _field412;
- int _field414;
- int _field416;
+ bool _altitudeChanging;
+ bool _field416;
int _field41C;
- int _field41E;
+ int _altitudeMajorChange;
Common::Point _offsetPos;
Common::Point _pos;
- int _field424;
+ int _newAltitude;
int _field425;
int _field426;
int _field427;
- int _field8F8;
+ bool _field8F8;
Scene2900();
virtual void synchronize(Serializer &s);
@@ -752,6 +753,7 @@ public:
virtual void remove();
virtual void signal();
virtual void dispatch();
+ virtual void refreshBackground(int xAmount, int yAmount);
};
} // End of namespace Ringworld2