scummvm/engines/xeen/dialogs_awards.cpp

132 lines
3.6 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "xeen/dialogs_awards.h"
#include "xeen/party.h"
#include "xeen/resources.h"
#include "xeen/xeen.h"
namespace Xeen {
void Awards::show(XeenEngine *vm, const Character *ch) {
Awards *dlg = new Awards(vm);
dlg->execute(ch);
delete dlg;
}
void Awards::execute(const Character *ch) {
EventsManager &events = *g_vm->_events;
Windows &windows = *g_vm->_windows;
Common::StringArray awards;
int numAwards;
Mode oldMode = g_vm->_mode;
int topIndex = 0;
loadStrings("award.bin", 1);
addButtons();
// Open the window and draw contents
bool win29Open = windows[29]._enabled;
if (!win29Open) {
windows[29].open();
windows[30].open();
}
windows[29].writeString(Res.AWARDS_TEXT);
drawButtons(&windows[0]);
while (!_vm->shouldExit()) {
// Build up a list of awards the character has
awards.clear();
awards.resize(AWARDS_TOTAL);
numAwards = 0;
for (int awardNum = 0; awardNum < AWARDS_TOTAL; ++awardNum) {
if (ch->hasAward(awardNum)) {
if (awardNum == 9) {
// # Warzone Wins
awards[numAwards] = Common::String::format(_textStrings[9].c_str(), 28);
} else if (awardNum == 17) {
// Legendary Race
awards[numAwards] = Common::String::format(_textStrings[17].c_str(),
Res.RACE_NAMES[ch->_race]);
} else {
awards[numAwards] = _textStrings[awardNum];
}
++numAwards;
}
}
// If no awards, add in a message indicating so
if (numAwards == 0) {
awards[1] = Res.NO_AWARDS;
}
Common::String msg = Common::String::format(Res.AWARDS_FOR,
ch->_name.c_str(), Res.CLASS_NAMES[ch->_class],
awards[topIndex].c_str(),
awards[topIndex + 1].c_str(),
awards[topIndex + 2].c_str(),
awards[topIndex + 3].c_str(),
awards[topIndex + 4].c_str(),
awards[topIndex + 5].c_str(),
awards[topIndex + 6].c_str(),
awards[topIndex + 7].c_str(),
awards[topIndex + 8].c_str()
);
windows[30].writeString(msg);
windows[24].update();
// Wait for keypress
do {
events.pollEventsAndWait();
checkEvents(_vm);
} while (!g_vm->shouldExit() && !_buttonValue);
if (_buttonValue == Common::KEYCODE_ESCAPE) {
break;
} else if (_buttonValue == Common::KEYCODE_u) {
topIndex = MAX(topIndex - 1, 0);
} else if (_buttonValue == Common::KEYCODE_d) {
if ((++topIndex + 9) > numAwards)
--topIndex;
}
}
// Close the window
if (win29Open) {
windows[30].close();
windows[29].close();
}
g_vm->_mode = oldMode;
}
void Awards::addButtons() {
_iconSprites.load("award.icn");
addButton(Common::Rect(216, 109, 240, 129), Common::KEYCODE_u, &_iconSprites);
addButton(Common::Rect(250, 109, 274, 129), Common::KEYCODE_d, &_iconSprites);
addButton(Common::Rect(284, 109, 308, 129), Common::KEYCODE_ESCAPE, &_iconSprites);
}
} // End of namespace Xeen