[Scummvm-cvs-logs] SF.net SVN: scummvm:[48052] scummvm/trunk/engines/sci

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Feb 13 18:46:44 CET 2010


Revision: 48052
          http://scummvm.svn.sourceforge.net/scummvm/?rev=48052&view=rev
Author:   fingolfin
Date:     2010-02-13 17:46:44 +0000 (Sat, 13 Feb 2010)

Log Message:
-----------
SCI: Move language related code from EngineState to SciEngine

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/game.cpp
    scummvm/trunk/engines/sci/engine/kfile.cpp
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/engine/kmenu.cpp
    scummvm/trunk/engines/sci/engine/ksound.cpp
    scummvm/trunk/engines/sci/engine/kstring.cpp
    scummvm/trunk/engines/sci/engine/state.cpp
    scummvm/trunk/engines/sci/engine/state.h
    scummvm/trunk/engines/sci/graphics/menu.cpp
    scummvm/trunk/engines/sci/sci.h

Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/game.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -285,7 +285,9 @@
 #endif
 
 	// Load game language into printLang property of game object
-	s->getLanguage();
+	// FIXME: It's evil to achieve this as a side effect of a getter.
+	// Much better to have an explicit init method for this.
+	g_sci->getSciLanguage();
 
 	return 0;
 }

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -104,7 +104,7 @@
 	if (filename[0] == '/' && filename[1] == '\\')
 		filename += 2;
 
-	Common::String englishName = s->getLanguageString(filename, K_LANG_ENGLISH);
+	Common::String englishName = g_sci->getSciLanguageString(filename, K_LANG_ENGLISH);
 	const Common::String wrappedName = g_sci->wrapFilename(englishName);
 	Common::SeekableReadStream *inFile = 0;
 	Common::WriteStream *outFile = 0;

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -338,10 +338,10 @@
 	
 #ifdef ENABLE_SCI32
 	if (g_sci->_gui32)
-		g_sci->_gui32->textSize(s->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
+		g_sci->_gui32->textSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
 	else
 #endif
-		g_sci->_gui->textSize(s->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
+		g_sci->_gui->textSize(g_sci->strSplit(text.c_str(), sep).c_str(), font_nr, maxwidth, &textWidth, &textHeight);
 	
 	debugC(2, kDebugLevelStrings, "GetTextSize '%s' -> %dx%d", text.c_str(), textWidth, textHeight);
 	dest[2] = make_reg(0, textHeight);
@@ -782,13 +782,13 @@
 	switch (type) {
 	case SCI_CONTROLS_TYPE_BUTTON:
 		debugC(2, kDebugLevelGraphics, "drawing button %04x:%04x to %d,%d", PRINT_REG(controlObject), x, y);
-		g_sci->_gfxControls->kernelDrawButton(rect, controlObject, s->strSplit(text.c_str(), NULL).c_str(), fontId, style, hilite);
+		g_sci->_gfxControls->kernelDrawButton(rect, controlObject, g_sci->strSplit(text.c_str(), NULL).c_str(), fontId, style, hilite);
 		return;
 
 	case SCI_CONTROLS_TYPE_TEXT:
 		alignment = GET_SEL32V(s->_segMan, controlObject, SELECTOR(mode));
 		debugC(2, kDebugLevelGraphics, "drawing text %04x:%04x ('%s') to %d,%d, mode=%d", PRINT_REG(controlObject), text.c_str(), x, y, alignment);
-		g_sci->_gfxControls->kernelDrawText(rect, controlObject, s->strSplit(text.c_str()).c_str(), fontId, alignment, style, hilite);
+		g_sci->_gfxControls->kernelDrawText(rect, controlObject, g_sci->strSplit(text.c_str()).c_str(), fontId, alignment, style, hilite);
 		return;
 
 	case SCI_CONTROLS_TYPE_TEXTEDIT:
@@ -796,7 +796,7 @@
 		maxChars = GET_SEL32V(s->_segMan, controlObject, SELECTOR(max));
 		cursorPos = GET_SEL32V(s->_segMan, controlObject, SELECTOR(cursor));
 		debugC(2, kDebugLevelGraphics, "drawing edit control %04x:%04x (text %04x:%04x, '%s') to %d,%d", PRINT_REG(controlObject), PRINT_REG(textReference), text.c_str(), x, y);
-		g_sci->_gfxControls->kernelDrawTextEdit(rect, controlObject, s->strSplit(text.c_str(), NULL).c_str(), fontId, mode, style, cursorPos, maxChars, hilite);
+		g_sci->_gfxControls->kernelDrawTextEdit(rect, controlObject, g_sci->strSplit(text.c_str(), NULL).c_str(), fontId, mode, style, cursorPos, maxChars, hilite);
 		return;
 
 	case SCI_CONTROLS_TYPE_ICON:
@@ -1044,7 +1044,7 @@
 	Common::String title;
 	if (argv[4 + argextra].segment) {
 		title = s->_segMan->getString(argv[4 + argextra]);
-		title = s->strSplit(title.c_str(), NULL);
+		title = g_sci->strSplit(title.c_str(), NULL);
 	}
 
 	return g_sci->_gfxPorts->kernelNewWindow(rect1, rect2, style, priority, colorPen, colorBack, title.c_str());
@@ -1085,7 +1085,7 @@
 		text = kernel_lookup_text(s, textp, index);
 	}
 
-	return g_sci->_gfxPaint16->kernelDisplay(s->strSplit(text.c_str()).c_str(), argc, argv);
+	return g_sci->_gfxPaint16->kernelDisplay(g_sci->strSplit(text.c_str()).c_str(), argc, argv);
 }
 
 reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {

Modified: scummvm/trunk/engines/sci/engine/kmenu.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmenu.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/kmenu.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -34,7 +34,7 @@
 namespace Sci {
 
 reg_t kAddMenu(EngineState *s, int argc, reg_t *argv) {
-	Common::String title = s->strSplit(s->_segMan->getString(argv[0]).c_str());
+	Common::String title = g_sci->strSplit(s->_segMan->getString(argv[0]).c_str());
 	Common::String content = s->_segMan->getString(argv[1]);
 
 	g_sci->_gfxMenu->kernelAddEntry(title, content, argv[1]);
@@ -77,7 +77,7 @@
 		// Sometimes this is called without giving text, if thats the case dont process it
 		text = s->_segMan->getString(textReference);
 
-		g_sci->_gfxMenu->kernelDrawStatus(s->strSplit(text.c_str(), NULL).c_str(), colorPen, colorBack);
+		g_sci->_gfxMenu->kernelDrawStatus(g_sci->strSplit(text.c_str(), NULL).c_str(), colorPen, colorBack);
 	}
 	return s->r_acc;
 }

Modified: scummvm/trunk/engines/sci/engine/ksound.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/ksound.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/ksound.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -150,7 +150,7 @@
 			if (language != -1)
 				g_sci->getResMan()->setAudioLanguage(language);
 
-			return make_reg(0, s->getLanguage());
+			return make_reg(0, g_sci->getSciLanguage());
 		}
 		break;
 	case kSciAudioCD:

Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -575,7 +575,7 @@
 		sep_str = s->_segMan->getString(argv[2]);
 		sep = sep_str.c_str();
 	}
-	Common::String str = s->strSplit(format.c_str(), sep);
+	Common::String str = g_sci->strSplit(format.c_str(), sep);
 
 	// Make sure target buffer is large enough
 	SegmentRef buf_r = s->_segMan->dereference(argv[0]);

Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/state.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -89,7 +89,7 @@
 	script_000->_localsBlock->_locals[13] = make_reg(0, roomNumber);
 }
 
-kLanguage EngineState::charToLanguage(const char c) const {
+static kLanguage charToLanguage(const char c) {
 	switch (c) {
 	case 'F':
 		return K_LANG_FRENCH;
@@ -109,7 +109,7 @@
 	}
 }
 
-Common::String EngineState::getLanguageString(const char *str, kLanguage lang) const {
+Common::String SciEngine::getSciLanguageString(const char *str, kLanguage lang) const {
 	kLanguage secondLang = K_LANG_NONE;
 
 	const char *seeker = str;
@@ -138,15 +138,15 @@
 		return Common::String(str);
 }
 
-kLanguage EngineState::getLanguage() {
-	kLanguage lang = (kLanguage)g_sci->getResMan()->getAudioLanguage();
+kLanguage SciEngine::getSciLanguage() {
+	kLanguage lang = (kLanguage)_resMan->getAudioLanguage();
 	if (lang != K_LANG_NONE)
 		return lang;
 
 	lang = K_LANG_ENGLISH;
 
-	if (g_sci->getKernel()->_selectorCache.printLang != -1) {
-		lang = (kLanguage)GET_SEL32V(_segMan, _gameObj, SELECTOR(printLang));
+	if (_kernel->_selectorCache.printLang != -1) {
+		lang = (kLanguage)GET_SEL32V(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(printLang));
 
 		if ((getSciVersion() >= SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
 			// If language is set to none, we use the language from the game detector.
@@ -157,7 +157,7 @@
 			// (essentially disabling runtime language switching).
 			// Note: only a limited number of multilanguage games have been tested
 			// so far, so this information may not be 100% accurate.
-			switch (((Sci::SciEngine*)g_engine)->getLanguage()) {
+			switch (getLanguage()) {
 			case Common::FR_FRA:
 				lang = K_LANG_FRENCH;
 				break;
@@ -181,26 +181,26 @@
 			}
 
 			// Store language in printLang selector
-			PUT_SEL32V(_segMan, _gameObj, SELECTOR(printLang), lang);
+			PUT_SEL32V(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(printLang), lang);
 		}
 	}
 
 	return lang;
 }
 
-Common::String EngineState::strSplit(const char *str, const char *sep) {
-	kLanguage lang = getLanguage();
+Common::String SciEngine::strSplit(const char *str, const char *sep) {
+	kLanguage lang = getSciLanguage();
 	kLanguage subLang = K_LANG_NONE;
 
-	if (g_sci->getKernel()->_selectorCache.subtitleLang != -1) {
-		subLang = (kLanguage)GET_SEL32V(_segMan, _gameObj, SELECTOR(subtitleLang));
+	if (_kernel->_selectorCache.subtitleLang != -1) {
+		subLang = (kLanguage)GET_SEL32V(_gamestate->_segMan, _gamestate->_gameObj, SELECTOR(subtitleLang));
 	}
 
-	Common::String retval = getLanguageString(str, lang);
+	Common::String retval = getSciLanguageString(str, lang);
 
 	if ((subLang != K_LANG_NONE) && (sep != NULL)) {
 		retval += sep;
-		retval += getLanguageString(str, subLang);
+		retval += getSciLanguageString(str, subLang);
 	}
 
 	return retval;

Modified: scummvm/trunk/engines/sci/engine/state.h
===================================================================
--- scummvm/trunk/engines/sci/engine/state.h	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/engine/state.h	2010-02-13 17:46:44 UTC (rev 48052)
@@ -80,18 +80,6 @@
 	SCI_GAME_WAS_RESTARTED_AT_LEAST_ONCE = 4
 };
 
-/** Supported languages */
-enum kLanguage {
-	K_LANG_NONE = 0,
-	K_LANG_ENGLISH = 1,
-	K_LANG_FRENCH = 33,
-	K_LANG_SPANISH = 34,
-	K_LANG_ITALIAN = 39,
-	K_LANG_GERMAN = 49,
-	K_LANG_JAPANESE = 81,
-	K_LANG_PORTUGUESE = 351
-};
-
 class FileHandle {
 public:
 	Common::String _name;
@@ -192,26 +180,6 @@
 	byte _memorySegment[kMemorySegmentMax];
 
 	EngineState *successor; /**< Successor of this state: Used for restoring */
-
-
-public:
-
-	/**
-	 * Processes a multilanguage string based on the current language settings and
-	 * returns a string that is ready to be displayed.
-	 * @param str		the multilanguage string
-	 * @param sep		optional seperator between main language and subtitle language,
-	 *					if NULL is passed no subtitle will be added to the returned string
-	 * @return processed string
-	 */
-	Common::String strSplit(const char *str, const char *sep = "\r----------\r");
-
-	kLanguage getLanguage();
-
-	Common::String getLanguageString(const char *str, kLanguage lang) const;
-
-private:
-	kLanguage charToLanguage(const char c) const;
 };
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/graphics/menu.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/menu.cpp	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/graphics/menu.cpp	2010-02-13 17:46:44 UTC (rev 48052)
@@ -190,8 +190,7 @@
 		if (separatorCount == tempPos - beginPos) {
 			itemEntry->separatorLine = true;
 		} else {
-			EngineState *s = g_sci->getEngineState();	// HACK: needed for strSplit()
-			itemEntry->text = s->strSplit(Common::String(content.c_str() + beginPos, tempPos - beginPos).c_str());
+			itemEntry->text = g_sci->strSplit(Common::String(content.c_str() + beginPos, tempPos - beginPos).c_str());
 
 			// LSL6 uses "Ctrl-" prefix string instead of ^ like all the other games do
 			tempPtr = itemEntry->text.c_str();
@@ -250,7 +249,6 @@
 }
 
 void GfxMenu::kernelSetAttribute(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value) {
-	EngineState *s = g_sci->getEngineState();	// HACK: needed for strSplit()
 	GuiMenuItemEntry *itemEntry = findItem(menuId, itemId);
 	if (!itemEntry)
 		error("Tried to setAttribute() on non-existant menu-item %d:%d", menuId, itemId);
@@ -262,7 +260,7 @@
 		itemEntry->saidVmPtr = value;
 		break;
 	case SCI_MENU_ATTRIBUTE_TEXT:
-		itemEntry->text = s->strSplit(_segMan->getString(value).c_str());
+		itemEntry->text = g_sci->strSplit(_segMan->getString(value).c_str());
 		itemEntry->textVmPtr = value;
 		// We assume here that no script ever creates a separatorLine dynamically
 		break;

Modified: scummvm/trunk/engines/sci/sci.h
===================================================================
--- scummvm/trunk/engines/sci/sci.h	2010-02-13 17:46:05 UTC (rev 48051)
+++ scummvm/trunk/engines/sci/sci.h	2010-02-13 17:46:44 UTC (rev 48052)
@@ -100,8 +100,6 @@
 	kDebugLevelOnStartup  = 1 << 23
 };
 
-extern const char *versionNames[];
-
 /** SCI versions */
 enum SciVersion {
 	SCI_VERSION_NONE,
@@ -124,6 +122,19 @@
 	kIncrementMoveCount
 };
 
+/** Supported languages */
+enum kLanguage {
+	K_LANG_NONE = 0,
+	K_LANG_ENGLISH = 1,
+	K_LANG_FRENCH = 33,
+	K_LANG_SPANISH = 34,
+	K_LANG_ITALIAN = 39,
+	K_LANG_GERMAN = 49,
+	K_LANG_JAPANESE = 81,
+	K_LANG_PORTUGUESE = 351
+};
+
+
 class SciEngine : public Engine {
 	friend class Console;
 public:
@@ -166,6 +177,22 @@
 	Common::String unwrapFilename(const Common::String &name) const;
 
 public:
+
+	/**
+	 * Processes a multilanguage string based on the current language settings and
+	 * returns a string that is ready to be displayed.
+	 * @param str		the multilanguage string
+	 * @param sep		optional seperator between main language and subtitle language,
+	 *					if NULL is passed no subtitle will be added to the returned string
+	 * @return processed string
+	 */
+	Common::String strSplit(const char *str, const char *sep = "\r----------\r");
+
+	kLanguage getSciLanguage();
+
+	Common::String getSciLanguageString(const char *str, kLanguage lang) const;
+
+public:
 	GfxAnimate *_gfxAnimate; // Animate for 16-bit gfx
 	GfxCache *_gfxCache;
 	GfxCompare *_gfxCompare;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list