scummvm/engines/cryo/eden.h
2021-12-26 18:48:43 +01:00

761 lines
18 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef CRYO_EDEN_H
#define CRYO_EDEN_H
#include "common/file.h"
#include "common/savefile.h"
#include "common/serializer.h"
#include "cryo/sound.h"
#include "cryo/defs.h"
enum Direction {
kCryoNorth = 0,
kCryoEast = 1,
kCryoSouth = 2,
kCryoWest = 3
};
namespace Cryo {
class CryoEngine;
class EdenGraphics;
class EdenGame {
private:
EdenGraphics *_graphics;
public:
EdenGame(CryoEngine *vm);
~EdenGame();
void run();
object_t *getObjectPtr(int16 id);
void showObjects();
void saveFriezes();
void useBank(int16 bank);
void musicspy();
void fademusica0(int16 delay);
void wait(int howlong);
bool isObjectHere(int16 id);
void display();
void setMouseCenterX(uint16 xpos);
void setMouseCenterY(uint16 ypos);
void stopMusic();
uint16 getMouseCenterX();
uint16 getMouseCenterY();
bool dialoscansvmas(Dialog *dial);
void musique();
void preloadDialogs(int16 vid);
Common::SeekableReadStream *loadSubStream(uint16 num);
bool personIsTalking();
bool animationIsActive();
byte *getImageDesc();
byte *getPlaceRawBuf();
byte getActionCursor(byte value);
int16 getNumTextLines();
int16 getScrollPos();
/*
* Identify person based on current video number
*/
perso_t *personSubtitles();
int16 getGameIconY(int16 index);
int16 getGameIconX(int16 index);
byte *getGameDialogs();
bool getSpecialTextMode();
void setSpecialTextMode(bool value);
void setCursorSaved(bool cursorSaved);
bool getCursorSaved();
bool getNoPalette();
int16 getCurBankNum();
byte *getCurKeepBuf();
byte *getBankData();
int16 getCurPosX();
void setCurPosX(int16 xpos);
int16 getCurPosY();
void setCurPosY(int16 ypos);
byte *getGlowBuffer();
void setMusicFade(byte value);
bool isMouseHeld();
void setMouseHeld();
void setMouseNotHeld();
global_t *_globals; // TODO: Make private and use getters
CryoEngine *_vm;
private:
void removeConsole();
void scroll();
void resetScroll();
void scrollFrescoes();
void displayFrescoes();
void gametofresques();
void doFrescoes();
void actionEndFrescoes();
void scrollMirror();
void scrollPanel();
void displayFollower(Follower *follower, int16 x, int16 y);
void characterInMirror();
void gameToMirror(byte arg1);
void flipMode();
void quitMirror();
void clictimbre();
void actionClickValleyPlan();
void gotoPlace(Goto *go);
void deplaval(uint16 roomNum);
void move(Direction dir);
void move2(Direction dir);
void actionDinoBlow();
void actionPlateMonk();
void actionGraaFrescoe();
void actionLascFrescoe();
void actionPushStone();
void actionMummyHead();
void actionSkelettonHead();
void actionSkelettonMoorkong();
void actionChoose();
void handleDinaDialog();
void handleKingDialog();
void actionKingDialog1();
void actionKingDialog2();
void actionKingDialog3();
void actionGetKnife();
void actionGetPrism();
void actionGetMushroom();
void actionGetBadMushroom();
void actionGetGold();
void actionGetFullNest();
void actionGetEmptyNest();
void actionGetHorn();
void actionGetSunStone();
void actionGetEgg();
void actionGetTablet();
void actionLookLake();
void actionGotoHall();
void actionLabyrinthTurnAround();
void actionGotoFullNest();
void actionGotoVal();
void actionVisit();
void actionFinal();
void actionMoveNorth();
void actionMoveEast();
void actionMoveSouth();
void actionMoveWest();
void afficher128();
void restoreFriezes();
void useMainBank();
void useCharacterBank();
void drawTopScreen();
void displayValleyMap();
void displayMapMark(int16 index, int16 location);
void displayAdamMapMark(int16 location);
void restoreAdamMapMark();
void saveAdamMapMark(int16 x, int16 y);
bool istrice(int16 roomNum);
bool istyran(int16 roomNum);
void istyranval(Area *area);
char getDirection(perso_t *perso);
bool canMoveThere(char loc, perso_t *perso);
void scramble1(uint8 elem[4]);
void scramble2(uint8 elem[4]);
void scrambleDirections();
bool naitredino(char persoType);
void newCitadel(char area, int16 level, Room *room);
void evolveCitadel(int16 level);
void destroyCitadelRoom(int16 roomNum);
void narratorBuildCitadel();
void citadelFalls(char level);
void buildCitadel();
void moveDino(perso_t *perso);
void moveAllDino();
void newValley();
char whereIsCita();
bool isCita(int16 loc);
void placeVava(Area *area);
void vivredino();
void vivreval(int16 areaNum);
void handleDay();
void addTime(int16 t);
void animCharacter();
void getanimrnd();
void addanim();
void removeMouthSprite();
void AnimEndCharacter();
void setCharacterSprite(byte *spr);
void displayCharacter1();
void displayCharacter();
void ef_perso();
void loadCharacter(perso_t *perso);
void loadCurrCharacter();
void fin_perso();
void no_perso();
void closeCharacterScreen();
void displayBackgroundFollower();
void displayNoFollower(int16 bank);
void displayCharacterBackground1();
void displayCharacterBackground();
void setCharacterIcon();
void showCharacter();
void displayCharacterPanel();
void getDataSync();
int16 readFrameNumber();
void waitEndSpeak();
void my_bulle();
void my_pr_bulle();
void drawSubtitleChar(byte c, byte color, int16 width);
void patchSentence();
void vavapers();
void citadelle();
void selectZone();
void showEvents1();
void showEvents();
void parle_mfin();
void parlemoi_normal();
void parle_moi();
void initCharacterPointers(perso_t *perso);
void perso1(perso_t *perso);
void perso_normal(perso_t *perso);
void handleCharacterDialog(int16 pers);
void actionKing();
void actionDina();
void actionThoo();
void actionMonk();
void actionTormentor();
void actionMessenger();
void actionMango();
void actionEve();
void actionAzia();
void actionMammi();
void actionGuards();
void actionBamboo();
void actionKabuka();
void actionFisher();
void actionDino();
void actionTyran();
void actionMorkus();
void comment();
void actionAdam();
void setChoiceYes();
void setChoiceNo();
bool isAnswerYes();
void specialMushroom(perso_t *perso);
void specialEmptyNest(perso_t *perso);
void specialNestWithEggs(perso_t *perso);
void specialApple(perso_t *perso);
void specialGold(perso_t *perso);
void specialPrism(perso_t *perso);
void specialTalisman(perso_t *perso);
void specialMask(perso_t *perso);
void specialBag(perso_t *perso);
void specialTrumpet(perso_t *perso);
void specialWeapons(perso_t *perso);
void specialInstrument(perso_t *perso);
void specialEgg(perso_t *perso);
void tyranDies(perso_t *perso);
void specialObjects(perso_t *perso, char objid);
void dialautoon();
void dialautooff();
void follow();
void dialonfollow();
void abortDialogue();
void subHandleNarrator();
void handleNarrator();
void checkPhraseFile();
byte *getPhrase(int16 id);
void actionGotoMap();
void record();
bool dial_scan(Dialog *dial);
bool dialogEvent(perso_t *perso);
void characterStayHere();
void endDeath(int16 vid);
void chronoEvent();
void setChrono(int16 t);
void verifh(byte *ptr);
void openbigfile();
void closebigfile();
void loadRawFile(uint16 num, byte *buffer);
void loadIconFile(uint16 num, Icon *buffer);
void loadRoomFile(uint16 num, Room *buffer);
int loadSound(uint16 num);
void convertMacToPC();
void loadpermfiles();
bool ReadDataSyncVOC(unsigned int num);
bool ReadDataSync(uint16 num);
void loadpartoffile(uint16 num, void *buffer, int32 pos, int32 len);
void expandHSQ(byte *input, byte *output);
void addInfo(byte info);
void unlockInfo();
void nextInfo();
void removeInfo(byte info);
void updateInfoList();
void initGlobals();
void closeRoom();
void displayPlace();
void loadPlace(int16 num);
void specialoutside();
void specialout();
void specialin();
void animpiece();
void getdino(Room *room);
Room *getRoom(int16 loc);
void initPlace(int16 roomNum);
void maj2();
void updateRoom1(int16 roomNum);
void updateRoom(uint16 roomNum);
void allocateBuffers();
void freebuf();
void EmergencyExit();
void edmain();
void intro();
void enterGame();
void signon(const char *s);
void FRDevents();
Icon *scan_icon_list(int16 x, int16 y, int16 index);
void updateCursor();
void mouse();
void startmusique(byte num);
int loadmusicfile(int16 num);
void persovox();
void endCharacterSpeech();
void fademusicup();
void countObjects();
void winObject(int16 id);
void loseObject(int16 id);
void lostObject();
void objectmain(int16 id);
void getObject(int16 id);
void putObject();
void newObject(int16 id, int16 arg2);
void giveobjectal(int16 id);
void giveObject();
void actionTakeObject();
void newMushroom();
void newEmptyNest();
void newNestWithEggs();
void newGold();
void gotoPanel();
void noclicpanel();
void generique();
void cancel2();
void testvoice();
void load();
void initafterload();
void save();
void desktopcolors();
void panelrestart();
void reallyquit();
void confirmer(char mode, char yesId);
void confirmYes();
void confirmNo();
void restart();
void edenQuit();
void choseSubtitleOption();
void changeVolume();
void changervol();
void newvol(byte *volptr, int16 delta);
void playtape();
void rewindtape();
void moveTapeCursor();
void displayTapeCursor();
void forwardTape();
void stopTape();
void clickTapeCursor();
void displayPanel();
void displayLanguage();
void displayVolCursor(int16 x, int16 vol1, int16 vol2);
void displayCursors();
void selectCursor(int itemId);
void displayTopPanel();
void displayResult();
void restrictCursorArea(int16 xmin, int16 xmax, int16 ymin, int16 ymax);
void edenShudown();
void habitants(perso_t *perso);
void suiveurs(perso_t *perso);
void evenements(perso_t *perso);
void followme(perso_t *perso);
void rangermammi(perso_t *perso, Room *room);
void perso_ici(int16 action);
void setCharacterHere();
void faire_suivre(int16 roomNum);
void AddCharacterToParty();
void addToParty(int16 index);
void removeCharacterFromParty();
void removeFromParty(int16 index);
void handleEloiDeparture();
bool checkEloiReturn();
void handleEloiReturn();
void incPhase();
void phase113();
void phase130();
void phase161();
void phase226();
void phase257();
void phase353();
void phase369();
void phase371();
void phase385();
void phase418();
void phase433();
void phase434();
void phase513();
void phase514();
void phase529();
void phase545();
void phase561();
void bigphase1();
void bigphase();
void phase16();
void phase32();
void phase48();
void phase64();
void phase80();
void phase96();
void phase112();
void phase128();
void phase144();
void phase160();
void phase176();
void phase192();
void phase208();
void phase224();
void phase240();
void phase256();
void phase272();
void phase288();
void phase304();
void phase320();
void phase336();
void phase352();
void phase368();
void phase384();
void phase400();
void phase416();
void phase432();
void phase448();
void phase464();
void phase480();
void phase496();
void phase512();
void phase528();
void phase544();
void phase560();
void saveGame(char *name);
void loadrestart();
void loadgame(char *name);
void syncGame(Common::Serializer s);
void syncGlobalPointers(Common::Serializer s);
void syncGlobalValues(Common::Serializer s);
void syncCitadelRoomPointers(Common::Serializer s);
void syncTapePointers(Common::Serializer s);
char testCondition(int16 index);
uint16 operAdd(uint16 v1, uint16 v2);
uint16 operSub(uint16 v1, uint16 v2);
uint16 operLogicalAnd(uint16 v1, uint16 v2);
uint16 operLogicalOr(uint16 v1, uint16 v2);
uint16 operIsEqual(uint16 v1, uint16 v2);
uint16 operIsSmaller(uint16 v1, uint16 v2);
uint16 operIsGreater(uint16 v1, uint16 v2);
uint16 operIsDifferent(uint16 v1, uint16 v2);
uint16 operIsSmallerOrEqual(uint16 v1, uint16 v2);
uint16 operIsGreaterOrEqual(uint16 v1, uint16 v2);
uint16 operFalse(uint16 v1, uint16 v2);
uint16 operation(byte op, uint16 v1, uint16 v2);
uint16 fetchValue();
uint8 getByteVar(uint16 offset);
uint16 getWordVar(uint16 offset);
void actionNop();
void initSinCosTable();
void makeMatriceFix();
void projectionFix(Cube *cube, int n);
void initCubeMac();
void engineMac();
void displayObject(Cube *cube);
void loadMap(int file_id, byte *buffer);
void NEWcharge_objet_mob(Cube *cube, int fileNum, byte *texturePtr);
void DELETEcharge_objet_mob(Cube *cubep);
static int nextVal(char **ptr, char *error);
void selectMap(int16 num);
void Eden_dep_and_rot();
void restoreZDEP();
void displayPolygoneMapping(Cube *cube, CubeFace *face);
void drawMappingLine(int16 r3, int16 r4, int16 r5, int16 r6, int16 r7, int16 r8, int16 r9, int16 r10, int16 *lines);
void displayMappingLine(int16 r3, int16 r4, byte *target, byte *texture);
void LostEdenMac_InitPrefs();
void initCubePC();
void enginePC();
void selectPCMap(int16 num);
void makeTables();
void getSinCosTables(unsigned short angle, signed char **cos_table, signed char **sin_table);
void rotatePoint(XYZ *point, XYZ *rpoint);
void mapPoint(XYZ *point, short *x, short *y);
short calcFaceArea(XYZ *face);
void paintPixel(XYZ *point, unsigned char pixel);
void paintFace0(XYZ *point);
void paintFace1(XYZ *point);
void paintFace2(XYZ *point);
void paintFace3(XYZ *point);
void paintFace4(XYZ *point);
void paintFace5(XYZ *point);
void paintFaces();
void renderCube();
void incAngleX(int step);
void decAngleX();
void incAngleY(int step);
void decAngleY();
void incZoom();
void decZoom();
CubeCursor *_pcCursor;
int16 tab1[30];
int16 tab2[30];
int8 tab3[36][71];
int16 _angleX, _angleY, _angleZ, _zoomZ, _zoomZStep;
int8 *_cosX, *_sinX;
int8 *_cosY, *_sinY;
int8 *_cosZ, *_sinZ;
uint8 *_face[6], *_newface[6];
int16 _faceSkip;
uint8 _cursor[40 * 40];
uint8 *_cursorCenter;
byte _ownObjects[128];
private:
int16 _scrollPos;
int16 _oldScrollPos;
bool _frescoTalk;
byte _oldPix[8];
Common::Point _adamMapMarkPos;
byte _cursKeepBuf[2500];
bool _torchCursor;
int16 _curBankNum;
bool _paletteUpdateRequired;
bool _cursorSaved;
bool _backgroundSaved;
byte *_bankData;
perso_t *_tyranPtr;
int _lastAnimFrameNumb;
int _curAnimFrameNumb;
int _lastAnimTicks;
int16 _numAnimFrames;
int16 _maxPersoDesc;
int16 _numImgDesc;
bool _restartAnimation;
bool _animationActive;
byte _animationDelay;
byte _animationIndex;
byte _lastAnimationIndex;
byte *dword_30724;
byte *dword_30728; //TODO: rename - something amim-related
byte *_mouthAnimations;
byte *_animationTable;
byte _imageDesc[512];
byte *_characterBankData;
int16 _numTextLines;
byte _sentenceBuffer[400];
byte phraseIconsBuffer[10];
byte _sentenceCoordsBuffer[22];
byte *_textOutPtr;
byte *textout;
object_t *_curSpecialObject;
bool _lastDialogChoice;
bool parlemoiNormalFlag;
bool _closeCharacterDialog;
int dword_30B04;
char _lastPhrasesFile;
byte _dialogSkipFlags;
byte *_voiceSamplesBuffer; //TODO: sound sample buffer
Common::File _bigfile;
byte _infoList[16];
byte *_mainBankBuf;
byte *_musicBuf;
byte *_gameLipsync;
byte *_gamePhrases;
byte *_gameDialogs; //TODO: rename to dialogs?
byte *_gameConditions;
byte *_placeRawBuf; //TODO: fixme
byte *_bankDataBuf;
Icon *_gameIcons;
Room *_gameRooms;
PakHeaderNode *_bigfileHeader;
byte *_glowBuffer;
byte *_gameFont; //TODO: rename to font?
uint16 _mouseCenterX;
uint16 _mouseCenterY;
bool _bufferAllocationErrorFl;
bool _quitFlag2;
bool _quitFlag3;
bool _gameStarted;
bool _soundAllocated;
CSoundChannel *_musicChannel;
CSoundChannel *_voiceChannel;
int _demoCurrentTicks;
int _demoStartTicks;
int _currentTime;
int16 _cirsorPanX;
int16 _inventoryScrollDelay;
int16 _cursorPosX;
int16 _cursorPosY;
int16 _currCursor;
Icon *_currSpot;
Icon *_curSpot2;
bool _mouseHeld;
bool _normalCursor;
bool _specialTextMode;
int _voiceSamplesSize; //TODO: perso vox sample data len
int16 _musicRightVol;
int16 _musicLeftVol;
bool _animateTalking;
bool _personTalking;
byte _musicFadeFlag;
char _musicSequencePos;
bool _musicPlayingFlag;
byte *_musicSamplesPtr;
byte *_musicPatternsPtr; //TODO: sndblock_t ?
byte *_musSequencePtr;
bool _musicEnabledFlag;
uint16 *_currentObjectLocation;
bool byte_31D64;
bool _noPalette;
bool _gameLoaded;
#define MAX_TAPES 16
tape_t _tapes[MAX_TAPES];
byte _confirmMode;
byte *_curSliderValuePtr;
byte _lastMenuItemIdLo;
int16 _lastTapeRoomNum;
int16 _curSliderX;
int16 _curSliderY;
int16 _destinationRoom;
int16 word_31E7A; // CHECKME: Unused?
int16 word_378CC; // TODO: set by CLComputer_Init to 0
int16 word_378CE; // CHECKME: Unused
int _invIconsCount;
int _invIconsBase;
int _roomIconsBase;
//// cube.c
int16 _cosTable[361];
int16 _sinTable[361];
int _passMat31, _passMat21, _passMat11;
int _passMat32, _passMat22, _passMat12;
int _passMat33, _passMat23, _passMat13;
int16 _rotationAngleY; // CHECKME: USeless?
int16 _rotationAngleX, _rotationAngleZ;
float _translationY, _translationX; // CHECKME: Useless?
Cube _cube;
int16 _cursCurPCMap;
int16 _lines[200 * 8];
byte _cubeTexture[0x4000];
int _cubeFaces;
uint32 _cursorOldTick, _cursorNewTick;
byte *_codePtr;
uint8 tab_2CB1E[8][4];
const unsigned int kMaxMusicSize; // largest .mus file size
// Loaded from cryo.dat
Follower _followerList[15];
byte _labyrinthPath[70];
char _dinoSpeedForCitadelLevel[16];
char _tabletView[12];
char _personRoomBankTable[84]; // special character backgrounds for specific rooms
// Loaded from cryo.dat - Area transition descriptors
Goto _gotos[130];
object_t _objects[42];
uint16 _objectLocations[45];
perso_t _persons[58];
Citadel _citadelList[7];
// Loaded from cryo.dat
Common::Rect _characterRects[19];
byte _characterArray[20][5];
Area _areasTable[12];
int16 tab_2CEF0[64];
int16 tab_2CF70[64];
byte _actionCursors[299];
byte _mapMode[12];
byte _cubeTextureCoords[3][6 * 2 * 3 * 2];
int32 _translationZ;
int8 _zDirection; // 1 (up) or -1 (down)
// Torch/glow related
int16 _torchTick;
int16 _glowIndex;
int16 _torchCurIndex;
int _cursCenter;
};
}
#endif