379 lines
12 KiB
C++
379 lines
12 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.
|
|
*
|
|
* Additional copyright for this file:
|
|
* Copyright (C) 1995-1997 Presto Studios, Inc.
|
|
*
|
|
* 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 PEGASUS_ITEMS_ITEM_H
|
|
#define PEGASUS_ITEMS_ITEM_H
|
|
|
|
#include "common/endian.h"
|
|
|
|
#include "pegasus/types.h"
|
|
#include "pegasus/util.h"
|
|
|
|
namespace Common {
|
|
class Error;
|
|
class ReadStream;
|
|
class WriteStream;
|
|
class SeekableReadStream;
|
|
}
|
|
|
|
namespace Pegasus {
|
|
|
|
// JMPItemInfo contains resource data used by all Items.
|
|
|
|
struct JMPItemInfo {
|
|
TimeValue infoLeftTime;
|
|
TimeValue infoRightStart;
|
|
TimeValue infoRightStop;
|
|
uint32 dragSpriteNormalID;
|
|
uint32 dragSpriteUsedID;
|
|
};
|
|
|
|
// ItemStateEntry contains a single state/TimeValue pair. The TimeValue is
|
|
// the time value to set the shared area movie that corresponds with the given
|
|
// state of an inventory item.
|
|
|
|
struct ItemStateEntry {
|
|
ItemState itemState;
|
|
TimeValue itemTime;
|
|
};
|
|
|
|
struct ItemStateInfo {
|
|
uint16 numEntries; // For easy ResEdit access
|
|
ItemStateEntry *entries;
|
|
};
|
|
|
|
// ItemExtraEntry
|
|
|
|
static const short kLeftAreaExtra = 0;
|
|
static const short kMiddleAreaExtra = 1;
|
|
static const short kRightAreaExtra = 2;
|
|
|
|
struct ItemExtraEntry {
|
|
uint32 extraID;
|
|
uint16 extraArea;
|
|
TimeValue extraStart;
|
|
TimeValue extraStop;
|
|
};
|
|
|
|
struct ItemExtraInfo {
|
|
uint16 numEntries; // For easy ResEdit access
|
|
ItemExtraEntry *entries;
|
|
};
|
|
|
|
// Inventory info resource type and ID:
|
|
// Individual inventory items are stored in these resource types.
|
|
// Resource ID is item ID + kItemBaseResID.
|
|
|
|
static const uint32 kItemInfoResType = MKTAG('I', 't', 'e', 'm'); // JMPItemInfoHandle
|
|
static const uint32 kLeftAreaInfoResType = MKTAG('L', 'e', 'f', 't'); // ItemStateInfoHandle
|
|
static const uint32 kMiddleAreaInfoResType = MKTAG('M', 'i', 'd', 'l'); // ItemStateInfoHandle
|
|
static const uint32 kRightAreaInfoResType = MKTAG('R', 'g', 'h', 't'); // ItemStateInfoHandle
|
|
static const uint32 kItemExtraInfoResType = MKTAG('I', 'X', 't', 'r'); // ItemExtraInfoHandle
|
|
|
|
static const uint16 kItemBaseResID = 128;
|
|
|
|
// Item IDs.
|
|
|
|
static const ItemID kAirMask = 7;
|
|
static const ItemID kAntidote = 8;
|
|
static const ItemID kArgonCanister = 9;
|
|
static const ItemID kCardBomb = 10;
|
|
static const ItemID kCrowbar = 11;
|
|
static const ItemID kGasCanister = 12;
|
|
static const ItemID kHistoricalLog = 13;
|
|
static const ItemID kJourneymanKey = 14;
|
|
static const ItemID kKeyCard = 15;
|
|
static const ItemID kMachineGun = 16;
|
|
static const ItemID kMarsCard = 17;
|
|
static const ItemID kNitrogenCanister = 18;
|
|
static const ItemID kOrangeJuiceGlassFull = 19;
|
|
static const ItemID kOrangeJuiceGlassEmpty = 20;
|
|
static const ItemID kPoisonDart = 21;
|
|
static const ItemID kSinclairKey = 22;
|
|
static const ItemID kStunGun = 23;
|
|
static const ItemID kArgonPickup = 24;
|
|
|
|
// Biochips.
|
|
|
|
static const ItemID kAIBiochip = 0;
|
|
static const ItemID kArthurBiochip = 1;
|
|
static const ItemID kInterfaceBiochip = 1;
|
|
static const ItemID kMapBiochip = 2;
|
|
static const ItemID kOpticalBiochip = 3;
|
|
static const ItemID kPegasusBiochip = 4;
|
|
static const ItemID kRetinalScanBiochip = 5;
|
|
static const ItemID kShieldBiochip = 6;
|
|
|
|
static const ItemID kNumItems = 25;
|
|
|
|
// Item States.
|
|
|
|
static const ItemState kAI000 = 0;
|
|
static const ItemState kAI005 = 1;
|
|
static const ItemState kAI006 = 2;
|
|
static const ItemState kAI010 = 3;
|
|
static const ItemState kAI015 = 4;
|
|
static const ItemState kAI016 = 5;
|
|
static const ItemState kAI020 = 6;
|
|
static const ItemState kAI024 = 7;
|
|
static const ItemState kAI100 = 8;
|
|
static const ItemState kAI101 = 9;
|
|
static const ItemState kAI105 = 10;
|
|
static const ItemState kAI106 = 11;
|
|
static const ItemState kAI110 = 12;
|
|
static const ItemState kAI111 = 13;
|
|
static const ItemState kAI115 = 14;
|
|
static const ItemState kAI116 = 15;
|
|
static const ItemState kAI120 = 16;
|
|
static const ItemState kAI121 = 17;
|
|
static const ItemState kAI124 = 18;
|
|
static const ItemState kAI125 = 19;
|
|
static const ItemState kAI126 = 20;
|
|
static const ItemState kAI200 = 21;
|
|
static const ItemState kAI201 = 22;
|
|
static const ItemState kAI202 = 23;
|
|
static const ItemState kAI205 = 24;
|
|
static const ItemState kAI206 = 25;
|
|
static const ItemState kAI210 = 26;
|
|
static const ItemState kAI211 = 27;
|
|
static const ItemState kAI212 = 28;
|
|
static const ItemState kAI215 = 29;
|
|
static const ItemState kAI216 = 30;
|
|
static const ItemState kAI220 = 31;
|
|
static const ItemState kAI221 = 32;
|
|
static const ItemState kAI222 = 33;
|
|
static const ItemState kAI224 = 34;
|
|
static const ItemState kAI225 = 35;
|
|
static const ItemState kAI226 = 36;
|
|
static const ItemState kAI300 = 37;
|
|
static const ItemState kAI301 = 38;
|
|
static const ItemState kAI302 = 39;
|
|
static const ItemState kAI303 = 40;
|
|
static const ItemState kAI305 = 41;
|
|
static const ItemState kAI306 = 42;
|
|
static const ItemState kAI310 = 43;
|
|
static const ItemState kAI311 = 44;
|
|
static const ItemState kAI312 = 45;
|
|
static const ItemState kAI313 = 46;
|
|
static const ItemState kAI315 = 47;
|
|
static const ItemState kAI316 = 48;
|
|
static const ItemState kAI320 = 49;
|
|
static const ItemState kAI321 = 50;
|
|
static const ItemState kAI322 = 51;
|
|
static const ItemState kAI323 = 52;
|
|
static const ItemState kAI324 = 53;
|
|
static const ItemState kAI325 = 54;
|
|
static const ItemState kAI326 = 55;
|
|
static const ItemState kNormalItem = 56;
|
|
static const ItemState kMapUnavailable = 57;
|
|
static const ItemState kMapEngaged = 58;
|
|
static const ItemState kOptical000 = 59;
|
|
static const ItemState kOptical001 = 60;
|
|
static const ItemState kOptical002 = 61;
|
|
static const ItemState kOptical010 = 62;
|
|
static const ItemState kOptical011 = 63;
|
|
static const ItemState kOptical012 = 64;
|
|
static const ItemState kOptical020 = 65;
|
|
static const ItemState kOptical021 = 66;
|
|
static const ItemState kOptical100 = 67;
|
|
static const ItemState kOptical101 = 68;
|
|
static const ItemState kOptical102 = 69;
|
|
static const ItemState kOptical110 = 70;
|
|
static const ItemState kOptical111 = 71;
|
|
static const ItemState kOptical112 = 72;
|
|
static const ItemState kOptical120 = 73;
|
|
static const ItemState kOptical121 = 74;
|
|
static const ItemState kOptical200 = 75;
|
|
static const ItemState kOptical201 = 76;
|
|
static const ItemState kOptical210 = 77;
|
|
static const ItemState kOptical211 = 78;
|
|
static const ItemState kPegasusTSA00 = 79;
|
|
static const ItemState kPegasusTSA10 = 80;
|
|
static const ItemState kPegasusPrehistoric00 = 81;
|
|
static const ItemState kPegasusPrehistoric01 = 82;
|
|
static const ItemState kPegasusPrehistoric10 = 83;
|
|
static const ItemState kPegasusPrehistoric11 = 84;
|
|
static const ItemState kPegasusMars00 = 85;
|
|
static const ItemState kPegasusMars01 = 86;
|
|
static const ItemState kPegasusMars10 = 87;
|
|
static const ItemState kPegasusMars11 = 88;
|
|
static const ItemState kPegasusNorad00 = 89;
|
|
static const ItemState kPegasusNorad01 = 90;
|
|
static const ItemState kPegasusNorad10 = 91;
|
|
static const ItemState kPegasusNorad11 = 92;
|
|
static const ItemState kPegasusWSC00 = 93;
|
|
static const ItemState kPegasusWSC01 = 94;
|
|
static const ItemState kPegasusWSC10 = 95;
|
|
static const ItemState kPegasusWSC11 = 96;
|
|
static const ItemState kPegasusCaldoria = 97;
|
|
static const ItemState kRetinalSimulating = 98;
|
|
static const ItemState kShieldNormal = 99;
|
|
static const ItemState kShieldRadiation = 100;
|
|
static const ItemState kShieldPlasma = 101;
|
|
static const ItemState kShieldCardBomb = 102;
|
|
static const ItemState kShieldDraining = 103;
|
|
static const ItemState kAirMaskEmptyOff = 104;
|
|
static const ItemState kAirMaskEmptyFilter = 105;
|
|
static const ItemState kAirMaskLowOff = 106;
|
|
static const ItemState kAirMaskLowFilter = 107;
|
|
static const ItemState kAirMaskLowOn = 108;
|
|
static const ItemState kAirMaskFullOff = 109;
|
|
static const ItemState kAirMaskFullFilter = 110;
|
|
static const ItemState kAirMaskFullOn = 111;
|
|
static const ItemState kArgonEmpty = 112;
|
|
static const ItemState kArgonFull = 113;
|
|
static const ItemState kFlashlightOff = 114;
|
|
static const ItemState kFlashlightOn = 115;
|
|
static const ItemState kNitrogenEmpty = 116;
|
|
static const ItemState kNitrogenFull = 117;
|
|
static const ItemState kFullGlass = 118;
|
|
static const ItemState kArthur000 = 119;
|
|
static const ItemState kArthur002 = 120;
|
|
static const ItemState kArthur010 = 121;
|
|
static const ItemState kArthur012 = 122;
|
|
static const ItemState kArthur100 = 123;
|
|
static const ItemState kArthur102 = 124;
|
|
static const ItemState kArthur110 = 125;
|
|
static const ItemState kArthur112 = 126;
|
|
|
|
// Extra IDs.
|
|
|
|
static const uint32 kRetinalScanSearching = 0;
|
|
static const uint32 kRetinalScanActivated = 1;
|
|
static const uint32 kShieldIntro = 2;
|
|
static const uint32 kRemoveAirMask = 3;
|
|
static const uint32 kRemoveArgon = 4;
|
|
static const uint32 kRemoveCrowbar = 5;
|
|
static const uint32 kGasCanLoop = 6;
|
|
static const uint32 kRemoveJourneymanKey = 7;
|
|
static const uint32 kRemoveMarsCard = 8;
|
|
static const uint32 kRemoveNitrogen = 9;
|
|
static const uint32 kRemoveGlass = 10;
|
|
static const uint32 kRemoveDart = 11;
|
|
static const uint32 kRemoveSinclairKey = 12;
|
|
|
|
enum ItemType {
|
|
kInventoryItemType,
|
|
kBiochipItemType
|
|
};
|
|
|
|
class Sprite;
|
|
|
|
/*
|
|
|
|
Item is an object which can be picked up and carried around.
|
|
Items have
|
|
a location
|
|
an ID.
|
|
weight
|
|
an owner (kNoActorID if no one is carrying the Item)
|
|
|
|
*/
|
|
|
|
class Item : public IDObject {
|
|
public:
|
|
Item(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction);
|
|
virtual ~Item();
|
|
|
|
// WriteToStream writes everything EXCEPT the item's ID.
|
|
// It is assumed that the calling function will write and read the ID.
|
|
virtual void writeToStream(Common::WriteStream *stream);
|
|
virtual void readFromStream(Common::ReadStream *stream);
|
|
|
|
virtual ActorID getItemOwner() const;
|
|
virtual void setItemOwner(const ActorID owner);
|
|
|
|
void getItemRoom(NeighborhoodID &neighborhood, RoomID &room, DirectionConstant &direction) const;
|
|
void setItemRoom(const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction);
|
|
NeighborhoodID getItemNeighborhood() const;
|
|
|
|
virtual WeightType getItemWeight();
|
|
|
|
virtual void setItemState(const ItemState state);
|
|
virtual ItemState getItemState() const;
|
|
|
|
virtual ItemType getItemType() = 0;
|
|
|
|
TimeValue getInfoLeftTime() const;
|
|
void getInfoRightTimes(TimeValue &, TimeValue &) const;
|
|
TimeValue getSharedAreaTime() const;
|
|
|
|
Sprite *getDragSprite(const DisplayElementID) const;
|
|
|
|
/*
|
|
select -- called when this item becomes current. Also called when the inventory
|
|
panel holding this item is raised and this is the current item.
|
|
deselect -- called when this item is no longer current.
|
|
activate -- called on the current item when the panel is closed.
|
|
*/
|
|
// In an override of these three member functions, you must call the inherited
|
|
// member functions.
|
|
virtual void select();
|
|
virtual void deselect();
|
|
virtual bool isSelected() { return _isSelected; }
|
|
|
|
virtual void activate() { _isActive = true; }
|
|
virtual bool isActive() { return _isActive; }
|
|
virtual void pickedUp() {}
|
|
virtual void addedToInventory() {}
|
|
virtual void removedFromInventory() {}
|
|
virtual void dropped() {}
|
|
|
|
// Called when the shared area is taken by another item, but this item is still
|
|
// selected.
|
|
virtual void giveUpSharedArea() {}
|
|
virtual void takeSharedArea() {}
|
|
|
|
void findItemExtra(const uint32 extraID, ItemExtraEntry &entry);
|
|
|
|
// Reset to its original state at the beginning of the game
|
|
void reset();
|
|
|
|
protected:
|
|
NeighborhoodID _itemNeighborhood;
|
|
RoomID _itemRoom;
|
|
DirectionConstant _itemDirection;
|
|
ActorID _itemOwnerID;
|
|
WeightType _itemWeight;
|
|
ItemState _itemState;
|
|
|
|
NeighborhoodID _originalNeighborhood;
|
|
RoomID _originalRoom;
|
|
DirectionConstant _originalDirection;
|
|
|
|
JMPItemInfo _itemInfo;
|
|
ItemStateInfo _sharedAreaInfo;
|
|
ItemExtraInfo _itemExtras;
|
|
bool _isActive;
|
|
bool _isSelected;
|
|
|
|
static void getItemStateEntry(ItemStateInfo, uint32, ItemState &, TimeValue &);
|
|
static void findItemStateEntryByState(ItemStateInfo, ItemState, TimeValue &);
|
|
static ItemStateInfo readItemState(Common::SeekableReadStream *stream);
|
|
};
|
|
|
|
} // End of namespace Pegasus
|
|
|
|
#endif
|