Skip to content

Commit

Permalink
SHERLOCK: action processing uses fixed text class
Browse files Browse the repository at this point in the history
action error messages are now localized too
  • Loading branch information
Martin Kiewitz committed Jun 14, 2015
1 parent b26bc29 commit 1b6a60f
Show file tree
Hide file tree
Showing 8 changed files with 229 additions and 59 deletions.
182 changes: 172 additions & 10 deletions engines/sherlock/fixed_text.cpp
Expand Up @@ -85,10 +85,12 @@ static const Common::String fixedTextDE[] = {
// Journal search
"Zur\201ck",
"R\201ckw\204rts", // original: "Backward"
"V\224rw\204rts", // original: "Forward"
"Vorw\204rts", // original: "Forward"
"Text nicht gefunden!"
};


// up-side down exclamation mark - 0xAD / octal 255
// up-side down question mark - 0xA8 / octal 250
static const Common::String fixedTextES[] = {
// Window buttons
"Exit",
Expand Down Expand Up @@ -119,31 +121,191 @@ static const Common::String fixedTextES[] = {
"Texto no encontrado!"
};

static const SherlockFixedTextLanguageEntry fixedTextLanguages[] = {
{ Common::DE_DEU, fixedTextDE },
{ Common::ES_ESP, fixedTextES },
{ Common::EN_ANY, fixedTextEN },
{ Common::UNK_LANG, fixedTextEN }
// =========================================

static const Common::String fixedTextEN_ActionOpen[] = {
"This cannot be opened",
"It is already open",
"It is locked",
"Wait for Watson",
" ",
"."
};

static const Common::String fixedTextDE_ActionOpen[] = {
"Das kann man nicht \224ffnen",
"Ist doch schon offen!",
"Leider verschlossen",
"Warte auf Watson",
" ",
"."
};

static const Common::String fixedTextES_ActionOpen[] = {
"No puede ser abierto",
"Ya esta abierto",
"Esta cerrado",
"Espera a Watson",
" ",
"."
};

static const Common::String fixedTextEN_ActionClose[] = {
"This cannot be closed",
"It is already closed",
"The safe door is in the way"
};

static const Common::String fixedTextDE_ActionClose[] = {
"Das kann man nicht schlie\341en",
"Ist doch schon zu!",
"Die safet\201r ist Weg"
};

static const Common::String fixedTextES_ActionClose[] = {
"No puede ser cerrado",
"Ya esta cerrado",
"La puerta de seguridad esta entre medias"
};

static const Common::String fixedTextEN_ActionMove[] = {
"This cannot be moved",
"It is bolted to the floor",
"It is too heavy",
"The other crate is in the way"
};


static const Common::String fixedTextDE_ActionMove[] = {
"L\204\341t sich nicht bewegen",
"Festged\201belt in der Erde...",
"Oha, VIEL zu schwer",
"Der andere Kiste ist im Weg" // [sic]
};

static const Common::String fixedTextES_ActionMove[] = {
"No puede moverse",
"Esta sujeto a la pared",
"Es demasiado pesado",
"El otro cajon esta en mitad"
};

static const Common::String fixedTextEN_ActionPick[] = {
"Nothing of interest here",
"It is bolted down",
"It is too big to carry",
"It is too heavy",
"I think a girl would be more your type",
"Those flowers belong to Penny",
"She's far too young for you!",
"I think a girl would be more your type!",
"Government property for official use only"
};

static const Common::String fixedTextDE_ActionPick[] = {
"Nichts Interessantes da",
"Zu gut befestigt",
"Ist ja wohl ein bi\341chen zu gro\341, oder ?",
"Ich denke, Du stehst mehr auf M\204dchen ?",
"Diese Blumen geh\224ren Penny",
"Sie ist doch viel zu jung f\201r Dich!",
"Staatseigentum - Nur für den Dienstgebrauch !"
};

static const Common::String fixedTextES_ActionPick[] = {
"No hay nada interesante",
"Esta anclado al suelo",
"Es muy grande para llevarlo",
"Pesa demasiado",
"Creo que una chica sera mas tu tipo",
"Esas flores pertenecen a Penny",
"\255Es demasiado joven para ti!"
"\255Creo que una chica sera mas tu tipo!",
"Propiedad del gobierno para uso oficial"
};

static const Common::String fixedTextEN_ActionUse[] = {
"You can't do that",
"It had no effect",
"You can't reach it",
"OK, the door looks bigger! Happy?"
"Doors don't smoke"
};

static const Common::String fixedTextDE_ActionUse[] = {
"Nein, das geht wirklich nicht",
"Tja keinerlei Wirkung",
"Da kommst du nicht dran",
"Na gut, die Tür sieht jetzt gr\224\341er aus. Zufrieden?"
"Türen sind Nichtraucher!"
};

static const Common::String fixedTextES_ActionUse[] = {
"No puedes hacerlo",
"No tuvo ningun efecto",
"No puedes alcanzarlo",
"Bien, \255es enorme! \250Feliz?"
"Las puertas no fuman"
};

static const FixedTextActionEntry fixedTextEN_Actions[] = {
{ fixedTextEN_ActionOpen },
{ fixedTextEN_ActionClose },
{ fixedTextEN_ActionMove },
{ fixedTextEN_ActionPick },
{ fixedTextEN_ActionUse }
};

static const FixedTextActionEntry fixedTextDE_Actions[] = {
{ fixedTextDE_ActionOpen },
{ fixedTextDE_ActionClose },
{ fixedTextDE_ActionMove },
{ fixedTextDE_ActionPick },
{ fixedTextDE_ActionUse }
};

static const FixedTextActionEntry fixedTextES_Actions[] = {
{ fixedTextES_ActionOpen },
{ fixedTextES_ActionClose },
{ fixedTextES_ActionMove },
{ fixedTextES_ActionPick },
{ fixedTextES_ActionUse }
};

// =========================================

static const FixedTextLanguageEntry fixedTextLanguages[] = {
{ Common::DE_DEU, fixedTextDE, fixedTextDE_Actions },
{ Common::ES_ESP, fixedTextES, fixedTextES_Actions },
{ Common::EN_ANY, fixedTextEN, fixedTextEN_Actions },
{ Common::UNK_LANG, fixedTextEN, fixedTextEN_Actions }
};

// =========================================

// =========================================

FixedText::FixedText(SherlockEngine *vm) : _vm(vm) {
// Figure out which fixed texts to use
Common::Language curLanguage = _vm->getLanguage();

const SherlockFixedTextLanguageEntry *curLanguageEntry = fixedTextLanguages;
const FixedTextLanguageEntry *curLanguageEntry = fixedTextLanguages;

while (curLanguageEntry->language != Common::UNK_LANG) {
if (curLanguageEntry->language == curLanguage)
break; // found current language
curLanguageEntry++;
}
_fixedText = curLanguageEntry->fixedTextArray;
_curLanguageEntry = curLanguageEntry;
}

const Common::String FixedText::getText(FixedTextId fixedTextId) {
return _fixedText[fixedTextId];
return _curLanguageEntry->fixedTextArray[fixedTextId];
}

const Common::String FixedText::getActionMessage(FixedTextActionId actionId, int messageIndex) {
assert(actionId >= 0);
return _curLanguageEntry->actionArray[actionId].fixedTextArray[messageIndex];
}

} // End of namespace Sherlock
21 changes: 19 additions & 2 deletions engines/sherlock/fixed_text.h
Expand Up @@ -24,6 +24,7 @@
#define SHERLOCK_FIXED_TEXT_H

#include "common/scummsys.h"
#include "common/language.h"

namespace Sherlock {

Expand Down Expand Up @@ -57,16 +58,30 @@ enum FixedTextId {
kFixedText_JournalSearch_NotFound
};

struct SherlockFixedTextLanguageEntry {
enum FixedTextActionId {
kFixedTextAction_Invalid = -1,
kFixedTextAction_Open = 0,
kFixedTextAction_Close,
kFixedTextAction_Move,
kFixedTextAction_Pick,
kFixedTextAction_Use
};

struct FixedTextActionEntry {
const Common::String *fixedTextArray;
};

struct FixedTextLanguageEntry {
Common::Language language;
const Common::String *fixedTextArray;
const FixedTextActionEntry *actionArray;
};

class FixedText {
private:
SherlockEngine *_vm;

const Common::String *_fixedText;
const FixedTextLanguageEntry *_curLanguageEntry;

public:
FixedText(SherlockEngine *vm);
Expand All @@ -76,6 +91,8 @@ class FixedText {
* Gets hardcoded text
*/
const Common::String getText(FixedTextId fixedTextId);

const Common::String getActionMessage(FixedTextActionId actionId, int messageIndex);
};

} // End of namespace Sherlock
Expand Down
18 changes: 11 additions & 7 deletions engines/sherlock/objects.cpp
Expand Up @@ -348,7 +348,7 @@ void BaseObject::checkObject() {

} else if (v < USE_COUNT) {
for (int idx = 0; idx < NAMES_COUNT; ++idx) {
checkNameForCodes(_use[v]._names[idx], nullptr);
checkNameForCodes(_use[v]._names[idx]);
}

if (_use[v]._useFlag)
Expand Down Expand Up @@ -488,7 +488,8 @@ void BaseObject::setObjSequence(int seq, bool wait) {
}
}

int BaseObject::checkNameForCodes(const Common::String &name, const char *const messages[]) {
int BaseObject::checkNameForCodes(const Common::String &name, FixedTextActionId fixedTextActionId) {
FixedText &fixedText = *_vm->_fixedText;
People &people = *_vm->_people;
Scene &scene = *_vm->_scene;
Screen &screen = *_vm->_screen;
Expand Down Expand Up @@ -571,7 +572,8 @@ int BaseObject::checkNameForCodes(const Common::String &name, const char *const
int messageNum = atoi(name.c_str() + 1);
ui._infoFlag = true;
ui.clearInfo();
screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, "%s", messages[messageNum]);
Common::String errorMessage = fixedText.getActionMessage(fixedTextActionId, messageNum);
screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, errorMessage.c_str());
ui._menuCounter = 25;
} else if (name.hasPrefix("@")) {
// Message attached to canimation
Expand Down Expand Up @@ -1413,7 +1415,8 @@ void Object::adjustObject() {
}
}

int Object::pickUpObject(const char *const messages[]) {
int Object::pickUpObject(FixedTextActionId fixedTextActionId) {
FixedText &fixedText = *_vm->_fixedText;
Inventory &inv = *_vm->_inventory;
People &people = *_vm->_people;
Scene &scene = *_vm->_scene;
Expand All @@ -1426,7 +1429,7 @@ int Object::pickUpObject(const char *const messages[]) {

if (pickup == 99) {
for (int idx = 0; idx < NAMES_COUNT && !talk._talkToAbort; ++idx) {
if (checkNameForCodes(_use[0]._names[idx], nullptr)) {
if (checkNameForCodes(_use[0]._names[idx], kFixedTextAction_Invalid)) {
if (!talk._talkToAbort)
printed = true;
}
Expand All @@ -1442,7 +1445,8 @@ int Object::pickUpObject(const char *const messages[]) {

ui._infoFlag = true;
ui.clearInfo();
screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, "%s", messages[message]);
Common::String errorMessage = fixedText.getActionMessage(fixedTextActionId, message);
screen.print(Common::Point(0, INFO_LINE + 1), INFO_FOREGROUND, errorMessage.c_str());
ui._menuCounter = 30;
} else {
// Pick it up
Expand Down Expand Up @@ -1473,7 +1477,7 @@ int Object::pickUpObject(const char *const messages[]) {
}

for (int idx = 0; idx < NAMES_COUNT && !talk._talkToAbort; ++idx) {
if (checkNameForCodes(_use[0]._names[idx], nullptr)) {
if (checkNameForCodes(_use[0]._names[idx], kFixedTextAction_Invalid)) {
if (!talk._talkToAbort)
printed = true;
}
Expand Down
7 changes: 4 additions & 3 deletions engines/sherlock/objects.h
Expand Up @@ -28,6 +28,7 @@
#include "common/str-array.h"
#include "common/str.h"
#include "sherlock/image_file.h"
#include "sherlock/fixed_text.h"

namespace Sherlock {

Expand Down Expand Up @@ -248,7 +249,7 @@ class BaseObject {
* @param messages Provides a lookup list of messages that can be printed
* @returns 0 if no codes are found, 1 if codes were found
*/
int checkNameForCodes(const Common::String &name, const char *const messages[]);
int checkNameForCodes(const Common::String &name, FixedTextActionId fixedTextActionId = kFixedTextAction_Invalid);

/**
* Adjusts the frame and sequence variables of a sprite that corresponds to the current speaker
Expand Down Expand Up @@ -400,13 +401,13 @@ class Object: public BaseObject {
* Handles trying to pick up an object. If allowed, plays an y necessary animation for picking
* up the item, and then adds it to the player's inventory
*/
int pickUpObject(const char *const messages[]);
int pickUpObject(FixedTextActionId fixedTextActionId = kFixedTextAction_Invalid);

/**
* Return the frame width
*/
int frameWidth() const { return _imageFrame ? _imageFrame->_frame.w : 0; }

/**
* Return the frame height
*/
Expand Down

0 comments on commit 1b6a60f

Please sign in to comment.