scummvm/engines/saga2/idtypes.h
2021-07-01 01:37:16 +02:00

348 lines
8.8 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.
*
*
* Based on the original sources
* Faery Tale II -- The Halls of the Dead
* (c) 1993-1996 The Wyrmkeep Entertainment Co.
*/
#ifndef SAGA2_IDTYPES_H
#define SAGA2_IDTYPES_H
namespace Saga2 {
/* ===================================================================== *
ObjectID
* ===================================================================== */
typedef uint16 ObjectID; // a reference to a script
// Some fixed objects
const ObjectID Nothing = 0, // a reference to no object
ObjectLimbo = 1, // where dead objects go
ActorLimbo = 2, // where dead actors go
ImportantLimbo = 3, // where dead important objects go
ActorBaseID = 0x8000, // high bit set for actors
WorldBaseID = 0xF000; // 4K posible worlds
/* ===================================================================== *
TileID
* ===================================================================== */
typedef uint16 TileID;
const int nullID = 0xffff;
/* ===================================================================== *
PlayerActorID
* ===================================================================== */
typedef int16 PlayerActorID;
/* ===================================================================== *
MetaTileID struct
* ===================================================================== */
struct MetaTileID {
int16 map; // map number
int16 index; // index into metatile array
// Default constructor
MetaTileID(void) {}
// Copy constructor
MetaTileID(const MetaTileID &id) : map(id.map), index(id.index) {}
// Constructor
MetaTileID(int16 m, int16 i) : map(m), index(i) {}
MetaTileID operator = (const MetaTileID &id) {
map = id.map;
index = id.index;
return *this;
}
bool operator == (const MetaTileID &id) const {
return map == id.map && index == id.index;
}
bool operator != (const MetaTileID &id) const {
return map != id.map || index != id.index;
}
};
// ID of NULL meta tile
extern const MetaTileID NoMetaTile;
/* ===================================================================== *
ActiveItemID struct
* ===================================================================== */
const int activeItemIndexMask = 0x1FFF;
const int activeItemMapMask = 0xE000;
const int activeItemMapShift = 13;
const int16 activeItemIndexNullID = 0x1FFF;
class ActiveItemID {
private:
int16 val; // ID value --
// first 3 bits world number
// next 13 bits index
public:
// Default constructor
ActiveItemID(void) {}
// Copy constructor
ActiveItemID(const ActiveItemID &id) : val(id.val) {
}
// Constructor
ActiveItemID(int16 idVal) : val(idVal) {}
// Constructor
#if DEBUG
ActiveItemID(int16 m, int16 i);
#else
ActiveItemID(int16 m, int16 i) :
val((m << activeItemMapShift) | (i & activeItemIndexMask)) {
}
#endif
ActiveItemID operator = (const ActiveItemID &id) {
val = id.val;
return *this;
}
ActiveItemID operator = (int16 idVal) {
val = idVal;
return *this;
}
bool operator == (const ActiveItemID &id) const {
return val == id.val;
}
bool operator != (const ActiveItemID &id) const {
return val != id.val;
}
operator int16(void) {
return val;
}
#if DEBUG
void setMapNum(int16 m);
#else
void setMapNum(int16 m) {
val &= ~activeItemMapMask;
val |= (m << activeItemMapShift);
}
#endif
int16 getMapNum(void) {
return (uint16)val >> activeItemMapShift;
}
#if DEBUG
void setIndexNum(int16 i);
#else
void setIndexNum(int16 i) {
val &= ~activeItemIndexMask;
val |= i & activeItemIndexMask;
}
#endif
int16 getIndexNum(void) {
return val & activeItemIndexMask;
}
};
// ID of NULL active item
extern const ActiveItemID NoActiveItem;
/* ===================================================================== *
Task's and TaskStacks
* ===================================================================== */
// Task evaluation return types
enum TaskResult {
taskFailed = -1, // Task has ended in failure
taskNotDone = 0, // Task has not ended yet
taskSucceeded = 1, // Task has ended in success
};
typedef int16 TaskID;
const TaskID NoTask = -1;
typedef int16 TaskStackID;
const TaskStackID NoTaskStack = -1;
/* ===================================================================== *
TimerID
* ===================================================================== */
typedef int16 TimerID;
/* ===================================================================== *
SensorID
* ===================================================================== */
typedef int16 SensorID;
/* ===================================================================== *
BandID
* ===================================================================== */
typedef int16 BandID;
const BandID NoBand = -1;
typedef uint32 soundSegment;
typedef uint8 gPen; // a pen index number
typedef uint16 weaponID;
typedef uint32 hResID;
typedef uint8 ColorTable[256];
// number of containers
const int kNumViews = 3;
enum {
kMaxWeapons = 256
};
//
// Damage effects - these are the types of damage in the world
// Damage being defined as a change in effective vitality
// Note that healing is negative damage.
//
enum effectDamageTypes {
// Generic
damageOther = 0, // Healing, cause wounds
// Combat damage
damageImpact = 1, // hammers, maces
damageSlash = 2, // swords
damageProjectile = 3, // arrows, poin-ted sticks
// Magic damage
damageFire = 4, // Yellow
damageAcid = 5, // Violet
damageHeat = 6, // Red
damageCold = 7, // Blue
damageLightning = 8, // Orange
damagePoison = 9, // Green
// Other magic damage
damageMental = 10, // dain bramage
damageToUndead = 11, // undead take this damage
damageDirMagic = 12, // the plusses on swords etc.
// Physiological Damage
damageStarve = 13, // You must eat!
// other
damageEnergy = 14 // Generally hard to resist - god damage
};
// Tile metrics
enum {
kTileWidth = 64,
kTileHeight = 32,
kTileMaxHeight = 160,
kTileDX = (kTileWidth / 2),
kTileDY = (kTileHeight / 2),
kTileDXShift = 5,
kTileDYShift = 4,
kTileDXMask = (kTileDX - 1),
kTileDYMask = (kTileDY - 1),
kMaxTileHeight = 160
};
// Size of a tile in ( U, V ) coords
enum {
kTileUVSize = 16,
kTileUVShift = 4,
kTileZSize = 8,
kTileZShift = 3,
kTileUVMask = (kTileUVSize - 1)
};
// Size of a map sector (4 metatiles x 4 metatiles)
enum {
kSectorSize = kTileUVSize * 8 * 4,
kSectorShift = kTileUVShift + 3 + 2,
kSectorMask = (kSectorSize - 1)
};
// Plaftorm metrics
enum {
kPlatformWidth = 8,
kPlatMask = kPlatformWidth - 1,
kPlatShift = 3,
kPlatUVSize = kTileUVSize * kPlatformWidth
};
// Metatile metrics
enum {
metaTileWidth = kTileWidth * kPlatformWidth,
metaTileHeight = kTileHeight * kPlatformWidth,
metaDX = metaTileWidth / 2,
metaDY = metaTileHeight / 2
};
enum {
subTileSize = 4,
subTileMask = subTileSize - 1,
subTileShift = 2,
tileSubSize = 4,
tileSubMask = tileSubSize - 1,
tileSubShift = 2
};
// Constants to convert an X,Y into subtile coordinates
enum {
subTileDX = (kTileDX / 4),
subTileDY = (kTileDY / 4),
subTileDXShift = (kTileDXShift - 2),
subTileDYShift = (kTileDYShift - 2)
};
enum {
subTileMaskUShift = 4,
subTileMaskVShift = 1
};
// Maximum height that a character can climb w/o steps or ladders
enum {
maxStepHeight = 16, // highest climbable step
maxPickHeight = 64, // highest pickable step
maxSmoothStep = 8, // highest smoothly climbable
maxJumpStep = 64 // highest jump character likes
};
} // end of namespace Saga2
#endif