From 0253ded66e77672f77e4295fb2d30a3caa30ea90 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 24 Jun 2022 18:40:49 -0700 Subject: [PATCH] MM: MM1: Implementing most of item trade --- devtools/create_mm/files/mm1/strings_en.yml | 1 + engines/mm/mm1/data/char.cpp | 16 +++++++++ engines/mm/mm1/data/char.h | 6 ++++ engines/mm/mm1/views/character_info.cpp | 36 ++++++++++++++++++++- engines/mm/mm1/views/character_info.h | 2 +- 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/devtools/create_mm/files/mm1/strings_en.yml b/devtools/create_mm/files/mm1/strings_en.yml index 03f00d98ec2..77f0dddebac 100644 --- a/devtools/create_mm/files/mm1/strings_en.yml +++ b/devtools/create_mm/files/mm1/strings_en.yml @@ -27,6 +27,7 @@ legend4: "'ESC' TO GO BACK 'G' GATHER 'U' USE" equip: "EQUIP WHICH ITEM: 'A'-'F'?" remove: "REMOVE WHICH ITEM: '1'-'6'?" + which: "WHICH ITEM: 'A'-'F'?" wrong_class: "*** WRONG CLASS ***" have_armor: "*** ALREADY WEARING ARMOR ***" not_equipped: "*** NOT EQUIPPED ***" diff --git a/engines/mm/mm1/data/char.cpp b/engines/mm/mm1/data/char.cpp index 57cb00e9d64..9c9329fd9c9 100644 --- a/engines/mm/mm1/data/char.cpp +++ b/engines/mm/mm1/data/char.cpp @@ -173,6 +173,22 @@ void Character::gatherGold() { _gold = total; } +Character::TradeResult Character::trade(int whoTo, int itemIndex) { + Character &dest = g_globals->_party[whoTo]; + if (&dest == this) + return TRADE_SUCCESS; + + if (dest._backpack.full()) + return TRADE_FULL; + if (!_backpack[itemIndex]) + return TRADE_NO_ITEM; + + // TODO: do the trade + + return TRADE_SUCCESS; +} + + Character::LevelIncrease Character::increaseLevel() { _level = ++_levelBase; _age = ++_ageBase; diff --git a/engines/mm/mm1/data/char.h b/engines/mm/mm1/data/char.h index d9bdd540646..60aac9a261f 100644 --- a/engines/mm/mm1/data/char.h +++ b/engines/mm/mm1/data/char.h @@ -182,6 +182,12 @@ struct Character { */ void gatherGold(); + /** + * Trade an item to another + */ + enum TradeResult { TRADE_SUCCESS, TRADE_NO_ITEM, TRADE_FULL }; + TradeResult trade(int whoTo, int itemIndex); + /** * Increase the character's level by 1 at a trainer */ diff --git a/engines/mm/mm1/views/character_info.cpp b/engines/mm/mm1/views/character_info.cpp index fe8228246d6..cdfd088fe9b 100644 --- a/engines/mm/mm1/views/character_info.cpp +++ b/engines/mm/mm1/views/character_info.cpp @@ -87,6 +87,11 @@ void CharacterInfo::draw() { escToGoBack(0); break; + case TRADE_ITEM: + writeString(10, 20, STRING["dialogs.character.which"]); + escToGoBack(0); + break; + default: break; } @@ -182,7 +187,36 @@ bool CharacterInfo::msgKeypress(const KeypressMessage &msg) { ); } else if (msg.keycode == Common::KEYCODE_4) { - // TODO: Trade item + if (g_globals->_party[_tradeWith]._backpack.full()) { + writeString(14, 21, STRING["dialogs.character.full"]); + Sound::sound(SOUND_2); + _state = DISPLAY; + delaySeconds(3); + } else { + _state = TRADE_ITEM; + redraw(); + } + } + break; + + case TRADE_ITEM: + if (msg.keycode >= Common::KEYCODE_a && + msg.keycode <= Common::KEYCODE_f) { + switch (g_globals->_currCharacter->trade(_tradeWith, + msg.keycode - Common::KEYCODE_a)) { + case Character::TRADE_FULL: + writeString(14, 21, STRING["dialogs.character.full"]); + _state = DISPLAY; + delaySeconds(3); + break; + case Character::TRADE_SUCCESS: + _state = DISPLAY; + redraw(); + break; + default: + // Do nothing, no item at selected index + break; + } } break; diff --git a/engines/mm/mm1/views/character_info.h b/engines/mm/mm1/views/character_info.h index e6899a7928e..cd291f7c09c 100644 --- a/engines/mm/mm1/views/character_info.h +++ b/engines/mm/mm1/views/character_info.h @@ -38,7 +38,7 @@ class CharacterInfo : public CharacterBase { private: enum ViewState { DISPLAY, EQUIP, GATHER, REMOVE, SHARE, - TRADE_WITH, TRADE_KIND, TRADE_WHAT }; + TRADE_WITH, TRADE_KIND, TRADE_ITEM }; ViewState _state = DISPLAY; Common::String _newName; private: