TSAGE: Initial implementation of Scene #4025

This commit is contained in:
Paul Gilbert 2011-03-23 00:31:29 +11:00
parent 0e35331302
commit 71354fdf13
6 changed files with 397 additions and 3 deletions

View File

@ -110,6 +110,8 @@ Scene *SceneFactory::createScene(int sceneNumber) {
case 4000: return new Scene4000();
// Village - Outside Lander
case 4010: return new Scene4010();
// Village - Puzzle Board
case 4025: return new Scene4025();
/* Scene group 6 */

View File

@ -2378,7 +2378,7 @@ void Scene60::signal() {
_globals->_player._uiEnabled = true;
_globals->_events.setCursor(CURSOR_USE);
_gfxButton.setText(SCENE60_EXIT_MSG);
_gfxButton.setText(EXIT_MSG);
_gfxButton._bounds.centre(160, 193);
_gfxButton.draw();
_gfxButton._bounds.expandPanes();

View File

@ -1284,4 +1284,340 @@ void Scene4010::signal() {
_globals->_sceneManager.changeScene(4000);
}
/*--------------------------------------------------------------------------
* Scene 4025 - Village - Puzzle Board
*
*--------------------------------------------------------------------------*/
void Scene4025::Action1::signal() {
Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_armHotspot._strip = scene->_pegPtr->_armStrip;
scene->_armHotspot._frame = 4;
scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this);
if (scene->_pegPtr->_armStrip > 3) {
if (scene->_hole1._armStrip == scene->_pegPtr->_armStrip)
scene->_hole1._pegPtr = NULL;
if (scene->_hole2._armStrip == scene->_pegPtr->_armStrip)
scene->_hole2._pegPtr = NULL;
if (scene->_hole3._armStrip == scene->_pegPtr->_armStrip)
scene->_hole3._pegPtr = NULL;
if (scene->_hole4._armStrip == scene->_pegPtr->_armStrip)
scene->_hole4._pegPtr = NULL;
if (scene->_hole5._armStrip == scene->_pegPtr->_armStrip)
scene->_hole5._pegPtr = NULL;
}
break;
case 1:
scene->_pegPtr->flag100();
if (scene->_pegPtr2) {
if (scene->_pegPtr->_armStrip == 3)
scene->_pegPtr2->_strip = 2;
scene->_pegPtr2->setPosition(scene->_pegPtr->_position);
scene->_pegPtr2->unflag100();
scene->_pegPtr2->_armStrip = scene->_pegPtr->_armStrip;
}
scene->_pegPtr->_armStrip = 0;
scene->_pegPtr->setPosition(Common::Point(-10, -10));
scene->_pegPtr2 = scene->_pegPtr;
scene->_armHotspot.animate(ANIM_MODE_5, this);
break;
case 2:
_globals->_player._uiEnabled = true;
_globals->_events.setCursor(CURSOR_USE);
remove();
break;
}
}
void Scene4025::Action2::signal() {
Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
switch (_actionIndex++) {
case 0:
scene->_armHotspot._strip = scene->_holePtr->_armStrip;
scene->_armHotspot.animate(ANIM_MODE_4, 2, -1, this);
break;
case 1:
if (!scene->_pegPtr2) {
// Getting a peg
scene->_holePtr->_pegPtr->flag100();
scene->_pegPtr = scene->_holePtr->_pegPtr;
scene->_pegPtr->_armStrip = 0;
scene->_pegPtr->setPosition(Common::Point(-10, -10));
scene->_pegPtr2 = scene->_pegPtr;
scene->_pegPtr = NULL;
} else {
// Placing a peg
scene->_pegPtr2 = NULL;
if (scene->_holePtr->_pegPtr) {
scene->_holePtr->_pegPtr->flag100();
scene->_pegPtr2 = scene->_holePtr->_pegPtr;
}
assert(scene->_pegPtr);
scene->_pegPtr->setPosition(scene->_holePtr->_newPosition);
scene->_pegPtr->setStrip(1);
scene->_pegPtr->unflag100();
scene->_pegPtr->_armStrip = scene->_holePtr->_armStrip;
scene->_holePtr->_pegPtr = scene->_pegPtr;
scene->_pegPtr = scene->_pegPtr2;
}
scene->_armHotspot.animate(ANIM_MODE_5, this);
break;
case 2:
_globals->_player._uiEnabled = true;
_globals->_events.setCursor(CURSOR_USE);
remove();
break;
}
}
void Scene4025::Action3::signal() {
switch (_actionIndex++) {
case 0:
_globals->_player.disableControl();
_globals->_scenePalette.addRotation(64, 111, -1);
setDelay(120);
break;
case 1:
_globals->clearFlag(34);
_globals->_stripNum = 4025;
_globals->_sceneManager.changeScene(4000);
break;
}
}
/*--------------------------------------------------------------------------*/
void Scene4025::Hole::synchronise(Serialiser &s) {
SceneObject::synchronise(s);
SYNC_POINTER(_pegPtr);
s.syncAsSint16LE(_armStrip);
s.syncAsSint16LE(_newPosition.x);
s.syncAsSint16LE(_newPosition.y);
}
void Scene4025::Hole::doAction(int action) {
Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4025, 3);
break;
case CURSOR_USE:
if (!scene->_holePtr && !_pegPtr) {
setAction(&scene->_sequenceManager, scene, 4028, NULL);
} else {
_globals->_player.disableControl();
scene->_holePtr = this;
scene->setAction(&scene->_action2);
}
break;
case OBJECT_PEG:
if (!scene->_pegPtr2) {
_globals->_player.disableControl();
_globals->_events.setCursor(CURSOR_USE);
_globals->_inventory._peg._sceneNumber = 4025;
scene->_pegPtr = &scene->_peg5;
scene->_holePtr = this;
scene->_pegPtr->_armStrip = 0;
scene->_pegPtr2 = scene->_pegPtr;
scene->setAction(&scene->_action2);
} else {
scene->_sceneMode = 4027;
scene->setAction(&scene->_sequenceManager, scene, 4027, NULL);
}
break;
}
}
void Scene4025::Peg::synchronise(Serialiser &s) {
SceneObject::synchronise(s);
s.syncAsSint16LE(_field88);
SYNC_POINTER(_armStrip);
}
void Scene4025::Peg::doAction(int action) {
Scene4025 *scene = (Scene4025 *)_globals->_sceneManager._scene;
switch (action) {
case CURSOR_LOOK:
SceneItem::display2(4025, 1);
break;
case CURSOR_USE:
_globals->_player.disableControl();
scene->_pegPtr = this;
scene->setAction(&scene->_action1);
break;
}
}
/*--------------------------------------------------------------------------*/
void Scene4025::postInit(SceneObjectList *OwnerList) {
loadScene(4025);
Scene::postInit();
setZoomPercents(0, 100, 200, 100);
_globals->_events.setCursor(CURSOR_USE);
_pegPtr = _pegPtr2 = NULL;
_peg1.postInit();
_peg1._field88 = 1;
_peg1.setVisage(4025);
_peg1.setStrip(2);
_peg1.setFrame(1);
_peg1.setPosition(Common::Point(203, 61));
_peg2.postInit();
_peg2._field88 = 4;
_peg2.setVisage(4025);
_peg2.setStrip(2);
_peg2.setFrame(2);
_peg2.setPosition(Common::Point(195, 57));
_peg3.postInit();
_peg3._field88 = 0;
_peg3.setVisage(4025);
_peg3.setStrip(2);
_peg3.setFrame(3);
_peg3.setPosition(Common::Point(202, 66));
_peg4.postInit();
_peg4._field88 = 3;
_peg4.setVisage(4025);
_peg4.setStrip(2);
_peg4.setFrame(4);
_peg4.setPosition(Common::Point(194, 68));
_peg5.postInit();
_peg5._field88 = 2;
_peg5.setVisage(4025);
_peg5.setStrip(1);
_peg5.setFrame(5);
_peg5.flag100();
_hole1.postInit();
_hole1.setVisage(4025);
_hole1.setStrip(1);
_hole1.setFrame2(6);
_hole1.setPosition(Common::Point(123, 51));
_hole1._pegPtr = NULL;
_hole1._newPosition = Common::Point(123, 44);
_hole1._armStrip = 8;
_hole2.postInit();
_hole2.setVisage(4025);
_hole2.setStrip(1);
_hole2.setFrame2(7);
_hole2.setPosition(Common::Point(167, 51));
_hole2._pegPtr = NULL;
_hole2._newPosition = Common::Point(166, 44);
_hole2._armStrip = 7;
_hole3.postInit();
_hole3.setVisage(4025);
_hole3.setStrip(1);
_hole3.setFrame2(8);
_hole3.setPosition(Common::Point(145, 69));
_hole3._pegPtr = NULL;
_hole3._newPosition = Common::Point(145, 60);
_hole3._armStrip = 6;
_hole4.postInit();
_hole4.setVisage(4025);
_hole4.setStrip(1);
_hole4.setFrame2(6);
_hole4.setPosition(Common::Point(123, 87));
_hole4._pegPtr = NULL;
_hole4._newPosition = Common::Point(123, 80);
_hole4._armStrip = 5;
_hole5.postInit();
_hole5.setVisage(4025);
_hole5.setStrip(1);
_hole5.setFrame2(10);
_hole5.setPosition(Common::Point(167, 87));
_hole5._pegPtr = NULL;
_hole5._newPosition = Common::Point(166, 80);
_hole5._armStrip = 4;
_hole1.setPriority2(1);
_hole2.setPriority2(1);
_hole3.setPriority2(1);
_hole4.setPriority2(1);
_hole5.setPriority2(1);
_armHotspot.postInit();
_armHotspot.setVisage(4025);
_armHotspot.setPosition(Common::Point(190, 161));
_armHotspot.setStrip(3);
_armHotspot.setFrame(4);
_globals->_sceneItems.addItems(&_hole1, &_hole2, &_hole3, &_hole4, &_hole5,
&_peg1, &_peg2, &_peg3, &_peg4, &_peg5, NULL);
_globals->_player._uiEnabled = true;
_globals->_player.disableControl();
setAction(&_sequenceManager, this, 4026, NULL);
}
void Scene4025::synchronise(Serialiser &s) {
Scene::synchronise(s);
SYNC_POINTER(_pegPtr);
SYNC_POINTER(_pegPtr2);
SYNC_POINTER(_holePtr);
}
void Scene4025::remove() {
_globals->_scenePalette.clearListeners();
Scene::remove();
}
void Scene4025::signal() {
if (_sceneMode != 4027) {
if (_sceneMode != 4028) {
_gfxButton.setText(EXIT_MSG);
_gfxButton._bounds.centre(144, 107);
_gfxButton.draw();
_gfxButton._bounds.expandPanes();
}
_globals->_player._uiEnabled = true;
}
_globals->_events.setCursor(CURSOR_USE);
}
void Scene4025::process(Event &event) {
Scene::process(event);
if (_gfxButton.process(event)) {
if (_globals->_inventory._peg._sceneNumber == 4025)
_globals->_inventory._peg._sceneNumber = 1;
_globals->_sceneManager.changeScene(4000);
}
}
void Scene4025::dispatch() {
if ((_peg1._armStrip == 7) && (_peg2._armStrip == 4) && (_peg3._armStrip == 8) &&
(_peg4._armStrip == 5) && (_peg5._armStrip == 6))
setAction(&_action3);
Scene::dispatch();
}
} // End of namespace tSage

View File

@ -198,6 +198,62 @@ public:
virtual void signal();
};
class Scene4025: public Scene {
/* Custom classes */
class Peg;
class Hole: public SceneObject {
public:
Peg *_pegPtr;
int _armStrip;
Common::Point _newPosition;
virtual void synchronise(Serialiser &s);
virtual void doAction(int action);
};
class Peg: public SceneObject {
public:
int _field88;
int _armStrip;
Peg(): SceneObject() { _field88 = 0; _armStrip = 3; }
virtual void synchronise(Serialiser &s);
virtual void doAction(int action);
};
/* Actions */
class Action1: public Action {
public:
virtual void signal();
};
class Action2: public Action {
public:
virtual void signal();
};
class Action3: public Action {
public:
virtual void signal();
};
public:
SequenceManager _sequenceManager;
GfxButton _gfxButton;
SceneObject _armHotspot;
Hole _hole1, _hole2, _hole3, _hole4, _hole5;
Peg _peg1, _peg2, _peg3, _peg4, _peg5;
Action1 _action1;
Action2 _action2;
Action3 _action3;
Peg *_pegPtr, *_pegPtr2;
Hole *_holePtr;
virtual void postInit(SceneObjectList *OwnerList = NULL);
virtual void synchronise(Serialiser &s);
virtual void remove();
virtual void signal();
virtual void process(Event &event);
virtual void dispatch();
};
} // End of namespace tSage
#endif

View File

@ -99,7 +99,7 @@ const char *PICK_BTN_STRING = "Pick";
const char *START_PLAY_BTN_STRING = " Start Play ";
const char *INTRODUCTION_BTN_STRING = "Introduction";
const char *SCENE60_EXIT_MSG = " EXIT ";
const char *EXIT_MSG = " EXIT ";
const char *SCENE6100_CAREFUL = "Be careful! The probe cannot handle too much of that.";
const char *SCENE6100_TOUGHER = "Hey! This is tougher than it looks!";
const char *SCENE6100_ONE_MORE_HIT = "You had better be more careful. One more hit like that \

View File

@ -66,7 +66,7 @@ extern const char *START_PLAY_BTN_STRING;
extern const char *INTRODUCTION_BTN_STRING;
// Scene specific resources
extern const char *SCENE60_EXIT_MSG;
extern const char *EXIT_MSG;
extern const char *SCENE6100_CAREFUL;
extern const char *SCENE6100_TOUGHER;
extern const char *SCENE6100_ONE_MORE_HIT;