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

841 lines
17 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/>.
*
*/
#include "cryo/cryolib.h"
#ifndef CRYO_DEFS_H
#define CRYO_DEFS_H
namespace Cryo {
#define getElem(array, idx) \
( (char *)(array) + READ_LE_UINT16((idx) * 2 + (char *)(array)) )
///////////////// Game defs
#define FONT_HEIGHT 9
/*
Glossary
room - a single game world's screen. referenced by 16-bit number 0xAALL, where AA - area# and LL - location#
area - geographic area - Mo, Chamaar, etc
location - coordinates of particular room in an area. usually in form of 0xXY, where X - map row, Y - map column
character - an unique character (human or dino.) Has their own voice/dialog lines
person - instance of a character. Usually tied to specific room, but some may travel with you
party - a group of characters that travel with you
object - inventory item
icon - clickable rectangle with some action tied to it
dialog - a set of of dialog lines for character. further divided by categories and each entry may have associated
condition to be validated
global - game-wide storage area. must be preserved when saving/loading
phase - current story progress. Incremented by 1 for minor events, by 0x10 for major advancements
*/
enum Phases {
phNewGame = 0
};
namespace Areas {
enum Areas {
arMo = 1,
arTausCave,
arChamaar,
arUluru,
arKoto,
arTamara,
arCantura,
arShandovra,
arNarimsCave,
arEmbalmersCave,
arWhiteArch,
arMoorkusLair
};
}
#define MKRM(a,l) (((a) << 8) | (l))
enum OBJECT {
OBJ_0,
OBJ_1,
OBJ_2,
OBJ_3,
OBJ_4,
OBJ_PRISME, // 5
OBJ_6,
OBJ_7,
OBJ_OEUF, // 8
OBJ_9,
OBJ_10,
OBJ_CHAMPB, // 11
OBJ_CHAMPM, // 12
OBJ_COUTEAU, // 13
OBJ_NIDV, // 14
OBJ_NIDO, // 15
OBJ_OR, // 16
OBJ_17,
OBJ_18,
OBJ_SOLEIL, // 19
OBJ_CORNE, // 20
OBJ_21,
OBJ_22,
OBJ_23,
OBJ_24,
OBJ_25,
OBJ_26,
OBJ_27,
OBJ_28,
OBJ_29,
OBJ_30,
OBJ_31,
OBJ_32,
OBJ_33,
OBJ_34,
OBJ_35,
OBJ_36, // 36 is 1st plaque, 6 total
OBJ_37,
OBJ_PLAQUE, // 38
OBJ_39,
OBJ_40,
OBJ_41
};
namespace Objects {
enum Objects {
obNone,
obWayStone,
obShell,
obTalisman,
obTooth,
obPrism, // 5
obFlute,
obApple,
obEgg, // 8
obRoot,
obUnused10,
obShroom, // 11
obBadShroom, // 12
obKnife, // 13
obNest, // 14
obFullNest, // 15
obGold, // 16
obMoonStone,
obBag,
obSunStone, // 19
obHorn, // 20
obSword,
obMaskOfDeath,
obMaskOfBonding,
obMaskOfBirth,
obEyeInTheStorm, // 25
obSkyHammer,
obFireInTheClouds,
obWithinAndWithout,
obEyeInTheCyclone,
obRiverThatWinds,
obTrumpet, // 31
obUnused32,
obDrum,
obUnused34,
obUnused35,
obRing,
obTablet1, // 37 is 1st plaque, 6 total
obTablet2,
obTablet3, // 39
obTablet4,
obTablet5,
obTablet6
};
}
enum PERSO {
PER_KING = 0,
PER_DINA, // 0x12
PER_TAU, // 0x24
PER_MONK, // 0x36
PER_JABBER, // 0x48
PER_ELOI, // 0x5A
PER_MUNGO, // 0x6C
PER_EVE, // 0x7E
PER_SHAZIA, // 0x90
PER_MAMMI, // 0xA2
PER_MAMMI_1, // 0xB4
PER_MAMMI_2, // 0xC6
PER_MAMMI_3, // 0xD8
PER_MAMMI_4, // 0xEA
PER_MAMMI_5, // 0xFC
PER_MAMMI_6, // 0x10E
PER_BAMBOO, // 0x120
PER_KABUKA, // 0x132
PER_GUARDS, // 0x144
PER_UNKN_156, // 0x156
PER_FISHER, // 0x168
PER_MORKUS, // 0x17A
PER_UNKN_18C, // 0x18C
PER_UNKN_19E, // 0x19E
PER_UNKN_1B0, // 0x1B0
PER_UNKN_1C2, // 0x1C2
PER_UNKN_1D4, // 0x1D4
PER_UNKN_1E6, // 0x1E6
PER_UNKN_1F8, // 0x1F8
PER_UNKN_20A, // 0x20A
PER_UNKN_21C, // 0x21C
PER_UNKN_22E, // 0x22E
PER_UNKN_240, // 0x240
PER_UNKN_252, // 0x252
PER_UNKN_264, // 0x264
PER_UNKN_276, // 0x276
PER_UNKN_288, // 0x288
PER_UNKN_29A, // 0x29A
PER_UNKN_2AC, // 0x2AC
PER_UNKN_2BE, // 0x2BE
PER_UNKN_2D0, // 0x2D0
PER_UNKN_2E2, // 0x2E2
PER_UNKN_2F4, // 0x2F4
PER_UNKN_306, // 0x306
PER_UNKN_318, // 0x318
PER_UNKN_32A, // 0x32A
PER_UNKN_33C, // 0x33C
PER_UNKN_34E, // 0x34E
PER_UNKN_360, // 0x360
PER_UNKN_372, // 0x372
PER_UNKN_384, // 0x384
PER_UNKN_396, // 0x396
PER_UNKN_3A8, // 0x3A8
PER_UNKN_3BA, // 0x3BA
PER_UNKN_3CC, // 0x3CC
PER_UNKN_3DE, // 0x3DE
PER_UNKN_3F0, // 0x3F0
PER_UNKN_402 // 0x402
};
namespace PersonId {
enum PersonId {
pidGregor = 0, // The King
pidDina, // Pink dino
pidTau, // Late grandpa
pidMonk, // Old wizard
pidJabber, // Executioner
pidEloi, // Evergreen ptero
pidMungo, // Dina's husband
pidEve, // Blonde girl
pidShazia, // Big boobs sis
pidLeadersBegin, // 9
pidChongOfChamaar = pidLeadersBegin, // Dogface
pidKommalaOfKoto, // Clones
pidUlanOfUlele, // Shaman
pidCabukaOfCantura, // Stone people
pidMarindaOfEmbalmers, // Gods
pidFuggOfTamara, // Boar-like
pidThugg, // Bodyguard
pidNarrator, // 16, Old Eloi, also BGM
pidNarrim, // Sea snake
pidMorkus, // Vicious tyran
pidDinosaur, // different species of friendly dino
pidEnemy // different species of enemy dino
};
}
// person in room mask bits
namespace PersonMask {
enum PersonMask {
pmGregor = 1,
pmDina = 2,
pmTau = 4,
pmMonk = 8,
pmJabber = 0x10,
pmEloi = 0x20,
pmMungo = 0x40,
pmEve = 0x80,
pmShazia = 0x100,
pmLeader = 0x200, // valley tribe leader
pmThugg = 0x400,
pmQuest = 0x800, // special quest person
pmDino = 0x1000,
pmEnemy = 0x2000,
pmMorkus = 0x4000
};
}
namespace PersonFlags {
enum PersonFlags {
pfType0 = 0,
pftTyrann,
pfType2,
pfType3,
pfType4,
pfType5,
pfType6,
pfType7,
pfType8,
pftMosasaurus,
pftTriceraptor,
pftVelociraptor,
pfType12,
pfType13,
pfType14,
pfType15,
pfTypeMask = 0xF,
pf10 = 0x10,
pf20 = 0x20,
pfInParty = 0x40,
pf80 = 0x80
};
}
#include "common/pack-start.h"
struct perso_t {
uint16 _roomNum; // room this person currently in
uint16 _actionId; // TODO: checkme
uint16 _partyMask; // party bit mask
byte _id; // character
byte _flags; // flags and kind
byte _roomBankId;// index in _personRoomBankTable for specific room banks
byte _spriteBank; // sprite bank
uint16 _items; // inventory
uint16 _powers; // obj of power bitmask
byte _targetLoc; // For party member this is mini sprite index
byte _lastLoc; // For party member this is mini sprite x offset
byte _speed; // num ticks per step
byte _steps; // current ticks
void clear() {
_roomNum = _actionId = _partyMask = 0;
_id = _flags = _roomBankId = _spriteBank = 0;
_items = _powers = 0;
_targetLoc = _lastLoc = _speed = _steps = 0;
}
};
namespace ObjectFlags {
enum ObjectFlags {
ofFlag1 = 1,
ofInHands = 2 // Currently holding this object in hands
};
}
#define MAX_OBJECTS 42
struct object_t {
byte _id;
byte _flags;
int _locations; // index in _objectLocations
uint16 _itemMask;
uint16 _powerMask; // object of power bitmask
int16 _count;
void clear() {
_id = _flags = 0;
_locations = 0;
_itemMask = _powerMask = 0;
_count = 0;
}
};
namespace DialogFlags {
enum DialogFlags {
df20 = 0x20,
dfRepeatable = 0x40,
dfSpoken = 0x80
};
}
namespace DialogType {
enum DialogType {
dtTalk = 0,
dtDinoAction,
dtDinoItem,
dtItem,
dtEvent,
dtInspect,
dtHint
};
}
struct Dialog {
int8 _flags; // 0-3 - action index, 4 - highest bit of contidion index, rest is DialogFlags
int8 _condNumLow; // condition index low bits
int8 _textCondHiMask; // 0-1 text index hi bits, 2-5 - perso mask num, 6-7 condition index hi bits
int8 _textNumLow; // text line index low bits
};
struct tape_t {
int16 _textNum;
perso_t *_perso;
int16 _party;
int16 _roomNum;
int16 _backgroundBankNum;
Dialog *_dialog;
};
struct Follower { // Characters on Mirror screen
int8 _id; // character
int8 _spriteNum; // sprite number
int16 sx;
int16 sy;
int16 ex;
int16 ey;
int16 _spriteBank;
int16 ff_C;
int16 ff_E;
};
struct Icon {
int16 sx;
int16 sy;
int16 ex;
int16 ey;
uint16 _cursorId; // & 0x8000 - inactive/hidden
uint32 _actionId;
uint32 _objectId;
};
struct Goto {
byte _areaNum; // target area
byte _curAreaNum; // current area
byte _enterVideoNum;
byte _travelTime; // time to skip while in travel
byte _arriveVideoNum;
};
namespace RoomFlags {
enum RoomFlags {
rf01 = 1,
rf02 = 2,
rf04 = 4,
rf08 = 8,
rfPanable = 0x10,
rfHasCitadel = 0x20,
rf40 = 0x40,
rf80 = 0x80
};
}
struct Room {
byte _id;
byte _exits[4]; //TODO: signed?
byte _flags;
uint16 _bank;
uint16 _party;
byte _level; // Citadel level
byte _video;
byte _location;
byte _backgroundBankNum; // bg/mirror image number (relative)
};
namespace AreaFlags {
enum AreaFlags {
afFlag1 = 1,
afFlag2 = 2,
afFlag4 = 4,
afFlag8 = 8,
afGaveGold = 0x10,
afFlag20 = 0x20,
HasTriceraptors = 0x100,
HasVelociraptors = 0x200,
HasTyrann = 0x400,
TyrannSighted = 0x4000,
afFlag8000 = 0x8000
};
}
namespace AreaType {
enum AreaType {
atCitadel = 1,
atValley = 2,
atCave = 3
};
}
struct Area {
byte _num;
byte _type;
uint16 _flags;
uint16 _firstRoomIdx;
byte _citadelLevel;
byte _placeNum;
Room *_citadelRoomPtr;
int16 _visitCount;
void clear() {
_num = _type = 0;
_flags = _firstRoomIdx = 0;
_citadelLevel = _placeNum = 0;
_citadelRoomPtr = nullptr;
_visitCount = 0;
}
};
namespace ValleyNews {
enum ValleyNews {
vnAreaMask = 0xF,
vnTriceraptorsIn = 0x10,
vnVelociraptorsIn = 0x20,
vnTyrannIn = 0x30,
vnTyrannLost = 0x40,
vnCitadelLost = 0x50,
vnVelociraptorsLost = 0x60,
vnFree = 0,
vnHidden = 0x80,
vnEnd = 0xFF
};
}
namespace DisplayFlags {
enum DisplayFlags {
dfFlag1 = 1,
dfFlag2 = 2,
dfMirror = 4,
dfPerson = 8,
dfFrescoes = 0x10,
dfPanable = 0x20,
dfFlag40 = 0x40,
dfFlag80 = 0x80
};
}
namespace DrawFlags {
enum DrawFlags {
drDrawInventory = 1,
drDrawFlag2 = 2,
drDrawTopScreen = 4,
drDrawFlag8 = 8,
drDrawMenu = 0x10,
drDrawFlag20 = 0x20
};
}
namespace MenuFlags {
enum MenuFlags {
mfFlag1 = 1,
mfFlag2 = 2,
mfFlag4 = 4,
mfFlag8 = 8,
mfFlag10 = 0x10
};
}
namespace MusicType {
enum MusicType { //TODO: same as DialogType?
mtDontChange = 0,
mtNormal = 1,
mt2 = 2,
mtEvent = 4,
mtFF = 0xFF
};
}
namespace EventType {
enum EventType {
etEvent1 = 1,
etEvent2 = 2,
etEvent3 = 3,
etEvent4 = 4,
etEvent5 = 5,
etEvent6 = 6,
etEvent7 = 7,
etEvent8 = 8,
etEvent9 = 9,
etEventB = 11,
etEventC = 12,
etEventD = 13,
etEventE = 14,
etEventF = 15,
etEvent10 = 16,
etEvent12 = 18,
etGotoArea = 0x80 // + area id
};
}
namespace GameFlags {
enum GameFlags {
gfNone = 0,
gfMummyOpened = 1,
gfFlag2 = 2,
gfFlag4 = 4,
gfFlag8 = 8,
gfFlag10 = 0x10,
gfFlag20 = 0x20,
gfFlag40 = 0x40,
gfFlag80 = 0x80,
gfFlag100 = 0x100,
gfFlag200 = 0x200,
gfFlag400 = 0x400,
gfPrismAndMonk = 0x800,
gfFlag1000 = 0x1000,
gfFlag2000 = 0x2000,
gfFlag4000 = 0x4000,
gfFlag8000 = 0x8000
};
}
struct global_t {
byte _areaNum;
byte _areaVisitCount;
byte _menuItemIdLo;
byte _menuItemIdHi; //TODO: pad?
uint16 _randomNumber; //TODO: this is randomized in pc ver and used by some conds. always zero on mac
uint16 _gameTime;
uint16 _gameDays;
uint16 _chrono;
uint16 _eloiDepartureDay;
uint16 _roomNum; // current room number
uint16 _newRoomNum; // target room number selected on world map
uint16 _phaseNum;
uint16 _metPersonsMask1;
uint16 _party;
uint16 _partyOutside;
uint16 _metPersonsMask2;
uint16 _var1C; //TODO: write-only?
uint16 _phaseActionsCount;
uint16 _curAreaFlags;
uint16 _curItemsMask;
uint16 _curPowersMask;
uint16 _curPersoItems;
uint16 _curCharacterPowers;
uint16 _wonItemsMask;
uint16 _wonPowersMask;
uint16 _stepsToFindAppleFast;
uint16 _stepsToFindAppleNormal;
uint16 _roomPersoItems; //TODO: write-only?
uint16 _roomCharacterPowers; //TODO: write-only?
uint16 _gameFlags;
uint16 _curVideoNum;
uint16 _morkusSpyVideoNum1; //TODO: pad?
uint16 _morkusSpyVideoNum2; //TODO: pad?
uint16 _morkusSpyVideoNum3; //TODO: pad?
uint16 _morkusSpyVideoNum4; //TODO: pad?
byte _newMusicType;
byte _var43;
byte _videoSubtitleIndex;
byte _partyInstruments; // &1 - Bell for Monk, &2 - Drum for Thugg
byte _monkGotRing;
byte _chronoFlag;
byte _curRoomFlags;
byte _endGameFlag;
byte _lastInfo;
bool _autoDialog;
byte _worldTyranSighted;
byte _var4D;
byte _var4E;
byte _worldGaveGold;
byte _worldHasTriceraptors;
byte _worldHasVelociraptors;
byte _worldHasTyran;
byte _var53;
byte _var54; //CHEKME: Used?
byte _var55; //TODO: pad?
byte _gameHours;
byte _textToken1;
byte _textToken2; //TODO: pad?
byte _eloiHaveNews;
byte _dialogFlags;
byte _curAreaType;
byte _curCitadelLevel;
byte _newLocation;
byte _prevLocation;
byte _curPersoFlags;
byte _var60;
byte _eventType;
byte _var62; //TODO: pad?
byte _curObjectId;
byte _curObjectFlags;
byte _var65; //TODO: pad?
byte _roomCharacterType;
byte _roomCharacterFlags;
byte _narratorSequence;
byte _var69;
byte _var6A;
byte _frescoNumber;
byte _var6C; //TODO: pad?
byte _var6D; //TODO: pad?
byte _labyrinthDirections;
byte _labyrinthRoom;
Dialog *_dialogPtr;
tape_t *_tapePtr;
Dialog *_nextDialogPtr;
Dialog *_narratorDialogPtr;
Dialog *_lastDialogPtr;
Icon *_nextRoomIcon;
byte *_sentenceBufferPtr;
Room *_roomPtr;
Area *_areaPtr;
Area *_lastAreaPtr;
Area *_curAreaPtr;
Room *_citaAreaFirstRoom;
perso_t *_characterPtr;
perso_t *_roomCharacterPtr;
byte _lastInfoIdx;
byte _nextInfoIdx;
byte *_persoSpritePtr;
byte *_persoSpritePtr2;
byte *_curCharacterAnimPtr;
byte *_varC2; //TODO: image desc arr
int16 _iconsIndex;
int16 _curObjectCursor; // TODO: useless?
int16 _varCA;
int16 _varCC; //TODO: unused/pad
int16 _characterImageBank; //TODO: unsigned?
uint16 _roomImgBank;
uint16 _characterBackgroundBankIdx;
uint16 _varD4; //TODO: unsigned?
uint16 _frescoeWidth;
uint16 _frescoeImgBank;
uint16 _varDA; //TODO: pad?
uint16 _varDC; //TODO: pad?
uint16 _roomBaseX;
uint16 _varE0; //TODO: pad?
uint16 _dialogType;
uint16 _varE4; //TODO: pad?
uint16 _currMusicNum;
int16 _textNum;
uint16 _travelTime;
uint16 _varEC; //TODO: pad?
byte _displayFlags;
byte _oldDisplayFlags;
byte _drawFlags;
byte _varF1;
byte _varF2;
byte _menuFlags;
byte _varF4; //TODO: write-only?
byte _varF5;
byte _varF6;
byte _varF7;
byte _varF8; //TODO: pad?
byte _varF9; //TODO: pad?
byte _varFA; //TODO: pad?
byte _animationFlags;
byte _giveObj1;
byte _giveObj2;
byte _giveObj3;
byte _var100;
byte _roomVidNum;
byte _mirrorEffect;
byte _var103;
byte _roomBackgroundBankNum;
byte _valleyVidNum;
byte _updatePaletteFlag;
byte _inventoryScrollPos;
byte _objCount;
byte _textBankIndex;
byte _prefLanguage;
byte _prefMusicVol[2];
byte _prefVoiceVol[2];
byte _prefSoundVolume[2];
byte _citadelAreaNum;
byte _var113;
byte _lastPlaceNum;
byte _saveEnd; // TODO: This has to be removed
int16 _textWidthLimit;
byte _numGiveObjs;
byte _var119; // unused
};
#include "common/pack-end.h"
struct PakHeaderItem {
Common::String _name; //[16];
int32 _size;
int32 _offs;
char _flag;
};
class PakHeaderNode {
public:
PakHeaderNode(int count);
~PakHeaderNode();
uint16 _count;
PakHeaderItem* _files;
};
struct Citadel {
int16 _id;
int16 _bank[8];
int16 _video[8];
void clear() {
_id = 0;
for (int i = 0; i < 8; ++i) {
_bank[i] = 0;
_video[i] = 0;
}
}
};
/*
Labyrinth of Mo
| | | | | | | |
*/
enum {
LAB_N = 1,
LAB_E,
LAB_S,
LAB_W
};
struct CubeFace {
int tri;
char ff_4;
char ff_5;
byte *_texturePtr;
uint16 *_indices;
int16 *_uv;
};
struct Point3D {
int16 x;
int16 y;
int16 z;
};
struct Cube {
int _num;
CubeFace **_faces;
Point3D *_projection; // projected XYZ coords
Point3D *_vertices;
};
struct XYZ {
signed short x, y, z;
};
struct CubeCursor {
uint8 _sides[6]; // spr idx for each side
uint8 _kind;
int8 _speed;
};
} // End of namespace Cryo
#endif