[Scummvm-git-logs] scummvm master -> 347de79bb259037e5ed24acf2b7274374ec410a8
dreammaster
paulfgilbert at gmail.com
Wed Dec 9 03:50:36 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
347de79bb2 GLK: COMPREHEND: Partial support for Transylvania v2
Commit: 347de79bb259037e5ed24acf2b7274374ec410a8
https://github.com/scummvm/scummvm/commit/347de79bb259037e5ed24acf2b7274374ec410a8
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-12-08T19:49:59-08:00
Commit Message:
GLK: COMPREHEND: Partial support for Transylvania v2
Changed paths:
A engines/glk/comprehend/game_tr1.cpp
A engines/glk/comprehend/game_tr1.h
A engines/glk/comprehend/game_tr2.cpp
A engines/glk/comprehend/game_tr2.h
R engines/glk/comprehend/game_tr.cpp
R engines/glk/comprehend/game_tr.h
engines/glk/comprehend/comprehend.cpp
engines/glk/comprehend/detection_tables.h
engines/glk/comprehend/game_data.cpp
engines/glk/module.mk
diff --git a/engines/glk/comprehend/comprehend.cpp b/engines/glk/comprehend/comprehend.cpp
index 66787734ab..09ad9b2e4f 100644
--- a/engines/glk/comprehend/comprehend.cpp
+++ b/engines/glk/comprehend/comprehend.cpp
@@ -28,7 +28,8 @@
#include "glk/comprehend/game_data.h"
#include "glk/comprehend/game_oo.h"
#include "glk/comprehend/game_tm.h"
-#include "glk/comprehend/game_tr.h"
+#include "glk/comprehend/game_tr1.h"
+#include "glk/comprehend/game_tr2.h"
#include "glk/comprehend/pics.h"
#include "glk/quetzal.h"
#include "common/config-manager.h"
@@ -113,8 +114,10 @@ void Comprehend::createGame() {
_game = new OOToposGame();
else if (_gameDescription._gameId == "talisman")
_game = new TalismanGame();
- else if (_gameDescription._gameId == "transylvania")
- _game = new TransylvaniaGame();
+ else if (_gameDescription._gameId == "transylvania" && _gameDescription._filename.equalsIgnoreCase("tr.gda"))
+ _game = new TransylvaniaGame1();
+ else if (_gameDescription._gameId == "transylvania" && _gameDescription._filename.equalsIgnoreCase("g0"))
+ _game = new TransylvaniaGame2();
else
error("Unknown game");
}
diff --git a/engines/glk/comprehend/detection_tables.h b/engines/glk/comprehend/detection_tables.h
index 28d90faf2e..2364eef4b5 100644
--- a/engines/glk/comprehend/detection_tables.h
+++ b/engines/glk/comprehend/detection_tables.h
@@ -50,6 +50,9 @@ const ComprehendDetectionEntry COMPREHEND_GAMES[] = {
{"talisman", "g0", "35770d4815e610b5252e3fcd9f11def3"},
#endif
{"transylvania", "tr.gda", "22e08633eea02ceee49b909dfd982d22"},
+#ifndef RELEASE_BUILD
+ {"transylvania", "g0", "384cbf0cd50888310fd33574e6baf880"},
+#endif
{nullptr, nullptr, nullptr}
};
diff --git a/engines/glk/comprehend/game_data.cpp b/engines/glk/comprehend/game_data.cpp
index d155d16a31..1d77a5a4e0 100644
--- a/engines/glk/comprehend/game_data.cpp
+++ b/engines/glk/comprehend/game_data.cpp
@@ -551,6 +551,7 @@ void GameData::parse_header(FileBuffer *fb) {
_magicWord = (uint16)(-0x5a00 + 0x4);
break;
+ case 0x8bc3: /* Transylvania v2 */
case 0x93f0: /* OO-Topos */
case 0xa429: /* Talisman */
_comprehendVersion = 2;
diff --git a/engines/glk/comprehend/game_tr.cpp b/engines/glk/comprehend/game_tr1.cpp
similarity index 91%
rename from engines/glk/comprehend/game_tr.cpp
rename to engines/glk/comprehend/game_tr1.cpp
index 818ca14a69..21419c4dbb 100644
--- a/engines/glk/comprehend/game_tr.cpp
+++ b/engines/glk/comprehend/game_tr1.cpp
@@ -22,7 +22,7 @@
#include "glk/comprehend/comprehend.h"
#include "glk/comprehend/game_data.h"
-#include "glk/comprehend/game_tr.h"
+#include "glk/comprehend/game_tr1.h"
#include "glk/comprehend/pics.h"
namespace Glk {
@@ -56,11 +56,11 @@ struct TransylvaniaMonster {
};
-const TransylvaniaMonster TransylvaniaGame::WEREWOLF = {
+const TransylvaniaMonster TransylvaniaGame1::WEREWOLF = {
ITEM_WEREWOLF, 7, ROOMFLAG_WEREWOLF, 10, 190
};
-const TransylvaniaMonster TransylvaniaGame::VAMPIRE = {
+const TransylvaniaMonster TransylvaniaGame1::VAMPIRE = {
ITEM_VAMPIRE, 5, ROOMFLAG_VAMPIRE, 0, 200
};
@@ -69,7 +69,7 @@ static const GameStrings TR_STRINGS = {
};
-TransylvaniaGame::TransylvaniaGame() : ComprehendGameV1(),
+TransylvaniaGame1::TransylvaniaGame1() : ComprehendGameV1(),
_miceReleased(false) {
_gameDataFile = "tr.gda";
@@ -91,7 +91,7 @@ TransylvaniaGame::TransylvaniaGame() : ComprehendGameV1(),
_gameStrings = &TR_STRINGS;
}
-bool TransylvaniaGame::updateMonster(const TransylvaniaMonster *monsterInfo) {
+bool TransylvaniaGame1::updateMonster(const TransylvaniaMonster *monsterInfo) {
Item *monster;
Room *room;
uint16 turn_count;
@@ -126,12 +126,12 @@ bool TransylvaniaGame::updateMonster(const TransylvaniaMonster *monsterInfo) {
return true;
}
-bool TransylvaniaGame::isMonsterInRoom(const TransylvaniaMonster *monsterInfo) {
+bool TransylvaniaGame1::isMonsterInRoom(const TransylvaniaMonster *monsterInfo) {
Item *monster = get_item(monsterInfo->_object);
return monster->_room == _currentRoom;
}
-int TransylvaniaGame::roomIsSpecial(unsigned room_index,
+int TransylvaniaGame1::roomIsSpecial(unsigned room_index,
unsigned *roomDescString) {
Room *room = &_rooms[room_index];
@@ -144,7 +144,7 @@ int TransylvaniaGame::roomIsSpecial(unsigned room_index,
return ROOM_IS_NORMAL;
}
-void TransylvaniaGame::beforeTurn() {
+void TransylvaniaGame1::beforeTurn() {
Room *room;
if (!isMonsterInRoom(&WEREWOLF) && !isMonsterInRoom(&VAMPIRE)) {
@@ -191,7 +191,7 @@ done:
ComprehendGameV1::beforeTurn();
}
-void TransylvaniaGame::synchronizeSave(Common::Serializer &s) {
+void TransylvaniaGame1::synchronizeSave(Common::Serializer &s) {
ComprehendGame::synchronizeSave(s);
s.syncAsByte(_miceReleased);
@@ -200,7 +200,7 @@ void TransylvaniaGame::synchronizeSave(Common::Serializer &s) {
get_item(ITEM_VAMPIRE)->_room = 0xff;
}
-void TransylvaniaGame::handleSpecialOpcode(uint8 operand) {
+void TransylvaniaGame1::handleSpecialOpcode(uint8 operand) {
switch (operand) {
case 1:
// Mice have been released
@@ -259,7 +259,7 @@ void TransylvaniaGame::handleSpecialOpcode(uint8 operand) {
if (g_comprehend->shouldQuit()) return; \
} while (strlen(buffer) == 0)
-void TransylvaniaGame::beforeGame() {
+void TransylvaniaGame1::beforeGame() {
char buffer[128];
g_comprehend->setDisableSaves(true);
diff --git a/engines/glk/comprehend/game_tr.h b/engines/glk/comprehend/game_tr1.h
similarity index 90%
rename from engines/glk/comprehend/game_tr.h
rename to engines/glk/comprehend/game_tr1.h
index 076d697aa9..3a765965bd 100644
--- a/engines/glk/comprehend/game_tr.h
+++ b/engines/glk/comprehend/game_tr1.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef GLK_COMPREHEND_GAME_TR_H
-#define GLK_COMPREHEND_GAME_TR_H
+#ifndef GLK_COMPREHEND_GAME_TR1_H
+#define GLK_COMPREHEND_GAME_TR1_H
#include "glk/comprehend/game_opcodes.h"
@@ -30,7 +30,7 @@ namespace Comprehend {
struct TransylvaniaMonster;
-class TransylvaniaGame : public ComprehendGameV1 {
+class TransylvaniaGame1 : public ComprehendGameV1 {
private:
static const TransylvaniaMonster WEREWOLF;
static const TransylvaniaMonster VAMPIRE;
@@ -39,8 +39,8 @@ private:
bool updateMonster(const TransylvaniaMonster *monsterInfo);
bool isMonsterInRoom(const TransylvaniaMonster *monsterInfo);
public:
- TransylvaniaGame();
- ~TransylvaniaGame() override {}
+ TransylvaniaGame1();
+ ~TransylvaniaGame1() override {}
void beforeGame() override;
void beforeTurn() override;
diff --git a/engines/glk/comprehend/game_tr2.cpp b/engines/glk/comprehend/game_tr2.cpp
new file mode 100644
index 0000000000..5f29ca4961
--- /dev/null
+++ b/engines/glk/comprehend/game_tr2.cpp
@@ -0,0 +1,282 @@
+/* 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.
+ *
+ */
+
+#include "glk/comprehend/comprehend.h"
+#include "glk/comprehend/game_data.h"
+#include "glk/comprehend/game_tr2.h"
+#include "glk/comprehend/pics.h"
+
+namespace Glk {
+namespace Comprehend {
+
+enum RoomId {
+ ROOM_CLAY_HUT = 7,
+ ROOM_FIELD = 26
+};
+
+enum RoomFlag {
+ ROOMFLAG_FOREST = 1 << 0,
+ ROOMFLAG_WEREWOLF = 1 << 6,
+ ROOMFLAG_VAMPIRE = 1 << 7
+};
+
+enum ItemId {
+ ITEM_GOBLIN = 9,
+ ITEM_SILVER_BULLET = 21,
+ ITEM_BLACK_CAT = 23,
+ ITEM_WEREWOLF = 33,
+ ITEM_VAMPIRE = 38
+};
+
+struct TransylvaniaMonster {
+ uint8 _object;
+ uint8 _deadFlag;
+ uint _roomAllowFlag;
+ uint _minTurnsBefore;
+ uint _randomness;
+};
+
+
+const TransylvaniaMonster TransylvaniaGame2::WEREWOLF = {
+ ITEM_WEREWOLF, 7, ROOMFLAG_WEREWOLF, 10, 190
+};
+
+const TransylvaniaMonster TransylvaniaGame2::VAMPIRE = {
+ ITEM_VAMPIRE, 5, ROOMFLAG_VAMPIRE, 0, 200
+};
+
+static const GameStrings TR_STRINGS = {
+ EXTRA_STRING_TABLE(0x8a)
+};
+
+
+TransylvaniaGame2::TransylvaniaGame2() : ComprehendGameV2(),
+ _miceReleased(false) {
+ _gameDataFile = "g0";
+
+ _locationGraphicFiles.push_back("RA");
+ _locationGraphicFiles.push_back("RB");
+ _locationGraphicFiles.push_back("RC");
+ _itemGraphicFiles.push_back("OA");
+ _itemGraphicFiles.push_back("OB");
+ _itemGraphicFiles.push_back("OC");
+
+ _titleGraphicFile = "t0";
+ _gameStrings = &TR_STRINGS;
+}
+
+bool TransylvaniaGame2::updateMonster(const TransylvaniaMonster *monsterInfo) {
+ Item *monster;
+ Room *room;
+ uint16 turn_count;
+
+ room = &_rooms[_currentRoom];
+ if (!(room->_flags & monsterInfo->_roomAllowFlag))
+ return false;
+
+ turn_count = _variables[VAR_TURN_COUNT];
+ monster = get_item(monsterInfo->_object);
+
+ if (monster->_room == _currentRoom) {
+ // The monster is in the current room - leave it there
+ return true;
+ }
+
+ if (!_flags[monsterInfo->_deadFlag] &&
+ turn_count > monsterInfo->_minTurnsBefore) {
+ /*
+ * The monster is alive and allowed to move to the current
+ * room. Randomly decide whether on not to. If not, move
+ * it back to limbo.
+ */
+ if (getRandomNumber(255) > monsterInfo->_randomness) {
+ move_object(monster, _currentRoom);
+ _variables[15] = turn_count + 1;
+ } else {
+ move_object(monster, ROOM_NOWHERE);
+ }
+ }
+
+ return true;
+}
+
+bool TransylvaniaGame2::isMonsterInRoom(const TransylvaniaMonster *monsterInfo) {
+ Item *monster = get_item(monsterInfo->_object);
+ return monster->_room == _currentRoom;
+}
+
+int TransylvaniaGame2::roomIsSpecial(unsigned room_index,
+ unsigned *roomDescString) {
+ Room *room = &_rooms[room_index];
+
+ if (room_index == 0x28) {
+ if (roomDescString)
+ *roomDescString = room->_stringDesc;
+ return ROOM_IS_DARK;
+ }
+
+ return ROOM_IS_NORMAL;
+}
+
+void TransylvaniaGame2::beforeTurn() {
+ Room *room;
+
+ if (!isMonsterInRoom(&WEREWOLF) && !isMonsterInRoom(&VAMPIRE)) {
+ if (_currentRoom == ROOM_CLAY_HUT) {
+ Item *blackCat = get_item(ITEM_BLACK_CAT);
+ if (blackCat->_room == _currentRoom && getRandomNumber(255) >= 128)
+ console_println(_strings[109].c_str());
+ goto done;
+
+ } else if (_currentRoom == ROOM_FIELD) {
+ Item *goblin = get_item(ITEM_GOBLIN);
+ if (goblin->_room == _currentRoom)
+ console_println(_strings[94 + getRandomNumber(3)].c_str());
+ goto done;
+
+ }
+ }
+
+ if (updateMonster(&WEREWOLF) || updateMonster(&VAMPIRE))
+ goto done;
+
+ room = &_rooms[_currentRoom];
+ if ((room->_flags & ROOMFLAG_FOREST) && (_variables[VAR_TURN_COUNT] % 255) >= 4
+ && getRandomNumber(255) < 40) {
+ int stringNum = _miceReleased ? 108 : 107;
+ console_println(_strings[stringNum].c_str());
+
+ // Until the mice are released, an eagle moves player to a random room
+ if (!_miceReleased) {
+ // Get new room to get moved to
+ int roomNum = getRandomNumber(3) + 1;
+ if (roomNum == _currentRoom)
+ roomNum += 15;
+
+ move_to(roomNum);
+
+ // Make sure Werwolf and Vampire aren't present
+ get_item(ITEM_WEREWOLF)->_room = 0xff;
+ get_item(ITEM_VAMPIRE)->_room = 0xff;
+ }
+ }
+
+done:
+ ComprehendGameV2::beforeTurn();
+}
+
+void TransylvaniaGame2::synchronizeSave(Common::Serializer &s) {
+ ComprehendGame::synchronizeSave(s);
+ s.syncAsByte(_miceReleased);
+
+ // As a post-step, ensure the vampire and werewolf aren't present
+ get_item(ITEM_WEREWOLF)->_room = 0xff;
+ get_item(ITEM_VAMPIRE)->_room = 0xff;
+}
+
+void TransylvaniaGame2::handleSpecialOpcode(uint8 operand) {
+ switch (operand) {
+ case 1:
+ // Mice have been released
+ _miceReleased = true;
+ break;
+
+ case 2:
+ // Gun is fired. Drop the bullet in a random room
+ get_item(ITEM_SILVER_BULLET)->_room = getRandomNumber(7) + 1;
+ _updateFlags |= UPDATE_GRAPHICS;
+ break;
+
+ case 3:
+ case 4:
+ // Game over - failure
+ console_println(_strings2[138].c_str());
+ game_restart();
+ break;
+
+ case 5:
+ // Won the game
+ g_comprehend->showGraphics();
+ g_comprehend->drawLocationPicture(40);
+ game_restart();
+ break;
+
+ case 6:
+ game_save();
+ break;
+
+ case 7:
+ game_restore();
+ break;
+
+ case 8:
+ // Restart game
+ game_restart();
+ break;
+
+ case 9:
+ // Show the Zin screen in reponse to doing
+ // 'sing some enchanted evening' in his cabin.
+ g_comprehend->showGraphics();
+ g_comprehend->drawLocationPicture(41);
+ console_get_key();
+ _updateFlags |= UPDATE_GRAPHICS;
+ break;
+
+ default:
+ break;
+ }
+}
+
+#define READ_LINE do { \
+ g_comprehend->readLine(buffer, sizeof(buffer)); \
+ if (g_comprehend->shouldQuit()) return; \
+ } while (strlen(buffer) == 0)
+
+void TransylvaniaGame2::beforeGame() {
+ char buffer[128];
+ g_comprehend->setDisableSaves(true);
+
+ // Draw the title
+ g_comprehend->drawPicture(TITLE_IMAGE);
+
+ // Print game information
+ console_println("Story and graphics by Antonio Antiochia.");
+ console_println("IBM version by Jeffrey A. Jay. Copyright 1987 POLARWARE, Inc.");
+ g_comprehend->readChar();
+
+ // Welcome to Transylvania - sign your name
+ console_println(_strings[0x20].c_str());
+ READ_LINE;
+
+ // The player's name is stored in word 0
+ _replaceWords[0] = Common::String(buffer);
+
+ // And your next of kin - This isn't stored by the game
+ console_println(_strings[0x21].c_str());
+ READ_LINE;
+
+ g_comprehend->setDisableSaves(false);
+}
+
+} // namespace Comprehend
+} // namespace Glk
diff --git a/engines/glk/comprehend/game_tr2.h b/engines/glk/comprehend/game_tr2.h
new file mode 100644
index 0000000000..309d7551de
--- /dev/null
+++ b/engines/glk/comprehend/game_tr2.h
@@ -0,0 +1,55 @@
+/* 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.
+ *
+ */
+
+#ifndef GLK_COMPREHEND_GAME_TR2_H
+#define GLK_COMPREHEND_GAME_TR2_H
+
+#include "glk/comprehend/game_opcodes.h"
+
+namespace Glk {
+namespace Comprehend {
+
+struct TransylvaniaMonster;
+
+class TransylvaniaGame2 : public ComprehendGameV2 {
+private:
+ static const TransylvaniaMonster WEREWOLF;
+ static const TransylvaniaMonster VAMPIRE;
+ bool _miceReleased;
+
+ bool updateMonster(const TransylvaniaMonster *monsterInfo);
+ bool isMonsterInRoom(const TransylvaniaMonster *monsterInfo);
+public:
+ TransylvaniaGame2();
+ ~TransylvaniaGame2() override {}
+
+ void beforeGame() override;
+ void beforeTurn() override;
+ void synchronizeSave(Common::Serializer &s) override;
+ int roomIsSpecial(unsigned room_index, unsigned *roomDescString) override;
+ void handleSpecialOpcode(uint8 operand) override;
+};
+
+} // namespace Comprehend
+} // namespace Glk
+
+#endif
diff --git a/engines/glk/module.mk b/engines/glk/module.mk
index 56c538c369..cab4fac4aa 100644
--- a/engines/glk/module.mk
+++ b/engines/glk/module.mk
@@ -174,7 +174,8 @@ MODULE_OBJS := \
comprehend/game_oo.o \
comprehend/game_opcodes.o \
comprehend/game_tm.o \
- comprehend/game_tr.o \
+ comprehend/game_tr1.o \
+ comprehend/game_tr2.o \
comprehend/pics.o \
glulx/accel.o \
glulx/exec.o \
More information about the Scummvm-git-logs
mailing list