[Scummvm-git-logs] scummvm master -> de20df5ccc3e7b94e042d0fe9b645b0ae57833c0

bluegr bluegr at gmail.com
Fri Dec 18 23:51:11 UTC 2020


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
5e7b556310 STARTREK: Move room action arrays to their respective room
cf559249d5 STARTREK: Add a console command to show the score of all missions
8ff4da8980 StARTREK: Clean up bitmap file name for some animations
5f8675a07d STARTREK: Use Common::String in playTextAudio()
7d454f2221 STARTREK: Change action type to signed
b40f2f31dd STARTREK: Change activeAction to be signed
4a6828f305 STARTREK: Change type in addAction to be signed
de20df5ccc STARTREK: Add some planet data, and add mission performance sequences


Commit: 5e7b556310672055b831c7da42e7a465c5072ac0
    https://github.com/scummvm/scummvm/commit/5e7b556310672055b831c7da42e7a465c5072ac0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:38+02:00

Commit Message:
STARTREK: Move room action arrays to their respective room

All action arrays now end with a terminator entry. The array count has been removed.
Also, fixed a regression when changing missions in endMission().

Changed paths:
    engines/startrek/action.h
    engines/startrek/room.cpp
    engines/startrek/room.h
    engines/startrek/rooms/demon0.cpp
    engines/startrek/rooms/demon1.cpp
    engines/startrek/rooms/demon2.cpp
    engines/startrek/rooms/demon3.cpp
    engines/startrek/rooms/demon4.cpp
    engines/startrek/rooms/demon5.cpp
    engines/startrek/rooms/demon6.cpp
    engines/startrek/rooms/feather0.cpp
    engines/startrek/rooms/feather1.cpp
    engines/startrek/rooms/feather2.cpp
    engines/startrek/rooms/feather3.cpp
    engines/startrek/rooms/feather4.cpp
    engines/startrek/rooms/feather5.cpp
    engines/startrek/rooms/feather6.cpp
    engines/startrek/rooms/feather7.cpp
    engines/startrek/rooms/function_map.h
    engines/startrek/rooms/love0.cpp
    engines/startrek/rooms/love1.cpp
    engines/startrek/rooms/love2.cpp
    engines/startrek/rooms/love3.cpp
    engines/startrek/rooms/love4.cpp
    engines/startrek/rooms/love5.cpp
    engines/startrek/rooms/mudd0.cpp
    engines/startrek/rooms/mudd1.cpp
    engines/startrek/rooms/mudd2.cpp
    engines/startrek/rooms/mudd3.cpp
    engines/startrek/rooms/mudd4.cpp
    engines/startrek/rooms/mudd5.cpp
    engines/startrek/rooms/sins0.cpp
    engines/startrek/rooms/sins1.cpp
    engines/startrek/rooms/sins2.cpp
    engines/startrek/rooms/sins3.cpp
    engines/startrek/rooms/sins4.cpp
    engines/startrek/rooms/sins5.cpp
    engines/startrek/rooms/trial0.cpp
    engines/startrek/rooms/trial1.cpp
    engines/startrek/rooms/trial2.cpp
    engines/startrek/rooms/trial3.cpp
    engines/startrek/rooms/trial4.cpp
    engines/startrek/rooms/trial5.cpp
    engines/startrek/rooms/tug0.cpp
    engines/startrek/rooms/tug1.cpp
    engines/startrek/rooms/tug2.cpp
    engines/startrek/rooms/tug3.cpp
    engines/startrek/rooms/veng0.cpp
    engines/startrek/rooms/veng1.cpp
    engines/startrek/rooms/veng2.cpp
    engines/startrek/rooms/veng3.cpp
    engines/startrek/rooms/veng4.cpp
    engines/startrek/rooms/veng5.cpp
    engines/startrek/rooms/veng6.cpp
    engines/startrek/rooms/veng7.cpp
    engines/startrek/rooms/veng8.cpp


diff --git a/engines/startrek/action.h b/engines/startrek/action.h
index 73e81d9c6f..a550ee42c6 100644
--- a/engines/startrek/action.h
+++ b/engines/startrek/action.h
@@ -50,11 +50,13 @@ enum ActionTypes {
 	ACTION_FINISHED_ANIMATION = 10,
 	ACTION_FINISHED_WALKING = 12,
 
-	ACTION_OPTIONS = 13 // Not really an action, but selectable from action menu
+	ACTION_OPTIONS = 13, // Not really an action, but selectable from action menu
+
+	ACTION_LIST_END = -1
 };
 
 struct Action {
-	byte type;
+	char type;
 	byte b1;
 	byte b2;
 	byte b3;
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 96beca9bc5..eb453136b6 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -27,19 +27,9 @@
 
 #include "rooms/function_map.h"
 
-// TODO: Delete this macro, replacing it with the next one.
-// New "[roomName]NumActions" variables need to be made before that.
-#define ADD_ROOM_OLD(ROOM) {\
-		if (name.equalsIgnoreCase(#ROOM)) {\
-			_roomActionList = ROOM##ActionList;\
-			_numRoomActions = ARRAYSIZE(ROOM##ActionList);\
-		}\
-	}
-
 #define ADD_ROOM(ROOM) {\
 		if (name.equalsIgnoreCase(#ROOM)) {\
 			_roomActionList = ROOM##ActionList;\
-			_numRoomActions = ROOM##NumActions;\
 		}\
 	}
 
@@ -56,30 +46,30 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm), _awayMissi
 
 	_roomActionList = nullptr;
 
-	ADD_ROOM_OLD(demon0);
-	ADD_ROOM_OLD(demon1);
-	ADD_ROOM_OLD(demon2);
-	ADD_ROOM_OLD(demon3);
-	ADD_ROOM_OLD(demon4);
-	ADD_ROOM_OLD(demon5);
-	ADD_ROOM_OLD(demon6);
-	ADD_ROOM_OLD(tug0);
-	ADD_ROOM_OLD(tug1);
-	ADD_ROOM_OLD(tug2);
-	ADD_ROOM_OLD(tug3);
-	ADD_ROOM_OLD(love0);
-	ADD_ROOM_OLD(love1);
-	ADD_ROOM_OLD(love2);
-	ADD_ROOM_OLD(love3);
-	ADD_ROOM_OLD(love4);
-	ADD_ROOM_OLD(love5);
-	ADD_ROOM_OLD(mudd0);
-	ADD_ROOM_OLD(mudd1);
-	ADD_ROOM_OLD(mudd2);
-	ADD_ROOM_OLD(mudd3);
-	ADD_ROOM_OLD(mudd4);
-	ADD_ROOM_OLD(mudd5);
-	ADD_ROOM_OLD(feather0);
+	ADD_ROOM(demon0);
+	ADD_ROOM(demon1);
+	ADD_ROOM(demon2);
+	ADD_ROOM(demon3);
+	ADD_ROOM(demon4);
+	ADD_ROOM(demon5);
+	ADD_ROOM(demon6);
+	ADD_ROOM(tug0);
+	ADD_ROOM(tug1);
+	ADD_ROOM(tug2);
+	ADD_ROOM(tug3);
+	ADD_ROOM(love0);
+	ADD_ROOM(love1);
+	ADD_ROOM(love2);
+	ADD_ROOM(love3);
+	ADD_ROOM(love4);
+	ADD_ROOM(love5);
+	ADD_ROOM(mudd0);
+	ADD_ROOM(mudd1);
+	ADD_ROOM(mudd2);
+	ADD_ROOM(mudd3);
+	ADD_ROOM(mudd4);
+	ADD_ROOM(mudd5);
+	ADD_ROOM(feather0);
 	ADD_ROOM(feather1);
 	ADD_ROOM(feather2);
 	ADD_ROOM(feather3);
@@ -111,7 +101,6 @@ Room::Room(StarTrekEngine *vm, const Common::String &name) : _vm(vm), _awayMissi
 
 	if (_roomActionList == nullptr) {
 		warning("Room \"%s\" unimplemented", name.c_str());
-		_numRoomActions = 0;
 	}
 
 	bool isDemo = _vm->getFeatures() & GF_DEMO;
@@ -321,9 +310,8 @@ uint16 Room::readRdfWord(int offset) {
 
 bool Room::actionHasCode(const Action &action) {
 	const RoomAction *roomActionPtr = _roomActionList;
-	int n = _numRoomActions;
 
-	while (n-- > 0) {
+	while (roomActionPtr->action.type != ACTION_LIST_END) {
 		if (action == roomActionPtr->action)
 			return true;
 		roomActionPtr++;
@@ -338,9 +326,8 @@ bool Room::actionHasCode(byte type, byte b1, byte b2, byte b3) {
 
 bool Room::handleAction(const Action &action) {
 	const RoomAction *roomActionPtr = _roomActionList;
-	int n = _numRoomActions;
 
-	while (n-- > 0) {
+	while (roomActionPtr->action.type != ACTION_LIST_END) {
 		if (action == roomActionPtr->action) {
 			_vm->_awayMission.rdfStillDoDefaultAction = false;
 			(this->*(roomActionPtr->funcPtr))();
@@ -359,9 +346,8 @@ bool Room::handleAction(byte type, byte b1, byte b2, byte b3) {
 
 bool Room::handleActionWithBitmask(const Action &action) {
 	const RoomAction *roomActionPtr = _roomActionList;
-	int n = _numRoomActions;
 
-	while (n-- > 0) {
+	while (roomActionPtr->action.type != ACTION_LIST_END) {
 		uint32 bitmask = roomActionPtr->action.getBitmask();
 		if ((action.toUint32() & bitmask) == (roomActionPtr->action.toUint32() & bitmask)) {
 			_vm->_awayMission.rdfStillDoDefaultAction = false;
@@ -400,10 +386,12 @@ Common::Point Room::getSpawnPosition(int crewmanIndex) {
 // Creates a fatal error on failure.
 int Room::findFunctionPointer(int action, void (Room::*funcPtr)()) {
 	assert(action == ACTION_FINISHED_ANIMATION || action == ACTION_FINISHED_WALKING);
+	const RoomAction *roomActionPtr = _roomActionList;
 
-	for (int i = 0; i < _numRoomActions; i++) {
-		if (_roomActionList[i].action.type == action && _roomActionList[i].funcPtr == funcPtr)
-			return _roomActionList[i].action.b1;
+	while (roomActionPtr->action.type != ACTION_LIST_END) {
+		if (roomActionPtr->action.type == action && roomActionPtr->funcPtr == funcPtr)
+			return roomActionPtr->action.b1;
+		roomActionPtr++;
 	}
 
 	if (action == ACTION_FINISHED_ANIMATION)
@@ -683,6 +671,7 @@ void Room::endMission(int16 score, int16 arg1, int16 arg2) {
 	// TODO: This is a stopgap measure (loading the next away mission immediately).
 	// Replace this with the proper code later.
 	_vm->_gameMode = GAMEMODE_BEAMDOWN;
+	_vm->_roomIndexToLoad = 0;
 
 	const char *missionNames[] = {
 		"DEMON",
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 233a059ae9..617c522caa 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -169,7 +169,6 @@ private:
 	AwayMission *_awayMission;
 
 	const RoomAction *_roomActionList;
-	int _numRoomActions;
 
 	Common::HashMap<int, Common::String> _lookMessages;
 	Common::HashMap<int, Common::String> _lookWithTalkerMessages;
diff --git a/engines/startrek/rooms/demon0.cpp b/engines/startrek/rooms/demon0.cpp
index aa9a3fe57f..8fa1f06fc6 100644
--- a/engines/startrek/rooms/demon0.cpp
+++ b/engines/startrek/rooms/demon0.cpp
@@ -24,6 +24,64 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon0ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon0Tick1 },
+	{ {ACTION_TICK, 2, 0, 0}, &Room::demon0Tick2 },
+	{ {ACTION_TICK, 60, 0, 0}, &Room::demon0Tick60 },
+	{ {ACTION_TICK, 100, 0, 0}, &Room::demon0Tick100 },
+	{ {ACTION_TICK, 140, 0, 0}, &Room::demon0Tick140 },
+
+	{ {ACTION_TOUCHED_WARP, 0, 0, 0}, &Room::demon0TouchedWarp0 },
+
+	{ {ACTION_WALK, 0x27, 0, 0}, &Room::demon0WalkToBottomDoor },
+	{ {ACTION_WALK, 9, 0, 0}, &Room::demon0WalkToBottomDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::demon0TouchedHotspot1 },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon0ReachedBottomDoor },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon0ReachedBottomDoor },
+
+	{ {ACTION_WALK, 0x26, 0, 0}, &Room::demon0WalkToTopDoor },
+	{ {ACTION_WALK, 10, 0, 0}, &Room::demon0WalkToTopDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon0TouchedHotspot0 },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon0ReachedTopDoor },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon0ReachedTopDoor },
+
+	{ {ACTION_TALK, 8, 0, 0}, &Room::demon0TalkToPrelate },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon0LookAtPrelate },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x23, 0}, &Room::demon0UsePhaserOnSnow },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x23, 0}, &Room::demon0UsePhaserOnSnow },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x25, 0}, &Room::demon0UsePhaserOnSign },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x25, 0}, &Room::demon0UsePhaserOnSign },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::demon0UsePhaserOnShelter },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon0UsePhaserOnPrelate },
+
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon0LookAtSign },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon0LookAtTrees },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon0LookAtTrees },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon0LookAtSnow },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon0LookAnywhere },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon0LookAtBushes },
+
+	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::demon0LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::demon0LookAtMcCoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon0LookAtRedShirt },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::demon0LookAtSpock },
+
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon0LookAtShelter },    // Door 1
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon0LookAtShelter },   // Door 2
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon0LookAtShelter }, // Shelter itself
+
+	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::demon0TalkToKirk },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon0TalkToRedshirt },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::demon0TalkToMcCoy },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::demon0TalkToSpock },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon0UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::demon0UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon0UseMTricorderOnPrelate },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::demon0Tick1() {
 	playVoc("DEM0LOOP");
 	loadActorAnim(9, "s0r0d3", 252, 153, 0);
diff --git a/engines/startrek/rooms/demon1.cpp b/engines/startrek/rooms/demon1.cpp
index 0e64e6dff2..1c89e9bc5e 100644
--- a/engines/startrek/rooms/demon1.cpp
+++ b/engines/startrek/rooms/demon1.cpp
@@ -24,6 +24,92 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon1ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon1Tick1 },
+
+	{ {ACTION_WALK, 0x25, 0, 0}, &Room::demon1WalkToCave },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon1TouchedTopWarp },
+	{ {ACTION_TOUCHED_WARP, 0, 0, 0}, &Room::demon1TouchedTopWarp },
+	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::demon1TouchedBottomWarp },
+
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::demon1Timer2Expired },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon1Timer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon1Timer3Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon1Timer1Expired },
+
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon1KlingonFinishedAimingWeapon },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon1KirkShot },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::demon1UsePhaserOnAnything },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::demon1UsePhaserOnAnything },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon1UsePhaserOnKlingon1 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon1UsePhaserOnKlingon1 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon1ShootKlingon1 },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::demon1KlingonDropsHand },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::demon1UsePhaserOnKlingon2 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::demon1UsePhaserOnKlingon2 },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon1ShootKlingon2 },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::demon1UsePhaserOnKlingon3 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::demon1UsePhaserOnKlingon3 },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon1ShootKlingon3 },
+
+	{ {ACTION_TIMER_EXPIRED, 6, 0, 0}, &Room::demon1AllKlingonsDead },
+	{ {ACTION_TIMER_EXPIRED, 5, 0, 0}, &Room::demon1Timer5Expired },
+
+	{ {ACTION_USE, OBJECT_IMTRICOR, 13, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon1UseSTricorderOnTulips },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon1UseSTricorderOnPods },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon1UseSTricorderOnCattails },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon1UseSTricorderOnFerns },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 13, 0}, &Room::demon1UseSTricorderOnHand },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon1UseSTricorderOnKlingon1 },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 },
+	{ {ACTION_USE, OBJECT_IMEDKIT,  8, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 10, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::demon1UseMTricorderOnKlingon },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 }, // This is redundant
+
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::demon1UseMTricorderOnKirk },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::demon1UseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::demon1UseMTricorderOnRedshirt },
+
+	{ {ACTION_GET, 13, 0, 0}, &Room::demon1GetHand },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon1ReachedHand },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::demon1PickedUpHand },
+	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::demon1FinishedGettingHand },
+
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon1LookAtKlingon },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon1LookAtKlingon },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon1LookAtKlingon },
+
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon1LookAtCattails },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon1LookAtTulips },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon1LookAtPods },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon1LookAtFerns },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon1LookAtStream },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon1LookAtMine },
+	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::demon1LookAtMountain },
+	{ {ACTION_LOOK, 13, 0, 0}, &Room::demon1LookAtHand },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon1LookAnywhere },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon1LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon1LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon1LookAtMcCoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon1LookAtRedshirt },
+
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon1TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon1TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon1TalkToMcCoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon1TalkToRedshirt },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 // BUG: under certain circumstances, the klingons just stop firing?
 
 void Room::demon1Tick1() {
diff --git a/engines/startrek/rooms/demon2.cpp b/engines/startrek/rooms/demon2.cpp
index fbaca93cce..966ea1d89c 100644
--- a/engines/startrek/rooms/demon2.cpp
+++ b/engines/startrek/rooms/demon2.cpp
@@ -24,6 +24,49 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon2ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon2Tick1 },
+	{ {ACTION_WALK, 0x27, 0, 0}, &Room::demon2WalkToCave },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon2ReachedCave },
+	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::demon2TouchedWarp1 },
+
+	{ {ACTION_LOOK, 0x27, 0, 0}, &Room::demon2LookAtCave },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon2LookAtCave },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon2LookAtMountain },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon2LookAtMountain },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon2LookAtBerries },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon2LookAtFern },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon2LookAtMoss },
+	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::demon2LookAtLights },
+	{ {ACTION_LOOK, 0xff, 0, 0},   &Room::demon2LookAtAnything },
+
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon2LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon2LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon2LookAtMcCoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon2LookAtRedshirt },
+
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon2TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon2TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon2TalkToMcCoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon2TalkToRedshirt },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x23, 0}, &Room::demon2UsePhaserOnBerries },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x23, 0}, &Room::demon2UsePhaserOnBerries },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon2UseSTricorderOnBerries },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::demon2UseSTricorderOnMoss },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x24, 0}, &Room::demon2UseSTricorderOnFern },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon2UseSTricorderOnCave },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon2UseSTricorderOnCave },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon2UseSTricorderOnCave },
+
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x23, 0}, &Room::demon2UseMTricorderOnBerries },
+	{ {ACTION_GET, 0x23, 0, 0}, &Room::demon2GetBerries },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon2ReachedBerries },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon2PickedUpBerries },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::demon2Tick1() {
 	playVoc("DEM2LOOP");
 }
diff --git a/engines/startrek/rooms/demon3.cpp b/engines/startrek/rooms/demon3.cpp
index 9b8b34b3e6..11c270f3cb 100644
--- a/engines/startrek/rooms/demon3.cpp
+++ b/engines/startrek/rooms/demon3.cpp
@@ -24,6 +24,104 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon3ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon3Tick1 },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon3Timer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon3Timer1Expired },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon3Timer3Expired },
+
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon3FinishedAnimation1 },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon3FinishedAnimation2 },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon3FinishedWalking5 },
+
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon3McCoyInFiringPosition },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon3SpockInFiringPosition },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon3RedShirtInFiringPosition },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon3KirkInFiringPosition },
+
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon3FireAtBoulder },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_REDSHIRT, 0}, &Room::demon3UsePhaserOnRedshirt },
+	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_REDSHIRT, 0}, &Room::demon3UsePhaserOnRedshirt },
+
+	{ {ACTION_USE, OBJECT_IPHASERS,  9, 0}, &Room::demon3UseStunPhaserOnBoulder },
+	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::demon3UseStunPhaserOnBoulder },
+	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::demon3UseStunPhaserOnBoulder },
+	{ {ACTION_USE, OBJECT_IPHASERS, 12, 0}, &Room::demon3UseStunPhaserOnBoulder },
+
+	{ {ACTION_USE, OBJECT_IPHASERK,  9, 0}, &Room::demon3UsePhaserOnBoulder1 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::demon3UsePhaserOnBoulder2 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 11, 0}, &Room::demon3UsePhaserOnBoulder3 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 12, 0}, &Room::demon3UsePhaserOnBoulder4 },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 13, 0}, &Room::demon3UseSTricorderOnMiner },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon3UseSTricorderOnPanel },
+	{ {ACTION_USE, OBJECT_ISTRICOR,  9, 0}, &Room::demon3UseSTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon3UseSTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 11, 0}, &Room::demon3UseSTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::demon3UseSTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::demon3UseMTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon3UseMTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::demon3UseMTricorderOnBoulder },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 12, 0}, &Room::demon3UseMTricorderOnBoulder },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::demon3UseRedshirtOnPanel },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::demon3RedshirtReachedPanel },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon3RedshirtUsedPanel },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon3RedshirtElectrocuted },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon3UseSTricorderOnDoor },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon3UseSTricorderOnAnything },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 14, 0}, &Room::demon3UseMTricorderOnDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::demon3UseMTricorderOnDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::demon3UseMTricorderOnDoor },
+	{ {ACTION_USE, OBJECT_IPHASERS, 14, 0}, &Room::demon3UsePhaserOnDoor },
+	{ {ACTION_USE, OBJECT_IPHASERK, 14, 0}, &Room::demon3UsePhaserOnDoor },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::demon3UsePhaserOnDoor },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x21, 0}, &Room::demon3UsePhaserOnDoor },
+
+	{ {ACTION_USE, OBJECT_IHAND, 0x20, 0}, &Room::demon3UseHandOnPanel },
+	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::demon3KirkReachedHandPanel },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::demon3KirkUsedHandPanel },
+
+	{ {ACTION_USE, OBJECT_IMTRICOR, 13, 0}, &Room::demon3UseMTricorderOnMiner },
+	{ {ACTION_USE, OBJECT_MCCOY, 13, 0}, &Room::demon3UseMedkitOnMiner },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 13, 0}, &Room::demon3UseMedkitOnMiner },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::demon3McCoyReachedMiner },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::demon3McCoyFinishedHealingMiner },
+
+	{ {ACTION_GET, 13, 0, 0}, &Room::demon3GetMiner },
+	{ {ACTION_TALK, 13, 0, 0}, &Room::demon3TalkToMiner },
+
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon3TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon3TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon3TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon3TalkToRedshirt },
+
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon3LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon3LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon3LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon3LookAtRedshirt },
+
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon3LookAnywhere },
+	{ {ACTION_LOOK, 13, 0, 0}, &Room::demon3LookAtMiner },
+	{ {ACTION_LOOK,  9, 0, 0}, &Room::demon3LookAtBoulder1 },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon3LookAtBoulder2 },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::demon3LookAtBoulder3 },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::demon3LookAtBoulder4 },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon3LookAtStructure },
+	{ {ACTION_LOOK, 14, 0, 0}, &Room::demon3LookAtDoor },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon3LookAtDoor },
+	{ {ACTION_LOOK, 15, 0, 0}, &Room::demon3LookAtPanel },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon3LookAtPanel },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon3LookAtLight },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+
+};
+
 void Room::demon3Tick1() {
 	playVoc("DEM3LOOP");
 	loadActorAnim(8, "light", 0xab, 0x03, 0);
diff --git a/engines/startrek/rooms/demon4.cpp b/engines/startrek/rooms/demon4.cpp
index fe19f4d598..e3c8ea8610 100644
--- a/engines/startrek/rooms/demon4.cpp
+++ b/engines/startrek/rooms/demon4.cpp
@@ -25,6 +25,76 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon4ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon4Tick1 },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon4FinishedAnimation1 },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon4FinishedAnimation2 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon4FinishedAnimation3 },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon4Timer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon4Timer1Expired },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon4CrewmanReachedBeamoutPosition },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::demon4Timer2Expired },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon4Timer3Expired },
+	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::demon4Timer4Expired },
+	{ {ACTION_TIMER_EXPIRED, 5, 0, 0}, &Room::demon4Timer5Expired },
+	{ {ACTION_TIMER_EXPIRED, 6, 0, 0}, &Room::demon4Timer6Expired },
+
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon4UsePhaserOnNauian },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon4UsePhaserOnNauian },
+	{ {ACTION_USE, OBJECT_IMETAL, 0x22, 0}, &Room::demon4UseMetalOnSecurityEquipment },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon4KirkReachedSecurityEquipment },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon4KirkFinishedUsingSecurityEquipment },
+	{ {ACTION_USE, OBJECT_IMETAL, 8, 0}, &Room::demon4UseMetalOnNauian },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon4KirkReachedNauian },
+	{ {ACTION_USE, OBJECT_ISKULL, 8, 0}, &Room::demon4UseSkullOnNauian },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon4KirkReachedNauianWithSkull },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::demon4UsePhaserOnPanel },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::demon4UsePhaserOnPattern },
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::demon4UsePhaserOnMccoy },
+
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon4TalkToNauian },
+	{ {ACTION_TALK, 8, 0, 0}, &Room::demon4TalkToNauian },
+
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon4LookAtPattern },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon4LookAtAlien },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon4LookAnywhere },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon4LookAtSecurityEquipment },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon4LookAtFloor },
+
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon4LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon4LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon4LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon4LookAtRedshirt },
+
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon4LookAtChamber },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon4LookAtPanel },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::demon4UseKirkOnPanel },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::demon4UseSpockOnPanel },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::demon4UseMccoyOnPanel },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::demon4UseRedshirtOnPanel },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon4CrewmanReachedPanel },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon4TalkToKirk },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon4TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon4TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon4TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon4UseSTricorderOnChamber },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon4UseSTricorderOnPattern },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::demon4UseMTricorderOnPattern },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon4UseSTricorderOnPanel },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::demon4UseMTricorderOnPanel },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon4UseSTricorderOnAnything },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon4UseSTricorderOnAnything },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x23, 0}, &Room::demon4UseMTricorderOnAnything },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::demon4UseMTricorderOnAnything },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon4UseSTricorderOnNauian },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon4UseMTricorderOnNauian },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon4UseSTricorderOnSecurityEquipment },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::demon4UseMTricorderOnSecurityEquipment },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 // TODO: this room should have animations on computer terminals, but this isn't where
 // they're implemented. Could be related to ".BAN" files which rooms can load?
 
diff --git a/engines/startrek/rooms/demon5.cpp b/engines/startrek/rooms/demon5.cpp
index c1e900df0a..8f44a3f5c4 100644
--- a/engines/startrek/rooms/demon5.cpp
+++ b/engines/startrek/rooms/demon5.cpp
@@ -24,6 +24,62 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon5ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon5Tick1 },
+	{ {ACTION_WALK, 0x22, 0, 0}, &Room::demon5WalkToDoor },
+	{ {ACTION_WALK, 12, 0, 0}, &Room::demon5WalkToDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon5TouchedDoorOpenTrigger },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon5DoorOpenedOrReachedDoor },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon5DoorOpenedOrReachedDoor },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon5UseSTricorderOnCrate },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::demon5UsePhaserOnAnything },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::demon5UsePhaserOnAnything },
+
+	{ {ACTION_USE, OBJECT_IHAND, 11, 0}, &Room::demon5UseHandOnStephen },
+	{ {ACTION_USE, OBJECT_IBERRY, 11, 0}, &Room::demon5UseBerryOnStephen },
+	{ {ACTION_USE, OBJECT_IDETOXIN, 9, 0}, &Room::demon5UseHypoDytoxinOnChub },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon5MccoyReachedChub },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon5MccoyHealedChub },
+
+	{ {ACTION_USE, OBJECT_IDETOXIN, 0xff, 0}, &Room::demon5UseHypoDytoxinOnAnything },
+	{ {ACTION_USE, OBJECT_IBERRY, 9, 0}, &Room::demon5UseBerryOnChub },
+
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon5LookAtRoberts },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon5LookAtGrisnash },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::demon5LookAtStephen },
+
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon5LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon5LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon5LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon5LookAtRedshirt },
+
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon5LookAtMountain },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon5LookAtCrate },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon5LookAnywhere },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon5LookAtChub },
+
+	{ {ACTION_TALK, 8, 0, 0}, &Room::demon5TalkToRoberts },
+	{ {ACTION_TALK, 9, 0, 0}, &Room::demon5TalkToChub },
+	{ {ACTION_TALK, 10, 0, 0}, &Room::demon5TalkToGrisnash },
+	{ {ACTION_TALK, 11, 0, 0}, &Room::demon5TalkToStephen },
+
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon5TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon5TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon5TalkToRedshirt },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon5TalkToMccoy },
+
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon5UseMTricorderOnRoberts },
+	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::demon5UseMTricorderOnChub },
+	{ {ACTION_USE, OBJECT_MCCOY,    9, 0}, &Room::demon5UseMTricorderOnChub },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::demon5UseMTricorderOnChub },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon5UseMTricorderOnGrisnash },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::demon5UseMTricorderOnStephen },
+
+	{ {ACTION_GET, 0x21, 0, 0}, &Room::demon5GetCrate },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::demon5Tick1() {
 	playVoc("DEM5LOOP");
 
diff --git a/engines/startrek/rooms/demon6.cpp b/engines/startrek/rooms/demon6.cpp
index 22eaf3244b..3bebcb48de 100644
--- a/engines/startrek/rooms/demon6.cpp
+++ b/engines/startrek/rooms/demon6.cpp
@@ -25,6 +25,87 @@
 
 namespace StarTrek {
 
+extern const RoomAction demon6ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::demon6Tick1 },
+	{ {ACTION_TICK, 30, 0, 0}, &Room::demon6Tick30 },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon6SpockReachedComputer },
+
+	{ {ACTION_WALK, 0x26, 0, 0}, &Room::demon6WalkToDoor },
+	{ {ACTION_WALK, 10, 0, 0}, &Room::demon6WalkToDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon6TouchedDoorOpenTrigger },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon6DoorOpenedOrReachedDoor },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon6DoorOpenedOrReachedDoor },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon6UsePhaserOnStephen },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon6UsePhaserOnStephen },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::demon6UsePhaserOnCase },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::demon6UsePhaserOnCase },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon6LookAtWorkspace },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon6LookAtCase },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon6LookAtTable },
+	{ {ACTION_LOOK, OBJECT_IMINERAL, 0, 0}, &Room::demon6LookAtMineral },
+	{ {ACTION_LOOK, OBJECT_ISHELLS, 0, 0}, &Room::demon6LookAtShells },
+	{ {ACTION_LOOK, OBJECT_ISKULL, 0, 0}, &Room::demon6LookAtSkull },
+	{ {ACTION_LOOK, OBJECT_IMETAL, 0, 0}, &Room::demon6LookAtMetal },
+	{ {ACTION_LOOK, OBJECT_IMETEOR, 0, 0}, &Room::demon6LookAtMeteor },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon6LookAtMountain },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon6LookAtSynthesizer },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon6LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon6LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon6LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon6LookAtRedshirt },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon6LookAtComputer },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon6LookAtComputer },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon6LookAnywhere },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon6LookAtStephen },
+
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon6TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon6TalkToSpock },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon6TalkToKirk },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon6TalkToRedshirt },
+	{ {ACTION_TALK, 8, 0, 0}, &Room::demon6TalkToStephen },
+	{ {ACTION_USE, OBJECT_IBERRY, 8, 0}, &Room::demon6UseBerryOnStephen },
+	{ {ACTION_USE, OBJECT_IBERRY, 0x23, 0}, &Room::demon6UseBerryOnSynthesizer },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon6MccoyReachedSynthesizer },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon6FinishedMakingHypoDytoxin },
+	{ {ACTION_USE, OBJECT_IHAND, 0x22, 0}, &Room::demon6UseHandOnWorkspace },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon6SpockReachedWorkspace },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon6SpockFinishedRepairingHand },
+	{ {ACTION_USE, 0xff, 0x22, 0}, &Room::demon6UseAnythingOnWorkspace },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::demon6UseKirkOnComputer },
+	{ {ACTION_USE, OBJECT_KIRK, 9, 0}, &Room::demon6UseKirkOnComputer },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::demon6UseMccoyOnComputer },
+	{ {ACTION_USE, OBJECT_MCCOY, 9, 0}, &Room::demon6UseMccoyOnComputer },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::demon6UseRedshirtOnComputer },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 9, 0}, &Room::demon6UseRedshirtOnComputer },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::demon6UseSpockOnComputer },
+	{ {ACTION_USE, OBJECT_SPOCK, 9, 0}, &Room::demon6UseSpockOnComputer },
+	{ {ACTION_USE, OBJECT_IMINERAL, 8, 0}, &Room::demon6UseMineralOnStephen },
+	{ {ACTION_USE, OBJECT_ISHELLS, 8, 0}, &Room::demon6UseShellsOnStephen },
+	{ {ACTION_USE, OBJECT_IMETEOR, 8, 0}, &Room::demon6UseMeteorOnStephen },
+	{ {ACTION_USE, OBJECT_ISKULL, 8, 0}, &Room::demon6UseSkullOnStephen },
+	{ {ACTION_USE, OBJECT_IMETAL, 8, 0}, &Room::demon6UseMetalOnStephen },
+	{ {ACTION_USE, OBJECT_IHAND, 8, 0}, &Room::demon6UseHandOnStephen },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon6UseMTricoderOnStephen },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::demon6UseSTricoderOnTable },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::demon6UseSTricoderOnComputer },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon6UseSTricoderOnComputer },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMINERAL, 0}, &Room::demon6UseSTricoderOnMineral },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISHELLS, 0}, &Room::demon6UseSTricoderOnShells },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISKULL, 0}, &Room::demon6UseSTricoderOnSkull },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETAL, 0}, &Room::demon6UseSTricoderOnMetal },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETEOR, 0}, &Room::demon6UseSTricoderOnMeteor },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon6UseSTricoderOnCase },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon6UseSTricoderOnSynthesizer },
+	{ {ACTION_GET, 0x20, 0, 0}, &Room::demon6GetCase },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon6KirkReachedCase },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::demon6Tick1() {
 	playVoc("DEM6LOOP");
 	if (_awayMission->demon.gotBerries || (!_awayMission->demon.field3e && _awayMission->demon.field37)) {
diff --git a/engines/startrek/rooms/feather0.cpp b/engines/startrek/rooms/feather0.cpp
index 1c52850310..d728407d10 100644
--- a/engines/startrek/rooms/feather0.cpp
+++ b/engines/startrek/rooms/feather0.cpp
@@ -40,6 +40,44 @@
 
 namespace StarTrek {
 
+extern const RoomAction feather0ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0},  &Room::feather0Tick1 },
+	{ {ACTION_TICK, 60, 0, 0}, &Room::feather0Tick60 },
+	{ {ACTION_TALK, 8, 0, 0},  &Room::feather0TalkToQuetzecoatl },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0},                &Room::feather0Timer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},                &Room::feather0Timer1Expired },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8,            0}, &Room::feather0UsePhaserOnQuetzecoatl },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8,            0}, &Room::feather0UsePhaserOnQuetzecoatl },
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::feather0UsePhaserOnMccoy },
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::feather0UsePhaserOnMccoy },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff,          0}, &Room::feather0UseMedkit },
+	{ {ACTION_LOOK, 8,    0, 0}, &Room::feather0LookAtQuetzecoatl },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::feather0LookAtMoon },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::feather0LookAtLog },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::feather0LookAtHut },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::feather0LookAnywhere },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x27, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x28, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x29, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x2a, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x2b, 0, 0}, &Room::feather0LookAtEyes },
+	{ {ACTION_LOOK, 0x2c, 0, 0}, &Room::feather0LookAtTree },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::feather0LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::feather0LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::feather0LookAtRedshirt },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::feather0TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::feather0TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::feather0TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_ISTRICOR,  8, 0}, &Room::feather0UseSTricorderOnQuetzecoatl },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::feather0UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR,  8, 0}, &Room::feather0UseMTricorderOnQuetzecoatl },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::feather0Tick1() {
 	playVoc("FEA0LOOP");
 	loadActorAnim(OBJECT_QUETZECOATL, "s5r0qb", 0xbe, 0xa6);
diff --git a/engines/startrek/rooms/feather1.cpp b/engines/startrek/rooms/feather1.cpp
index 3dfae5e6b9..48fe677a24 100644
--- a/engines/startrek/rooms/feather1.cpp
+++ b/engines/startrek/rooms/feather1.cpp
@@ -139,11 +139,9 @@ extern const RoomAction feather1ActionList[] = {
 	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::feather1LookAtMccoy },
 	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::feather1LookAtRedshirt },
 	{ {ACTION_LOOK, OBJECT_LEFT_VINE, 0, 0}, &Room::feather1LookAtLeftVine },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather1NumActions = ARRAYSIZE(feather1ActionList);
-
-
 void Room::feather1Tick1() {
 	playVoc("FEA1LOOP");
 	playMidiMusicTracks(27);
diff --git a/engines/startrek/rooms/feather2.cpp b/engines/startrek/rooms/feather2.cpp
index cd829c4cfa..4f2753ba08 100644
--- a/engines/startrek/rooms/feather2.cpp
+++ b/engines/startrek/rooms/feather2.cpp
@@ -55,11 +55,9 @@ extern const RoomAction feather2ActionList[] = {
 	{ {ACTION_LOOK, OBJECT_SPOCK,      0, 0}, &Room::feather2LookAtSpock },
 	{ {ACTION_LOOK, OBJECT_MCCOY,      0, 0}, &Room::feather2LookAtMccoy },
 	{ {ACTION_LOOK, OBJECT_REDSHIRT,   0, 0}, &Room::feather2LookAtRedshirt },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather2NumActions = ARRAYSIZE(feather2ActionList);
-
-
 void Room::feather2Tick1() {
 	playVoc("FEA2LOOP");
 	playMidiMusicTracks(27);
diff --git a/engines/startrek/rooms/feather3.cpp b/engines/startrek/rooms/feather3.cpp
index 8ac18f8687..04d83c6b82 100644
--- a/engines/startrek/rooms/feather3.cpp
+++ b/engines/startrek/rooms/feather3.cpp
@@ -88,11 +88,9 @@ extern const RoomAction feather3ActionList[] = {
 	{ {ACTION_LOOK, HOTSPOT_LIGHT_2, 0, 0},              &Room::feather3LookAtLight },
 	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},                 &Room::feather3LookAtMccoy },
 	{ {ACTION_LOOK, OBJECT_KNIFE, 0, 0},                 &Room::feather3LookAtKnife },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather3NumActions = ARRAYSIZE(feather3ActionList);
-
-
 void Room::feather3Tick1() {
 	playVoc("FEA3LOOP");
 	playMidiMusicTracks(27);
diff --git a/engines/startrek/rooms/feather4.cpp b/engines/startrek/rooms/feather4.cpp
index 7b883032cd..9f80d3d34f 100644
--- a/engines/startrek/rooms/feather4.cpp
+++ b/engines/startrek/rooms/feather4.cpp
@@ -62,11 +62,9 @@ extern const RoomAction feather4ActionList[] = {
 	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0},     &Room::feather4LookAtSpock },
 	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},     &Room::feather4LookAtMccoy },
 	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0},  &Room::feather4LookAtRedshirt },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather4NumActions = ARRAYSIZE(feather4ActionList);
-
-
 void Room::feather4Tick1() {
 	playVoc("FEA4LOOP");
 	playMidiMusicTracks(27);
diff --git a/engines/startrek/rooms/feather5.cpp b/engines/startrek/rooms/feather5.cpp
index 1ce527a035..a7fabbd7c9 100644
--- a/engines/startrek/rooms/feather5.cpp
+++ b/engines/startrek/rooms/feather5.cpp
@@ -109,11 +109,9 @@ extern const RoomAction feather5ActionList[] = {
 	{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_WATER, 0},     &Room::feather5UseSTricorderOnWater },
 	{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_FERN, 0},      &Room::feather5UseSTricorderOnFern },
 	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},               &Room::feather5UseMedkitAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather5NumActions = ARRAYSIZE(feather5ActionList);
-
-
 void Room::feather5Tick1() {
 	playVoc("FEA5LOOP");
 	playMidiMusicTracks(29);
diff --git a/engines/startrek/rooms/feather6.cpp b/engines/startrek/rooms/feather6.cpp
index 65935be31c..ff05f415e3 100644
--- a/engines/startrek/rooms/feather6.cpp
+++ b/engines/startrek/rooms/feather6.cpp
@@ -96,11 +96,9 @@ extern const RoomAction feather6ActionList[] = {
 	// ENHANCEMENTs: Also add entries for OBJECT_STALACTITES, not just HOTSPOT_STALACTITES
 	{ {ACTION_LOOK, OBJECT_STALACTITES, 0, 0},              &Room::feather6LookAtStalactites },
 	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_STALACTITES, 0}, &Room::feather6UseSTricorderOnStalactites },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather6NumActions = ARRAYSIZE(feather6ActionList);
-
-
 void Room::feather6Tick1() {
 	playVoc("FEA6LOOP");
 	playMidiMusicTracks(27);
diff --git a/engines/startrek/rooms/feather7.cpp b/engines/startrek/rooms/feather7.cpp
index 21973d4906..d2d97ca3c2 100644
--- a/engines/startrek/rooms/feather7.cpp
+++ b/engines/startrek/rooms/feather7.cpp
@@ -35,11 +35,9 @@ extern const RoomAction feather7ActionList[] = {
 	{ {ACTION_DONE_ANIM, 4, 0, 0},  &Room::feather7QuetzecoatlReachedSeat },
 	{ {ACTION_DONE_ANIM, 1, 0, 0},  &Room::feather7KirkSatDown },
 	{ {ACTION_DONE_ANIM, 2, 0, 0},  &Room::feather7ReadyToBeamOut },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int feather7NumActions = ARRAYSIZE(feather7ActionList);
-
-
 void Room::feather7Tick1() {
 	playVoc("FEA7LOOP");
 	playMidiMusicTracks(33);
diff --git a/engines/startrek/rooms/function_map.h b/engines/startrek/rooms/function_map.h
index e3507bd26b..61f49c87d2 100644
--- a/engines/startrek/rooms/function_map.h
+++ b/engines/startrek/rooms/function_map.h
@@ -28,1777 +28,29 @@
 
 namespace StarTrek {
 
-RoomAction demon0ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon0Tick1 },
-	{ {ACTION_TICK, 2, 0, 0}, &Room::demon0Tick2 },
-	{ {ACTION_TICK, 60, 0, 0}, &Room::demon0Tick60 },
-	{ {ACTION_TICK, 100, 0, 0}, &Room::demon0Tick100 },
-	{ {ACTION_TICK, 140, 0, 0}, &Room::demon0Tick140 },
+extern const RoomAction demon0ActionList[], demon1ActionList[], demon2ActionList[], demon3ActionList[];
+extern const RoomAction demon4ActionList[], demon5ActionList[], demon6ActionList[];
 
-	{ {ACTION_TOUCHED_WARP, 0, 0, 0}, &Room::demon0TouchedWarp0 },
+extern const RoomAction tug0ActionList[], tug1ActionList[], tug2ActionList[], tug3ActionList[];
 
-	{ {ACTION_WALK, 0x27, 0, 0}, &Room::demon0WalkToBottomDoor },
-	{ {ACTION_WALK, 9, 0, 0}, &Room::demon0WalkToBottomDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::demon0TouchedHotspot1 },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon0ReachedBottomDoor },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon0ReachedBottomDoor },
+extern const RoomAction love0ActionList[], love1ActionList[], love2ActionList[], love3ActionList[];
+extern const RoomAction love4ActionList[], love5ActionList[];
 
-	{ {ACTION_WALK, 0x26, 0, 0}, &Room::demon0WalkToTopDoor },
-	{ {ACTION_WALK, 10, 0, 0}, &Room::demon0WalkToTopDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon0TouchedHotspot0 },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon0ReachedTopDoor },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon0ReachedTopDoor },
+extern const RoomAction mudd0ActionList[], mudd1ActionList[], mudd2ActionList[], mudd3ActionList[];
+extern const RoomAction mudd4ActionList[], mudd5ActionList[];
 
-	{ {ACTION_TALK, 8, 0, 0}, &Room::demon0TalkToPrelate },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon0LookAtPrelate },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x23, 0}, &Room::demon0UsePhaserOnSnow },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x23, 0}, &Room::demon0UsePhaserOnSnow },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x25, 0}, &Room::demon0UsePhaserOnSign },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x25, 0}, &Room::demon0UsePhaserOnSign },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::demon0UsePhaserOnShelter },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon0UsePhaserOnPrelate },
-
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon0LookAtSign },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon0LookAtTrees },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon0LookAtTrees },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon0LookAtSnow },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon0LookAnywhere },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon0LookAtBushes },
-
-	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::demon0LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::demon0LookAtMcCoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon0LookAtRedShirt },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::demon0LookAtSpock },
-
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon0LookAtShelter },    // Door 1
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon0LookAtShelter },   // Door 2
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon0LookAtShelter }, // Shelter itself
-
-	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::demon0TalkToKirk },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon0TalkToRedshirt },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::demon0TalkToMcCoy },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::demon0TalkToSpock },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon0UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::demon0UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon0UseMTricorderOnPrelate },
-};
-
-RoomAction demon1ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon1Tick1 },
-
-	{ {ACTION_WALK, 0x25, 0, 0}, &Room::demon1WalkToCave },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon1TouchedTopWarp },
-	{ {ACTION_TOUCHED_WARP, 0, 0, 0}, &Room::demon1TouchedTopWarp },
-	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::demon1TouchedBottomWarp },
-
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::demon1Timer2Expired },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon1Timer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon1Timer3Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon1Timer1Expired },
-
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon1KlingonFinishedAimingWeapon },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon1KirkShot },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::demon1UsePhaserOnAnything },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::demon1UsePhaserOnAnything },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon1UsePhaserOnKlingon1 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon1UsePhaserOnKlingon1 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon1ShootKlingon1 },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::demon1KlingonDropsHand },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::demon1UsePhaserOnKlingon2 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::demon1UsePhaserOnKlingon2 },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon1ShootKlingon2 },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::demon1UsePhaserOnKlingon3 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::demon1UsePhaserOnKlingon3 },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon1ShootKlingon3 },
-
-	{ {ACTION_TIMER_EXPIRED, 6, 0, 0}, &Room::demon1AllKlingonsDead },
-	{ {ACTION_TIMER_EXPIRED, 5, 0, 0}, &Room::demon1Timer5Expired },
-
-	{ {ACTION_USE, OBJECT_IMTRICOR, 13, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon1UseSTricorderOnTulips },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon1UseSTricorderOnPods },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon1UseSTricorderOnCattails },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon1UseSTricorderOnFerns },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 13, 0}, &Room::demon1UseSTricorderOnHand },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon1UseSTricorderOnKlingon1 },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 },
-	{ {ACTION_USE, OBJECT_IMEDKIT,  8, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 10, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::demon1UseMTricorderOnKlingon },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon1UseSTricorderOnKlingon2Or3 }, // This is redundant
-
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::demon1UseMTricorderOnKirk },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::demon1UseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::demon1UseMTricorderOnRedshirt },
-
-	{ {ACTION_GET, 13, 0, 0}, &Room::demon1GetHand },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon1ReachedHand },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::demon1PickedUpHand },
-	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::demon1FinishedGettingHand },
-
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon1LookAtKlingon },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon1LookAtKlingon },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon1LookAtKlingon },
-
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon1LookAtCattails },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon1LookAtTulips },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon1LookAtPods },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon1LookAtFerns },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon1LookAtStream },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon1LookAtMine },
-	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::demon1LookAtMountain },
-	{ {ACTION_LOOK, 13, 0, 0}, &Room::demon1LookAtHand },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon1LookAnywhere },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon1LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon1LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon1LookAtMcCoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon1LookAtRedshirt },
-
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon1TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon1TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon1TalkToMcCoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon1TalkToRedshirt },
-};
-
-RoomAction demon2ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon2Tick1 },
-	{ {ACTION_WALK, 0x27, 0, 0}, &Room::demon2WalkToCave },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon2ReachedCave },
-	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::demon2TouchedWarp1 },
-
-	{ {ACTION_LOOK, 0x27, 0, 0}, &Room::demon2LookAtCave },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon2LookAtCave },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon2LookAtMountain },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon2LookAtMountain },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon2LookAtBerries },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon2LookAtFern },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon2LookAtMoss },
-	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::demon2LookAtLights },
-	{ {ACTION_LOOK, 0xff, 0, 0},   &Room::demon2LookAtAnything },
-
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon2LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon2LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon2LookAtMcCoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon2LookAtRedshirt },
-
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon2TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon2TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon2TalkToMcCoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon2TalkToRedshirt },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x23, 0}, &Room::demon2UsePhaserOnBerries },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x23, 0}, &Room::demon2UsePhaserOnBerries },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon2UseSTricorderOnBerries },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::demon2UseSTricorderOnMoss },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x24, 0}, &Room::demon2UseSTricorderOnFern },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon2UseSTricorderOnCave },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon2UseSTricorderOnCave },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon2UseSTricorderOnCave },
-
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x23, 0}, &Room::demon2UseMTricorderOnBerries },
-	{ {ACTION_GET, 0x23, 0, 0}, &Room::demon2GetBerries },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon2ReachedBerries },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon2PickedUpBerries },
-};
-
-RoomAction demon3ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon3Tick1 },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon3Timer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon3Timer1Expired },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon3Timer3Expired },
-
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon3FinishedAnimation1 },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon3FinishedAnimation2 },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon3FinishedWalking5 },
-
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon3McCoyInFiringPosition },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon3SpockInFiringPosition },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon3RedShirtInFiringPosition },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon3KirkInFiringPosition },
-
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon3FireAtBoulder },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_REDSHIRT, 0}, &Room::demon3UsePhaserOnRedshirt },
-	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_REDSHIRT, 0}, &Room::demon3UsePhaserOnRedshirt },
-
-	{ {ACTION_USE, OBJECT_IPHASERS,  9, 0}, &Room::demon3UseStunPhaserOnBoulder },
-	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::demon3UseStunPhaserOnBoulder },
-	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::demon3UseStunPhaserOnBoulder },
-	{ {ACTION_USE, OBJECT_IPHASERS, 12, 0}, &Room::demon3UseStunPhaserOnBoulder },
-
-	{ {ACTION_USE, OBJECT_IPHASERK,  9, 0}, &Room::demon3UsePhaserOnBoulder1 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::demon3UsePhaserOnBoulder2 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 11, 0}, &Room::demon3UsePhaserOnBoulder3 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 12, 0}, &Room::demon3UsePhaserOnBoulder4 },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 13, 0}, &Room::demon3UseSTricorderOnMiner },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon3UseSTricorderOnPanel },
-	{ {ACTION_USE, OBJECT_ISTRICOR,  9, 0}, &Room::demon3UseSTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon3UseSTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 11, 0}, &Room::demon3UseSTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::demon3UseSTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::demon3UseMTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon3UseMTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::demon3UseMTricorderOnBoulder },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 12, 0}, &Room::demon3UseMTricorderOnBoulder },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::demon3UseCrewmanOnPanel },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::demon3UseRedshirtOnPanel },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::demon3RedshirtReachedPanel },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon3RedshirtUsedPanel },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon3RedshirtElectrocuted },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon3UseSTricorderOnDoor },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon3UseSTricorderOnAnything },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 14, 0}, &Room::demon3UseMTricorderOnDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::demon3UseMTricorderOnDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::demon3UseMTricorderOnDoor },
-	{ {ACTION_USE, OBJECT_IPHASERS, 14, 0}, &Room::demon3UsePhaserOnDoor },
-	{ {ACTION_USE, OBJECT_IPHASERK, 14, 0}, &Room::demon3UsePhaserOnDoor },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::demon3UsePhaserOnDoor },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x21, 0}, &Room::demon3UsePhaserOnDoor },
-
-	{ {ACTION_USE, OBJECT_IHAND, 0x20, 0}, &Room::demon3UseHandOnPanel },
-	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::demon3KirkReachedHandPanel },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::demon3KirkUsedHandPanel },
-
-	{ {ACTION_USE, OBJECT_IMTRICOR, 13, 0}, &Room::demon3UseMTricorderOnMiner },
-	{ {ACTION_USE, OBJECT_MCCOY, 13, 0}, &Room::demon3UseMedkitOnMiner },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 13, 0}, &Room::demon3UseMedkitOnMiner },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::demon3McCoyReachedMiner },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::demon3McCoyFinishedHealingMiner },
-
-	{ {ACTION_GET, 13, 0, 0}, &Room::demon3GetMiner },
-	{ {ACTION_TALK, 13, 0, 0}, &Room::demon3TalkToMiner },
-
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon3TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon3TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon3TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon3TalkToRedshirt },
-
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon3LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon3LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon3LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon3LookAtRedshirt },
-
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon3LookAnywhere },
-	{ {ACTION_LOOK, 13, 0, 0}, &Room::demon3LookAtMiner },
-	{ {ACTION_LOOK,  9, 0, 0}, &Room::demon3LookAtBoulder1 },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon3LookAtBoulder2 },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::demon3LookAtBoulder3 },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::demon3LookAtBoulder4 },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon3LookAtStructure },
-	{ {ACTION_LOOK, 14, 0, 0}, &Room::demon3LookAtDoor },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon3LookAtDoor },
-	{ {ACTION_LOOK, 15, 0, 0}, &Room::demon3LookAtPanel },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon3LookAtPanel },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon3LookAtLight },
-
-};
-
-RoomAction demon4ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon4Tick1 },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon4FinishedAnimation1 },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon4FinishedAnimation2 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon4FinishedAnimation3 },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::demon4Timer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::demon4Timer1Expired },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon4CrewmanReachedBeamoutPosition },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::demon4Timer2Expired },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::demon4Timer3Expired },
-	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::demon4Timer4Expired },
-	{ {ACTION_TIMER_EXPIRED, 5, 0, 0}, &Room::demon4Timer5Expired },
-	{ {ACTION_TIMER_EXPIRED, 6, 0, 0}, &Room::demon4Timer6Expired },
-
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon4UsePhaserOnNauian },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon4UsePhaserOnNauian },
-	{ {ACTION_USE, OBJECT_IMETAL, 0x22, 0}, &Room::demon4UseMetalOnSecurityEquipment },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon4KirkReachedSecurityEquipment },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::demon4KirkFinishedUsingSecurityEquipment },
-	{ {ACTION_USE, OBJECT_IMETAL, 8, 0}, &Room::demon4UseMetalOnNauian },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon4KirkReachedNauian },
-	{ {ACTION_USE, OBJECT_ISKULL, 8, 0}, &Room::demon4UseSkullOnNauian },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon4KirkReachedNauianWithSkull },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::demon4UsePhaserOnPanel },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::demon4UsePhaserOnPattern },
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::demon4UsePhaserOnMccoy },
-
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::demon4TalkToNauian },
-	{ {ACTION_TALK, 8, 0, 0}, &Room::demon4TalkToNauian },
-
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon4LookAtPattern },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon4LookAtAlien },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon4LookAnywhere },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon4LookAtSecurityEquipment },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon4LookAtFloor },
-
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon4LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon4LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon4LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon4LookAtRedshirt },
-
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon4LookAtChamber },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon4LookAtPanel },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::demon4UseKirkOnPanel },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::demon4UseSpockOnPanel },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::demon4UseMccoyOnPanel },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::demon4UseRedshirtOnPanel },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon4CrewmanReachedPanel },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon4TalkToKirk },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon4TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon4TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon4TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0}, &Room::demon4UseSTricorderOnChamber },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon4UseSTricorderOnPattern },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::demon4UseMTricorderOnPattern },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon4UseSTricorderOnPanel },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::demon4UseMTricorderOnPanel },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon4UseSTricorderOnAnything },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::demon4UseSTricorderOnAnything },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x23, 0}, &Room::demon4UseMTricorderOnAnything },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::demon4UseMTricorderOnAnything },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::demon4UseSTricorderOnNauian },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon4UseMTricorderOnNauian },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::demon4UseSTricorderOnSecurityEquipment },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::demon4UseMTricorderOnSecurityEquipment },
-};
-
-RoomAction demon5ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon5Tick1 },
-	{ {ACTION_WALK, 0x22, 0, 0}, &Room::demon5WalkToDoor },
-	{ {ACTION_WALK, 12, 0, 0}, &Room::demon5WalkToDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon5TouchedDoorOpenTrigger },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon5DoorOpenedOrReachedDoor },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon5DoorOpenedOrReachedDoor },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon5UseSTricorderOnCrate },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::demon5UsePhaserOnAnything },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::demon5UsePhaserOnAnything },
-
-	{ {ACTION_USE, OBJECT_IHAND, 11, 0}, &Room::demon5UseHandOnStephen },
-	{ {ACTION_USE, OBJECT_IBERRY, 11, 0}, &Room::demon5UseBerryOnStephen },
-	{ {ACTION_USE, OBJECT_IDETOXIN, 9, 0}, &Room::demon5UseHypoDytoxinOnChub },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon5MccoyReachedChub },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon5MccoyHealedChub },
-
-	{ {ACTION_USE, OBJECT_IDETOXIN, 0xff, 0}, &Room::demon5UseHypoDytoxinOnAnything },
-	{ {ACTION_USE, OBJECT_IBERRY, 9, 0}, &Room::demon5UseBerryOnChub },
-
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon5LookAtRoberts },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::demon5LookAtGrisnash },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::demon5LookAtStephen },
-
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon5LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon5LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon5LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon5LookAtRedshirt },
-
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon5LookAtMountain },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon5LookAtCrate },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon5LookAnywhere },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon5LookAtChub },
-
-	{ {ACTION_TALK, 8, 0, 0}, &Room::demon5TalkToRoberts },
-	{ {ACTION_TALK, 9, 0, 0}, &Room::demon5TalkToChub },
-	{ {ACTION_TALK, 10, 0, 0}, &Room::demon5TalkToGrisnash },
-	{ {ACTION_TALK, 11, 0, 0}, &Room::demon5TalkToStephen },
-
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon5TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon5TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon5TalkToRedshirt },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon5TalkToMccoy },
-
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon5UseMTricorderOnRoberts },
-	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::demon5UseMTricorderOnChub },
-	{ {ACTION_USE, OBJECT_MCCOY,    9, 0}, &Room::demon5UseMTricorderOnChub },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::demon5UseMTricorderOnChub },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::demon5UseMTricorderOnGrisnash },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::demon5UseMTricorderOnStephen },
-
-	{ {ACTION_GET, 0x21, 0, 0}, &Room::demon5GetCrate },
-};
-
-RoomAction demon6ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::demon6Tick1 },
-	{ {ACTION_TICK, 30, 0, 0}, &Room::demon6Tick30 },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::demon6SpockReachedComputer },
-
-	{ {ACTION_WALK, 0x26, 0, 0}, &Room::demon6WalkToDoor },
-	{ {ACTION_WALK, 10, 0, 0}, &Room::demon6WalkToDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::demon6TouchedDoorOpenTrigger },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::demon6DoorOpenedOrReachedDoor },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::demon6DoorOpenedOrReachedDoor },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::demon6UsePhaserOnStephen },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::demon6UsePhaserOnStephen },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::demon6UsePhaserOnCase },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::demon6UsePhaserOnCase },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::demon6LookAtWorkspace },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::demon6LookAtCase },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::demon6LookAtTable },
-	{ {ACTION_LOOK, OBJECT_IMINERAL, 0, 0}, &Room::demon6LookAtMineral },
-	{ {ACTION_LOOK, OBJECT_ISHELLS, 0, 0}, &Room::demon6LookAtShells },
-	{ {ACTION_LOOK, OBJECT_ISKULL, 0, 0}, &Room::demon6LookAtSkull },
-	{ {ACTION_LOOK, OBJECT_IMETAL, 0, 0}, &Room::demon6LookAtMetal },
-	{ {ACTION_LOOK, OBJECT_IMETEOR, 0, 0}, &Room::demon6LookAtMeteor },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::demon6LookAtMountain },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::demon6LookAtSynthesizer },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::demon6LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::demon6LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::demon6LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::demon6LookAtRedshirt },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::demon6LookAtComputer },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::demon6LookAtComputer },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::demon6LookAnywhere },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::demon6LookAtStephen },
-
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::demon6TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::demon6TalkToSpock },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::demon6TalkToKirk },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::demon6TalkToRedshirt },
-	{ {ACTION_TALK, 8, 0, 0}, &Room::demon6TalkToStephen },
-	{ {ACTION_USE, OBJECT_IBERRY, 8, 0}, &Room::demon6UseBerryOnStephen },
-	{ {ACTION_USE, OBJECT_IBERRY, 0x23, 0}, &Room::demon6UseBerryOnSynthesizer },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::demon6MccoyReachedSynthesizer },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::demon6FinishedMakingHypoDytoxin },
-	{ {ACTION_USE, OBJECT_IHAND, 0x22, 0}, &Room::demon6UseHandOnWorkspace },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::demon6SpockReachedWorkspace },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::demon6SpockFinishedRepairingHand },
-	{ {ACTION_USE, 0xff, 0x22, 0}, &Room::demon6UseAnythingOnWorkspace },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::demon6UseCrewmanOnCase },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::demon6UseKirkOnComputer },
-	{ {ACTION_USE, OBJECT_KIRK, 9, 0}, &Room::demon6UseKirkOnComputer },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::demon6UseMccoyOnComputer },
-	{ {ACTION_USE, OBJECT_MCCOY, 9, 0}, &Room::demon6UseMccoyOnComputer },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::demon6UseRedshirtOnComputer },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 9, 0}, &Room::demon6UseRedshirtOnComputer },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::demon6UseSpockOnComputer },
-	{ {ACTION_USE, OBJECT_SPOCK, 9, 0}, &Room::demon6UseSpockOnComputer },
-	{ {ACTION_USE, OBJECT_IMINERAL, 8, 0}, &Room::demon6UseMineralOnStephen },
-	{ {ACTION_USE, OBJECT_ISHELLS, 8, 0}, &Room::demon6UseShellsOnStephen },
-	{ {ACTION_USE, OBJECT_IMETEOR, 8, 0}, &Room::demon6UseMeteorOnStephen },
-	{ {ACTION_USE, OBJECT_ISKULL, 8, 0}, &Room::demon6UseSkullOnStephen },
-	{ {ACTION_USE, OBJECT_IMETAL, 8, 0}, &Room::demon6UseMetalOnStephen },
-	{ {ACTION_USE, OBJECT_IHAND, 8, 0}, &Room::demon6UseHandOnStephen },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::demon6UseMTricoderOnStephen },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::demon6UseSTricoderOnTable },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::demon6UseSTricoderOnComputer },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::demon6UseSTricoderOnComputer },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMINERAL, 0}, &Room::demon6UseSTricoderOnMineral },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISHELLS, 0}, &Room::demon6UseSTricoderOnShells },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_ISKULL, 0}, &Room::demon6UseSTricoderOnSkull },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETAL, 0}, &Room::demon6UseSTricoderOnMetal },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMETEOR, 0}, &Room::demon6UseSTricoderOnMeteor },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::demon6UseSTricoderOnCase },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::demon6UseSTricoderOnSynthesizer },
-	{ {ACTION_GET, 0x20, 0, 0}, &Room::demon6GetCase },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::demon6KirkReachedCase },
-};
-
-
-RoomAction tug0ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::tug0Tick1 },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug0LookAtEngineer },
-	{ {ACTION_GET, 8, 0, 0}, &Room::tug0GetEngineer },
-
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug0LookAtControls },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug0LookAtControls },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::tug0UseSpockOnControls },
-	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::tug0SpockReachedControlsToExamine },
-	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::tug0SpockExaminedControls },
-	{ {ACTION_USE, OBJECT_IRT, 0x21, 0}, &Room::tug0UseTransmogrifierWithoutBitOnControls },
-	{ {ACTION_USE, OBJECT_IRTWB, 0x21, 0}, &Room::tug0UseTransmogrifierWithBitOnControls },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug0SpockReachedControlsWithTransmogrifier },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug0SpockFinishedUsingTransmogrifier },
-	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::tug0TransporterScreenFullyLit },
-	{ {ACTION_USE, OBJECT_IWIRSCRP, 0x21, 0}, &Room::tug0UseWireScrapsOnControls },
-	{ {ACTION_USE, OBJECT_IWIRING, 0x21, 0}, &Room::tug0UseWireOnControls },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug0SpockReachedControlsWithWire },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::tug0SpockFinishedUsingWire },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0}, &Room::tug0UseMedkitOnEngineer },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::tug0MccoyReachedEngineer },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug0MccoyHealedEngineer },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::tug0EngineerGotUp },
-	{ {ACTION_GET, 9, 0, 0}, &Room::tug0GetTransmogrifier },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::tug0KirkReachedToolbox },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug0KirkGotTransmogrifier },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug0LookAtToolbox },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug0UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug0UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug0UseWelderOnWireScraps },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug0UseWelderOnMetalScraps },
-	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug0UseCombBitOnTransmogrifier },
-
-	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::tug0UseTransporter },
-	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::tug0UseTransporter },
-	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::tug0SpockReachedControlsToTransport },
-	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::tug0SpockPreparedTransporter },
-	{ {ACTION_FINISHED_WALKING, 20, 0, 0}, &Room::tug0SpockReachedTransporter },
-	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::tug0FinishedTransporting },
-
-	{ {ACTION_USE, OBJECT_IBOMB, 0x22, 0}, &Room::tug0UseBombOnTransporter },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::tug0KirkReachedTransporter },
-	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::tug0KirkPlacedBomb },
-	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::tug0SpockReachedControlsForBomb },
-	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::tug0SpockBeginsBeamingBomb },
-	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::tug0SpockFinishesBeamingBomb },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug0BombExploded },
-
-	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::tug0UseMTricorderOnControls },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::tug0UseMTricorderOnControls },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::tug0UseSTricorderOnControls },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::tug0UseMTricorderOnEngineer },
-	{ {ACTION_FINISHED_WALKING, 24, 0, 0}, &Room::tug0MccoyReachedEngineerToScan },
-	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::tug0MccoyFinishedScanningEngineer },
-	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::tug0UseSTricorderOnEngineer },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::tug0UseSTricorderOnEngineer },
-	{ {ACTION_WALK, 0x23, 0, 0}, &Room::tug0WalkToDoor },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::tug0LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug0LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug0LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug0LookAtRedshirt },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::tug0LookAtTransporter },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::tug0LookAtDoor },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug0TalkToKirk },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug0TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug0TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug0TalkToRedshirt },
-	{ {ACTION_TALK, 8, 0, 0}, &Room::tug0TalkToEngineer },
-	{ {ACTION_USE, OBJECT_ICOMM, 0, 0}, &Room::tug0UseCommunicator },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug0LookAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::tug0UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::tug0UseMTricorderAnywhere },
-};
-
-
-RoomAction tug1ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::tug1Tick1 },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::tug1UseSTricorderOnAnything },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug1LookAtBridgeDoor },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::tug1UseSTricorderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::tug1UsePhaserOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x21, 0}, &Room::tug1UsePhaserOnBridgeDoor },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::tug1KirkReachedFiringPosition },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug1KirkPulledOutPhaser },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::tug1KirkFinishedFiringPhaser },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug1TalkToSpock },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::tug1UseSTricorderOnJunkPile },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug1LookAtJunkPile },
-	{ {ACTION_GET, 8, 0, 0}, &Room::tug1GetJunkPile },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::tug1KirkReachedJunkPile },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::tug1KirkFinishedTakingJunkPile },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug1UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug1UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug1UseWelderOnWireScraps },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug1UseWelderOnMetalScraps },
-	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug1UseCombBitOnTransmogrifier },
-
-	{ {ACTION_USE, OBJECT_IPWF, 0x22, 0}, &Room::tug1UsePhaserWelderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IPWF, 0x21, 0}, &Room::tug1UsePhaserWelderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IPWF, 0x20, 0}, &Room::tug1UsePhaserWelderOnBridgeDoorInLeftSpot },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug1KirkReachedBridgeDoorWithWelder },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug1KirkFinishedUsingWelder },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug1KirkReachedBridgeDoorWithWelderInLeftSpot },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::tug1KirkFinishedUsingWelderInLeftSpot },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug1LookAnywhere },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug1LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug1LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug1LookAtRedshirt },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug1TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug1TalkToRedshirt },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::tug1LookAtTerminal },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::tug1LookAtDebris },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::tug1LookAtBrigDoor },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::tug1UseSTricorderOnBrigDoor },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug1TalkToKirk },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::tug1UseCommunicator },
-	{ {ACTION_WALK, 0x21, 0, 0}, &Room::tug1WalkToBridgeDoor },
-	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::tug1KirkReachedBridgeDoor },
-	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::tug1BridgeDoorOpened },
-	{ {ACTION_WALK, 0x25, 0, 0}, &Room::tug1WalkToBrigDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::tug1UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x25, 0}, &Room::tug1UseMTricorderOnBrigDoor },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::tug1UseSpockOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::tug1UseSpockOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::tug1UseSpockOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0x20, 0}, &Room::tug1UseMedkitOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0x21, 0}, &Room::tug1UseMedkitOnBridgeDoor },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0x22, 0}, &Room::tug1UseMedkitOnBridgeDoor },
-};
-
-
-RoomAction tug2ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::tug2Tick1 },
-	{ {ACTION_TICK, 60, 0, 0}, &Room::tug2Tick60 },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::tug2LookAtButton },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug2LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug2LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug2LookAtRedshirt },
-	{ {ACTION_GET, 11, 0, 0}, &Room::tug2GetBomb },
-	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::tug2KirkReachedBomb },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug2KirkGotBomb },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug2LookAtBomb },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug2LookAtGuard1 },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug2LookAtGuard2 },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::tug2LookAtWires },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::tug2UseSTricorderOnButton },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::tug2UseSTricorderOnButton },
-	{ {ACTION_USE, OBJECT_MCCOY, 12, 0}, &Room::tug2UseMccoyOnWires },
-	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::tug2UseMccoyOnBomb },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 12, 0}, &Room::tug2UseRedshirtOnWires },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug2RedshirtReachedWires },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug2RedshirtDefusedBomb },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug2RedshirtReturnedToPosition },
-	{ {ACTION_USE, OBJECT_KIRK, 12, 0}, &Room::tug2UseKirkOnWires },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::tug2KirkReachedWires },
-	{ {ACTION_USE, OBJECT_SPOCK, 12, 0}, &Room::tug2UseSpockOnWires },
-	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::tug2SpockReachedWires },
-	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::tug2SpockReturnedToPosition },
-	{ {ACTION_GET, 12, 0, 0}, &Room::tug2GetWires },
-	{ {ACTION_FINISHED_WALKING, 28, 0, 0}, &Room::tug2KirkReachedWiresToGet },
-	{ {ACTION_FINISHED_ANIMATION, 29, 0, 0}, &Room::tug2KirkGotWires },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::tug2UseKirkOnButton },
-	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::tug2KirkReachedButton },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::tug2UseSpockOnButton },
-	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::tug2SpockReachedButton },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::tug2UseMccoyOnButton },
-	{ {ACTION_FINISHED_WALKING, 18, 0, 0}, &Room::tug2MccoyReachedButton },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::tug2UseRedshirtOnButton },
-	{ {ACTION_FINISHED_WALKING, 20, 0, 0}, &Room::tug2RedshirtReachedButton },
-	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::tug2TurnedOffForceField },
-	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::tug2TurnedOffForceField },
-	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::tug2TurnedOffForceField },
-	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::tug2TurnedOffForceField },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::tug2PrisonersDead },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::tug2PrisonersReleased },
-	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::tug2UsePhaserOnBrig },
-	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::tug2UsePhaserOnBrig },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::tug2UseStunPhaserOnGuard1 },
-	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::tug2KirkShootGuard1 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::tug2UseStunPhaserOnGuard2 },
-	{ {ACTION_FINISHED_ANIMATION, 23, 0, 0}, &Room::tug2KirkShootGuard2 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::tug2UseKillPhaserOnGuard1 },
-	{ {ACTION_FINISHED_ANIMATION, 24, 0, 0}, &Room::tug2KirkKillGuard1 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::tug2UseKillPhaserOnGuard2 },
-	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::tug2KirkKillGuard2 },
-
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug2UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug2UsePhaserOnWelder },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug2UseWelderOnWireScraps },
-	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug2UseWelderOnMetalScraps },
-	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug2UseCombBitOnTransmogrifier },
-
-	{ {ACTION_FINISHED_ANIMATION, 26, 0, 0}, &Room::tug2ShotByElasi },
-	{ {ACTION_FINISHED_ANIMATION, 27, 0, 0}, &Room::tug2ShotByElasi },
-	{ {ACTION_WALK, 0x21, 0, 0}, &Room::tug2WalkToDoor },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug2LookAtDoor },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::tug2LookAtKirk },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug2TalkToKirk },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug2TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug2TalkToRedshirt },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug2TalkToSpock },
-	{ {ACTION_USE, OBJECT_ICOMM, 0, 0}, &Room::tug2UseCommunicator },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug2Timer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::tug2Timer2Expired },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 11, 0}, &Room::tug2UseSTricorderOnBomb },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::tug2UseMTricorderOnGuard1 },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::tug2UseMTricorderOnGuard2 },
-	{ {ACTION_TALK, 8, 0, 0}, &Room::tug2TalkToGuard1 },
-	{ {ACTION_TALK, 9, 0, 0}, &Room::tug2TalkToGuard2 },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 11, 0}, &Room::tug2UseMedkitOnBomb },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0}, &Room::tug2UseMedkitOnGuard1 },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 9, 0}, &Room::tug2UseMedkitOnGuard2 },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::tug2LookAnywhere },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::tug2LookAnywhere },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug2LookAnywhere },
-	{ {ACTION_TALK, 10, 0, 0}, &Room::tug2TalkToBrig },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::tug2UseMTricorderOnBrig },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::tug2UseMTricorderOnOpenBrig },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::tug2UsePhaserAnywhere },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::tug2UsePhaserAnywhere },
-};
-
-RoomAction tug3ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::tug3Tick1 },
-	{ {ACTION_TICK, 40, 0, 0}, &Room::tug3Tick40 },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug3LookAnywhere },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::tug3UsePhaserAnywhere },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::tug3UsePhaserAnywhere },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::tug3UseStunPhaserOnElasi1 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::tug3UseStunPhaserOnElasi2 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::tug3UseStunPhaserOnElasi3 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::tug3UseStunPhaserOnElasi4 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::tug3UseKillPhaserOnElasi1 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::tug3UseKillPhaserOnElasi2 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::tug3UseKillPhaserOnElasi3 },
-	{ {ACTION_USE, OBJECT_IPHASERK, 11, 0}, &Room::tug3UseKillPhaserOnElasi4 },
-	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::tug3ElasiStunnedOrKilled },
-	{ {ACTION_TALK, 8, 0, 0}, &Room::tug3TalkToElasi1 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::tug3Elasi1DrewPhaser },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug3Elasi1ShotConsole },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::tug3Elasi1DrewPhaser2 },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::tug3Elasi1ShotConsoleAndSurrenders },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug3LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug3LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug3LookAtRedshirt },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug3LookAtElasi1 },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug3LookAtElasi2 },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::tug3LookAtElasi3 },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug3LookAtElasi4 },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug3TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug3TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug3TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::tug3UseCommunicator },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug3Timer0Expired },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug3AllCrewmenDead },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::tug3Timer1Expired },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug3SecurityTeamBeamedIn },
-};
-
-
-RoomAction love0ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love0Tick1 },
-	{ {ACTION_TICK, 10, 0, 0}, &Room::love0Tick10 },
-	{ {ACTION_WALK, 0x21, 0, 0}, &Room::love0WalkToDoor2 },
-	{ {ACTION_WALK, 9, 0, 0}, &Room::love0WalkToDoor2 },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love0OpenDoor2 },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love0ReachedDoor2 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love0ReachedDoor2 },
-	{ {ACTION_WALK, 0x22, 0, 0}, &Room::love0WalkToDoor1 },
-	{ {ACTION_WALK, 8, 0, 0}, &Room::love0WalkToDoor1 },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::love0OpenDoor1 },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love0ReachedDoor1 },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love0ReachedDoor1 },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love0LookAtConsole },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love0LookAtViewscreen },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love0LookAnywhere },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::love0LookAtDoor1 },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::love0LookAtDoor2 },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love0LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love0LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love0LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love0LookAtRedshirt },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love0TalkToKirk },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love0TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love0TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love0TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love0UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::love0UseSTricorderOnConsole },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love0UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love0UseKirkOnConsole },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love0UseRedshirtOnConsole },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love0UseSpockOnConsole },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love0SpockReachedConsole },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love0SpockAccessedConsole },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love0UseMccoyOnConsole },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love0MccoyReachedConsole },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love0MccoyAccessedConsole },
-	{ {ACTION_GET,    8, 0, 0}, &Room::love0GetDoorOrConsole },
-	{ {ACTION_GET,    9, 0, 0}, &Room::love0GetDoorOrConsole },
-	{ {ACTION_GET, 0x20, 0, 0}, &Room::love0GetDoorOrConsole },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction love1ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love1Tick1 },
-
-	{ {ACTION_WALK, 10, 0, 0}, &Room::love1WalkToDoor3 },
-	{ {ACTION_WALK, 0x26, 0, 0}, &Room::love1WalkToDoor3 },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::love1OpenDoor3 },
-	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::love1ReachedDoor3 },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love1ReachedDoor3 },
-
-	{ {ACTION_WALK, 8, 0, 0}, &Room::love1WalkToDoor1 },
-	{ {ACTION_WALK, 0x27, 0, 0}, &Room::love1WalkToDoor1 },
-	{ {ACTION_TOUCHED_HOTSPOT, 2, 0, 0}, &Room::love1OpenDoor1 },
-	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::love1ReachedDoor1 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love1ReachedDoor1 },
-
-	{ {ACTION_WALK, 9, 0, 0}, &Room::love1WalkToDoor2 },
-	{ {ACTION_WALK, 0x28, 0, 0}, &Room::love1WalkToDoor2 },
-	{ {ACTION_TOUCHED_HOTSPOT, 3, 0, 0}, &Room::love1OpenDoor2 },
-	{ {ACTION_FINISHED_WALKING, 17, 0, 0}, &Room::love1ReachedDoor2 },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love1ReachedDoor2 },
-
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::love1LookAtLaser },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love1LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love1LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love1LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love1LookAtRedshirt },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love1LookAnywhere },
-	{ {ACTION_LOOK, 15, 0, 0}, &Room::love1LookAtNozzle },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::love1LookAtNozzle },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love1LookAtLadder },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::love1LookAtDoor1Or2 },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::love1LookAtDoor1Or2 },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::love1LookAtDoor3 },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love1LookAtDistillator },
-	{ {ACTION_LOOK, 14, 0, 0}, &Room::love1LookAtChamber },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::love1LookAtChamber },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love1LookAtReplicator },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::love1LookAtFreezer },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::love1LookAtFreezer },
-	{ {ACTION_LOOK, OBJECT_IDISHES, 0, 0}, &Room::love1LookAtDishes },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love1TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love1TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love1TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love1TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_IDISHES, 0}, &Room::love1UseMTricorderOnDishes },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love1UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::love1UseSTricorderOnReplicator },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::love1UseSTricorderOnReplicator },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x25, 0}, &Room::love1UseSTricorderOnLaser },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::love1UseSTricorderOnLaser },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::love1UseSTricorderOnFreezer },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love1UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IDISHES, 0}, &Room::love1UseSTricorderOnDishes },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::love1UseSTricorderOnDistillator },
-	{ {ACTION_GET, 11, 0, 0}, &Room::love1GetFreezer },
-	{ {ACTION_GET, 0x22, 0, 0}, &Room::love1GetFreezer },
-	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love1KirkReachedFreezer },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love1KirkGotVirusCulture },
-	{ {ACTION_GET, 14, 0, 0}, &Room::love1GetFromChamber },
-	{ {ACTION_GET, 12, 0, 0}, &Room::love1GetFromChamber },
-	{ {ACTION_GET, 0x23, 0, 0}, &Room::love1GetFromChamber },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love1KirkReachedChamber },
-	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love1KirkGotCureSample },
-	{ {ACTION_GET, 15, 0, 0}, &Room::love1GetFromNozzle },
-	{ {ACTION_GET, 0x24, 0, 0}, &Room::love1GetFromNozzle },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love1KirkReachedNozzleToGet },
-	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love1KirkGotBottleFromNozzle },
-	{ {ACTION_USE, OBJECT_IN2O, 0x24, 0}, &Room::love1UseN2OOnNozzle },
-	{ {ACTION_USE, OBJECT_IH2O, 0x24, 0}, &Room::love1UseH2OOnNozzle },
-	{ {ACTION_USE, OBJECT_INH3, 0x24, 0}, &Room::love1UseNH3OnNozzle },
-	{ {ACTION_USE, OBJECT_IRLG, 0x24, 0}, &Room::love1UseRLGOnNozzle },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love1KirkReachedNozzleToPut },
-	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love1KirkPutBottleInNozzle },
-	{ {ACTION_USE, 0xff, 0x24, 0}, &Room::love1UseAnthingOnNozzle },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0}, &Room::love1UseSpockOnReplicator },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x23, 0}, &Room::love1UseRedshirtOnReplicator },
-	{ {ACTION_USE, OBJECT_MCCOY, 14, 0}, &Room::love1UseMccoyOnReplicator },
-	{ {ACTION_USE, OBJECT_MCCOY, 15, 0}, &Room::love1UseMccoyOnReplicator },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x23, 0}, &Room::love1UseMccoyOnReplicator },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love1MccoyReachedReplicator },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love1MccoyUsedReplicator },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love1ChamberClosed },
-	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love1ChamberOpened },
-	{ {ACTION_USE, 0xff, 12, 0}, &Room::love1UseAnythingOnChamber },
-	{ {ACTION_USE, OBJECT_IDISHES, 12, 0}, &Room::love1UseDishesOnChamber },
-	{ {ACTION_USE, OBJECT_IDISHES, 0x23, 0}, &Room::love1UseDishesOnChamber },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love1KirkReachedChamberToPut },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love1ChamberOpenedForDish },
-	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love1KirkPutDishInChamber },
-	{ {ACTION_USE, OBJECT_IINSULAT, 0x21, 0}, &Room::love1UseInsulationOnDistillator },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love1KirkReachedDistillator },
-	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::love1KirkGotPolyberylcarbonate },
-	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::love1UseKirkOnFreezer },
-	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love1UseKirkOnFreezer },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::love1UseRedshirtOnFreezer },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 11, 0}, &Room::love1UseRedshirtOnFreezer },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::love1UseSpockOnFreezer },
-	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::love1UseSpockOnFreezer },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0}, &Room::love1UseMccoyOnFreezer },
-	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::love1UseMccoyOnFreezer },
-	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love1CrewmanReachedFreezer },
-	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0}, &Room::love1CrewmanOpenedOrClosedFreezer },
-	{ {ACTION_USE, 0xff, 0x22, 0}, &Room::love1UseAnythingOnFreezer },
-	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love1ReachedFreezerWithArbitraryItem },
-	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnFreezer },
-	{ {ACTION_USE, 0xff, 0x23, 0}, &Room::love1UseAnythingOnReplicator },
-	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love1ReachedReplicatorWithArbitraryItem },
-	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnReplicator },
-	{ {ACTION_USE, 0xff, 0x21, 0}, &Room::love1UseAnythingOnDistillator },
-	{ {ACTION_FINISHED_WALKING, 13, 0, 0}, &Room::love1ReachedDistillatorWithArbitraryItem },
-	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnDistillator },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love1UseKirkOnLadder },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love1UseSpockOnLadder },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love1UseMccoyOnLadder },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love1UseRedshirtOnLadder },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love1CrewmanReachedLadder },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love1CrewmanDiedFromPhaser },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love1TouchedHotspot0 },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction love2ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love2Tick1 },
-	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love2TouchedWarp1 },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love2Timer3Expired },
-	{ {ACTION_WALK, 10, 0, 0}, &Room::love2WalkToDoor },
-	{ {ACTION_WALK, 0x22, 0, 0}, &Room::love2WalkToDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love2TouchedHotspot0 },
-	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love2DoorReachedOrOpened },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love2DoorReachedOrOpened },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::love2LookAtCabinet },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::love2LookAtDoor },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love2LookAtSynthesizer },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love2LookAtAnywhere },
-	{ {ACTION_LOOK, 14, 0, 0}, &Room::love2LookAtAntigrav },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love2LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love2LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love2LookAtRedshirt },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love2LookAtKirk },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love2LookAtArdak },
-	{ {ACTION_LOOK, 15, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 16, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 18, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 19, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 17, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::love2LookAtChamber },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::love2LookAtCan1 },
-	{ {ACTION_LOOK, 13, 0, 0}, &Room::love2LookAtCan2 },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love2TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love2TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love2TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love2TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love2UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love2UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love2UseKirkOnCabinet },
-	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love2UseSpockOnCabinet },
-	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love2UseMccoyOnCabinet },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love2UseRedshirtOnCabinet },
-	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love2CrewmanReachedCabinet },
-	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love2CrewmanAccessedCabinet },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love2CrewmanOpenedOrClosedCabinet },
-	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love2UseWrenchOnGasFeed },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love2ReachedGasFeed },
-	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love2ChangedGasFeed },
-	{ {ACTION_USE, OBJECT_IO2GAS, 0x23, 0}, &Room::love2UseO2GasOnCanisterSlot },
-	{ {ACTION_USE, OBJECT_IH2GAS, 0x23, 0}, &Room::love2UseH2GasOnCanisterSlot },
-	{ {ACTION_USE, OBJECT_IN2GAS, 0x23, 0}, &Room::love2UseN2GasOnCanisterSlot },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love2ReachedCanisterSlot },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love2PutCanisterInSlot1 },
-	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love2PutCanisterInSlot2 },
-	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love2UseAntigravOnCanister1 },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love2ReachedCanisterSlot1ToGet },
-	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::love2TookCanister1 },
-	{ {ACTION_USE, OBJECT_IANTIGRA, 13, 0}, &Room::love2UseAntigravOnCanister2 },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love2ReachedCanisterSlot2ToGet },
-	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0}, &Room::love2TookCanister2 },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love2UseKirkOnSynthesizer },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love2UseSpockOnSynthesizer },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love2UseMccoyOnSynthesizer },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love2UseRedshirtOnSynthesizer },
-	{ {ACTION_FINISHED_WALKING, 13, 0, 0}, &Room::love2CrewmanReachedSynthesizer },
-	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::love2CrewmanUsedSynthesizer },
-	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::love2SpockReachedGasFeeds },
-	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::love2SpockEnabledGasFeeds },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love2SynthesizerDoorClosed },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love2SynthesizerFinished },
-	{ {ACTION_FINISHED_ANIMATION, 27, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingRLG },
-	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingCure },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love2CureStartedSynthesizing },
-	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love2CureSynthesized },
-	{ {ACTION_USE, OBJECT_IPBC, 9, 0}, &Room::love2UsePolyberylcarbonateOnSynthesizerDoor },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love2KirkReachedSynthesizerWithPolyberylcarbonate },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate },
-	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::love2PutPolyberylcarbonateInSynthesizer },
-
-	{ {ACTION_USE, OBJECT_IDISHES, 9, 0}, &Room::love2UseVirusSampleOnSynthesizerDoor },
-	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love2KirkReachedSynthesizerWithVirusSample },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love2SynthesizerDoorOpenedWithVirusSample },
-	{ {ACTION_FINISHED_ANIMATION, 20, 0, 0}, &Room::love2PutVirusSampleInSynthesizer },
-
-	{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0}, &Room::love2UseCureSampleOnSynthesizerDoor },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love2KirkReachedSynthesizerWithCureSample },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love2SynthesizerDoorOpenedWithCureSample },
-	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::love2PutCureSampleInSynthesizer },
-
-	{ {ACTION_USE, 0xff, 9, 0}, &Room::love2UseAnythingOnSynthesizerDoor },
-	{ {ACTION_USE, 0xff, 0x20, 0}, &Room::love2UseAnythingOnSynthesizer },
-	{ {ACTION_GET, 13, 0, 0}, &Room::love2GetCanister },
-	{ {ACTION_GET, 12, 0, 0}, &Room::love2GetCanister },
-
-	{ {ACTION_GET, 14, 0, 0}, &Room::love2GetAntigrav },
-	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love2ReachedAntigrav },
-	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::love2GotAntigrav },
-
-	{ {ACTION_GET, 16, 0, 0}, &Room::love2GetPolyberylcarbonate },
-	{ {ACTION_FINISHED_WALKING, 18, 0, 0}, &Room::love2ReachedPolyberylcarbonate },
-	{ {ACTION_FINISHED_ANIMATION, 26, 0, 0}, &Room::love2GotPolyberylcarbonate },
-
-	{ {ACTION_GET, 17, 0, 0}, &Room::love2GetDishes },
-	{ {ACTION_FINISHED_WALKING, 17, 0, 0}, &Room::love2ReachedDishes },
-	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::love2GotDishes },
-
-	{ {ACTION_GET, 18, 0, 0}, &Room::love2GetSample },
-	{ {ACTION_FINISHED_WALKING, 19, 0, 0}, &Room::love2ReachedSample },
-	{ {ACTION_FINISHED_ANIMATION, 28, 0, 0}, &Room::love2GotSample },
-
-	{ {ACTION_GET, 15, 0, 0}, &Room::love2GetSynthesizerOutput },
-	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love2ReachedSynthesizerOutput },
-	{ {ACTION_FINISHED_ANIMATION, 23, 0, 0}, &Room::love2GotSynthesizerOutput },
-
-	{ {ACTION_GET, 19, 0, 0}, &Room::love2GetCure },
-	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love2ReachedCure },
-	{ {ACTION_FINISHED_ANIMATION, 24, 0, 0}, &Room::love2GotCure },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction love3ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love3Tick1 },
-	{ {ACTION_TICK, 80, 0, 0}, &Room::love3Tick80 },
-	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love3TouchedWarp1 },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love3Timer3Expired },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::love3LookAtServicePanel },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love3LookAtMonitor },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::love3LookAtWrench },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love3LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love3LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love3LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love3LookAtRedshirt },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love3LookAnywhere },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::love3LookAtShaft },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::love3LookAtGrate },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::love3LookAtPanel },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love3LookAtPanel },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::love3LookAtGasTank },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love3LookAtTurbines },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love3TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love3TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love3TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love3TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love3UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::love3UseSTricorderOnTurbines },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::love3UseSTricorderOnInsulation },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love3UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love3UseKirkOnServicePanel },
-	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love3UseSpockOnServicePanel },
-	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love3UseMccoyOnServicePanel },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love3UseRedshirtOnServicePanel },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love3CrewmanReachedServicePanel },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love3OpenedOrClosedServicePanel },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, 12, 0}, &Room::love3UseWrenchOnGasTank },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love3ReachedGasTankToUnscrew },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love3ScrewedOrUnscrewedGasTank },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IO2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
-	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IH2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IN2GAS, 0}, &Room::love3UseWrenchOnN2Gas },
-	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::love3ReachedGasTankToPutDown },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love3PutN2TankBack },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, 0x20, 0}, &Room::love3UseWrenchOnEngineeringPanel },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love3ReachedEngineeringPanel },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love3OpenedEngineeringPanel },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, 0x21, 0}, &Room::love3UseWrenchOnMonitor },
-
-	{ {ACTION_USE, OBJECT_IH2O, 0x21, 0}, &Room::love3UseWaterOnMonitor },
-	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love3ReachedMonitorToUseWater },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love3PouredWaterOnMonitor },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
-
-	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love3UseWrenchOnGrate },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love3ReachedGateWithWrench },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love3OpenedOrClosedGrate },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
-
-	{ {ACTION_USE, OBJECT_IH2O, 0x22, 0}, &Room::love3UseWaterOnShaft },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love3ReachedShaftUsingWater },
-	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love3PouredWaterDownShaft },
-
-	{ {ACTION_USE, OBJECT_IN2O, 0x22, 0}, &Room::love3UseNitrousOxideOnShaft },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love3ReachedShaftUsingNitrousOxide },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love3PouredNitrousOxideDownShaft },
-
-	{ {ACTION_USE, OBJECT_INH3, 0x22, 0}, &Room::love3UseAmmoniaOnShaft },
-	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love3ReachedShaftUsingAmmonia },
-	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love3PouredAmmoniaDownShaft },
-
-	{ {ACTION_USE, OBJECT_IRLG, 0x22, 0}, &Room::love3UseRomulanLaughingGasOnShaft },
-	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love3ReachedShaftUsingRomulanLaughingGas },
-	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love3PouredRomulanLaughingGasDownShaft },
-
-	{ {ACTION_GET, 10, 0, 0}, &Room::love3GetWrench },
-	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love3ReachedWrenchToGet },
-	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love3PickedUpWrench },
-
-	{ {ACTION_GET, 12, 0, 0}, &Room::love3GetGasTank },
-	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love3ReachedGasTankToGet },
-
-	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love3UseAntigravOnGasTank },
-	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love3ReachedGasTankUsingAntigrav },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love3PickedUpGasTank },
-
-	{ {ACTION_GET, 9, 0, 0}, &Room::love3GetInsulation },
-	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love3ReachedInsulationToGet },
-	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love3PickedUpInsulation },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction love4ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love4Tick1 },
-	{ {ACTION_TICK, 10, 0, 0}, &Room::love4Tick10 },
-
-	{ {ACTION_WALK, 8, 0, 0}, &Room::love4WalkToDoor },
-	{ {ACTION_WALK, 0x20, 0, 0}, &Room::love4WalkToDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love4TouchedHotspot0 },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love4DoorOpenedOrReached },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love4DoorOpenedOrReached },
-
-	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::love4UseKirkOnLadder },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love4ReachedLadder },
-	{ {ACTION_USE, OBJECT_IPHASERS,  9, 0}, &Room::love4UseStunPhaserOnRomulan },
-	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::love4UseStunPhaserOnRomulan },
-	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::love4UseStunPhaserOnRomulan },
-	{ {ACTION_USE, OBJECT_IPHASERS, 12, 0}, &Room::love4UseStunPhaserOnRomulan },
-	// NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit.
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love4LookAnywhere },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love4LookAtLadder },
-	{ {ACTION_LOOK, 8, 0, 0}, &Room::love4LookAtDoor },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love4LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love4LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love4LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love4LookAtRedshirt },
-	{ {ACTION_LOOK,  9, 0, 0}, &Room::love4LookAtRomulan },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::love4LookAtRomulan },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::love4LookAtRomulan },
-	{ {ACTION_LOOK, 12, 0, 0}, &Room::love4LookAtRomulan },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love4TalkToKirk },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love4TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love4TalkToRedshirt },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love4TalkToSpock },
-	{ {ACTION_TALK,  9, 0, 0}, &Room::love4TalkToRomulan },
-	{ {ACTION_TALK, 10, 0, 0}, &Room::love4TalkToRomulan },
-	{ {ACTION_TALK, 11, 0, 0}, &Room::love4TalkToRomulan },
-	{ {ACTION_TALK, 12, 0, 0}, &Room::love4TalkToRomulan },
-	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::love4UseMTricorderOnRomulan },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::love4UseMTricorderOnRomulan },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::love4UseMTricorderOnRomulan },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 12, 0}, &Room::love4UseMTricorderOnRomulan },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love4UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love4UseSTricorderAnywhere },
-
-	{ {ACTION_USE, OBJECT_ICURE,  9, 0}, &Room::love4UseCureOnRomulan },
-	{ {ACTION_USE, OBJECT_ICURE, 10, 0}, &Room::love4UseCureOnRomulan },
-	{ {ACTION_USE, OBJECT_ICURE, 11, 0}, &Room::love4UseCureOnRomulan },
-	{ {ACTION_USE, OBJECT_ICURE, 12, 0}, &Room::love4UseCureOnRomulan },
-	{ {ACTION_FINISHED_WALKING,   3, 0, 0}, &Room::love4MccoyReachedRomulan4 },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love4MccoyCuredRomulan4 },
-	{ {ACTION_FINISHED_WALKING,   4, 0, 0}, &Room::love4MccoyReachedRomulan3 },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love4MccoyCuredRomulan3 },
-	{ {ACTION_FINISHED_WALKING,   5, 0, 0}, &Room::love4MccoyReachedRomulan2 },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love4MccoyCuredRomulan2 },
-	{ {ACTION_FINISHED_WALKING,   6, 0, 0}, &Room::love4MccoyReachedRomulan1 },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love4MccoyCuredRomulan1 },
-
-	{ {ACTION_USE, OBJECT_IH2O,   9, 0}, &Room::love4UseWaterOnRomulan },
-	{ {ACTION_USE, OBJECT_IH2O,  10, 0}, &Room::love4UseWaterOnRomulan },
-	{ {ACTION_USE, OBJECT_IH2O,  11, 0}, &Room::love4UseWaterOnRomulan },
-	{ {ACTION_USE, OBJECT_IH2O,  12, 0}, &Room::love4UseWaterOnRomulan },
-	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::love4UseMedkitOnRomulan },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 10, 0}, &Room::love4UseMedkitOnRomulan },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 11, 0}, &Room::love4UseMedkitOnRomulan },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 12, 0}, &Room::love4UseMedkitOnRomulan },
-	{ {ACTION_USE, OBJECT_ISAMPLE,  9, 0}, &Room::love4UseCureSampleOnRomulan },
-	{ {ACTION_USE, OBJECT_ISAMPLE, 10, 0}, &Room::love4UseCureSampleOnRomulan },
-	{ {ACTION_USE, OBJECT_ISAMPLE, 11, 0}, &Room::love4UseCureSampleOnRomulan },
-	{ {ACTION_USE, OBJECT_ISAMPLE, 12, 0}, &Room::love4UseCureSampleOnRomulan },
-	{ {ACTION_USE, 0xff,  9, 0}, &Room::love4UseAnythingOnRomulan },
-	{ {ACTION_USE, 0xff, 10, 0}, &Room::love4UseAnythingOnRomulan },
-	{ {ACTION_USE, 0xff, 11, 0}, &Room::love4UseAnythingOnRomulan },
-	{ {ACTION_USE, 0xff, 12, 0}, &Room::love4UseAnythingOnRomulan },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction love5ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::love5Tick1 },
-	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love5TouchedWarp1 },
-	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::love5Timer4Expired },
-	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::love5UseStunPhaserOnPreax },
-	// NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit.
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love5LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love5LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love5LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love5LookAtRedshirt },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love5LookAnywhere },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love5LookAtDevice },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love5LookAtConsole },
-	{ {ACTION_LOOK, 10, 0, 0}, &Room::love5LookAtDrMarcus },
-	{ {ACTION_LOOK, 11, 0, 0}, &Room::love5LookAtDrCheever },
-	{ {ACTION_LOOK, 9, 0, 0}, &Room::love5LookAtPreax },
-	{ {ACTION_TALK, 9, 0, 0}, &Room::love5TalkToPreax },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love5MccoyReachedSpockToCure },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love5MccoyCuredSpock },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love5CrewmanReachedBeamoutPosition },
-	{ {ACTION_TALK, 10, 0, 0}, &Room::love5TalkToDrMarcus },
-	{ {ACTION_TALK, 11, 0, 0}, &Room::love5TalkToDrCheever },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love5TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love5TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love5TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love5TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love5UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::love5UseSTricorderOnDevice },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::love5UseMTricorderOnPreax },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 9, 0}, &Room::love5UseMedkitOnPreax },
-	{ {ACTION_USE, OBJECT_IH2O, 9, 0}, &Room::love5UseWaterOnPreax },
-	{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0}, &Room::love5UseCureSampleOnPreax },
-	{ {ACTION_USE, OBJECT_ICURE, 9, 0}, &Room::love5UseCureOnPreax },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love5ReachedPreaxUsingCure },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love5CuredPreax },
-	{ {ACTION_USE, 0xff, 9, 0}, &Room::love5UseAnythingOnPreax },
-	{ {ACTION_USE, OBJECT_KIRK, 10, 0}, &Room::love5UseKirkOnMarcusOrCheever },
-	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love5UseKirkOnMarcusOrCheever },
-	{ {ACTION_FINISHED_WALKING,   1, 0, 0}, &Room::love5KirkReachedCheever },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love5KirkUntiedCheever },
-	{ {ACTION_FINISHED_WALKING,   2, 0, 0}, &Room::love5KirkReachedMarcus },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love5KirkUntiedMarcus },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love5MarcusStoodUp },
-
-	// Common code
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
-	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
-	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
-	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
-	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
-	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
-	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
-	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
-	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
-};
-
-RoomAction mudd0ActionList[] = {
-	{ {ACTION_TICK,  1, 0, 0}, &Room::mudd0Tick1 },
-	{ {ACTION_TICK, 50, 0, 0}, &Room::mudd0Tick50 },
-	{ {ACTION_TICK, 60, 0, 0}, &Room::mudd0Tick60 },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::mudd0UsePhaserOnMudd },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::mudd0UsePhaserOnMudd },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::mudd0UseCommunicator },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd0LookAtFoodBox },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd0LookAtComponentBox },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::mudd0LookAnywhere },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd0LookAtMemoryDiskBox },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd0LookAtDegrimerBox },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd0LookAtLense },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::mudd0UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::mudd0UseMTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd0UseSTricorderOnMemoryDiskBox },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd0UseSTricorderOnDegrimerBox },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::mudd0UseMTricorderOnLense },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-
-	{ {ACTION_GET, 0x21, 0, 0}, &Room::mudd0GetLense },
-	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd0GetMemoryDisk },
-	{ {ACTION_GET, 0x22, 0, 0}, &Room::mudd0GetDegrimer },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd0PickedUpLense },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd0PickedUpItem },
-	{ {ACTION_WALK, 0x26, 0, 0}, &Room::mudd0WalkToSouthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd0TouchedHotspot1 },
-	{ {ACTION_WALK, 0x25, 0, 0}, &Room::mudd0WalkToNorthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd0TouchedHotspot0 },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::mudd0UseMedkit },
-	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd0LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd0LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd0LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd0LookAtRedshirt },
-	{ {ACTION_LOOK, 8,               0, 0}, &Room::mudd0LookAtMudd },
-	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd0TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd0TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd0TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd0TalkToRedshirt },
-	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd0TalkToMudd },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction mudd1ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd1Tick1 },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd1Timer1Expired },
-
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd1UseCommunicator },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0},  &Room::mudd1UseSpockOnBlueButton },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0},   &Room::mudd1SpockReachedBlueButton },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd1SpockPressedBlueButton },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::mudd1CraneFinishedMoving },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x24, 0},  &Room::mudd1UseSpockOnYellowButton },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0},   &Room::mudd1SpockReachedYellowButton },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::mudd1SpockPressedYellowButton },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x25, 0},  &Room::mudd1UseSpockOnRedButton },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0},   &Room::mudd1SpockReachedRedButton },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::mudd1SpockPressedRedButton },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
-
-	{ {ACTION_GET, 9,    0, 0}, &Room::mudd1GetTorpedo },
-	{ {ACTION_GET, 0x21, 0, 0}, &Room::mudd1GetTorpedo },
-	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd1GetTorpedo },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd1UseSTricorderOnTorpedo },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 9,    0}, &Room::mudd1UseSTricorderOnTorpedo },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd1UseSTricorderOnTorpedo },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd1UseSTricorderOnTorpedoLauncher },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::mudd1UseSTricorderOnButton },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::mudd1UseSTricorderOnButton },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x24, 0}, &Room::mudd1UseSTricorderOnButton },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0},    &Room::mudd1UseSTricorderOnCrane },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},  &Room::mudd1UseMedkitAnywhere },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::mudd1LookAnywhere },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd1LookAtTorpedo },
-	{ {ACTION_LOOK, 9,    0, 0}, &Room::mudd1LookAtTorpedo },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd1LookAtFallenTorpedo },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd1LookAtTorpedoLauncher },
-	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd1LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd1LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd1LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd1LookAtRedshirt },
-	{ {ACTION_LOOK, 8,    0, 0}, &Room::mudd1LookAtCrane },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::mudd1LookAtRedButton },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd1LookAtBlueButton },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd1LookAtYellowButton },
-	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd1TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd1TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd1TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd1TalkToRedshirt },
-	{ {ACTION_WALK, 0x28, 0, 0}, &Room::mudd1WalkToSouthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 2, 0, 0}, &Room::mudd1TouchedHotspot2 },
-	{ {ACTION_WALK, 0x27, 0, 0}, &Room::mudd1WalkToNorthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd1TouchedHotspot1 },
-	{ {ACTION_WALK, 0x26, 0, 0}, &Room::mudd1WalkToWestDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd1TouchedHotspot0 },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction mudd2ActionList[] = {
-	{ {ACTION_WALK, 0x21, 0, 0}, &Room::mudd2WalkToNorthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd2TouchedHotspot0 },
-	{ {ACTION_WALK, 0x22, 0, 0}, &Room::mudd2WalkToSouthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd2TouchedHotspot1 },
-	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd2Tick1 },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd2Timer1Expired },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff,   0}, &Room::mudd2UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_SPOCK,    0x20, 0}, &Room::mudd2UseSpockOnCapsules },
-	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd2GetCapsules },
-	{ {ACTION_FINISHED_WALKING,   12, 0, 0}, &Room::mudd2MccoyReachedCapsules },
-	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::mudd2MccoyPickedUpCapsules },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::mudd2UseCommunicator },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::muddaFiredAlienDevice },
-
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd2LookAtCapsules },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::mudd2UseMTricorderOnCapsules },
-	{ {ACTION_USE, OBJECT_ICAPSULE, 0x23, 0}, &Room::mudd2UseCapsuleOnControlPanel },
-	{ {ACTION_FINISHED_WALKING,   15, 0, 0},  &Room::mudd2MccoyReachedControlPanel },
-	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0},  &Room::mudd2MccoyPutCapsuleInControlPanel },
-	{ {ACTION_USE, OBJECT_KIRK, 0x24, 0},     &Room::mudd2UseKirkOnBed },
-	{ {ACTION_USE, OBJECT_KIRK, 0x25, 0},     &Room::mudd2UseKirkOnBed },
-	{ {ACTION_FINISHED_WALKING, 6, 0, 0},     &Room::mudd2KirkReachedBed },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0},   &Room::mudd2MuddNoticedKirk },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd2MuddDroppedCapsule },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0},    &Room::mudd2UsePhaserOnMudd },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0},    &Room::mudd2UsePhaserOnMudd },
-
-	{ {ACTION_USE, OBJECT_SPOCK, 8, 0},       &Room::mudd2UseSpockOnMudd },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0},     &Room::mudd2SpockReachedMudd },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0},   &Room::mudd2SpockPinchedMudd },
-	{ {ACTION_USE, OBJECT_KIRK, 8, 0},        &Room::mudd2UseKirkOnMudd },
-
-	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0},    &Room::mudd2UseRedshirtOnMudd },
-	{ {ACTION_FINISHED_WALKING, 16, 0, 0},    &Room::mudd2RedshirtReachedMudd },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd2Timer2Expired },
-	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0},  &Room::mudd2MuddFinishedPushingRedshirt },
-	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0},  &Room::mudd2RedshirtPushedAway },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0},    &Room::mudd2UseMTricorderOnMudd },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0},     &Room::mudd2UseMedkitOnMudd },
-	{ {ACTION_USE, OBJECT_MCCOY, 8, 0},       &Room::mudd2UseMedkitOnMudd },
-	{ {ACTION_FINISHED_WALKING, 10, 0, 0},    &Room::mudd2MccoyReachedMudd },
-	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0},  &Room::mudd2MccoyCuredMudd },
-	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd2LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd2LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd2LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2LookAtRedshirt },
-	{ {ACTION_LOOK, 8,    0, 0}, &Room::mudd2LookAtMudd },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd2LookAtControlPanel },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::mudd2LookAtBed },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd2LookAtBed },
-	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd2TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd2TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd2TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2TalkToRedshirt },
-	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd2TalkToMudd },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction mudd3ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd3Tick1 },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd3UseCommunicator },
-	{ {ACTION_LOOK, 0x20, 0, 0},              &Room::mudd3LookAtScreen },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd3UseSTricorderOnScreen },
-	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0},     &Room::mudd3UseKirkOnScreen },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0},    &Room::mudd3UseSpockOnSphere },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd3Timer3Expired },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0},    &Room::mudd3UseMccoyOnSphere },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::mudd3UseRedshirtOnSphere },
-	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::mudd3UseMTricorderOnSphere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd3UseSTricorderOnSphere },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd3ReadyToHookUpTricorders },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd3Timer1Expired },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd3Timer2Expired },
-	{ {ACTION_TIMER_EXPIRED, 4, 0, 0},        &Room::mudd3Timer4Expired },
-	{ {ACTION_USE, OBJECT_IDISKS, 0x21, 0},   &Room::mudd3UseMemoryDiskOnSphere },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
-
-	{ {ACTION_GET, 13, 0, 0}, &Room::mudd3GetRepairTool },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0},   &Room::mudd3ReachedRepairTool },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd3PickedUpRepairTool },
-	{ {ACTION_LOOK, 0x21, 0, 0},            &Room::mudd3LookAtSphere },
-	{ {ACTION_WALK, 0x22, 0, 0},            &Room::mudd3WalkToNorthDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0},    &Room::mudd3TouchedHotspot0 },
-	{ {ACTION_WALK, 0x23, 0, 0},            &Room::mudd3WalkToEastDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0},    &Room::mudd3TouchedHotspot1 },
-	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd3LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd3LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd3LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd3LookAtRedshirt },
-	{ {ACTION_LOOK, 8,               0, 0}, &Room::mudd3LookAtMudd },
-	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd3TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd3TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd3TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd3TalkToRedshirt },
-	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd3TalkToMudd },
-	{ {ACTION_USE, OBJECT_IMEDKIT,  0xff, 0}, &Room::mudd3UseMedkit },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction mudd4ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd4Tick1 },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd4UseCommunicator },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd4Timer2Expired },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd4Timer3Expired },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0},    &Room::mudd4UseSpockOnLeftConsole },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0},    &Room::mudd4UseSpockOnLeftConsole },
-	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0},    &Room::mudd4UseSpockOnRightConsole },
-	{ {ACTION_FINISHED_WALKING, 1, 0, 0},     &Room::mudd4SpockReachedChair },
-	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0},   &Room::mudd4SpockSatInChair },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd4SpockUsedSensors },
-	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0},   &Room::mudd4SpockUsedEngineering },
-	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0},   &Room::mudd4SpockUsedNavigation },
-	{ {ACTION_FINISHED_WALKING, 3, 0, 0},     &Room::mudd4FinishedWalking3 },
-	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0},     &Room::mudd4UseKirkOnRightConsole },
-	{ {ACTION_USE, OBJECT_KIRK, 0x23, 0},     &Room::mudd4UseKirkOnRightConsole },
-	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0},     &Room::mudd4UseKirkOnLeftConsole },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd4KirkReachedRightConsole },
-	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0},   &Room::mudd4KirkSatInChair },
-	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0},   &Room::mudd4KirkUsedViewScreen },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd4Timer1Expired },
-	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0},   &Room::mudd4KirkUsedCommunications },
-	{ {ACTION_FINISHED_WALKING, 4, 0, 0},     &Room::mudd4KirkReachedPositionToTalkToMudd },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0},    &Room::mudd4UseMccoyOnConsole },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0},    &Room::mudd4UseMccoyOnConsole },
-	{ {ACTION_USE, OBJECT_MCCOY, 0x23, 0},    &Room::mudd4UseMccoyOnConsole },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::mudd4UseRedshirtOnConsole },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::mudd4UseRedshirtOnConsole },
-	{ {ACTION_USE, OBJECT_REDSHIRT, 0x23, 0}, &Room::mudd4UseRedshirtOnConsole },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0},   &Room::mudd4UseSTricorderOnRepairTool },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd4UseSTricorderOnConsole },
-
-	// ENHANCEMENT: Allow scanning the console to work when scanning the specific stations
-	// as well
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd4UseSTricorderOnConsole },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::mudd4UseSTricorderOnConsole },
-
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd4UseSTricorderOnViewscreen },
-
-	// ENHANCEMENT: Allow scanning the viewscreen when it's on, not just when off
-	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0},    &Room::mudd4UseSTricorderOnViewscreen },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},   &Room::mudd4UseMedkit },
-	{ {ACTION_GET, 10, 0, 0},                &Room::mudd4GetRepairTool },
-	{ {ACTION_FINISHED_WALKING, 5, 0, 0},    &Room::mudd4ReachedRepairTool },
-	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::mudd4PickedUpRepairTool },
-
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd4LookAtConsole },
-	// ENHANCEMENT: Allow look action work with the specific stations as well
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd4LookAtConsole },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd4LookAtConsole },
-
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd4LookAtViewscreen },
-	// ENHANCEMENT: Allow look action work when viewscreen is on, not just when off
-	{ {ACTION_LOOK, 8, 0, 0},    &Room::mudd4LookAtViewscreen },
-
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0},     &Room::mudd4LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0},    &Room::mudd4LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},    &Room::mudd4LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd4LookAtRedshirt },
-	{ {ACTION_LOOK, 10, 0, 0},              &Room::mudd4LookAtRepairTool },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0},     &Room::mudd4TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0},    &Room::mudd4TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0},    &Room::mudd4TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd4TalkToRedshirt },
-	{ {ACTION_WALK, 0x24, 0, 0},            &Room::mudd4WalkToEastDoor },
-	{ {ACTION_WALK, 0x25, 0, 0},            &Room::mudd4WalkToWestDoor },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0},    &Room::mudd4TouchedHotspot0 },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction mudd5ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd5Tick1 },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd5Timer1Expired },
-	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd5Timer2Expired },
-	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},      &Room::mudd5UseCommunicator },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0},   &Room::mudd5UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd5UseSTricorderOnEngine },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd5UseSTricorderOnCrane },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd5UseSTricorderOnHatch },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 9,    0}, &Room::mudd5UseSTricorderOnLifeSupportGenerator },
-	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::mudd5UseStunPhaserOnHatch },
-	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::mudd5UseKillPhaserOnHatch },
-	{ {ACTION_USE, 0xff,            9,    0}, &Room::mudd5UseAnythingOnLifeSupportGenerator },
-	{ {ACTION_USE, OBJECT_IDOOVER,  9,    0}, &Room::mudd5UseDooverOnLifeSupportGenerator },
-	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd5KirkReachedLifeSupportGenerator },
-	{ {ACTION_TIMER_EXPIRED, 4, 0, 0},        &Room::mudd5KirkTimer4Expired },
-	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd5KirkRepairedLifeSupportGenerator },
-	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd5KirkTimer3Expired },
-
-	// Common code (next 4 lines)
-	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
-	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
-	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
-	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
-
-	{ {ACTION_LOOK, 0x20, 0, 0},         &Room::mudd5LookAtHatch },
-	{ {ACTION_LOOK, 9,    0, 0},         &Room::mudd5LookAtLifeSupportGenerator },
-	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd5TouchedHotspot0 },
-	{ {ACTION_WALK, 0x22, 0, 0},         &Room::mudd5WalkToDoor },
-	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0},     &Room::mudd5LookAtKirk },
-	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0},    &Room::mudd5LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},    &Room::mudd5LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd5LookAtRedshirt },
-	{ {ACTION_LOOK, 0x22, 0, 0},            &Room::mudd5LookAtDoor },
-	{ {ACTION_LOOK, 0x23, 0, 0},            &Room::mudd5LookAtCrane },
-	{ {ACTION_LOOK, 0x21, 0, 0},            &Room::mudd5LookAtEngine },
-	{ {ACTION_TALK, OBJECT_KIRK, 0, 0},     &Room::mudd5TalkToKirk },
-	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0},    &Room::mudd5TalkToSpock },
-	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0},    &Room::mudd5TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd5TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},  &Room::mudd5UseMedkit },
-
-	// Common code (countdown for losing atmosphere when life support malfunctioning)
-	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
-};
-
-RoomAction feather0ActionList[] = {
-	{ {ACTION_TICK, 1, 0, 0},  &Room::feather0Tick1 },
-	{ {ACTION_TICK, 60, 0, 0}, &Room::feather0Tick60 },
-	{ {ACTION_TALK, 8, 0, 0},  &Room::feather0TalkToQuetzecoatl },
-	{ {ACTION_TIMER_EXPIRED, 0, 0, 0},                &Room::feather0Timer0Expired },
-	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},                &Room::feather0Timer1Expired },
-	{ {ACTION_USE, OBJECT_IPHASERS, 8,            0}, &Room::feather0UsePhaserOnQuetzecoatl },
-	{ {ACTION_USE, OBJECT_IPHASERK, 8,            0}, &Room::feather0UsePhaserOnQuetzecoatl },
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::feather0UsePhaserOnMccoy },
-	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_MCCOY, 0}, &Room::feather0UsePhaserOnMccoy },
-	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff,          0}, &Room::feather0UseMedkit },
-	{ {ACTION_LOOK, 8,    0, 0}, &Room::feather0LookAtQuetzecoatl },
-	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::feather0LookAtMoon },
-	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::feather0LookAtLog },
-	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::feather0LookAtHut },
-	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::feather0LookAnywhere },
-	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x26, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x27, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x28, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x29, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x2a, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x2b, 0, 0}, &Room::feather0LookAtEyes },
-	{ {ACTION_LOOK, 0x2c, 0, 0}, &Room::feather0LookAtTree },
-	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::feather0LookAtMccoy },
-	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::feather0LookAtSpock },
-	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::feather0LookAtRedshirt },
-	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::feather0TalkToMccoy },
-	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::feather0TalkToSpock },
-	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::feather0TalkToRedshirt },
-	{ {ACTION_USE, OBJECT_ISTRICOR,  8, 0}, &Room::feather0UseSTricorderOnQuetzecoatl },
-	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::feather0UseSTricorderAnywhere },
-	{ {ACTION_USE, OBJECT_IMTRICOR,  8, 0}, &Room::feather0UseMTricorderOnQuetzecoatl },
-};
-
-extern const RoomAction feather1ActionList[], feather2ActionList[], feather3ActionList[], feather4ActionList[];
-extern const int        feather1NumActions,   feather2NumActions,   feather3NumActions,   feather4NumActions;
-extern const RoomAction feather5ActionList[], feather6ActionList[], feather7ActionList[];
-extern const int        feather5NumActions,   feather6NumActions,   feather7NumActions;
+extern const RoomAction feather0ActionList[], feather1ActionList[], feather2ActionList[], feather3ActionList[];
+extern const RoomAction feather4ActionList[], feather5ActionList[], feather6ActionList[], feather7ActionList[];
 
 extern const RoomAction trial0ActionList[], trial1ActionList[], trial2ActionList[], trial3ActionList[];
-extern const int        trial0NumActions,   trial1NumActions,   trial2NumActions,   trial3NumActions;
 extern const RoomAction trial4ActionList[], trial5ActionList[];
-extern const int        trial4NumActions,   trial5NumActions;
 
 extern const RoomAction sins0ActionList[], sins1ActionList[], sins2ActionList[], sins3ActionList[];
-extern const int        sins0NumActions,   sins1NumActions,   sins2NumActions,   sins3NumActions;
 extern const RoomAction sins4ActionList[], sins5ActionList[];
-extern const int        sins4NumActions,   sins5NumActions;
 
 extern const RoomAction veng0ActionList[], veng1ActionList[], veng2ActionList[], veng3ActionList[];
-extern const int        veng0NumActions,   veng1NumActions,   veng2NumActions,   veng3NumActions;
-extern const RoomAction veng4ActionList[], veng5ActionList[], veng6ActionList[], veng7ActionList[], veng8ActionList[];
-extern const int        veng4NumActions,   veng5NumActions,   veng6NumActions,   veng7NumActions,   veng8NumActions;
+extern const RoomAction veng4ActionList[], veng5ActionList[], veng6ActionList[], veng7ActionList[];
+extern const RoomAction veng8ActionList[];
 
 }
 
diff --git a/engines/startrek/rooms/love0.cpp b/engines/startrek/rooms/love0.cpp
index 40ba48455a..a482e7fcc0 100644
--- a/engines/startrek/rooms/love0.cpp
+++ b/engines/startrek/rooms/love0.cpp
@@ -32,6 +32,67 @@
 
 namespace StarTrek {
 
+extern const RoomAction love0ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love0Tick1 },
+	{ {ACTION_TICK, 10, 0, 0}, &Room::love0Tick10 },
+	{ {ACTION_WALK, 0x21, 0, 0}, &Room::love0WalkToDoor2 },
+	{ {ACTION_WALK, 9, 0, 0}, &Room::love0WalkToDoor2 },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love0OpenDoor2 },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love0ReachedDoor2 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love0ReachedDoor2 },
+	{ {ACTION_WALK, 0x22, 0, 0}, &Room::love0WalkToDoor1 },
+	{ {ACTION_WALK, 8, 0, 0}, &Room::love0WalkToDoor1 },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::love0OpenDoor1 },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love0ReachedDoor1 },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love0ReachedDoor1 },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love0LookAtConsole },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love0LookAtViewscreen },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love0LookAnywhere },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::love0LookAtDoor1 },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::love0LookAtDoor2 },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love0LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love0LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love0LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love0LookAtRedshirt },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love0TalkToKirk },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love0TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love0TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love0TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love0UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::love0UseSTricorderOnConsole },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love0UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love0UseKirkOnConsole },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love0UseRedshirtOnConsole },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love0UseSpockOnConsole },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love0SpockReachedConsole },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love0SpockAccessedConsole },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love0UseMccoyOnConsole },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love0MccoyReachedConsole },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love0MccoyAccessedConsole },
+	{ {ACTION_GET,    8, 0, 0}, &Room::love0GetDoorOrConsole },
+	{ {ACTION_GET,    9, 0, 0}, &Room::love0GetDoorOrConsole },
+	{ {ACTION_GET, 0x20, 0, 0}, &Room::love0GetDoorOrConsole },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love0Tick1() {
 	// BUGFIX: moved this out of the if statement below.
 	playVoc("LOV0LOOP");
diff --git a/engines/startrek/rooms/love1.cpp b/engines/startrek/rooms/love1.cpp
index 0a6c5cfeb0..73950253bc 100644
--- a/engines/startrek/rooms/love1.cpp
+++ b/engines/startrek/rooms/love1.cpp
@@ -43,6 +43,145 @@
 
 namespace StarTrek {
 
+extern const RoomAction love1ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love1Tick1 },
+
+	{ {ACTION_WALK, 10, 0, 0}, &Room::love1WalkToDoor3 },
+	{ {ACTION_WALK, 0x26, 0, 0}, &Room::love1WalkToDoor3 },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::love1OpenDoor3 },
+	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::love1ReachedDoor3 },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love1ReachedDoor3 },
+
+	{ {ACTION_WALK, 8, 0, 0}, &Room::love1WalkToDoor1 },
+	{ {ACTION_WALK, 0x27, 0, 0}, &Room::love1WalkToDoor1 },
+	{ {ACTION_TOUCHED_HOTSPOT, 2, 0, 0}, &Room::love1OpenDoor1 },
+	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::love1ReachedDoor1 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love1ReachedDoor1 },
+
+	{ {ACTION_WALK, 9, 0, 0}, &Room::love1WalkToDoor2 },
+	{ {ACTION_WALK, 0x28, 0, 0}, &Room::love1WalkToDoor2 },
+	{ {ACTION_TOUCHED_HOTSPOT, 3, 0, 0}, &Room::love1OpenDoor2 },
+	{ {ACTION_FINISHED_WALKING, 17, 0, 0}, &Room::love1ReachedDoor2 },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love1ReachedDoor2 },
+
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::love1LookAtLaser },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love1LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love1LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love1LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love1LookAtRedshirt },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love1LookAnywhere },
+	{ {ACTION_LOOK, 15, 0, 0}, &Room::love1LookAtNozzle },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::love1LookAtNozzle },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love1LookAtLadder },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::love1LookAtDoor1Or2 },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::love1LookAtDoor1Or2 },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::love1LookAtDoor3 },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love1LookAtDistillator },
+	{ {ACTION_LOOK, 14, 0, 0}, &Room::love1LookAtChamber },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::love1LookAtChamber },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love1LookAtReplicator },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::love1LookAtFreezer },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::love1LookAtFreezer },
+	{ {ACTION_LOOK, OBJECT_IDISHES, 0, 0}, &Room::love1LookAtDishes },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love1TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love1TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love1TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love1TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_IDISHES, 0}, &Room::love1UseMTricorderOnDishes },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love1UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::love1UseSTricorderOnReplicator },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::love1UseSTricorderOnReplicator },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x25, 0}, &Room::love1UseSTricorderOnLaser },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::love1UseSTricorderOnLaser },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::love1UseSTricorderOnFreezer },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love1UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IDISHES, 0}, &Room::love1UseSTricorderOnDishes },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::love1UseSTricorderOnDistillator },
+	{ {ACTION_GET, 11, 0, 0}, &Room::love1GetFreezer },
+	{ {ACTION_GET, 0x22, 0, 0}, &Room::love1GetFreezer },
+	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love1KirkReachedFreezer },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love1KirkGotVirusCulture },
+	{ {ACTION_GET, 14, 0, 0}, &Room::love1GetFromChamber },
+	{ {ACTION_GET, 12, 0, 0}, &Room::love1GetFromChamber },
+	{ {ACTION_GET, 0x23, 0, 0}, &Room::love1GetFromChamber },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love1KirkReachedChamber },
+	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love1KirkGotCureSample },
+	{ {ACTION_GET, 15, 0, 0}, &Room::love1GetFromNozzle },
+	{ {ACTION_GET, 0x24, 0, 0}, &Room::love1GetFromNozzle },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love1KirkReachedNozzleToGet },
+	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love1KirkGotBottleFromNozzle },
+	{ {ACTION_USE, OBJECT_IN2O, 0x24, 0}, &Room::love1UseN2OOnNozzle },
+	{ {ACTION_USE, OBJECT_IH2O, 0x24, 0}, &Room::love1UseH2OOnNozzle },
+	{ {ACTION_USE, OBJECT_INH3, 0x24, 0}, &Room::love1UseNH3OnNozzle },
+	{ {ACTION_USE, OBJECT_IRLG, 0x24, 0}, &Room::love1UseRLGOnNozzle },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love1KirkReachedNozzleToPut },
+	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love1KirkPutBottleInNozzle },
+	{ {ACTION_USE, 0xff, 0x24, 0}, &Room::love1UseAnthingOnNozzle },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0}, &Room::love1UseSpockOnReplicator },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x23, 0}, &Room::love1UseRedshirtOnReplicator },
+	{ {ACTION_USE, OBJECT_MCCOY, 14, 0}, &Room::love1UseMccoyOnReplicator },
+	{ {ACTION_USE, OBJECT_MCCOY, 15, 0}, &Room::love1UseMccoyOnReplicator },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x23, 0}, &Room::love1UseMccoyOnReplicator },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love1MccoyReachedReplicator },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love1MccoyUsedReplicator },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love1ChamberClosed },
+	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love1ChamberOpened },
+	{ {ACTION_USE, 0xff, 12, 0}, &Room::love1UseAnythingOnChamber },
+	{ {ACTION_USE, OBJECT_IDISHES, 12, 0}, &Room::love1UseDishesOnChamber },
+	{ {ACTION_USE, OBJECT_IDISHES, 0x23, 0}, &Room::love1UseDishesOnChamber },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love1KirkReachedChamberToPut },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love1ChamberOpenedForDish },
+	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love1KirkPutDishInChamber },
+	{ {ACTION_USE, OBJECT_IINSULAT, 0x21, 0}, &Room::love1UseInsulationOnDistillator },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love1KirkReachedDistillator },
+	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::love1KirkGotPolyberylcarbonate },
+	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::love1UseKirkOnFreezer },
+	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love1UseKirkOnFreezer },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::love1UseRedshirtOnFreezer },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 11, 0}, &Room::love1UseRedshirtOnFreezer },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::love1UseSpockOnFreezer },
+	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::love1UseSpockOnFreezer },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0}, &Room::love1UseMccoyOnFreezer },
+	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::love1UseMccoyOnFreezer },
+	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love1CrewmanReachedFreezer },
+	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0}, &Room::love1CrewmanOpenedOrClosedFreezer },
+	{ {ACTION_USE, 0xff, 0x22, 0}, &Room::love1UseAnythingOnFreezer },
+	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love1ReachedFreezerWithArbitraryItem },
+	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnFreezer },
+	{ {ACTION_USE, 0xff, 0x23, 0}, &Room::love1UseAnythingOnReplicator },
+	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love1ReachedReplicatorWithArbitraryItem },
+	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnReplicator },
+	{ {ACTION_USE, 0xff, 0x21, 0}, &Room::love1UseAnythingOnDistillator },
+	{ {ACTION_FINISHED_WALKING, 13, 0, 0}, &Room::love1ReachedDistillatorWithArbitraryItem },
+	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::love1FinishedUsingArbitraryItemOnDistillator },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love1UseKirkOnLadder },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love1UseSpockOnLadder },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love1UseMccoyOnLadder },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love1UseRedshirtOnLadder },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love1CrewmanReachedLadder },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love1CrewmanDiedFromPhaser },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love1TouchedHotspot0 },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love1Tick1() {
 	playVoc("LOV1LOOP");
 
diff --git a/engines/startrek/rooms/love2.cpp b/engines/startrek/rooms/love2.cpp
index 913cf5b142..395fac045d 100644
--- a/engines/startrek/rooms/love2.cpp
+++ b/engines/startrek/rooms/love2.cpp
@@ -44,6 +44,139 @@
 
 namespace StarTrek {
 
+extern const RoomAction love2ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love2Tick1 },
+	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love2TouchedWarp1 },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love2Timer3Expired },
+	{ {ACTION_WALK, 10, 0, 0}, &Room::love2WalkToDoor },
+	{ {ACTION_WALK, 0x22, 0, 0}, &Room::love2WalkToDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love2TouchedHotspot0 },
+	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love2DoorReachedOrOpened },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love2DoorReachedOrOpened },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::love2LookAtCabinet },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::love2LookAtDoor },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love2LookAtSynthesizer },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love2LookAtAnywhere },
+	{ {ACTION_LOOK, 14, 0, 0}, &Room::love2LookAtAntigrav },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love2LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love2LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love2LookAtRedshirt },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love2LookAtKirk },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love2LookAtArdak },
+	{ {ACTION_LOOK, 15, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 16, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 18, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 19, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 17, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::love2LookAtChamber },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::love2LookAtCan1 },
+	{ {ACTION_LOOK, 13, 0, 0}, &Room::love2LookAtCan2 },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love2TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love2TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love2TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love2TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love2UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love2UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love2UseKirkOnCabinet },
+	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love2UseSpockOnCabinet },
+	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love2UseMccoyOnCabinet },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love2UseRedshirtOnCabinet },
+	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love2CrewmanReachedCabinet },
+	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love2CrewmanAccessedCabinet },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love2CrewmanOpenedOrClosedCabinet },
+	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love2UseWrenchOnGasFeed },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love2ReachedGasFeed },
+	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love2ChangedGasFeed },
+	{ {ACTION_USE, OBJECT_IO2GAS, 0x23, 0}, &Room::love2UseO2GasOnCanisterSlot },
+	{ {ACTION_USE, OBJECT_IH2GAS, 0x23, 0}, &Room::love2UseH2GasOnCanisterSlot },
+	{ {ACTION_USE, OBJECT_IN2GAS, 0x23, 0}, &Room::love2UseN2GasOnCanisterSlot },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love2ReachedCanisterSlot },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love2PutCanisterInSlot1 },
+	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love2PutCanisterInSlot2 },
+	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love2UseAntigravOnCanister1 },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love2ReachedCanisterSlot1ToGet },
+	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::love2TookCanister1 },
+	{ {ACTION_USE, OBJECT_IANTIGRA, 13, 0}, &Room::love2UseAntigravOnCanister2 },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love2ReachedCanisterSlot2ToGet },
+	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0}, &Room::love2TookCanister2 },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love2UseKirkOnSynthesizer },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love2UseSpockOnSynthesizer },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love2UseMccoyOnSynthesizer },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love2UseRedshirtOnSynthesizer },
+	{ {ACTION_FINISHED_WALKING, 13, 0, 0}, &Room::love2CrewmanReachedSynthesizer },
+	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::love2CrewmanUsedSynthesizer },
+	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::love2SpockReachedGasFeeds },
+	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::love2SpockEnabledGasFeeds },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love2SynthesizerDoorClosed },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love2SynthesizerFinished },
+	{ {ACTION_FINISHED_ANIMATION, 27, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingRLG },
+	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love2ClosedSynthesizerDoorMakingCure },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love2CureStartedSynthesizing },
+	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love2CureSynthesized },
+	{ {ACTION_USE, OBJECT_IPBC, 9, 0}, &Room::love2UsePolyberylcarbonateOnSynthesizerDoor },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love2KirkReachedSynthesizerWithPolyberylcarbonate },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love2SynthesizerDoorOpenedWithPolyberylcarbonate },
+	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::love2PutPolyberylcarbonateInSynthesizer },
+
+	{ {ACTION_USE, OBJECT_IDISHES, 9, 0}, &Room::love2UseVirusSampleOnSynthesizerDoor },
+	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love2KirkReachedSynthesizerWithVirusSample },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love2SynthesizerDoorOpenedWithVirusSample },
+	{ {ACTION_FINISHED_ANIMATION, 20, 0, 0}, &Room::love2PutVirusSampleInSynthesizer },
+
+	{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0}, &Room::love2UseCureSampleOnSynthesizerDoor },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love2KirkReachedSynthesizerWithCureSample },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love2SynthesizerDoorOpenedWithCureSample },
+	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::love2PutCureSampleInSynthesizer },
+
+	{ {ACTION_USE, 0xff, 9, 0}, &Room::love2UseAnythingOnSynthesizerDoor },
+	{ {ACTION_USE, 0xff, 0x20, 0}, &Room::love2UseAnythingOnSynthesizer },
+	{ {ACTION_GET, 13, 0, 0}, &Room::love2GetCanister },
+	{ {ACTION_GET, 12, 0, 0}, &Room::love2GetCanister },
+
+	{ {ACTION_GET, 14, 0, 0}, &Room::love2GetAntigrav },
+	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love2ReachedAntigrav },
+	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::love2GotAntigrav },
+
+	{ {ACTION_GET, 16, 0, 0}, &Room::love2GetPolyberylcarbonate },
+	{ {ACTION_FINISHED_WALKING, 18, 0, 0}, &Room::love2ReachedPolyberylcarbonate },
+	{ {ACTION_FINISHED_ANIMATION, 26, 0, 0}, &Room::love2GotPolyberylcarbonate },
+
+	{ {ACTION_GET, 17, 0, 0}, &Room::love2GetDishes },
+	{ {ACTION_FINISHED_WALKING, 17, 0, 0}, &Room::love2ReachedDishes },
+	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::love2GotDishes },
+
+	{ {ACTION_GET, 18, 0, 0}, &Room::love2GetSample },
+	{ {ACTION_FINISHED_WALKING, 19, 0, 0}, &Room::love2ReachedSample },
+	{ {ACTION_FINISHED_ANIMATION, 28, 0, 0}, &Room::love2GotSample },
+
+	{ {ACTION_GET, 15, 0, 0}, &Room::love2GetSynthesizerOutput },
+	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love2ReachedSynthesizerOutput },
+	{ {ACTION_FINISHED_ANIMATION, 23, 0, 0}, &Room::love2GotSynthesizerOutput },
+
+	{ {ACTION_GET, 19, 0, 0}, &Room::love2GetCure },
+	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love2ReachedCure },
+	{ {ACTION_FINISHED_ANIMATION, 24, 0, 0}, &Room::love2GotCure },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love2Tick1() {
 	playVoc("LOV2LOOP");
 
diff --git a/engines/startrek/rooms/love3.cpp b/engines/startrek/rooms/love3.cpp
index bf1b97f930..fe7871efbd 100644
--- a/engines/startrek/rooms/love3.cpp
+++ b/engines/startrek/rooms/love3.cpp
@@ -35,6 +35,130 @@
 
 namespace StarTrek {
 
+extern const RoomAction love3ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love3Tick1 },
+	{ {ACTION_TICK, 80, 0, 0}, &Room::love3Tick80 },
+	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love3TouchedWarp1 },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0}, &Room::love3Timer3Expired },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::love3LookAtServicePanel },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love3LookAtMonitor },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::love3LookAtWrench },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love3LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love3LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love3LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love3LookAtRedshirt },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love3LookAnywhere },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::love3LookAtShaft },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::love3LookAtGrate },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::love3LookAtPanel },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love3LookAtPanel },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::love3LookAtGasTank },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::love3LookAtTurbines },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love3TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love3TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love3TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love3TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love3UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::love3UseSTricorderOnTurbines },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 9, 0}, &Room::love3UseSTricorderOnInsulation },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love3UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_KIRK, 8, 0}, &Room::love3UseKirkOnServicePanel },
+	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::love3UseSpockOnServicePanel },
+	{ {ACTION_USE, OBJECT_MCCOY, 8, 0}, &Room::love3UseMccoyOnServicePanel },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0}, &Room::love3UseRedshirtOnServicePanel },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love3CrewmanReachedServicePanel },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love3OpenedOrClosedServicePanel },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, 12, 0}, &Room::love3UseWrenchOnGasTank },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love3ReachedGasTankToUnscrew },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love3ScrewedOrUnscrewedGasTank },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IO2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
+	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IH2GAS, 0}, &Room::love3UseWrenchOnO2OrH2Gas },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, OBJECT_IN2GAS, 0}, &Room::love3UseWrenchOnN2Gas },
+	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::love3ReachedGasTankToPutDown },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love3PutN2TankBack },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, 0x20, 0}, &Room::love3UseWrenchOnEngineeringPanel },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::love3ReachedEngineeringPanel },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love3OpenedEngineeringPanel },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, 0x21, 0}, &Room::love3UseWrenchOnMonitor },
+
+	{ {ACTION_USE, OBJECT_IH2O, 0x21, 0}, &Room::love3UseWaterOnMonitor },
+	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::love3ReachedMonitorToUseWater },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love3PouredWaterOnMonitor },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 11, 0}, &Room::love3UseCrewmanOnEngineeringPanelOrGrate },
+
+	{ {ACTION_USE, OBJECT_IWRENCH, 11, 0}, &Room::love3UseWrenchOnGrate },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love3ReachedGateWithWrench },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::love3OpenedOrClosedGrate },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::love3UseCrewmanOnShaft },
+
+	{ {ACTION_USE, OBJECT_IH2O, 0x22, 0}, &Room::love3UseWaterOnShaft },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love3ReachedShaftUsingWater },
+	{ {ACTION_FINISHED_ANIMATION, 8, 0, 0}, &Room::love3PouredWaterDownShaft },
+
+	{ {ACTION_USE, OBJECT_IN2O, 0x22, 0}, &Room::love3UseNitrousOxideOnShaft },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love3ReachedShaftUsingNitrousOxide },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::love3PouredNitrousOxideDownShaft },
+
+	{ {ACTION_USE, OBJECT_INH3, 0x22, 0}, &Room::love3UseAmmoniaOnShaft },
+	{ {ACTION_FINISHED_WALKING, 7, 0, 0}, &Room::love3ReachedShaftUsingAmmonia },
+	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::love3PouredAmmoniaDownShaft },
+
+	{ {ACTION_USE, OBJECT_IRLG, 0x22, 0}, &Room::love3UseRomulanLaughingGasOnShaft },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::love3ReachedShaftUsingRomulanLaughingGas },
+	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::love3PouredRomulanLaughingGasDownShaft },
+
+	{ {ACTION_GET, 10, 0, 0}, &Room::love3GetWrench },
+	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::love3ReachedWrenchToGet },
+	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::love3PickedUpWrench },
+
+	{ {ACTION_GET, 12, 0, 0}, &Room::love3GetGasTank },
+	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::love3ReachedGasTankToGet },
+
+	{ {ACTION_USE, OBJECT_IANTIGRA, 12, 0}, &Room::love3UseAntigravOnGasTank },
+	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::love3ReachedGasTankUsingAntigrav },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::love3PickedUpGasTank },
+
+	{ {ACTION_GET, 9, 0, 0}, &Room::love3GetInsulation },
+	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::love3ReachedInsulationToGet },
+	{ {ACTION_FINISHED_ANIMATION, 14, 0, 0}, &Room::love3PickedUpInsulation },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love3Tick1() {
 	playVoc("LOV3LOOP");
 
diff --git a/engines/startrek/rooms/love4.cpp b/engines/startrek/rooms/love4.cpp
index 9d48dab3ed..d9c4b0ab9c 100644
--- a/engines/startrek/rooms/love4.cpp
+++ b/engines/startrek/rooms/love4.cpp
@@ -33,6 +33,99 @@
 
 namespace StarTrek {
 
+extern const RoomAction love4ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love4Tick1 },
+	{ {ACTION_TICK, 10, 0, 0}, &Room::love4Tick10 },
+
+	{ {ACTION_WALK, 8, 0, 0}, &Room::love4WalkToDoor },
+	{ {ACTION_WALK, 0x20, 0, 0}, &Room::love4WalkToDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::love4TouchedHotspot0 },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::love4DoorOpenedOrReached },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::love4DoorOpenedOrReached },
+
+	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0}, &Room::love4UseKirkOnLadder },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::love4ReachedLadder },
+	{ {ACTION_USE, OBJECT_IPHASERS,  9, 0}, &Room::love4UseStunPhaserOnRomulan },
+	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::love4UseStunPhaserOnRomulan },
+	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::love4UseStunPhaserOnRomulan },
+	{ {ACTION_USE, OBJECT_IPHASERS, 12, 0}, &Room::love4UseStunPhaserOnRomulan },
+	// NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit.
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love4LookAnywhere },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love4LookAtLadder },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::love4LookAtDoor },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love4LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love4LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love4LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love4LookAtRedshirt },
+	{ {ACTION_LOOK,  9, 0, 0}, &Room::love4LookAtRomulan },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::love4LookAtRomulan },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::love4LookAtRomulan },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::love4LookAtRomulan },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love4TalkToKirk },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love4TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love4TalkToRedshirt },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love4TalkToSpock },
+	{ {ACTION_TALK,  9, 0, 0}, &Room::love4TalkToRomulan },
+	{ {ACTION_TALK, 10, 0, 0}, &Room::love4TalkToRomulan },
+	{ {ACTION_TALK, 11, 0, 0}, &Room::love4TalkToRomulan },
+	{ {ACTION_TALK, 12, 0, 0}, &Room::love4TalkToRomulan },
+	{ {ACTION_USE, OBJECT_IMTRICOR,  9, 0}, &Room::love4UseMTricorderOnRomulan },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::love4UseMTricorderOnRomulan },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::love4UseMTricorderOnRomulan },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 12, 0}, &Room::love4UseMTricorderOnRomulan },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::love4UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love4UseSTricorderAnywhere },
+
+	{ {ACTION_USE, OBJECT_ICURE,  9, 0}, &Room::love4UseCureOnRomulan },
+	{ {ACTION_USE, OBJECT_ICURE, 10, 0}, &Room::love4UseCureOnRomulan },
+	{ {ACTION_USE, OBJECT_ICURE, 11, 0}, &Room::love4UseCureOnRomulan },
+	{ {ACTION_USE, OBJECT_ICURE, 12, 0}, &Room::love4UseCureOnRomulan },
+	{ {ACTION_FINISHED_WALKING,   3, 0, 0}, &Room::love4MccoyReachedRomulan4 },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love4MccoyCuredRomulan4 },
+	{ {ACTION_FINISHED_WALKING,   4, 0, 0}, &Room::love4MccoyReachedRomulan3 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love4MccoyCuredRomulan3 },
+	{ {ACTION_FINISHED_WALKING,   5, 0, 0}, &Room::love4MccoyReachedRomulan2 },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love4MccoyCuredRomulan2 },
+	{ {ACTION_FINISHED_WALKING,   6, 0, 0}, &Room::love4MccoyReachedRomulan1 },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love4MccoyCuredRomulan1 },
+
+	{ {ACTION_USE, OBJECT_IH2O,   9, 0}, &Room::love4UseWaterOnRomulan },
+	{ {ACTION_USE, OBJECT_IH2O,  10, 0}, &Room::love4UseWaterOnRomulan },
+	{ {ACTION_USE, OBJECT_IH2O,  11, 0}, &Room::love4UseWaterOnRomulan },
+	{ {ACTION_USE, OBJECT_IH2O,  12, 0}, &Room::love4UseWaterOnRomulan },
+	{ {ACTION_USE, OBJECT_IMEDKIT,  9, 0}, &Room::love4UseMedkitOnRomulan },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 10, 0}, &Room::love4UseMedkitOnRomulan },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 11, 0}, &Room::love4UseMedkitOnRomulan },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 12, 0}, &Room::love4UseMedkitOnRomulan },
+	{ {ACTION_USE, OBJECT_ISAMPLE,  9, 0}, &Room::love4UseCureSampleOnRomulan },
+	{ {ACTION_USE, OBJECT_ISAMPLE, 10, 0}, &Room::love4UseCureSampleOnRomulan },
+	{ {ACTION_USE, OBJECT_ISAMPLE, 11, 0}, &Room::love4UseCureSampleOnRomulan },
+	{ {ACTION_USE, OBJECT_ISAMPLE, 12, 0}, &Room::love4UseCureSampleOnRomulan },
+	{ {ACTION_USE, 0xff,  9, 0}, &Room::love4UseAnythingOnRomulan },
+	{ {ACTION_USE, 0xff, 10, 0}, &Room::love4UseAnythingOnRomulan },
+	{ {ACTION_USE, 0xff, 11, 0}, &Room::love4UseAnythingOnRomulan },
+	{ {ACTION_USE, 0xff, 12, 0}, &Room::love4UseAnythingOnRomulan },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love4Tick1() {
 	playVoc("LOV4LOOP");
 
diff --git a/engines/startrek/rooms/love5.cpp b/engines/startrek/rooms/love5.cpp
index 3575f92bcb..28feb041c2 100644
--- a/engines/startrek/rooms/love5.cpp
+++ b/engines/startrek/rooms/love5.cpp
@@ -32,6 +32,72 @@
 
 namespace StarTrek {
 
+extern const RoomAction love5ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::love5Tick1 },
+	{ {ACTION_TOUCHED_WARP, 1, 0, 0}, &Room::love5TouchedWarp1 },
+	{ {ACTION_TIMER_EXPIRED, 4, 0, 0}, &Room::love5Timer4Expired },
+	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::love5UseStunPhaserOnPreax },
+	// NOTE: nothing for OBJECT_IPHASERK. There's an unused audio file which might fit.
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::love5LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::love5LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::love5LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::love5LookAtRedshirt },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::love5LookAnywhere },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::love5LookAtDevice },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::love5LookAtConsole },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::love5LookAtDrMarcus },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::love5LookAtDrCheever },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::love5LookAtPreax },
+	{ {ACTION_TALK, 9, 0, 0}, &Room::love5TalkToPreax },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::love5MccoyReachedSpockToCure },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::love5MccoyCuredSpock },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::love5CrewmanReachedBeamoutPosition },
+	{ {ACTION_TALK, 10, 0, 0}, &Room::love5TalkToDrMarcus },
+	{ {ACTION_TALK, 11, 0, 0}, &Room::love5TalkToDrCheever },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::love5TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::love5TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::love5TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::love5TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::love5UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::love5UseSTricorderOnDevice },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 11, 0}, &Room::love5UseMTricorderOnMarcusOrCheever },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::love5UseMTricorderOnPreax },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 9, 0}, &Room::love5UseMedkitOnPreax },
+	{ {ACTION_USE, OBJECT_IH2O, 9, 0}, &Room::love5UseWaterOnPreax },
+	{ {ACTION_USE, OBJECT_ISAMPLE, 9, 0}, &Room::love5UseCureSampleOnPreax },
+	{ {ACTION_USE, OBJECT_ICURE, 9, 0}, &Room::love5UseCureOnPreax },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0}, &Room::love5ReachedPreaxUsingCure },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::love5CuredPreax },
+	{ {ACTION_USE, 0xff, 9, 0}, &Room::love5UseAnythingOnPreax },
+	{ {ACTION_USE, OBJECT_KIRK, 10, 0}, &Room::love5UseKirkOnMarcusOrCheever },
+	{ {ACTION_USE, OBJECT_KIRK, 11, 0}, &Room::love5UseKirkOnMarcusOrCheever },
+	{ {ACTION_FINISHED_WALKING,   1, 0, 0}, &Room::love5KirkReachedCheever },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::love5KirkUntiedCheever },
+	{ {ACTION_FINISHED_WALKING,   2, 0, 0}, &Room::love5KirkReachedMarcus },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::love5KirkUntiedMarcus },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::love5MarcusStoodUp },
+
+	// Common code
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::loveaTimer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::loveaTimer1Expired },
+	{ {ACTION_USE, OBJECT_IMEDKIT, OBJECT_SPOCK, 0}, &Room::loveaUseMedkitOnSpock },
+	{ {ACTION_USE, OBJECT_ISAMPLE, OBJECT_SPOCK, 0}, &Room::loveaUseCureSampleOnSpock },
+	{ {ACTION_USE, OBJECT_ICURE, OBJECT_SPOCK, 0}, &Room::loveaUseCureOnSpock },
+	{ {ACTION_FINISHED_WALKING,   99, 0, 0}, &Room::loveaSpockOrMccoyInPositionToUseCure },
+	{ {ACTION_FINISHED_ANIMATION, 99, 0, 0}, &Room::loveaFinishedCuringSpock },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::loveaTimer2Expired },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK, 0}, &Room::loveaUseMTricorderOnSpock },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_KIRK, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::loveaUseMTricorderOnHuman },
+	{ {ACTION_USE, OBJECT_IRLG, 0xff, 0}, &Room::loveaUseRomulanLaughingGas },
+	{ {ACTION_USE, OBJECT_IN2O, 0xff, 0}, &Room::loveaUseHumanLaughingGas },
+	{ {ACTION_USE, OBJECT_INH3, 0xff, 0}, &Room::loveaUseAmmonia },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::loveaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::love5Tick1() {
 	playVoc("LOV5LOOP");
 
diff --git a/engines/startrek/rooms/mudd0.cpp b/engines/startrek/rooms/mudd0.cpp
index 9987a784f9..14f2fc5ef4 100644
--- a/engines/startrek/rooms/mudd0.cpp
+++ b/engines/startrek/rooms/mudd0.cpp
@@ -39,6 +39,57 @@
 
 namespace StarTrek {
 
+extern const RoomAction mudd0ActionList[] = {
+	{ {ACTION_TICK,  1, 0, 0}, &Room::mudd0Tick1 },
+	{ {ACTION_TICK, 50, 0, 0}, &Room::mudd0Tick50 },
+	{ {ACTION_TICK, 60, 0, 0}, &Room::mudd0Tick60 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::mudd0UsePhaserOnMudd },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::mudd0UsePhaserOnMudd },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::mudd0UseCommunicator },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd0LookAtFoodBox },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd0LookAtComponentBox },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::mudd0LookAnywhere },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd0LookAtMemoryDiskBox },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd0LookAtDegrimerBox },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd0LookAtLense },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::mudd0UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::mudd0UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd0UseSTricorderOnMemoryDiskBox },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd0UseSTricorderOnDegrimerBox },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::mudd0UseMTricorderOnLense },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+
+	{ {ACTION_GET, 0x21, 0, 0}, &Room::mudd0GetLense },
+	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd0GetMemoryDisk },
+	{ {ACTION_GET, 0x22, 0, 0}, &Room::mudd0GetDegrimer },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd0PickedUpLense },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd0PickedUpItem },
+	{ {ACTION_WALK, 0x26, 0, 0}, &Room::mudd0WalkToSouthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd0TouchedHotspot1 },
+	{ {ACTION_WALK, 0x25, 0, 0}, &Room::mudd0WalkToNorthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd0TouchedHotspot0 },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::mudd0UseMedkit },
+	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd0LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd0LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd0LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd0LookAtRedshirt },
+	{ {ACTION_LOOK, 8,               0, 0}, &Room::mudd0LookAtMudd },
+	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd0TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd0TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd0TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd0TalkToRedshirt },
+	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd0TalkToMudd },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::mudd0Tick1() {
 	playVoc("MUD0LOOP");
 
diff --git a/engines/startrek/rooms/mudd1.cpp b/engines/startrek/rooms/mudd1.cpp
index c84afac7d3..f2c61986a2 100644
--- a/engines/startrek/rooms/mudd1.cpp
+++ b/engines/startrek/rooms/mudd1.cpp
@@ -45,6 +45,69 @@
 
 namespace StarTrek {
 
+extern const RoomAction mudd1ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd1Tick1 },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd1Timer1Expired },
+
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd1UseCommunicator },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0},  &Room::mudd1UseSpockOnBlueButton },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0},   &Room::mudd1SpockReachedBlueButton },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd1SpockPressedBlueButton },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::mudd1CraneFinishedMoving },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x24, 0},  &Room::mudd1UseSpockOnYellowButton },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0},   &Room::mudd1SpockReachedYellowButton },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::mudd1SpockPressedYellowButton },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x25, 0},  &Room::mudd1UseSpockOnRedButton },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0},   &Room::mudd1SpockReachedRedButton },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::mudd1SpockPressedRedButton },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
+
+	{ {ACTION_GET, 9,    0, 0}, &Room::mudd1GetTorpedo },
+	{ {ACTION_GET, 0x21, 0, 0}, &Room::mudd1GetTorpedo },
+	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd1GetTorpedo },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd1UseSTricorderOnTorpedo },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 9,    0}, &Room::mudd1UseSTricorderOnTorpedo },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd1UseSTricorderOnTorpedo },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd1UseSTricorderOnTorpedoLauncher },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::mudd1UseSTricorderOnButton },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::mudd1UseSTricorderOnButton },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x24, 0}, &Room::mudd1UseSTricorderOnButton },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0},    &Room::mudd1UseSTricorderOnCrane },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},  &Room::mudd1UseMedkitAnywhere },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::mudd1LookAnywhere },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd1LookAtTorpedo },
+	{ {ACTION_LOOK, 9,    0, 0}, &Room::mudd1LookAtTorpedo },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd1LookAtFallenTorpedo },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd1LookAtTorpedoLauncher },
+	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd1LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd1LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd1LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd1LookAtRedshirt },
+	{ {ACTION_LOOK, 8,    0, 0}, &Room::mudd1LookAtCrane },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::mudd1LookAtRedButton },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd1LookAtBlueButton },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd1LookAtYellowButton },
+	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd1TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd1TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd1TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd1TalkToRedshirt },
+	{ {ACTION_WALK, 0x28, 0, 0}, &Room::mudd1WalkToSouthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 2, 0, 0}, &Room::mudd1TouchedHotspot2 },
+	{ {ACTION_WALK, 0x27, 0, 0}, &Room::mudd1WalkToNorthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd1TouchedHotspot1 },
+	{ {ACTION_WALK, 0x26, 0, 0}, &Room::mudd1WalkToWestDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd1TouchedHotspot0 },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::mudd1Tick1() {
 	playVoc("MUD1LOOP"); // BUGFIX: moved this out of below if statement
 
diff --git a/engines/startrek/rooms/mudd2.cpp b/engines/startrek/rooms/mudd2.cpp
index 4387bd1826..99be04be24 100644
--- a/engines/startrek/rooms/mudd2.cpp
+++ b/engines/startrek/rooms/mudd2.cpp
@@ -36,6 +36,73 @@
 
 namespace StarTrek {
 
+extern const RoomAction mudd2ActionList[] = {
+	{ {ACTION_WALK, 0x21, 0, 0}, &Room::mudd2WalkToNorthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd2TouchedHotspot0 },
+	{ {ACTION_WALK, 0x22, 0, 0}, &Room::mudd2WalkToSouthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0}, &Room::mudd2TouchedHotspot1 },
+	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd2Tick1 },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::mudd2Timer1Expired },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff,   0}, &Room::mudd2UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_SPOCK,    0x20, 0}, &Room::mudd2UseSpockOnCapsules },
+	{ {ACTION_GET, 0x20, 0, 0}, &Room::mudd2GetCapsules },
+	{ {ACTION_FINISHED_WALKING,   12, 0, 0}, &Room::mudd2MccoyReachedCapsules },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::mudd2MccoyPickedUpCapsules },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::mudd2UseCommunicator },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::muddaFiredAlienDevice },
+
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd2LookAtCapsules },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::mudd2UseMTricorderOnCapsules },
+	{ {ACTION_USE, OBJECT_ICAPSULE, 0x23, 0}, &Room::mudd2UseCapsuleOnControlPanel },
+	{ {ACTION_FINISHED_WALKING,   15, 0, 0},  &Room::mudd2MccoyReachedControlPanel },
+	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0},  &Room::mudd2MccoyPutCapsuleInControlPanel },
+	{ {ACTION_USE, OBJECT_KIRK, 0x24, 0},     &Room::mudd2UseKirkOnBed },
+	{ {ACTION_USE, OBJECT_KIRK, 0x25, 0},     &Room::mudd2UseKirkOnBed },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0},     &Room::mudd2KirkReachedBed },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0},   &Room::mudd2MuddNoticedKirk },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd2MuddDroppedCapsule },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0},    &Room::mudd2UsePhaserOnMudd },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0},    &Room::mudd2UsePhaserOnMudd },
+
+	{ {ACTION_USE, OBJECT_SPOCK, 8, 0},       &Room::mudd2UseSpockOnMudd },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0},     &Room::mudd2SpockReachedMudd },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0},   &Room::mudd2SpockPinchedMudd },
+	{ {ACTION_USE, OBJECT_KIRK, 8, 0},        &Room::mudd2UseKirkOnMudd },
+
+	{ {ACTION_USE, OBJECT_REDSHIRT, 8, 0},    &Room::mudd2UseRedshirtOnMudd },
+	{ {ACTION_FINISHED_WALKING, 16, 0, 0},    &Room::mudd2RedshirtReachedMudd },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd2Timer2Expired },
+	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0},  &Room::mudd2MuddFinishedPushingRedshirt },
+	{ {ACTION_FINISHED_ANIMATION, 16, 0, 0},  &Room::mudd2RedshirtPushedAway },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0},    &Room::mudd2UseMTricorderOnMudd },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0},     &Room::mudd2UseMedkitOnMudd },
+	{ {ACTION_USE, OBJECT_MCCOY, 8, 0},       &Room::mudd2UseMedkitOnMudd },
+	{ {ACTION_FINISHED_WALKING, 10, 0, 0},    &Room::mudd2MccoyReachedMudd },
+	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0},  &Room::mudd2MccoyCuredMudd },
+	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd2LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd2LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd2LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2LookAtRedshirt },
+	{ {ACTION_LOOK, 8,    0, 0}, &Room::mudd2LookAtMudd },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd2LookAtControlPanel },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::mudd2LookAtBed },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::mudd2LookAtBed },
+	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd2TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd2TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd2TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd2TalkToRedshirt },
+	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd2TalkToMudd },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::mudd2WalkToNorthDoor() {
 	_roomVar.mudd.walkingToDoor = true;
 	_awayMission->disableInput = true;
diff --git a/engines/startrek/rooms/mudd3.cpp b/engines/startrek/rooms/mudd3.cpp
index 6c524ced8a..6f8bc64a2a 100644
--- a/engines/startrek/rooms/mudd3.cpp
+++ b/engines/startrek/rooms/mudd3.cpp
@@ -36,6 +36,55 @@
 
 namespace StarTrek {
 
+extern const RoomAction mudd3ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd3Tick1 },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd3UseCommunicator },
+	{ {ACTION_LOOK, 0x20, 0, 0},              &Room::mudd3LookAtScreen },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd3UseSTricorderOnScreen },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0},     &Room::mudd3UseKirkOnScreen },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0},    &Room::mudd3UseSpockOnSphere },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd3Timer3Expired },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0},    &Room::mudd3UseMccoyOnSphere },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::mudd3UseRedshirtOnSphere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::mudd3UseMTricorderOnSphere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd3UseSTricorderOnSphere },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd3ReadyToHookUpTricorders },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd3Timer1Expired },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd3Timer2Expired },
+	{ {ACTION_TIMER_EXPIRED, 4, 0, 0},        &Room::mudd3Timer4Expired },
+	{ {ACTION_USE, OBJECT_IDISKS, 0x21, 0},   &Room::mudd3UseMemoryDiskOnSphere },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
+
+	{ {ACTION_GET, 13, 0, 0}, &Room::mudd3GetRepairTool },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0},   &Room::mudd3ReachedRepairTool },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::mudd3PickedUpRepairTool },
+	{ {ACTION_LOOK, 0x21, 0, 0},            &Room::mudd3LookAtSphere },
+	{ {ACTION_WALK, 0x22, 0, 0},            &Room::mudd3WalkToNorthDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0},    &Room::mudd3TouchedHotspot0 },
+	{ {ACTION_WALK, 0x23, 0, 0},            &Room::mudd3WalkToEastDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 1, 0, 0},    &Room::mudd3TouchedHotspot1 },
+	{ {ACTION_LOOK, OBJECT_KIRK,     0, 0}, &Room::mudd3LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK,    0, 0}, &Room::mudd3LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY,    0, 0}, &Room::mudd3LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd3LookAtRedshirt },
+	{ {ACTION_LOOK, 8,               0, 0}, &Room::mudd3LookAtMudd },
+	{ {ACTION_TALK, OBJECT_KIRK,     0, 0}, &Room::mudd3TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK,    0, 0}, &Room::mudd3TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY,    0, 0}, &Room::mudd3TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd3TalkToRedshirt },
+	{ {ACTION_TALK, 8,               0, 0}, &Room::mudd3TalkToMudd },
+	{ {ACTION_USE, OBJECT_IMEDKIT,  0xff, 0}, &Room::mudd3UseMedkit },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 // BUG-ish: trying to scan the sphere while someone is behind it causes it to scan that
 // object instead.
 
diff --git a/engines/startrek/rooms/mudd4.cpp b/engines/startrek/rooms/mudd4.cpp
index 232d6daf10..1a837f9b9c 100644
--- a/engines/startrek/rooms/mudd4.cpp
+++ b/engines/startrek/rooms/mudd4.cpp
@@ -36,6 +36,86 @@
 
 namespace StarTrek {
 
+extern const RoomAction mudd4ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd4Tick1 },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},    &Room::mudd4UseCommunicator },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd4Timer2Expired },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd4Timer3Expired },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0},    &Room::mudd4UseSpockOnLeftConsole },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0},    &Room::mudd4UseSpockOnLeftConsole },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x23, 0},    &Room::mudd4UseSpockOnRightConsole },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0},     &Room::mudd4SpockReachedChair },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0},   &Room::mudd4SpockSatInChair },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd4SpockUsedSensors },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0},   &Room::mudd4SpockUsedEngineering },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0},   &Room::mudd4SpockUsedNavigation },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0},     &Room::mudd4FinishedWalking3 },
+	{ {ACTION_USE, OBJECT_KIRK, 0x21, 0},     &Room::mudd4UseKirkOnRightConsole },
+	{ {ACTION_USE, OBJECT_KIRK, 0x23, 0},     &Room::mudd4UseKirkOnRightConsole },
+	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0},     &Room::mudd4UseKirkOnLeftConsole },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd4KirkReachedRightConsole },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0},   &Room::mudd4KirkSatInChair },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0},   &Room::mudd4KirkUsedViewScreen },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd4Timer1Expired },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0},   &Room::mudd4KirkUsedCommunications },
+	{ {ACTION_FINISHED_WALKING, 4, 0, 0},     &Room::mudd4KirkReachedPositionToTalkToMudd },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0},    &Room::mudd4UseMccoyOnConsole },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x22, 0},    &Room::mudd4UseMccoyOnConsole },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x23, 0},    &Room::mudd4UseMccoyOnConsole },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::mudd4UseRedshirtOnConsole },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::mudd4UseRedshirtOnConsole },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x23, 0}, &Room::mudd4UseRedshirtOnConsole },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 10, 0},   &Room::mudd4UseSTricorderOnRepairTool },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd4UseSTricorderOnConsole },
+
+	// ENHANCEMENT: Allow scanning the console to work when scanning the specific stations
+	// as well
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd4UseSTricorderOnConsole },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x23, 0}, &Room::mudd4UseSTricorderOnConsole },
+
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd4UseSTricorderOnViewscreen },
+
+	// ENHANCEMENT: Allow scanning the viewscreen when it's on, not just when off
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0},    &Room::mudd4UseSTricorderOnViewscreen },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},   &Room::mudd4UseMedkit },
+	{ {ACTION_GET, 10, 0, 0},                &Room::mudd4GetRepairTool },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0},    &Room::mudd4ReachedRepairTool },
+	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::mudd4PickedUpRepairTool },
+
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::mudd4LookAtConsole },
+	// ENHANCEMENT: Allow look action work with the specific stations as well
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::mudd4LookAtConsole },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::mudd4LookAtConsole },
+
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::mudd4LookAtViewscreen },
+	// ENHANCEMENT: Allow look action work when viewscreen is on, not just when off
+	{ {ACTION_LOOK, 8, 0, 0},    &Room::mudd4LookAtViewscreen },
+
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0},     &Room::mudd4LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0},    &Room::mudd4LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},    &Room::mudd4LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd4LookAtRedshirt },
+	{ {ACTION_LOOK, 10, 0, 0},              &Room::mudd4LookAtRepairTool },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0},     &Room::mudd4TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0},    &Room::mudd4TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0},    &Room::mudd4TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd4TalkToRedshirt },
+	{ {ACTION_WALK, 0x24, 0, 0},            &Room::mudd4WalkToEastDoor },
+	{ {ACTION_WALK, 0x25, 0, 0},            &Room::mudd4WalkToWestDoor },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0},    &Room::mudd4TouchedHotspot0 },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::mudd4Tick1() {
 	playVoc("MUD4LOOP");
 
diff --git a/engines/startrek/rooms/mudd5.cpp b/engines/startrek/rooms/mudd5.cpp
index 23080500ba..52e2d3defc 100644
--- a/engines/startrek/rooms/mudd5.cpp
+++ b/engines/startrek/rooms/mudd5.cpp
@@ -37,6 +37,53 @@ const int16 GENERATOR_Y = 0xb0;
 
 namespace StarTrek {
 
+extern const RoomAction mudd5ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::mudd5Tick1 },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0},        &Room::mudd5Timer1Expired },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0},        &Room::mudd5Timer2Expired },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0},      &Room::mudd5UseCommunicator },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0},   &Room::mudd5UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::mudd5UseSTricorderOnEngine },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x22, 0}, &Room::mudd5UseSTricorderOnCrane },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::mudd5UseSTricorderOnHatch },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 9,    0}, &Room::mudd5UseSTricorderOnLifeSupportGenerator },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x20, 0}, &Room::mudd5UseStunPhaserOnHatch },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x20, 0}, &Room::mudd5UseKillPhaserOnHatch },
+	{ {ACTION_USE, 0xff,            9,    0}, &Room::mudd5UseAnythingOnLifeSupportGenerator },
+	{ {ACTION_USE, OBJECT_IDOOVER,  9,    0}, &Room::mudd5UseDooverOnLifeSupportGenerator },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0},     &Room::mudd5KirkReachedLifeSupportGenerator },
+	{ {ACTION_TIMER_EXPIRED, 4, 0, 0},        &Room::mudd5KirkTimer4Expired },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0},   &Room::mudd5KirkRepairedLifeSupportGenerator },
+	{ {ACTION_TIMER_EXPIRED, 3, 0, 0},        &Room::mudd5KirkTimer3Expired },
+
+	// Common code (next 4 lines)
+	{ {ACTION_USE, OBJECT_ILENSES, OBJECT_IDEGRIME, 0}, &Room::muddaUseLenseOnDegrimer },
+	{ {ACTION_USE, OBJECT_IALIENDV, 0xff, 0}, &Room::muddaUseAlienDevice },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::muddaFiredAlienDevice },
+	{ {ACTION_USE, OBJECT_IDEGRIME, 0xff, 0}, &Room::muddaUseDegrimer },
+
+	{ {ACTION_LOOK, 0x20, 0, 0},         &Room::mudd5LookAtHatch },
+	{ {ACTION_LOOK, 9,    0, 0},         &Room::mudd5LookAtLifeSupportGenerator },
+	{ {ACTION_TOUCHED_HOTSPOT, 0, 0, 0}, &Room::mudd5TouchedHotspot0 },
+	{ {ACTION_WALK, 0x22, 0, 0},         &Room::mudd5WalkToDoor },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0},     &Room::mudd5LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0},    &Room::mudd5LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0},    &Room::mudd5LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd5LookAtRedshirt },
+	{ {ACTION_LOOK, 0x22, 0, 0},            &Room::mudd5LookAtDoor },
+	{ {ACTION_LOOK, 0x23, 0, 0},            &Room::mudd5LookAtCrane },
+	{ {ACTION_LOOK, 0x21, 0, 0},            &Room::mudd5LookAtEngine },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0},     &Room::mudd5TalkToKirk },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0},    &Room::mudd5TalkToSpock },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0},    &Room::mudd5TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::mudd5TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},  &Room::mudd5UseMedkit },
+
+	// Common code (countdown for losing atmosphere when life support malfunctioning)
+	{ {ACTION_TICK, 0xff, 0xff, 0xff},           &Room::muddaTick },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::mudd5Tick1() {
 	playVoc("MUD5LOOP");
 
diff --git a/engines/startrek/rooms/sins0.cpp b/engines/startrek/rooms/sins0.cpp
index 5b50896544..18db05b92e 100644
--- a/engines/startrek/rooms/sins0.cpp
+++ b/engines/startrek/rooms/sins0.cpp
@@ -72,12 +72,9 @@ extern const RoomAction sins0ActionList[] = {
 	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::sins0UseCommunicator },
 	{ {ACTION_WALK, HOTSPOT_DOOR,   0, 0}, &Room::sins0WalkToDoor },
 	{ {ACTION_WALK, OBJECT_DOOR,    0, 0}, &Room::sins0WalkToDoor },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-
-extern const int sins0NumActions = ARRAYSIZE(sins0ActionList);
-
-
 void Room::sins0Tick1() {
 	playVoc("SIN0LOOP");
 
diff --git a/engines/startrek/rooms/sins1.cpp b/engines/startrek/rooms/sins1.cpp
index 073837bc06..79e9a83b5f 100644
--- a/engines/startrek/rooms/sins1.cpp
+++ b/engines/startrek/rooms/sins1.cpp
@@ -84,11 +84,9 @@ extern const RoomAction sins1ActionList[] = {
 
 	{ {ACTION_WALK, HOTSPOT_DOOR, 0, 0}, &Room::sins1WalkToDoor },
 	{ {ACTION_WALK, OBJECT_DOOR,  0, 0}, &Room::sins1WalkToDoor },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int sins1NumActions = ARRAYSIZE(sins1ActionList);
-
-
 void Room::sins1Tick1() {
 	playVoc("SIN1LOOP");
 
diff --git a/engines/startrek/rooms/sins2.cpp b/engines/startrek/rooms/sins2.cpp
index 2d6fb5ad81..115a97e1ee 100644
--- a/engines/startrek/rooms/sins2.cpp
+++ b/engines/startrek/rooms/sins2.cpp
@@ -82,11 +82,9 @@ extern const RoomAction sins2ActionList[] = {
 
 	{ {ACTION_WALK, HOTSPOT_DOOR, 0, 0}, &Room::sins2WalkToDoor },
 	{ {ACTION_WALK, OBJECT_DOOR,  0, 0}, &Room::sins2WalkToDoor },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int sins2NumActions = ARRAYSIZE(sins2ActionList);
-
-
 void Room::sins2Tick1() {
 	playVoc("SIN2LOOP");
 	playMidiMusicTracks(MIDITRACK_27, -3);
diff --git a/engines/startrek/rooms/sins3.cpp b/engines/startrek/rooms/sins3.cpp
index 2704e111ed..efeb17edfe 100644
--- a/engines/startrek/rooms/sins3.cpp
+++ b/engines/startrek/rooms/sins3.cpp
@@ -120,11 +120,9 @@ extern const RoomAction sins3ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK,    0}, &Room::sins3UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY,    0}, &Room::sins3UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::sins3UseMTricorderOnCrewman },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int sins3NumActions = ARRAYSIZE(sins3ActionList);
-
-
 void Room::sins3Tick1() {
 	playVoc("SIN3LOOP");
 
diff --git a/engines/startrek/rooms/sins4.cpp b/engines/startrek/rooms/sins4.cpp
index fa765874c3..4c1f0d4586 100644
--- a/engines/startrek/rooms/sins4.cpp
+++ b/engines/startrek/rooms/sins4.cpp
@@ -90,11 +90,9 @@ extern const RoomAction sins4ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK,    0}, &Room::sins4UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY,    0}, &Room::sins4UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::sins4UseMTricorderOnCrewman },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int sins4NumActions = ARRAYSIZE(sins4ActionList);
-
-
 void Room::sins4Tick1() {
 	playVoc("SIN4LOOP");
 
diff --git a/engines/startrek/rooms/sins5.cpp b/engines/startrek/rooms/sins5.cpp
index 14446525f5..9aa3e1fca3 100644
--- a/engines/startrek/rooms/sins5.cpp
+++ b/engines/startrek/rooms/sins5.cpp
@@ -127,11 +127,9 @@ extern const RoomAction sins5ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_SPOCK,    0}, &Room::sins5UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_MCCOY,    0}, &Room::sins5UseMTricorderOnCrewman },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_REDSHIRT, 0}, &Room::sins5UseMTricorderOnCrewman },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int sins5NumActions = ARRAYSIZE(sins5ActionList);
-
-
 void Room::sins5Tick1() {
 	playVoc("SIN5LOOP");
 
diff --git a/engines/startrek/rooms/trial0.cpp b/engines/startrek/rooms/trial0.cpp
index e1d45e609e..afb36e936e 100644
--- a/engines/startrek/rooms/trial0.cpp
+++ b/engines/startrek/rooms/trial0.cpp
@@ -78,11 +78,9 @@ extern const RoomAction trial0ActionList[] = {
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_VLICT, 0}, &Room::trial0UseMccoyOnVlict },
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_GUARD, 0}, &Room::trial0UseMccoyOnGuard },
 	{ {ACTION_USE, OBJECT_IMEDKIT,  0xff, 0}, &Room::trial0UseMedkitAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial0NumActions = ARRAYSIZE(trial0ActionList);
-
-
 void Room::trial0Tick1() {
 	playVoc("TRI0LOOP");
 	_awayMission->timers[0] = getRandomWordInRange(180, 600);
diff --git a/engines/startrek/rooms/trial1.cpp b/engines/startrek/rooms/trial1.cpp
index 9163c1578b..9551b4b4b7 100644
--- a/engines/startrek/rooms/trial1.cpp
+++ b/engines/startrek/rooms/trial1.cpp
@@ -164,11 +164,9 @@ extern const RoomAction trial1ActionList[] = {
 	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_DOOR, 0}, &Room::trial1UsePhaserOnDoor },
 	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_DOOR, 0}, &Room::trial1UseSTricorderOnDoor },
 	{ {ACTION_WALK, OBJECT_DOOR, 0, 0},              &Room::trial1WalkToDoor },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial1NumActions = ARRAYSIZE(trial1ActionList);
-
-
 void Room::trial1Tick1() {
 	if (!_awayMission->trial.doorOpen) {
 		_awayMission->disableInput = 2;
diff --git a/engines/startrek/rooms/trial2.cpp b/engines/startrek/rooms/trial2.cpp
index e8d580c32c..dbf96ce480 100644
--- a/engines/startrek/rooms/trial2.cpp
+++ b/engines/startrek/rooms/trial2.cpp
@@ -118,11 +118,9 @@ extern const RoomAction trial2ActionList[] = {
 	{ {ACTION_USE, OBJECT_MCCOY, OBJECT_GLOB, 0}, &Room::trial2UseMccoyOnGlob },
 	{ {ACTION_USE, OBJECT_SPOCK, OBJECT_GLOB, 0}, &Room::trial2UseSpockOnGlob },
 	{ {ACTION_USE, OBJECT_REDSHIRT, OBJECT_GLOB, 0}, &Room::trial2UseRedshirtOnGlob },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial2NumActions = ARRAYSIZE(trial2ActionList);
-
-
 void Room::trial2Tick1() {
 	playVoc("NOOOLOOP");
 
diff --git a/engines/startrek/rooms/trial3.cpp b/engines/startrek/rooms/trial3.cpp
index 0c321bcba4..02a3e43c00 100644
--- a/engines/startrek/rooms/trial3.cpp
+++ b/engines/startrek/rooms/trial3.cpp
@@ -89,11 +89,9 @@ extern const RoomAction trial3ActionList[] = {
 	{ {ACTION_USE, OBJECT_REDSHIRT, HOTSPOT_WALL, 0},     &Room::trial3UseRedshirtOnWall },
 	{ {ACTION_WALK, HOTSPOT_EXIT, 0, 0},                  &Room::trial3WalkToExit },
 	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0},              &Room::trial3UseMedkitAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial3NumActions = ARRAYSIZE(trial3ActionList);
-
-
 void Room::trial3Tick1() {
 	playVoc("TRI3LOOP");
 
diff --git a/engines/startrek/rooms/trial4.cpp b/engines/startrek/rooms/trial4.cpp
index 5faeed10b5..f775da457e 100644
--- a/engines/startrek/rooms/trial4.cpp
+++ b/engines/startrek/rooms/trial4.cpp
@@ -31,11 +31,9 @@ namespace StarTrek {
 extern const RoomAction trial4ActionList[] = {
 	{ {ACTION_TICK, 1,  0, 0}, &Room::trial4Tick1 },
 	{ {ACTION_TICK, 60, 0, 0}, &Room::trial4Tick60 },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial4NumActions = ARRAYSIZE(trial4ActionList);
-
-
 void Room::trial4Tick1() {
 	playVoc("TRI4LOOP");
 
diff --git a/engines/startrek/rooms/trial5.cpp b/engines/startrek/rooms/trial5.cpp
index 85761368fd..7163247a8c 100644
--- a/engines/startrek/rooms/trial5.cpp
+++ b/engines/startrek/rooms/trial5.cpp
@@ -158,11 +158,9 @@ extern const RoomAction trial5ActionList[] = {
 	{ {ACTION_USE, OBJECT_IBLUGEM3, HOTSPOT_HOLE3, 0}, &Room::trial5UseBlueGem3OnHole3 },
 
 	{ {ACTION_USE, OBJECT_IMEDKIT, 0xff, 0}, &Room::trial5UseMedkitAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int trial5NumActions = ARRAYSIZE(trial5ActionList);
-
-
 void Room::trial5Tick1() {
 	playVoc("TRI5LOOP");
 	playMidiMusicTracks(MIDITRACK_31, -1);
diff --git a/engines/startrek/rooms/tug0.cpp b/engines/startrek/rooms/tug0.cpp
index 912b44e703..70049b71a5 100644
--- a/engines/startrek/rooms/tug0.cpp
+++ b/engines/startrek/rooms/tug0.cpp
@@ -24,6 +24,82 @@
 
 namespace StarTrek {
 
+extern const RoomAction tug0ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::tug0Tick1 },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug0LookAtEngineer },
+	{ {ACTION_GET, 8, 0, 0}, &Room::tug0GetEngineer },
+
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug0LookAtControls },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug0LookAtControls },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::tug0UseSpockOnControls },
+	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::tug0SpockReachedControlsToExamine },
+	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::tug0SpockExaminedControls },
+	{ {ACTION_USE, OBJECT_IRT, 0x21, 0}, &Room::tug0UseTransmogrifierWithoutBitOnControls },
+	{ {ACTION_USE, OBJECT_IRTWB, 0x21, 0}, &Room::tug0UseTransmogrifierWithBitOnControls },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug0SpockReachedControlsWithTransmogrifier },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug0SpockFinishedUsingTransmogrifier },
+	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::tug0TransporterScreenFullyLit },
+	{ {ACTION_USE, OBJECT_IWIRSCRP, 0x21, 0}, &Room::tug0UseWireScrapsOnControls },
+	{ {ACTION_USE, OBJECT_IWIRING, 0x21, 0}, &Room::tug0UseWireOnControls },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug0SpockReachedControlsWithWire },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::tug0SpockFinishedUsingWire },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0}, &Room::tug0UseMedkitOnEngineer },
+	{ {ACTION_FINISHED_WALKING, 2, 0, 0}, &Room::tug0MccoyReachedEngineer },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug0MccoyHealedEngineer },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::tug0EngineerGotUp },
+	{ {ACTION_GET, 9, 0, 0}, &Room::tug0GetTransmogrifier },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::tug0KirkReachedToolbox },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug0KirkGotTransmogrifier },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug0LookAtToolbox },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug0UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug0UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug0UseWelderOnWireScraps },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug0UseWelderOnMetalScraps },
+	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug0UseCombBitOnTransmogrifier },
+
+	{ {ACTION_USE, OBJECT_SPOCK, 11, 0}, &Room::tug0UseTransporter },
+	{ {ACTION_USE, OBJECT_KIRK, 0x22, 0}, &Room::tug0UseTransporter },
+	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::tug0SpockReachedControlsToTransport },
+	{ {ACTION_FINISHED_ANIMATION, 18, 0, 0}, &Room::tug0SpockPreparedTransporter },
+	{ {ACTION_FINISHED_WALKING, 20, 0, 0}, &Room::tug0SpockReachedTransporter },
+	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::tug0FinishedTransporting },
+
+	{ {ACTION_USE, OBJECT_IBOMB, 0x22, 0}, &Room::tug0UseBombOnTransporter },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::tug0KirkReachedTransporter },
+	{ {ACTION_FINISHED_ANIMATION, 10, 0, 0}, &Room::tug0KirkPlacedBomb },
+	{ {ACTION_FINISHED_WALKING, 15, 0, 0}, &Room::tug0SpockReachedControlsForBomb },
+	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::tug0SpockBeginsBeamingBomb },
+	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::tug0SpockFinishesBeamingBomb },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug0BombExploded },
+
+	{ {ACTION_USE, OBJECT_MCCOY, 0x21, 0}, &Room::tug0UseMTricorderOnControls },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::tug0UseMTricorderOnControls },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::tug0UseSTricorderOnControls },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::tug0UseMTricorderOnEngineer },
+	{ {ACTION_FINISHED_WALKING, 24, 0, 0}, &Room::tug0MccoyReachedEngineerToScan },
+	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::tug0MccoyFinishedScanningEngineer },
+	{ {ACTION_USE, OBJECT_SPOCK, 8, 0}, &Room::tug0UseSTricorderOnEngineer },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::tug0UseSTricorderOnEngineer },
+	{ {ACTION_WALK, 0x23, 0, 0}, &Room::tug0WalkToDoor },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::tug0LookAtKirk },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug0LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug0LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug0LookAtRedshirt },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::tug0LookAtTransporter },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::tug0LookAtDoor },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug0TalkToKirk },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug0TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug0TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug0TalkToRedshirt },
+	{ {ACTION_TALK, 8, 0, 0}, &Room::tug0TalkToEngineer },
+	{ {ACTION_USE, OBJECT_ICOMM, 0, 0}, &Room::tug0UseCommunicator },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug0LookAnywhere },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::tug0UseSTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::tug0UseMTricorderAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::tug0Tick1() {
 	playVoc("TUG0LOOP");
 	playMidiMusicTracks(0, -1);
diff --git a/engines/startrek/rooms/tug1.cpp b/engines/startrek/rooms/tug1.cpp
index aa9a808d85..35efce1b0f 100644
--- a/engines/startrek/rooms/tug1.cpp
+++ b/engines/startrek/rooms/tug1.cpp
@@ -33,6 +33,69 @@ namespace StarTrek {
 #define HOTSPOT_DEBRIS     0x24
 #define HOTSPOT_BRIGDOOR   0x25
 
+extern const RoomAction tug1ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::tug1Tick1 },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0xff, 0}, &Room::tug1UseSTricorderOnAnything },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug1LookAtBridgeDoor },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x21, 0}, &Room::tug1UseSTricorderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0x21, 0}, &Room::tug1UsePhaserOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0x21, 0}, &Room::tug1UsePhaserOnBridgeDoor },
+	{ {ACTION_FINISHED_WALKING, 3, 0, 0}, &Room::tug1KirkReachedFiringPosition },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug1KirkPulledOutPhaser },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::tug1KirkFinishedFiringPhaser },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug1TalkToSpock },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 8, 0}, &Room::tug1UseSTricorderOnJunkPile },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug1LookAtJunkPile },
+	{ {ACTION_GET, 8, 0, 0}, &Room::tug1GetJunkPile },
+	{ {ACTION_FINISHED_WALKING, 1, 0, 0}, &Room::tug1KirkReachedJunkPile },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::tug1KirkFinishedTakingJunkPile },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug1UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug1UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug1UseWelderOnWireScraps },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug1UseWelderOnMetalScraps },
+	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug1UseCombBitOnTransmogrifier },
+
+	{ {ACTION_USE, OBJECT_IPWF, 0x22, 0}, &Room::tug1UsePhaserWelderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IPWF, 0x21, 0}, &Room::tug1UsePhaserWelderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IPWF, 0x20, 0}, &Room::tug1UsePhaserWelderOnBridgeDoorInLeftSpot },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug1KirkReachedBridgeDoorWithWelder },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug1KirkFinishedUsingWelder },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug1KirkReachedBridgeDoorWithWelderInLeftSpot },
+	{ {ACTION_FINISHED_ANIMATION, 9, 0, 0}, &Room::tug1KirkFinishedUsingWelderInLeftSpot },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug1LookAnywhere },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug1LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug1LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug1LookAtRedshirt },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug1TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug1TalkToRedshirt },
+	{ {ACTION_LOOK, 0x23, 0, 0}, &Room::tug1LookAtTerminal },
+	{ {ACTION_LOOK, 0x24, 0, 0}, &Room::tug1LookAtDebris },
+	{ {ACTION_LOOK, 0x25, 0, 0}, &Room::tug1LookAtBrigDoor },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x25, 0}, &Room::tug1UseSTricorderOnBrigDoor },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug1TalkToKirk },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::tug1UseCommunicator },
+	{ {ACTION_WALK, 0x21, 0, 0}, &Room::tug1WalkToBridgeDoor },
+	{ {ACTION_FINISHED_WALKING, 10, 0, 0}, &Room::tug1KirkReachedBridgeDoor },
+	{ {ACTION_FINISHED_ANIMATION, 11, 0, 0}, &Room::tug1BridgeDoorOpened },
+	{ {ACTION_WALK, 0x25, 0, 0}, &Room::tug1WalkToBrigDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0xff, 0}, &Room::tug1UseMTricorderAnywhere },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x21, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x20, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::tug1UseMTricorderOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x25, 0}, &Room::tug1UseMTricorderOnBrigDoor },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::tug1UseSpockOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x21, 0}, &Room::tug1UseSpockOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x22, 0}, &Room::tug1UseSpockOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x21, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x22, 0}, &Room::tug1UseRedshirtOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0x20, 0}, &Room::tug1UseMedkitOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0x21, 0}, &Room::tug1UseMedkitOnBridgeDoor },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 0x22, 0}, &Room::tug1UseMedkitOnBridgeDoor },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::tug1Tick1() {
 	playVoc("TUG1LOOP");
 
diff --git a/engines/startrek/rooms/tug2.cpp b/engines/startrek/rooms/tug2.cpp
index b3cabaee3b..662577535d 100644
--- a/engines/startrek/rooms/tug2.cpp
+++ b/engines/startrek/rooms/tug2.cpp
@@ -40,6 +40,98 @@ namespace StarTrek {
 #define GUARDSTAT_DEAD 2
 #define GUARDSTAT_TIED 8
 
+extern const RoomAction tug2ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::tug2Tick1 },
+	{ {ACTION_TICK, 60, 0, 0}, &Room::tug2Tick60 },
+	{ {ACTION_LOOK, 0x20, 0, 0}, &Room::tug2LookAtButton },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug2LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug2LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug2LookAtRedshirt },
+	{ {ACTION_GET, 11, 0, 0}, &Room::tug2GetBomb },
+	{ {ACTION_FINISHED_WALKING, 12, 0, 0}, &Room::tug2KirkReachedBomb },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug2KirkGotBomb },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug2LookAtBomb },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug2LookAtGuard1 },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug2LookAtGuard2 },
+	{ {ACTION_LOOK, 12, 0, 0}, &Room::tug2LookAtWires },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 12, 0}, &Room::tug2UseSTricorderOnButton },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 0x20, 0}, &Room::tug2UseSTricorderOnButton },
+	{ {ACTION_USE, OBJECT_MCCOY, 12, 0}, &Room::tug2UseMccoyOnWires },
+	{ {ACTION_USE, OBJECT_MCCOY, 11, 0}, &Room::tug2UseMccoyOnBomb },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 12, 0}, &Room::tug2UseRedshirtOnWires },
+	{ {ACTION_FINISHED_WALKING, 6, 0, 0}, &Room::tug2RedshirtReachedWires },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug2RedshirtDefusedBomb },
+	{ {ACTION_FINISHED_WALKING, 8, 0, 0}, &Room::tug2RedshirtReturnedToPosition },
+	{ {ACTION_USE, OBJECT_KIRK, 12, 0}, &Room::tug2UseKirkOnWires },
+	{ {ACTION_FINISHED_WALKING, 5, 0, 0}, &Room::tug2KirkReachedWires },
+	{ {ACTION_USE, OBJECT_SPOCK, 12, 0}, &Room::tug2UseSpockOnWires },
+	{ {ACTION_FINISHED_WALKING, 9, 0, 0}, &Room::tug2SpockReachedWires },
+	{ {ACTION_FINISHED_WALKING, 11, 0, 0}, &Room::tug2SpockReturnedToPosition },
+	{ {ACTION_GET, 12, 0, 0}, &Room::tug2GetWires },
+	{ {ACTION_FINISHED_WALKING, 28, 0, 0}, &Room::tug2KirkReachedWiresToGet },
+	{ {ACTION_FINISHED_ANIMATION, 29, 0, 0}, &Room::tug2KirkGotWires },
+	{ {ACTION_USE, OBJECT_KIRK, 0x20, 0}, &Room::tug2UseKirkOnButton },
+	{ {ACTION_FINISHED_WALKING, 14, 0, 0}, &Room::tug2KirkReachedButton },
+	{ {ACTION_USE, OBJECT_SPOCK, 0x20, 0}, &Room::tug2UseSpockOnButton },
+	{ {ACTION_FINISHED_WALKING, 16, 0, 0}, &Room::tug2SpockReachedButton },
+	{ {ACTION_USE, OBJECT_MCCOY, 0x20, 0}, &Room::tug2UseMccoyOnButton },
+	{ {ACTION_FINISHED_WALKING, 18, 0, 0}, &Room::tug2MccoyReachedButton },
+	{ {ACTION_USE, OBJECT_REDSHIRT, 0x20, 0}, &Room::tug2UseRedshirtOnButton },
+	{ {ACTION_FINISHED_WALKING, 20, 0, 0}, &Room::tug2RedshirtReachedButton },
+	{ {ACTION_FINISHED_ANIMATION, 15, 0, 0}, &Room::tug2TurnedOffForceField },
+	{ {ACTION_FINISHED_ANIMATION, 17, 0, 0}, &Room::tug2TurnedOffForceField },
+	{ {ACTION_FINISHED_ANIMATION, 19, 0, 0}, &Room::tug2TurnedOffForceField },
+	{ {ACTION_FINISHED_ANIMATION, 21, 0, 0}, &Room::tug2TurnedOffForceField },
+	{ {ACTION_FINISHED_ANIMATION, 1, 0, 0}, &Room::tug2PrisonersDead },
+	{ {ACTION_FINISHED_ANIMATION, 2, 0, 0}, &Room::tug2PrisonersReleased },
+	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::tug2UsePhaserOnBrig },
+	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::tug2UsePhaserOnBrig },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::tug2UseStunPhaserOnGuard1 },
+	{ {ACTION_FINISHED_ANIMATION, 22, 0, 0}, &Room::tug2KirkShootGuard1 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::tug2UseStunPhaserOnGuard2 },
+	{ {ACTION_FINISHED_ANIMATION, 23, 0, 0}, &Room::tug2KirkShootGuard2 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::tug2UseKillPhaserOnGuard1 },
+	{ {ACTION_FINISHED_ANIMATION, 24, 0, 0}, &Room::tug2KirkKillGuard1 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::tug2UseKillPhaserOnGuard2 },
+	{ {ACTION_FINISHED_ANIMATION, 25, 0, 0}, &Room::tug2KirkKillGuard2 },
+
+	{ {ACTION_USE, OBJECT_IPHASERS, OBJECT_IPWE, 0}, &Room::tug2UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPHASERK, OBJECT_IPWE, 0}, &Room::tug2UsePhaserOnWelder },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IWIRSCRP, 0}, &Room::tug2UseWelderOnWireScraps },
+	{ {ACTION_USE, OBJECT_IPWF, OBJECT_IJNKMETL, 0}, &Room::tug2UseWelderOnMetalScraps },
+	{ {ACTION_USE, OBJECT_ICOMBBIT, OBJECT_IRT, 0}, &Room::tug2UseCombBitOnTransmogrifier },
+
+	{ {ACTION_FINISHED_ANIMATION, 26, 0, 0}, &Room::tug2ShotByElasi },
+	{ {ACTION_FINISHED_ANIMATION, 27, 0, 0}, &Room::tug2ShotByElasi },
+	{ {ACTION_WALK, 0x21, 0, 0}, &Room::tug2WalkToDoor },
+	{ {ACTION_LOOK, 0x21, 0, 0}, &Room::tug2LookAtDoor },
+	{ {ACTION_LOOK, OBJECT_KIRK, 0, 0}, &Room::tug2LookAtKirk },
+	{ {ACTION_TALK, OBJECT_KIRK, 0, 0}, &Room::tug2TalkToKirk },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug2TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug2TalkToRedshirt },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug2TalkToSpock },
+	{ {ACTION_USE, OBJECT_ICOMM, 0, 0}, &Room::tug2UseCommunicator },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug2Timer0Expired },
+	{ {ACTION_TIMER_EXPIRED, 2, 0, 0}, &Room::tug2Timer2Expired },
+	{ {ACTION_USE, OBJECT_ISTRICOR, 11, 0}, &Room::tug2UseSTricorderOnBomb },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 8, 0}, &Room::tug2UseMTricorderOnGuard1 },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 9, 0}, &Room::tug2UseMTricorderOnGuard2 },
+	{ {ACTION_TALK, 8, 0, 0}, &Room::tug2TalkToGuard1 },
+	{ {ACTION_TALK, 9, 0, 0}, &Room::tug2TalkToGuard2 },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 11, 0}, &Room::tug2UseMedkitOnBomb },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 8, 0}, &Room::tug2UseMedkitOnGuard1 },
+	{ {ACTION_USE, OBJECT_IMEDKIT, 9, 0}, &Room::tug2UseMedkitOnGuard2 },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::tug2LookAnywhere },
+	{ {ACTION_LOOK, 0x22, 0, 0}, &Room::tug2LookAnywhere },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug2LookAnywhere },
+	{ {ACTION_TALK, 10, 0, 0}, &Room::tug2TalkToBrig },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 10, 0}, &Room::tug2UseMTricorderOnBrig },
+	{ {ACTION_USE, OBJECT_IMTRICOR, 0x22, 0}, &Room::tug2UseMTricorderOnOpenBrig },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::tug2UsePhaserAnywhere },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::tug2UsePhaserAnywhere },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::tug2Tick1() {
 	playVoc("TUG2LOOP");
 
diff --git a/engines/startrek/rooms/tug3.cpp b/engines/startrek/rooms/tug3.cpp
index 87f08a7545..9ac4b78177 100644
--- a/engines/startrek/rooms/tug3.cpp
+++ b/engines/startrek/rooms/tug3.cpp
@@ -39,6 +39,44 @@ namespace StarTrek {
 #define GUARDSTAT_SURRENDERED 4
 #define GUARDSTAT_TIED 8
 
+extern const RoomAction tug3ActionList[] = {
+	{ {ACTION_TICK, 1, 0, 0}, &Room::tug3Tick1 },
+	{ {ACTION_TICK, 40, 0, 0}, &Room::tug3Tick40 },
+	{ {ACTION_LOOK, 0xff, 0, 0}, &Room::tug3LookAnywhere },
+	{ {ACTION_USE, OBJECT_IPHASERS, 0xff, 0}, &Room::tug3UsePhaserAnywhere },
+	{ {ACTION_USE, OBJECT_IPHASERK, 0xff, 0}, &Room::tug3UsePhaserAnywhere },
+	{ {ACTION_USE, OBJECT_IPHASERS, 8, 0}, &Room::tug3UseStunPhaserOnElasi1 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 9, 0}, &Room::tug3UseStunPhaserOnElasi2 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 10, 0}, &Room::tug3UseStunPhaserOnElasi3 },
+	{ {ACTION_USE, OBJECT_IPHASERS, 11, 0}, &Room::tug3UseStunPhaserOnElasi4 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 8, 0}, &Room::tug3UseKillPhaserOnElasi1 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 9, 0}, &Room::tug3UseKillPhaserOnElasi2 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 10, 0}, &Room::tug3UseKillPhaserOnElasi3 },
+	{ {ACTION_USE, OBJECT_IPHASERK, 11, 0}, &Room::tug3UseKillPhaserOnElasi4 },
+	{ {ACTION_FINISHED_ANIMATION, 12, 0, 0}, &Room::tug3ElasiStunnedOrKilled },
+	{ {ACTION_TALK, 8, 0, 0}, &Room::tug3TalkToElasi1 },
+	{ {ACTION_FINISHED_ANIMATION, 3, 0, 0}, &Room::tug3Elasi1DrewPhaser },
+	{ {ACTION_FINISHED_ANIMATION, 4, 0, 0}, &Room::tug3Elasi1ShotConsole },
+	{ {ACTION_FINISHED_ANIMATION, 5, 0, 0}, &Room::tug3Elasi1DrewPhaser2 },
+	{ {ACTION_FINISHED_ANIMATION, 6, 0, 0}, &Room::tug3Elasi1ShotConsoleAndSurrenders },
+	{ {ACTION_LOOK, OBJECT_MCCOY, 0, 0}, &Room::tug3LookAtMccoy },
+	{ {ACTION_LOOK, OBJECT_SPOCK, 0, 0}, &Room::tug3LookAtSpock },
+	{ {ACTION_LOOK, OBJECT_REDSHIRT, 0, 0}, &Room::tug3LookAtRedshirt },
+	{ {ACTION_LOOK, 8, 0, 0}, &Room::tug3LookAtElasi1 },
+	{ {ACTION_LOOK, 9, 0, 0}, &Room::tug3LookAtElasi2 },
+	{ {ACTION_LOOK, 10, 0, 0}, &Room::tug3LookAtElasi3 },
+	{ {ACTION_LOOK, 11, 0, 0}, &Room::tug3LookAtElasi4 },
+	{ {ACTION_TALK, OBJECT_MCCOY, 0, 0}, &Room::tug3TalkToMccoy },
+	{ {ACTION_TALK, OBJECT_SPOCK, 0, 0}, &Room::tug3TalkToSpock },
+	{ {ACTION_TALK, OBJECT_REDSHIRT, 0, 0}, &Room::tug3TalkToRedshirt },
+	{ {ACTION_USE, OBJECT_ICOMM, 0xff, 0}, &Room::tug3UseCommunicator },
+	{ {ACTION_TIMER_EXPIRED, 0, 0, 0}, &Room::tug3Timer0Expired },
+	{ {ACTION_FINISHED_ANIMATION, 13, 0, 0}, &Room::tug3AllCrewmenDead },
+	{ {ACTION_TIMER_EXPIRED, 1, 0, 0}, &Room::tug3Timer1Expired },
+	{ {ACTION_FINISHED_ANIMATION, 7, 0, 0}, &Room::tug3SecurityTeamBeamedIn },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
+};
+
 void Room::tug3Tick1() {
 	playVoc("TUG3LOOP");
 
diff --git a/engines/startrek/rooms/veng0.cpp b/engines/startrek/rooms/veng0.cpp
index cd09a21358..1121ee80d6 100644
--- a/engines/startrek/rooms/veng0.cpp
+++ b/engines/startrek/rooms/veng0.cpp
@@ -104,11 +104,9 @@ extern const RoomAction veng0ActionList[] = {
 	{ {ACTION_USE, OBJECT_IPHASERK, 0xff,     0}, &Room::vengaUsePhaserAnywhere },
 	{ {ACTION_LOOK, OBJECT_IHYPO,          0, 0}, &Room::vengaLookAtHypo },
 	{ {ACTION_USE, OBJECT_ICOMM, OBJECT_KIRK, 0}, &Room::vengaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng0NumActions = ARRAYSIZE(veng0ActionList);
-
-
 void Room::veng0Tick1() {
 	playVoc("VEN0LOOP");
 
diff --git a/engines/startrek/rooms/veng1.cpp b/engines/startrek/rooms/veng1.cpp
index 48578a2c02..e8f5ac7a6b 100644
--- a/engines/startrek/rooms/veng1.cpp
+++ b/engines/startrek/rooms/veng1.cpp
@@ -125,11 +125,9 @@ extern const RoomAction veng1ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMEDKIT,  OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng1NumActions = ARRAYSIZE(veng1ActionList);
-
-
 void Room::veng1Tick1() {
 	playVoc("VEN1LOOP");
 	loadActorAnim2(OBJECT_DOOR, "s7r1d1c", 0xa1, 0x7e);
diff --git a/engines/startrek/rooms/veng2.cpp b/engines/startrek/rooms/veng2.cpp
index a21cde2a8a..5de0119f43 100644
--- a/engines/startrek/rooms/veng2.cpp
+++ b/engines/startrek/rooms/veng2.cpp
@@ -179,11 +179,9 @@ extern const RoomAction veng2ActionList[] = {
 	{ {ACTION_USE, OBJECT_KIRK, HOTSPOT_TORPEDO_CONTROL,     0}, &Room::veng2UseKirkOnTorpedoButton },
 	// TODO: uncomment
 //	{ {ACTION_USE, OBJECT_ISTRICOR, HOTSPOT_DECK_IO_CONSOLE, 0}, &Room::veng2UseSTricorderOnDeckIOConsole },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng2NumActions = ARRAYSIZE(veng2ActionList);
-
-
 #define STRICORDER_POS_X 0x45
 #define STRICORDER_POS_Y 0x71
 
diff --git a/engines/startrek/rooms/veng3.cpp b/engines/startrek/rooms/veng3.cpp
index 046de3e327..5c8bcd9d57 100644
--- a/engines/startrek/rooms/veng3.cpp
+++ b/engines/startrek/rooms/veng3.cpp
@@ -100,11 +100,9 @@ extern const RoomAction veng3ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMEDKIT,  OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng3NumActions = ARRAYSIZE(veng3ActionList);
-
-
 void Room::veng3Tick1() {
 	playVoc("VEN3LOOP");
 
diff --git a/engines/startrek/rooms/veng4.cpp b/engines/startrek/rooms/veng4.cpp
index 37729dabd5..1d0bbcf29b 100644
--- a/engines/startrek/rooms/veng4.cpp
+++ b/engines/startrek/rooms/veng4.cpp
@@ -96,11 +96,9 @@ extern const RoomAction veng4ActionList[] = {
 
 	// ENHANCEMENT (let object count for the "look" action, not just the hotspot)
 	{ {ACTION_LOOK, OBJECT_LEFT_READINGS, 0, 0}, &Room::veng4LookAtLeftBedReadings },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng4NumActions = ARRAYSIZE(veng4ActionList);
-
-
 #define DOOR_X 0x13f
 #define DOOR_Y 0xab
 
diff --git a/engines/startrek/rooms/veng5.cpp b/engines/startrek/rooms/veng5.cpp
index d8461f3151..4d1c6a9108 100644
--- a/engines/startrek/rooms/veng5.cpp
+++ b/engines/startrek/rooms/veng5.cpp
@@ -86,11 +86,9 @@ extern const RoomAction veng5ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMEDKIT,  OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng5NumActions = ARRAYSIZE(veng5ActionList);
-
-
 void Room::veng5Tick1() {
 	playVoc("VEN5LOOP");
 
diff --git a/engines/startrek/rooms/veng6.cpp b/engines/startrek/rooms/veng6.cpp
index c67098efa5..906b0e1968 100644
--- a/engines/startrek/rooms/veng6.cpp
+++ b/engines/startrek/rooms/veng6.cpp
@@ -129,11 +129,9 @@ extern const RoomAction veng6ActionList[] = {
 
 	// ENHANCEMENT
 	{ {ACTION_USE, OBJECT_ISTRICOR, OBJECT_IMPULSE_ENGINES, 0}, &Room::veng6UseSTricorderOnImpulseEngines },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng6NumActions = ARRAYSIZE(veng6ActionList);
-
-
 #define DOOR_X 0x13e
 #define DOOR_Y 0xa8
 
diff --git a/engines/startrek/rooms/veng7.cpp b/engines/startrek/rooms/veng7.cpp
index d82a11eb90..fa3ad1ae2d 100644
--- a/engines/startrek/rooms/veng7.cpp
+++ b/engines/startrek/rooms/veng7.cpp
@@ -71,11 +71,9 @@ extern const RoomAction veng7ActionList[] = {
 	{ {ACTION_USE, OBJECT_IMEDKIT,  OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_IMTRICOR, OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
 	{ {ACTION_USE, OBJECT_MCCOY,    OBJECT_DEAD_GUY, 0}, &Room::vengaUseMccoyOnDeadGuy },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng7NumActions = ARRAYSIZE(veng7ActionList);
-
-
 void Room::veng7Tick1() {
 	playVoc("VEN7LOOP");
 
diff --git a/engines/startrek/rooms/veng8.cpp b/engines/startrek/rooms/veng8.cpp
index 12731da1a3..97da13fd5e 100644
--- a/engines/startrek/rooms/veng8.cpp
+++ b/engines/startrek/rooms/veng8.cpp
@@ -107,11 +107,9 @@ extern const RoomAction veng8ActionList[] = {
 	{ {ACTION_USE, OBJECT_IPHASERK, 0xff,     0}, &Room::vengaUsePhaserAnywhere },
 	{ {ACTION_LOOK, OBJECT_IHYPO,          0, 0}, &Room::vengaLookAtHypo },
 	{ {ACTION_USE, OBJECT_ICOMM, OBJECT_KIRK, 0}, &Room::vengaUseCommunicator },
+	{ {ACTION_LIST_END, 0, 0, 0}, nullptr }
 };
 
-extern const int veng8NumActions = ARRAYSIZE(veng8ActionList);
-
-
 void Room::veng8Tick1() {
 	playVoc("VEN8LOOP");
 


Commit: cf559249d55f91a59e54eae512afb41b7c8d8f4a
    https://github.com/scummvm/scummvm/commit/cf559249d55f91a59e54eae512afb41b7c8d8f4a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:39+02:00

Commit Message:
STARTREK: Add a console command to show the score of all missions

Changed paths:
    engines/startrek/console.cpp
    engines/startrek/console.h


diff --git a/engines/startrek/console.cpp b/engines/startrek/console.cpp
index aecf169c4f..1b0de5c595 100644
--- a/engines/startrek/console.cpp
+++ b/engines/startrek/console.cpp
@@ -36,6 +36,7 @@ Console::Console(StarTrekEngine *vm) : GUI::Debugger(), _vm(vm) {
 	registerCmd("bg",			WRAP_METHOD(Console, Cmd_Bg));
 	registerCmd("filedump",		WRAP_METHOD(Console, Cmd_DumpFile));
 	registerCmd("filesearch",	WRAP_METHOD(Console, Cmd_SearchFile));
+	registerCmd("score",		WRAP_METHOD(Console, Cmd_Score));
 }
 
 Console::~Console() {
@@ -188,6 +189,18 @@ bool Console::Cmd_SearchFile(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::Cmd_Score(int argc, const char **argv) {
+	debugPrintf("Chapter 1: Demon world (demon): %d\n", _vm->_awayMission.demon.missionScore);
+	debugPrintf("Chapter 2: Hijacked (tug): %d\n", _vm->_awayMission.tug.missionScore);
+	debugPrintf("Chapter 3: Love's Labor Jeopardized (love): %d\n", _vm->_awayMission.love.missionScore);
+	debugPrintf("Chapter 4: Another Fine Mess (mudd): %d\n", _vm->_awayMission.mudd.missionScore);
+	debugPrintf("Chapter 5A: The Feathered Serpent (feather): %d\n", _vm->_awayMission.feather.missionScore);
+	debugPrintf("Chapter 5B: The Feathered Serpent (trial): %d\n", _vm->_awayMission.trial.missionScore);
+	debugPrintf("Chapter 6: The Old Devil Moon (sins): %d\n", _vm->_awayMission.sins.missionScore);
+	debugPrintf("Chapter 7: Vengeance (veng): %d\n", _vm->_awayMission.veng.missionScore);
+	return true;
+}
+
 Common::String Console::EventToString(uint32 action) {
 	const char *actions[] = {
 		"Tick",
diff --git a/engines/startrek/console.h b/engines/startrek/console.h
index 67e0ce0c3e..0ca529cb4d 100644
--- a/engines/startrek/console.h
+++ b/engines/startrek/console.h
@@ -43,6 +43,7 @@ private:
 	bool Cmd_Bg(int argc, const char **argv);
 	bool Cmd_DumpFile(int argc, const char **argv);
 	bool Cmd_SearchFile(int argc, const char **argv);
+	bool Cmd_Score(int argc, const char **argv);
 
 	Common::String EventToString(uint32 action);
 	Common::String ItemToString(byte index);


Commit: 8ff4da89808a7bbdee4b94a60f7b0e764b24fe54
    https://github.com/scummvm/scummvm/commit/8ff4da89808a7bbdee4b94a60f7b0e764b24fe54
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:39+02:00

Commit Message:
StARTREK: Clean up bitmap file name for some animations

We get invalid characters for the standing Spock animation

Changed paths:
    engines/startrek/actors.cpp


diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp
index 06b09004cb..cc524f8fff 100644
--- a/engines/startrek/actors.cpp
+++ b/engines/startrek/actors.cpp
@@ -182,6 +182,8 @@ void StarTrekEngine::updateActorAnimations() {
 					actor->animFile->read(animFrameFilename, 16);
 					actor->bitmapFilename = animFrameFilename;
 					actor->bitmapFilename.trim();
+					if (actor->bitmapFilename.contains(' '))
+						actor->bitmapFilename = actor->bitmapFilename.substr(0, actor->bitmapFilename.find(' '));
 
 					sprite->setBitmap(loadAnimationFrame(actor->bitmapFilename, actor->scale));
 


Commit: 5f8675a07da2ceb8f905cf47ff3334072498a209
    https://github.com/scummvm/scummvm/commit/5f8675a07da2ceb8f905cf47ff3334072498a209
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:39+02:00

Commit Message:
STARTREK: Use Common::String in playTextAudio()

Changed paths:
    engines/startrek/textbox.cpp


diff --git a/engines/startrek/textbox.cpp b/engines/startrek/textbox.cpp
index 523e10b012..775864933e 100644
--- a/engines/startrek/textbox.cpp
+++ b/engines/startrek/textbox.cpp
@@ -227,7 +227,7 @@ String StarTrekEngine::skipTextAudioPrompt(const String &str) {
 
 String StarTrekEngine::playTextAudio(const String &str) {
 	const char *text = str.c_str();
-	char soundFile[0x100];
+	Common::String soundFile;
 
 	if (*text != '#')
 		return str;
@@ -237,10 +237,9 @@ String StarTrekEngine::playTextAudio(const String &str) {
 	while (*text != '#') {
 		if (*text == '\0' || len > 0xfa)
 			return str;
-		soundFile[len++] = *text++;
+		soundFile += *text++;
 	}
 
-	soundFile[len] = '\0';
 	_sound->playSpeech(soundFile);
 
 	return String(text + 1);


Commit: 7d454f2221370aafcc2e65591f030696bbb1e8ad
    https://github.com/scummvm/scummvm/commit/7d454f2221370aafcc2e65591f030696bbb1e8ad
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:39+02:00

Commit Message:
STARTREK: Change action type to signed

We now use an action array terminator with a negative value

Changed paths:
    engines/startrek/room.cpp
    engines/startrek/room.h


diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index eb453136b6..2469498935 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -319,7 +319,7 @@ bool Room::actionHasCode(const Action &action) {
 	return false;
 }
 
-bool Room::actionHasCode(byte type, byte b1, byte b2, byte b3) {
+bool Room::actionHasCode(char type, byte b1, byte b2, byte b3) {
 	const Action a = {type, b1, b2, b3};
 	return actionHasCode(a);
 }
@@ -339,7 +339,7 @@ bool Room::handleAction(const Action &action) {
 	return false;
 }
 
-bool Room::handleAction(byte type, byte b1, byte b2, byte b3) {
+bool Room::handleAction(char type, byte b1, byte b2, byte b3) {
 	const Action a = {type, b1, b2, b3};
 	return handleAction(a);
 }
@@ -360,7 +360,7 @@ bool Room::handleActionWithBitmask(const Action &action) {
 	return false;
 }
 
-bool Room::handleActionWithBitmask(byte type, byte b1, byte b2, byte b3) {
+bool Room::handleActionWithBitmask(char type, byte b1, byte b2, byte b3) {
 	Action a = {type, b1, b2, b3};
 	return handleActionWithBitmask(a);
 }
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 617c522caa..824c03d93a 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -102,19 +102,19 @@ public:
 	 * Check if a particular action is defined for this room.
 	 */
 	bool actionHasCode(const Action &action);
-	bool actionHasCode(byte type, byte b1, byte b2, byte b3);
+	bool actionHasCode(char type, byte b1, byte b2, byte b3);
 
 	/**
 	 * Execute a particular action for this room, if defined.
 	 */
 	bool handleAction(const Action &action);
-	bool handleAction(byte type, byte b1, byte b2, byte b3);
+	bool handleAction(char type, byte b1, byte b2, byte b3);
 
 	/**
 	 * Same as above, but if any byte in the action is -1 (0xff), it matches any value.
 	 */
 	bool handleActionWithBitmask(const Action &action);
-	bool handleActionWithBitmask(byte type, byte b1, byte b2, byte b3);
+	bool handleActionWithBitmask(char type, byte b1, byte b2, byte b3);
 
 	uint16 getFirstHotspot() {
 		return readRdfWord(0x12);


Commit: b40f2f31dd85ecb9c84cfa0925c2619910ec6be7
    https://github.com/scummvm/scummvm/commit/b40f2f31dd85ecb9c84cfa0925c2619910ec6be7
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:40+02:00

Commit Message:
STARTREK: Change activeAction to be signed

One more change due to usage of negative action list terminators

Changed paths:
    engines/startrek/awaymission.h


diff --git a/engines/startrek/awaymission.h b/engines/startrek/awaymission.h
index 9c4d591073..464dea8ecf 100644
--- a/engines/startrek/awaymission.h
+++ b/engines/startrek/awaymission.h
@@ -41,7 +41,7 @@ struct AwayMission {
 	byte disableInput; // 0x1d
 
 	bool redshirtDead; // 0x1e
-	byte activeAction; // 0x1f
+	char activeAction; // 0x1f
 	byte activeObject;  // 0x20; The item that is going to be used on something
 	byte passiveObject; // 0x21; The item that the active item is used on (or the item looked at, etc).
 


Commit: 4a6828f305d01afe6744a4f6d419b89599674d60
    https://github.com/scummvm/scummvm/commit/4a6828f305d01afe6744a4f6d419b89599674d60
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:40+02:00

Commit Message:
STARTREK: Change type in addAction to be signed

One more change due to the usage of negative action terminators

Changed paths:
    engines/startrek/awaymission.cpp
    engines/startrek/startrek.h


diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index c555c40088..896fd3f9c9 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -535,7 +535,7 @@ void StarTrekEngine::addAction(const Action &action) {
 	_actionQueue.push(action);
 }
 
-void StarTrekEngine::addAction(byte type, byte b1, byte b2, byte b3) {
+void StarTrekEngine::addAction(char type, byte b1, byte b2, byte b3) {
 	const Action a = {type, b1, b2, b3};
 	addAction(a);
 }
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 3747a536e2..605209c1ca 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -291,7 +291,7 @@ public:
 	int loadActorAnimWithRoomScaling(int actorIndex, const Common::String &animName, int16 x, int16 y);
 	Fixed8 getActorScaleAtPosition(int16 y);
 	void addAction(const Action &action);
-	void addAction(byte type, byte b1, byte b2, byte b3);
+	void addAction(char type, byte b1, byte b2, byte b3);
 	void handleAwayMissionAction();
 
 	void checkTouchedLoadingZone(int16 x, int16 y);


Commit: de20df5ccc3e7b94e042d0fe9b645b0ae57833c0
    https://github.com/scummvm/scummvm/commit/de20df5ccc3e7b94e042d0fe9b645b0ae57833c0
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-12-19T01:50:40+02:00

Commit Message:
STARTREK: Add some planet data, and add mission performance sequences

Changed paths:
    engines/startrek/bridge.cpp
    engines/startrek/startrek.cpp
    engines/startrek/startrek.h


diff --git a/engines/startrek/bridge.cpp b/engines/startrek/bridge.cpp
index 53e2deb8dd..f509a81320 100644
--- a/engines/startrek/bridge.cpp
+++ b/engines/startrek/bridge.cpp
@@ -82,30 +82,53 @@ enum BridgeSequence {
 	kSeqUnk7,
 	kSeqUnk8,
 	kSeqUnk9,
-	kStartMissionLove,
+	kSeqStartMissionLove,
 	kSeqUnk11,
 	kSeqUnk12,
 	kSeqUnk13,
 	kSeqUnk14,
 	kSeqUnk15,
-	kStartMissionMudd,
+	kSeqStartMissionMudd,
 	kSeqUnk17,
 	kSeqUnk18,
-	kStartMissionFeather,
+	kSeqStartMissionFeather,
 	kSeqUnk20,
 	kSeqUnk21,
-	kStartMissionTrial,
+	kSeqStartMissionTrial,
 	kSeqUnk23,
 	kSeqUnk24,
 	kSeqUnk25,
 	kSeqUnk26,
 	kSeqUnk27,
-	kStartMissionVeng,
+	kSeqStartMissionVeng,
 	kSeqUnk29,
-	kStartMissionSins,
+	kSeqStartMissionSins,
 	kSeqUnk31
 };
 
+enum Planet {
+	kPlanetCenturius = 0,
+	kPlanetCameronsStar = 1,
+	kPlanetArk7 = 2,      // Chapter 3: Love's Labor Jeopardized (love)
+	kPlanetHarlequin = 3, // Chapter 4: Another Fine Mess (mudd)
+	kPlanetHarrapa = 4,
+	kPlanetElasiPrime = 5,
+	kPlanetDigifal = 6, // Chapter 5A: The Feathered Serpent (feather)
+	kPlanetStrahkeer = 7,
+	kPlanetHrakkour = 8, // Chapter 5B: The Feathered Serpent (trial)
+	kPlanetTriRhoNautica = 9,
+	kPlanetShivaOmicron = 10,
+	kPlanetAlphaProxima = 11, // Chapter 6: The Old Devil Moon (sins)
+	kPlanetOmegaMaelstrom = 12,
+	kPlanetArgosIV = 13,
+	kPlanetBetaMyamid = 14, // Chapter 2: Hijacked (tug)
+	kPlanetSirius = 15,
+	kPlanetSigmaZhukova = 16,
+	kPlanetCastor = 17,
+	kPlanetPollux = 18, // Chapter 1: Demon world (demon)
+	kPlanetChristgen = 19
+};
+
 void StarTrekEngine::initBridge(bool b) {
 	_gfx->loadPalette("bridge");
 	_sound->loadMusicFile("bridge");
@@ -142,6 +165,11 @@ void StarTrekEngine::loadBridge() {
 	playBridgeSequence(kSeqStartMissionDemon);
 	playBridgeSequence(kSeqEndMockBattle);
 	playBridgeSequence(kSeqShowDebriefDemon);
+	// End mission sequence
+	//_missionName = _missionToLoad = "DEMON";
+	//_resource->setTxtFileName(_missionName);
+	//_awayMission.demon.missionScore = 100;
+	//playBridgeSequence(kSeqEndMissionDemon);
 }
 
 void StarTrekEngine::loadBridgeActors() {
@@ -159,12 +187,14 @@ void StarTrekEngine::setBridgeMouseCursor() {
 void StarTrekEngine::playBridgeSequence(int sequenceId) {
 	const char *captainsLogHeader = "Captain's Log";
 	const char *uhuraHeader = "Lieutenant Uhura";
+	const char *kirkHeader = "Captain Kirk";
 	const char *spockHeader = "Mr. Spock";
+	const char *mcCoyHeader = "Dr. McCoy";
 	const char *suluHeader = "Mr. Sulu";
 	const char *lowerShieldsText = "#BRID\\B_336#Lowering shields and disarming weapons.";
 
 	switch (sequenceId) {
-	case kSeqStartMissionDemon:
+	case kSeqStartMissionDemon: // Chapter 1: Demon world (demon)
 		_missionName = _missionToLoad = "DEMON";
 		_resource->setTxtFileName(_missionName);
 		_sound->loadMusicFile("bridgew");
@@ -196,7 +226,7 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 		setBridgeMouseCursor();	// 0, 0
 		// TODO: Delete 3D object
 		showBridgeScreenTalkerWithMessage(12, "Admiral", "woman");
-		// TODO: _targetPlanet = 18;
+		_targetPlanet = kPlanetPollux;
 		break;
 	case kSeqTalkWithPolluxPriest:
 		/*
@@ -220,9 +250,30 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 		*/
 		break;
 	case kSeqEndMissionDemon:
+		loadActorAnim(1, "xstndsp", 0, 0, 1.0);	// Standing Spock
+		loadActorAnim(2, "xstndmc", 0, 0, 1.0);	// Standing McCoy
+		_sound->playSoundEffectIndex(34);
+		showTextbox(uhuraHeader, _resource->getLoadedText(23), 298, 150, 161, 0);	// Message from Starfleet
+		showTextbox(kirkHeader, _resource->getLoadedText(24), 160, 130, 176, 0);
+		showMissionPerformance(_awayMission.demon.missionScore, 29);
+		showTextbox(mcCoyHeader, _resource->getLoadedText(25), 160, 100, 44, 0);
+		showTextbox(kirkHeader, _resource->getLoadedText(26), 160, 130, 176, 0);
+		showTextbox(spockHeader, _resource->getLoadedText(27), 294, 106, 44, 0);
+		showTextbox(mcCoyHeader, _resource->getLoadedText(28), 160, 100, 44, 0);
+		loadActorAnim(1, "bstndsp", 0, 0, 1.0); // Sitting Spock
+		removeActorFromScreen(2);
+		// TODO: Proceed to tug
+		break;
+	case kSeqStartMissionTug: // Chapter 2: Hijacked (tug)
+		_targetPlanet = kPlanetBetaMyamid;
 		// TODO
 		break;
-	case kSeqStartMissionTug:
+	case kSeqStartMissionLove:	// Chapter 3: Love's Labor Jeopardized (love)
+		_targetPlanet = kPlanetArk7;
+		// TODO
+		break;
+	case kSeqStartMissionMudd: // Chapter 4: Another Fine Mess (mudd)
+		_targetPlanet = kPlanetHarlequin;
 		// TODO
 		break;
 	// TODO: The rest
@@ -231,7 +282,76 @@ void StarTrekEngine::playBridgeSequence(int sequenceId) {
 	}
 }
 
+Common::String StarTrekEngine::getSpeechSampleForNumber(int number) {
+	Common::String speechTemplate = ",BRID\\B_%03d";
+	Common::String result;
+
+	if (number <= 19) {
+		// Speech samples 228 ("zero") - 247 ("nineteen")
+		result = Common::String::format(speechTemplate.c_str(), number + 228);
+	} else if (number >= 20 && number <= 99) {
+		// Speech samples 248 ("twenty") - 255 ("ninety")
+		result = Common::String::format(speechTemplate.c_str(), number / 10 - 2 + 248);
+		if (number % 10 > 0)
+			result += Common::String::format(speechTemplate.c_str(), number % 10 + 228);
+	} else if (number == 100) {
+		result = Common::String::format(speechTemplate.c_str(), 256);
+	}
+
+	return result;
+}
+
+// TODO: two more parameters
+void StarTrekEngine::showMissionPerformance(int score, int missionScoreTextId) {
+	Common::String performanceDescription;
+	int midiTrack = 0;
+
+	if (score >= 0 && score <= 50) {
+		performanceDescription = "#BRID\\B_199#I'll be frank, Kirk. Starfleet expects more of you than that. Try to do better on your next assignment.";
+		midiTrack = 13;
+	} else if (score >= 60 && score <= 70) {
+		performanceDescription = "#BRID\\B_197#A satisfactory performance, Captain, but there's still room for improvement.";
+		midiTrack = 13;
+	} else if (score >= 71 && score <= 85) {
+		performanceDescription = "#BRID\\B_214#Well done, Captain. Keep up the good work.";
+		midiTrack = 11;
+	} else if (score >= 86 && score <= 99) {
+		performanceDescription = "#BRID\\B_414#The top brass at Starfleet are impressed. Outstanding work, Jim.";
+		midiTrack = 12;
+	} else if (score == 100) {
+		performanceDescription = "#BRID\\B_195#A perfect mission, Jim! You are a model for all Starfleet!";
+		midiTrack = 14;
+	}
+
+	_sound->playMidiMusicTracks(midiTrack, -1);
+
+	int commendationPoints = 0;	// TODO
+	Common::String speechIdPerformance = getSpeechSampleForNumber(score);
+	Common::String speechIdCommendationPoints = getSpeechSampleForNumber(commendationPoints);
+
+	Common::String missionPerformanceText = Common::String::format(_resource->getLoadedText(missionScoreTextId).c_str(),
+		speechIdPerformance.c_str(),
+		speechIdCommendationPoints.c_str(),
+		score,
+		commendationPoints
+	);
+
+	const char *textIds[] = {
+		missionPerformanceText.c_str(),
+		performanceDescription.c_str(),
+		NULL
+	};
+
+	showBridgeScreenTalkerWithMessages(textIds, "Admiral", "woman");
+}
+
 void StarTrekEngine::showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId) {
+	const char *text = _resource->getLoadedText(textId).c_str();
+	const char *texts[] = { text, NULL };
+	showBridgeScreenTalkerWithMessages(texts, talkerHeader, talkerId);
+}
+
+void StarTrekEngine::showBridgeScreenTalkerWithMessages(const char *texts[], Common::String talkerHeader, Common::String talkerId) {
 	if (talkerId == "romula" || talkerId == "pira" || talkerId == "klg1" || talkerId == "klg2" || talkerId == "maddoc")
 		_sound->playMidiMusicTracks(15, -1);
 	else if (talkerId == "mudd")
@@ -241,7 +361,13 @@ void StarTrekEngine::showBridgeScreenTalkerWithMessage(int textId, Common::Strin
 	_starfieldSprite.drawMode = 0;
 	// TODO: Check why we need the coord adjustments below
 	int actorId = loadActorAnim(-1, talkerId, 72 - 2, 30 + 1, 1.0);
-	showTextbox(talkerHeader, _resource->getLoadedText(textId), 160, 190, 44, 0);
+	int i = 0;
+	const char *text = texts[i];
+	while (text != NULL) {
+		showTextbox(talkerHeader, Common::String(text), 160, 190, 44, 0);
+		text = texts[++i];
+	}
+	
 	removeActorFromScreen(actorId);
 	initStarfieldSprite(&_starfieldSprite, new StubBitmap(0, 0), _starfieldRect);
 }
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 6c23f7a8ea..8a069e1215 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -111,6 +111,9 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
 	for (int i = 0; i < MAX_BAN_FILES; i++)
 		_banFiles[i] = nullptr;
 
+	_targetPlanet = -1;
+	_currentPlanet = -1;
+
 	const Common::FSNode gameDataDir(ConfMan.get("path"));
 	SearchMan.addSubDirectoryMatching(gameDataDir, "patches");
 }
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 605209c1ca..9be14115ed 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -260,9 +260,18 @@ public:
 	void setBridgeMouseCursor();
 	void playBridgeSequence(int sequenceId);
 	void showBridgeScreenTalkerWithMessage(int textId, Common::String talkerHeader, Common::String talkerId);
+	void showBridgeScreenTalkerWithMessages(const char *texts[], Common::String talkerHeader, Common::String talkerId);
 	void handleBridgeEvents();
 	void handleBridgeComputer();
+	void showMissionPerformance(int score, int missionScoreTextId);
 
+private:
+	Common::String getSpeechSampleForNumber(int number);
+
+	int _targetPlanet;
+	int _currentPlanet;
+
+public:
 	void playMovie(Common::String filename);
 	void playMovieMac(Common::String filename);
 




More information about the Scummvm-git-logs mailing list