scummvm/engines/dreamweb/dreamweb.h
Thierry Crozat 75f8cfac56 DREAMWEB: Use more accurate vsync timing
The vsync delay is 14 ms (1000 / 70), and using a loop with
a sleep of 10ms until we had passed that delay meant we were
actually waiting anytime between 14 and 23 milliseconds, which
made the game slower than it should be. This was partially
corrected by using a delay of 11 ms (800 / 70), but this was
still inacurate and too slow in average.

In addition, since the change in commit 87c8b60, it was ignoring
the time spent in the game loop, which on slow devices is not
negligeable, and this has been fixed as well.

Finally also change the fast speed from 20 to 4. In commit
87c8b60 the delay was changed from macroseconds to milliseconds,
and any speed above 14 would then result in a delay of 0 due to
the integer division. We have the turbo mode for that, so it
seems to make sense to make the fast mode a bit slower rather
than having two modes that do the same thing.
2020-05-03 00:13:33 +01:00

1108 lines
30 KiB
C++

/* 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 DREAMWEB_DREAMWEB_H
#define DREAMWEB_DREAMWEB_H
#include "common/error.h"
#include "common/keyboard.h"
#include "common/random.h"
#include "common/rect.h"
#include "common/scummsys.h"
#include "common/system.h"
#include "engines/engine.h"
#include "dreamweb/console.h"
#include "dreamweb/structs.h"
#define SCUMMVM_HEADER MKTAG('S', 'C', 'V', 'M')
#define SCUMMVM_BLOCK_MAGIC_SIZE 0x1234
#define SAVEGAME_VERSION 1
namespace Common {
class File;
}
namespace DreamWeb {
const unsigned int kNumReelRoutines = 57;
const unsigned int kUnderTextSizeX = 180;
const unsigned int kUnderTextSizeY = 10;
const unsigned int kUnderTimedTextSizeY = 24;
const unsigned int kUnderTextSizeX_f = 228; // foreign version
const unsigned int kUnderTextSizeY_f = 13; // foreign version
const unsigned int kUnderTimedTextSizeY_f = 30;
const unsigned int kUnderTextBufSize = kUnderTextSizeX_f * kUnderTextSizeY_f;
const unsigned int kUnderTimedTextBufSize = 256 * kUnderTimedTextSizeY_f;
const unsigned int kLengthOfVars = 68;
const unsigned int kNumChanges = 250;
const unsigned int kLenOfMapStore = 22*8*20*8;
const unsigned int kMapWidth = 66;
const unsigned int kMapHeight = 60;
const unsigned int kLengthOfMap = kMapWidth * kMapHeight;
const unsigned int kNumExObjects = 114;
const unsigned int kScreenwidth = 320;
const unsigned int kScreenheight = 200;
const unsigned int kDiaryx = (68+24);
const unsigned int kDiaryy = (48+12);
const unsigned int kInventx = 80;
const unsigned int kInventy = 58;
const unsigned int kMenux = (80+40);
const unsigned int kMenuy = 60;
const unsigned int kOpsx = 60;
const unsigned int kOpsy = 52;
const unsigned int kSymbolx = 64;
const unsigned int kSymboly = 56;
const unsigned int kLengthofvars = 68;
const unsigned int kFrameBlocksize = 2080;
const unsigned int kGraphicsFileFrameSize = 347; // ceil(2080 / sizeof(Frame))
const unsigned int kNumexobjects = 114;
const unsigned int kNumExTexts = kNumexobjects + 2;
const uint16 kExtextlen = 18000;
const uint16 kExframeslen = 30000;
const unsigned int kLengthofextra = kFrameBlocksize + kExframeslen + sizeof(DynObject)*kNumexobjects + sizeof(uint16)*kNumExTexts + kExtextlen;
const unsigned int kItempicsize = 44;
const unsigned int kNumSetTexts = 130;
const unsigned int kNumBlockTexts = 98;
const unsigned int kNumRoomTexts = 38;
const unsigned int kNumFreeTexts = 82;
const unsigned int kNumPersonTexts = 1026;
// Engine Debug Flags
enum {
kDebugAnimation = (1 << 0),
kDebugSaveLoad = (1 << 1)
};
struct DreamWebGameDescription;
class DreamWebSound;
class DreamWebEngine : public Engine {
private:
DreamWebSound *_sound;
uint32 _vSyncPrevTick;
protected:
// Engine APIs
Common::Error run() override;
bool hasFeature(EngineFeature f) const override;
void pauseEngineIntern(bool pause) override;
public:
DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gameDesc);
~DreamWebEngine() override;
void waitForVSync();
Common::Error loadGameState(int slot) override;
Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false) override;
bool canLoadGameStateCurrently() override;
bool canSaveGameStateCurrently() override;
uint8 randomNumber() { return _rnd.getRandomNumber(255); }
void mouseCall(uint16 *x, uint16 *y, uint16 *state); //fill mouse pos and button state
void processEvents(bool processSoundEvents = true);
void blit(const uint8 *src, int pitch, int x, int y, int w, int h);
void cls();
bool isCD();
bool hasSpeech();
void getPalette(uint8 *data, uint start, uint count);
void setPalette(const uint8 *data, uint start, uint count);
Common::String getSavegameFilename(int slot) const;
void setShakePos(int pos) { _system->setShakePos(0, pos); }
void printUnderMonitor();
void quit();
Common::Language getLanguage() const;
uint8 modifyChar(uint8 c) const;
Common::String modifyFileName(const char *);
const Common::String& getDatafilePrefix() { return _datafilePrefix; }
const Common::String& getSpeechDirName() { return _speechDirName; }
private:
// Keyboard buffer. _bufferIn and _bufferOut are indexes
// into this, making it a ring buffer
uint8 _keyBuffer[16];
uint16 _bufferIn;
uint16 _bufferOut;
void keyPressed(uint16 ascii);
void setSpeed(uint speed);
const DreamWebGameDescription *_gameDescription;
Common::RandomSource _rnd;
Common::String _datafilePrefix;
Common::String _speechDirName;
uint _speed;
bool _turbo;
uint _oldMouseState;
protected:
GameVars _vars; // saved variables
// from backdrop.cpp
uint8 *_backdropBlocks;
BackdropMapFlag _backdropFlags[96];
uint8 _mapData[kLengthOfMap + 32];
// from keypad.cpp
uint8 _pressList[6];
uint8 _pressed;
uint16 _pressPointer;
uint8 _graphicPress;
uint8 _pressCount;
uint8 _lightCount;
uint8 _folderPage;
uint8 _diaryPage;
uint8 _menuCount;
uint8 _symbolTopX;
uint8 _symbolTopNum;
int8 _symbolTopDir;
uint8 _symbolBotX;
uint8 _symbolBotNum;
int8 _symbolBotDir;
// from monitor.cpp
char _inputLine[64];
char _operand1[64];
char _currentFile[14];
// from newplace.cpp
uint8 _roomsCanGo[16];
// from object.cpp
uint16 _openChangeSize;
ObjectRef _oldSubject;
// from pathfind.cpp
Common::Point _lineData[200]; // Output of Bresenham
// from saveload.cpp
char _saveNames[17*21];
char _saveNamesOld[17*21];
// from vgagrafx.cpp
uint8 _workspace[(0x1000 + 2) * 16];
uint8 _mapStore[kLenOfMapStore + 32];
// from people.cpp
ReelRoutine _reelRoutines[kNumReelRoutines+1];
ReelRoutine *_personData;
// from Buffers
uint8 _textUnder[kUnderTextBufSize];
ObjectRef _openInvList[16];
ObjectRef _ryanInvList[30];
uint8 _pointerBack[32*32];
MapFlag _mapFlags[11*10];
uint8 _startPal[3*256];
uint8 _endPal[3*256];
uint8 _mainPal[3*256];
Common::List<Sprite> _spriteTable;
Common::List<ObjPos> _setList;
Common::List<ObjPos> _freeList;
Common::List<ObjPos> _exList;
Common::List<People> _peopleList;
uint8 _zoomSpace[46*40];
Change _listOfChanges[kNumChanges]; // Note: this array is saved
uint8 _underTimedText[kUnderTimedTextBufSize];
Common::List<Rain> _rainList;
// textfiles
TextFile _textFile1;
TextFile _textFile2;
TextFile _textFile3;
TextFile _travelText;
TextFile _puzzleText;
TextFile _commandText;
// local graphics files
GraphicsFile _keypadGraphics;
GraphicsFile _menuGraphics;
GraphicsFile _menuGraphics2;
GraphicsFile _folderGraphics;
GraphicsFile _folderGraphics2;
GraphicsFile _folderGraphics3;
GraphicsFile _folderCharset;
GraphicsFile _symbolGraphics;
GraphicsFile _diaryGraphics;
GraphicsFile _diaryCharset;
GraphicsFile _monitorGraphics;
GraphicsFile _monitorCharset;
GraphicsFile _newplaceGraphics;
GraphicsFile _newplaceGraphics2;
GraphicsFile _newplaceGraphics3;
GraphicsFile _cityGraphics;
GraphicsFile _saveGraphics;
// global graphics files
GraphicsFile _icons1;
GraphicsFile _icons2;
GraphicsFile _charset1;
GraphicsFile _mainSprites;
const GraphicsFile *_currentCharset;
// room files
GraphicsFile _setFrames;
GraphicsFile _freeFrames;
GraphicsFile _reel1;
GraphicsFile _reel2;
GraphicsFile _reel3;
TextFile _setDesc;
TextFile _blockDesc;
TextFile _roomDesc;
TextFile _freeDesc;
TextFile _personText;
uint16 _personFramesLE[12];
RoomPaths _pathData[36];
Reel *_reelList;
SetObject _setDat[128];
DynObject _freeDat[80];
// Extras segment (NB: this is saved)
GraphicsFile _exFrames;
DynObject _exData[kNumExObjects];
TextFile _exText;
public:
bool _quitRequested;
bool _subtitles;
bool _foreignRelease;
bool _wonGame;
bool _hasSpeech;
// sound related
uint8 _roomsSample;
bool _speechLoaded;
// misc variables
uint8 _speechCount;
uint16 _charShift;
bool _brightPalette;
bool _copyProtection;
uint8 _roomLoaded;
uint8 _didZoom;
uint16 _lineSpacing;
uint16 _textAddressX;
uint16 _textAddressY;
uint8 _textLen;
uint16 _lastXPos;
uint8 _itemFrame;
uint8 _withObject;
uint8 _withType;
uint16 _lookCounter;
uint8 _command;
uint8 _commandType;
uint8 _objectType;
uint8 _getBack;
uint8 _invOpen;
uint8 _mainMode;
uint8 _pickUp;
uint8 _lastInvPos;
uint8 _examAgain;
uint8 _newTextLine;
uint8 _openedOb;
uint8 _openedType;
uint16 _mapAdX;
uint16 _mapAdY;
uint16 _mapOffsetX;
uint16 _mapOffsetY;
uint16 _mapXStart;
uint16 _mapYStart;
uint8 _mapXSize;
uint8 _mapYSize;
uint8 _haveDoneObs;
uint8 _manIsOffScreen;
uint8 _facing;
uint8 _leaveDirection;
uint8 _turnToFace;
uint8 _turnDirection;
uint16 _mainTimer;
uint8 _introCount;
uint8 _currentKey;
uint8 _timerCount;
uint8 _mapX;
uint8 _mapY;
uint8 _ryanX;
uint8 _ryanY;
uint8 _lastFlag;
uint8 _destPos;
uint8 _realLocation;
uint8 _roomNum;
uint8 _nowInNewRoom;
uint8 _resetManXY;
uint8 _newLocation;
uint8 _autoLocation;
uint16 _mouseX;
uint16 _mouseY;
uint16 _mouseButton;
uint16 _oldButton;
uint16 _oldX;
uint16 _oldY;
uint16 _oldPointerX;
uint16 _oldPointerY;
uint16 _delHereX;
uint16 _delHereY;
uint8 _pointerXS;
uint8 _pointerYS;
uint8 _delXS;
uint8 _delYS;
uint8 _pointerFrame;
uint8 _pointerPower;
uint8 _pointerMode;
uint8 _pointerSpeed;
uint8 _pointerCount;
uint8 _inMapArea;
uint8 _talkMode;
uint8 _talkPos;
uint8 _character;
uint8 _watchDump;
uint8 _logoNum;
uint8 _oldLogoNum;
uint8 _walkAndExam;
uint8 _walkExamType;
uint8 _walkExamNum;
uint16 _cursLocX;
uint16 _cursLocY;
uint16 _curPos;
uint16 _monAdX;
uint16 _monAdY;
uint16 _timeCount;
uint8 _needToDumpTimed;
TimedTemp _previousTimedTemp;
TimedTemp _timedTemp;
uint8 _loadingOrSave;
uint8 _saveLoadPage;
uint8 _currentSlot;
uint8 _cursorPos;
uint8 _colorPos;
uint8 _fadeDirection;
uint8 _numToFade;
uint8 _fadeCount;
uint8 _addToGreen;
uint8 _addToRed;
uint8 _addToBlue;
uint16 _lastSoundReel;
Common::KeyCode _lastHardKey;
uint8 _blinkFrame;
uint8 _blinkCount;
uint8 _reAssesChanges;
uint8 _pointersPath;
uint8 _mansPath;
uint8 _pointerFirstPath;
uint8 _finalDest;
uint8 _destination;
uint16 _lineStartX;
uint16 _lineStartY;
uint16 _lineEndX;
uint16 _lineEndY;
uint8 _linePointer;
uint8 _lineDirection;
uint8 _lineLength;
// from backdrop.cpp
void doBlocks();
uint8 getXAd(const uint8 *setData, uint8 *result);
uint8 getYAd(const uint8 *setData, uint8 *result);
uint8 getMapAd(const uint8 *setData, uint16 *x, uint16 *y);
void calcFrFrame(const Frame &frame, uint8* width, uint8* height, uint16 x, uint16 y, ObjPos *objPos);
void makeBackOb(SetObject *objData, uint16 x, uint16 y);
void showAllObs();
void getDimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize);
void calcMapAd();
void showAllFree();
void drawFlags();
void showAllEx();
// from keypad.cpp
void getUnderMenu();
void putUnderMenu();
void singleKey(uint8 key, uint16 x, uint16 y);
void loadKeypad();
void showKeypad();
bool isItRight(uint8 digit0, uint8 digit1, uint8 digit2, uint8 digit3);
void addToPressList();
void buttonOne();
void buttonTwo();
void buttonThree();
void buttonFour();
void buttonFive();
void buttonSix();
void buttonSeven();
void buttonEight();
void buttonNine();
void buttonNought();
void buttonEnter();
void buttonPress(uint8 buttonId);
void showOuterPad();
void dumpKeypad();
void dumpSymbol();
void quitSymbol();
void enterCode(uint8 digit0, uint8 digit1, uint8 digit2, uint8 digit3);
// from monitor.cpp
void input();
byte makeCaps(byte c);
void delChar();
void monMessage(uint8 index);
void netError();
void monitorLogo();
void randomAccess(uint16 count);
void printOuterMon();
void showCurrentFile();
void accessLightOn();
void accessLightOff();
void turnOnPower();
void powerLightOn();
void powerLightOff();
void printLogo();
void scrollMonitor();
const char *monPrint(const char *string);
void lockLightOn();
void lockLightOff();
void loadPersonal();
void loadNews();
void loadCart();
void showKeys();
const char *parser();
const char *searchForString(const char *topic, const char *text);
const char *getKeyAndLogo(const char *foundString);
void read();
void dirFile(const char *dirName);
void dirCom();
void useMon();
bool execCommand();
int findCommand(const char *const cmdList[]);
// from newplace.cpp
void getUnderCenter();
void putUnderCenter();
void showArrows();
uint8 getLocation(uint8 index);
void setLocation(uint8 index);
void clearLocation(uint8 index);
void resetLocation(uint8 index);
void readCityPic();
void readDestIcon();
void showCity();
void locationPic();
void selectLocation();
void newPlace();
void nextDest();
void lastDest();
void destSelect();
void lookAtPlace();
// from object.cpp
void obIcons();
void fillRyan();
void findAllRyan();
void obToInv(uint8 index, uint8 flag, uint16 x, uint16 y);
void obPicture();
void removeObFromInv();
void deleteExObject(uint8 index);
void deleteExFrame(uint8 frameNum);
void deleteExText(uint8 textNum);
void purgeALocation(uint8 index);
const uint8 *getObTextStart();
void wornError();
void makeWorn(DynObject *object);
void dropObject();
ObjectRef findOpenPos();
byte getOpenedSlotSize();
byte getOpenedSlotCount();
void openOb();
void findAllOpen();
void fillOpen();
ObjectRef findInvPos();
void reExFromInv();
void swapWithInv();
void transferText(uint8 from, uint8 to);
void pickupConts(uint8 from, uint8 containerEx);
byte transferToEx(uint8 from);
void swapWithOpen();
void outOfOpen();
void inToInv();
void outOfInv();
bool checkObjectSize();
void useOpened();
void setPickup();
void selectOpenOb();
void examineOb(bool examineAgain = true);
void selectOb();
void inventory();
void identifyOb();
// from pathfind.cpp
void turnPathOn(uint8 param);
void turnPathOff(uint8 param);
void turnAnyPathOn(uint8 param, uint8 room);
void turnAnyPathOff(uint8 param, uint8 room);
RoomPaths *getRoomsPaths();
void faceRightWay();
void setWalk();
void autoSetWalk();
void checkDest(const RoomPaths *roomsPaths);
void findXYFromPath();
bool checkIfPathIsOn(uint8 index);
void bresenhams();
void workoutFrames();
byte findFirstPath(byte x, byte y);
byte findPathOfPoint(byte x, byte y);
// from people.cpp
void setupInitialReelRoutines();
void updatePeople();
void madmanText();
void madman(ReelRoutine &routine);
void madMode();
void addToPeopleList(ReelRoutine *routine);
bool checkSpeed(ReelRoutine &routine);
void sparkyDrip(ReelRoutine &routine);
void genericPerson(ReelRoutine &routine);
void gamer(ReelRoutine &routine);
void eden(ReelRoutine &routine);
void sparky(ReelRoutine &routine);
void rockstar(ReelRoutine &routine);
void madmansTelly(ReelRoutine &routine);
void smokeBloke(ReelRoutine &routine);
void manAsleep(ReelRoutine &routine);
void drunk(ReelRoutine &routine);
void introMagic1(ReelRoutine &routine);
void introMagic2(ReelRoutine &routine);
void introMagic3(ReelRoutine &routine);
void introMusic(ReelRoutine &routine);
void candles(ReelRoutine &routine);
void candles1(ReelRoutine &routine);
void candles2(ReelRoutine &routine);
void smallCandle(ReelRoutine &routine);
void gates(ReelRoutine &routine);
void security(ReelRoutine &routine);
void edenInBath(ReelRoutine &routine);
void louis(ReelRoutine &routine);
void handClap(ReelRoutine &routine);
void carParkDrip(ReelRoutine &routine);
void foghornSound(ReelRoutine &routine);
void train(ReelRoutine &routine);
void attendant(ReelRoutine &routine);
void keeper(ReelRoutine &routine);
void interviewer(ReelRoutine &routine);
void drinker(ReelRoutine &routine);
void alleyBarkSound(ReelRoutine &routine);
void louisChair(ReelRoutine &routine);
void bossMan(ReelRoutine &routine);
void priest(ReelRoutine &routine);
void monkAndRyan(ReelRoutine &routine);
void copper(ReelRoutine &routine);
void introMonks1(ReelRoutine &routine);
void introMonks2(ReelRoutine &routine);
void soldier1(ReelRoutine &routine);
void receptionist(ReelRoutine &routine);
void bartender(ReelRoutine &routine);
void heavy(ReelRoutine &routine);
void helicopter(ReelRoutine &routine);
void mugger(ReelRoutine &routine);
void businessMan(ReelRoutine &routine);
void endGameSeq(ReelRoutine &routine);
void poolGuard(ReelRoutine &routine);
// from print.cpp
uint8 getNextWord(const GraphicsFile &charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount);
void printChar(const GraphicsFile &charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height, bool kerning = false);
void printChar(const GraphicsFile &charSet, uint16 x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
void printBoth(const GraphicsFile &charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar);
uint8 printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered, bool kerning = false);
uint8 printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
uint8 getNumber(const GraphicsFile &charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset);
uint8 kernChars(uint8 firstChar, uint8 secondChar, uint8 width);
uint8 printSlow(const uint8 *string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
uint16 waitFrames();
void printCurs();
void delCurs();
void rollEndCreditsGameWon();
void rollEndCreditsGameLost();
// from saveload.cpp
void loadGame();
void doLoad(int slot);
void saveGame();
void namesToOld();
void oldToNames();
void saveLoad();
void doSaveLoad();
void showMainOps();
void showDiscOps();
void discOps();
void actualSave();
void actualLoad();
void loadPosition(unsigned int slot);
void savePosition(unsigned int slot, const char *descbuf);
uint scanForNames();
void loadOld();
void showDecisions();
void loadSaveBox();
void showNames();
void checkInput();
void selectSaveLoadPage();
void selectSlot();
void showSlots();
void showOpBox();
void showSaveOps();
void showLoadOps();
// from sprite.cpp
void printSprites();
void printASprite(const Sprite *sprite);
void clearSprites();
Sprite *makeSprite(uint8 x, uint8 y, bool _mainManCallback, const GraphicsFile *frameData);
void initMan();
void walking(Sprite *sprite);
void aboutTurn(Sprite *sprite);
void backObject(Sprite *sprite);
void constant(Sprite *sprite, SetObject *objData);
void randomSprite(Sprite *sprite, SetObject *objData);
void doorway(Sprite *sprite, SetObject *objData);
void wideDoor(Sprite *sprite, SetObject *objData);
void doDoor(Sprite *sprite, SetObject *objData, Common::Rect check);
void steady(Sprite *sprite, SetObject *objData);
void lockedDoorway(Sprite *sprite, SetObject *objData);
void liftSprite(Sprite *sprite, SetObject *objData);
Reel *getReelStart(uint16 reelPointer);
const GraphicsFile *findSource(uint16 &frame);
void showReelFrame(Reel *reel);
void showGameReel(ReelRoutine *routine);
const Frame *getReelFrameAX(uint16 frame);
void moveMap(uint8 param);
void checkOne(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY);
uint8 getBlockOfPixel(uint8 x, uint8 y);
void splitIntoLines(uint8 x, uint8 y);
void initRain();
void intro1Text();
void intro2Text(uint16 nextReelPointer);
void intro3Text(uint16 nextReelPointer);
void monks2text();
void monks2ShowText(uint8 textIndex, uint8 x, uint8 y);
void textForEnd();
void textForMonkHelper(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount);
void textForMonk();
void priestText(ReelRoutine &routine);
void soundOnReels(uint16 reelPointer);
void clearBeforeLoad();
void clearReels();
void getRidOfReels();
void liftNoise(uint8 index);
void checkForExit(Sprite *sprite);
void mainMan(Sprite *sprite);
void spriteUpdate();
void showRain();
void reconstruct();
void reelsOnScreen();
// from stubs.cpp
void setupInitialVars();
void crosshair();
void delTextLine();
void showBlink();
void dumpBlink();
void dumpPointer();
void showPointer();
void delPointer();
void showRyanPage();
void switchRyanOn();
void switchRyanOff();
void showDiary();
void readMouse();
uint16 readMouseState();
void hangOn(uint16 frameCount);
void lockMon();
void readKey();
void findOrMake(uint8 index, uint8 value, uint8 type);
DynObject *getFreeAd(uint8 index);
DynObject *getExAd(uint8 index);
DynObject *getEitherAd();
void *getAnyAdDir(uint8 index, uint8 flag);
void showWatch();
void showTime();
void showExit();
void showMan();
void panelIcons1();
SetObject *getSetAd(uint8 index);
void *getAnyAd(uint8 *slotSize, uint8 *slotCount);
const uint8 *getTextInFile1(uint16 index);
uint8 findNextColon(const uint8 **string);
void allocateBuffers();
void loadTextFile(TextFile &file, const char *suffix);
void loadGraphicsFile(GraphicsFile &file, const char *suffix);
void loadGraphicsSegment(GraphicsFile &file, Common::File &inFile, unsigned int len);
void loadTextSegment(TextFile &file, Common::File &inFile, unsigned int len);
void loadTravelText();
void loadTempText(const char *suffix);
void sortOutMap();
void loadRoomData(const Room &room, bool skipDat);
void useTempCharset(GraphicsFile *charset);
void useCharset1();
void useCharsetIcons1();
void useCharsetTempgraphics();
void resetCharset();
void printMessage(uint16 x, uint16 y, uint8 index, uint8 maxWidth, bool centered);
void printMessage2(uint16 x, uint16 y, uint8 index, uint8 maxWidth, bool centered, uint8 count);
bool isItDescribed(const ObjPos *objPos);
void zoomIcon();
void roomName();
void showIcon();
void eraseOldObs();
void commandOnlyCond(uint8 command, uint8 commandType);
void commandOnly(uint8 command);
void commandWithOb(uint8 command, uint8 type, uint8 index);
void blank();
void setTopLeft();
void setTopRight();
void setBotLeft();
void setBotRight();
void examIcon();
void animPointer();
void getFlagUnderP(uint8 *flag, uint8 *flagEx);
void workToScreenM();
void quitKey();
void restoreReels();
void loadFolder();
void folderHints();
void folderExit();
void showFolder();
void showLeftPage();
void showRightPage();
void underTextLine();
void hangOnP(uint16 count);
void getUnderZoom();
void putUnderZoom();
void examineInventory();
void openInv();
void getBack1();
void getBackFromOb();
void getBackFromOps();
void getBackToOps();
void DOSReturn();
bool isItWorn(const DynObject *object);
bool compare(uint8 index, uint8 flag, const char id[4]);
void hangOnW(uint16 frameCount);
void getRidOfTempText();
void getRidOfAll();
void placeSetObject(uint8 index);
void removeSetObject(uint8 index);
bool isSetObOnMap(uint8 index);
void dumpZoom();
void diaryKeyP();
void diaryKeyN();
void findRoomInLoc();
void loadMenu();
void showMenu();
void dumpMenu();
void dealWithSpecial(uint8 firstParam, uint8 secondParam);
void plotReel(uint16 &reelPointer);
void setupTimedTemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount);
void getUnderTimed();
void putUnderTimed();
void dumpTextLine();
void useTimedText();
void dumpTimedText();
void getTime();
void doChange(uint8 index, uint8 value, uint8 type);
bool isRyanHolding(const char *id);
void clearBuffers();
void clearChanges();
void drawFloor();
uint16 findSetObject(const char *id);
void hangOnCurs(uint16 frameCount);
const uint8 *findObName(uint8 type, uint8 index);
void copyName(uint8 type, uint8 index, uint8 *dst);
uint16 findExObject(const char *id);
void makeMainScreen();
void showWatchReel();
void watchReel();
void examineObText();
void blockNameText();
void personNameText();
void walkToText();
void entryTexts();
void setAllChanges();
void restoreAll();
void redrawMainScrn();
void checkCoords(const RectWithCallback *rectWithCallbacks);
void newGame();
void deleteTaken();
void autoAppear();
void loadRoom();
void startLoading(const Room &room);
void startup();
void atmospheres();
bool objectMatches(void *object, const char *id);
void checkFolderCoords();
void nextFolder();
void lastFolder();
void lookAtCard();
void obsThatDoThings();
void describeOb();
void putBackObStuff();
void showDiaryPage();
void showDiaryKeys();
void dumpDiaryKeys();
void useMenu();
void incRyanPage();
void edensFlatReminders();
void dropError();
void cantDrop();
void entryAnims();
bool finishedWalking();
void emergencyPurge(uint8 from);
void purgeAnItem();
uint8 nextSymbol(uint8 symbol);
void enterSymbol();
void showSymbol();
void updateSymbolTop();
void updateSymbolBot();
void pickupOb(uint8 command, uint8 pos);
void errorMessage1();
void errorMessage2();
void errorMessage3();
void decide();
void allPointer();
void dumpWatch();
void watchCount();
void signOn();
void searchForFiles(const char *filesString);
void triggerMessage(uint16 index);
void processTrigger();
void dreamwebFinalize();
void dreamweb();
void screenUpdate();
void startup1();
bool checkIfPerson(uint8 x, uint8 y);
bool checkIfFree(uint8 x, uint8 y);
bool checkIfEx(uint8 x, uint8 y);
void walkAndExamine();
void obName(uint8 command, uint8 commandType);
bool checkIfSet(uint8 x, uint8 y);
void readSetData();
void look();
void autoLook();
void doLook();
void mainScreen();
void zoomOnOff();
void initialInv();
void walkIntoRoom();
void afterNewRoom();
void madmanRun();
void showGun();
// from talk.cpp
void talk();
void convIcons();
uint16 getPersFrame(uint8 index);
const uint8 *getPersonText(uint8 index, uint8 talkPos);
void startTalk();
void moreTalk();
void doSomeTalk();
bool hangOnPQ();
void redes();
// from titles.cpp
void endGame();
void monkSpeaking();
void gettingShot();
void bibleQuote();
void hangOne(uint16 delay);
void intro();
void runIntroSeq();
void runEndSeq();
void loadIntroRoom();
void set16ColPalette();
void realCredits();
uint8 getExPos();
// from use.cpp
void useRoutine();
void useObject();
void placeFreeObject(uint8 index);
void removeFreeObject(uint8 index);
void setupTimedUse(uint16 offset, uint16 countToTimed, uint16 timeCount, byte x, byte y);
void withWhat();
uint16 checkInside(uint16 command, uint16 type);
void showPuzText(uint16 command, uint16 count);
void useText(const uint8 *string);
void showFirstUse();
void showSecondUse();
void viewFolder();
void edensCDPlayer();
void hotelBell();
void playGuitar();
void useElevator1();
void useElevator2();
void useElevator3();
void useElevator4();
void useElevator5();
void useHatch();
void wheelSound();
void callHotelLift();
void useShield();
void useCoveredBox();
void useRailing();
void useChurchHole();
void sitDownInBar();
void useBalcony();
void useWindow();
void trapDoor();
void useDryer();
void callEdensDLift();
void callEdensLift();
void openYourNeighbor();
void openRyan();
void openPoolBoss();
void openEden();
void openSarters();
void openLouis();
void useWall();
void useChurchGate();
void useLadder();
void useLadderB();
bool defaultUseHandler(const char *id);
void slabDoorA();
void slabDoorB();
void slabDoorC();
void slabDoorE();
void slabDoorD();
void slabDoorF();
void useGun();
void useFullCart();
void useClearBox();
void openTVDoor();
void usePlate();
void usePlinth();
void useElvDoor();
void useWinch();
void useCart();
void useHole();
void openHotelDoor();
void openHotelDoor2();
void grafittiDoor();
void useCardReader1();
void useCardReader2();
void useCardReader3();
void usePoolReader();
void useLighter();
void useWire();
void openTomb();
void hotelControl();
void useCooker();
void useDiary();
void useControl();
void useSlab();
void usePipe();
void useOpenBox();
void runTap();
void useAxe();
void useHandle();
void useAltar();
void notHeldError();
void useCashCard();
void useButtonA();
void wearWatch();
void wearShades();
void useTrainer();
void useStereo();
void chewy();
void delEverything();
void afterIntroRoom();
// from vgafades.cpp
void clearStartPal();
void clearEndPal();
void palToStartPal();
void endPalToStart();
void startPalToEnd();
void palToEndPal();
void fadeDOS();
void doFade();
void fadeCalculation();
void fadeUpYellows();
void fadeUpMonFirst();
void fadeUpMon();
void fadeDownMon();
void initialMonCols();
void fadeScreenUp();
void fadeScreenUps();
void fadeScreenUpHalf();
void fadeScreenDown();
void fadeScreenDowns();
void fadeScreenDownHalf();
void clearPalette();
void greyscaleSum();
void allPalette();
void dumpCurrent();
// from vgagrafx.cpp
inline uint8 *workspace() { return _workspace; }
void clearWork();
void panelToMap();
void mapToPanel();
void dumpMap();
void transferFrame(uint8 from, uint8 to, uint8 offset);
void zoom();
void multiGet(uint8 *dst, uint16 x, uint16 y, uint8 width, uint8 height);
void multiPut(const uint8 *src, uint16 x, uint16 y, uint8 width, uint8 height);
void multiDump(uint16 x, uint16 y, uint8 width, uint8 height);
void workToScreen();
void frameOutV(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, int16 x, int16 y);
void frameOutNm(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
void frameOutBh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
void frameOutFx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
void doShake();
void setMode();
void showPCX(const Common::String &suffix);
void showFrameInternal(const uint8 *pSrc, uint16 x, uint16 y, uint8 effectsFlag, uint8 width, uint8 height);
void showFrame(const GraphicsFile &frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height);
void showFrame(const GraphicsFile &frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag);
bool pixelCheckSet(const ObjPos *pos, uint8 x, uint8 y);
void loadPalFromIFF();
void createPanel();
void createPanel2();
void showPanel();
};
} // End of namespace DreamWeb
#endif