From 5ba9f831a0e7a7f11b1d9b20e6e00bf41d0a7137 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 29 Jun 2013 10:47:37 -0400 Subject: TSAGE: Beginnings of implementing R2R maze UI --- engines/tsage/ringworld2/ringworld2_logic.cpp | 94 +++++++++++++++++++------ engines/tsage/ringworld2/ringworld2_logic.h | 50 +++++++------ engines/tsage/ringworld2/ringworld2_scenes1.cpp | 2 +- engines/tsage/ringworld2/ringworld2_scenes1.h | 2 +- engines/tsage/ringworld2/ringworld2_scenes3.cpp | 12 ++-- engines/tsage/ringworld2/ringworld2_scenes3.h | 2 +- 6 files changed, 110 insertions(+), 52 deletions(-) (limited to 'engines') diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 67af65c08a..65030bed31 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -21,6 +21,7 @@ */ #include "common/config-manager.h" +#include "tsage/graphics.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" @@ -270,7 +271,7 @@ Scene *Ringworld2Game::createScene(int sceneNumber) { // Confrontation return new Scene3400(); case 3500: - // Maze action scene + // Maze action sequencec return new Scene3500(); case 3600: // Cutscene - walking at gunpoint @@ -1274,14 +1275,19 @@ void SceneAreaObject::setDetails(int resNum, int lookLineNum, int talkLineNum, i /*****************************************************************************/ -UnkObject1200::UnkObject1200() { +MazeUI::MazeUI() { _field16 = _field3A = NULL; _field12 = _field14 = 0; - _field26 = _field28 = _field2A = _field2C = _field2E = _field30 = 0; - _field32 = _field34 = _field36 = _field38 = _field3E = _field40 = 0; + _field26 = _field28 = _width = _height = _field2E = _field30 = 0; + _resNum = _field34 = _field36 = _field38 = _field3E = _field40 = 0; } -void UnkObject1200::synchronize(Serializer &s) { +MazeUI::~MazeUI() { + DEALLOCATE(_field16); + DEALLOCATE(_field3A); +} + +void MazeUI::synchronize(Serializer &s) { SavedObject::synchronize(s); _rect1.synchronize(s); @@ -1293,11 +1299,11 @@ void UnkObject1200::synchronize(Serializer &s) { s.syncAsSint16LE(_field14); s.syncAsSint16LE(_field26); s.syncAsSint16LE(_field28); - s.syncAsSint16LE(_field2A); - s.syncAsSint16LE(_field2C); + s.syncAsSint16LE(_width); + s.syncAsSint16LE(_height); s.syncAsSint16LE(_field2E); s.syncAsSint16LE(_field30); - s.syncAsSint16LE(_field32); + s.syncAsSint16LE(_resNum); s.syncAsSint16LE(_field34); s.syncAsSint16LE(_field36); s.syncAsSint16LE(_field38); @@ -1305,16 +1311,58 @@ void UnkObject1200::synchronize(Serializer &s) { s.syncAsSint16LE(_field40); } -void UnkObject1200::sub51AE9(int arg1) { - warning("STUB: UnkObject1200::sub51AE9()"); +void MazeUI::load(int resNum) { + clear(); + _resNum = resNum; + + const byte *header = g_resourceManager->getResource(RT17, resNum, 0); + + _field34 = resNum + 1000; + _field26 = READ_LE_UINT16(header + 2); + _field28 = READ_LE_UINT16(header + 4); + _field36 = 10; + _field38 = _field36 << 3; + + Visage visage; + visage.setVisage(_field34, 1); + + GfxSurface frame = visage.getFrame(2); + _width = frame.getBounds().width(); + _height = frame.getBounds().height(); + + _field16 = ALLOCATE(_field26 * _field28 * 2); + const byte *res = g_resourceManager->getResource(RT17, resNum, 1); + Common::copy(res, res + (_field26 * _field28 * 2), _field16); + + _field30 = _field2E = 0; + _field12 = (_rect1.width() + _width - 1) / _width; + _field14 = (_rect1.height() + _height - 1) / _height; + + _field3E = (_field12 + 1) * _width; + _field3A = ALLOCATE(_field3E * _height); + + _rect2 = Rect(0, 0, _width * _field26, _height * _field28); +} + +void MazeUI::clear() { + if (!_resNum) + _resNum = 1; + + if (_field16) + DEALLOCATE(_field16); + _field16 = NULL; + + DEALLOCATE(_field3A); + _field3A = NULL; + } -int UnkObject1200::sub51AF8(Common::Point pt) { +int MazeUI::sub51AF8(Common::Point pt) { if (!_rect1.contains(pt)) return -1; - int tmp1 = (pt.x - _rect1.left + _field2E) / _field2A; - int tmp2 = (pt.y - _rect1.top + _field30) / _field2C; + int tmp1 = (pt.x - _rect1.left + _field2E) / _width; + int tmp2 = (pt.y - _rect1.top + _field30) / _height; if ((tmp1 >= 0) && (tmp2 >= 0) && (_field26 > tmp1) && (_field28 > tmp2)) return _field16[(((_field26 * tmp2) + tmp1)* 2)]; @@ -1322,7 +1370,7 @@ int UnkObject1200::sub51AF8(Common::Point pt) { return -1; } -bool UnkObject1200::sub51AFD(Common::Point pt) { +bool MazeUI::sub51AFD(Common::Point pt) { int retval = false; _field2E = pt.x; @@ -1351,19 +1399,19 @@ bool UnkObject1200::sub51AFD(Common::Point pt) { return retval; } -void UnkObject1200::sub51B02() { - warning("STUB: UnkObject1200::sub51B02()"); +void MazeUI::sub51B02() { + warning("STUB: MazeUI::sub51B02()"); } -void UnkObject1200::sub9EDE8(Rect rect) { +void MazeUI::sub9EDE8(Rect rect) { _rect1 = rect; - warning("FIXME: UnkObject1200::sub9EDE8()"); + warning("FIXME: MazeUI::sub9EDE8()"); // _rect1.clip(g_globals->gfxManager()._bounds); } -int UnkObject1200::sub9EE22(int &arg1, int &arg2) { - arg1 /= _field2A; - arg2 /= _field2C; +int MazeUI::sub9EE22(int &arg1, int &arg2) { + arg1 /= _width; + arg2 /= _height; if ((arg1 >= 0) && (arg2 >= 0) && (_field26 > arg1) && (_field28 > arg2)) { return _field16[(((_field26 * arg2) + arg1) * 2)]; @@ -1372,6 +1420,10 @@ int UnkObject1200::sub9EE22(int &arg1, int &arg2) { return -1; } +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ + void Scene1200::sub9DAD6(int indx) { _object1.sub9EE22(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4); diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h index 0b573bf7f0..3ca1ba863e 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.h +++ b/engines/tsage/ringworld2/ringworld2_logic.h @@ -276,53 +276,57 @@ public: } }; -class SceneAreaObject: public SceneArea { - class Object1: public SceneActor { - public: - }; -public: - Object1 _object1; - int _insetCount; - - virtual void remove(); - virtual void process(Event &event); - void setDetails(int visage, int strip, int frameNumber, const Common::Point &pt); - void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum); -}; - -class UnkObject1200 : public SavedObject { +class MazeUI: public SavedObject { +private: + void clear(); public: Rect _rect1; Rect _rect2; - int *_field16; - int *_field3A; + byte *_field16; + byte *_field3A; int _field12; int _field14; int _field26; int _field28; - int _field2A; - int _field2C; + int _width; + int _height; int _field2E; int _field30; - int _field32; + int _resNum; int _field34; int _field36; int _field38; int _field3E; int _field40; +public: + MazeUI(); + ~MazeUI(); + void load(int resNum); - UnkObject1200(); + virtual Common::String getClassName() { return "MazeUI"; } void synchronize(Serializer &s); - void sub51AE9(int arg1); int sub51AF8(Common::Point pt); bool sub51AFD(Common::Point pt); void sub51B02(); void sub9EDE8(Rect rect); int sub9EE22(int &arg1, int &arg2); - virtual Common::String getClassName() { return "UnkObject1200"; } +}; + +class SceneAreaObject: public SceneArea { + class Object1: public SceneActor { + public: + }; +public: + Object1 _object1; + int _insetCount; + + virtual void remove(); + virtual void process(Event &event); + void setDetails(int visage, int strip, int frameNumber, const Common::Point &pt); + void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum); }; /*--------------------------------------------------------------------------*/ diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index af62ab6916..ba12a4b98f 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -1136,7 +1136,7 @@ void Scene1200::postInit(SceneObjectList *OwnerList) { tmpRect.set(110, 20, 210, 120); _object1.sub9EDE8(tmpRect); - _object1.sub51AE9(1); + _object1.load(1); _object1.sub51AFD(Common::Point(R2_GLOBALS._v56AA2, R2_GLOBALS._v56AA4)); warning("int unk = set_pane_p(_paneNumber);"); _object1.sub51B02(); diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h index f65a89972d..d1e55ef12b 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.h +++ b/engines/tsage/ringworld2/ringworld2_scenes1.h @@ -147,7 +147,7 @@ public: NamedHotspot _item1; SceneActor _actor1; Area1 _area1; - UnkObject1200 _object1; + MazeUI _object1; SequenceManager _sequenceManager; int _field412; diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp index 61711d0a4f..0e444a66bf 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp @@ -2888,6 +2888,7 @@ void Scene3400::signal() { * Scene 3500 - * *--------------------------------------------------------------------------*/ + Scene3500::Action1::Action1() { _field1E = 0; _field20 = 0; @@ -3046,16 +3047,16 @@ void Scene3500::Actor7::sub109693(Common::Point Pt) { } int Scene3500::UnkObject3500::sub1097C9(int arg1) { - return (_field2A / 2) + arg1 - (arg1 % _field2A); + return (_width / 2) + arg1 - (arg1 % _width); } int Scene3500::UnkObject3500::sub1097EF(int arg1) { - return (_field2C / 2) + arg1 - (arg1 % _field2C); + return (_height / 2) + arg1 - (arg1 % _height); } int Scene3500::UnkObject3500::sub109C09(Common::Point pt) { - int vx = pt.x / _field2A; - int vy = pt.y / _field2C; + int vx = pt.x / _width; + int vy = pt.y / _height; if ((vx >= 0) && (_field26 > vx) && (_field28 > vy)) { return _field16[((_field26 * vy) + vx) * 2]; @@ -3665,7 +3666,7 @@ void Scene3500::postInit(SceneObjectList *OwnerList) { tmpRect.set(160, 89, 299, 182); _unkObj1.sub9EDE8(tmpRect); - _unkObj1.sub51AE9(2); + _unkObj1.load(2); _unkObj1.sub51AFD(Common::Point(_field127A, _field127C)); _action1._field24 = 0; @@ -3787,6 +3788,7 @@ void Scene3500::process(Event &event) { void Scene3500::dispatch() { Rect tmpRect; Scene::dispatch(); + if (((_actor1._frame % 2) == 0) && (_action1._field24 == 0)) { _actor1.setFrame(_actor1.changeFrame()); _field1276 = _actor1._frame; diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.h b/engines/tsage/ringworld2/ringworld2_scenes3.h index 44787b9eef..ffad37d7ce 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.h +++ b/engines/tsage/ringworld2/ringworld2_scenes3.h @@ -633,7 +633,7 @@ class Scene3500 : public SceneExt { // TODO: double check if nothing specific is present, then remove this class }; - class UnkObject3500 : public UnkObject1200 { + class UnkObject3500 : public MazeUI { public: int sub1097C9(int arg1); int sub1097EF(int arg1); -- cgit v1.2.3