TSAGE: R2R - Implement scene 1800

This commit is contained in:
Strangerke 2012-01-20 19:03:12 +01:00
parent 00a9d394a5
commit 69a2c72c47
3 changed files with 579 additions and 0 deletions

View File

@ -129,7 +129,9 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
case 1700:
return new Scene1700();
case 1750:
error("Missing scene %d from group 1", sceneNumber);
case 1800:
return new Scene1800();
case 1850:
case 1875:
case 1900:

View File

@ -5640,5 +5640,529 @@ void Scene1700::signal() {
}
}
/*--------------------------------------------------------------------------
* Scene 1800 -
*
*--------------------------------------------------------------------------*/
Scene1800::Scene1800() {
_field412 = 0;
}
void Scene1800::synchronize(Serializer &s) {
SceneExt::synchronize(s);
s.syncAsSint16LE(_field412);
}
bool Scene1800::Hotspot5::startAction(CursorType action, Event &event) {
if ((action != R2_9) && (action != R2_39))
return false;
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS._v565F6 == 1201) {
scene->_stripManager.start(548, this);
} else if (R2_GLOBALS.getFlag(66)) {
return false;
} else {
scene->_stripManager.start(546, this);
}
} else {
if (R2_GLOBALS._v565F6 == 1201) {
scene->_stripManager.start(549, this);
} else if (R2_GLOBALS.getFlag(66)) {
return false;
} else {
scene->_stripManager.start(547, this);
}
}
R2_GLOBALS.setFlag(66);
return true;
}
bool Scene1800::Actor6::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
if (!R2_GLOBALS.getFlag(14))
return false;
if (R2_GLOBALS._player._characterIndex != R2_QUINN)
return SceneActor::startAction(action, event);
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
R2_GLOBALS._player.disableControl();
if (_frame == 1) {
R2_GLOBALS.setFlag(64);
scene->_sceneMode = 1810;
scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL);
} else {
R2_GLOBALS.clearFlag(64);
scene->_sceneMode = 1811;
scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL);
}
return true;
}
bool Scene1800::Actor7::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
R2_GLOBALS._player.disableControl();
if (scene->_field412 >= 2) {
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 1809;
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
} else {
scene->_sceneMode = 1808;
scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_actor7, NULL);
R2_GLOBALS.setFlag(14);
}
} else {
scene->_sceneMode = 1813;
scene->setAction(&scene->_sequenceManager, scene, 1813, &R2_GLOBALS._player, NULL);
}
} else if (R2_GLOBALS.getFlag(14)) {
return SceneActor::startAction(action, event);
} else {
R2_GLOBALS._player.disableControl();
scene->_sceneMode = 1812;
scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL);
}
return true;
}
bool Scene1800::Actor8::startAction(CursorType action, Event &event) {
if (action != CURSOR_USE)
return SceneActor::startAction(action, event);
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
if (_position.x < 160) {
if (scene->_actor4._frame == 1) {
return SceneActor::startAction(action, event);
} else {
R2_GLOBALS.setFlag(29);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 1804;
scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL);
} else {
scene->_sceneMode = 1;
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
}
} else {
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 1;
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
} else {
scene->_sceneMode = 1805;
scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL);
}
}
}
} else {
if (scene->_actor4._frame == 1) {
return SceneActor::startAction(action, event);
} else {
R2_GLOBALS.clearFlag(29);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 2;
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
} else {
scene->_sceneMode = 1806;
scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL);
}
} else {
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 2;
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
} else {
scene->_sceneMode = 1807;
scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL);
}
}
}
}
return true;
}
void Scene1800::Exit1::changeScene() {
Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
_enabled = false;
R2_GLOBALS._events.setCursor(CURSOR_ARROW);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS.getFlag(14)) {
scene->_sceneMode = 3;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL);
else
scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_actor2, &scene->_actor7, NULL);
R2_GLOBALS.clearFlag(14);
} else {
scene->_sceneMode = 1802;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL);
else
scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL);
}
}
void Scene1800::postInit(SceneObjectList *OwnerList) {
loadScene(1800);
SceneExt::postInit();
R2_GLOBALS._sound1.play(116);
_stripManager.addSpeaker(&_quinnSpeaker);
_stripManager.addSpeaker(&_seekerSpeaker);
if (R2_GLOBALS._sceneManager._previousScene == -1)
R2_GLOBALS._v565F6 = 1201;
if (R2_GLOBALS._v565F6 == 1201)
_field412 = 2;
else
_field412 = 0;
scalePalette(65, 65, 65);
_exit1.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
_item5.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL);
_actor6.postInit();
_actor6.setup(1801, 4, 1);
_actor6.setPosition(Common::Point(170, 24));
_actor6.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL);
_actor7.postInit();
_actor7.setup(1801, 3, 1);
_actor7.setPosition(Common::Point(160, 139));
_actor7.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
_actor8.postInit();
_actor8.setup(1800, 1, 1);
_actor8.setPosition(Common::Point(110, 78));
_actor8.fixPriority(135);
_actor8.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
_actor9.postInit();
_actor9.setup(1800, 2, 1);
_actor9.setPosition(Common::Point(209, 78));
_actor9.fixPriority(135);
_actor9.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
_actor4.postInit();
if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64)))
_actor4.setup(1801, 2, 1);
else
_actor4.setup(1801, 2, 10);
_actor4.setPosition(Common::Point(76, 142));
_actor4.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
_actor5.postInit();
if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64)))
_actor5.setup(1801, 1, 1);
else
_actor5.setup(1801, 1, 10);
_actor5.setPosition(Common::Point(243, 142));
_actor5.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
R2_GLOBALS._player.postInit();
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS.getFlag(14)) {
R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
R2_GLOBALS._player.setObjectWrapper(NULL);
R2_GLOBALS._player.setup(1801, 5, 12);
R2_GLOBALS._player.setPosition(Common::Point(160, 139));
R2_GLOBALS._walkRegions.enableRegion(9);
_actor7.hide();
} else {
R2_GLOBALS._player.setVisage(1507);
}
R2_GLOBALS._player._moveDiff = Common::Point(4, 2);
} else {
R2_GLOBALS._player.setVisage(1503);
R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
}
_actor2.postInit();
_actor2.animate(ANIM_MODE_1, NULL);
_actor2.setObjectWrapper(new SceneObjectWrapper());
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
if (R2_GLOBALS.getFlag(14)) {
_actor2.animate(ANIM_MODE_NONE, NULL);
_actor2.setObjectWrapper(NULL);
_actor2.setup(1801, 5, 12);
R2_GLOBALS._walkRegions.enableRegion(9);
_actor7.hide();
} else {
_actor2.setup(1507, 1, 1);
_actor2.setPosition(Common::Point(180, 160));
}
_actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
_actor2._moveDiff = Common::Point(4, 2);
} else {
_actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
_actor2.setVisage(1503);
_actor2._moveDiff = Common::Point(2, 2);
}
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._player.setPosition(Common::Point(114, 150));
R2_GLOBALS._player.setStrip(5);
if (R2_GLOBALS.getFlag(14)) {
_actor2.setPosition(Common::Point(160, 139));
R2_GLOBALS._walkRegions.enableRegion(8);
} else {
_actor2.setPosition(Common::Point(209, 150));
_actor2.setStrip(6);
R2_GLOBALS._walkRegions.enableRegion(8);
}
} else {
if (R2_GLOBALS.getFlag(14)) {
R2_GLOBALS._player.setup(1801, 5, 12);
R2_GLOBALS._player.setPosition(Common::Point(160, 139));
} else {
R2_GLOBALS._player.setPosition(Common::Point(209, 150));
R2_GLOBALS._player.setStrip(6);
}
_actor2.setPosition(Common::Point(114, 150));
_actor2.setStrip(5);
R2_GLOBALS._walkRegions.enableRegion(10);
R2_GLOBALS._walkRegions.enableRegion(11);
}
} else {
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
R2_GLOBALS._player.setPosition(Common::Point(140, 160));
_actor2.setPosition(Common::Point(180, 160));
} else {
R2_GLOBALS._player.setPosition(Common::Point(180, 160));
_actor2.setPosition(Common::Point(140, 160));
}
}
_actor1.postInit();
_actor1.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_actor1.setVisage(1111);
else
_actor1.setVisage(1110);
_actor1._effect = 5;
_actor1._field9C = _field312;
R2_GLOBALS._player._linkedActor = &_actor1;
_actor3.postInit();
_actor3.fixPriority(10);
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
_actor3.setVisage(1110);
else
_actor3.setVisage(1111);
_actor3._effect = 5;
_actor3._field9C = _field312;
_actor2._linkedActor = &_actor3;
R2_GLOBALS._player._characterScene[1] = 1800;
R2_GLOBALS._player._characterScene[2] = 1800;
_item2.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
_item1.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
// Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL);
// This is *wrong*. The following statement is a wild guess based on good common sense
_item3.setDetails(11, 1800, 23, 24, 25);
_item4.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
R2_GLOBALS._player.disableControl();
if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
R2_GLOBALS._player.enableControl(CURSOR_USE);
R2_GLOBALS._player._canWalk = false;
} else {
R2_GLOBALS._player.enableControl(CURSOR_ARROW);
}
} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
if (R2_GLOBALS.getFlag(29)) {
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
_sceneMode = 1814;
setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
} else {
_sceneMode = 1815;
setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
}
} else {
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
_sceneMode = 1816;
setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
} else {
_sceneMode = 1817;
setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
}
}
} else {
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
_sceneMode = 1800;
setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_actor2, NULL);
} else {
_sceneMode = 1801;
setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_actor2, NULL);
}
}
R2_GLOBALS._player._oldCharacterScene[1] = 1800;
R2_GLOBALS._player._oldCharacterScene[2] = 1800;
}
void Scene1800::signal() {
switch (_sceneMode) {
case 1:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
_sceneMode = 1804;
setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
} else {
_sceneMode = 1805;
setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_actor2, &_actor8, NULL);
}
break;
case 2:
if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
_sceneMode = 1806;
setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
} else {
_sceneMode = 1807;
setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_actor2, &_actor9, NULL);
}
break;
case 3:
_sceneMode = 1802;
if (R2_GLOBALS._player._characterIndex == R2_QUINN)
setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_actor2, NULL);
else
setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_actor2, NULL);
break;
case 10:
// No break on purpose
case 11:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
break;
case 12:
R2_GLOBALS._player.enableControl(CURSOR_TALK);
R2_GLOBALS._player._canWalk = false;
break;
case 13:
_sceneMode = 14;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
R2_GLOBALS._player.setup(1801, 7, 1);
R2_GLOBALS._player.animate(ANIM_MODE_8, NULL);
_stripManager.start(550, this);
break;
case 14:
_sceneMode = 15;
R2_GLOBALS._player.disableControl();
R2_GLOBALS._player.setup(1801, 6, 1);
R2_GLOBALS._player.animate(ANIM_MODE_6, this);
break;
case 15:
R2_GLOBALS._player.setup(1503, 4, 1);
R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
R2_GLOBALS._player.enableControl(CURSOR_USE);
break;
case 1800:
R2_GLOBALS._walkRegions.enableRegion(8);
if (R2_GLOBALS.getFlag(63))
R2_GLOBALS._player.enableControl(CURSOR_USE);
else {
_sceneMode = 10;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
_stripManager.start(544, this);
}
break;
case 1801:
R2_GLOBALS._walkRegions.enableRegion(10);
R2_GLOBALS._walkRegions.enableRegion(11);
R2_GLOBALS.setFlag(63);
// The following check is completely dumb.
// Either an original bug, or dead code.
if (R2_GLOBALS.getFlag(63)) {
R2_GLOBALS._player.enableControl(CURSOR_ARROW);
} else {
_sceneMode = 10;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
_stripManager.start(545, this);
}
break;
case 1802:
R2_GLOBALS.clearFlag(14);
R2_GLOBALS._sceneManager.changeScene(1700);
break;
case 1804:
// No break on purpose
case 1805:
// No break on purpose
case 1806:
// No break on purpose
case 1807:
R2_GLOBALS.clearFlag(14);
R2_GLOBALS._sceneManager.changeScene(1850);
break;
case 1808:
_sceneMode = 12;
R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
_stripManager.start(553, this);
break;
case 1812:
_sceneMode = 13;
R2_GLOBALS._player.animate(ANIM_MODE_5, this);
break;
case 1814:
// No break on purpose
case 1815:
R2_GLOBALS._walkRegions.enableRegion(10);
R2_GLOBALS._walkRegions.enableRegion(11);
R2_GLOBALS._player.enableControl();
break;
case 1816:
// No break on purpose
case 1817:
R2_GLOBALS._walkRegions.enableRegion(8);
R2_GLOBALS._player.enableControl();
break;
default:
R2_GLOBALS._player.enableControl();
break;
}
}
void Scene1800::saveCharacter(int characterIndex) {
if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
R2_GLOBALS._sound1.fadeOut2(NULL);
SceneExt::saveCharacter(characterIndex);
}
} // End of namespace Ringworld2
} // End of namespace TsAGE

View File

@ -581,6 +581,59 @@ public:
virtual void remove();
virtual void signal();
};
class Scene1800 : public SceneExt {
class Hotspot5 : public NamedHotspot {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Actor6 : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Actor7 : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Actor8 : public SceneActor {
public:
virtual bool startAction(CursorType action, Event &event);
};
class Exit1 : public SceneExit {
public:
virtual void changeScene();
};
public:
int _field412;
SpeakerQuinn _quinnSpeaker;
SpeakerSeeker _seekerSpeaker;
NamedHotspot _item1;
NamedHotspot _item2;
NamedHotspot _item3;
NamedHotspot _item4;
Hotspot5 _item5;
SceneActor _actor1;
SceneActor _actor2;
SceneActor _actor3;
SceneActor _actor4;
SceneActor _actor5;
Actor6 _actor6;
Actor7 _actor7;
Actor8 _actor8;
Actor8 _actor9;
Exit1 _exit1;
SequenceManager _sequenceManager;
Scene1800();
void synchronize(Serializer &s);
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void signal();
virtual void saveCharacter(int characterIndex);
};
} // End of namespace Ringworld2
} // End of namespace TsAGE