ULTIMA1: Giving pence to king now working

This commit is contained in:
Paul Gilbert 2020-01-19 21:22:19 -08:00 committed by Paul Gilbert
parent 010fc6cd53
commit 5fb10f662d
7 changed files with 104 additions and 18 deletions

View File

@ -75,9 +75,11 @@ bool TextInput::KeypressMsg(CKeypressMsg &msg) {
setDirty(); setDirty();
} }
} else if (msg._keyState.keycode == Common::KEYCODE_RETURN || msg._keyState.keycode == Common::KEYCODE_KP_ENTER) { } else if (msg._keyState.keycode == Common::KEYCODE_RETURN || msg._keyState.keycode == Common::KEYCODE_KP_ENTER) {
_game->_textCursor->setVisible(false);
CTextInputMsg inputMsg(_text, false); CTextInputMsg inputMsg(_text, false);
inputMsg.execute(_respondTo); inputMsg.execute(_respondTo);
} else if (msg._keyState.keycode == Common::KEYCODE_ESCAPE) { } else if (msg._keyState.keycode == Common::KEYCODE_ESCAPE) {
_game->_textCursor->setVisible(false);
CTextInputMsg inputMsg("", true); CTextInputMsg inputMsg("", true);
inputMsg.execute(_respondTo); inputMsg.execute(_respondTo);
} }

View File

@ -666,9 +666,9 @@ const char *const SRC_GROCERY_FIND_PACKS = "Thou dost find %d bags of food!";
const char *const SRC_WITH_KING = " with king"; const char *const SRC_WITH_KING = " with king";
const char *const SRC_HE_IS_NOT_HERE = "He is not here!"; const char *const SRC_HE_IS_NOT_HERE = "He is not here!";
const char *const SRC_HE_REJECTS_OFFER = "He rejects thine offer!"; const char *const SRC_HE_REJECTS_OFFER = "He rejects thine offer!";
const char *const SRC_KING_TEXT[11] = { const char *const SRC_KING_TEXT[10] = {
"Dost thou offer pence\ror service: ", "neither", "pence", "service", "How much? ", "Dost thou offer pence\ror service: ", "neither", "pence", "service", "How much? ",
"none", "Thou hast not that much!", "In return I give unto thee %u hit points", "Thou hast not that much!", "In return I give unto\rthee %u hit points",
"Thou art on a quest for me already!", "Go now and kill a", "Go forth and find a" "Thou art on a quest for me already!", "Go now and kill a", "Go forth and find a"
}; };
@ -801,7 +801,7 @@ GameResources::GameResources(Shared::Resources *resManager) : LocalResourceFile(
WITH_KING = SRC_WITH_KING; WITH_KING = SRC_WITH_KING;
HE_IS_NOT_HERE = SRC_HE_IS_NOT_HERE; HE_IS_NOT_HERE = SRC_HE_IS_NOT_HERE;
HE_REJECTS_OFFER = SRC_HE_REJECTS_OFFER; HE_REJECTS_OFFER = SRC_HE_REJECTS_OFFER;
Common::copy(&SRC_KING_TEXT[0], &SRC_KING_TEXT[11], KING_TEXT); Common::copy(&SRC_KING_TEXT[0], &SRC_KING_TEXT[10], KING_TEXT);
} }
void GameResources::synchronize() { void GameResources::synchronize() {
@ -928,7 +928,7 @@ void GameResources::synchronize() {
syncString(WITH_KING); syncString(WITH_KING);
syncString(HE_IS_NOT_HERE); syncString(HE_IS_NOT_HERE);
syncString(HE_REJECTS_OFFER); syncString(HE_REJECTS_OFFER);
syncStrings(KING_TEXT, 11); syncStrings(KING_TEXT, 10);
} }
} // End of namespace Ultima1 } // End of namespace Ultima1

View File

@ -159,7 +159,7 @@ public:
const char *WITH_KING; const char *WITH_KING;
const char *HE_IS_NOT_HERE; const char *HE_IS_NOT_HERE;
const char *HE_REJECTS_OFFER; const char *HE_REJECTS_OFFER;
const char *KING_TEXT[11]; const char *KING_TEXT[10];
public: public:
GameResources(); GameResources();

View File

@ -50,6 +50,13 @@ void Dialog::getKeypress() {
msg.execute(infoArea); msg.execute(infoArea);
} }
void Dialog::getInput(bool isNumeric, size_t maxCharacters) {
TreeItem *infoArea = _game->findByName("Info");
Shared::CInfoGetInput msg(this, isNumeric, maxCharacters);
msg.execute(infoArea);
}
void Dialog::draw() { void Dialog::draw() {
// Redraw the game's info area // Redraw the game's info area
U1Gfx::Info *infoArea = dynamic_cast<U1Gfx::Info *>(_game->findByName("Info")); U1Gfx::Info *infoArea = dynamic_cast<U1Gfx::Info *>(_game->findByName("Info"));

View File

@ -66,6 +66,11 @@ protected:
* Prompts for a keypress * Prompts for a keypress
*/ */
void getKeypress(); void getKeypress();
/**
* Prompts for an input
*/
void getInput(bool isNumeric = true, size_t maxCharacters = 4);
public: public:
/** /**
* Constructor * Constructor

View File

@ -33,6 +33,7 @@ namespace U1Dialogs {
BEGIN_MESSAGE_MAP(King, Dialog) BEGIN_MESSAGE_MAP(King, Dialog)
ON_MESSAGE(ShowMsg) ON_MESSAGE(ShowMsg)
ON_MESSAGE(CharacterInputMsg) ON_MESSAGE(CharacterInputMsg)
ON_MESSAGE(TextInputMsg)
END_MESSAGE_MAP() END_MESSAGE_MAP()
King::King(Ultima1Game *game) : Dialog(game), _mode(SELECT) { King::King(Ultima1Game *game) : Dialog(game), _mode(SELECT) {
@ -49,7 +50,7 @@ void King::draw() {
Dialog::draw(); Dialog::draw();
Shared::Gfx::VisualSurface s = getSurface(); Shared::Gfx::VisualSurface s = getSurface();
if (_mode != SELECT) { if (_mode == SERVICE) {
// Draw the background and frame // Draw the background and frame
s.clear(); s.clear();
s.frameRect(Rect(3, 3, _bounds.width() - 3, _bounds.height() - 3), getGame()->_borderColor); s.frameRect(Rect(3, 3, _bounds.width() - 3, _bounds.height() - 3), getGame()->_borderColor);
@ -62,18 +63,33 @@ void King::draw() {
void King::setMode(KingMode mode) { void King::setMode(KingMode mode) {
_mode = mode; _mode = mode;
switch (_mode) {
case PENCE:
addInfoMsg(_game->_res->KING_TEXT[2]); // Pence
addInfoMsg(_game->_res->KING_TEXT[4], false); // How much?
getInput();
break;
case SERVICE:
addInfoMsg(_game->_res->KING_TEXT[3]);
default:
break;
}
setDirty(); setDirty();
} }
bool King::CharacterInputMsg(CCharacterInputMsg &msg) { bool King::CharacterInputMsg(CCharacterInputMsg &msg) {
switch (_mode) { switch (_mode) {
case SELECT: case SELECT:
if (msg._keyState.keycode == Common::KEYCODE_s) if (msg._keyState.keycode == Common::KEYCODE_p)
setMode(SERVICE);
else if (msg._keyState.keycode == Common::KEYCODE_s)
setMode(PENCE); setMode(PENCE);
else if (msg._keyState.keycode == Common::KEYCODE_s)
setMode(SERVICE);
else else
nothing(); neither();
break; break;
default: default:
@ -83,8 +99,48 @@ bool King::CharacterInputMsg(CCharacterInputMsg &msg) {
return true; return true;
} }
void King::nothing() { bool King::TextInputMsg(CTextInputMsg &msg) {
addInfoMsg(_game->_res->NOTHING); assert(_mode == PENCE);
const Shared::Character &c = *_game->_party;
uint amount = atoi(msg._text.c_str());
if (msg._escaped || !amount) {
none();
} else if (amount > c._coins) {
notThatMuch();
} else {
addInfoMsg(Common::String::format("%u", amount));
giveHitPoints(amount * 3 / 2);
}
return true;
}
void King::neither() {
addInfoMsg(_game->_res->KING_TEXT[1]);
_game->endOfTurn();
hide();
}
void King::none() {
addInfoMsg(_game->_res->NONE);
_game->endOfTurn();
hide();
}
void King::notThatMuch() {
addInfoMsg(_game->_res->KING_TEXT[5]);
_game->endOfTurn();
hide();
}
void King::giveHitPoints(uint amount) {
Shared::Character &c = *_game->_party;
assert(amount <= c._coins);
c._coins -= amount;
c._hitPoints += amount;
addInfoMsg(Common::String::format(_game->_res->KING_TEXT[6], amount));
_game->endOfTurn(); _game->endOfTurn();
hide(); hide();
} }

View File

@ -32,6 +32,7 @@ namespace U1Dialogs {
using Shared::CShowMsg; using Shared::CShowMsg;
using Shared::CCharacterInputMsg; using Shared::CCharacterInputMsg;
using Shared::CTextInputMsg;
/** /**
* Dialog for talking to kings * Dialog for talking to kings
@ -40,20 +41,35 @@ class King : public Dialog {
DECLARE_MESSAGE_MAP; DECLARE_MESSAGE_MAP;
bool ShowMsg(CShowMsg &msg); bool ShowMsg(CShowMsg &msg);
bool CharacterInputMsg(CCharacterInputMsg &msg); bool CharacterInputMsg(CCharacterInputMsg &msg);
bool TextInputMsg(CTextInputMsg &msg);
enum KingMode { SELECT, PENCE, SERVICE }; enum KingMode { SELECT, PENCE, SERVICE };
private: private:
KingMode _mode; KingMode _mode;
private: private:
/**
* Nothing selected
*/
void nothing();
/** /**
* Set the mode * Set the mode
*/ */
void setMode(KingMode mode); void setMode(KingMode mode);
/**
* Neither option (buy, service) selected
*/
void neither();
/**
* No pence entered
*/
void none();
/**
* Not that much
*/
void notThatMuch();
/**
* Give hit points
*/
void giveHitPoints(uint amount);
public: public:
CLASSDEF; CLASSDEF;