aboutsummaryrefslogtreecommitdiff
path: root/engines/pegasus/items
diff options
context:
space:
mode:
Diffstat (limited to 'engines/pegasus/items')
-rwxr-xr-xengines/pegasus/items/inventory.cpp175
-rwxr-xr-xengines/pegasus/items/inventory.h80
-rwxr-xr-xengines/pegasus/items/item.cpp111
-rwxr-xr-xengines/pegasus/items/item.h255
-rwxr-xr-xengines/pegasus/items/itemlist.cpp79
-rwxr-xr-xengines/pegasus/items/itemlist.h60
6 files changed, 760 insertions, 0 deletions
diff --git a/engines/pegasus/items/inventory.cpp b/engines/pegasus/items/inventory.cpp
new file mode 100755
index 0000000000..8f7eb46fd4
--- /dev/null
+++ b/engines/pegasus/items/inventory.cpp
@@ -0,0 +1,175 @@
+/* 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 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.
+ *
+ */
+
+#include "pegasus/constants.h"
+#include "pegasus/items/item.h"
+#include "pegasus/items/inventory.h"
+
+namespace Pegasus {
+
+Inventory::Inventory() {
+ _weightLimit = 100;
+ _ownerID = kNoActorID;
+ _referenceCount = 0;
+}
+
+Inventory::~Inventory() {
+}
+
+void Inventory::setWeightLimit(tWeightType limit) {
+ _weightLimit = limit;
+ // *** What to do if the new weight limit is greater than the current weight?
+}
+
+tWeightType Inventory::getWeight() {
+ tWeightType result = 0;
+
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++)
+ result += (*it)->getItemWeight();
+
+ return result;
+}
+
+// If the item already belongs, just return kInventoryOK.
+tInventoryResult Inventory::addItem(Item *item) {
+ if (itemInInventory(item))
+ return kInventoryOK;
+
+ if (getWeight() + item->getItemWeight() > _weightLimit)
+ return kTooMuchWeight;
+
+ _inventoryList.push_back(item);
+ item->setItemOwner(_ownerID);
+
+ ++_referenceCount;
+ return kInventoryOK;
+}
+
+tInventoryResult Inventory::removeItem(Item *item) {
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++) {
+ if (*it == item) {
+ _inventoryList.erase(it);
+ item->setItemOwner(kNoActorID);
+
+ ++_referenceCount;
+ return kInventoryOK;
+ }
+ }
+
+ return kItemNotInInventory;
+}
+
+tInventoryResult Inventory::removeItem(tItemID id) {
+ Item *item = findItemByID(id);
+
+ if (item) {
+ _inventoryList.remove(item);
+ item->setItemOwner(kNoActorID);
+
+ ++_referenceCount;
+ return kInventoryOK;
+ }
+
+ return kItemNotInInventory;
+}
+
+void Inventory::removeAllItems() {
+ _inventoryList.clear();
+ ++_referenceCount;
+}
+
+bool Inventory::itemInInventory(Item *item) {
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++)
+ if (*it == item)
+ return true;
+
+ return false;
+}
+
+bool Inventory::itemInInventory(tItemID id) {
+ return findItemByID(id) != NULL;
+}
+
+Item *Inventory::getItemAt(int32 index) {
+ int32 i = 0;
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
+ if (i == index)
+ return *it;
+
+ return 0;
+}
+
+tItemID Inventory::getItemIDAt(int32 index) {
+ Item *item = getItemAt(index);
+
+ if (item)
+ return item->getObjectID();
+
+ return kNoItemID;
+}
+
+Item *Inventory::findItemByID(tItemID id) {
+ return _inventoryList.findItemByID(id);
+}
+
+// Return -1 if not found.
+
+int32 Inventory::findIndexOf(Item *item) {
+ uint32 i = 0;
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
+ if (*it == item)
+ return i;
+
+ return -1;
+}
+
+// Return -1 if not found.
+
+int32 Inventory::findIndexOf(tItemID id) {
+ uint32 i = 0;
+ for (ItemIterator it = _inventoryList.begin(); it != _inventoryList.end(); it++, i++)
+ if ((*it)->getObjectID() == id)
+ return i;
+
+ return -1;
+}
+
+tWeightType Inventory::getWeightLimit() {
+ return _weightLimit;
+}
+
+int32 Inventory::getNumItems() {
+ return _inventoryList.size();
+}
+
+void Inventory::setOwnerID(const tActorID id) {
+ _ownerID = id;
+}
+
+tActorID Inventory::getOwnerID() const {
+ return _ownerID;
+}
+
+} // End of namespae Pegasus
diff --git a/engines/pegasus/items/inventory.h b/engines/pegasus/items/inventory.h
new file mode 100755
index 0000000000..7da782f00e
--- /dev/null
+++ b/engines/pegasus/items/inventory.h
@@ -0,0 +1,80 @@
+/* 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 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 PEGASUS_ITEMS_INVENTORY_H
+#define PEGASUS_ITEMS_INVENTORY_H
+
+#include "pegasus/types.h"
+#include "pegasus/items/itemlist.h"
+
+namespace Pegasus {
+
+class Item;
+
+// Inventories have a "current item". This item is the default item the player can
+// use. In a text adventure system, the current item would be "it", as in
+// "Hit the troll with it," where "it" would refer to some weapon which is the current
+// item. In a graphic adventure, the current item would be the item the user selects
+// to use with the mouse or other pointing device.
+
+class Inventory {
+public:
+ Inventory();
+ virtual ~Inventory();
+
+ tWeightType getWeightLimit();
+ void setWeightLimit(tWeightType limit);
+ tWeightType getWeight();
+
+ virtual tInventoryResult addItem(Item *item);
+ virtual tInventoryResult removeItem(Item *item);
+ virtual tInventoryResult removeItem(tItemID id);
+ virtual bool itemInInventory(Item *item);
+ virtual bool itemInInventory(tItemID id);
+ virtual Item *getItemAt(int32 index);
+ virtual tItemID getItemIDAt(int32 index);
+ virtual Item *findItemByID(tItemID id);
+ virtual int32 findIndexOf(Item *item);
+ virtual int32 findIndexOf(tItemID id);
+ int32 getNumItems();
+ virtual void removeAllItems();
+
+ void setOwnerID(const tActorID id);
+ tActorID getOwnerID() const;
+
+ uint32 getReferenceCount() { return _referenceCount; }
+
+protected:
+ tWeightType _weightLimit;
+ tActorID _ownerID;
+ ItemList _inventoryList;
+
+private:
+ uint32 _referenceCount;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/items/item.cpp b/engines/pegasus/items/item.cpp
new file mode 100755
index 0000000000..934dce6f2d
--- /dev/null
+++ b/engines/pegasus/items/item.cpp
@@ -0,0 +1,111 @@
+/* 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 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.
+ *
+ */
+
+#include "common/error.h"
+#include "common/stream.h"
+
+#include "pegasus/constants.h"
+#include "pegasus/items/item.h"
+#include "pegasus/items/itemlist.h"
+
+namespace Pegasus {
+
+Item::Item(const tItemID id, const tNeighborhoodID neighborhood, const tRoomID room, const tDirectionConstant direction) : MMIDObject(id) {
+ _itemNeighborhood = neighborhood;
+ _itemRoom = room;
+ _itemDirection = direction;
+ _itemWeight = 1;
+ _itemOwnerID = kNoActorID;
+ _itemState = 0;
+
+ g_allItems.push_back(this);
+}
+
+Item::~Item() {
+}
+
+Common::Error Item::writeToStream(Common::WriteStream *stream) {
+ stream->writeUint16BE(_itemNeighborhood);
+ stream->writeUint16BE(_itemRoom);
+ stream->writeByte(_itemDirection);
+ stream->writeUint16BE(_itemOwnerID);
+ stream->writeUint16BE(_itemState);
+
+ if (stream->err())
+ return Common::kWritingFailed;
+
+ return Common::kNoError;
+}
+
+Common::Error Item::readFromStream(Common::ReadStream *stream) {
+ _itemNeighborhood = stream->readUint16BE();
+ _itemRoom = stream->readUint16BE();
+ _itemDirection = stream->readByte();
+ _itemOwnerID = stream->readUint16BE();
+ _itemState = stream->readUint16BE();
+
+ if (stream->err())
+ return Common::kReadingFailed;
+
+ return Common::kNoError;
+}
+
+tActorID Item::getItemOwner() const {
+ return _itemOwnerID;
+}
+
+void Item::setItemOwner(const tActorID owner) {
+ _itemOwnerID = owner;
+}
+
+tWeightType Item::getItemWeight() {
+ return _itemWeight;
+}
+
+tItemState Item::getItemState() const {
+ return _itemState;
+}
+
+void Item::setItemState(const tItemState state) {
+ _itemState = state;
+}
+
+void Item::getItemRoom(tNeighborhoodID &neighborhood, tRoomID &room, tDirectionConstant &direction) const {
+ neighborhood = _itemNeighborhood;
+ room = _itemRoom;
+ direction = _itemDirection;
+}
+
+void Item::setItemRoom(const tNeighborhoodID neighborhood, const tRoomID room, const tDirectionConstant direction) {
+ _itemNeighborhood = neighborhood;
+ _itemRoom = room;
+ _itemDirection = direction;
+}
+
+tNeighborhoodID Item::getItemNeighborhood() const {
+ return _itemNeighborhood;
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/items/item.h b/engines/pegasus/items/item.h
new file mode 100755
index 0000000000..37ad54e5e7
--- /dev/null
+++ b/engines/pegasus/items/item.h
@@ -0,0 +1,255 @@
+/* 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 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 PEGASUS_ITEMS_ITEM_H
+#define PEGASUS_ITEMS_ITEM_H
+
+#include "pegasus/MMShell/Utilities/MMIDObject.h"
+#include "pegasus/types.h"
+
+namespace Common {
+ class Error;
+ class ReadStream;
+ class WriteStream;
+}
+
+namespace Pegasus {
+
+/*
+
+ 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)
+
+*/
+
+// Item IDs.
+
+const tItemID kAirMask = 7;
+const tItemID kAntidote = 8;
+const tItemID kArgonCanister = 9;
+const tItemID kCardBomb = 10;
+const tItemID kCrowbar = 11;
+const tItemID kGasCanister = 12;
+const tItemID kHistoricalLog = 13;
+const tItemID kJourneymanKey = 14;
+const tItemID kKeyCard = 15;
+const tItemID kMachineGun = 16;
+const tItemID kMarsCard = 17;
+const tItemID kNitrogenCanister = 18;
+const tItemID kOrangeJuiceGlassFull = 19;
+const tItemID kOrangeJuiceGlassEmpty = 20;
+const tItemID kPoisonDart = 21;
+const tItemID kSinclairKey = 22;
+const tItemID kStunGun = 23;
+const tItemID kArgonPickup = 24;
+
+// Biochips.
+
+const tItemID kAIBiochip = 0;
+const tItemID kInterfaceBiochip = 1;
+const tItemID kMapBiochip = 2;
+const tItemID kOpticalBiochip = 3;
+const tItemID kPegasusBiochip = 4;
+const tItemID kRetinalScanBiochip = 5;
+const tItemID kShieldBiochip = 6;
+
+const tItemID kNumItems = 25;
+
+// Item States.
+
+const tItemState kAI000 = 0;
+const tItemState kAI005 = 1;
+const tItemState kAI006 = 2;
+const tItemState kAI010 = 3;
+const tItemState kAI015 = 4;
+const tItemState kAI016 = 5;
+const tItemState kAI020 = 6;
+const tItemState kAI024 = 7;
+const tItemState kAI100 = 8;
+const tItemState kAI101 = 9;
+const tItemState kAI105 = 10;
+const tItemState kAI106 = 11;
+const tItemState kAI110 = 12;
+const tItemState kAI111 = 13;
+const tItemState kAI115 = 14;
+const tItemState kAI116 = 15;
+const tItemState kAI120 = 16;
+const tItemState kAI121 = 17;
+const tItemState kAI124 = 18;
+const tItemState kAI125 = 19;
+const tItemState kAI126 = 20;
+const tItemState kAI200 = 21;
+const tItemState kAI201 = 22;
+const tItemState kAI202 = 23;
+const tItemState kAI205 = 24;
+const tItemState kAI206 = 25;
+const tItemState kAI210 = 26;
+const tItemState kAI211 = 27;
+const tItemState kAI212 = 28;
+const tItemState kAI215 = 29;
+const tItemState kAI216 = 30;
+const tItemState kAI220 = 31;
+const tItemState kAI221 = 32;
+const tItemState kAI222 = 33;
+const tItemState kAI224 = 34;
+const tItemState kAI225 = 35;
+const tItemState kAI226 = 36;
+const tItemState kAI300 = 37;
+const tItemState kAI301 = 38;
+const tItemState kAI302 = 39;
+const tItemState kAI303 = 40;
+const tItemState kAI305 = 41;
+const tItemState kAI306 = 42;
+const tItemState kAI310 = 43;
+const tItemState kAI311 = 44;
+const tItemState kAI312 = 45;
+const tItemState kAI313 = 46;
+const tItemState kAI315 = 47;
+const tItemState kAI316 = 48;
+const tItemState kAI320 = 49;
+const tItemState kAI321 = 50;
+const tItemState kAI322 = 51;
+const tItemState kAI323 = 52;
+const tItemState kAI324 = 53;
+const tItemState kAI325 = 54;
+const tItemState kAI326 = 55;
+const tItemState kNormalItem = 56;
+const tItemState kMapUnavailable = 57;
+const tItemState kMapEngaged = 58;
+const tItemState kOptical000 = 59;
+const tItemState kOptical001 = 60;
+const tItemState kOptical002 = 61;
+const tItemState kOptical010 = 62;
+const tItemState kOptical011 = 63;
+const tItemState kOptical012 = 64;
+const tItemState kOptical020 = 65;
+const tItemState kOptical021 = 66;
+const tItemState kOptical100 = 67;
+const tItemState kOptical101 = 68;
+const tItemState kOptical102 = 69;
+const tItemState kOptical110 = 70;
+const tItemState kOptical111 = 71;
+const tItemState kOptical112 = 72;
+const tItemState kOptical120 = 73;
+const tItemState kOptical121 = 74;
+const tItemState kOptical200 = 75;
+const tItemState kOptical201 = 76;
+const tItemState kOptical210 = 77;
+const tItemState kOptical211 = 78;
+const tItemState kPegasusTSA00 = 79;
+const tItemState kPegasusTSA10 = 80;
+const tItemState kPegasusPrehistoric00 = 81;
+const tItemState kPegasusPrehistoric01 = 82;
+const tItemState kPegasusPrehistoric10 = 83;
+const tItemState kPegasusPrehistoric11 = 84;
+const tItemState kPegasusMars00 = 85;
+const tItemState kPegasusMars01 = 86;
+const tItemState kPegasusMars10 = 87;
+const tItemState kPegasusMars11 = 88;
+const tItemState kPegasusNorad00 = 89;
+const tItemState kPegasusNorad01 = 90;
+const tItemState kPegasusNorad10 = 91;
+const tItemState kPegasusNorad11 = 92;
+const tItemState kPegasusWSC00 = 93;
+const tItemState kPegasusWSC01 = 94;
+const tItemState kPegasusWSC10 = 95;
+const tItemState kPegasusWSC11 = 96;
+const tItemState kPegasusCaldoria = 97;
+const tItemState kRetinalSimulating = 98;
+const tItemState kShieldNormal = 99;
+const tItemState kShieldRadiation = 100;
+const tItemState kShieldPlasma = 101;
+const tItemState kShieldCardBomb = 102;
+const tItemState kShieldDraining = 103;
+const tItemState kAirMaskEmptyOff = 104;
+const tItemState kAirMaskEmptyFilter = 105;
+const tItemState kAirMaskLowOff = 106;
+const tItemState kAirMaskLowFilter = 107;
+const tItemState kAirMaskLowOn = 108;
+const tItemState kAirMaskFullOff = 109;
+const tItemState kAirMaskFullFilter = 110;
+const tItemState kAirMaskFullOn = 111;
+const tItemState kArgonEmpty = 112;
+const tItemState kArgonFull = 113;
+const tItemState kFlashlightOff = 114;
+const tItemState kFlashlightOn = 115;
+const tItemState kNitrogenEmpty = 116;
+const tItemState kNitrogenFull = 117;
+const tItemState kFullGlass = 118;
+
+// Extra IDs.
+
+const uint32 kRetinalScanSearching = 0;
+const uint32 kRetinalScanActivated = 1;
+const uint32 kShieldIntro = 2;
+const uint32 kRemoveAirMask = 3;
+const uint32 kRemoveArgon = 4;
+const uint32 kRemoveCrowbar = 5;
+const uint32 kGasCanLoop = 6;
+const uint32 kRemoveJourneymanKey = 7;
+const uint32 kRemoveMarsCard = 8;
+const uint32 kRemoveNitrogen = 9;
+const uint32 kRemoveGlass = 10;
+const uint32 kRemoveDart = 11;
+const uint32 kRemoveSinclairKey = 12;
+
+class Item : public MMIDObject {
+public:
+ Item(const tItemID id, const tNeighborhoodID neighborhood, const tRoomID room, const tDirectionConstant 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 Common::Error writeToStream(Common::WriteStream *stream);
+ virtual Common::Error readFromStream(Common::ReadStream *stream);
+
+ virtual tActorID getItemOwner() const;
+ virtual void setItemOwner(const tActorID owner);
+
+ void getItemRoom(tNeighborhoodID &neighborhood, tRoomID &room, tDirectionConstant &direction) const;
+ void setItemRoom(const tNeighborhoodID neighborhood, const tRoomID room, const tDirectionConstant direction);
+ tNeighborhoodID getItemNeighborhood() const;
+
+ virtual tWeightType getItemWeight();
+
+ virtual void setItemState(const tItemState state);
+ virtual tItemState getItemState() const;
+
+protected:
+ tNeighborhoodID _itemNeighborhood;
+ tRoomID _itemRoom;
+ tDirectionConstant _itemDirection;
+ tActorID _itemOwnerID;
+ tWeightType _itemWeight;
+ tItemState _itemState;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/items/itemlist.cpp b/engines/pegasus/items/itemlist.cpp
new file mode 100755
index 0000000000..2b980d6f5f
--- /dev/null
+++ b/engines/pegasus/items/itemlist.cpp
@@ -0,0 +1,79 @@
+/* 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 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.
+ *
+ */
+
+#include "common/error.h"
+#include "common/stream.h"
+
+#include "engines/pegasus/items/item.h"
+#include "engines/pegasus/items/itemlist.h"
+
+namespace Pegasus {
+
+// TODO: Don't use global construction!
+ItemList g_allItems;
+
+ItemList::ItemList() {
+}
+
+ItemList::~ItemList() {
+}
+
+Common::Error ItemList::writeToStream(Common::WriteStream *stream) {
+ stream->writeUint32BE(size());
+
+ for (ItemIterator it = begin(); it != end(); it++) {
+ stream->writeUint16BE((*it)->getObjectID());
+ (*it)->writeToStream(stream);
+ }
+
+ if (stream->err())
+ return Common::kWritingFailed;
+
+ return Common::kNoError;
+}
+
+Common::Error ItemList::readFromStream(Common::ReadStream *stream) {
+ uint32 itemCount = stream->readUint32BE();
+
+ for (uint32 i = 0; i < itemCount; i++) {
+ tItemID itemID = stream->readUint16BE();
+ g_allItems.findItemByID(itemID)->readFromStream(stream);
+ }
+
+ if (stream->err())
+ return Common::kReadingFailed;
+
+ return Common::kNoError;
+}
+
+Item *ItemList::findItemByID(const tItemID id) {
+ for (ItemIterator it = begin(); it != end(); it++)
+ if ((*it)->getObjectID() == id)
+ return *it;
+
+ return 0;
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/items/itemlist.h b/engines/pegasus/items/itemlist.h
new file mode 100755
index 0000000000..dd9a4ba023
--- /dev/null
+++ b/engines/pegasus/items/itemlist.h
@@ -0,0 +1,60 @@
+/* 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 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 PEGASUS_ITEMS_ITEMLIST_H
+#define PEGASUS_ITEMS_ITEMLIST_H
+
+#include "common/list.h"
+
+#include "pegasus/types.h"
+
+namespace Common {
+ class ReadStream;
+ class WriteStream;
+}
+
+namespace Pegasus {
+
+class Item;
+
+class ItemList : public Common::List<Item *> {
+public:
+ ItemList();
+ virtual ~ItemList();
+
+ virtual Common::Error writeToStream(Common::WriteStream *stream);
+ virtual Common::Error readFromStream(Common::ReadStream *stream);
+
+ Item *findItemByID(const tItemID id);
+};
+
+typedef ItemList::iterator ItemIterator;
+
+// TODO: Don't use global construction!
+extern ItemList g_allItems;
+
+} // End of namespace Pegasus
+
+#endif