diff options
author | Marisa-Chan | 2014-06-13 21:43:04 +0700 |
---|---|---|
committer | Marisa-Chan | 2014-06-13 21:43:04 +0700 |
commit | 45589950c0fb1a449351e6a00ef10d42290d8bae (patch) | |
tree | 44e4eedcb7e69d5fc386155b000ed038af07251d /engines/bbvs/bbvs.h | |
parent | 48360645dcd5f8fddb135b6e31ae5cae4be8d77f (diff) | |
parent | 5c005ad3a3f1df0bc968c85c1cf0fc48e36ab0b2 (diff) | |
download | scummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.tar.gz scummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.tar.bz2 scummvm-rg350-45589950c0fb1a449351e6a00ef10d42290d8bae.zip |
Merge remote-tracking branch 'upstream/master' into zvision
Conflicts:
engines/zvision/animation/rlf_animation.cpp
engines/zvision/animation_control.h
engines/zvision/core/console.cpp
engines/zvision/core/events.cpp
engines/zvision/cursors/cursor.cpp
engines/zvision/cursors/cursor_manager.cpp
engines/zvision/cursors/cursor_manager.h
engines/zvision/fonts/truetype_font.cpp
engines/zvision/graphics/render_manager.cpp
engines/zvision/graphics/render_manager.h
engines/zvision/inventory/inventory_manager.h
engines/zvision/inventory_manager.h
engines/zvision/meta_animation.h
engines/zvision/module.mk
engines/zvision/scripting/actions.cpp
engines/zvision/scripting/control.h
engines/zvision/scripting/controls/animation_control.cpp
engines/zvision/scripting/controls/animation_control.h
engines/zvision/scripting/controls/input_control.cpp
engines/zvision/scripting/controls/lever_control.cpp
engines/zvision/scripting/controls/timer_node.cpp
engines/zvision/scripting/controls/timer_node.h
engines/zvision/scripting/puzzle.h
engines/zvision/scripting/scr_file_handling.cpp
engines/zvision/scripting/script_manager.cpp
engines/zvision/scripting/script_manager.h
engines/zvision/sidefx.cpp
engines/zvision/sound/zork_raw.cpp
engines/zvision/sound/zork_raw.h
engines/zvision/video/video.cpp
engines/zvision/video/zork_avi_decoder.h
engines/zvision/zvision.cpp
engines/zvision/zvision.h
Diffstat (limited to 'engines/bbvs/bbvs.h')
-rw-r--r-- | engines/bbvs/bbvs.h | 423 |
1 files changed, 423 insertions, 0 deletions
diff --git a/engines/bbvs/bbvs.h b/engines/bbvs/bbvs.h new file mode 100644 index 0000000000..6a9a13905c --- /dev/null +++ b/engines/bbvs/bbvs.h @@ -0,0 +1,423 @@ +/* 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 BBVS_BBVS_H +#define BBVS_BBVS_H + +#include "audio/mixer.h" +#include "audio/decoders/aiff.h" +#include "common/array.h" +#include "common/events.h" +#include "common/file.h" +#include "common/memstream.h" +#include "common/random.h" +#include "common/str.h" +#include "common/substream.h" +#include "common/system.h" +#include "common/winexe.h" +#include "common/winexe_pe.h" +#include "engines/engine.h" + +struct ADGameDescription; + +namespace Bbvs { + +class ActionCommands; +struct Action; +class GameModule; +struct Condition; +struct Conditions; +struct ActionResult; +struct ActionResults; +struct ActionCommand; +struct CameraInit; +struct SceneObjectDef; +struct SceneObjectInit; +struct SceneExit; +struct Animation; +struct SceneSound; +class DrawList; +class SpriteModule; +class Screen; +class SoundMan; + +#define BBVS_SAVEGAME_VERSION 0 + +enum { + kVerbLook = 0, + kVerbUse = 1, + kVerbTalk = 2, + kVerbWalk = 3, + kVerbInvItem = 4, + kVerbShowInv = 5 +}; + +enum { + kITNone = 0, + kITEmpty = 1, + KITSceneObject = 2, + kITBgObject = 3, + kITDialog = 4, + kITScroll = 5, + kITSceneExit = 6, + kITInvItem = 7 +}; + +enum { + kGSScene = 0, + kGSInventory = 1, + kGSVerbs = 2, + kGSWait = 3, + kGSDialog = 4, + kGSWaitDialog = 5 +}; + +enum { + kActionCmdStop = 0, + kActionCmdWalkObject = 3, + kActionCmdMoveObject = 4, + kActionCmdAnimObject = 5, + kActionCmdSetCameraPos = 7, + kActionCmdPlaySpeech = 8, + kActionCmdPlaySound = 10, + kActionCmdStartBackgroundSound = 11, + kActionCmdStopBackgroundSound = 12 +}; + +enum { + kCondUnused = 1, + kCondSceneObjectVerb = 2, + kCondBgObjectVerb = 3, + kCondSceneObjectInventory = 4, + kCondBgObjectInventory = 5, + kCondHasInventoryItem = 6, + kCondHasNotInventoryItem = 7, + kCondIsGameVar = 8, + kCondIsNotGameVar = 9, + kCondIsPrevSceneNum = 10, + kCondIsCurrTalkObject = 11, + kCondIsDialogItem = 12, + kCondIsCameraNum = 13, + kCondIsNotPrevSceneNum = 14, + kCondDialogItem0 = 15, + kCondIsButtheadAtBgObject = 16, + kCondIsNotSceneVisited = 17, + kCondIsSceneVisited = 18, + kCondIsCameraNumTransition = 19 +}; + +enum { + kActResAddInventoryItem = 1, + kActResRemoveInventoryItem = 2, + kActResSetGameVar = 3, + kActResUnsetGameVar = 4, + kActResStartDialog = 5, + kActResChangeScene = 6 +}; + +enum { + kLeftButtonClicked = 1, + kRightButtonClicked = 2, + kLeftButtonDown = 4, + kRightButtonDown = 8, + kAnyButtonClicked = kLeftButtonClicked | kRightButtonClicked, + kAnyButtonDown = kLeftButtonDown | kRightButtonDown +}; + +struct BBPoint { + int16 x, y; +}; + +struct BBRect { + int16 x, y, width, height; +}; + +struct BBPolygon { + const BBPoint *points; + int pointsCount; +}; + +struct Rect { + int16 left, top, right, bottom; +}; + +struct SceneObject { + uint32 x, y; + SceneObjectDef *sceneObjectDef; + Animation *anim; + int animIndex; + int frameIndex; + int frameTicks; + int walkCount; + int xIncr, yIncr; + int turnValue, turnCount, turnTicks; + Common::Point walkDestPt; + SceneObject() : sceneObjectDef(0), anim(0) { + } +}; + +struct SceneObjectAction { + int sceneObjectIndex; + int animationIndex; + Common::Point walkDest; +}; + +struct WalkInfo { + int16 x, y; + int delta; + int direction; + Common::Point midPt; + int walkAreaIndex; +}; + +struct WalkArea { + int16 x, y, width, height; + bool checked; + int linksCount; + WalkArea *links[16]; + WalkInfo *linksD1[32]; + WalkInfo *linksD2[32]; + bool contains(const Common::Point &pt) const; +}; + +const int kSnapshotSize = 23072; +const int kSceneObjectsCount = 64; +const int kSceneSoundsCount = 8; +const int kInventoryItemStatusCount = 50; +const int kDialogItemStatusCount = 50; +const int kGameVarsCount = 2000; +const int kSceneVisitedCount = 64; + +const int kMainMenu = 44; +const int kCredits = 45; + +const int kMaxDistance = 0xFFFFFF; +static const int8 kWalkTurnTbl[] = { + 7, 9, 4, 8, 6, 10, 5, 11 +}; + +class BbvsEngine : public Engine { +protected: + Common::Error run(); + virtual bool hasFeature(EngineFeature f) const; +public: + BbvsEngine(OSystem *syst, const ADGameDescription *gd); + ~BbvsEngine(); + void newGame(); + void continueGameFromQuickSave(); + void setNewSceneNum(int newSceneNum); + const Common::String getTargetName() { return _targetName; } +private: + const ADGameDescription *_gameDescription; + Graphics::PixelFormat _pixelFormat; +public: + Common::RandomSource *_random; + + GameModule *_gameModule; + SpriteModule *_spriteModule; + SoundMan *_sound; + + Screen *_screen; + + int _bootSaveSlot; + + int _mouseX, _mouseY; + uint _mouseButtons; + Common::KeyCode _keyCode; + + int _mouseCursorSpriteIndex; + + int _gameState; + int _gameTicks; + + Common::Point _mousePos; + Common::Point _verbPos; + Common::Point _walkMousePos; + + int _activeItemType; + int _activeItemIndex; + int _currTalkObjectIndex; + + Common::Point _cameraPos, _newCameraPos; + + int _newSceneNum, _prevSceneNum, _currSceneNum; + int _playVideoNumber; + + int _dialogSlotCount; + byte _dialogItemStatus[kDialogItemStatusCount]; + + byte _gameVars[kGameVarsCount]; + byte _sceneVisited[kSceneVisitedCount]; + + int _currVerbNum; + + int _currInventoryItem; + byte _inventoryItemStatus[kInventoryItemStatusCount]; + int _inventoryButtonIndex; + + Action *_currAction; + uint32 _currActionCommandTimeStamp; + int _currActionCommandIndex; + + Common::Array<Action*> _walkAreaActions; + + SceneObject _sceneObjects[kSceneObjectsCount]; + Common::Array<SceneObjectAction> _sceneObjectActions; + + SceneObject *_buttheadObject, *_beavisObject; + int _currCameraNum; + + byte _backgroundSoundsActive[kSceneSoundsCount]; + Audio::SoundHandle _speechSoundHandle; + + int _walkAreasCount; + WalkArea _walkAreas[80]; + int _walkInfosCount; + WalkInfo _walkInfos[256]; + int _walkableRectsCount; + Common::Rect _walkableRects[256]; + Common::Rect _tempWalkableRects1[256]; + Common::Rect _tempWalkableRects2[256]; + WalkInfo *_walkInfoPtrs[256]; + + WalkArea *_sourceWalkArea, *_destWalkArea; + Common::Point _sourceWalkAreaPt, _destWalkAreaPt, _finalWalkPt; + int _currWalkDistance; + bool _walkReachedDestArea; + + bool _hasSnapshot; + byte *_snapshot; + Common::SeekableMemoryWriteStream *_snapshotStream; + + char _easterEggInput[7]; + + void updateEvents(); + int getRandom(int max); + + void drawDebugInfo(); + void drawScreen(); + + void updateGame(); + + bool evalCondition(Conditions &conditions); + bool evalCameraCondition(Conditions &conditions, int value); + int evalDialogCondition(Conditions &conditions); + void evalActionResults(ActionResults &results); + + void updateBackgroundSounds(); + + void loadScene(int sceneNum); + void initScene(bool sounds); + bool changeScene(); + bool update(int mouseX, int mouseY, uint mouseButtons, Common::KeyCode keyCode); + + void buildDrawList(DrawList &drawList); + + void updateVerbs(); + void updateDialog(bool clicked); + void updateInventory(bool clicked); + void updateScene(bool clicked); + + bool performActionCommand(ActionCommand *actionCommand); + bool processCurrAction(); + void skipCurrAction(); + + void updateCommon(); + + void updateWalkableRects(); + void startWalkObject(SceneObject *sceneObject); + void updateWalkObject(SceneObject *sceneObject); + void walkObject(SceneObject *sceneObject, const Common::Point &destPt, int walkSpeed); + void turnObject(SceneObject *sceneObject); + + int rectSubtract(const Common::Rect &rect1, const Common::Rect &rect2, Common::Rect *outRects); + + WalkInfo *addWalkInfo(int16 x, int16 y, int delta, int direction, int16 midPtX, int16 midPtY, int walkAreaIndex); + void initWalkAreas(SceneObject *sceneObject); + WalkArea *getWalkAreaAtPos(const Common::Point &pt); + bool canButtheadWalkToDest(const Common::Point &destPt); + void canWalkToDest(WalkArea *walkArea, int infoCount); + bool walkTestLineWalkable(const Common::Point &sourcePt, const Common::Point &destPt, WalkInfo *walkInfo); + void walkFindPath(WalkArea *sourceWalkArea, int infoCount); + int calcDistance(const Common::Point &pt1, const Common::Point &pt2); + void walkFoundPath(int count); + + void updateSceneObjectsTurnValue(); + void updateDialogConditions(); + + void playSpeech(int soundNum); + void stopSpeech(); + + void playSound(uint soundNum, bool loop = false); + void stopSound(uint soundNum); + void stopSounds(); + + bool runMinigame(int minigameNum); + void playVideo(int videoNum); + + void runMainMenu(); + void checkEasterEgg(char key); + + // Savegame API + + enum kReadSaveHeaderError { + kRSHENoError = 0, + kRSHEInvalidType = 1, + kRSHEInvalidVersion = 2, + kRSHEIoError = 3 + }; + + struct SaveHeader { + Common::String description; + uint32 version; + byte gameID; + uint32 flags; + uint32 saveDate; + uint32 saveTime; + uint32 playTime; + Graphics::Surface *thumbnail; + }; + + bool _isSaveAllowed; + + bool canLoadGameStateCurrently() { return _isSaveAllowed; } + bool canSaveGameStateCurrently() { return _isSaveAllowed; } + Common::Error loadGameState(int slot); + Common::Error saveGameState(int slot, const Common::String &description); + void savegame(const char *filename, const char *description); + void loadgame(const char *filename); + const char *getSavegameFilename(int num); + bool existsSavegame(int num); + static Common::String getSavegameFilename(const Common::String &target, int num); + static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header); + + void allocSnapshot(); + void freeSnapshot(); + void saveSnapshot(); + + void writeContinueSavegame(); + +}; + +} // End of namespace Bbvs + +#endif // BBVS_BBVS_H |