[Scummvm-cvs-logs] scummvm master -> 566d4805ef2e0324cc06c6cae48cde1908858b13

dreammaster dreammaster at scummvm.org
Sat Jun 6 05:06:13 CEST 2015


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

Summary:
566d4805ef SHERLOCK: Move the Talk descendant classes into their own files


Commit: 566d4805ef2e0324cc06c6cae48cde1908858b13
    https://github.com/scummvm/scummvm/commit/566d4805ef2e0324cc06c6cae48cde1908858b13
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-06-05T23:05:22-04:00

Commit Message:
SHERLOCK: Move the Talk descendant classes into their own files

Changed paths:
  A engines/sherlock/scalpel/scalpel_talk.cpp
  A engines/sherlock/scalpel/scalpel_talk.h
  A engines/sherlock/tattoo/tattoo_talk.cpp
  A engines/sherlock/tattoo/tattoo_talk.h
    engines/sherlock/module.mk
    engines/sherlock/objects.cpp
    engines/sherlock/talk.cpp
    engines/sherlock/talk.h



diff --git a/engines/sherlock/module.mk b/engines/sherlock/module.mk
index e08029a..3a03a70 100644
--- a/engines/sherlock/module.mk
+++ b/engines/sherlock/module.mk
@@ -9,10 +9,12 @@ MODULE_OBJS = \
 	scalpel/tsage/logo.o \
 	scalpel/tsage/resources.o \
 	scalpel/scalpel_scene.o \
+	scalpel/scalpel_talk.o \
 	scalpel/scalpel_user_interface.o \
 	scalpel/settings.o \
 	tattoo/tattoo.o \
 	tattoo/tattoo_scene.o \
+	tattoo/tattoo_talk.o \
 	tattoo/tattoo_user_interface.o \
 	animation.o \
 	debugger.o \
diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp
index 881fd74..52c13d8 100644
--- a/engines/sherlock/objects.cpp
+++ b/engines/sherlock/objects.cpp
@@ -1221,7 +1221,7 @@ int Object::checkNameForCodes(const Common::String &name, const char *const mess
 				scene._goToScene = 100;
 			}
 
-			people[AL]._position = Common::Point(0, 0);
+			people[AL]._position = Point32(0, 0);
 			break;
 		}
 	} else if (name.hasPrefix("!")) {
diff --git a/engines/sherlock/scalpel/scalpel_talk.cpp b/engines/sherlock/scalpel/scalpel_talk.cpp
new file mode 100644
index 0000000..0b0259c
--- /dev/null
+++ b/engines/sherlock/scalpel/scalpel_talk.cpp
@@ -0,0 +1,330 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "sherlock/scalpel/scalpel_talk.h"
+#include "sherlock/scalpel/scalpel_user_interface.h"
+#include "sherlock/sherlock.h"
+#include "sherlock/screen.h"
+
+namespace Sherlock {
+
+namespace Scalpel {
+
+const byte SCALPEL_OPCODES[] = {
+	128,	// OP_SWITCH_SPEAKER
+	129,	// OP_RUN_CANIMATION
+	130,	// OP_ASSIGN_PORTRAIT_LOCATION
+	131,	// OP_PAUSE
+	132,	// OP_REMOVE_PORTRAIT
+	133,	// OP_CLEAR_WINDOW
+	134,	// OP_ADJUST_OBJ_SEQUENCE
+	135,	// OP_WALK_TO_COORDS
+	136,	// OP_PAUSE_WITHOUT_CONTROL
+	137,	// OP_BANISH_WINDOW
+	138,	// OP_SUMMON_WINDOW
+	139,	// OP_SET_FLAG
+	140,	// OP_SFX_COMMAND
+	141,	// OP_TOGGLE_OBJECT
+	142,	// OP_STEALTH_MODE_ACTIVE
+	143,	// OP_IF_STATEMENT
+	144,	// OP_ELSE_STATEMENT
+	145,	// OP_END_IF_STATEMENT
+	146,	// OP_STEALTH_MODE_DEACTIVATE
+	147,	// OP_TURN_HOLMES_OFF
+	148,	// OP_TURN_HOLMES_ON
+	149,	// OP_GOTO_SCENE
+	150,	// OP_PLAY_PROLOGUE
+	151,	// OP_ADD_ITEM_TO_INVENTORY
+	152,	// OP_SET_OBJECT
+	153,	// OP_CALL_TALK_FILE
+	143,	// OP_MOVE_MOUSE
+	155,	// OP_DISPLAY_INFO_LINE
+	156,	// OP_CLEAR_INFO_LINE
+	157,	// OP_WALK_TO_CANIMATION
+	158,	// OP_REMOVE_ITEM_FROM_INVENTORY
+	159,	// OP_ENABLE_END_KEY
+	160,	// OP_DISABLE_END_KEY
+	161,	// OP_CARRIAGE_RETURN
+	0,		// OP_MOUSE_ON_OFF
+	0,		// OP_SET_WALK_CONTROL
+	0,		// OP_SET_TALK_SEQUENCE
+	0,		// OP_PLAY_SONG
+	0,		// OP_WALK_HOLMES_AND_NPC_TO_CANIM
+	0,		// OP_SET_NPC_PATH_DEST
+	0,		// OP_NEXT_SONG
+	0,		// OP_SET_NPC_PATH_PAUSE
+	0,		// OP_PASSWORD
+	0,		// OP_SET_SCENE_ENTRY_FLAG
+	0,		// OP_WALK_NPC_TO_CANIM
+	0,		// OP_WALK_HOLMES_AND_NPC_TO_COORDS
+	0,		// OP_WALK_HOLMES_AND_NPC_TO_COORDS
+	0,		// OP_SET_NPC_TALK_FILE
+	0,		// OP_TURN_NPC_OFF
+	0,		// OP_TURN_NPC_ON
+	0,		// OP_NPC_DESC_ON_OFF
+	0,		// OP_NPC_PATH_PAUSE_TAKING_NOTES
+	0,		// OP_NPC_PATH_PAUSE_LOOKING_HOLMES
+	0,		// OP_ENABLE_TALK_INTERRUPTS
+	0,		// OP_DISABLE_TALK_INTERRUPTS
+	0,		// OP_SET_NPC_INFO_LINE
+	0,		// OP_SET_NPC_POSITION
+	0,		// OP_NPC_PATH_LABEL
+	0,		// OP_PATH_GOTO_LABEL
+	0,		// OP_PATH_IF_FLAG_GOTO_LABEL
+	0,		// OP_NPC_WALK_GRAPHICS
+	0,		// OP_NPC_VERB
+	0,		// OP_NPC_VERB_CANIM
+	0,		// OP_NPC_VERB_SCRIPT
+	0,		// OP_RESTORE_PEOPLE_SEQUENCE
+	0,		// OP_NPC_VERB_TARGET
+	0		// OP_TURN_SOUNDS_OFF
+};
+
+/*----------------------------------------------------------------*/
+
+ScalpelTalk::ScalpelTalk(SherlockEngine *vm) : Talk(vm) {
+	static OpcodeMethod OPCODE_METHODS[] = {
+		(OpcodeMethod)&ScalpelTalk::cmdSwitchSpeaker,
+		(OpcodeMethod)&ScalpelTalk::cmdRunCAnimation,
+		(OpcodeMethod)&ScalpelTalk::cmdAssignPortraitLocation,
+
+		(OpcodeMethod)&ScalpelTalk::cmdPause,
+		(OpcodeMethod)&ScalpelTalk::cmdRemovePortrait,
+		(OpcodeMethod)&ScalpelTalk::cmdClearWindow,
+		(OpcodeMethod)&ScalpelTalk::cmdAdjustObjectSequence,
+		(OpcodeMethod)&ScalpelTalk::cmdWalkToCoords,
+		(OpcodeMethod)&ScalpelTalk::cmdPauseWithoutControl,
+		(OpcodeMethod)&ScalpelTalk::cmdBanishWindow,
+		(OpcodeMethod)&ScalpelTalk::cmdSummonWindow,
+		(OpcodeMethod)&ScalpelTalk::cmdSetFlag,
+		(OpcodeMethod)&ScalpelTalk::cmdSfxCommand,
+
+		(OpcodeMethod)&ScalpelTalk::cmdToggleObject,
+		(OpcodeMethod)&ScalpelTalk::cmdStealthModeActivate,
+		(OpcodeMethod)&ScalpelTalk::cmdIf,
+		(OpcodeMethod)&ScalpelTalk::cmdElse,
+		nullptr,
+		(OpcodeMethod)&ScalpelTalk::cmdStealthModeDeactivate,
+		(OpcodeMethod)&ScalpelTalk::cmdHolmesOff,
+		(OpcodeMethod)&ScalpelTalk::cmdHolmesOn,
+		(OpcodeMethod)&ScalpelTalk::cmdGotoScene,
+		(OpcodeMethod)&ScalpelTalk::cmdPlayPrologue,
+		
+		(OpcodeMethod)&ScalpelTalk::cmdAddItemToInventory,
+		(OpcodeMethod)&ScalpelTalk::cmdSetObject,
+		(OpcodeMethod)&ScalpelTalk::cmdCallTalkFile,
+		(OpcodeMethod)&ScalpelTalk::cmdMoveMouse,
+		(OpcodeMethod)&ScalpelTalk::cmdDisplayInfoLine,
+		(OpcodeMethod)&ScalpelTalk::cmdClearInfoLine,
+		(OpcodeMethod)&ScalpelTalk::cmdWalkToCAnimation,
+		(OpcodeMethod)&ScalpelTalk::cmdRemoveItemFromInventory,
+		(OpcodeMethod)&ScalpelTalk::cmdEnableEndKey,
+		(OpcodeMethod)&ScalpelTalk::cmdDisableEndKey,
+		
+		(OpcodeMethod)&ScalpelTalk::cmdCarriageReturn,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+	};
+
+	_opcodes = SCALPEL_OPCODES;
+	_opcodeTable = OPCODE_METHODS;
+}
+
+OpcodeReturn ScalpelTalk::cmdAssignPortraitLocation(const byte *&str) {
+	People &people = *_vm->_people;
+
+	++str;
+	switch (str[0] & 15) {
+	case 1:
+		people._portraitSide = 20;
+		break;
+	case 2:
+		people._portraitSide = 220;
+		break;
+	case 3:
+		people._portraitSide = 120;
+		break;
+	default:
+		break;
+	}
+
+	if (str[0] > 15)
+		people._speakerFlip = true;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdClearInfoLine(const byte *&str) {
+	UserInterface &ui = *_vm->_ui;
+
+	ui._infoFlag = true;
+	ui.clearInfo();
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdClearWindow(const byte *&str) {
+	UserInterface &ui = *_vm->_ui;
+	
+	ui.clearWindow();
+	_yp = CONTROLS_Y + 12;
+	_charCount = _line = 0;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdDisplayInfoLine(const byte *&str) {
+	Screen &screen = *_vm->_screen;
+	UserInterface &ui = *_vm->_ui;
+	Common::String tempString;
+
+	++str;
+	for (int idx = 0; idx < str[0]; ++idx)
+		tempString += str[idx + 1];
+	str += str[0];
+
+	screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, "%s", tempString.c_str());
+	ui._menuCounter = 30;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdElse(const byte *&str) {
+	// If this is encountered here, it means that a preceeding IF statement was found,
+	// and evaluated to true. Now all the statements for the true block are finished,
+	// so skip over the block of code that would have executed if the result was false
+	_wait = 0;
+	do {
+		++str;
+	} while (str[0] && str[0] != _opcodes[OP_END_IF_STATEMENT]);
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdIf(const byte *&str) {
+	++str;
+	int flag = (str[0] - 1) * 256 + str[1] - 1 - (str[1] == 1 ? 1 : 0);
+	++str;
+	_wait = 0;
+
+	bool result = flag < 0x8000;
+	if (_vm->readFlags(flag & 0x7fff) != result) {
+		do {
+			++str;
+		} while (str[0] && str[0] != _opcodes[OP_ELSE_STATEMENT] && str[0] != _opcodes[OP_END_IF_STATEMENT]);
+
+		if (!str[0])
+			_endStr = true;
+	}
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdMoveMouse(const byte *&str) {
+	Events &events = *_vm->_events;
+
+	++str;
+	events.moveMouse(Common::Point((str[0] - 1) * 256 + str[1] - 1, str[2]));
+	if (_talkToAbort)
+		return RET_EXIT;
+	str += 3;
+	
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdPlayPrologue(const byte *&str) {
+	Animation &anim = *_vm->_animation;
+	Common::String tempString;
+
+	++str;
+	for (int idx = 0; idx < 8 && str[idx] != '~'; ++idx)
+		tempString += str[idx];
+
+	anim.play(tempString, 1, 3, true, 4);
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdRemovePortrait(const byte *&str) {
+	People &people = *_vm->_people;
+
+	if (_speaker >= 0 && _speaker < SPEAKER_REMOVE)
+		people.clearTalking();
+	pullSequence();
+	if (_talkToAbort)
+		return RET_EXIT;
+
+	_speaker |= SPEAKER_REMOVE;
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdSfxCommand(const byte *&str) {
+	Sound &sound = *_vm->_sound;
+	Common::String tempString;
+
+	++str;
+	if (sound._voices) {
+		for (int idx = 0; idx < 8 && str[idx] != '~'; ++idx)
+			tempString += str[idx];
+		sound.playSound(tempString, WAIT_RETURN_IMMEDIATELY);
+
+		// Set voices to wait for more
+		sound._voices = 2;
+		sound._speechOn = (*sound._soundIsOn);
+	}
+
+	_wait = 1;
+	str += 7;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdSummonWindow(const byte *&str) {
+	Events &events = *_vm->_events;
+	Screen &screen = *_vm->_screen;
+
+	drawInterface();
+	events._pressed = events._released = false;
+	events.clearKeyboard();
+	_noTextYet = false;
+
+	if (_speaker != -1) {
+		screen.buttonPrint(Common::Point(119, CONTROLS_Y), COMMAND_NULL, false, "Exit");
+		screen.buttonPrint(Common::Point(159, CONTROLS_Y), COMMAND_NULL, false, "Up");
+		screen.buttonPrint(Common::Point(200, CONTROLS_Y), COMMAND_NULL, false, "Down");
+	}
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn ScalpelTalk::cmdCarriageReturn(const byte *&str) {
+	return RET_SUCCESS;
+}
+
+} // End of namespace Scalpel
+
+} // End of namespace Sherlock
diff --git a/engines/sherlock/scalpel/scalpel_talk.h b/engines/sherlock/scalpel/scalpel_talk.h
new file mode 100644
index 0000000..8121e19
--- /dev/null
+++ b/engines/sherlock/scalpel/scalpel_talk.h
@@ -0,0 +1,61 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SHERLOCK_SCALPEL_TALK_H
+#define SHERLOCK_SCALPEL_TALK_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/serializer.h"
+#include "common/stream.h"
+#include "common/stack.h"
+#include "sherlock/talk.h"
+
+namespace Sherlock {
+
+namespace Scalpel {
+
+class ScalpelTalk : public Talk {
+protected:
+	OpcodeReturn cmdAssignPortraitLocation(const byte *&str);
+	OpcodeReturn cmdClearInfoLine(const byte *&str);
+	OpcodeReturn cmdClearWindow(const byte *&str);
+	OpcodeReturn cmdDisplayInfoLine(const byte *&str);
+	OpcodeReturn cmdElse(const byte *&str);
+	OpcodeReturn cmdIf(const byte *&str);
+	OpcodeReturn cmdMoveMouse(const byte *&str);
+	OpcodeReturn cmdPlayPrologue(const byte *&str);
+	OpcodeReturn cmdRemovePortrait(const byte *&str);
+	OpcodeReturn cmdSfxCommand(const byte *&str);
+	OpcodeReturn cmdSummonWindow(const byte *&str);
+	OpcodeReturn cmdCarriageReturn(const byte *&str);
+public:
+	ScalpelTalk(SherlockEngine *vm);
+	virtual ~ScalpelTalk() {}
+};
+
+} // End of namespace Scalpel
+
+} // End of namespace Sherlock
+
+#endif
diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp
index 607417b..93285e2 100644
--- a/engines/sherlock/talk.cpp
+++ b/engines/sherlock/talk.cpp
@@ -23,153 +23,12 @@
 #include "sherlock/talk.h"
 #include "sherlock/sherlock.h"
 #include "sherlock/screen.h"
+#include "sherlock/scalpel/scalpel_talk.h"
 #include "sherlock/scalpel/scalpel_user_interface.h"
+#include "sherlock/tattoo/tattoo_talk.h"
 
 namespace Sherlock {
 
-#define SPEAKER_REMOVE 0x80
-
-const byte SCALPEL_OPCODES[] = {
-	128,	// OP_SWITCH_SPEAKER
-	129,	// OP_RUN_CANIMATION
-	130,	// OP_ASSIGN_PORTRAIT_LOCATION
-	131,	// OP_PAUSE
-	132,	// OP_REMOVE_PORTRAIT
-	133,	// OP_CLEAR_WINDOW
-	134,	// OP_ADJUST_OBJ_SEQUENCE
-	135,	// OP_WALK_TO_COORDS
-	136,	// OP_PAUSE_WITHOUT_CONTROL
-	137,	// OP_BANISH_WINDOW
-	138,	// OP_SUMMON_WINDOW
-	139,	// OP_SET_FLAG
-	140,	// OP_SFX_COMMAND
-	141,	// OP_TOGGLE_OBJECT
-	142,	// OP_STEALTH_MODE_ACTIVE
-	143,	// OP_IF_STATEMENT
-	144,	// OP_ELSE_STATEMENT
-	145,	// OP_END_IF_STATEMENT
-	146,	// OP_STEALTH_MODE_DEACTIVATE
-	147,	// OP_TURN_HOLMES_OFF
-	148,	// OP_TURN_HOLMES_ON
-	149,	// OP_GOTO_SCENE
-	150,	// OP_PLAY_PROLOGUE
-	151,	// OP_ADD_ITEM_TO_INVENTORY
-	152,	// OP_SET_OBJECT
-	153,	// OP_CALL_TALK_FILE
-	143,	// OP_MOVE_MOUSE
-	155,	// OP_DISPLAY_INFO_LINE
-	156,	// OP_CLEAR_INFO_LINE
-	157,	// OP_WALK_TO_CANIMATION
-	158,	// OP_REMOVE_ITEM_FROM_INVENTORY
-	159,	// OP_ENABLE_END_KEY
-	160,	// OP_DISABLE_END_KEY
-	161,	// OP_CARRIAGE_RETURN
-	0,		// OP_MOUSE_ON_OFF
-	0,		// OP_SET_WALK_CONTROL
-	0,		// OP_SET_TALK_SEQUENCE
-	0,		// OP_PLAY_SONG
-	0,		// OP_WALK_HOLMES_AND_NPC_TO_CANIM
-	0,		// OP_SET_NPC_PATH_DEST
-	0,		// OP_NEXT_SONG
-	0,		// OP_SET_NPC_PATH_PAUSE
-	0,		// OP_PASSWORD
-	0,		// OP_SET_SCENE_ENTRY_FLAG
-	0,		// OP_WALK_NPC_TO_CANIM
-	0,		// OP_WALK_HOLMES_AND_NPC_TO_COORDS
-	0,		// OP_WALK_HOLMES_AND_NPC_TO_COORDS
-	0,		// OP_SET_NPC_TALK_FILE
-	0,		// OP_TURN_NPC_OFF
-	0,		// OP_TURN_NPC_ON
-	0,		// OP_NPC_DESC_ON_OFF
-	0,		// OP_NPC_PATH_PAUSE_TAKING_NOTES
-	0,		// OP_NPC_PATH_PAUSE_LOOKING_HOLMES
-	0,		// OP_ENABLE_TALK_INTERRUPTS
-	0,		// OP_DISABLE_TALK_INTERRUPTS
-	0,		// OP_SET_NPC_INFO_LINE
-	0,		// OP_SET_NPC_POSITION
-	0,		// OP_NPC_PATH_LABEL
-	0,		// OP_PATH_GOTO_LABEL
-	0,		// OP_PATH_IF_FLAG_GOTO_LABEL
-	0,		// OP_NPC_WALK_GRAPHICS
-	0,		// OP_NPC_VERB
-	0,		// OP_NPC_VERB_CANIM
-	0,		// OP_NPC_VERB_SCRIPT
-	0,		// OP_RESTORE_PEOPLE_SEQUENCE
-	0,		// OP_NPC_VERB_TARGET
-	0		// OP_TURN_SOUNDS_OFF
-};
-
-const byte TATTOO_OPCODES[] = {
-	170,	// OP_SWITCH_SPEAKER
-	171,	// OP_RUN_CANIMATION
-	0,	// OP_ASSIGN_PORTRAIT_LOCATION
-	173,	// OP_PAUSE
-	0,	// OP_REMOVE_PORTRAIT
-	0,	// OP_CLEAR_WINDOW
-	176,	// OP_ADJUST_OBJ_SEQUENCE
-	177,	// OP_WALK_TO_COORDS
-	178,	// OP_PAUSE_WITHOUT_CONTROL
-	179,	// OP_BANISH_WINDOW
-	0,		// OP_SUMMON_WINDOW
-	181,	// OP_SET_FLAG
-	0,		// OP_SFX_COMMAND
-	183,	// OP_TOGGLE_OBJECT
-	184,	// OP_STEALTH_MODE_ACTIVE
-	0,		// OP_IF_STATEMENT
-	0,		// OP_ELSE_STATEMENT
-	0,		// OP_END_IF_STATEMENT
-	188,	// OP_STEALTH_MODE_DEACTIVATE
-	189,	// OP_TURN_HOLMES_OFF
-	190,	// OP_TURN_HOLMES_ON
-	191,	// OP_GOTO_SCENE
-	0,		// OP_PLAY_PROLOGUE
-	193,	// OP_ADD_ITEM_TO_INVENTORY
-	194,	// OP_SET_OBJECT
-	172,	// OP_CALL_TALK_FILE
-	0,		// OP_MOVE_MOUSE
-	0,		// OP_DISPLAY_INFO_LINE
-	0,		// OP_CLEAR_INFO_LINE
-	199,	// OP_WALK_TO_CANIMATION
-	200,	// OP_REMOVE_ITEM_FROM_INVENTORY
-	201,	// OP_ENABLE_END_KEY
-	202,	// OP_DISABLE_END_KEY
-	0,		// OP_CARRIAGE_RETURN
-	174,	// OP_MOUSE_ON_OFF
-	175,	// OP_SET_WALK_CONTROL
-	180,	// OP_SET_TALK_SEQUENCE
-	182,	// OP_PLAY_SONG
-	187,	// OP_WALK_HOLMES_AND_NPC_TO_CANIM
-	192,	// OP_SET_NPC_PATH_DEST
-	195,	// OP_NEXT_SONG
-	196,	// OP_SET_NPC_PATH_PAUSE
-	197,	// OP_PASSWORD
-	198,	// OP_SET_SCENE_ENTRY_FLAG
-	185,	// OP_WALK_NPC_TO_CANIM
-	204,	// OP_WALK_HOLMES_AND_NPC_TO_COORDS
-	205,	// OP_SET_NPC_TALK_FILE
-	206,	// OP_TURN_NPC_OFF
-	207,	// OP_TURN_NPC_ON
-	208,	// OP_NPC_DESC_ON_OFF
-	209,	// OP_NPC_PATH_PAUSE_TAKING_NOTES
-	210,	// OP_NPC_PATH_PAUSE_LOOKING_HOLMES
-	211,	// OP_ENABLE_TALK_INTERRUPTS
-	212,	// OP_DISABLE_TALK_INTERRUPTS
-	213,	// OP_SET_NPC_INFO_LINE
-	214,	// OP_SET_NPC_POSITION
-	215,	// OP_NPC_PATH_LABEL
-	216,	// OP_PATH_GOTO_LABEL
-	217,	// OP_PATH_IF_FLAG_GOTO_LABEL
-	218,	// OP_NPC_WALK_GRAPHICS
-	220,	// OP_NPC_VERB
-	221,	// OP_NPC_VERB_CANIM
-	222,	// OP_NPC_VERB_SCRIPT
-	224,	// OP_RESTORE_PEOPLE_SEQUENCE
-	226,	// OP_NPC_VERB_TARGET
-	227		// OP_TURN_SOUNDS_OFF
-};
-
-/*----------------------------------------------------------------*/
-
 SequenceEntry::SequenceEntry() {
 	_objNum = 0;
 	_frameNumber = 0;
@@ -235,9 +94,9 @@ TalkSequence::TalkSequence() {
 
 Talk *Talk::init(SherlockEngine *vm) {
 	if (vm->getGameID() == GType_SerratedScalpel)
-		return new ScalpelTalk(vm);
+		return new Scalpel::ScalpelTalk(vm);
 	else
-		return new TattooTalk(vm);
+		return new Tattoo::TattooTalk(vm);
 }
 
 Talk::Talk(SherlockEngine *vm) : _vm(vm) {
@@ -1783,389 +1642,4 @@ OpcodeReturn Talk::cmdWalkToCoords(const byte *&str) {
 	return RET_SUCCESS;
 }
 
-/*----------------------------------------------------------------*/
-
-ScalpelTalk::ScalpelTalk(SherlockEngine *vm) : Talk(vm) {
-	static OpcodeMethod OPCODE_METHODS[] = {
-		(OpcodeMethod)&ScalpelTalk::cmdSwitchSpeaker,
-		(OpcodeMethod)&ScalpelTalk::cmdRunCAnimation,
-		(OpcodeMethod)&ScalpelTalk::cmdAssignPortraitLocation,
-
-		(OpcodeMethod)&ScalpelTalk::cmdPause,
-		(OpcodeMethod)&ScalpelTalk::cmdRemovePortrait,
-		(OpcodeMethod)&ScalpelTalk::cmdClearWindow,
-		(OpcodeMethod)&ScalpelTalk::cmdAdjustObjectSequence,
-		(OpcodeMethod)&ScalpelTalk::cmdWalkToCoords,
-		(OpcodeMethod)&ScalpelTalk::cmdPauseWithoutControl,
-		(OpcodeMethod)&ScalpelTalk::cmdBanishWindow,
-		(OpcodeMethod)&ScalpelTalk::cmdSummonWindow,
-		(OpcodeMethod)&ScalpelTalk::cmdSetFlag,
-		(OpcodeMethod)&ScalpelTalk::cmdSfxCommand,
-
-		(OpcodeMethod)&ScalpelTalk::cmdToggleObject,
-		(OpcodeMethod)&ScalpelTalk::cmdStealthModeActivate,
-		(OpcodeMethod)&ScalpelTalk::cmdIf,
-		(OpcodeMethod)&ScalpelTalk::cmdElse,
-		nullptr,
-		(OpcodeMethod)&ScalpelTalk::cmdStealthModeDeactivate,
-		(OpcodeMethod)&ScalpelTalk::cmdHolmesOff,
-		(OpcodeMethod)&ScalpelTalk::cmdHolmesOn,
-		(OpcodeMethod)&ScalpelTalk::cmdGotoScene,
-		(OpcodeMethod)&ScalpelTalk::cmdPlayPrologue,
-		
-		(OpcodeMethod)&ScalpelTalk::cmdAddItemToInventory,
-		(OpcodeMethod)&ScalpelTalk::cmdSetObject,
-		(OpcodeMethod)&ScalpelTalk::cmdCallTalkFile,
-		(OpcodeMethod)&ScalpelTalk::cmdMoveMouse,
-		(OpcodeMethod)&ScalpelTalk::cmdDisplayInfoLine,
-		(OpcodeMethod)&ScalpelTalk::cmdClearInfoLine,
-		(OpcodeMethod)&ScalpelTalk::cmdWalkToCAnimation,
-		(OpcodeMethod)&ScalpelTalk::cmdRemoveItemFromInventory,
-		(OpcodeMethod)&ScalpelTalk::cmdEnableEndKey,
-		(OpcodeMethod)&ScalpelTalk::cmdDisableEndKey,
-		
-		(OpcodeMethod)&ScalpelTalk::cmdCarriageReturn,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
-	};
-
-	_opcodes = SCALPEL_OPCODES;
-	_opcodeTable = OPCODE_METHODS;
-}
-
-OpcodeReturn ScalpelTalk::cmdAssignPortraitLocation(const byte *&str) {
-	People &people = *_vm->_people;
-
-	++str;
-	switch (str[0] & 15) {
-	case 1:
-		people._portraitSide = 20;
-		break;
-	case 2:
-		people._portraitSide = 220;
-		break;
-	case 3:
-		people._portraitSide = 120;
-		break;
-	default:
-		break;
-	}
-
-	if (str[0] > 15)
-		people._speakerFlip = true;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdClearInfoLine(const byte *&str) {
-	UserInterface &ui = *_vm->_ui;
-
-	ui._infoFlag = true;
-	ui.clearInfo();
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdClearWindow(const byte *&str) {
-	UserInterface &ui = *_vm->_ui;
-	
-	ui.clearWindow();
-	_yp = CONTROLS_Y + 12;
-	_charCount = _line = 0;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdDisplayInfoLine(const byte *&str) {
-	Screen &screen = *_vm->_screen;
-	UserInterface &ui = *_vm->_ui;
-	Common::String tempString;
-
-	++str;
-	for (int idx = 0; idx < str[0]; ++idx)
-		tempString += str[idx + 1];
-	str += str[0];
-
-	screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, "%s", tempString.c_str());
-	ui._menuCounter = 30;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdElse(const byte *&str) {
-	// If this is encountered here, it means that a preceeding IF statement was found,
-	// and evaluated to true. Now all the statements for the true block are finished,
-	// so skip over the block of code that would have executed if the result was false
-	_wait = 0;
-	do {
-		++str;
-	} while (str[0] && str[0] != _opcodes[OP_END_IF_STATEMENT]);
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdIf(const byte *&str) {
-	++str;
-	int flag = (str[0] - 1) * 256 + str[1] - 1 - (str[1] == 1 ? 1 : 0);
-	++str;
-	_wait = 0;
-
-	bool result = flag < 0x8000;
-	if (_vm->readFlags(flag & 0x7fff) != result) {
-		do {
-			++str;
-		} while (str[0] && str[0] != _opcodes[OP_ELSE_STATEMENT] && str[0] != _opcodes[OP_END_IF_STATEMENT]);
-
-		if (!str[0])
-			_endStr = true;
-	}
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdMoveMouse(const byte *&str) {
-	Events &events = *_vm->_events;
-
-	++str;
-	events.moveMouse(Common::Point((str[0] - 1) * 256 + str[1] - 1, str[2]));
-	if (_talkToAbort)
-		return RET_EXIT;
-	str += 3;
-	
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdPlayPrologue(const byte *&str) {
-	Animation &anim = *_vm->_animation;
-	Common::String tempString;
-
-	++str;
-	for (int idx = 0; idx < 8 && str[idx] != '~'; ++idx)
-		tempString += str[idx];
-
-	anim.play(tempString, 1, 3, true, 4);
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdRemovePortrait(const byte *&str) {
-	People &people = *_vm->_people;
-
-	if (_speaker >= 0 && _speaker < SPEAKER_REMOVE)
-		people.clearTalking();
-	pullSequence();
-	if (_talkToAbort)
-		return RET_EXIT;
-
-	_speaker |= SPEAKER_REMOVE;
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdSfxCommand(const byte *&str) {
-	Sound &sound = *_vm->_sound;
-	Common::String tempString;
-
-	++str;
-	if (sound._voices) {
-		for (int idx = 0; idx < 8 && str[idx] != '~'; ++idx)
-			tempString += str[idx];
-		sound.playSound(tempString, WAIT_RETURN_IMMEDIATELY);
-
-		// Set voices to wait for more
-		sound._voices = 2;
-		sound._speechOn = (*sound._soundIsOn);
-	}
-
-	_wait = 1;
-	str += 7;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdSummonWindow(const byte *&str) {
-	Events &events = *_vm->_events;
-	Screen &screen = *_vm->_screen;
-
-	drawInterface();
-	events._pressed = events._released = false;
-	events.clearKeyboard();
-	_noTextYet = false;
-
-	if (_speaker != -1) {
-		screen.buttonPrint(Common::Point(119, CONTROLS_Y), COMMAND_NULL, false, "Exit");
-		screen.buttonPrint(Common::Point(159, CONTROLS_Y), COMMAND_NULL, false, "Up");
-		screen.buttonPrint(Common::Point(200, CONTROLS_Y), COMMAND_NULL, false, "Down");
-	}
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn ScalpelTalk::cmdCarriageReturn(const byte *&str) {
-	return RET_SUCCESS;
-}
-
-/*----------------------------------------------------------------*/
-
-TattooTalk::TattooTalk(SherlockEngine *vm) : Talk(vm) {
-	static OpcodeMethod OPCODE_METHODS[] = {
-		nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-		(OpcodeMethod)&TattooTalk::cmdSwitchSpeaker,
-
-		(OpcodeMethod)&TattooTalk::cmdRunCAnimation,
-		(OpcodeMethod)&TattooTalk::cmdCallTalkFile,
-		(OpcodeMethod)&TattooTalk::cmdPause,
-		(OpcodeMethod)&TattooTalk::cmdMouseOnOff,
-		(OpcodeMethod)&TattooTalk::cmdSetWalkControl,
-		(OpcodeMethod)&TattooTalk::cmdAdjustObjectSequence,
-		(OpcodeMethod)&TattooTalk::cmdWalkToCoords,
-		(OpcodeMethod)&TattooTalk::cmdPauseWithoutControl,
-		(OpcodeMethod)&TattooTalk::cmdBanishWindow,
-		(OpcodeMethod)&TattooTalk::cmdSetTalkSequence,
-
-		(OpcodeMethod)&TattooTalk::cmdSetFlag,
-		(OpcodeMethod)&TattooTalk::cmdPlaySong,
-		(OpcodeMethod)&TattooTalk::cmdToggleObject,
-		(OpcodeMethod)&TattooTalk::cmdStealthModeActivate,
-		(OpcodeMethod)&TattooTalk::cmdWalkNPCToCAnimation,
-		(OpcodeMethod)&TattooTalk::cmdWalkNPCToCoords,
-		(OpcodeMethod)&TattooTalk::cmdWalkHomesAndNPCToCoords,
-		(OpcodeMethod)&TattooTalk::cmdStealthModeDeactivate,
-		(OpcodeMethod)&TattooTalk::cmdHolmesOff,
-		(OpcodeMethod)&TattooTalk::cmdHolmesOn,
-
-		(OpcodeMethod)&TattooTalk::cmdGotoScene,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCPathDest,
-		(OpcodeMethod)&TattooTalk::cmdAddItemToInventory,
-		(OpcodeMethod)&TattooTalk::cmdSetObject,
-		(OpcodeMethod)&TattooTalk::cmdNextSong,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPause,
-		(OpcodeMethod)&TattooTalk::cmdPassword,
-		(OpcodeMethod)&TattooTalk::cmdSetSceneEntryFlag,
-		(OpcodeMethod)&TattooTalk::cmdWalkToCAnimation,
-		(OpcodeMethod)&TattooTalk::cmdRemoveItemFromInventory,
-
-		(OpcodeMethod)&TattooTalk::cmdEnableEndKey,
-		(OpcodeMethod)&TattooTalk::cmdDisableEndKey,
-		nullptr,
-		(OpcodeMethod)&TattooTalk::cmdWalkHomesAndNPCToCoords,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCTalkFile,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCOff,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCOn,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCDescOnOff,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPauseTakingNotes,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPauseLookingHolmes,
-
-		(OpcodeMethod)&TattooTalk::cmdTalkInterruptsEnable,
-		(OpcodeMethod)&TattooTalk::cmdTalkInterruptsDisable,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCInfoLine,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCPosition,
-		(OpcodeMethod)&TattooTalk::cmdNPCLabelSet,
-		(OpcodeMethod)&TattooTalk::cmdNPCLabelGoto,
-		(OpcodeMethod)&TattooTalk::cmdNPCLabelIfFlagGoto,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCWalkGraphics,
-		nullptr,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCVerb,
-
-		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbCAnimation,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbScript,
-		nullptr,
-		(OpcodeMethod)&TattooTalk::cmdRestorePeopleSequence,
-		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbTarget,
-		(OpcodeMethod)&TattooTalk::cmdTurnSoundsOff
-	};
-
-	_opcodes = TATTOO_OPCODES;
-	_opcodeTable = OPCODE_METHODS;
-}
-
-OpcodeReturn TattooTalk::cmdMouseOnOff(const byte *&str) { 
-	Events &events = *_vm->_events;
-	bool mouseOn = *++str == 2;
-	if (mouseOn)
-		events.showCursor();
-	else
-		events.hideCursor();
-	return RET_SUCCESS;
-}
-
-OpcodeReturn TattooTalk::cmdNextSong(const byte *&str) {
-	Sound &sound = *_vm->_sound;
-
-	// Get the name of the next song to play
-	++str;
-	sound._nextSongName = "";
-	for (int idx = 0; idx < 8; ++idx) {
-		if (str[idx] != '~')
-			sound._nextSongName += str[idx];
-		else
-			break;
-	}
-	str += 7;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn TattooTalk::cmdNPCLabelGoto(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdNPCLabelIfFlagGoto(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdNPCLabelSet(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdPassword(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdPlaySong(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdRestorePeopleSequence(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCDescOnOff(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCInfoLine(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCOff(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCOn(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCPathDest(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCPathPause(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCPathPauseTakingNotes(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCPathPauseLookingHolmes(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCPosition(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCTalkFile(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCVerb(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCVerbCAnimation(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCVerbScript(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetNPCVerbTarget(const byte *&str) { error("TODO: script opcode"); }
-
-OpcodeReturn TattooTalk::cmdSetNPCWalkGraphics(const byte *&str) {
-	++str;
-	int npc = *str - 1;
-	People &people = *_vm->_people;
-	Person &person = people[npc];
-
-	// Build up walk library name for the given NPC
-	person._walkVGSName = "";
-	for (int idx = 0; idx < 8; ++idx) {
-		if (str[idx + 1] != '~')
-			person._walkVGSName += str[idx + 1];
-		else
-			break;
-	}
-	person._walkVGSName += ".VGS";
-
-	people._forceWalkReload = true;
-	str += 8;
-
-	return RET_SUCCESS;
-}
-
-OpcodeReturn TattooTalk::cmdSetSceneEntryFlag(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetTalkSequence(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdSetWalkControl(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdTalkInterruptsDisable(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdTalkInterruptsEnable(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdTurnSoundsOff(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdWalkHolmesAndNPCToCAnimation(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdWalkNPCToCAnimation(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdWalkNPCToCoords(const byte *&str) { error("TODO: script opcode"); }
-OpcodeReturn TattooTalk::cmdWalkHomesAndNPCToCoords(const byte *&str) { error("TODO: script opcode"); }
-
 } // End of namespace Sherlock
diff --git a/engines/sherlock/talk.h b/engines/sherlock/talk.h
index 79616b2..ef1b42f 100644
--- a/engines/sherlock/talk.h
+++ b/engines/sherlock/talk.h
@@ -33,6 +33,7 @@
 
 namespace Sherlock {
 
+#define SPEAKER_REMOVE 0x80
 #define MAX_TALK_SEQUENCES 11
 #define MAX_TALK_FILES 500
 #define TALK_SEQUENCE_STACK_SIZE 20
@@ -355,65 +356,6 @@ public:
 	void synchronize(Common::Serializer &s);
 };
 
-class ScalpelTalk : public Talk {
-protected:
-	OpcodeReturn cmdAssignPortraitLocation(const byte *&str);
-	OpcodeReturn cmdClearInfoLine(const byte *&str);
-	OpcodeReturn cmdClearWindow(const byte *&str);
-	OpcodeReturn cmdDisplayInfoLine(const byte *&str);
-	OpcodeReturn cmdElse(const byte *&str);
-	OpcodeReturn cmdIf(const byte *&str);
-	OpcodeReturn cmdMoveMouse(const byte *&str);
-	OpcodeReturn cmdPlayPrologue(const byte *&str);
-	OpcodeReturn cmdRemovePortrait(const byte *&str);
-	OpcodeReturn cmdSfxCommand(const byte *&str);
-	OpcodeReturn cmdSummonWindow(const byte *&str);
-	OpcodeReturn cmdCarriageReturn(const byte *&str);
-public:
-	ScalpelTalk(SherlockEngine *vm);
-	virtual ~ScalpelTalk() {}
-};
-
-class TattooTalk : public Talk {
-protected:
-	OpcodeReturn cmdMouseOnOff(const byte *&str);
-	OpcodeReturn cmdNextSong(const byte *&str);
-	OpcodeReturn cmdPassword(const byte *&str);
-	OpcodeReturn cmdPlaySong(const byte *&str);
-	OpcodeReturn cmdRestorePeopleSequence(const byte *&str);
-	OpcodeReturn cmdSetNPCDescOnOff(const byte *&str);
-	OpcodeReturn cmdSetNPCInfoLine(const byte *&str);
-	OpcodeReturn cmdNPCLabelGoto(const byte *&str);
-	OpcodeReturn cmdNPCLabelIfFlagGoto(const byte *&str);
-	OpcodeReturn cmdNPCLabelSet(const byte *&str);
-	OpcodeReturn cmdSetNPCOff(const byte *&str);
-	OpcodeReturn cmdSetNPCOn(const byte *&str);
-	OpcodeReturn cmdSetNPCPathDest(const byte *&str);
-	OpcodeReturn cmdSetNPCPathPause(const byte *&str);
-	OpcodeReturn cmdSetNPCPathPauseTakingNotes(const byte *&str);
-	OpcodeReturn cmdSetNPCPathPauseLookingHolmes(const byte *&str);
-	OpcodeReturn cmdSetNPCPosition(const byte *&str);
-	OpcodeReturn cmdSetNPCTalkFile(const byte *&str);
-	OpcodeReturn cmdSetNPCVerb(const byte *&str);
-	OpcodeReturn cmdSetNPCVerbCAnimation(const byte *&str);
-	OpcodeReturn cmdSetNPCVerbScript(const byte *&str);
-	OpcodeReturn cmdSetNPCVerbTarget(const byte *&str);
-	OpcodeReturn cmdSetNPCWalkGraphics(const byte *&str);
-	OpcodeReturn cmdSetSceneEntryFlag(const byte *&str);
-	OpcodeReturn cmdSetTalkSequence(const byte *&str);
-	OpcodeReturn cmdSetWalkControl(const byte *&str);
-	OpcodeReturn cmdTalkInterruptsDisable(const byte *&str);
-	OpcodeReturn cmdTalkInterruptsEnable(const byte *&str);
-	OpcodeReturn cmdTurnSoundsOff(const byte *&str);
-	OpcodeReturn cmdWalkHolmesAndNPCToCAnimation(const byte *&str);
-	OpcodeReturn cmdWalkNPCToCAnimation(const byte *&str);
-	OpcodeReturn cmdWalkNPCToCoords(const byte *&str);
-	OpcodeReturn cmdWalkHomesAndNPCToCoords(const byte *&str);
-public:
-	TattooTalk(SherlockEngine *vm);
-	virtual ~TattooTalk() {}
-};
-
 } // End of namespace Sherlock
 
 #endif
diff --git a/engines/sherlock/tattoo/tattoo_talk.cpp b/engines/sherlock/tattoo/tattoo_talk.cpp
new file mode 100644
index 0000000..d95b5ca
--- /dev/null
+++ b/engines/sherlock/tattoo/tattoo_talk.cpp
@@ -0,0 +1,262 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "sherlock/tattoo/tattoo_talk.h"
+#include "sherlock/sherlock.h"
+#include "sherlock/screen.h"
+
+namespace Sherlock {
+
+namespace Tattoo {
+
+
+const byte TATTOO_OPCODES[] = {
+	170,	// OP_SWITCH_SPEAKER
+	171,	// OP_RUN_CANIMATION
+	0,	// OP_ASSIGN_PORTRAIT_LOCATION
+	173,	// OP_PAUSE
+	0,	// OP_REMOVE_PORTRAIT
+	0,	// OP_CLEAR_WINDOW
+	176,	// OP_ADJUST_OBJ_SEQUENCE
+	177,	// OP_WALK_TO_COORDS
+	178,	// OP_PAUSE_WITHOUT_CONTROL
+	179,	// OP_BANISH_WINDOW
+	0,		// OP_SUMMON_WINDOW
+	181,	// OP_SET_FLAG
+	0,		// OP_SFX_COMMAND
+	183,	// OP_TOGGLE_OBJECT
+	184,	// OP_STEALTH_MODE_ACTIVE
+	0,		// OP_IF_STATEMENT
+	0,		// OP_ELSE_STATEMENT
+	0,		// OP_END_IF_STATEMENT
+	188,	// OP_STEALTH_MODE_DEACTIVATE
+	189,	// OP_TURN_HOLMES_OFF
+	190,	// OP_TURN_HOLMES_ON
+	191,	// OP_GOTO_SCENE
+	0,		// OP_PLAY_PROLOGUE
+	193,	// OP_ADD_ITEM_TO_INVENTORY
+	194,	// OP_SET_OBJECT
+	172,	// OP_CALL_TALK_FILE
+	0,		// OP_MOVE_MOUSE
+	0,		// OP_DISPLAY_INFO_LINE
+	0,		// OP_CLEAR_INFO_LINE
+	199,	// OP_WALK_TO_CANIMATION
+	200,	// OP_REMOVE_ITEM_FROM_INVENTORY
+	201,	// OP_ENABLE_END_KEY
+	202,	// OP_DISABLE_END_KEY
+	0,		// OP_CARRIAGE_RETURN
+	174,	// OP_MOUSE_ON_OFF
+	175,	// OP_SET_WALK_CONTROL
+	180,	// OP_SET_TALK_SEQUENCE
+	182,	// OP_PLAY_SONG
+	187,	// OP_WALK_HOLMES_AND_NPC_TO_CANIM
+	192,	// OP_SET_NPC_PATH_DEST
+	195,	// OP_NEXT_SONG
+	196,	// OP_SET_NPC_PATH_PAUSE
+	197,	// OP_PASSWORD
+	198,	// OP_SET_SCENE_ENTRY_FLAG
+	185,	// OP_WALK_NPC_TO_CANIM
+	204,	// OP_WALK_HOLMES_AND_NPC_TO_COORDS
+	205,	// OP_SET_NPC_TALK_FILE
+	206,	// OP_TURN_NPC_OFF
+	207,	// OP_TURN_NPC_ON
+	208,	// OP_NPC_DESC_ON_OFF
+	209,	// OP_NPC_PATH_PAUSE_TAKING_NOTES
+	210,	// OP_NPC_PATH_PAUSE_LOOKING_HOLMES
+	211,	// OP_ENABLE_TALK_INTERRUPTS
+	212,	// OP_DISABLE_TALK_INTERRUPTS
+	213,	// OP_SET_NPC_INFO_LINE
+	214,	// OP_SET_NPC_POSITION
+	215,	// OP_NPC_PATH_LABEL
+	216,	// OP_PATH_GOTO_LABEL
+	217,	// OP_PATH_IF_FLAG_GOTO_LABEL
+	218,	// OP_NPC_WALK_GRAPHICS
+	220,	// OP_NPC_VERB
+	221,	// OP_NPC_VERB_CANIM
+	222,	// OP_NPC_VERB_SCRIPT
+	224,	// OP_RESTORE_PEOPLE_SEQUENCE
+	226,	// OP_NPC_VERB_TARGET
+	227		// OP_TURN_SOUNDS_OFF
+};
+
+/*----------------------------------------------------------------*/
+
+TattooTalk::TattooTalk(SherlockEngine *vm) : Talk(vm) {
+	static OpcodeMethod OPCODE_METHODS[] = {
+		nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+		(OpcodeMethod)&TattooTalk::cmdSwitchSpeaker,
+
+		(OpcodeMethod)&TattooTalk::cmdRunCAnimation,
+		(OpcodeMethod)&TattooTalk::cmdCallTalkFile,
+		(OpcodeMethod)&TattooTalk::cmdPause,
+		(OpcodeMethod)&TattooTalk::cmdMouseOnOff,
+		(OpcodeMethod)&TattooTalk::cmdSetWalkControl,
+		(OpcodeMethod)&TattooTalk::cmdAdjustObjectSequence,
+		(OpcodeMethod)&TattooTalk::cmdWalkToCoords,
+		(OpcodeMethod)&TattooTalk::cmdPauseWithoutControl,
+		(OpcodeMethod)&TattooTalk::cmdBanishWindow,
+		(OpcodeMethod)&TattooTalk::cmdSetTalkSequence,
+
+		(OpcodeMethod)&TattooTalk::cmdSetFlag,
+		(OpcodeMethod)&TattooTalk::cmdPlaySong,
+		(OpcodeMethod)&TattooTalk::cmdToggleObject,
+		(OpcodeMethod)&TattooTalk::cmdStealthModeActivate,
+		(OpcodeMethod)&TattooTalk::cmdWalkNPCToCAnimation,
+		(OpcodeMethod)&TattooTalk::cmdWalkNPCToCoords,
+		(OpcodeMethod)&TattooTalk::cmdWalkHomesAndNPCToCoords,
+		(OpcodeMethod)&TattooTalk::cmdStealthModeDeactivate,
+		(OpcodeMethod)&TattooTalk::cmdHolmesOff,
+		(OpcodeMethod)&TattooTalk::cmdHolmesOn,
+
+		(OpcodeMethod)&TattooTalk::cmdGotoScene,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCPathDest,
+		(OpcodeMethod)&TattooTalk::cmdAddItemToInventory,
+		(OpcodeMethod)&TattooTalk::cmdSetObject,
+		(OpcodeMethod)&TattooTalk::cmdNextSong,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPause,
+		(OpcodeMethod)&TattooTalk::cmdPassword,
+		(OpcodeMethod)&TattooTalk::cmdSetSceneEntryFlag,
+		(OpcodeMethod)&TattooTalk::cmdWalkToCAnimation,
+		(OpcodeMethod)&TattooTalk::cmdRemoveItemFromInventory,
+
+		(OpcodeMethod)&TattooTalk::cmdEnableEndKey,
+		(OpcodeMethod)&TattooTalk::cmdDisableEndKey,
+		nullptr,
+		(OpcodeMethod)&TattooTalk::cmdWalkHomesAndNPCToCoords,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCTalkFile,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCOff,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCOn,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCDescOnOff,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPauseTakingNotes,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCPathPauseLookingHolmes,
+
+		(OpcodeMethod)&TattooTalk::cmdTalkInterruptsEnable,
+		(OpcodeMethod)&TattooTalk::cmdTalkInterruptsDisable,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCInfoLine,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCPosition,
+		(OpcodeMethod)&TattooTalk::cmdNPCLabelSet,
+		(OpcodeMethod)&TattooTalk::cmdNPCLabelGoto,
+		(OpcodeMethod)&TattooTalk::cmdNPCLabelIfFlagGoto,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCWalkGraphics,
+		nullptr,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCVerb,
+
+		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbCAnimation,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbScript,
+		nullptr,
+		(OpcodeMethod)&TattooTalk::cmdRestorePeopleSequence,
+		(OpcodeMethod)&TattooTalk::cmdSetNPCVerbTarget,
+		(OpcodeMethod)&TattooTalk::cmdTurnSoundsOff
+	};
+
+	_opcodes = TATTOO_OPCODES;
+	_opcodeTable = OPCODE_METHODS;
+}
+
+OpcodeReturn TattooTalk::cmdMouseOnOff(const byte *&str) { 
+	Events &events = *_vm->_events;
+	bool mouseOn = *++str == 2;
+	if (mouseOn)
+		events.showCursor();
+	else
+		events.hideCursor();
+	return RET_SUCCESS;
+}
+
+OpcodeReturn TattooTalk::cmdNextSong(const byte *&str) {
+	Sound &sound = *_vm->_sound;
+
+	// Get the name of the next song to play
+	++str;
+	sound._nextSongName = "";
+	for (int idx = 0; idx < 8; ++idx) {
+		if (str[idx] != '~')
+			sound._nextSongName += str[idx];
+		else
+			break;
+	}
+	str += 7;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn TattooTalk::cmdNPCLabelGoto(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdNPCLabelIfFlagGoto(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdNPCLabelSet(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdPassword(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdPlaySong(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdRestorePeopleSequence(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCDescOnOff(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCInfoLine(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCOff(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCOn(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCPathDest(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCPathPause(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCPathPauseTakingNotes(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCPathPauseLookingHolmes(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCPosition(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCTalkFile(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCVerb(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCVerbCAnimation(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCVerbScript(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetNPCVerbTarget(const byte *&str) { error("TODO: script opcode"); }
+
+OpcodeReturn TattooTalk::cmdSetNPCWalkGraphics(const byte *&str) {
+	++str;
+	int npc = *str - 1;
+	People &people = *_vm->_people;
+	Person &person = people[npc];
+
+	// Build up walk library name for the given NPC
+	person._walkVGSName = "";
+	for (int idx = 0; idx < 8; ++idx) {
+		if (str[idx + 1] != '~')
+			person._walkVGSName += str[idx + 1];
+		else
+			break;
+	}
+	person._walkVGSName += ".VGS";
+
+	people._forceWalkReload = true;
+	str += 8;
+
+	return RET_SUCCESS;
+}
+
+OpcodeReturn TattooTalk::cmdSetSceneEntryFlag(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetTalkSequence(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdSetWalkControl(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdTalkInterruptsDisable(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdTalkInterruptsEnable(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdTurnSoundsOff(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdWalkHolmesAndNPCToCAnimation(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdWalkNPCToCAnimation(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdWalkNPCToCoords(const byte *&str) { error("TODO: script opcode"); }
+OpcodeReturn TattooTalk::cmdWalkHomesAndNPCToCoords(const byte *&str) { error("TODO: script opcode"); }
+
+} // End of namespace Tattoo
+
+} // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/tattoo_talk.h b/engines/sherlock/tattoo/tattoo_talk.h
new file mode 100644
index 0000000..9290a24
--- /dev/null
+++ b/engines/sherlock/tattoo/tattoo_talk.h
@@ -0,0 +1,82 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SHERLOCK_TATTOO_TALK_H
+#define SHERLOCK_TATTOO_TALK_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/serializer.h"
+#include "common/stream.h"
+#include "common/stack.h"
+#include "sherlock/talk.h"
+
+namespace Sherlock {
+
+namespace Tattoo {
+
+class TattooTalk : public Talk {
+protected:
+	OpcodeReturn cmdMouseOnOff(const byte *&str);
+	OpcodeReturn cmdNextSong(const byte *&str);
+	OpcodeReturn cmdPassword(const byte *&str);
+	OpcodeReturn cmdPlaySong(const byte *&str);
+	OpcodeReturn cmdRestorePeopleSequence(const byte *&str);
+	OpcodeReturn cmdSetNPCDescOnOff(const byte *&str);
+	OpcodeReturn cmdSetNPCInfoLine(const byte *&str);
+	OpcodeReturn cmdNPCLabelGoto(const byte *&str);
+	OpcodeReturn cmdNPCLabelIfFlagGoto(const byte *&str);
+	OpcodeReturn cmdNPCLabelSet(const byte *&str);
+	OpcodeReturn cmdSetNPCOff(const byte *&str);
+	OpcodeReturn cmdSetNPCOn(const byte *&str);
+	OpcodeReturn cmdSetNPCPathDest(const byte *&str);
+	OpcodeReturn cmdSetNPCPathPause(const byte *&str);
+	OpcodeReturn cmdSetNPCPathPauseTakingNotes(const byte *&str);
+	OpcodeReturn cmdSetNPCPathPauseLookingHolmes(const byte *&str);
+	OpcodeReturn cmdSetNPCPosition(const byte *&str);
+	OpcodeReturn cmdSetNPCTalkFile(const byte *&str);
+	OpcodeReturn cmdSetNPCVerb(const byte *&str);
+	OpcodeReturn cmdSetNPCVerbCAnimation(const byte *&str);
+	OpcodeReturn cmdSetNPCVerbScript(const byte *&str);
+	OpcodeReturn cmdSetNPCVerbTarget(const byte *&str);
+	OpcodeReturn cmdSetNPCWalkGraphics(const byte *&str);
+	OpcodeReturn cmdSetSceneEntryFlag(const byte *&str);
+	OpcodeReturn cmdSetTalkSequence(const byte *&str);
+	OpcodeReturn cmdSetWalkControl(const byte *&str);
+	OpcodeReturn cmdTalkInterruptsDisable(const byte *&str);
+	OpcodeReturn cmdTalkInterruptsEnable(const byte *&str);
+	OpcodeReturn cmdTurnSoundsOff(const byte *&str);
+	OpcodeReturn cmdWalkHolmesAndNPCToCAnimation(const byte *&str);
+	OpcodeReturn cmdWalkNPCToCAnimation(const byte *&str);
+	OpcodeReturn cmdWalkNPCToCoords(const byte *&str);
+	OpcodeReturn cmdWalkHomesAndNPCToCoords(const byte *&str);
+public:
+	TattooTalk(SherlockEngine *vm);
+	virtual ~TattooTalk() {}
+};
+
+} // End of namespace Tattoo
+
+} // End of namespace Sherlock
+
+#endif






More information about the Scummvm-git-logs mailing list