aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMatthew Hoops2011-08-30 00:41:24 -0400
committerMatthew Hoops2011-09-01 11:44:20 -0400
commit8263f5a7b576718a3f4e04980fe5a08fb02d4788 (patch)
tree165029f36734737cb221aa901cd1144926137b40 /engines
parent4a69dc13d92e82fff85dc5a3a923b74ced259ffa (diff)
downloadscummvm-rg350-8263f5a7b576718a3f4e04980fe5a08fb02d4788.tar.gz
scummvm-rg350-8263f5a7b576718a3f4e04980fe5a08fb02d4788.tar.bz2
scummvm-rg350-8263f5a7b576718a3f4e04980fe5a08fb02d4788.zip
PEGASUS: Implement basic neighborhood resource parsing
Diffstat (limited to 'engines')
-rw-r--r--engines/pegasus/module.mk11
-rwxr-xr-xengines/pegasus/neighborhood/door.cpp64
-rwxr-xr-xengines/pegasus/neighborhood/door.h82
-rwxr-xr-xengines/pegasus/neighborhood/exit.cpp70
-rwxr-xr-xengines/pegasus/neighborhood/exit.h77
-rwxr-xr-xengines/pegasus/neighborhood/extra.cpp58
-rwxr-xr-xengines/pegasus/neighborhood/extra.h67
-rwxr-xr-xengines/pegasus/neighborhood/hotspot.cpp65
-rwxr-xr-xengines/pegasus/neighborhood/hotspot.h73
-rw-r--r--engines/pegasus/neighborhood/neighborhood.cpp94
-rw-r--r--engines/pegasus/neighborhood/neighborhood.h67
-rwxr-xr-xengines/pegasus/neighborhood/spot.cpp70
-rwxr-xr-xengines/pegasus/neighborhood/spot.h88
-rwxr-xr-xengines/pegasus/neighborhood/turn.cpp63
-rwxr-xr-xengines/pegasus/neighborhood/turn.h69
-rwxr-xr-xengines/pegasus/neighborhood/view.cpp60
-rwxr-xr-xengines/pegasus/neighborhood/view.h68
-rwxr-xr-xengines/pegasus/neighborhood/zoom.cpp70
-rwxr-xr-xengines/pegasus/neighborhood/zoom.h69
-rw-r--r--engines/pegasus/pegasus.cpp116
-rw-r--r--engines/pegasus/pegasus.h48
21 files changed, 1289 insertions, 160 deletions
diff --git a/engines/pegasus/module.mk b/engines/pegasus/module.mk
index ca5017b575..af79e7cd90 100644
--- a/engines/pegasus/module.mk
+++ b/engines/pegasus/module.mk
@@ -20,7 +20,16 @@ MODULE_OBJS = \
MMShell/Sounds/MMSound.o \
MMShell/Utilities/MMResourceFile.o \
MMShell/Utilities/MMTimeValue.o \
- MMShell/Utilities/MMUtilities.o
+ MMShell/Utilities/MMUtilities.o \
+ neighborhood/door.o \
+ neighborhood/exit.o \
+ neighborhood/extra.o \
+ neighborhood/hotspot.o \
+ neighborhood/neighborhood.o \
+ neighborhood/spot.o \
+ neighborhood/turn.o \
+ neighborhood/view.o \
+ neighborhood/zoom.o
# This module can be built as a plugin
diff --git a/engines/pegasus/neighborhood/door.cpp b/engines/pegasus/neighborhood/door.cpp
new file mode 100755
index 0000000000..82c83f19b1
--- /dev/null
+++ b/engines/pegasus/neighborhood/door.cpp
@@ -0,0 +1,64 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/door.h"
+
+namespace Pegasus {
+
+void DoorTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ _entries[i].altCode = stream->readByte();
+ _entries[i].movieStart = stream->readUint32BE();
+ _entries[i].movieEnd = stream->readUint32BE();
+ _entries[i].flags = stream->readByte();
+ stream->readByte(); // alignment
+ debug(0, "Door[%d]: %d %d %d %d %d %d", i, _entries[i].room, _entries[i].direction,
+ _entries[i].altCode, _entries[i].movieStart, _entries[i].movieEnd,
+ _entries[i].flags);
+ }
+}
+
+void DoorTable::clear() {
+ _entries.clear();
+}
+
+DoorTable::Entry DoorTable::findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].room == room && _entries[i].direction == direction && _entries[i].altCode == altCode)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/door.h b/engines/pegasus/neighborhood/door.h
new file mode 100755
index 0000000000..3aa8db6892
--- /dev/null
+++ b/engines/pegasus/neighborhood/door.h
@@ -0,0 +1,82 @@
+/* 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_NEIGHBORHOOD_DOOR_H
+#define PEGASUS_NEIGHBORHOOD_DOOR_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+typedef tMM8BitFlags tDoorFlags;
+
+enum {
+ kDoorPresentBit, // Bit set if there is a door here.
+ kDoorLockedBit // Bit set if door is locked, clear if unlocked.
+};
+
+const tDoorFlags kNoDoorFlags = 0;
+const tDoorFlags kDoorPresentMask = 1 << kDoorPresentBit;
+const tDoorFlags kDoorLockedMask = 1 << kDoorLockedBit;
+
+class DoorTable {
+public:
+ DoorTable() {}
+ ~DoorTable() {}
+
+ static const uint32 getResTag() { return MKTAG('D', 'o', 'o', 'r'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { movieStart = 0xffffffff; }
+ bool isEmpty() { return movieStart == 0xffffffff; }
+
+ tRoomID room;
+ tDirectionConstant direction;
+ tAlternateID altCode;
+ TimeValue movieStart;
+ TimeValue movieEnd;
+ tDoorFlags flags;
+ };
+
+ Entry findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
+
diff --git a/engines/pegasus/neighborhood/exit.cpp b/engines/pegasus/neighborhood/exit.cpp
new file mode 100755
index 0000000000..ce3fe9da9a
--- /dev/null
+++ b/engines/pegasus/neighborhood/exit.cpp
@@ -0,0 +1,70 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/exit.h"
+
+namespace Pegasus {
+
+void ExitTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ _entries[i].altCode = stream->readByte();
+ _entries[i].movieStart = stream->readUint32BE();
+ _entries[i].movieEnd = stream->readUint32BE();
+ _entries[i].exitEnd = stream->readUint32BE();
+ _entries[i].exitLoop = stream->readUint32BE();
+ _entries[i].exitRoom = stream->readUint32BE();
+ _entries[i].exitDirection = stream->readByte();
+ stream->readByte(); // alignment
+
+ _entries[i].originalEnd = _entries[i].exitEnd;
+
+ debug(0, "Exit[%d]: %d %d %d %d %d %d %d %d %d", i, _entries[i].room, _entries[i].direction,
+ _entries[i].altCode, _entries[i].movieStart, _entries[i].movieEnd, _entries[i].exitEnd,
+ _entries[i].exitLoop, _entries[i].exitRoom, _entries[i].exitDirection);
+ }
+}
+
+void ExitTable::clear() {
+ _entries.clear();
+}
+
+ExitTable::Entry ExitTable::findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].room == room && _entries[i].direction == direction && _entries[i].altCode == altCode)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/exit.h b/engines/pegasus/neighborhood/exit.h
new file mode 100755
index 0000000000..03bf52d43e
--- /dev/null
+++ b/engines/pegasus/neighborhood/exit.h
@@ -0,0 +1,77 @@
+/* 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_NEIGHBORHOOD_EXIT_H
+#define PEGASUS_NEIGHBORHOOD_EXIT_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class ExitTable {
+public:
+ ExitTable() {}
+ ~ExitTable() {}
+
+ static const uint32 getResTag() { return MKTAG('E', 'x', 'i', 't'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { movieStart = 0xffffffff; }
+ bool isEmpty() { return movieStart == 0xffffffff; }
+
+ tRoomID room;
+ tDirectionConstant direction;
+ tAlternateID altCode;
+ TimeValue movieStart;
+ TimeValue movieEnd;
+ // fExitEnd is the end of the optimized run of walks.
+ TimeValue exitEnd;
+ TimeValue originalEnd;
+ // fExitLoop is the loop start time of the optimized run of walks if the run
+ // loops back on itself (so far, only in TSA).
+ TimeValue exitLoop;
+ tRoomID exitRoom;
+ tDirectionConstant exitDirection;
+ };
+
+ Entry findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/extra.cpp b/engines/pegasus/neighborhood/extra.cpp
new file mode 100755
index 0000000000..44235ffa96
--- /dev/null
+++ b/engines/pegasus/neighborhood/extra.cpp
@@ -0,0 +1,58 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/extra.h"
+
+namespace Pegasus {
+
+void ExtraTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].extra = stream->readUint32BE();
+ _entries[i].movieStart = stream->readUint32BE();
+ _entries[i].movieEnd = stream->readUint32BE();
+ debug(0, "Extra[%d]: %d %d %d", i, _entries[i].extra, _entries[i].movieStart, _entries[i].movieEnd);
+ }
+}
+
+void ExtraTable::clear() {
+ _entries.clear();
+}
+
+ExtraTable::Entry ExtraTable::findEntry(tExtraID extra) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].extra == extra)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/extra.h b/engines/pegasus/neighborhood/extra.h
new file mode 100755
index 0000000000..3658fbda63
--- /dev/null
+++ b/engines/pegasus/neighborhood/extra.h
@@ -0,0 +1,67 @@
+/* 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_NEIGHBORHOOD_EXTRA_H
+#define PEGASUS_NEIGHBORHOOD_EXTRA_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class ExtraTable {
+public:
+ ExtraTable() {}
+ ~ExtraTable() {}
+
+ static const uint32 getResTag() { return MKTAG('X', 't', 'r', 'a'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { movieStart = 0xffffffff; }
+ bool isEmpty() { return movieStart == 0xffffffff; }
+
+ tExtraID extra;
+ TimeValue movieStart;
+ TimeValue movieEnd;
+ };
+
+ Entry findEntry(tExtraID extra);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/hotspot.cpp b/engines/pegasus/neighborhood/hotspot.cpp
new file mode 100755
index 0000000000..16af1a6d48
--- /dev/null
+++ b/engines/pegasus/neighborhood/hotspot.cpp
@@ -0,0 +1,65 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/hotspot.h"
+
+namespace Pegasus {
+
+void HotspotTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].hotspot = stream->readUint16BE();
+ _entries[i].hotspotActivation = stream->readSByte();
+ stream->readByte(); // alignment
+ _entries[i].hotspotRoom = stream->readUint16BE();
+ _entries[i].hotspotDirection = stream->readByte();
+ stream->readByte(); // alignment
+ _entries[i].hotspotExtra = stream->readUint32BE();
+ _entries[i].hotspotItem = stream->readUint16BE();
+ debug(0, "Hotspot[%d]: %d %d %d %d %d %d", i, _entries[i].hotspot, _entries[i].hotspotActivation,
+ _entries[i].hotspotRoom, _entries[i].hotspotDirection, _entries[i].hotspotExtra,
+ _entries[i].hotspotItem);
+ }
+}
+
+void HotspotTable::clear() {
+ _entries.clear();
+}
+
+HotspotTable::Entry HotspotTable::findEntry(tHotSpotID hotspot) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].hotspot == hotspot)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/hotspot.h b/engines/pegasus/neighborhood/hotspot.h
new file mode 100755
index 0000000000..ea7f3bbeea
--- /dev/null
+++ b/engines/pegasus/neighborhood/hotspot.h
@@ -0,0 +1,73 @@
+/* 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_NEIGHBORHOOD_HOTSPOT_H
+#define PEGASUS_NEIGHBORHOOD_HOTSPOT_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class HotspotTable {
+public:
+ HotspotTable() {}
+ ~HotspotTable() {}
+
+ static const uint32 getResTag() { return MKTAG('H', 'S', 'I', 'n'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { hotspotRoom = kNoRoomID; }
+ bool isEmpty() { return hotspotRoom == kNoRoomID; }
+
+ tHotSpotID hotspot;
+ tHotSpotActivationID hotspotActivation;
+ // Location hot spot lives in:
+ tRoomID hotspotRoom;
+ tDirectionConstant hotspotDirection;
+ // Extra to play if this is a "play extra" hot spot.
+ tExtraID hotspotExtra;
+ // Item corresponding to this hot spot if it is an item-related hot spot.
+ tItemID hotspotItem;
+ };
+
+ Entry findEntry(tHotSpotID hotspot);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/neighborhood.cpp b/engines/pegasus/neighborhood/neighborhood.cpp
new file mode 100644
index 0000000000..291c0a97d1
--- /dev/null
+++ b/engines/pegasus/neighborhood/neighborhood.cpp
@@ -0,0 +1,94 @@
+/* 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/debug.h"
+#include "common/stream.h"
+
+#include "pegasus/pegasus.h"
+#include "pegasus/neighborhood/neighborhood.h"
+
+namespace Pegasus {
+
+Neighborhood::Neighborhood(PegasusEngine *vm, const Common::String &resName) : _vm(vm), _resName(resName) {
+}
+
+Neighborhood::~Neighborhood() {
+}
+
+void Neighborhood::init() {
+ debug(0, "Loading '%s' neighborhood resources", _resName.c_str());
+
+ Common::SeekableReadStream *stream = _vm->_resFork->getResource(_doorTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load doors");
+ _doorTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_exitTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load exits");
+ _exitTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_extraTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load extras");
+ _extraTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_hotspotTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load hotspots");
+ _hotspotTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_spotTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load spots");
+ _spotTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_turnTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load turns");
+ _turnTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_viewTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load views");
+ _viewTable.loadFromStream(stream);
+ delete stream;
+
+ stream = _vm->_resFork->getResource(_zoomTable.getResTag(), _resName);
+ if (!stream)
+ error("Failed to load zooms");
+ _zoomTable.loadFromStream(stream);
+ delete stream;
+
+ // TODO: AI, movies, notifications, buncha other stuff
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/neighborhood.h b/engines/pegasus/neighborhood/neighborhood.h
new file mode 100644
index 0000000000..d70628e0d5
--- /dev/null
+++ b/engines/pegasus/neighborhood/neighborhood.h
@@ -0,0 +1,67 @@
+/* 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_NEIGHBORHOOD_H
+#define PEGASUS_NEIGHBORHOOD_H
+
+#include "common/str.h"
+
+#include "pegasus/neighborhood/door.h"
+#include "pegasus/neighborhood/exit.h"
+#include "pegasus/neighborhood/extra.h"
+#include "pegasus/neighborhood/hotspot.h"
+#include "pegasus/neighborhood/spot.h"
+#include "pegasus/neighborhood/turn.h"
+#include "pegasus/neighborhood/view.h"
+#include "pegasus/neighborhood/zoom.h"
+
+namespace Pegasus {
+
+class PegasusEngine;
+
+class Neighborhood {
+public:
+ Neighborhood(PegasusEngine *vm, const Common::String &resName);
+ virtual ~Neighborhood();
+
+ virtual void init();
+
+private:
+ PegasusEngine *_vm;
+ Common::String _resName;
+
+ DoorTable _doorTable;
+ ExitTable _exitTable;
+ ExtraTable _extraTable;
+ HotspotTable _hotspotTable;
+ SpotTable _spotTable;
+ TurnTable _turnTable;
+ ViewTable _viewTable;
+ ZoomTable _zoomTable;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/spot.cpp b/engines/pegasus/neighborhood/spot.cpp
new file mode 100755
index 0000000000..9ccdfd2de6
--- /dev/null
+++ b/engines/pegasus/neighborhood/spot.cpp
@@ -0,0 +1,70 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/spot.h"
+
+namespace Pegasus {
+
+void SpotTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ _entries[i].srcFlags = stream->readByte();
+ _entries[i].altCode = stream->readByte();
+ stream->readByte(); // alignment
+ _entries[i].movieStart = stream->readUint32BE();
+ _entries[i].movieEnd = stream->readUint32BE();
+ _entries[i].dstFlags = stream->readByte();
+ stream->readByte(); // alignment
+ debug(0, "Spot[%d]: %d %d %d %d %d %d %d", i, _entries[i].room, _entries[i].direction,
+ _entries[i].srcFlags, _entries[i].altCode, _entries[i].movieStart,
+ _entries[i].movieEnd, _entries[i].dstFlags);
+ }
+}
+
+void SpotTable::clear() {
+ _entries.clear();
+}
+
+// Two CSpotIndices are equal if
+// In addition to having their rooms, directions and alt codes identical...
+// They are both either loops or once only animations AND
+// They overlap in at least one of the on arrival, on turn and on door open bits.
+SpotTable::Entry SpotTable::findEntry(tRoomID room, tDirectionConstant direction, tSpotFlags srcFlags, tAlternateID altCode) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].room == room && _entries[i].direction == direction && _entries[i].altCode == altCode && (_entries[i].srcFlags & kSpotLoopsMask) == (srcFlags & kSpotLoopsMask) && ((_entries[i].srcFlags & srcFlags) & kSpotTriggers) != 0)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/spot.h b/engines/pegasus/neighborhood/spot.h
new file mode 100755
index 0000000000..1bfa5899d1
--- /dev/null
+++ b/engines/pegasus/neighborhood/spot.h
@@ -0,0 +1,88 @@
+/* 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_NEIGHBORHOOD_SPOT_H
+#define PEGASUS_NEIGHBORHOOD_SPOT_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+typedef tMM8BitFlags tSpotFlags;
+
+enum {
+ kSpotLoopsBit, // Loop or once only?
+ kSpotOnArrivalBit,
+ kSpotOnTurnBit,
+ kSpotOnDoorOpenBit
+};
+
+static const tSpotFlags kNoSpotFlags = 0;
+static const tSpotFlags kSpotLoopsMask = 1 << kSpotLoopsBit;
+static const tSpotFlags kSpotOnArrivalMask = 1 << kSpotOnArrivalBit;
+static const tSpotFlags kSpotOnTurnMask = 1 << kSpotOnTurnBit;
+static const tSpotFlags kSpotOnDoorOpenMask = 1 << kSpotOnDoorOpenBit;
+
+static const tSpotFlags kSpotTriggers = kSpotOnArrivalMask | kSpotOnTurnMask | kSpotOnDoorOpenMask;
+
+class SpotTable {
+public:
+ SpotTable() {}
+ ~SpotTable() {}
+
+ static const uint32 getResTag() { return MKTAG('S', 'p', 'o', 't'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { movieStart = 0xffffffff; }
+ bool isEmpty() { return movieStart == 0xffffffff; }
+
+ tRoomID room;
+ tDirectionConstant direction;
+ tSpotFlags srcFlags;
+ tAlternateID altCode;
+ TimeValue movieStart;
+ TimeValue movieEnd;
+ tSpotFlags dstFlags;
+ };
+
+ Entry findEntry(tRoomID room, tDirectionConstant direction, tSpotFlags srcFlags, tAlternateID altCode);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/turn.cpp b/engines/pegasus/neighborhood/turn.cpp
new file mode 100755
index 0000000000..6b66b32d28
--- /dev/null
+++ b/engines/pegasus/neighborhood/turn.cpp
@@ -0,0 +1,63 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/turn.h"
+
+namespace Pegasus {
+
+void TurnTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ _entries[i].turnDirection = stream->readByte();
+ _entries[i].altCode = stream->readByte();
+ stream->readByte(); // alignment
+ _entries[i].endDirection = stream->readByte();
+ stream->readByte(); // alignment
+ debug(0, "Turn[%d]: %d %d %d %d %d", i, _entries[i].room, _entries[i].direction,
+ _entries[i].turnDirection, _entries[i].altCode, _entries[i].endDirection);
+ }
+}
+
+void TurnTable::clear() {
+ _entries.clear();
+}
+
+TurnTable::Entry TurnTable::findEntry(tRoomID room, tDirectionConstant direction, tTurnDirection turnDirection, tAlternateID altCode) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].room == room && _entries[i].direction == direction && _entries[i].turnDirection == turnDirection && _entries[i].altCode == altCode)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus
diff --git a/engines/pegasus/neighborhood/turn.h b/engines/pegasus/neighborhood/turn.h
new file mode 100755
index 0000000000..daeaf2f2ab
--- /dev/null
+++ b/engines/pegasus/neighborhood/turn.h
@@ -0,0 +1,69 @@
+/* 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_NEIGHBORHOOD_TURN_H
+#define PEGASUS_NEIGHBORHOOD_TURN_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class TurnTable {
+public:
+ TurnTable() {}
+ ~TurnTable() {}
+
+ static const uint32 getResTag() { return MKTAG('T', 'u', 'r', 'n'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { endDirection = kNoDirection; }
+ bool isEmpty() { return endDirection == kNoDirection; }
+
+ tRoomID room;
+ tDirectionConstant direction;
+ tTurnDirection turnDirection;
+ tAlternateID altCode;
+ tDirectionConstant endDirection;
+ };
+
+ Entry findEntry(tRoomID room, tDirectionConstant direction, tTurnDirection turnDirection, tAlternateID altCode);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/view.cpp b/engines/pegasus/neighborhood/view.cpp
new file mode 100755
index 0000000000..e57fc88a13
--- /dev/null
+++ b/engines/pegasus/neighborhood/view.cpp
@@ -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.
+ *
+ */
+
+#include "common/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/view.h"
+
+namespace Pegasus {
+
+void ViewTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ _entries[i].altCode = stream->readByte();
+ _entries[i].time = stream->readUint32BE();
+ debug(0, "View[%d]: %d %d %d %d", i, _entries[i].room, _entries[i].direction,
+ _entries[i].altCode, _entries[i].time);
+ }
+}
+
+void ViewTable::clear() {
+ _entries.clear();
+}
+
+ViewTable::Entry ViewTable::findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].room == room && _entries[i].direction == direction && _entries[i].altCode == altCode)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace pegasus
diff --git a/engines/pegasus/neighborhood/view.h b/engines/pegasus/neighborhood/view.h
new file mode 100755
index 0000000000..f1efb2b391
--- /dev/null
+++ b/engines/pegasus/neighborhood/view.h
@@ -0,0 +1,68 @@
+/* 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_NEIGHBORHOOD_VIEW_H
+#define PEGASUS_NEIGHBORHOOD_VIEW_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class ViewTable {
+public:
+ ViewTable() {}
+ ~ViewTable() {}
+
+ static const uint32 getResTag() { return MKTAG('V', 'i', 'e', 'w'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry() { time = 0xffffffff; }
+ bool isEmpty() { return time == 0xffffffff; }
+
+ tRoomID room;
+ tDirectionConstant direction;
+ tAlternateID altCode;
+ TimeValue time;
+ };
+
+ Entry findEntry(tRoomID room, tDirectionConstant direction, tAlternateID altCode);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/neighborhood/zoom.cpp b/engines/pegasus/neighborhood/zoom.cpp
new file mode 100755
index 0000000000..942289038f
--- /dev/null
+++ b/engines/pegasus/neighborhood/zoom.cpp
@@ -0,0 +1,70 @@
+/* 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/debug.h"
+#include "common/stream.h"
+#include "common/textconsole.h"
+
+#include "pegasus/neighborhood/zoom.h"
+
+namespace Pegasus {
+
+void ZoomTable::loadFromStream(Common::SeekableReadStream *stream) {
+ uint32 count = stream->readUint32BE();
+ _entries.resize(count);
+
+ for (uint32 i = 0; i < count; i++) {
+ _entries[i].hotspot = stream->readUint16BE();
+ _entries[i].movieStart = stream->readUint32BE();
+ _entries[i].movieEnd = stream->readUint32BE();
+ _entries[i].room = stream->readUint16BE();
+ _entries[i].direction = stream->readByte();
+ debug(0, "Zoom[%d]: %d %d %d %d %d", i, _entries[i].hotspot, _entries[i].movieStart,
+ _entries[i].movieEnd, _entries[i].room, _entries[i].direction);
+ stream->readByte(); // alignment
+ }
+}
+
+void ZoomTable::clear() {
+ _entries.clear();
+}
+
+ZoomTable::Entry::Entry() {
+ hotspot = kNoHotSpotID;
+ movieStart = 0xffffffff;
+ movieEnd = 0xffffffff;
+ room = kNoRoomID;
+ direction = kNoDirection;
+}
+
+ZoomTable::Entry ZoomTable::findEntry(tHotSpotID hotspot) {
+ for (uint32 i = 0; i < _entries.size(); i++)
+ if (_entries[i].hotspot == hotspot)
+ return _entries[i];
+
+ return Entry();
+}
+
+} // End of namespace Pegasus \ No newline at end of file
diff --git a/engines/pegasus/neighborhood/zoom.h b/engines/pegasus/neighborhood/zoom.h
new file mode 100755
index 0000000000..e659b11a94
--- /dev/null
+++ b/engines/pegasus/neighborhood/zoom.h
@@ -0,0 +1,69 @@
+/* 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_NEIGHBORHOOD_ZOOM_H
+#define PEGASUS_NEIGHBORHOOD_ZOOM_H
+
+#include "common/array.h"
+#include "common/endian.h"
+
+#include "pegasus/Game_Shell/Headers/Game_Shell_Constants.h"
+
+namespace Common {
+ class SeekableReadStream;
+}
+
+namespace Pegasus {
+
+class ZoomTable {
+public:
+ ZoomTable() {}
+ ~ZoomTable() {}
+
+ static const uint32 getResTag() { return MKTAG('Z', 'o', 'o', 'm'); }
+
+ void loadFromStream(Common::SeekableReadStream *stream);
+ void clear();
+
+ struct Entry {
+ Entry();
+ bool isEmpty() { return movieStart == 0xffffffff; }
+
+ tHotSpotID hotspot;
+ TimeValue movieStart;
+ TimeValue movieEnd;
+ tRoomID room;
+ tDirectionConstant direction;
+ };
+
+ Entry findEntry(tHotSpotID hotspot);
+
+private:
+ Common::Array<Entry> _entries;
+};
+
+} // End of namespace Pegasus
+
+#endif
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp
index 4e68007c03..d318497e78 100644
--- a/engines/pegasus/pegasus.cpp
+++ b/engines/pegasus/pegasus.cpp
@@ -33,6 +33,7 @@
#include "pegasus/console.h"
#include "pegasus/pegasus.h"
+#include "pegasus/neighborhood/neighborhood.h"
//#define RUN_SUB_MOVIE // :D :D :D :D :D :D
//#define RUN_INTERFACE_TEST
@@ -240,118 +241,11 @@ void PegasusEngine::mainGameLoop() {
void PegasusEngine::changeLocation(TimeZone timeZone) {
_timeZone = timeZone;
- loadViews(_timeZone);
- //loadExits(_timeZone);
- loadDoors(_timeZone);
- //loadHSLs(_timeZone);
- //loadHSIn(_timeZone);
- loadSoundSpots(_timeZone);
- //loadTurns(_timeZone);
- loadZooms(_timeZone);
- loadExtras(_timeZone);
-}
-
-void PegasusEngine::loadViews(TimeZone timeZone) {
- _currentViews.clear();
-
- Common::SeekableReadStream *res = _resFork->getResource(MKTAG('V', 'i', 'e', 'w'), getTimeZoneDesc(timeZone));
-
- uint32 entryCount = res->readUint32BE();
-
- for (uint32 i = 0; i < entryCount; i++) {
- View view;
- view.u0 = res->readUint16BE(); // Compass reading?
- view.u1 = res->readByte(); // Always 0-3, direction?
- view.u2 = res->readByte(); // Usually 0, rarely 3
- view.frameTime = res->readUint32BE();
- debug(1, "View[%d]: u0 = %d, u1 = %d, u2 = %d, time = %d", i, view.u0, view.u1, view.u2, view.frameTime);
- _currentViews.push_back(view);
- }
-
- delete res;
-}
-
-void PegasusEngine::loadDoors(TimeZone timeZone) {
- _currentDoors.clear();
-
- Common::SeekableReadStream *res = _resFork->getResource(MKTAG('D', 'o', 'o', 'r'), getTimeZoneDesc(timeZone));
-
- uint32 entryCount = res->readUint32BE();
-
- for (uint32 i = 0; i < entryCount; i++) {
- Door door;
- door.u0 = res->readUint16BE();
- door.u1 = res->readUint16BE(); // Always divisible by 256?
- door.startTime = res->readUint32BE();
- door.endTime = res->readUint32BE();
- door.u2 = res->readUint16BE();
- debug(1, "Door[%d]: u0 = %d, u1 = %d, startTime = %d, endTime = %d, u2 = %d", i, door.u0, door.u1, door.startTime, door.endTime, door.u2);
- _currentDoors.push_back(door);
- }
-
- delete res;
-}
-
-void PegasusEngine::loadSoundSpots(TimeZone timeZone) {
- _currentSoundSpots.clear();
-
- Common::SeekableReadStream *res = _resFork->getResource(MKTAG('S', 'p', 'o', 't'), getTimeZoneDesc(timeZone));
-
- uint32 entryCount = res->readUint32BE();
- for (uint32 i = 0; i < entryCount; i++) {
- SoundSpot spot;
- spot.u0 = res->readUint16BE();
- spot.u1 = res->readUint16BE();
- spot.u2 = res->readUint16BE(); // 0/1 or 768/769
- spot.startTime = res->readUint32BE();
- spot.endTime = res->readUint32BE();
- spot.u3 = res->readUint16BE();
- debug(1, "Sound Spot[%d]: u0 = %d, u1 = %d, u2 = %d, startTime = %d, endTime = %d, u3 = %d", i, spot.u0, spot.u1, spot.u2, spot.startTime, spot.endTime, spot.u3);
- _currentSoundSpots.push_back(spot);
- }
-
- delete res;
-}
-
-void PegasusEngine::loadZooms(TimeZone timeZone) {
- _currentZooms.clear();
-
- Common::SeekableReadStream *res = _resFork->getResource(MKTAG('Z', 'o', 'o', 'm'), getTimeZoneDesc(timeZone));
-
- uint32 entryCount = res->readUint32BE();
-
- for (uint32 i = 0; i < entryCount; i++) {
- Zoom zoom;
- zoom.u0 = res->readUint16BE();
- zoom.u1 = res->readUint16BE();
- zoom.startTime = res->readUint32BE();
- zoom.endTime = res->readUint32BE();
- zoom.u2 = res->readUint16BE();
- debug(1, "Zoom[%d]: u0 = %d, u1 = %d, startTime = %d, endTime = %d, u2 = %d", i, zoom.u0, zoom.u1, zoom.startTime, zoom.endTime, zoom.u2);
- _currentZooms.push_back(zoom);
- }
-
- delete res;
-}
-
-void PegasusEngine::loadExtras(TimeZone timeZone) {
- _currentExtras.clear();
-
- Common::SeekableReadStream *res = _resFork->getResource(MKTAG('X', 't', 'r', 'a'), getTimeZoneDesc(timeZone));
-
- uint32 entryCount = res->readUint32BE();
-
- for (uint32 i = 0; i < entryCount; i++) {
- Extra extra;
- extra.u0 = res->readUint32BE();
- extra.startTime = res->readUint32BE();
- extra.endTime = res->readUint32BE();
- debug(1, "Extra[%d]: u0 = %d, startTime = %d, endTime = %d", i, extra.u0, extra.startTime, extra.endTime);
- _currentExtras.push_back(extra);
- }
-
- delete res;
+ // Just a test...
+ Neighborhood *neighborhood = new Neighborhood(this, getTimeZoneDesc(_timeZone));
+ neighborhood->init();
+ delete neighborhood;
}
void PegasusEngine::showLoadDialog() {
diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h
index 9f546337b5..d049f58f00 100644
--- a/engines/pegasus/pegasus.h
+++ b/engines/pegasus/pegasus.h
@@ -65,44 +65,6 @@ struct ItemLocationData {
byte u1;
};
-struct View {
- uint16 u0;
- byte u1;
- byte u2;
- uint32 frameTime;
-};
-
-struct Door {
- uint16 u0;
- uint16 u1;
- uint32 startTime;
- uint32 endTime;
- uint16 u2;
-};
-
-struct SoundSpot {
- uint16 u0;
- uint16 u1;
- uint16 u2;
- uint32 startTime;
- uint32 endTime;
- uint16 u3;
-};
-
-struct Zoom {
- uint16 u0;
- uint32 startTime;
- uint32 endTime;
- uint16 u1;
- uint16 u2;
-};
-
-struct Extra {
- uint32 u0;
- uint32 startTime;
- uint32 endTime;
-};
-
struct InventoryPanelEntry {
uint32 startTime;
uint32 endTime;
@@ -237,11 +199,6 @@ private:
void mainGameLoop();
void loadItemLocationData();
void changeLocation(TimeZone timeZone);
- void loadViews(TimeZone timeZone);
- void loadDoors(TimeZone timeZone);
- void loadSoundSpots(TimeZone timeZone);
- void loadZooms(TimeZone timeZone);
- void loadExtras(TimeZone timeZone);
// Misc Functions
static Common::String getTimeZoneFolder(TimeZone timeZone);
@@ -252,11 +209,6 @@ private:
GameMode _gameMode;
TimeZone _timeZone;
Common::Array<ItemLocationData> _itemLocationData;
- Common::Array<View> _currentViews;
- Common::Array<Door> _currentDoors;
- Common::Array<SoundSpot> _currentSoundSpots;
- Common::Array<Zoom> _currentZooms;
- Common::Array<Extra> _currentExtras;
// Console
PegasusConsole *_console;