/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TSAGE_RINGWORLD2_LOGIC_H #define TSAGE_RINGWORLD2_LOGIC_H #include "common/scummsys.h" #include "tsage/events.h" #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" namespace TsAGE { namespace Ringworld2 { using namespace TsAGE; #define R2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) class SceneFactory { public: static Scene *createScene(int sceneNumber); }; class SceneArea: public SceneItem { public: bool _enabled; bool _insideArea; CursorType _cursorNum; CursorType _savedCursorNum; int _cursorState; public: SceneArea(); void setDetails(const Rect &bounds, CursorType cursor); virtual Common::String getClassName() { return "SceneArea"; } virtual void synchronize(Serializer &s); virtual void remove(); virtual void process(Event &event); virtual bool startAction(CursorType action, Event &event) { return false; } virtual void doAction(int action) {} }; class SceneExit: public SceneArea { public: bool _moving; int _sceneNumber; Common::Point _destPos; public: SceneExit(); virtual void setDetails(const Rect &bounds, CursorType cursor, int sceneNumber); virtual void setDest(const Common::Point &p) { _destPos = p; } virtual void changeScene(); virtual void synchronize(Serializer &s); virtual void process(Event &event); }; class SceneExt: public Scene { private: static void startStrip(); static void endStrip(); public: byte _shadowPaletteMap[256]; bool _savedPlayerEnabled; bool _savedUiEnabled; bool _savedCanWalk; bool _preventSaving; Visage _cursorVisage; SynchronizedList _sceneAreas; public: SceneExt(); virtual Common::String getClassName() { return "SceneExt"; } virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void remove(); virtual void process(Event &event); virtual void dispatch(); virtual void refreshBackground(int xAmount, int yAmount); virtual void saveCharacter(int characterIndex); virtual void restore() {} bool display(CursorType action, Event &event); void fadeOut(); void clearScreen(); void scalePalette(int RFactor, int GFactor, int BFactor); void loadBlankScene(); }; class SceneHandlerExt: public SceneHandler { public: virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void process(Event &event); virtual void postLoad(int priorSceneBeforeLoad, int currentSceneBeforeLoad); void setupPaletteMaps(); }; class DisplayHotspot : public SceneObject { private: Common::Array _actions; bool performAction(int action); public: DisplayHotspot(int regionId, ...); virtual void doAction(int action) { if (!performAction(action)) SceneHotspot::doAction(action); } }; class DisplayObject : public SceneObject { private: Common::Array _actions; bool performAction(int action); public: DisplayObject(int firstAction, ...); virtual void doAction(int action) { if (!performAction(action)) SceneHotspot::doAction(action); } }; class SceneObjectExt : public SceneObject { public: int _state; virtual void synchronize(Serializer &s) { SceneObject::synchronize(s); s.syncAsSint16LE(_state); } virtual Common::String getClassName() { return "SceneObjectExt"; } }; /*--------------------------------------------------------------------------*/ class Ringworld2InvObjectList : public InvObjectList { private: static bool SelectItem(int objectNumber); static void selectDefault(int obectNumber); public: InvObject _none; InvObject _optoDisk; InvObject _reader; InvObject _negatorGun; InvObject _steppingDisks; InvObject _attractorUnit; InvObject _sensorProbe; InvObject _sonicStunner; InvObject _cableHarness; InvObject _comScanner; InvObject _spentPowerCapsule; // 10 InvObject _chargedPowerCapsule; InvObject _aerosol; InvObject _remoteControl; InvObject _opticalFibre; InvObject _clamp; InvObject _attractorHarness; InvObject _fuelCell; InvObject _gyroscope; InvObject _airbag; InvObject _rebreatherTank; // 20 InvObject _reserveTank; InvObject _guidanceModule; InvObject _thrusterValve; InvObject _balloonBackpack; InvObject _radarMechanism; InvObject _joystick; InvObject _ignitor; InvObject _diagnosticsDisplay; InvObject _glassDome; InvObject _wickLamp; // 30 InvObject _scrithKey; InvObject _tannerMask; InvObject _pureGrainAlcohol; InvObject _blueSapphire; InvObject _ancientScrolls; InvObject _flute; InvObject _gunpowder; InvObject _unused; InvObject _comScanner2; InvObject _superconductorWire; // 40 InvObject _pillow; InvObject _foodTray; InvObject _laserHacksaw; InvObject _photonStunner; InvObject _battery; InvObject _soakedFaceMask; InvObject _lightBulb; InvObject _alcoholLamp1; InvObject _alcoholLamp2; InvObject _alocholLamp3; // 50 InvObject _brokenDisplay; InvObject _toolbox; Ringworld2InvObjectList(); void reset(); void setObjectScene(int objectNum, int sceneNumber); virtual Common::String getClassName() { return "Ringworld2InvObjectList"; } }; #define RING2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) class Ringworld2Game: public Game { public: virtual void start(); virtual void restartGame(); virtual void restart(); virtual void endGame(int resNum, int lineNum); virtual Scene *createScene(int sceneNumber); virtual void processEvent(Event &event); virtual void rightClick(); virtual bool canSaveGameStateCurrently(); virtual bool canLoadGameStateCurrently(); }; class NamedHotspot : public SceneHotspot { public: NamedHotspot(); virtual bool startAction(CursorType action, Event &event); virtual Common::String getClassName() { return "NamedHotspot"; } }; class NamedHotspotExt : public NamedHotspot { public: int _flag; NamedHotspotExt() { _flag = 0; } virtual Common::String getClassName() { return "NamedHotspot"; } virtual void synchronize(Serializer &s) { NamedHotspot::synchronize(s); s.syncAsSint16LE(_flag); } }; class SceneActor: public SceneObject { public: virtual Common::String getClassName() { return "SceneActor"; } virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void remove(); virtual bool startAction(CursorType action, Event &event); virtual GfxSurface getFrame(); }; class SceneActorExt: public SceneActor { public: int _state; SceneActorExt() { _state = 0; } virtual Common::String getClassName() { return "SceneActorExt"; } virtual void synchronize(Serializer &s) { SceneActor::synchronize(s); s.syncAsSint16LE(_state); } }; enum MazeDirection { MAZEDIR_NONE = 0, MAZEDIR_NORTH = 1, MAZEDIR_NORTHEAST = 2, MAZEDIR_EAST = 3, MAZEDIR_SOUTHEAST = 4, MAZEDIR_SOUTH = 5, MAZEDIR_SOUTHWEST = 6, MAZEDIR_WEST = 7, MAZEDIR_NORTHWEST = 8 }; class MazeUI: public SceneObject { private: void clear(); public: // The dimensions (in cells) of the entire maze map Rect _mapBounds; // Encoded cell map specifying the features of the maze byte *_mapData; // Image surface used to store a line of the map for rendering GfxSurface _mapImage; Common::Point _cellsVisible; Common::Point _mapCells; Common::Point _cellSize; Common::Point _mapOffset; int _resNum; int _cellsResNum; int _frameCount; int _resCount; int _mapImagePitch; int _unused; public: MazeUI(); virtual ~MazeUI(); void setDisplayBounds(const Rect &r); bool setMazePosition(const Common::Point &pt); void load(int resNum); int getCellFromPixelXY(const Common::Point &pt); int getCellFromCellXY(const Common::Point &p); int pixelToCellXY(Common::Point &pt); virtual Common::String getClassName() { return "MazeUI"; } void synchronize(Serializer &s); virtual void reposition(); virtual void draw(); }; 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 AnimationSlice { public: int _sliceOffset; int _drawMode; int _secondaryIndex; public: void load(Common::File &f); }; class AnimationSlices { public: int _dataSize; int _dataSize2; AnimationSlice _slices[4]; byte *_pixelData; public: AnimationSlices(); ~AnimationSlices(); void load(Common::File &f); int loadPixels(Common::File &f, int slicesSize); }; class AnimationPlayerSubData { public: int _duration; int _frameRate; int _framesPerSlices; int _drawType; int _sliceSize; int _ySlices; int _field16; int _palStart; int _palSize; byte _palData[256 * 3]; int32 _totalSize; AnimationSlices _slices; public: void load(Common::File &f); }; class AnimationData { public: AnimationSlices _slices; int _dataSize; int _animSlicesSize; }; enum AnimationPaletteMode { ANIMPALMODE_REPLACE_PALETTE = 0, ANIMPALMODE_CURR_PALETTE = 1, ANIMPALMODE_NONE = 2 }; enum AnimationObjectMode { ANIMOBJMODE_1 = 1, ANIMOBJMODE_2 = 2, ANIMOBJMODE_42 = 42 }; class AnimationPlayer: public EventHandler { private: void rleDecode(const byte *pSrc, byte *pDest, int size); void drawFrame(int sliceIndex); void nextSlices(); void getSlices(); public: AnimationData *_animData1, *_animData2; AnimationData *_sliceCurrent; AnimationData *_sliceNext; Common::File _resourceFile; Rect _rect1, _screenBounds; bool _animLoaded; bool _canSkip; AnimationPaletteMode _paletteMode; AnimationObjectMode _objectMode; int _sliceHeight; byte _palIndexes[256]; ScenePalette _palette; AnimationPlayerSubData _subData; Action *_endAction; int _dataNeeded; int _playbackTick; int _playbackTickPrior; int _position; int _nextSlicesPosition; uint _frameDelay; uint32 _gameFrame; public: AnimationPlayer(); ~AnimationPlayer(); virtual void synchronize(Serializer &s); virtual void remove(); virtual void process(Event &event); virtual void dispatch(); virtual void flipPane() {} virtual void changePane() {} virtual void closing() {} bool load(int animId, Action *endAction = NULL); bool isCompleted(); void close(); }; class AnimationPlayerExt: public AnimationPlayer { public: bool _isActive; public: AnimationPlayerExt(); virtual void synchronize(Serializer &s); }; class ModalWindow: public SceneArea { public: SceneActor _object1; int _insetCount; public: ModalWindow(); virtual void remove(); virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "ModalWindow"; } virtual void process(Event &event); virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); virtual void setup3(int resNum, int lookLineNum, int talkLineNum, int useLineNum); }; class ScannerDialog: public ModalWindow { class Button: public SceneActor { private: void reset(); public: int _buttonId; bool _buttonDown; public: Button(); void setup(int buttonId); virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "ScannerButton"; } virtual void process(Event &event); virtual bool startAction(CursorType action, Event &event); }; class Slider: public SceneActor { private: void update(); public: int _initial; int _xStart; int _yp; int _width; int _xInc; bool _sliderDown; public: Slider(); void setup(int initial, int xStart, int yp, int width, int xInc); virtual void synchronize(Serializer &s); virtual Common::String getClassName() { return "ScannerSlider"; } virtual void remove(); virtual void process(Event &event); virtual bool startAction(CursorType action, Event &event); }; public: Button _talkButton; Button _scanButton; Slider _slider; SceneActor _obj4; SceneActor _obj5; SceneActor _obj6; SceneActor _obj7; public: ScannerDialog(); virtual Common::String getClassName() { return "ScannerDialog"; } virtual void remove(); virtual void setup2(int visage, int stripFrameNum, int frameNum, int posX, int posY); }; } // End of namespace Ringworld2 } // End of namespace TsAGE #endif