[Scummvm-git-logs] scummvm master -> ebe7ad7d6620102b68d345d51c477bd032743e1b
yuv422
noreply at scummvm.org
Sat Feb 15 22:42:51 UTC 2025
This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
42ec4849a2 DARKSEED: Add korean to I18nText struct
295703a8d2 DARKSEED: Refactoring console text handling to better support multi-byte languages.
be56262a53 DARKSEED: Getting ready to support multi-byte object names.
5433135288 DARKSEED: Korean object names
ad8a140af7 DARKSEED: Add Korean object names when picking up objects and putting under pillow.
ebe7ad7d66 DARKSEED: Add Korean generic response text
Commit: 42ec4849a237271afe5d604c92e5cbe9198943e1
https://github.com/scummvm/scummvm/commit/42ec4849a237271afe5d604c92e5cbe9198943e1
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Add korean to I18nText struct
Changed paths:
engines/darkseed/langtext.h
diff --git a/engines/darkseed/langtext.h b/engines/darkseed/langtext.h
index c514d45c6a5..f278dffb83b 100644
--- a/engines/darkseed/langtext.h
+++ b/engines/darkseed/langtext.h
@@ -31,6 +31,7 @@ struct I18nText {
const char *es;
const char *fr;
const char *de;
+ const char *ko;
};
struct TextWithPosition {
@@ -57,294 +58,336 @@ constexpr I18nText kI18N_CarKeysIgnitionText = {
"You see the car keys in the ignition.",
"VES LAS LLAVES DEL COCHE EN EL CONTACTO.",
"VOUS VOYEZ LES CLEFS DE LA VOTTURE DAUS LE STARTER.",
- "DU SIEHSTDIE AUTOSCHLUSSEL IM ANLASSER."
+ "DU SIEHSTDIE AUTOSCHLUSSEL IM ANLASSER.",
+ nullptr
};
constexpr I18nText kI18N_YouSeeIronBarsText = {
"You see the iron bars of your cell.",
"VES LAS BARRAS DE HIERRO DE TU CELDA.",
"VOUS VOYEZ LES BARREAUX DE FER DE VOTRE CELLULE.",
- "DU SIEHST DIE EISENSTANGEN IN DER ZELLE."
+ "DU SIEHST DIE EISENSTANGEN IN DER ZELLE.",
+ nullptr
};
constexpr I18nText kI18N_YouSeeDelbertText = {
"You see Delbert, not much to look at.",
"VES A DELBERT, NO HAY MUCHO QUE VER.",
"VOUS VOYEZ DELBERT, PAS GRAND CHOSE A VOIR.",
- "DU SIEHST DELBERT, NICHT VIEL ZU SEHEN"
+ "DU SIEHST DELBERT, NICHT VIEL ZU SEHEN",
+ nullptr
};
constexpr I18nText kI18N_YouSeeTheClerkText = {
"You see the clerk.",
"VES AL EMPLEADO.",
"VOUS VOYEZ L'HOMME.",
- "DU SIEHST DEN MANN."
+ "DU SIEHST DEN MANN.",
+ nullptr
};
constexpr I18nText kI18N_YouSeeTheOpenGloveBoxText = {
"You see the open glove box.",
"VES LA CAJA DE LOS GUANTES ABIERTA.",
"VOUS VOYEZ LA BOITE DE GANT OUVERTE.",
- "DU SIEHST DAS OFFENE HANDSCHUHFACH."
+ "DU SIEHST DAS OFFENE HANDSCHUHFACH.",
+ nullptr
};
constexpr I18nText kI18N_youSeeTheText = {
"You see the",
"VES",
"VOUS VOYEZ",
- "DU SIEHST"
+ "DU SIEHST",
+ nullptr
};
constexpr I18nText kI18N_TheCopsIgnoreYourDemandsText = {
"The cops ignore your demands for attention.",
"LOS POLICIAS IGNORAN TUS LLAMADAS DE ATENCION.",
"LES FLICS IGNORENT VOTRE DEMANDE D'ATTENTION.",
- "DIE POLIZISTEN BEACHTEN NICHT DEINE FORDERUNGEN."
+ "DIE POLIZISTEN BEACHTEN NICHT DEINE FORDERUNGEN.",
+ nullptr
};
constexpr I18nText kI18N_ThePhoneIsRingingText = {
"The phone is ringing.",
"EL TELEFONO ESTA SONANDO.",
"LE TELEPHONE SONNE.",
- "DAS TELEFON KLINGELT."
+ "DAS TELEFON KLINGELT.",
+ "\xb8\xe5\xd1\xc1\xa5\x49\xb7\xa1\x20\xb6\x89\x9f\xb3\x93\xa1\x94\x61\x2e"
};
constexpr I18nText kI18N_TheDoorbellIsRingingText = {
"The doorbell is ringing.",
"EL TIMBRE DE LA PUERTA ESTA SONANDO.",
"LA SONETTE DE LA PORTE SONNE.",
- "DIE TUERKLINGEL LAEUTET."
+ "DIE TUERKLINGEL LAEUTET.",
+ nullptr
};
constexpr I18nText kI18N_ChooseAnItemBeforeText = {
"Choose an item before giving clerk more money.",
"ELIGE UN OBJETO ANTES DE DARLE AL EMPLEADO MAS DINERO.",
"CHOISISSEZ QUELQUE CHOSE AVANT DE REMETTRE L'ARGENT A VENDEUR.",
- "SUCHE ETWAS AUS BEVOR DU DEN MANN BEZAHLST."
+ "SUCHE ETWAS AUS BEVOR DU DEN MANN BEZAHLST.",
+ nullptr
};
constexpr I18nText kI18N_YouTouchDelbertText = {
"You touch Delbert...",
"TOCAS A DELBERT...",
"VOUS TOUCHEZ DELBERT.",
- "GREIFE DELBERT AN..."
+ "GREIFE DELBERT AN...",
+ nullptr
};
constexpr I18nText kI18N_YouTouchTheColdIronBarsText = {
"You touch the cold iron bars.",
"TOCAS LAS FRIAS BARRAS DE HIERRO.",
"VOUS TOUCHEZ LES BARREAUX DE FER.",
- "GREIFE DIE KALTEN EISEN STANGEN AN."
+ "GREIFE DIE KALTEN EISEN STANGEN AN.",
+ nullptr
};
constexpr I18nText kI18N_TheSergeantSaysNiceGunText = {
"The sergeant says 'Nice gun eh? It's a Browning'",
"EL SARGENTO DICE: 'BUENA PISTOLA, EH? ES UNA BROWNING.'",
"LE SERGENT DIT: BEAU REVOLVER HEIN, C'EST UN BROWNING.",
- "DER SEARGENT SAGT 'SCHOENE PISTOLE, EH? ES IST EIN BROWNING.'"
+ "DER SEARGENT SAGT 'SCHOENE PISTOLE, EH? ES IST EIN BROWNING.'",
+ nullptr
};
constexpr I18nText kI18N_YouTurnOnTheMusicText = {
"You turn on the music.",
"PONES MUSICA.",
"VOUS METTEZ LA MUSIQUE.",
- "SCHALTE DIE MUSIK AN."
+ "SCHALTE DIE MUSIK AN.",
+ nullptr
};
constexpr I18nText kI18N_YouTurnOffTheMusicText = {
"You turn off the music.",
"QUITAS LA MUSICA.",
"VOUS ARRETEZ LA MUSIQUE.",
- "SCHALTE DIE MUSIK AB."
+ "SCHALTE DIE MUSIK AB.",
+ nullptr
};
constexpr I18nText kI18N_YouTouchTheOrnateSignalText = {
"You touch the surface of the ornate sigil.",
"TOCAS LA SUPERFICIE DE LA FIGURA ADORNADA.",
"VOUS TOUCHEZ LA SURFACE DE LA PIERRE MAGIQUE.",
- "GREIFE DIE VERZAUBERTEN STEINE AN."
+ "GREIFE DIE VERZAUBERTEN STEINE AN.",
+ nullptr
};
constexpr I18nText kI18N_ThisSentryCannotBeStoppedWithText = {
"This sentry cannot be stopped with a",
"NO PUEDES PARAR A ESTE CENTINELA CON",
"VOUS N'ARRETEREZ PAS LA SENTINELLE AVEC",
- "DIESE WACHE KANN NICHT AUFGEHALTEN WERDEN MIT"
+ "DIESE WACHE KANN NICHT AUFGEHALTEN WERDEN MIT",
+ nullptr
};
constexpr I18nText kI18N_HasNoEffectOnTheAlienTubesText = {
"The %s has no effect on the alien tubes.",
"%s NO TIENE EFECTO SOBRE LOS TUBOS ALIENIGENAS.",
"%s RESTE SANS EFFET SUR LES TUBES EXTRA-TERRESTRES.",
- "%s BEWIRKT NICHTS AN AUSSERIRDISCHEN TUNNELS."
+ "%s BEWIRKT NICHTS AN AUSSERIRDISCHEN TUNNELS.",
+ nullptr
};
constexpr I18nText kI18N_YouIncinerateTheText = {
"You incinerate the %s inside the power nexus!.",
"INCINERAS %s DENTRO DE LA FUENTA DE ENERGIA.",
"VOUS INCINEREZ %s A L'INTERIEUR DU LIEN DE PUISSANCE.",
- "DU VERNICHTEST %s MIT DER STROMVERSORGUNG!"
+ "DU VERNICHTEST %s MIT DER STROMVERSORGUNG!",
+ nullptr
};
constexpr I18nText kI18N_HasNoEffectOnTheAlienMonstrosityText = {
"The %s has no effect on this alien monstrosity.",
"%s NO TIENE EFECTO SOBRE ESTA MONSTRUOSIDAD ALIENIGENA.",
"%s RESTE SANS EFFET SUR CETTE MONSTRUOSITE EXTRA-TERRESTRE.",
- "%s BEWIRKT NICHTS AM AUSSERIRDISCHEN MONSTRUM."
+ "%s BEWIRKT NICHTS AM AUSSERIRDISCHEN MONSTRUM.",
+ nullptr
};
constexpr I18nText kI18N_cutTheWiresText = {
"The %s is not strong enough to cut the cables.\nPerhaps if you had some wire cutters?",
"%s NO ES LO BASTANTE RESISTENTE COMO PARA CORTAR LOS CABLES.\nY SI TUVIERAS UN CORTACABLES?",
"%s NE POURRA PAS COUPER LES CABLES.\nET SI VOUS AVIEZ DES PINCES COUPANTES?",
- "%s IST NICHT STARK GENUG, UM DIE KABEL ABZUSCHNEIDEN.\nHAST DU VIELLEICHT EINEN KABELSCHNEIDER?"
+ "%s IST NICHT STARK GENUG, UM DIE KABEL ABZUSCHNEIDEN.\nHAST DU VIELLEICHT EINEN KABELSCHNEIDER?",
+ nullptr
};
constexpr I18nText kI18N_NoEffectOnTheProtectedAncientText = {
"The %s has no effect on the protected ancient.",
"%s NO TIENE EFECTO SOBRE EL ANTEPASADO PROTEGIDO.",
"%s N'A AUCUN EFFET SUR L'ANCIEN PROTEGE.",
- "%s BEWIRKT NICHTS BEI DEM GESCHUETZTEN ALTEN."
+ "%s BEWIRKT NICHTS BEI DEM GESCHUETZTEN ALTEN.",
+ nullptr
};
constexpr I18nText kI18N_YouHideTheObjectUnderThePillowText = {
"You hide the %s under the pillow.",
"OCULTAS %s BAJO LA ALMOHADA.",
"VOUS CACHEZ %s SOUS L'OREILLER.",
- "DU VERSTECKST %s UNTER DEM KISSEN."
+ "DU VERSTECKST %s UNTER DEM KISSEN.",
+ nullptr
};
constexpr I18nText kI18N_DontPutTheObjectInTheTrunkText = {
"Don't put the %s in the trunk, you'll forget it.",
"NO PONGAS %s EN EL BAUL, TE OLVIDARAS.",
"NE METTEZ PAS %s DANS LE COFFRE, VOUS L'OUBLIEREZ.",
- "WENN DU %s IN DEN TRUHE LEGST, VERGISST DU ES." // TODO check this is correct.
+ "WENN DU %s IN DEN TRUHE LEGST, VERGISST DU ES.", // TODO check this is correct.
+ nullptr
};
constexpr I18nText kI18N_TheCarWontStartWithTheText = {
"The car won't start with the %s.",
"EL COCHE NO SE PONDRA EN MARCHA CON %s.",
"LA VOITURE NE DEMARRERA PAS AVEC %s.",
- "DAS AUTO SPRINGT NICHT AN MIT %s."
+ "DAS AUTO SPRINGT NICHT AN MIT %s.",
+ nullptr
};
constexpr I18nText kI18N_IfYouPutTheObjectInTheTrunkText = {
"If you put the %s in the trunk, you'll forget it.",
"SI PONES %s EN EL BAUL, TE OLVIDARAS.",
"SI VOUS METTEZ %s DANS LE COFFRE, VOUS L'OUBLIEREZ.",
- "WENN DU %s IN DEN TRUHE LEGST, VERGISST DU ES."
+ "WENN DU %s IN DEN TRUHE LEGST, VERGISST DU ES.",
+ nullptr
};
constexpr I18nText kI18N_TheObjectIsYoursYouHaventLostItText = {
"The %s is yours, you haven't lost it.",
"%s ES TUYA, NO LA HASA PERDIDO.",
"%s EST A VOUS, VOUS NE L'AVEZ PAS PERDUE.",
- "%s GEHOERT DIR, DU HAST ES NICHT VERLOREN."
+ "%s GEHOERT DIR, DU HAST ES NICHT VERLOREN.",
+ nullptr
};
constexpr I18nText kI18N_notAGoodPlaceToHideTheText = {
"Not a good place to hide the %s.",
"NO ES UN BUEN SITIO PARA OCULTAR %S.",
"VOUS NE POURREZ PAS CACHER %S.",
- "KEIN GUTES VERSTECK FUER %S."
+ "KEIN GUTES VERSTECK FUER %S.",
+ nullptr
};
constexpr I18nText kI18N_youTryToPutTheObjectInsideButTheDoorWontOpenText = {
"You try to put the %s inside, but the door won't open",
"INTENTAS PONER %s DENTRO, PERO LA PUERTA NO SE ABRIRA.",
"VOUS ESSAYEZ DE METTRE %s A L'INTERIEUR, MAIS LA PORTE NE S'OUVRIRA PAS.",
- "DU VERSUCHST, %s HINEINZUSTELLEN, ABER DIE TUER OEFFNET SICH NICHT."
+ "DU VERSUCHST, %s HINEINZUSTELLEN, ABER DIE TUER OEFFNET SICH NICHT.",
+ nullptr
};
constexpr I18nText kI18N_theKitchenIsNoPlaceToKeepTheText = {
"The kitchen is no place to keep the %s.",
"LA COCINA NO ES LUGAR PARA GUARDAR %s.",
"LA CUISINE NE CONVIENT PAS A %s.",
- "DIE KUECHE IST KEIN PLATZ FUER %s."
+ "DIE KUECHE IST KEIN PLATZ FUER %s.",
+ nullptr
};
constexpr I18nText kI18N_youllForgetTheObjectHereText = {
"You'll forget the %s here.",
"OLIVIDARAS %s AQUI.",
"VOUS OUBLIEREZ %s ICI.",
- "DU WIRST NOCH %s HIER VERGESSEN."
+ "DU WIRST NOCH %s HIER VERGESSEN.",
+ nullptr
};
constexpr I18nText kI18N_youdRatherHaveTheObjectWithYouText = {
"You'd rather have the %s with you.",
"SERIA MEJOR TENER %s CONTIGO.",
"IL VAUDRAIT MIEUX AVOIR %s SUR VOUS.",
- "DU HAETTEST LIEBER %s BEI DIR."
+ "DU HAETTEST LIEBER %s BEI DIR.",
+ nullptr
};
constexpr I18nText kI18N_theObjectHasNoEffectText = {
"The %s has no effect.",
"%s NO TIENE EFECTO.",
"%s N'A AUCUN EFFET.",
- "%s BEWIRKT NICHTS."
+ "%s BEWIRKT NICHTS.",
+ nullptr
};
constexpr I18nText kI18N_thisIsNotAGoodPlaceForTheText = {
"This is not a good place for the %s.",
"NO ES UN BUEN SITIO PARA %s.",
"CE N'EST PAS UN BON ENDROIT POUR %s.",
- "DAS IST KEIN GUTER PLATZ FUER %s."
+ "DAS IST KEIN GUTER PLATZ FUER %s.",
+ nullptr
};
constexpr I18nText kI18N_youSeeAReflectionOfTheText = {
"You see a reflection of the %s.",
"VES UN REFLEJO DE %s.",
"VOUS VOYEZ UN REFLET REPRESENTANT %s.",
- "DU SIEHST EIN SPIEGELBILD VON %s."
+ "DU SIEHST EIN SPIEGELBILD VON %s.",
+ nullptr
};
constexpr I18nText kI18N_youDontWantToLeaveTheObjectUnderTheBedText = {
"You don't want to leave the %s under the bed.",
"NO QUIERES DEJAR %s DEBAJO DE LA CAMA.",
"POURQUOI LAISSERIEZ-VOUS %s SOUS LE LIT?",
- "DU WILLST %s NICHT UNTER DEM BETT LASSEN."
+ "DU WILLST %s NICHT UNTER DEM BETT LASSEN.",
+ nullptr
};
constexpr I18nText kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeadachesText = {
"Using the %s on the %s doesn't make any sense, it must be your headaches!",
"UTILIZAR %s EN %s NO TIENE SENTIDO, TE PRODUCIRA DOLOR DE CABEZA",
"POURQUOI UTILISER %s SUR %s PRENEZ DONC DE L'ASPIRINE!",
- "GEBRAUCHEN VON %s AUF %s MACHT KEINEN SINN, DAS MUSS AN DEINEN KOPFSCHMERZEN LIEGEN!"
+ "GEBRAUCHEN VON %s AUF %s MACHT KEINEN SINN, DAS MUSS AN DEINEN KOPFSCHMERZEN LIEGEN!",
+ nullptr
};
constexpr I18nText kI18N_genResponse1_theObjectWillDoNothingToTheText = {
"The %s will do nothing to the %s.",
"%s NO TIENE NADA QUE VER CON %s.",
"%s NE FERONT RIEN A %s.",
- "%s HAT NICHTS ZU TUN MIT %s"
+ "%s HAT NICHTS ZU TUN MIT %s",
+ nullptr
};
constexpr I18nText kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText = {
"The %s doesn't have any effect on the %s.",
"%s NO LE CAUSARA EFECTO A %s.",
"%s N'AURA AUCUN EFFET SUR %s.",
- "%s BEWIRKT NICHTS MIT %s."
+ "%s BEWIRKT NICHTS MIT %s.",
+ nullptr
};
constexpr I18nText kI18N_genResponse3_theObjectHasNothingToDoWithTheText = {
"The %s has nothing to do with %s.",
"%s NO TIENE NADA QUE VER CON %s.",
"%s N'A AUCUN RAPPORT AVEC %s.",
- "%s HAT NICHTS ZU TUN MIT %s."
+ "%s HAT NICHTS ZU TUN MIT %s.",
+ nullptr
};
constexpr I18nText kI18N_genResponse4_areYouFeelingAlrightText = {
"Are you feeling alright?",
"TE ENCUENTRAS BIEN?",
"VOUS ETES SUR QUE CA VA BIEN?",
- "FUEHLST DU DICH GUT?"
+ "FUEHLST DU DICH GUT?",
+ nullptr
};
constexpr I18nText kI18N_blankText = {
"",
"",
"",
- ""
+ "",
+ nullptr
};
} // namespace Darkseed
Commit: 295703a8d2887a405ba07c9a0971ac7f8c6ae830
https://github.com/scummvm/scummvm/commit/295703a8d2887a405ba07c9a0971ac7f8c6ae830
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Refactoring console text handling to better support multi-byte languages.
Changed paths:
engines/darkseed/console.cpp
engines/darkseed/console.h
engines/darkseed/darkseed.cpp
engines/darkseed/inventory.cpp
engines/darkseed/langtext.cpp
engines/darkseed/langtext.h
engines/darkseed/objects.cpp
engines/darkseed/objects.h
engines/darkseed/usecode.cpp
engines/darkseed/usecode.h
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 33798fc866c..2f6a2510b71 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -69,19 +69,15 @@ void Console::printTosText(int tosIndex) {
}
debug("%s", "");
}
- addTextLineU32(text);
+ addTextLine(text);
_sound->playTosSpeech(tosIndex);
}
-void Console::addTextLine(const Common::String &text) {
- addTextLineU32(Common::U32String(text));
-}
-
void Console::addToCurrentLine(const Common::String &text) {
addToCurrentLineU32(Common::U32String(text));
}
-void Console::addTextLineU32(const Common::U32String &text) {
+void Console::addTextLine(const Common::U32String &text) {
Common::U32StringArray lines;
_font->wordWrapText(text, consoleArea.width(), lines);
for (auto &line : lines) {
@@ -92,7 +88,7 @@ void Console::addTextLineU32(const Common::U32String &text) {
void Console::addToCurrentLineU32(const Common::U32String &text) {
int curIdx = _startIdx == 0 ? _text.size() - 1 : _startIdx - 1;
_startIdx = curIdx;
- addTextLineU32(_text[_startIdx] + text);
+ addTextLine(_text[_startIdx] + text);
}
void Console::addI18NText(const I18nText &text) {
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 61fdc44948c..78b5c56f76f 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -47,8 +47,9 @@ public:
~Console();
void printTosText(int tosIndex);
- void addTextLine(const Common::String &text);
+ void addTextLine(const Common::U32String &text);
void addToCurrentLine(const Common::String &text);
+ void addToCurrentLineU32(const Common::U32String &text);
void addI18NText(const I18nText &text);
@@ -56,8 +57,6 @@ public:
void drawStringAt(int x, int y, const Common::U32String &text) const;
private:
- void addTextLineU32(const Common::U32String &text);
- void addToCurrentLineU32(const Common::U32String &text);
void addLine(const Common::U32String &line);
};
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 4c90290dde7..88c91689f27 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1902,7 +1902,7 @@ void DarkseedEngine::lookCode(int objNum) {
}
return;
}
- _console->addTextLine(Common::String::format("%s %s.", getI18NText(kI18N_youSeeTheText), _objectVar.getObjectName(objNum)));
+ _console->addTextLine(formatInjectStrings(getI18NText(kI18N_youSeeTheText), _objectVar.getObjectName(objNum).c_str()));
}
void DarkseedEngine::printTime() {
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index 331bf15ea99..c81f42bb4f5 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -160,7 +160,7 @@ void Inventory::handleClick() {
} else {
g_engine->_actionMode = icon;
g_engine->_console->printTosText(972);
- g_engine->_console->addToCurrentLine(Common::String::format("%s.", g_engine->_objectVar.getObjectName(icon)));
+ g_engine->_console->addToCurrentLine(formatInjectStrings(Common::U32String("%s."), g_engine->_objectVar.getObjectName(icon).c_str()));
}
}
diff --git a/engines/darkseed/langtext.cpp b/engines/darkseed/langtext.cpp
index 93db6813f4f..dc6417ca500 100644
--- a/engines/darkseed/langtext.cpp
+++ b/engines/darkseed/langtext.cpp
@@ -24,12 +24,13 @@
namespace Darkseed {
-const char *getI18NText(const I18nText &text) {
+Common::U32String getI18NText(const I18nText &text) {
switch (g_engine->getLanguage()) {
- case Common::ES_ESP : return text.es;
- case Common::FR_FRA : return text.fr;
- case Common::DE_DEU : return text.de;
- default : return text.en;
+ case Common::ES_ESP : return Common::U32String(text.es);
+ case Common::FR_FRA : return Common::U32String(text.fr);
+ case Common::DE_DEU : return Common::U32String(text.de);
+ case Common::KO_KOR : return text.ko ? convertToU32String(text.ko, Common::KO_KOR) : Common::U32String(text.en);
+ default : return Common::U32String(text.en);
}
}
@@ -68,4 +69,30 @@ Common::U32String convertToU32String(const char *text, Common::Language language
return Common::U32String(text);
}
+Common::U32String formatInjectStrings(Common::U32String format, ...) {
+ Common::U32String outString;
+ va_list args;
+ va_start(args, format);
+
+ for (Common::U32String::const_iterator itr = format.begin(); itr != format.end(); itr++) {
+ if (*itr == '%') {
+ itr++;
+ if (itr == format.end()) {
+ outString += '%';
+ break;
+ }
+ if (*itr == 's') {
+ auto text = va_arg(args, char32_t *);
+ outString += text;
+ } else {
+ outString += *itr;
+ }
+ } else {
+ outString += *itr;
+ }
+ }
+ va_end(args);
+ return outString;
+}
+
} // End of namespace Darkseed
diff --git a/engines/darkseed/langtext.h b/engines/darkseed/langtext.h
index f278dffb83b..5234024b433 100644
--- a/engines/darkseed/langtext.h
+++ b/engines/darkseed/langtext.h
@@ -49,11 +49,13 @@ struct I18NTextWithPosition {
};
-const char *getI18NText(const I18nText &text);
+Common::U32String getI18NText(const I18nText &text);
const TextWithPosition &getI18NTextWithPosition(const I18NTextWithPosition &i18nTextWithPosition);
Common::U32String convertToU32String(const char *text, Common::Language language);
+Common::U32String formatInjectStrings(Common::U32String format, ...);
+
constexpr I18nText kI18N_CarKeysIgnitionText = {
"You see the car keys in the ignition.",
"VES LAS LLAVES DEL COCHE EN EL CONTACTO.",
@@ -95,10 +97,10 @@ constexpr I18nText kI18N_YouSeeTheOpenGloveBoxText = {
};
constexpr I18nText kI18N_youSeeTheText = {
- "You see the",
- "VES",
- "VOUS VOYEZ",
- "DU SIEHST",
+ "You see the %s.",
+ "VES %s.",
+ "VOUS VOYEZ %s.",
+ "DU SIEHST %s.",
nullptr
};
@@ -183,10 +185,10 @@ constexpr I18nText kI18N_YouTouchTheOrnateSignalText = {
};
constexpr I18nText kI18N_ThisSentryCannotBeStoppedWithText = {
- "This sentry cannot be stopped with a",
- "NO PUEDES PARAR A ESTE CENTINELA CON",
- "VOUS N'ARRETEREZ PAS LA SENTINELLE AVEC",
- "DIESE WACHE KANN NICHT AUFGEHALTEN WERDEN MIT",
+ "This sentry cannot be stopped with a %s.",
+ "NO PUEDES PARAR A ESTE CENTINELA CON %s.",
+ "VOUS N'ARRETEREZ PAS LA SENTINELLE AVEC %s.",
+ "DIESE WACHE KANN NICHT AUFGEHALTEN WERDEN MIT %s.",
nullptr
};
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 8dfe06a0498..9cc48ce03c0 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -184,19 +184,19 @@ void Objects::setObjectRunningCode(int idx, int16 value) {
_objectRunningCode[idx] = value;
}
-const char *Objects::getObjectName(int idx) {
+Common::U32String Objects::getObjectName(int idx) {
if (idx < 0 || idx >= MAX_OBJECTS) {
error("getObjectName: index out of range.");
}
switch (g_engine->getLanguage()) {
- case Common::FR_FRA: return objectNameTbl_fr[idx];
- case Common::DE_DEU: return objectNameTbl_de[idx];
- case Common::ES_ESP: return objectNameTbl_es[idx];
+ case Common::FR_FRA: return Common::U32String(objectNameTbl_fr[idx]);
+ case Common::DE_DEU: return Common::U32String(objectNameTbl_de[idx]);
+ case Common::ES_ESP: return Common::U32String(objectNameTbl_es[idx]);
default: break;
}
- return objectNameTbl_en[idx];
+ return Common::U32String(objectNameTbl_en[idx]);
}
static inline void syncPoint(Common::Serializer &s, Common::Point &value) {
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index cc5345e5294..1e690ac1df7 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -62,7 +62,7 @@ public:
int getMoveObjectRoom(uint16 idx);
void setMoveObjectRoom(uint16 idx, uint8 value);
- const char *getObjectName(int idx);
+ Common::U32String getObjectName(int idx);
int16 &operator[](uint16 varIdx);
const int16 &operator[](uint16 varIdx) const;
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index b44edc73ef7..363e4513d42 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -464,7 +464,7 @@ void Darkseed::UseCode::useCode(int objNum) {
}
if (objNum < 42 && objNum != 22 && (objNum != 7 || _objectVar[7] == 1)) {
_console->printTosText(955); // "You pick up the "
- _console->addToCurrentLine(Common::String::format("%s.", _objectVar.getObjectName(objNum)));
+ _console->addToCurrentLineU32(formatInjectStrings(Common::U32String("%s."), _objectVar.getObjectName(objNum).c_str()));
_inventory.addItem(objNum);
g_engine->_room->_collisionType = 0;
g_engine->_room->removeObjectFromRoom(objNum);
@@ -1549,161 +1549,100 @@ void UseCode::genericResponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
}
switch (tosIdx) {
case 979:
- _console->addTextLine(
- Common::String::format(
- "%s %s.",
- getI18NText(kI18N_ThisSentryCannotBeStoppedWithText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_ThisSentryCannotBeStoppedWithText, useObjNum);
break;
case 980:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_HasNoEffectOnTheAlienTubesText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_HasNoEffectOnTheAlienTubesText, useObjNum);
break;
case 981:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_YouIncinerateTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_YouIncinerateTheText, useObjNum);
break;
case 982:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_HasNoEffectOnTheAlienMonstrosityText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_HasNoEffectOnTheAlienMonstrosityText, useObjNum);
break;
case 983:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_cutTheWiresText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_cutTheWiresText, useObjNum);
break;
case 984:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_NoEffectOnTheProtectedAncientText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_NoEffectOnTheProtectedAncientText, useObjNum);
break;
case 985:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_YouHideTheObjectUnderThePillowText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_YouHideTheObjectUnderThePillowText, useObjNum);
break;
case 986:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_DontPutTheObjectInTheTrunkText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_DontPutTheObjectInTheTrunkText, useObjNum);
break;
case 987:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_TheCarWontStartWithTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_TheCarWontStartWithTheText, useObjNum);
break;
case 988:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_IfYouPutTheObjectInTheTrunkText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_IfYouPutTheObjectInTheTrunkText, useObjNum);
break;
case 989:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_TheObjectIsYoursYouHaventLostItText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_TheObjectIsYoursYouHaventLostItText, useObjNum);
break;
case 990:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_notAGoodPlaceToHideTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_notAGoodPlaceToHideTheText, useObjNum);
break;
case 991:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_youTryToPutTheObjectInsideButTheDoorWontOpenText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_youTryToPutTheObjectInsideButTheDoorWontOpenText, useObjNum);
break;
case 992:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_theKitchenIsNoPlaceToKeepTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_theKitchenIsNoPlaceToKeepTheText, useObjNum);
break;
case 993:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_youllForgetTheObjectHereText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_youllForgetTheObjectHereText, useObjNum);
break;
case 994:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_youdRatherHaveTheObjectWithYouText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_youdRatherHaveTheObjectWithYouText, useObjNum);
break;
case 995:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_theObjectHasNoEffectText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_theObjectHasNoEffectText, useObjNum);
break;
case 996:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_thisIsNotAGoodPlaceForTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_thisIsNotAGoodPlaceForTheText, useObjNum);
break;
case 997:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_youSeeAReflectionOfTheText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_youSeeAReflectionOfTheText, useObjNum);
break;
case 998:
- _console->addTextLine(
- Common::String::format(
- getI18NText(kI18N_youDontWantToLeaveTheObjectUnderTheBedText),
- _objectVar.getObjectName(useObjNum)));
+ genericSingleObjectResponse(kI18N_youDontWantToLeaveTheObjectUnderTheBedText, useObjNum);
break;
case 999:
switch (_genericResponseCounter) {
case 0:
_console->addTextLine(
- Common::String::format(
+ formatInjectStrings(
getI18NText(kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeadachesText),
- _objectVar.getObjectName(useObjNum),
- _objectVar.getObjectName(targetObjNum)
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
)
);
break;
case 1:
_console->addTextLine(
- Common::String::format(
+ formatInjectStrings(
getI18NText(kI18N_genResponse1_theObjectWillDoNothingToTheText),
- _objectVar.getObjectName(useObjNum),
- _objectVar.getObjectName(targetObjNum)
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
)
);
break;
case 2:
_console->addTextLine(
- Common::String::format(
+ formatInjectStrings(
getI18NText(kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText),
- _objectVar.getObjectName(useObjNum),
- _objectVar.getObjectName(targetObjNum)
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
)
);
break;
case 3:
_console->addTextLine(
- Common::String::format(
+ formatInjectStrings(
getI18NText(kI18N_genResponse3_theObjectHasNothingToDoWithTheText),
- _objectVar.getObjectName(useObjNum),
- _objectVar.getObjectName(targetObjNum)
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
)
);
break;
@@ -1725,7 +1664,7 @@ void UseCode::putObjUnderPillow(int objNum) {
_objectVar.setMoveObjectRoom(objNum, 250);
g_engine->_cursor.setCursorType(Pointer);
_console->printTosText(946);
- _console->addToCurrentLine(Common::String::format("%s", g_engine->_objectVar.getObjectName(objNum)));
+ _console->addToCurrentLineU32(g_engine->_objectVar.getObjectName(objNum));
_console->printTosText(947);
}
@@ -1749,4 +1688,11 @@ void UseCode::startDigging(int16 targetObjNum) {
g_engine->playSound(14, 5, -1);
}
+void UseCode::genericSingleObjectResponse(const I18nText &text, int16 useObjNum) {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(text),
+ _objectVar.getObjectName(useObjNum).c_str()));
+}
+
} // End of namespace Darkseed
diff --git a/engines/darkseed/usecode.h b/engines/darkseed/usecode.h
index 9bab1b4c18f..a5edd9ff827 100644
--- a/engines/darkseed/usecode.h
+++ b/engines/darkseed/usecode.h
@@ -90,7 +90,9 @@ private:
void putObjUnderPillow(int objNum);
void startDigging(int16 targetObjNum);
+ void genericSingleObjectResponse(const I18nText &text, int16 useObjNum);
};
+
} // namespace Darkseed
#endif // DARKSEED_USECODE_H
Commit: be56262a5372eceafd24e5fbbb5cd7a147102ca4
https://github.com/scummvm/scummvm/commit/be56262a5372eceafd24e5fbbb5cd7a147102ca4
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Getting ready to support multi-byte object names.
Changed paths:
engines/darkseed/darkseed.cpp
engines/darkseed/langtext.cpp
engines/darkseed/objects.cpp
engines/darkseed/objects.h
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 88c91689f27..dc4aecf5d30 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -77,6 +77,7 @@ Common::Error DarkseedEngine::run() {
_screen = new Graphics::Screen();
_tosText = new TosText();
_tosText->load();
+ _objectVar.loadObjectNames();
_console = new Console(_tosText, _sound);
_player = new Player();
_useCode = new UseCode(_console, _player, _objectVar, _inventory);
diff --git a/engines/darkseed/langtext.cpp b/engines/darkseed/langtext.cpp
index dc6417ca500..8fdcef23c5b 100644
--- a/engines/darkseed/langtext.cpp
+++ b/engines/darkseed/langtext.cpp
@@ -45,7 +45,7 @@ const TextWithPosition &getI18NTextWithPosition(const I18NTextWithPosition &i18n
}
Common::U32String convertToU32String(const char *text, Common::Language language) {
- uint len = strlen(text);
+ size_t len = strlen(text);
switch (language) {
case Common::ZH_ANY:
case Common::KO_KOR: {
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index 9cc48ce03c0..d42dc1f5753 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -31,6 +31,7 @@ Objects::Objects() {
_objectRunningCode.resize(MAX_OBJECTS);
_moveObjectXY.resize(MAX_OBJECTS);
_moveObjectRoom.resize(MAX_OBJECTS); // The original only allocates 42 entries here but writes 199 in the save file!
+ _objectNames.resize(MAX_OBJECTS);
reset();
}
@@ -184,19 +185,12 @@ void Objects::setObjectRunningCode(int idx, int16 value) {
_objectRunningCode[idx] = value;
}
-Common::U32String Objects::getObjectName(int idx) {
+const Common::U32String &Objects::getObjectName(int idx) {
if (idx < 0 || idx >= MAX_OBJECTS) {
error("getObjectName: index out of range.");
}
- switch (g_engine->getLanguage()) {
- case Common::FR_FRA: return Common::U32String(objectNameTbl_fr[idx]);
- case Common::DE_DEU: return Common::U32String(objectNameTbl_de[idx]);
- case Common::ES_ESP: return Common::U32String(objectNameTbl_es[idx]);
- default: break;
- }
-
- return Common::U32String(objectNameTbl_en[idx]);
+ return _objectNames[idx];
}
static inline void syncPoint(Common::Serializer &s, Common::Point &value) {
@@ -213,4 +207,15 @@ Common::Error Objects::sync(Common::Serializer &s) {
return Common::kNoError;
}
+void Objects::loadObjectNames() {
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ switch (g_engine->getLanguage()) {
+ case Common::FR_FRA: _objectNames[i] = Common::U32String(objectNameTbl_fr[i]); break;
+ case Common::DE_DEU: _objectNames[i] = Common::U32String(objectNameTbl_de[i]); break;
+ case Common::ES_ESP: _objectNames[i] = Common::U32String(objectNameTbl_es[i]); break;
+ default: _objectNames[i] = Common::U32String(objectNameTbl_en[i]); break;
+ }
+ }
+}
+
} // End of namespace Darkseed
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index 1e690ac1df7..ae7cd1e28f5 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -37,6 +37,7 @@ class Objects {
Common::Array<int16> _objectVar;
Common::Array<Common::Point> _moveObjectXY;
Common::Array<uint8> _moveObjectRoom;
+ Common::U32StringArray _objectNames;
public:
Common::Array<int16> _objectRunningCode;
@@ -45,6 +46,7 @@ public:
static constexpr int MAX_OBJECTS = 199;
Objects();
void reset();
+ void loadObjectNames();
Common::Error sync(Common::Serializer &s);
@@ -62,7 +64,7 @@ public:
int getMoveObjectRoom(uint16 idx);
void setMoveObjectRoom(uint16 idx, uint8 value);
- Common::U32String getObjectName(int idx);
+ const Common::U32String &getObjectName(int idx);
int16 &operator[](uint16 varIdx);
const int16 &operator[](uint16 varIdx) const;
Commit: 5433135288833d904d895882ed018ecc3b792f99
https://github.com/scummvm/scummvm/commit/5433135288833d904d895882ed018ecc3b792f99
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Korean object names
Changed paths:
engines/darkseed/console.cpp
engines/darkseed/console.h
engines/darkseed/darkseed.cpp
engines/darkseed/debugconsole.cpp
engines/darkseed/inventory.cpp
engines/darkseed/kofont.cpp
engines/darkseed/kofont.h
engines/darkseed/langtext.h
engines/darkseed/objects.cpp
engines/darkseed/objects.h
diff --git a/engines/darkseed/console.cpp b/engines/darkseed/console.cpp
index 2f6a2510b71..da2f76decfd 100644
--- a/engines/darkseed/console.cpp
+++ b/engines/darkseed/console.cpp
@@ -57,7 +57,7 @@ Console::~Console() {
delete _font;
}
-void Console::printTosText(int tosIndex) {
+void Console::printTosText(int tosIndex, bool shouldAddToCurrentLine) {
const Common::U32String &text = _tosText->getText(tosIndex);
if (!_isCJKLanguage) {
@@ -69,7 +69,11 @@ void Console::printTosText(int tosIndex) {
}
debug("%s", "");
}
- addTextLine(text);
+ if (shouldAddToCurrentLine) {
+ addToCurrentLine(text);
+ } else {
+ addTextLine(text);
+ }
_sound->playTosSpeech(tosIndex);
}
diff --git a/engines/darkseed/console.h b/engines/darkseed/console.h
index 78b5c56f76f..b614456c44f 100644
--- a/engines/darkseed/console.h
+++ b/engines/darkseed/console.h
@@ -46,7 +46,7 @@ public:
Console(TosText *tostext, Sound *sound);
~Console();
- void printTosText(int tosIndex);
+ void printTosText(int tosIndex, bool shouldAddToCurrentLine = false);
void addTextLine(const Common::U32String &text);
void addToCurrentLine(const Common::String &text);
void addToCurrentLineU32(const Common::U32String &text);
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index dc4aecf5d30..5ce9e9dd30e 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -35,6 +35,7 @@
#include "darkseed/pal.h"
#include "darkseed/pic.h"
#include "darkseed/room.h"
+#include "darkseed/kofont.h"
namespace Darkseed {
@@ -1658,9 +1659,13 @@ void DarkseedEngine::handleObjCollision(int targetObjNum) {
} else if (_actionMode == 27) {
_console->printTosText(929);
} else {
- _console->printTosText(967);
- _console->addToCurrentLine(_objectVar.getObjectName(_actionMode)); // TODO remove newline after object name
- _console->printTosText(968);
+ _console->printTosText(967); // The
+ if (g_engine->getLanguage() == Common::KO_KOR) {
+ _console->addToCurrentLine(KoFont::getObjectString(_objectVar.getObjectName(_actionMode)));
+ } else {
+ _console->addToCurrentLine(_objectVar.getObjectName(_actionMode));
+ }
+ _console->printTosText(968, true); // was disintegrated.
_inventory.removeItem(_actionMode);
}
if (_actionMode > 4) {
@@ -1903,7 +1908,11 @@ void DarkseedEngine::lookCode(int objNum) {
}
return;
}
- _console->addTextLine(formatInjectStrings(getI18NText(kI18N_youSeeTheText), _objectVar.getObjectName(objNum).c_str()));
+ if (g_engine->getLanguage() == Common::KO_KOR) {
+ _console->addTextLine(formatInjectStrings(getI18NText(kI18N_youSeeTheText), KoFont::getObjectString(_objectVar.getObjectName(objNum)).c_str()));
+ } else {
+ _console->addTextLine(formatInjectStrings(getI18NText(kI18N_youSeeTheText), _objectVar.getObjectName(objNum).c_str()));
+ }
}
void DarkseedEngine::printTime() {
diff --git a/engines/darkseed/debugconsole.cpp b/engines/darkseed/debugconsole.cpp
index 701944ceca1..b46612a2438 100644
--- a/engines/darkseed/debugconsole.cpp
+++ b/engines/darkseed/debugconsole.cpp
@@ -49,7 +49,7 @@ bool DebugConsole::Cmd_tostext(int argc, const char **argv) {
uint16 textIdx = atoi(argv[1]);
if (textIdx < _tosText->getNumEntries()) {
- debugPrintf("%s\n", _tosText->getText(textIdx).c_str());
+ debugPrintf("%s\n", _tosText->getText(textIdx).encode().c_str());
} else {
debugPrintf("index too large!\n");
}
diff --git a/engines/darkseed/inventory.cpp b/engines/darkseed/inventory.cpp
index c81f42bb4f5..054e2000df8 100644
--- a/engines/darkseed/inventory.cpp
+++ b/engines/darkseed/inventory.cpp
@@ -22,6 +22,7 @@
#include "darkseed/darkseed.h"
#include "darkseed/inventory.h"
#include "darkseed/menu.h"
+#include "darkseed/kofont.h"
namespace Darkseed {
@@ -159,8 +160,13 @@ void Inventory::handleClick() {
g_engine->lookCode(icon);
} else {
g_engine->_actionMode = icon;
- g_engine->_console->printTosText(972);
- g_engine->_console->addToCurrentLine(formatInjectStrings(Common::U32String("%s."), g_engine->_objectVar.getObjectName(icon).c_str()));
+ if (g_engine->getLanguage() == Common::KO_KOR) {
+ g_engine->_console->addTextLine(KoFont::getObjectString(g_engine->_objectVar.getObjectName(icon)));
+ g_engine->_console->printTosText(972, true);
+ } else {
+ g_engine->_console->printTosText(972);
+ g_engine->_console->addToCurrentLine(formatInjectStrings(Common::U32String("%s."), g_engine->_objectVar.getObjectName(icon).c_str()));
+ }
}
}
diff --git a/engines/darkseed/kofont.cpp b/engines/darkseed/kofont.cpp
index 629fd3c62a6..3bd9d9209aa 100644
--- a/engines/darkseed/kofont.cpp
+++ b/engines/darkseed/kofont.cpp
@@ -193,7 +193,7 @@ int16 SHORT_ARRAY_1000_034a[32] = {
32, 32, 32, 32,
32, 32, -1, -1};
-void KoFont::extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *param_3, uint16 *param_4) const {
+void KoFont::extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *param_3, uint16 *param_4) {
int uVar1;
int iVar2;
int uVar3;
@@ -220,6 +220,22 @@ void KoFont::extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *p
*param_4 = (uVar3 >> 5) - 2;
}
+bool KoFont::isConsonant(uint32 charIdx) {
+ uint16 param1, param2, param3;
+ extractKoIndexComponents(charIdx, ¶m1, ¶m2, ¶m3);
+ return param3 < 109;
+}
+
+Common::U32String KoFont::getObjectString(const Common::U32String &object) {
+ if (object.size() == 0) {
+ return Common::U32String("");
+ }
+ if (isConsonant(object[object.size() - 1])) {
+ return object + convertToU32String("\xb7\x69", Common::KO_KOR); // -eul
+ }
+ return object + convertToU32String("\x9f\x69", Common::KO_KOR); // -reul
+}
+
int KoFont::getOtherCharIdx(uint32 chr) const {
switch (chr) {
case '!':
diff --git a/engines/darkseed/kofont.h b/engines/darkseed/kofont.h
index f7b12cb0c94..59cd2b96942 100644
--- a/engines/darkseed/kofont.h
+++ b/engines/darkseed/kofont.h
@@ -46,6 +46,9 @@ public:
int getCharWidth(uint32 chr) const override;
void drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const override;
+ static void extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *param_3, uint16 *param_4);
+ static bool isConsonant(uint32 charIdx);
+ static Common::U32String getObjectString(const Common::U32String &object);
private:
void loadFontDataSet(Common::Array<Common::Array<uint8>> &dataSet, int size, int packedGlyphSize, Common::File &file);
void loadFontGlyph(Common::Array<uint8> &pixels, int packedGlyphSize, Common::File &file);
@@ -53,7 +56,6 @@ private:
void createGlyph(uint8 *pixels, uint32 chr) const;
void addToGlyph(uint8 *destPixels, int16 index) const;
void addPixels(uint8 *destPixels, const Common::Array<uint8> &pixels) const;
- void extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *param_3, uint16 *param_4) const;
int getOtherCharIdx(uint32 chr) const;
void drawOtherGlyph(Graphics::Surface *dst, uint8 chr, int x, int y) const;
};
diff --git a/engines/darkseed/langtext.h b/engines/darkseed/langtext.h
index 5234024b433..80d258b20aa 100644
--- a/engines/darkseed/langtext.h
+++ b/engines/darkseed/langtext.h
@@ -101,7 +101,7 @@ constexpr I18nText kI18N_youSeeTheText = {
"VES %s.",
"VOUS VOYEZ %s.",
"DU SIEHST %s.",
- nullptr
+ "%s \xac\x69\xcd\x61\xa5\xb3\x93\xa1\x94\x61"
};
constexpr I18nText kI18N_TheCopsIgnoreYourDemandsText = {
diff --git a/engines/darkseed/objects.cpp b/engines/darkseed/objects.cpp
index d42dc1f5753..12393d913e2 100644
--- a/engines/darkseed/objects.cpp
+++ b/engines/darkseed/objects.cpp
@@ -97,6 +97,56 @@ const int16 &Objects::operator[](uint16 varIdx) const {
return _objectVar[varIdx];
}
+void Objects::loadObjectNames() {
+ auto lang = g_engine->getLanguage();
+ if (lang == Common::KO_KOR) {
+ loadKoreanObjectNames();
+ } else {
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ switch (lang) {
+ case Common::FR_FRA: _objectNames[i] = Common::U32String(objectNameTbl_fr[i]); break;
+ case Common::DE_DEU: _objectNames[i] = Common::U32String(objectNameTbl_de[i]); break;
+ case Common::ES_ESP: _objectNames[i] = Common::U32String(objectNameTbl_es[i]); break;
+ default: _objectNames[i] = Common::U32String(objectNameTbl_en[i]); break;
+ }
+ }
+ }
+}
+
+void Objects::loadKoreanObjectNames() {
+ Common::File file;
+ if (!file.open("tos.exe")) {
+ error("Failed to open TOS.EXE");
+ }
+
+ for (int i = 0; i < MAX_OBJECTS; i++) {
+ file.seek(0x22f62 + i * 4);
+ uint16 offset = file.readUint16LE();
+ file.seek(0x20990 + offset);
+ _objectNames[i] = readU32String(file);
+ }
+
+ file.close();
+}
+
+Common::U32String Objects::readU32String(Common::SeekableReadStream &readStream) {
+ Common::U32String str;
+ uint8 byte = readStream.readByte();
+ while (byte != 0) {
+ if (byte & 0x80) {
+ uint8 byte2 = readStream.readByte();
+ if (readStream.err()) {
+ error("Failed to read byte from stream!");
+ }
+ str += (int)byte << 8 | byte2;
+ } else {
+ str += byte;
+ }
+ byte = readStream.readByte();
+ }
+ return str;
+}
+
static constexpr uint16 eyeDescriptionsTbl[] = {
0, 0, 0, 0,
0, 0, 0, 513,
@@ -207,15 +257,4 @@ Common::Error Objects::sync(Common::Serializer &s) {
return Common::kNoError;
}
-void Objects::loadObjectNames() {
- for (int i = 0; i < MAX_OBJECTS; i++) {
- switch (g_engine->getLanguage()) {
- case Common::FR_FRA: _objectNames[i] = Common::U32String(objectNameTbl_fr[i]); break;
- case Common::DE_DEU: _objectNames[i] = Common::U32String(objectNameTbl_de[i]); break;
- case Common::ES_ESP: _objectNames[i] = Common::U32String(objectNameTbl_es[i]); break;
- default: _objectNames[i] = Common::U32String(objectNameTbl_en[i]); break;
- }
- }
-}
-
} // End of namespace Darkseed
diff --git a/engines/darkseed/objects.h b/engines/darkseed/objects.h
index ae7cd1e28f5..7f96e9b33bf 100644
--- a/engines/darkseed/objects.h
+++ b/engines/darkseed/objects.h
@@ -68,6 +68,11 @@ public:
int16 &operator[](uint16 varIdx);
const int16 &operator[](uint16 varIdx) const;
+
+private:
+ void loadKoreanObjectNames();
+
+ Common::U32String readU32String(Common::SeekableReadStream &readStream);
};
} // namespace Darkseed
Commit: ad8a140af778bfc9e2fbd9bd3a8b92ad48fb81db
https://github.com/scummvm/scummvm/commit/ad8a140af778bfc9e2fbd9bd3a8b92ad48fb81db
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Add Korean object names when picking up objects and putting under pillow.
Changed paths:
engines/darkseed/usecode.cpp
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 363e4513d42..147f5d14d53 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -23,6 +23,7 @@
#include "darkseed/darkseed.h"
#include "darkseed/usecode.h"
#include "darkseed/usecode_tos_tables.h"
+#include "darkseed/kofont.h"
namespace Darkseed {
@@ -463,8 +464,13 @@ void Darkseed::UseCode::useCode(int objNum) {
return;
}
if (objNum < 42 && objNum != 22 && (objNum != 7 || _objectVar[7] == 1)) {
- _console->printTosText(955); // "You pick up the "
- _console->addToCurrentLineU32(formatInjectStrings(Common::U32String("%s."), _objectVar.getObjectName(objNum).c_str()));
+ if (g_engine->getLanguage() == Common::KO_KOR) {
+ _console->addTextLine(KoFont::getObjectString(_objectVar.getObjectName(objNum)));
+ _console->printTosText(955, true); // "You pick up the "
+ } else {
+ _console->printTosText(955); // "You pick up the "
+ _console->addToCurrentLineU32(formatInjectStrings(Common::U32String("%s."), _objectVar.getObjectName(objNum).c_str()));
+ }
_inventory.addItem(objNum);
g_engine->_room->_collisionType = 0;
g_engine->_room->removeObjectFromRoom(objNum);
@@ -1664,8 +1670,12 @@ void UseCode::putObjUnderPillow(int objNum) {
_objectVar.setMoveObjectRoom(objNum, 250);
g_engine->_cursor.setCursorType(Pointer);
_console->printTosText(946);
- _console->addToCurrentLineU32(g_engine->_objectVar.getObjectName(objNum));
- _console->printTosText(947);
+ if (g_engine->getLanguage() == Common::KO_KOR) {
+ _console->addToCurrentLineU32(KoFont::getObjectString(g_engine->_objectVar.getObjectName(objNum)));
+ } else {
+ _console->addToCurrentLineU32(g_engine->_objectVar.getObjectName(objNum));
+ }
+ _console->printTosText(947, true);
}
static constexpr bool diggingxflipTbl[12] = {
Commit: ebe7ad7d6620102b68d345d51c477bd032743e1b
https://github.com/scummvm/scummvm/commit/ebe7ad7d6620102b68d345d51c477bd032743e1b
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2025-02-16T09:39:18+11:00
Commit Message:
DARKSEED: Add Korean generic response text
Changed paths:
engines/darkseed/kofont.cpp
engines/darkseed/kofont.h
engines/darkseed/langtext.h
engines/darkseed/usecode.cpp
diff --git a/engines/darkseed/kofont.cpp b/engines/darkseed/kofont.cpp
index 3bd9d9209aa..2f198600378 100644
--- a/engines/darkseed/kofont.cpp
+++ b/engines/darkseed/kofont.cpp
@@ -236,6 +236,26 @@ Common::U32String KoFont::getObjectString(const Common::U32String &object) {
return object + convertToU32String("\x9f\x69", Common::KO_KOR); // -reul
}
+Common::U32String KoFont::getTopicString(const Common::U32String &object) {
+ if (object.size() == 0) {
+ return Common::U32String("");
+ }
+ if (isConsonant(object[object.size() - 1])) {
+ return object + convertToU32String("\xb7\x65", Common::KO_KOR); // -eun
+ }
+ return object + convertToU32String("\x93\x65", Common::KO_KOR); // -neun
+}
+
+Common::U32String KoFont::getLinkingString(const Common::U32String &object) {
+ if (object.size() == 0) {
+ return Common::U32String("");
+ }
+ if (isConsonant(object[object.size() - 1])) {
+ return object + convertToU32String("\x89\xc1", Common::KO_KOR); // -gwa
+ }
+ return object + convertToU32String("\xb5\xc1", Common::KO_KOR); // -wa
+}
+
int KoFont::getOtherCharIdx(uint32 chr) const {
switch (chr) {
case '!':
diff --git a/engines/darkseed/kofont.h b/engines/darkseed/kofont.h
index 59cd2b96942..2a74fb2132c 100644
--- a/engines/darkseed/kofont.h
+++ b/engines/darkseed/kofont.h
@@ -49,6 +49,8 @@ public:
static void extractKoIndexComponents(uint32 charIdx, uint16 *param_2, uint16 *param_3, uint16 *param_4);
static bool isConsonant(uint32 charIdx);
static Common::U32String getObjectString(const Common::U32String &object);
+ static Common::U32String getTopicString(const Common::U32String &object);
+ static Common::U32String getLinkingString(const Common::U32String &object);
private:
void loadFontDataSet(Common::Array<Common::Array<uint8>> &dataSet, int size, int packedGlyphSize, Common::File &file);
void loadFontGlyph(Common::Array<uint8> &pixels, int packedGlyphSize, Common::File &file);
diff --git a/engines/darkseed/langtext.h b/engines/darkseed/langtext.h
index 80d258b20aa..04c66510a5a 100644
--- a/engines/darkseed/langtext.h
+++ b/engines/darkseed/langtext.h
@@ -349,7 +349,7 @@ constexpr I18nText kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeada
"UTILIZAR %s EN %s NO TIENE SENTIDO, TE PRODUCIRA DOLOR DE CABEZA",
"POURQUOI UTILISER %s SUR %s PRENEZ DONC DE L'ASPIRINE!",
"GEBRAUCHEN VON %s AUF %s MACHT KEINEN SINN, DAS MUSS AN DEINEN KOPFSCHMERZEN LIEGEN!",
- nullptr
+ "%s %s\xb5\x41\x20\xac\x61\xb6\x77\xd0\x61\x93\x65\x88\xf5\xb7\x65\x20\xa0\x69\x95\xa1\x96\x41\xbb\xa1\x20\xb4\x67\xaf\x73\x93\xa1\x94\x61\x2e\x20\x8b\x61\x20\xaf\xb1\xd0\x65\x20\x96\x81\xc9\xb7\x98\x81\xa2\x85\xb5\x41\x20\x8b\x61\x9c\xe1\x93\x65\x88\xf5\xb7\xa1\x20\xb4\x61\x93\xa9\x8c\x61\xb6\x61\x3f"
};
constexpr I18nText kI18N_genResponse1_theObjectWillDoNothingToTheText = {
@@ -357,7 +357,7 @@ constexpr I18nText kI18N_genResponse1_theObjectWillDoNothingToTheText = {
"%s NO TIENE NADA QUE VER CON %s.",
"%s NE FERONT RIEN A %s.",
"%s HAT NICHTS ZU TUN MIT %s",
- nullptr
+ "%s %s\xb5\x41\x20\xac\x61\xb6\x77\xd0\x61\x93\x65\x88\xf5\xb7\x65\x20\xb4\x61\xa2\x81\x9c\xe5\x20\xad\xa1\xb6\x77\xb7\xa1\x20\xb4\xf4\xaf\x73\x93\xa1\x94\x61\x2e"
};
constexpr I18nText kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText = {
@@ -365,7 +365,7 @@ constexpr I18nText kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText = {
"%s NO LE CAUSARA EFECTO A %s.",
"%s N'AURA AUCUN EFFET SUR %s.",
"%s BEWIRKT NICHTS MIT %s.",
- nullptr
+ "%s %s\xb5\x41\x20\xb4\x61\xa2\x81\xb5\x77\xd0\xb7\x95\xa1\x20\xa3\xa1\xc3\xa1\xbb\xa1\xa1\xb5\xd0\x73\x93\xa1\x94\x61\x2e"
};
constexpr I18nText kI18N_genResponse3_theObjectHasNothingToDoWithTheText = {
@@ -373,7 +373,7 @@ constexpr I18nText kI18N_genResponse3_theObjectHasNothingToDoWithTheText = {
"%s NO TIENE NADA QUE VER CON %s.",
"%s N'A AUCUN RAPPORT AVEC %s.",
"%s HAT NICHTS ZU TUN MIT %s.",
- nullptr
+ "%s %s \xb8\xe5\xd1\x61\x20\x89\xc5\x89\x81\x88\x61\x20\xb4\xf4\xaf\x73\x93\xa1\x94\x61\x2e"
};
constexpr I18nText kI18N_genResponse4_areYouFeelingAlrightText = {
@@ -381,7 +381,7 @@ constexpr I18nText kI18N_genResponse4_areYouFeelingAlrightText = {
"TE ENCUENTRAS BIEN?",
"VOUS ETES SUR QUE CA VA BIEN?",
"FUEHLST DU DICH GUT?",
- nullptr
+ "\xbb\xa1\x8b\x71\x20\xb8\xf7\xaf\xa5\xb7\xa1\x20\xb5\xa5\xb8\xe5\xd0\x73\x93\xa1\x8c\x61\x3f\x0a"
};
constexpr I18nText kI18N_blankText = {
diff --git a/engines/darkseed/usecode.cpp b/engines/darkseed/usecode.cpp
index 147f5d14d53..4ac86df545a 100644
--- a/engines/darkseed/usecode.cpp
+++ b/engines/darkseed/usecode.cpp
@@ -1549,6 +1549,7 @@ void UseCode::useCodeEmptyUrn(int16 targetObjNum) {
}
void UseCode::genericResponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx) {
+ auto lang = g_engine->getLanguage();
_genericResponseCounter++;
if (_genericResponseCounter > 4) {
_genericResponseCounter = 0;
@@ -1617,40 +1618,80 @@ void UseCode::genericResponse(int16 useObjNum, int16 targetObjNum, int16 tosIdx)
case 999:
switch (_genericResponseCounter) {
case 0:
- _console->addTextLine(
- formatInjectStrings(
- getI18NText(kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeadachesText),
- _objectVar.getObjectName(useObjNum).c_str(),
- _objectVar.getObjectName(targetObjNum).c_str()
- )
- );
+ if (lang == Common::KO_KOR) {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeadachesText),
+ KoFont::getObjectString(_objectVar.getObjectName(useObjNum)).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ } else {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse0_usingTheObjectOnTheObjectItMustBeYourHeadachesText),
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ }
break;
case 1:
- _console->addTextLine(
- formatInjectStrings(
- getI18NText(kI18N_genResponse1_theObjectWillDoNothingToTheText),
- _objectVar.getObjectName(useObjNum).c_str(),
- _objectVar.getObjectName(targetObjNum).c_str()
- )
- );
+ if (lang == Common::KO_KOR) {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse1_theObjectWillDoNothingToTheText),
+ KoFont::getObjectString(_objectVar.getObjectName(useObjNum)).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ } else {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse1_theObjectWillDoNothingToTheText),
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ }
break;
case 2:
- _console->addTextLine(
- formatInjectStrings(
- getI18NText(kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText),
- _objectVar.getObjectName(useObjNum).c_str(),
- _objectVar.getObjectName(targetObjNum).c_str()
- )
- );
+ if (lang == Common::KO_KOR) {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText),
+ KoFont::getTopicString(_objectVar.getObjectName(useObjNum)).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ } else {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse2_theObjectDoesntHaveAnyEffectOnTheText),
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ }
break;
case 3:
- _console->addTextLine(
- formatInjectStrings(
- getI18NText(kI18N_genResponse3_theObjectHasNothingToDoWithTheText),
- _objectVar.getObjectName(useObjNum).c_str(),
- _objectVar.getObjectName(targetObjNum).c_str()
- )
- );
+ if (lang ==Common::KO_KOR) {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse3_theObjectHasNothingToDoWithTheText),
+ KoFont::getTopicString(_objectVar.getObjectName(useObjNum)).c_str(),
+ KoFont::getLinkingString(_objectVar.getObjectName(targetObjNum)).c_str()
+ )
+ );
+ } else {
+ _console->addTextLine(
+ formatInjectStrings(
+ getI18NText(kI18N_genResponse3_theObjectHasNothingToDoWithTheText),
+ _objectVar.getObjectName(useObjNum).c_str(),
+ _objectVar.getObjectName(targetObjNum).c_str()
+ )
+ );
+ }
break;
case 4:
_console->addTextLine(getI18NText(kI18N_genResponse4_areYouFeelingAlrightText));
More information about the Scummvm-git-logs
mailing list