From 325eb338fed89c3172579b3fdfdac42bdac00f26 Mon Sep 17 00:00:00 2001 From: Maxim Kovalenko Date: Mon, 19 Jul 2021 18:55:55 +0300 Subject: [PATCH] XEEN: RU Further sharpening Added 'Born' gender form and plural form for food --- devtools/create_xeen/constants.cpp | 23 ++++++++- devtools/create_xeen/constants.h | 14 ++++++ devtools/create_xeen/en_constants.h | 54 +++++++++++++++++--- devtools/create_xeen/ru_constants.h | 54 +++++++++++++++++--- dists/engine-data/xeen.ccs | Bin 92798 -> 92933 bytes engines/xeen/dialogs/dialogs_char_info.cpp | 38 ++++++++++++-- engines/xeen/dialogs/dialogs_char_info.h | 12 ++++- engines/xeen/dialogs/dialogs_items.cpp | 6 +-- engines/xeen/dialogs/dialogs_items.h | 2 +- engines/xeen/party.cpp | 56 +++++++++++++++++---- engines/xeen/party.h | 17 ++++++- engines/xeen/resources.cpp | 9 +++- engines/xeen/resources.h | 9 +++- 13 files changed, 258 insertions(+), 36 deletions(-) diff --git a/devtools/create_xeen/constants.cpp b/devtools/create_xeen/constants.cpp index 0d1e80a768a..14cc5007eb1 100644 --- a/devtools/create_xeen/constants.cpp +++ b/devtools/create_xeen/constants.cpp @@ -179,9 +179,15 @@ void LangConstants::writeConstants(Common::String num, CCArchive &cc) { file.syncStrings(STAT_NAMES(), 16); delete[] _statNames; _statNames = NULL; - file.syncStrings(CONSUMABLE_NAMES(), 6); + file.syncStrings(CONSUMABLE_NAMES(), 4); delete[] _consumableNames; _consumableNames = NULL; + file.syncStrings(CONSUMABLE_GOLD_FORMS(), 1); + delete[] _consumableGoldForms; + _consumableGoldForms = NULL; + file.syncStrings(CONSUMABLE_GEM_FORMS(), 1); + delete[] _consumableGemForms; + _consumableGemForms = NULL; file.syncStrings(WHERE_NAMES(), 2); delete[] _whereNames; _whereNames = NULL; @@ -233,6 +239,9 @@ void LangConstants::writeConstants(Common::String num, CCArchive &cc) { file.syncStrings(RATING_TEXT(), 24); delete[] _ratingText; _ratingText = NULL; + file.syncStrings(BORN(), 2); + delete[] _born; + _born = NULL; file.syncString(AGE_TEXT()); file.syncString(LEVEL_TEXT()); file.syncString(RESISTENCES_TEXT()); @@ -240,6 +249,9 @@ void LangConstants::writeConstants(Common::String num, CCArchive &cc) { file.syncString(EXPERIENCE_TEXT()); file.syncString(ELIGIBLE()); file.syncString(IN_PARTY_IN_BANK()); + file.syncStrings(FOOD_ON_HAND(), 3); + delete[] _onHand; + _onHand = NULL; file.syncString(FOOD_TEXT()); file.syncString(EXCHANGE_WITH_WHOM()); file.syncString(QUICK_REF_LINE()); @@ -408,6 +420,9 @@ void LangConstants::writeConstants(Common::String num, CCArchive &cc) { file.syncString(BACKPACKS_FULL_PRESS_KEY()); file.syncString(HIT_A_KEY()); file.syncString(GIVE_TREASURE_FORMATTING()); + file.syncStrings(FOUND(), 2); + delete[] _found; + _found = NULL; file.syncString(X_FOUND_Y()); file.syncString(ON_WHO()); file.syncString(WHICH_ELEMENT1()); @@ -433,7 +448,13 @@ void LangConstants::writeConstants(Common::String num, CCArchive &cc) { file.syncString(WARZONE_LEVEL()); file.syncString(WARZONE_HOW_MANY()); file.syncString(PICKS_THE_LOCK()); + file.syncStrings(PICK_FORM(), 2); + delete[] _pickForm; + _pickForm = NULL; file.syncString(UNABLE_TO_PICK_LOCK()); + file.syncStrings(UNABLE_TO_PICK_FORM(), 2); + delete[] _unableToPickForm; + _unableToPickForm = NULL; file.syncString(CONTROL_PANEL_TEXT()); file.syncString(CONTROL_PANEL_BUTTONS()); file.syncString(ON()); diff --git a/devtools/create_xeen/constants.h b/devtools/create_xeen/constants.h index 7bfcc25195c..8997555d1e1 100644 --- a/devtools/create_xeen/constants.h +++ b/devtools/create_xeen/constants.h @@ -124,6 +124,8 @@ protected: const char **_statNames = NULL; const char **_whereNames = NULL; const char **_consumableNames = NULL; + const char **_consumableGoldForms = NULL; + const char **_consumableGemForms = NULL; const char **_weekDayStrings = NULL; const char **_ratingText = NULL; const char **_bonusNames = NULL; @@ -144,11 +146,16 @@ protected: const char **_removeDelete = NULL; const char **_spellCastComponents = NULL; const char **_monsterSpecialAttacks = NULL; + const char **_pickForm = NULL; + const char **_unableToPickForm = NULL; const char **_quickFightOptions = NULL; const char **_goober = NULL; const char **_worldEndText = NULL; const char **_days = NULL; const char **_sellXForYGoldEndings = NULL; + const char **_found = NULL; + const char **_born = NULL; + const char **_onHand = NULL; public: virtual const char *CLOUDS_CREDITS() = 0; @@ -840,6 +847,8 @@ public: virtual const char *NO_X_IN_THE_Y() = 0; virtual const char **STAT_NAMES() = 0; virtual const char **CONSUMABLE_NAMES() = 0; + virtual const char **CONSUMABLE_GOLD_FORMS() = 0; + virtual const char **CONSUMABLE_GEM_FORMS() = 0; virtual const char **WHERE_NAMES() = 0; virtual const char *AMOUNT() = 0; virtual const char *FOOD_PACKS_FULL() = 0; @@ -965,6 +974,7 @@ public: virtual const char *CURRENT_MAXIMUM_RATING_TEXT() = 0; virtual const char *CURRENT_MAXIMUM_TEXT() = 0; virtual const char **RATING_TEXT() = 0; + virtual const char **BORN() = 0; virtual const char *AGE_TEXT() = 0; virtual const char *LEVEL_TEXT() = 0; virtual const char *RESISTENCES_TEXT() = 0; @@ -972,6 +982,7 @@ public: virtual const char *EXPERIENCE_TEXT() = 0; virtual const char *ELIGIBLE() = 0; virtual const char *IN_PARTY_IN_BANK() = 0; + virtual const char **FOOD_ON_HAND() = 0; virtual const char *FOOD_TEXT() = 0; virtual const char *EXCHANGE_WITH_WHOM() = 0; virtual const char *QUICK_REF_LINE() = 0; @@ -1154,6 +1165,7 @@ public: virtual const char *BACKPACKS_FULL_PRESS_KEY() = 0; virtual const char *HIT_A_KEY() = 0; virtual const char *GIVE_TREASURE_FORMATTING() = 0; + virtual const char **FOUND() = 0; virtual const char *X_FOUND_Y() = 0; virtual const char *ON_WHO() = 0; virtual const char *WHICH_ELEMENT1() = 0; @@ -1185,7 +1197,9 @@ public: virtual const char *WARZONE_LEVEL() = 0; virtual const char *WARZONE_HOW_MANY() = 0; virtual const char *PICKS_THE_LOCK() = 0; + virtual const char **PICK_FORM() = 0; virtual const char *UNABLE_TO_PICK_LOCK() = 0; + virtual const char **UNABLE_TO_PICK_FORM() = 0; virtual const char *CONTROL_PANEL_TEXT() = 0; virtual const char *CONTROL_PANEL_BUTTONS() = 0; virtual const char *ON() = 0; diff --git a/devtools/create_xeen/en_constants.h b/devtools/create_xeen/en_constants.h index e4ac9a7688e..867d306aaae 100644 --- a/devtools/create_xeen/en_constants.h +++ b/devtools/create_xeen/en_constants.h @@ -561,10 +561,22 @@ public: const char **CONSUMABLE_NAMES() { delete[] _consumableNames; - _consumableNames = new const char *[6] { "Gold", "Gems", "Food", "Condition", "", "" }; + _consumableNames = new const char *[4] { "Gold", "Gems", "Food", "Condition" }; return _consumableNames; } + const char **CONSUMABLE_GOLD_FORMS() { + delete[] _consumableGoldForms; + _consumableGoldForms = new const char *[1] { "" }; + return _consumableGoldForms; + } + + const char **CONSUMABLE_GEM_FORMS() { + delete[] _consumableGemForms; + _consumableGemForms = new const char *[1] { "" }; + return _consumableGemForms; + } + const char **WHERE_NAMES() { delete[] _whereNames; _whereNames = new const char *[2] { "Party", "Bank" }; @@ -794,13 +806,19 @@ public: return _ratingText; } + const char **BORN() { + delete[] _born; + _born = new const char *[2] { "Born", "" }; + return _born; + } + const char *AGE_TEXT() { return "\x2\x3" "c%s\n" "Current / Natural\n" "\x3r\t057%u\x3l\t061/ %u\n" "\x3" - "cBorn: %u / %u\x1"; + "c%s: %u / %u\x1"; } const char *LEVEL_TEXT() { @@ -845,10 +863,16 @@ public: "%u in bank\x1\x3l"; } + const char **FOOD_ON_HAND() { + delete[] _onHand; + _onHand = new const char *[3] { "on hand", "", "" }; + return _onHand; + } + const char *FOOD_TEXT() { return "\x2\x3" "cParty %s\n" - "%u on hand\n" + "%u %s\n" "Enough for %u day%s\x3l"; } @@ -1617,9 +1641,15 @@ public: "077"; } + const char **FOUND() { + delete[] _found; + _found = new const char *[2] { "found", "" }; + return _found; + } + const char *X_FOUND_Y() { return "\v060\t000\x3" - "c%s found: %s"; + "c%s %s: %s"; } const char *ON_WHO() { @@ -1748,12 +1778,24 @@ public: const char *PICKS_THE_LOCK() { return "\x3" - "c\v010%s picks the lock!\nPress any key."; + "c\v010%s %s the lock!\nPress any key."; + } + + const char **PICK_FORM() { + delete[] _pickForm; + _pickForm = new const char *[2] { "picks", "" }; + return _pickForm; } const char *UNABLE_TO_PICK_LOCK() { return "\x3" - "c\v010%s was unable to pick the lock!\nPress any key."; + "c\v010%s was %s the lock!\nPress any key."; + } + + const char **UNABLE_TO_PICK_FORM() { + delete[] _unableToPickForm; + _unableToPickForm = new const char *[2] { "unable to pick", "" }; + return _unableToPickForm; } const char *CONTROL_PANEL_TEXT() { diff --git a/devtools/create_xeen/ru_constants.h b/devtools/create_xeen/ru_constants.h index 468b1e9c2fa..74cd49f4e08 100644 --- a/devtools/create_xeen/ru_constants.h +++ b/devtools/create_xeen/ru_constants.h @@ -628,10 +628,22 @@ public: const char **CONSUMABLE_NAMES() { delete[] _consumableNames; - _consumableNames = new const char *[6] { "\x87\xAE\xAB\xAE\xE2\xAE", "\x80\xAB\xAC\xA0\xA7\xEB", "\x8F\xA8\xE9\xA0", "\x91\xAE\xE1\xE2\xAE\xEF\xAD\xA8\xA5", "\x87\xAE\xAB\xAE\xE2\xA0", "\x80\xAB\xAC\xA0\xA7\xAE\xA2" }; // "Золото", "Алмазы", "Пища", "Состояние", "Золота", "Алмазов" + _consumableNames = new const char *[4] { "\x87\xAE\xAB\xAE\xE2\xAE", "\x80\xAB\xAC\xA0\xA7\xEB", "\x8F\xA8\xE9\xA0", "\x91\xAE\xE1\xE2\xAE\xEF\xAD\xA8\xA5" }; // "Золото", "Алмазы", "Пища", "Состояние" return _consumableNames; } + const char **CONSUMABLE_GOLD_FORMS() { + delete[] _consumableGoldForms; + _consumableGoldForms = new const char *[1] { "\x87\xAE\xAB\xAE\xE2\xA0" }; // "Золота" + return _consumableGoldForms; + } + + const char **CONSUMABLE_GEM_FORMS() { + delete[] _consumableGemForms; + _consumableGemForms = new const char *[1] { "\x80\xAB\xAC\xA0\xA7\xAE\xA2" }; // "Алмазов" + return _consumableGemForms; + } + const char **WHERE_NAMES() { delete[] _whereNames; _whereNames = new const char *[2] { "\xE3 \xAE\xE2\xE0\xEF\xA4\xA0", "\xA2 \xA1\xA0\xAD\xAA\xA5" }; // "у отряда", "в банке" @@ -869,11 +881,17 @@ public: return _ratingText; } + const char **BORN() { + delete[] _born; + _born = new const char *[2] { "\x90\xAE\xA4\xA8\xAB\xE1\xEF", "\x90\xAE\xA4\xA8\xAB\xA0\xE1\xEC" }; // "Родился", "Родилась" + return _born; + } + const char *AGE_TEXT() { return "\x2\x3""c%s\n" // "\x2\x3""c%s\n" "\x92\xA5\xAA\xE3\xE9\xA8\xA9 / \x8D\xA0\xE1\xE2\xAE\xEF\xE9\xA8\xA9\n" // "Текущий / Настоящий\n" "\x3""r\t057%u\x3""l\t061/ %u\n" // "\x3""r\t057%u\x3""l\t061/ %u\n" - "\x3""c\x90\xAE\xA4\xA8\xAB%s: %u / %u\x1"; // "\x3""cРодил%s: %u / %u\x1"; + "\x3""c%s: %u / %u\x1"; // "\x3""cРодил%s: %u / %u\x1"; } const char *LEVEL_TEXT() { @@ -913,9 +931,15 @@ public: "%lu \xA2 \xA1\xA0\xAD\xAA\xA5\x1\x3""l"; // "%lu в банке\x1\x3""l"; } + const char **FOOD_ON_HAND() { + delete[] _onHand; + _onHand = new const char *[3] { "\xAF\xAE\xE0\xE6\xA8\xEF", "\xAF\xAE\xE0\xE6\xA8\xA8", "\xAF\xAE\xE0\xE6\xA8\xA9" }; // "порция", "порции", "порций" + return _onHand; + } + const char *FOOD_TEXT() { return "\x2\x3""c%s\n" // "\x2\x3""c%s\n" - "%u \xAF\xAE\xE0\xE6\xA8%c\n" // "%u порци%c\n" + "%u %s\n" // "%u %s\n" "\x95\xA2\xA0\xE2\xA8\xE2 \xAD\xA0 %u %s\x1\x3""l"; // "Хватит на %u %s\x1\x3""l"; } @@ -1654,8 +1678,14 @@ public: "077"; } + const char **FOUND() { + delete[] _found; + _found = new const char *[2] { "\xAD\xA0\xE8\xF1\xAB", "\xAD\xA0\xE8\xAB\xA0" }; // "нашёл", "нашла" + return _found; + } + const char *X_FOUND_Y() { - return "\v060\t000\x3""c%s \xAD\xA0\xE8%s: %s"; // "\v060\t000\x3""c%s наш%s: %s" + return "\v060\t000\x3""c%s %s: %s"; // "\v060\t000\x3""c%s %s: %s" } const char *ON_WHO() { @@ -1771,11 +1801,23 @@ public: } const char *PICKS_THE_LOCK() { - return "\x3""c\v010%s \xA2\xA7\xAB\xAE\xAC\xA0\xAB%s \xA7\xA0\xAC\xAE\xAA!\n\x8D\xA0\xA6\xAC\xA8\xE2\xA5 \xAA\xAB\xA0\xA2\xA8\xE8\xE3."; // "\x3""c\v010%s взломал%s замок!\nНажмите клавишу." + return "\x3""c\v010%s %s \xA7\xA0\xAC\xAE\xAA!\n\x8D\xA0\xA6\xAC\xA8\xE2\xA5 \xAA\xAB\xA0\xA2\xA8\xE8\xE3."; // "\x3""c\v010%s %s замок!\nНажмите клавишу." + } + + const char **PICK_FORM() { + delete[] _pickForm; + _pickForm = new const char *[2] { "\xA2\xA7\xAB\xAE\xAC\xA0\xAB", "\xA2\xA7\xAB\xAE\xAC\xA0\xAB\xA0" }; // "взломал", "взломала" + return _pickForm; } const char *UNABLE_TO_PICK_LOCK() { - return "\x3""c\v010%s \xAD\xA5 \xE1\xAC\xAE\xA3%s \xA2\xA7\xAB\xAE\xAC\xA0\xE2\xEC \xA7\xA0\xAC\xAE\xAA!\n\x8D\xA0\xA6\xAC\xA8\xE2\xA5 \xAA\xAB\xA0\xA2\xA8\xE8\xE3."; // "\x3""c\v010%s не смог%s взломать замок!\nНажмите клавишу." + return "\x3""c\v010%s %s \xA2\xA7\xAB\xAE\xAC\xA0\xE2\xEC \xA7\xA0\xAC\xAE\xAA!\n\x8D\xA0\xA6\xAC\xA8\xE2\xA5 \xAA\xAB\xA0\xA2\xA8\xE8\xE3."; // "\x3""c\v010%s %s взломать замок!\nНажмите клавишу." + } + + const char **UNABLE_TO_PICK_FORM() { + delete[] _unableToPickForm; + _unableToPickForm = new const char *[2] { "\xAD\xA5 \xE1\xAC\xAE\xA3", "\xAD\xA5 \xE1\xAC\xAE\xA3\xAB\xA0" }; // "не смог", "не смогла" + return _unableToPickForm; } const char *CONTROL_PANEL_TEXT() { diff --git a/dists/engine-data/xeen.ccs b/dists/engine-data/xeen.ccs index b72c8061ce04ea1314c3f0a9ee265e6de43639ce..495a65cc83a10555fdd9fb4765269d6837da0a07 100644 GIT binary patch delta 528 zcmex&g|+n>YrPOd%y+iqdZD`>Tsdj^Q$f)0(*7M^dxe+|9NF_?<3pFC3E%4MSBsQY zJHOyLwC7mHv@N$5ul@ET>iV)XJqsMPeU{Jo$IZ7~wyvV~?&u>b;ASu203T?1(Fp8$vQ-bghvL5I!1|t)R}J1t6Ag$ zbgAG`S$?3j$)?%!W?!EQWC5LQdh|ZO2#{sIboRu#^RC=71=CZn+?*_Y)nK#7RXIi# zpsd-f*;g;my=4lf=0d1BAYZ`UUv@1|Qx;^-jH!2z%rga&^QNMDV)K{(w^)GTF`b*0 xQBn@1bo!)uvu947X9}gKBD^z=l~F|$Y}y3TD>G+LGo1mU=S|(N%*q&@3IH&N&%*!! delta 421 zcmZp@#`^CHYrPOd%y+iqdZD`>Tsdj^Q{f2TrTsfr_6n_OII`!(`G+n=6Ta2ipS)aF z?fio0(5<$NXiV)XJqzZ&@>xFPA2;7o*}96Z4+++%`3u5qA2rwiZA_ZE z{))g~#w{UB5|8!w#x8dYzx?BFW0iD8%E?y`bBcnp=5D*Q_`pV&7{08mb4CZcEByZ7 zK49k0xv}?@4Wseo2wR!WHMVp3CoB2tvXn=;M{f@F)nF7eHw#M*ad-3)6>zf`a1f1( z7L5&w4%|G$@4kkR9V;`d4J#|FS(t#EXmFGRP<&$fY8DpPn6S9Xg*DRBW?^=$EUZ9D zrw}($hv<;-$N*8tC{eJyU5(V{1vLvjRE;;yo;UmYY}2jtW=@@S&ve(^J5x=U%)WAc z_N^InCzygIrgBltVVf^s%hMD< zan+2ecelnd-eTdLK55?UnN#NpxJ|ENWt0?vyKKe;(JM1&Pn%xI%BZq^H7jFODgeOS Bvt$4O diff --git a/engines/xeen/dialogs/dialogs_char_info.cpp b/engines/xeen/dialogs/dialogs_char_info.cpp index 24fa595d393..ff631b5d60a 100644 --- a/engines/xeen/dialogs/dialogs_char_info.cpp +++ b/engines/xeen/dialogs/dialogs_char_info.cpp @@ -278,7 +278,7 @@ void CharacterInfo::addButtons() { addPartyButtons(_vm); } -Common::String CharacterInfo::getDaysPlurals(int val) { +const char* CharacterInfo::getDaysPlurals(int val) { if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { int i = val % 100; if (i < 5 || i > 20) @@ -294,7 +294,6 @@ Common::String CharacterInfo::getDaysPlurals(int val) { } else { return Res.DAYS[val == 1 ? 0 : 1]; } - } Common::String CharacterInfo::loadCharacterDetails(const Character &c) { @@ -330,7 +329,7 @@ Common::String CharacterInfo::loadCharacterDetails(const Character &c) { c.statColor(c.getCurrentLevel(), c._level._permanent), c.getCurrentLevel(), c.getNumSkills(), foodVal, - getDaysPlurals(foodVal).c_str(), + getDaysPlurals(foodVal), c.statColor(c.getStat(SPEED), c.getStat(SPEED, true)), c.getStat(SPEED), c.statColor(c.getArmorClass(), c.getArmorClass(true)), c.getArmorClass(), c.getNumAwards(), @@ -351,6 +350,35 @@ void CharacterInfo::showCursor(bool flag) { } } +const char *CharacterInfo::getBornForm(const Character &c) { + if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { + switch (c._sex) { + case MALE: + return Res.BORN[0]; + case FEMALE: + return Res.BORN[1]; + } + } + return Res.BORN[0]; +} + +const char *CharacterInfo::getFoodOnHandPlurals(int food) { + if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { + int i = food % 100; + if (i < 5 || i > 20) + switch (food % 10) { + case 1: + return Res.FOOD_ON_HAND[0]; + case 2: + case 3: + case 4: + return Res.FOOD_ON_HAND[1]; + } + return Res.FOOD_ON_HAND[2]; + } + return Res.FOOD_ON_HAND[0]; +} + bool CharacterInfo::expandStat(int attrib, const Character &c) { const int STAT_POS[2][20] = { { @@ -394,7 +422,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) { stat1 = c.getAge(false); stat2 = c.getAge(true); msg = Common::String::format(Res.AGE_TEXT, Res.STAT_NAMES[attrib], - stat1, stat2, c._birthDay, c._birthYear); + stat1, stat2, getBornForm(c), c._birthDay, c._birthYear); break; case 8: { @@ -520,7 +548,7 @@ bool CharacterInfo::expandStat(int attrib, const Character &c) { // Food int food = (party._food / party._activeParty.size()) / 3; msg = Common::String::format(Res.FOOD_TEXT, Res.CONSUMABLE_NAMES[2], - party._food, food, food != 1 ? "s" : ""); + party._food, getFoodOnHandPlurals(food), food, getDaysPlurals(food)); break; } diff --git a/engines/xeen/dialogs/dialogs_char_info.h b/engines/xeen/dialogs/dialogs_char_info.h index d1b35806002..e34c803d2e0 100644 --- a/engines/xeen/dialogs/dialogs_char_info.h +++ b/engines/xeen/dialogs/dialogs_char_info.h @@ -52,7 +52,7 @@ private: /** * Get plural day/days form */ - Common::String getDaysPlurals(int val); + const char* getDaysPlurals(int val); /** * Return a string containing the details of the character @@ -64,6 +64,16 @@ private: */ void showCursor(bool flag); + /** + * Get gender form 'born' + */ + const char *getBornForm(const Character &c); + + /** + * Get plural form 'on hand' for food + */ + const char *getFoodOnHandPlurals(int food); + bool expandStat(int attrib, const Character &c); public: static void show(XeenEngine *vm, int charIndex); diff --git a/engines/xeen/dialogs/dialogs_items.cpp b/engines/xeen/dialogs/dialogs_items.cpp index 02cf8f311dc..8dacd25ed63 100644 --- a/engines/xeen/dialogs/dialogs_items.cpp +++ b/engines/xeen/dialogs/dialogs_items.cpp @@ -752,7 +752,7 @@ int ItemsDialog::calcItemCost(Character *c, int itemIndex, ItemsMode mode, return (mode == ITEMMODE_CHAR_INFO) ? 0 : result; } -Common::String ItemsDialog::getGoldPlurals(int cost) { +const char* ItemsDialog::getGoldPlurals(int cost) { if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) return Res.GOLDS[cost % 10 == 1 ? 0 : 1]; return Res.GOLDS[0]; @@ -855,7 +855,7 @@ int ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, Ite int cost = calcItemCost(&c, itemIndex, mode, 0, category); Common::String desc = c._items[category].getFullDescription(itemIndex); if (Confirm::show(_vm, Common::String::format(Res.BUY_X_FOR_Y_GOLD, - desc.c_str(), cost, getGoldPlurals(cost).c_str()))) { + desc.c_str(), cost, getGoldPlurals(cost)))) { if (party.subtract(CONS_GOLD, cost, WHERE_PARTY, WT_FREEZE_WAIT)) { if (ccNum) { sound.stopSound(); @@ -895,7 +895,7 @@ int ItemsDialog::doItemOptions(Character &c, int actionIndex, int itemIndex, Ite int cost = calcItemCost(&c, itemIndex, mode, c._skills[MERCHANT], category); Common::String desc = c._items[category].getFullDescription(itemIndex); Common::String msg = Common::String::format(Res.SELL_X_FOR_Y_GOLD, - desc.c_str(), cost, getGoldPlurals(cost).c_str()); + desc.c_str(), cost, getGoldPlurals(cost)); if (Confirm::show(_vm, msg)) { // Remove the sold item and add gold to the party's total diff --git a/engines/xeen/dialogs/dialogs_items.h b/engines/xeen/dialogs/dialogs_items.h index ce9d258ad56..3429d9fff82 100644 --- a/engines/xeen/dialogs/dialogs_items.h +++ b/engines/xeen/dialogs/dialogs_items.h @@ -67,7 +67,7 @@ private: /** * Get plural gold form */ - Common::String getGoldPlurals(int val); + const char* getGoldPlurals(int val); int doItemOptions(Character &c, int actionIndex, int itemIndex, ItemCategory category, ItemsMode mode); diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp index 645100a55a6..38e5b8a141d 100644 --- a/engines/xeen/party.cpp +++ b/engines/xeen/party.cpp @@ -20,6 +20,7 @@ * */ +#include "common/config-manager.h" #include "common/scummsys.h" #include "common/algorithm.h" #include "xeen/party.h" @@ -661,19 +662,18 @@ int Party::subtract(ConsumableType consumableId, uint amount, PartyBank whereId, return true; } -int Party::getConsumableForm(ConsumableType consumableId) { +const char* Party::getConsumableForm(ConsumableType consumableId) { switch (consumableId) { - case CONS_GOLD: return 4; - case CONS_GEMS: return 5; + case CONS_GOLD: return Res.CONSUMABLE_GOLD_FORMS[0]; + case CONS_GEMS: return Res.CONSUMABLE_GEM_FORMS[0]; } - return consumableId; + return Res.CONSUMABLE_NAMES[consumableId]; } void Party::notEnough(ConsumableType consumableId, PartyBank whereId, bool mode, MessageWaitType wait) { - int _tmpConsumableId = getConsumableForm(consumableId); Common::String msg = Common::String::format( mode ? Res.NO_X_IN_THE_Y : Res.NOT_ENOUGH_X_IN_THE_Y, - Res.CONSUMABLE_NAMES[_tmpConsumableId], Res.WHERE_NAMES[whereId]); + getConsumableForm(consumableId), Res.WHERE_NAMES[whereId]); ErrorScroll::show(_vm, msg, wait); } @@ -821,6 +821,18 @@ bool Party::arePacksFull() const { return total == (_activeParty.size() * NUM_ITEM_CATEGORIES); } +const char* Party::getFoundForm(const Character& c) { + if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { + switch (c._sex) { + case MALE: + return Res.FOUND[0]; + case FEMALE: + return Res.FOUND[1]; + } + } + return Res.FOUND[0]; +} + void Party::giveTreasureToCharacter(Character &c, ItemCategory category, int itemIndex) { EventsManager &events = *_vm->_events; Sound &sound = *_vm->_sound; @@ -844,9 +856,9 @@ void Party::giveTreasureToCharacter(Character &c, ItemCategory category, int ite if (index >= (_vm->getGameID() == GType_Swords ? 88 : 82)) { // Quest item, give an extra '*' prefix Common::String format = Common::String::format("\f04 * \fd%s", itemName); - w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), format.c_str())); + w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), getFoundForm(c), format.c_str())); } else { - w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), itemName)); + w.writeString(Common::String::format(Res.X_FOUND_Y, c._name.c_str(), getFoundForm(c), itemName)); } w.update(); @@ -1471,6 +1483,30 @@ bool Party::giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int return false; } +const char* Party::getPickLockForm(const Character &c) { + if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { + switch (c._sex) { + case MALE: + return Res.PICK_FORM[0]; + case FEMALE: + return Res.PICK_FORM[1]; + } + } + return Res.PICK_FORM[0]; +} + +const char* Party::getUnablePickLockForm(const Character &c) { + if (Common::RU_RUS == Common::parseLanguage(ConfMan.get("language"))) { + switch (c._sex) { + case MALE: + return Res.UNABLE_TO_PICK_FORM[0]; + case FEMALE: + return Res.UNABLE_TO_PICK_FORM[1]; + } + } + return Res.UNABLE_TO_PICK_FORM[0]; +} + bool Party::giveExt(int mode1, uint val1, int mode2, uint val2, int mode3, uint val3, int charId) { Combat &combat = *g_vm->_combat; FileManager &files = *g_vm->_files; @@ -1509,14 +1545,14 @@ bool Party::giveExt(int mode1, uint val1, int mode2, uint val2, int mode3, uint sound.playFX(10); intf.draw3d(true, false); - Common::String msg = Common::String::format(Res.PICKS_THE_LOCK, c._name.c_str()); + Common::String msg = Common::String::format(Res.PICKS_THE_LOCK, c._name.c_str(), getPickLockForm(c)); ErrorScroll::show(g_vm, msg, WT_NONFREEZED_WAIT); } else { sound.playFX(21); obj._frame = 0; scripts._animCounter = 0; - Common::String msg = Common::String::format(Res.UNABLE_TO_PICK_LOCK, c._name.c_str()); + Common::String msg = Common::String::format(Res.UNABLE_TO_PICK_LOCK, c._name.c_str(), getUnablePickLockForm(c)); ErrorScroll::show(g_vm, msg, WT_NONFREEZED_WAIT); scripts._animCounter = 255; diff --git a/engines/xeen/party.h b/engines/xeen/party.h index c0a3be5ef70..44753a76d68 100644 --- a/engines/xeen/party.h +++ b/engines/xeen/party.h @@ -157,6 +157,11 @@ private: static XeenEngine *_vm; Character _itemsCharacter; + /** + * Get gender form 'found' + */ + const char* getFoundForm(const Character &c); + /** * Give a treasure item to the given character's inventory */ @@ -269,7 +274,7 @@ public: int subtract(ConsumableType consumableId, uint amount, PartyBank whereId, MessageWaitType wait = WT_FREEZE_WAIT); - int getConsumableForm(ConsumableType consumableId); + const char* getConsumableForm(ConsumableType consumableId); void notEnough(ConsumableType consumableId, PartyBank whereId, bool mode, MessageWaitType wait); @@ -297,6 +302,16 @@ public: */ bool giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int charIdx); + /* + * Get gender form 'picks' + */ + const char* getPickLockForm(const Character &c); + + /* + * Get gender form 'unable to pick' + */ + const char* getUnablePickLockForm(const Character &c); + /** * Gives up to three different item/amounts to various character and/or party properties */ diff --git a/engines/xeen/resources.cpp b/engines/xeen/resources.cpp index 03a308d4548..7a17d0180c7 100644 --- a/engines/xeen/resources.cpp +++ b/engines/xeen/resources.cpp @@ -177,7 +177,9 @@ void Resources::loadData() { file.syncString(NOT_ENOUGH_X_IN_THE_Y); file.syncString(NO_X_IN_THE_Y); file.syncStrings(STAT_NAMES, 16); - file.syncStrings(CONSUMABLE_NAMES, 6); + file.syncStrings(CONSUMABLE_NAMES, 4); + file.syncStrings(CONSUMABLE_GOLD_FORMS, 1); + file.syncStrings(CONSUMABLE_GEM_FORMS, 1); file.syncStrings(WHERE_NAMES, 2); file.syncString(AMOUNT); file.syncString(FOOD_PACKS_FULL); @@ -223,6 +225,7 @@ void Resources::loadData() { file.syncString(CURRENT_MAXIMUM_RATING_TEXT); file.syncString(CURRENT_MAXIMUM_TEXT); file.syncStrings(RATING_TEXT, 24); + file.syncStrings(BORN, 2); file.syncString(AGE_TEXT); file.syncString(LEVEL_TEXT); file.syncString(RESISTENCES_TEXT); @@ -230,6 +233,7 @@ void Resources::loadData() { file.syncString(EXPERIENCE_TEXT); file.syncString(ELIGIBLE); file.syncString(IN_PARTY_IN_BANK); + file.syncStrings(FOOD_ON_HAND, 3); file.syncString(FOOD_TEXT); file.syncString(EXCHANGE_WITH_WHOM); file.syncString(QUICK_REF_LINE); @@ -364,6 +368,7 @@ void Resources::loadData() { file.syncString(BACKPACKS_FULL_PRESS_KEY); file.syncString(HIT_A_KEY); file.syncString(GIVE_TREASURE_FORMATTING); + file.syncStrings(FOUND, 2); file.syncString(X_FOUND_Y); file.syncString(ON_WHO); file.syncString(WHICH_ELEMENT1); @@ -387,7 +392,9 @@ void Resources::loadData() { file.syncString(WARZONE_LEVEL); file.syncString(WARZONE_HOW_MANY); file.syncString(PICKS_THE_LOCK); + file.syncStrings(PICK_FORM, 2); file.syncString(UNABLE_TO_PICK_LOCK); + file.syncStrings(UNABLE_TO_PICK_FORM, 2); file.syncString(CONTROL_PANEL_TEXT); file.syncString(CONTROL_PANEL_BUTTONS); file.syncString(ON); diff --git a/engines/xeen/resources.h b/engines/xeen/resources.h index 02e5f2dd397..378647c5a31 100644 --- a/engines/xeen/resources.h +++ b/engines/xeen/resources.h @@ -230,7 +230,9 @@ public: const char *NOT_ENOUGH_X_IN_THE_Y; const char *NO_X_IN_THE_Y; const char *STAT_NAMES[16]; - const char *CONSUMABLE_NAMES[6]; + const char *CONSUMABLE_NAMES[4]; + const char *CONSUMABLE_GOLD_FORMS[1]; + const char *CONSUMABLE_GEM_FORMS[1]; const char *WHERE_NAMES[2]; const char *AMOUNT; const char *FOOD_PACKS_FULL; @@ -276,6 +278,7 @@ public: const char *CURRENT_MAXIMUM_RATING_TEXT; const char *CURRENT_MAXIMUM_TEXT; const char *RATING_TEXT[24]; + const char *BORN[2]; const char *AGE_TEXT; const char *LEVEL_TEXT; const char *RESISTENCES_TEXT; @@ -283,6 +286,7 @@ public: const char *EXPERIENCE_TEXT; const char *ELIGIBLE; const char *IN_PARTY_IN_BANK; + const char *FOOD_ON_HAND[3]; const char *FOOD_TEXT; const char *EXCHANGE_WITH_WHOM; const char *QUICK_REF_LINE; @@ -417,6 +421,7 @@ public: const char *BACKPACKS_FULL_PRESS_KEY; const char *HIT_A_KEY; const char *GIVE_TREASURE_FORMATTING; + const char *FOUND[2]; const char *X_FOUND_Y; const char *ON_WHO; const char *WHICH_ELEMENT1; @@ -440,7 +445,9 @@ public: const char *WARZONE_LEVEL; const char *WARZONE_HOW_MANY; const char *PICKS_THE_LOCK; + const char *PICK_FORM[2]; const char *UNABLE_TO_PICK_LOCK; + const char *UNABLE_TO_PICK_FORM[2]; const char *CONTROL_PANEL_TEXT; const char *CONTROL_PANEL_BUTTONS; const char *ON;