aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/startrek/awaymission.cpp2
-rw-r--r--engines/startrek/awaymission.h9
-rw-r--r--engines/startrek/graphics.cpp30
-rw-r--r--engines/startrek/graphics.h9
-rw-r--r--engines/startrek/module.mk3
-rw-r--r--engines/startrek/room.cpp4
-rw-r--r--engines/startrek/room.h74
-rw-r--r--engines/startrek/rooms/demon0.cpp3
-rw-r--r--engines/startrek/rooms/demon3.cpp2
-rw-r--r--engines/startrek/rooms/demon4.cpp2
-rw-r--r--engines/startrek/rooms/demon5.cpp3
-rw-r--r--engines/startrek/rooms/demon6.cpp571
-rw-r--r--engines/startrek/rooms/function_map.h80
-rw-r--r--engines/startrek/text.h164
14 files changed, 948 insertions, 8 deletions
diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index e118b3d9c5..e0232009ff 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -79,7 +79,7 @@ void StarTrekEngine::loadRoom(const Common::String &missionName, int roomIndex)
_screenName = _missionName + (char)(_roomIndex + '0');
_gfx->setBackgroundImage(_gfx->loadBitmap(_screenName));
- _gfx->loadPri(_screenName + ".pri");
+ _gfx->loadPri(_screenName);
_gfx->loadPalette("palette");
_gfx->copyBackgroundScreen();
diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index f27a65c0ac..0ad2946c23 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -54,16 +54,19 @@ struct AwayMission {
// Demon World
struct {
bool wasRudeToPrelate; // 0x29
+ bool insultedStephen; // 0x2b
bool beatKlingons; // 0x2f
bool tookKlingonHand; // 0x31
bool talkedToPrelate; // 0x33
+ bool stephenWelcomedToStudy; // 0x34
+ bool prelateWelcomedCrew; // 0x35
bool askedPrelateAboutSightings; // 0x36
byte field37; // 0x37
bool mccoyMentionedFlora; // 0x38
byte numBouldersGone; // 0x39
byte enteredFrom; // 0x3a
- bool field3b; // 0x3b
+ bool repairedHand; // 0x3b
bool healedMiner; // 0x3c
bool curedChub; // 0x3d
bool field3e; // 0x3e
@@ -80,9 +83,11 @@ struct AwayMission {
bool boulder4Gone; // 0x4c
bool doorOpened; // 0x4d
bool field4e; // 0x4e
- byte field4f; // 0x4f
+ byte itemsTakenFromCase; // 0x4f
bool gotBerries; // 0x50
bool madeHypoDytoxin; // 0x51
+ bool gavePointsForDytoxin; // 0x54
+ bool lookedAtComputer; // 0x55
byte field56; // 0x56
bool foundAlienRoom; // 0x57
} demon;
diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp
index a5b2b7bc71..145a156b1e 100644
--- a/engines/startrek/graphics.cpp
+++ b/engines/startrek/graphics.cpp
@@ -46,6 +46,7 @@ Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) {
_font = new Font(_vm);
_numSprites = 0;
+ _pushedNumSprites = -1;
_palData = new byte[256 * 3];
_lutData = new byte[256 * 3];
@@ -160,7 +161,7 @@ void Graphics::decPaletteFadeLevel() {
void Graphics::loadPri(const Common::String &priFile) {
- SharedPtr<FileStream> priStream = _vm->loadFile(priFile);
+ SharedPtr<FileStream> priStream = _vm->loadFile(priFile + ".pri");
priStream->read(_priData, SCREEN_WIDTH * SCREEN_HEIGHT / 2);
}
@@ -555,6 +556,15 @@ void Graphics::drawAllSprites(bool updateScreen) {
}
/**
+ * Sets "bitmapChanged" to true on all sprites before calling drawAllSprites.
+ */
+void Graphics::forceDrawAllSprites(bool updateScreen) {
+ for (int i = 0; i < _numSprites; i++)
+ _sprites[i]->bitmapChanged = true;
+ drawAllSprites(updateScreen);
+}
+
+/**
* Returns the sprite at the given position (ignores mouse).
*/
Sprite *Graphics::getSpriteAt(int16 x, int16 y) {
@@ -613,6 +623,24 @@ void Graphics::delSprite(Sprite *sprite) {
error("delSprite: sprite not in list");
}
+void Graphics::pushSprites() {
+ if (_pushedNumSprites != -1)
+ error("Tried to push sprites more than once");
+ _pushedNumSprites = _numSprites;
+ memcpy(_pushedSprites, _sprites, sizeof(_sprites));
+
+ _numSprites = 0;
+}
+
+void Graphics::popSprites() {
+ if (_pushedNumSprites == -1)
+ error("Tried to pop sprites without a prior push");
+ _numSprites = _pushedNumSprites;
+ memcpy(_sprites, _pushedSprites, sizeof(_sprites));
+
+ _pushedNumSprites = -1;
+}
+
void Graphics::copyBackgroundScreen() {
drawDirectToScreen(_backgroundImage);
diff --git a/engines/startrek/graphics.h b/engines/startrek/graphics.h
index 5c09cfa702..49d2a3a429 100644
--- a/engines/startrek/graphics.h
+++ b/engines/startrek/graphics.h
@@ -76,11 +76,16 @@ public:
void drawSprite(const Sprite &sprite);
void drawSprite(const Sprite &sprite, const Common::Rect &rect);
void drawAllSprites(bool updateScreen=true);
+ void forceDrawAllSprites(bool updateScreen=true);
Sprite *getSpriteAt(int16 x, int16 y);
+ Sprite *getSpriteAt(Common::Point p) { return getSpriteAt(p.x, p.y); }
void addSprite(Sprite *sprite);
void delSprite(Sprite *sprite);
+ // Save/load the current state of sprites. Can only push once for now.
+ void pushSprites();
+ void popSprites();
void copyBackgroundScreen();
void drawDirectToScreen(SharedPtr<Bitmap> bitmap);
@@ -105,6 +110,10 @@ private:
Sprite *_sprites[MAX_SPRITES];
int _numSprites;
+ // Analagous to above, used when pushing/popping
+ Sprite *_pushedSprites[MAX_SPRITES];
+ int _pushedNumSprites;
+
// Any changes to the mouse image are buffered until the next time "drawAllSprites" is
// called (since the original game treats it like a sprite).
bool _mouseToBeShown;
diff --git a/engines/startrek/module.mk b/engines/startrek/module.mk
index 7f089ca085..040091ddc2 100644
--- a/engines/startrek/module.mk
+++ b/engines/startrek/module.mk
@@ -23,7 +23,8 @@ MODULE_OBJS = \
rooms/demon2.o \
rooms/demon3.o \
rooms/demon4.o \
- rooms/demon5.o
+ rooms/demon5.o \
+ rooms/demon6.o \
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 8a71961398..7110c4d559 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -61,6 +61,10 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm) {
_roomActionList = demon5ActionList;
_numRoomActions = sizeof(demon5ActionList) / sizeof(RoomAction);
}
+ else if (name == "DEMON6") {
+ _roomActionList = demon6ActionList;
+ _numRoomActions = sizeof(demon6ActionList) / sizeof(RoomAction);
+ }
else {
warning("Room \"%s\" unimplemented", name.c_str());
_numRoomActions = 0;
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 9943509749..027dbd6ae5 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -107,6 +107,7 @@ private:
void loseItem(int item); // Cmd 0x07
void walkCrewman(int actorIndex, int16 destX, int16 destY, uint16 finishedAnimActionParam);// Cmd 0x08
void loadMapFile(const Common::String &name); // Cmd 0x09
+ // Command 0x0c: "demon6ShowCase"
Common::Point getActorPos(int actorIndex); // Cmd 0x0d
void playSoundEffectIndex(int soundEffect); // Cmd 0x0f
void playMidiMusicTracks(int startTrack, int loopTrack); // Cmd 0x10
@@ -370,6 +371,71 @@ public:
void demon5CheckCompletedStudy();
void demon5GetCrate();
+ // DEMON6
+ void demon6Tick1();
+ void demon6Tick30();
+ void demon6SpockReachedComputer();
+ void demon6WalkToDoor();
+ void demon6TouchedDoorOpenTrigger();
+ void demon6DoorOpenedOrReachedDoor();
+ void demon6UsePhaserOnStephen();
+ void demon6UsePhaserOnCase();
+ void demon6LookAtWorkspace();
+ void demon6LookAtCase();
+ void demon6LookAtTable();
+ void demon6LookAtMineral();
+ void demon6LookAtShells();
+ void demon6LookAtSkull();
+ void demon6LookAtMetal();
+ void demon6LookAtMeteor();
+ void demon6LookAtMountain();
+ void demon6LookAtSynthesizer();
+ void demon6LookAtKirk();
+ void demon6LookAtSpock();
+ void demon6LookAtMccoy();
+ void demon6LookAtRedshirt();
+ void demon6LookAtComputer();
+ void demon6LookAnywhere();
+ void demon6LookAtStephen();
+ void demon6TalkToMccoy();
+ void demon6TalkToSpock();
+ void demon6TalkToKirk();
+ void demon6TalkToRedshirt();
+ void demon6TalkToStephen();
+ void demon6UseBerryOnStephen();
+ void demon6UseBerryOnSynthesizer();
+ void demon6MccoyReachedSynthesizer();
+ void demon6FinishedMakingHypoDytoxin();
+ void demon6UseHandOnWorkspace();
+ void demon6SpockReachedWorkspace();
+ void demon6SpockFinishedRepairingHand();
+ void demon6UseAnythingOnWorkspace();
+ void demon6UseCrewmanOnCase();
+ void demon6UseKirkOnComputer();
+ void demon6UseMccoyOnComputer();
+ void demon6UseRedshirtOnComputer();
+ void demon6UseSpockOnComputer();
+ void demon6UseMineralOnStephen();
+ void demon6UseShellsOnStephen();
+ void demon6UseMeteorOnStephen();
+ void demon6UseSkullOnStephen();
+ void demon6UseMetalOnStephen();
+ void demon6ReturnItemToStephen(int item);
+ void demon6UseHandOnStephen();
+ void demon6UseMTricoderOnStephen();
+ void demon6UseSTricoderOnTable();
+ void demon6UseSTricoderOnComputer();
+ void demon6UseSTricoderOnMineral();
+ void demon6UseSTricoderOnShells();
+ void demon6UseSTricoderOnSkull();
+ void demon6UseSTricoderOnMetal();
+ void demon6UseSTricoderOnMeteor();
+ void demon6UseSTricoderOnCase();
+ void demon6UseSTricoderOnSynthesizer();
+ void demon6GetCase();
+ void demon6KirkReachedCase();
+ int demon6ShowCase(int visible);
+
private:
// Room-specific variables. This is memset'ed to 0 when the room is initialized.
union {
@@ -414,6 +480,14 @@ private:
bool movingToDoor; // 0xd5
} demon5;
+ struct {
+ bool insultedStephenRecently; // 0xca
+ bool stephenInRoom; // 0xcb
+ bool caseOpened; // 0xcd
+ byte doorCounter; // 0xce
+ bool movingToDoor; // 0xcf
+ } demon6;
+
} _roomVar;
};
diff --git a/engines/startrek/rooms/demon0.cpp b/engines/startrek/rooms/demon0.cpp
index d69f8f1db7..2986810e5d 100644
--- a/engines/startrek/rooms/demon0.cpp
+++ b/engines/startrek/rooms/demon0.cpp
@@ -43,6 +43,9 @@ void Room::demon0Tick60() {
}
void Room::demon0Tick100() {
+ if (_vm->_awayMission.demon.talkedToPrelate || _vm->_awayMission.demon.prelateWelcomedCrew)
+ return;
+ _vm->_awayMission.demon.prelateWelcomedCrew = true;
showText(TX_SPEAKER_ANGIVEN, TX_DEM0_036);
}
diff --git a/engines/startrek/rooms/demon3.cpp b/engines/startrek/rooms/demon3.cpp
index 07bb4541e4..dbd0c6739a 100644
--- a/engines/startrek/rooms/demon3.cpp
+++ b/engines/startrek/rooms/demon3.cpp
@@ -85,7 +85,7 @@ void Room::demon3Timer1Expired() {
// Door just opened
void Room::demon3Timer3Expired() {
- if (_vm->_awayMission.demon.field3b) {
+ if (_vm->_awayMission.demon.repairedHand) {
showText(TX_DEM3N008);
loadActorAnim(14, "door", 0x82, 0xc, 0);
loadMapFile("demon3");
diff --git a/engines/startrek/rooms/demon4.cpp b/engines/startrek/rooms/demon4.cpp
index 2993c176d3..52286327ea 100644
--- a/engines/startrek/rooms/demon4.cpp
+++ b/engines/startrek/rooms/demon4.cpp
@@ -35,7 +35,7 @@ void Room::demon4Tick1() {
loadActorAnim(8, "stpout2", 0x107, 0x92, 0);
_roomVar.demon4.cb = true;
- if ((_vm->_awayMission.demon.field4f & 0x10) && !_vm->_awayMission.demon.field47)
+ if ((_vm->_awayMission.demon.itemsTakenFromCase & 0x10) && !_vm->_awayMission.demon.field47)
_vm->_awayMission.timers[6] = 20;
}
diff --git a/engines/startrek/rooms/demon5.cpp b/engines/startrek/rooms/demon5.cpp
index 94962db22c..4282ca1aa6 100644
--- a/engines/startrek/rooms/demon5.cpp
+++ b/engines/startrek/rooms/demon5.cpp
@@ -62,12 +62,13 @@ void Room::demon5UseSTricorderOnCrate() {
showText(TX_SPEAKER_SPOCK, TX_DEM5_006);
}
+// FIXME: should work when used on people as well, but doesn't
void Room::demon5UsePhaserOnAnything() {
showText(TX_SPEAKER_SPOCK, TX_DEM5_007);
}
void Room::demon5UseHandOnStephen() {
- if (_vm->_awayMission.demon.field3b)
+ if (_vm->_awayMission.demon.repairedHand)
showText(TX_SPEAKER_STEPHEN, TX_DEM5_036);
else
showText(TX_SPEAKER_STEPHEN, TX_DEM5_039);
diff --git a/engines/startrek/rooms/demon6.cpp b/engines/startrek/rooms/demon6.cpp
new file mode 100644
index 0000000000..42bb66276f
--- /dev/null
+++ b/engines/startrek/rooms/demon6.cpp
@@ -0,0 +1,571 @@
+/* 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 "startrek/room.h"
+
+namespace StarTrek {
+
+void Room::demon6Tick1() {
+ playVoc("DEM6LOOP");
+ if (_vm->_awayMission.demon.gotBerries || (!_vm->_awayMission.demon.field3e && _vm->_awayMission.demon.field37)) {
+ loadActorAnim(8, "oldman", 0x5f, 0xb1, 0);
+ _roomVar.demon6.stephenInRoom = true;
+ }
+ loadActorAnim(10, "s0r6d2", 0xa0, 0x92, 0);
+ loadActorAnim(9, "scrnan", 0, 0xc7, 0);
+}
+
+void Room::demon6Tick30() {
+ if (!_vm->_awayMission.demon.gotBerries)
+ return;
+ if (_vm->_awayMission.demon.field3e)
+ return;
+ if (!_vm->_awayMission.demon.field37)
+ return;
+ if (_vm->_awayMission.demon.stephenWelcomedToStudy)
+ return;
+
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_042);
+ _vm->_awayMission.demon.stephenWelcomedToStudy = true;
+}
+
+void Room::demon6SpockReachedComputer() {
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_014);
+}
+
+void Room::demon6WalkToDoor() {
+ _vm->_awayMission.disableInput = true;
+ _roomVar.demon6.movingToDoor = true;
+ walkCrewman(OBJECT_KIRK, 0xa0, 0x94, 4);
+}
+
+void Room::demon6TouchedDoorOpenTrigger() {
+ if (!_roomVar.demon6.movingToDoor)
+ return;
+ loadActorAnim(10, "s0r6d1", 0xa0, 0x92, 2);
+ playSoundEffectIndex(5);
+}
+
+void Room::demon6DoorOpenedOrReachedDoor() {
+ _roomVar.demon6.doorCounter++;
+ if (_roomVar.demon6.doorCounter == 2)
+ loadRoomIndex(0, 2);
+}
+
+void Room::demon6UsePhaserOnStephen() {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_028);
+}
+
+void Room::demon6UsePhaserOnCase() {
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_017);
+}
+
+void Room::demon6LookAtWorkspace() {
+ showText(TX_DEM6N003);
+}
+
+void Room::demon6LookAtCase() {
+ showText(TX_DEM6N001);
+}
+
+void Room::demon6LookAtTable() {
+ showText(TX_DEM6N007);
+}
+
+void Room::demon6LookAtMineral() {
+ showText(TX_DEM6N016);
+}
+
+void Room::demon6LookAtShells() {
+ showText(TX_DEM6N011);
+}
+
+void Room::demon6LookAtSkull() {
+ showText(TX_DEM6N017);
+}
+
+void Room::demon6LookAtMetal() {
+ showText(TX_DEM6N005);
+}
+
+void Room::demon6LookAtMeteor() {
+ showText(TX_DEM6N000);
+}
+
+void Room::demon6LookAtMountain() {
+ showText(TX_DEM6N002);
+}
+
+void Room::demon6LookAtSynthesizer() {
+ showText(TX_DEM6N004);
+}
+
+void Room::demon6LookAtKirk() {
+ showText(TX_DEM6N008);
+}
+
+void Room::demon6LookAtSpock() {
+ showText(TX_DEM6N015);
+}
+
+void Room::demon6LookAtMccoy() {
+ showText(TX_DEM6N009);
+}
+
+void Room::demon6LookAtRedshirt() {
+ showText(TX_DEM6N010);
+}
+
+void Room::demon6LookAtComputer() {
+ showText(TX_DEM6N006);
+ if (!_vm->_awayMission.demon.lookedAtComputer) {
+ _vm->_awayMission.demon.lookedAtComputer = true;
+ _vm->_awayMission.missionScore++;
+ }
+}
+
+void Room::demon6LookAnywhere() {
+ showText(TX_DEM6N024);
+}
+
+void Room::demon6LookAtStephen() {
+ showText(TX_DEM6N021);
+}
+
+void Room::demon6TalkToMccoy() {
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_020);
+}
+
+void Room::demon6TalkToSpock() {
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_025);
+}
+
+void Room::demon6TalkToKirk() {
+ showText(TX_SPEAKER_KIRK, TX_DEM6_002);
+}
+
+void Room::demon6TalkToRedshirt() {
+ showText(TX_SPEAKER_EVERTS, TX_DEM6_053);
+}
+
+void Room::demon6TalkToStephen() {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_035);
+}
+
+void Room::demon6UseBerryOnStephen() {
+ if (_vm->_awayMission.demon.knowAboutHypoDytoxin) {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_027);
+ }
+ else {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_026);
+ }
+}
+
+void Room::demon6UseBerryOnSynthesizer() {
+ if (!_vm->_awayMission.demon.knowAboutHypoDytoxin)
+ return;
+ walkCrewman(OBJECT_MCCOY, 0x104, 0xa5, 1);
+}
+
+void Room::demon6MccoyReachedSynthesizer() {
+ loadActorAnim2(OBJECT_MCCOY, "musemn", -1, -1, 1);
+ playVoc("LD1REPLI");
+}
+
+void Room::demon6FinishedMakingHypoDytoxin() {
+ playMidiMusicTracks(-1, -1);
+ showText(TX_DEM6N023);
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_018);
+
+ giveItem(OBJECT_IDETOXIN);
+ _vm->_awayMission.demon.madeHypoDytoxin = true;
+ loseItem(OBJECT_IBERRY);
+
+ if (!_vm->_awayMission.demon.gavePointsForDytoxin) {
+ _vm->_awayMission.demon.gavePointsForDytoxin = true;
+ _vm->_awayMission.missionScore++;
+ }
+}
+
+void Room::demon6UseHandOnWorkspace() {
+ if (_vm->_awayMission.demon.repairedHand) {
+ showText(TX_SPEAKER_SPOCK, TX_DEM6N018); // FIXME
+ }
+ else {
+ _vm->_awayMission.disableInput = true;
+ showText(TX_SPEAKER_KIRK, TX_DEM6_005);
+ walkCrewman(OBJECT_SPOCK, 0xb3, 0xbb, 2);
+ }
+}
+
+void Room::demon6SpockReachedWorkspace() {
+ loadActorAnim(OBJECT_SPOCK, "spokop", 0xb3, 0xbb, 3);
+}
+
+void Room::demon6SpockFinishedRepairingHand() {
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_024);
+ _vm->_awayMission.demon.repairedHand = true;
+ _vm->_awayMission.missionScore += 2;
+ loadActorStandAnim(OBJECT_SPOCK);
+ _vm->_awayMission.disableInput = false;
+}
+
+// FIXME: doesn't work
+void Room::demon6UseAnythingOnWorkspace() {
+ showText(TX_DEM6N020);
+}
+
+void Room::demon6UseCrewmanOnCase() {
+ if (_roomVar.demon6.stephenInRoom) {
+ if (_roomVar.demon6.insultedStephenRecently)
+ return;
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_044);
+ int choices1[] = {TX_SPEAKER_KIRK, TX_DEM6_001, TX_DEM6_006, TX_DEM6_003, TX_BLANK};
+ int choice = showText(choices1);
+
+ if (choice == 0) {
+insult:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_030);
+ _roomVar.demon6.insultedStephenRecently = true;
+ _vm->_awayMission.demon.insultedStephen = true;
+ }
+ else if (choice == 1) {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_034);
+explain:
+ while (true) {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_051);
+ int choices2[] = {TX_SPEAKER_STEPHEN, TX_DEM6_045, TX_DEM6_046, TX_DEM6_047, TX_DEM6_048, TX_DEM6_049, TX_DEM6_050, TX_BLANK};
+ choice = showText(choices2);
+
+ switch (choice) {
+ case 0:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_040);
+ break;
+ case 1:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_033);
+ break;
+ case 2:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_036);
+ break;
+ case 3:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_038);
+ break;
+ case 4:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_039);
+ break;
+ case 5:
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_041);
+ _roomVar.demon6.caseOpened = true;
+ return;
+ default:
+ goto error;
+ }
+ }
+ }
+ else if (choice == 2) {
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_031);
+ int choices3[] = {TX_SPEAKER_KIRK, TX_DEM6_001, TX_DEM6_006, TX_BLANK};
+ choice = showText(choices3);
+
+ if (choice == 0)
+ goto insult;
+ else if (choice == 1)
+ goto explain;
+ else
+ goto error;
+ }
+ else {
+error:
+ showText(TX_DIALOG_ERROR);
+ }
+ }
+ else {
+ showText(TX_DEM6N012);
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_019);
+ }
+}
+
+void Room::demon6UseKirkOnComputer() {
+ showText(TX_SPEAKER_KIRK, TX_DEM6_004);
+ demon6UseSpockOnComputer();
+}
+
+void Room::demon6UseMccoyOnComputer() {
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_015);
+}
+
+void Room::demon6UseRedshirtOnComputer() {
+ showText(TX_SPEAKER_EVERTS, TX_DEM6_052);
+}
+
+void Room::demon6UseSpockOnComputer() {
+ walkCrewman(OBJECT_SPOCK, 0x3d, 0xc5, 3);
+}
+
+void Room::demon6UseMineralOnStephen() {
+ _vm->_awayMission.demon.itemsTakenFromCase &= ~8;
+ demon6ReturnItemToStephen(OBJECT_IMINERAL);
+}
+
+void Room::demon6UseShellsOnStephen() {
+ _vm->_awayMission.demon.itemsTakenFromCase &= ~2;
+ demon6ReturnItemToStephen(OBJECT_ISHELLS);
+}
+
+void Room::demon6UseMeteorOnStephen() {
+ _vm->_awayMission.demon.itemsTakenFromCase &= ~4;
+ demon6ReturnItemToStephen(OBJECT_IMETEOR);
+}
+
+void Room::demon6UseSkullOnStephen() {
+ _vm->_awayMission.demon.itemsTakenFromCase &= ~16;
+ demon6ReturnItemToStephen(OBJECT_ISKULL);
+}
+
+void Room::demon6UseMetalOnStephen() {
+ _vm->_awayMission.demon.itemsTakenFromCase &= ~1;
+ demon6ReturnItemToStephen(OBJECT_IMETAL);
+}
+
+void Room::demon6ReturnItemToStephen(int item) {
+ loseItem(item);
+ showText(TX_DEM6N019);
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_029);
+}
+
+void Room::demon6UseHandOnStephen() {
+ if (_vm->_awayMission.demon.repairedHand)
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_037);
+ else
+ showText(TX_SPEAKER_STEPHEN, TX_DEM6_043);
+}
+
+void Room::demon6UseMTricoderOnStephen() {
+ loadActorAnim2(OBJECT_MCCOY, "mscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_MCCOY, TX_DEM6_016);
+}
+
+void Room::demon6UseSTricoderOnTable() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_009);
+}
+
+void Room::demon6UseSTricoderOnComputer() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_007);
+}
+
+void Room::demon6UseSTricoderOnMineral() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_013);
+}
+
+void Room::demon6UseSTricoderOnShells() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_021);
+}
+
+void Room::demon6UseSTricoderOnSkull() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_012);
+}
+
+void Room::demon6UseSTricoderOnMetal() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_011);
+}
+
+void Room::demon6UseSTricoderOnMeteor() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_010);
+}
+
+void Room::demon6UseSTricoderOnCase() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_023);
+}
+
+void Room::demon6UseSTricoderOnSynthesizer() {
+ loadActorAnim2(OBJECT_SPOCK, "sscans", -1, -1, 0);
+ playSoundEffectIndex(4);
+ showText(TX_SPEAKER_SPOCK, TX_DEM6_008);
+}
+
+void Room::demon6GetCase() {
+ if (!_roomVar.demon6.caseOpened)
+ showText(TX_DEM6N022);
+ else
+ walkCrewman(OBJECT_KIRK, 0xff, 0xba, 5);
+}
+
+void Room::demon6KirkReachedCase() {
+ const int items[] = { OBJECT_IMETAL, OBJECT_ISHELLS, OBJECT_IMETEOR, OBJECT_IMINERAL, OBJECT_ISKULL };
+ byte ret = 0x1f ^ demon6ShowCase(_vm->_awayMission.demon.itemsTakenFromCase ^ 0x1f);
+ _vm->_awayMission.demon.itemsTakenFromCase = ret;
+
+ const int *i = items;
+ while (ret != 0) {
+ if (ret & 1)
+ giveItem(*i);
+ i++;
+ ret >>= 1;
+ }
+}
+
+int Room::demon6ShowCase(int visible) {
+ const Common::Point spritePositions[] = {
+ Common::Point(0x29, 0x80),
+ Common::Point(0x58, 0x7d),
+ Common::Point(0x82, 0x7d),
+ Common::Point(0xae, 0x79),
+ Common::Point(0xe1, 0x7d)
+ };
+
+ _vm->_gfx->fadeoutScreen();
+ _vm->_gfx->pushSprites();
+
+ _vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap("stlcase"));
+ _vm->_gfx->copyBackgroundScreen();
+ _vm->_gfx->clearPri();
+
+ Sprite sprites[5];
+
+ for (int i = 0; i < 5; i++) {
+ if (!(visible & (0x10 >> i)))
+ continue;
+ _vm->_gfx->addSprite(&sprites[i]);
+ sprites[i].pos.x = spritePositions[i].x;
+ sprites[i].pos.y = spritePositions[i].y;
+ sprites[i].drawPriority = 2;
+ sprites[i].bitmapChanged = true;
+ sprites[i].bitmap = _vm->_gfx->loadBitmap(Common::String::format("stlitem%d", i));
+ }
+
+ Sprite buttonSprite;
+ _vm->_gfx->addSprite(&buttonSprite);
+
+ // BUGFIX: use draw mode 2 so the entire button is clickable (not just non-transparent parts)
+ buttonSprite.drawMode = 2;
+
+ buttonSprite.pos.x = 0xe1;
+ buttonSprite.pos.y = 0x19;
+ buttonSprite.drawPriority = 2;
+ buttonSprite.bitmapChanged = true;
+ buttonSprite.bitmap = _vm->_gfx->loadBitmap("donebutt");
+
+ _vm->_gfx->forceDrawAllSprites();
+ _vm->_gfx->fadeinScreen();
+
+ bool exitLoop = false;
+
+ while (!exitLoop) {
+ TrekEvent event;
+ if (!_vm->popNextEvent(&event))
+ continue;
+
+ switch (event.type) {
+ case TREKEVENT_TICK:
+ _vm->_gfx->drawAllSprites();
+ break;
+
+ case TREKEVENT_LBUTTONDOWN: {
+lclick:
+ Sprite *clickedSprite = _vm->_gfx->getSpriteAt(_vm->_gfx->getMousePos());
+ if (clickedSprite == &buttonSprite)
+ exitLoop = true;
+ else if (clickedSprite != nullptr) {
+ while (clickedSprite->pos.y < SCREEN_HEIGHT) { // Move the selected item down and off the screen.
+ clickedSprite->drawPriority = 8;
+ clickedSprite->bitmapChanged = true;
+ _vm->_gfx->drawAllSprites();
+
+ // WORKAROUND: original game had no bound on how fast the items move
+ // off the screen. Here I bind it to the tick event.
+ // (This was probably the intended behaviour since the original game
+ // does check the clock cycle, but doesn't do a proper comparison with
+ // it.)
+ while (event.type != TREKEVENT_TICK) {
+ if (!_vm->popNextEvent(&event))
+ continue;
+ }
+ clickedSprite->pos.y++;
+ }
+
+ clickedSprite->dontDrawNextFrame();
+ _vm->_gfx->drawAllSprites();
+ _vm->_gfx->delSprite(clickedSprite);
+ clickedSprite->bitmap.reset();
+ int i = clickedSprite - sprites;
+ visible ^= (0x10 >> i);
+ }
+ break;
+ }
+
+ case TREKEVENT_RBUTTONDOWN:
+ exitLoop = true;
+ break;
+
+ case TREKEVENT_KEYDOWN:
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_ESCAPE:
+ exitLoop = true;
+ break;
+
+ case Common::KEYCODE_RETURN:
+ case Common::KEYCODE_KP_ENTER:
+ case Common::KEYCODE_F1:
+ goto lclick;
+
+ case Common::KEYCODE_F2:
+ exitLoop = true;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ _vm->_gfx->fadeoutScreen();
+ _vm->_gfx->popSprites();
+ _vm->_gfx->loadPri(_vm->_screenName);
+ _vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName));
+ _vm->_gfx->copyBackgroundScreen();
+ _vm->_gfx->forceDrawAllSprites();
+
+ return visible;
+}
+
+}
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index d0cbff81df..fc5f73a28b 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -399,6 +399,86 @@ RoomAction demon5ActionList[] = {
{ Action(ACTION_GET, 0x21, 0, 0), &Room::demon5GetCrate },
};
+RoomAction demon6ActionList[] = {
+ { Action(ACTION_TICK, 1, 0, 0), &Room::demon6Tick1 },
+ { Action(ACTION_TICK, 30, 0, 0), &Room::demon6Tick30 },
+ { Action(ACTION_FINISHED_WALKING, 3, 0, 0), &Room::demon6SpockReachedComputer },
+
+ { Action(ACTION_WALK, 0x26, 0, 0), &Room::demon6WalkToDoor },
+ { Action(ACTION_WALK, 10, 0, 0), &Room::demon6WalkToDoor },
+ { Action(ACTION_TOUCHED_HOTSPOT, 0, 0, 0), &Room::demon6TouchedDoorOpenTrigger },
+ { Action(ACTION_FINISHED_WALKING, 4, 0, 0), &Room::demon6DoorOpenedOrReachedDoor },
+ { Action(ACTION_FINISHED_ANIMATION, 2, 0, 0), &Room::demon6DoorOpenedOrReachedDoor },
+ { Action(ACTION_USE, OBJECT_IPHASERK, 8, 0), &Room::demon6UsePhaserOnStephen },
+ { Action(ACTION_USE, OBJECT_IPHASERS, 8, 0), &Room::demon6UsePhaserOnStephen },
+ { Action(ACTION_USE, OBJECT_IPHASERK, 0x20, 0), &Room::demon6UsePhaserOnCase },
+ { Action(ACTION_USE, OBJECT_IPHASERS, 0x20, 0), &Room::demon6UsePhaserOnCase },
+ { Action(ACTION_LOOK, 0x22, 0, 0), &Room::demon6LookAtWorkspace },
+ { Action(ACTION_LOOK, 0x20, 0, 0), &Room::demon6LookAtCase },
+ { Action(ACTION_LOOK, 0x25, 0, 0), &Room::demon6LookAtTable },
+ { Action(ACTION_LOOK, OBJECT_IMINERAL, 0, 0), &Room::demon6LookAtMineral },
+ { Action(ACTION_LOOK, OBJECT_ISHELLS, 0, 0), &Room::demon6LookAtShells },
+ { Action(ACTION_LOOK, OBJECT_ISKULL, 0, 0), &Room::demon6LookAtSkull },
+ { Action(ACTION_LOOK, OBJECT_IMETAL, 0, 0), &Room::demon6LookAtMetal },
+ { Action(ACTION_LOOK, OBJECT_IMETEOR, 0, 0), &Room::demon6LookAtMeteor },
+ { Action(ACTION_LOOK, 0x24, 0, 0), &Room::demon6LookAtMountain },
+ { Action(ACTION_LOOK, 0x23, 0, 0), &Room::demon6LookAtSynthesizer },
+ { Action(ACTION_LOOK, OBJECT_KIRK, 0, 0), &Room::demon6LookAtKirk },
+ { Action(ACTION_LOOK, OBJECT_SPOCK, 0, 0), &Room::demon6LookAtSpock },
+ { Action(ACTION_LOOK, OBJECT_MCCOY, 0, 0), &Room::demon6LookAtMccoy },
+ { Action(ACTION_LOOK, OBJECT_REDSHIRT, 0, 0), &Room::demon6LookAtRedshirt },
+ { Action(ACTION_LOOK, 0x21, 0, 0), &Room::demon6LookAtComputer },
+ { Action(ACTION_LOOK, 9, 0, 0), &Room::demon6LookAtComputer },
+ { Action(ACTION_LOOK, -1, 0, 0), &Room::demon6LookAnywhere },
+ { Action(ACTION_LOOK, 8, 0, 0), &Room::demon6LookAtStephen },
+
+ { Action(ACTION_TALK, OBJECT_MCCOY, 0, 0), &Room::demon6TalkToMccoy },
+ { Action(ACTION_TALK, OBJECT_SPOCK, 0, 0), &Room::demon6TalkToSpock },
+ { Action(ACTION_TALK, OBJECT_KIRK, 0, 0), &Room::demon6TalkToKirk },
+ { Action(ACTION_TALK, OBJECT_REDSHIRT, 0, 0), &Room::demon6TalkToRedshirt },
+ { Action(ACTION_TALK, 8, 0, 0), &Room::demon6TalkToStephen },
+ { Action(ACTION_USE, OBJECT_IBERRY, 8, 0), &Room::demon6UseBerryOnStephen },
+ { Action(ACTION_USE, OBJECT_IBERRY, 0x23, 0), &Room::demon6UseBerryOnSynthesizer },
+ { Action(ACTION_FINISHED_WALKING, 1, 0, 0), &Room::demon6MccoyReachedSynthesizer },
+ { Action(ACTION_FINISHED_ANIMATION, 1, 0, 0), &Room::demon6FinishedMakingHypoDytoxin },
+ { Action(ACTION_USE, OBJECT_IHAND, 0x22, 0), &Room::demon6UseHandOnWorkspace },
+ { Action(ACTION_FINISHED_WALKING, 2, 0, 0), &Room::demon6SpockReachedWorkspace },
+ { Action(ACTION_FINISHED_ANIMATION, 3, 0, 0), &Room::demon6SpockFinishedRepairingHand },
+ { Action(ACTION_USE, -1, 0x22, 0), &Room::demon6UseAnythingOnWorkspace },
+ { Action(ACTION_USE, OBJECT_KIRK, 0x20, 0), &Room::demon6UseCrewmanOnCase },
+ { Action(ACTION_USE, OBJECT_MCCOY, 0x20, 0), &Room::demon6UseCrewmanOnCase },
+ { Action(ACTION_USE, OBJECT_SPOCK, 0x20, 0), &Room::demon6UseCrewmanOnCase },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 0x20, 0), &Room::demon6UseCrewmanOnCase },
+
+ { Action(ACTION_USE, OBJECT_KIRK, 0x21, 0), &Room::demon6UseKirkOnComputer },
+ { Action(ACTION_USE, OBJECT_KIRK, 9, 0), &Room::demon6UseKirkOnComputer },
+ { Action(ACTION_USE, OBJECT_MCCOY, 0x21, 0), &Room::demon6UseMccoyOnComputer },
+ { Action(ACTION_USE, OBJECT_MCCOY, 9, 0), &Room::demon6UseMccoyOnComputer },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 0x21, 0), &Room::demon6UseRedshirtOnComputer },
+ { Action(ACTION_USE, OBJECT_REDSHIRT, 9, 0), &Room::demon6UseRedshirtOnComputer },
+ { Action(ACTION_USE, OBJECT_SPOCK, 0x21, 0), &Room::demon6UseSpockOnComputer },
+ { Action(ACTION_USE, OBJECT_SPOCK, 9, 0), &Room::demon6UseSpockOnComputer },
+ { Action(ACTION_USE, OBJECT_IMINERAL, 8, 0), &Room::demon6UseMineralOnStephen },
+ { Action(ACTION_USE, OBJECT_ISHELLS, 8, 0), &Room::demon6UseShellsOnStephen },
+ { Action(ACTION_USE, OBJECT_IMETEOR, 8, 0), &Room::demon6UseMeteorOnStephen },
+ { Action(ACTION_USE, OBJECT_ISKULL, 8, 0), &Room::demon6UseSkullOnStephen },
+ { Action(ACTION_USE, OBJECT_IMETAL, 8, 0), &Room::demon6UseMetalOnStephen },
+ { Action(ACTION_USE, OBJECT_IHAND, 8, 0), &Room::demon6UseHandOnStephen },
+ { Action(ACTION_USE, OBJECT_IMTRICOR, 8, 0), &Room::demon6UseMTricoderOnStephen },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x25, 0), &Room::demon6UseSTricoderOnTable },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 9, 0), &Room::demon6UseSTricoderOnComputer },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x21, 0), &Room::demon6UseSTricoderOnComputer },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMINERAL, 0), &Room::demon6UseSTricoderOnMineral },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISHELLS, 0), &Room::demon6UseSTricoderOnShells },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISKULL, 0), &Room::demon6UseSTricoderOnSkull },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETAL, 0), &Room::demon6UseSTricoderOnMetal },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETEOR, 0), &Room::demon6UseSTricoderOnMeteor },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x20, 0), &Room::demon6UseSTricoderOnCase },
+ { Action(ACTION_USE, OBJECT_ISTRICOR, 0x23, 0), &Room::demon6UseSTricoderOnSynthesizer },
+ { Action(ACTION_GET, 0x20, 0, 0), &Room::demon6GetCase },
+ { Action(ACTION_FINISHED_WALKING, 5, 0, 0), &Room::demon6KirkReachedCase },
+};
+
}
#endif
diff --git a/engines/startrek/text.h b/engines/startrek/text.h
index a8e75529c7..95b49a1cd2 100644
--- a/engines/startrek/text.h
+++ b/engines/startrek/text.h
@@ -28,6 +28,8 @@ namespace StarTrek {
enum GameStringIDs {
TX_NULL,
TX_BLANK,
+ TX_DIALOG_ERROR,
+
TX_SPEAKER_KIRK,
TX_SPEAKER_SPOCK,
TX_SPEAKER_MCCOY,
@@ -378,12 +380,94 @@ enum GameStringIDs {
TX_DEM5N013,
+ TX_DEM6_001,
+ TX_DEM6_002,
+ TX_DEM6_003,
+ TX_DEM6_004,
+ TX_DEM6_005,
+ TX_DEM6_006,
+ TX_DEM6_007,
+ TX_DEM6_008,
+ TX_DEM6_009,
+ TX_DEM6_010,
+ TX_DEM6_011,
+ TX_DEM6_012,
+ TX_DEM6_013,
+ TX_DEM6_014,
+ TX_DEM6_015,
+ TX_DEM6_016,
+ TX_DEM6_017,
+ TX_DEM6_018,
+ TX_DEM6_019,
+ TX_DEM6_020,
+ TX_DEM6_021,
+ TX_DEM6_022,
+ TX_DEM6_023,
+ TX_DEM6_024,
+ TX_DEM6_025,
+ TX_DEM6_026,
+ TX_DEM6_027,
+ TX_DEM6_028,
+ TX_DEM6_029,
+ TX_DEM6_030,
+ TX_DEM6_031,
+ TX_DEM6_032,
+ TX_DEM6_033,
+ TX_DEM6_034,
+ TX_DEM6_035,
+ TX_DEM6_036,
+ TX_DEM6_037,
+ TX_DEM6_038,
+ TX_DEM6_039,
+ TX_DEM6_040,
+ TX_DEM6_041,
+ TX_DEM6_042,
+ TX_DEM6_043,
+ TX_DEM6_044,
+ TX_DEM6_045,
+ TX_DEM6_046,
+ TX_DEM6_047,
+ TX_DEM6_048,
+ TX_DEM6_049,
+ TX_DEM6_050,
+ TX_DEM6_051,
+ TX_DEM6_052,
+ TX_DEM6_053,
+ TX_DEM6N000,
+ TX_DEM6N001,
+ TX_DEM6N002,
+ TX_DEM6N003,
+ TX_DEM6N004,
+ TX_DEM6N005,
+ TX_DEM6N006,
+ TX_DEM6N007,
+ TX_DEM6N008,
+ TX_DEM6N009,
+ TX_DEM6N010,
+ TX_DEM6N011,
+ TX_DEM6N012,
+ TX_DEM6N013,
+ TX_DEM6N014,
+ TX_DEM6N015,
+ TX_DEM6N016,
+ TX_DEM6N017,
+ TX_DEM6N018,
+ TX_DEM6N019,
+ TX_DEM6N020,
+ TX_DEM6N021,
+ TX_DEM6N022,
+ TX_DEM6N023,
+ TX_DEM6N024,
+
+
TX_END
};
const char * const g_gameStrings[] = {
nullptr,
"",
+ "There is a dialog error here.",
+
"Capt. Kirk",
"Mr. Spock",
"Dr. McCoy",
@@ -732,6 +816,86 @@ const char * const g_gameStrings[] = {
"#DEM5\\DEM5N011#He is too busy consoling the wounded man.",
"#DEM5\\DEM5N012#They are too heavy to move.",
"#DEM5\\DEM5N013#This man is in no condition to talk.",
+
+
+ "#DEM6\\DEM6_001#Looks like a pile of junk if you ask me.",
+ "#DEM6\\DEM6_002#Well, what happens next?",
+ "#DEM6\\DEM6_003#Where did you find all this?",
+ "#DEM6\\DEM6_004#Mr. Spock, See what you can dig up from that old fashioned computer terminal.",
+ "#DEM6\\DEM6_005#Mr. Spock, see what you can do about that hand.",
+ "#DEM6\\DEM6_006#Yes, tell us about these things.",
+ "#DEM6\\DEM6_007#A vintage 801286 of the mid-21st century. It is a fine museum piece.",
+ "#DEM6\\DEM6_008#Fascinating, Captain. It is an Ardak-4 molecular synthesizer. A museum piece in perfect working order.",
+ "#DEM6\\DEM6_009#Residue of several different compounds are in the tubes. None of the compounds would explain the sightings.",
+ "#DEM6\\DEM6_010#A completely ordinary nickel-iron meteorite.",
+ "#DEM6\\DEM6_011#A manufactured vanadium-tungsten alloy of considerable age and indeterminate use.",
+ "#DEM6\\DEM6_012#A sample of a local lifeform called a siloti, the largest animal reported on this planet. About the size of an Earth housecat, the silotis have an insectoid-reptilian genotype with praying mantis like forelimbs.",
+ "#DEM6\\DEM6_013#A variety of rock specimens, including native silver, azurite, crystalline forms of various minerals.",
+ "#DEM6\\DEM6_014#Captain, this appears to be a model of the Earth. Notice how it models the proper situation for a total eclipse?",
+ "#DEM6\\DEM6_015#Do I look like a pointy eared, green blooded, know-it-all alien?",
+ "#DEM6\\DEM6_016#He's in fine physical and mental condition, Jim.",
+ "#DEM6\\DEM6_017#Jim, that would destroy the glass case!",
+ "#DEM6\\DEM6_018#We've got to get this to brother Chub as quickly as possible, Jim!",
+ "#DEM6\\DEM6_019#I think we should wait and talk to the owner when he comes back, Jim.",
+ "#DEM6\\DEM6_020#This place looks real comfortable, a place to combine work and contemplation. The man's got an eye for the beauty of useful things, and the use of beautiful things. I think we could get along fine.",
+ "#DEM6\\DEM6_021#Fossil shells in limestone substrate, compatible with local geologic features.",
+ "#DEM6\\DEM6_022#I feel like this is delicate as surgery, Captain, but I've got it back in working order now.",
+ "#DEM6\\DEM6_023#I read a collection of small items of no evident value. I would characterize this as a small museum display, Captain.",
+ "#DEM6\\DEM6_024#This machinery is delicate but I have managed to repair the circuitry.",
+ "#DEM6\\DEM6_025#This study represents a man with a keen mind, Captain. To judge by what I see, there is little which does not interest him. The equipment is antiquated, but practical.",
+ "#DEM6\\DEM6_026#Fascinating, these berries can be used to synthesize Hypo-Dytoxin.",
+ "#DEM6\\DEM6_027#The settings on the Ardak-4 have already been adjusted. Simply place the berry in the machine and the Hypo-Dytoxin will be synthesized.",
+ "#DEM6\\DEM6_028#There is no need to threaten me if you need to use my study.",
+ "#DEM6\\DEM6_029#Bless you for returning my things.",
+ "#DEM6\\DEM6_030#Everything of this world is secondary to the perfection of the next, Captain.",
+ "#DEM6\\DEM6_031#Here and there. Much of it was brought to me by others exploring widely.",
+ "#DEM6\\DEM6_032#How interesting! Praise God for this opportunity. He brings me through you.",
+ "#DEM6\\DEM6_033#I believe this is evidence of the cataclysm which destroyed the moon of Pollux V eons past. I've constructed a theoretical model based on analysis of the planet's ring of what things might have been like. I think that the moon, like Earth's moon, would have made a total eclipse of the sun possible. I would have liked to have seen that, for conditions making a perfect total eclipse are rare in the Universe. Our God creates great wonders.",
+ "#DEM6\\DEM6_034#I enjoy talking about these treasures.",
+ "#DEM6\\DEM6_035#I never dreamed that Starfleet would be interested in my discoveries, Captain, but our God often surprises us.",
+ "#DEM6\\DEM6_036#One of the oldest forms I've seen on this planet. Our God makes beautiful things, indeed.",
+ "#DEM6\\DEM6_037#See how the fingertips have microsized sensors? I wonder what use they may have.",
+ "#DEM6\\DEM6_038#The skull of a modern siloti, the largest creature native to this planet, about the size of a housecat from Earth. The silotis combine a rather insectoid pattern with four-legged reptilian form including praying mantis-like forelimbs.",
+ "#DEM6\\DEM6_039#This chunk of rock is a greatly weathered example of a vanadium-tungsten alloy -- which doesn't occur naturally. It is my best evidence that the area was previously inhabited.",
+ "#DEM6\\DEM6_040#True curiosities, nothing more. I think they're very pretty, don't you?",
+ "#DEM6\\DEM6_041#Very well. I can't imagine why, but if you have a further interest in any of this, take what you like. But please remember to return my treasures when you are done with them.",
+ "#DEM6\\DEM6_042#Welcome to my study! Feel free to look around. My medical and scientific equipment is surely not so sophisticated as you are accustomed to, but if there is anything you wish to use, please feel free. Also, I would be interested in anything you might have to show me.",
+ "#DEM6\\DEM6_043#What a fascinating piece of equipment! Highly advanced technology. You see here, it seems to have been damaged, however. Take it to my workbench and let's see if it can be repaired. I fear my hands are too shaky to perform such fine work, but perhaps one of you can do it.",
+ "#DEM6\\DEM6_044#You are interested in my little museum of curiosities?",
+ "#DEM6\\DEM6_045#Mineral Specimens,",
+ "#DEM6\\DEM6_046#Meteorite,",
+ "#DEM6\\DEM6_047#Fossil Shells,",
+ "#DEM6\\DEM6_048#Skull of a small alien animal,",
+ "#DEM6\\DEM6_049#Twist of Metal,",
+ "#DEM6\\DEM6_050#or would you rather move on to something else?",
+ "#DEM6\\DEM6_051#Shall I go into...",
+ "#DEM6\\DEM6_052#I believe Mr. Spock would be more helpful with this, sir.",
+ "#DEM6\\DEM6_053#I wonder if any of this stuff might be useful.",
+ "#DEM6\\DEM6N000#A common-looking meteorite, about the size of a fist.",
+ "#DEM6\\DEM6N001#A glass-fronted display of mineral specimens including a meteorite, a few fossil shells, the skull of a cat-sized alien animal, and a very encrusted twist of metal.",
+ "#DEM6\\DEM6N002#A majestic view of Mt. Idyll can be seen through the skylight.",
+ "#DEM6\\DEM6N003#A multi-purpose work space, with fine, well-worn tools and equipment close at hand.",
+ "#DEM6\\DEM6N004#An antiquated molecular synthesizer sits in the corner.",
+ "#DEM6\\DEM6N005#An old corroded twist of metal.",
+ "#DEM6\\DEM6N006#An old-fashioned computer. It appears to have some type of simulation running.",
+ "#DEM6\\DEM6N007#Assorted pieces of glass rest on this table, from ancient beakers, to double burners.",
+ "#DEM6\\DEM6N008#Captain Kirk wonders what is going to happen on this mission.",
+ "#DEM6\\DEM6N009#Dr. McCoy is glad that he is in a warm, heated room.",
+ "#DEM6\\DEM6N010#Ensign Everts finds himself fascinated by the Acolytes and their planet.",
+ "#DEM6\\DEM6N011#Fossil shells of esthetic interest.",
+ "#DEM6\\DEM6N012#It is locked.",
+ "#DEM6\\DEM6N013#It opens.",
+ "#DEM6\\DEM6N014#It opens.",
+ "#DEM6\\DEM6N015#Mr. Spock finds the scientific equipment in this room to be rather primitive.",
+ "#DEM6\\DEM6N016#Pretty rock specimens.",
+ "#DEM6\\DEM6N017#The braincase of a small creature, looking slightly insectoid, somewhat reptilian.",
+ "#DEM6\\DEM6N018#The mechanism in the hand has already been repaired.",
+ "#DEM6\\DEM6N019#The old man carefully returns the items to his cabinet.",
+ "#DEM6\\DEM6N020#You tinker with it but do nothing significant.",
+ "#DEM6\\DEM6N021#Brother Stephen watches patiently as you examine his study.",
+ "#DEM6\\DEM6N022#The glass case is locked.",
+ "#DEM6\\DEM6N023#The machine synthesizes a quantity of Hypo-Dytoxin.",
+ "#DEM6\\DEM6N024#This appears to be a study and lab. The equipment looks very ancient.",
};
}