Initial commit
This commit is contained in:
565
engines/ultima/ultima8/gumps/weasel_gump.cpp
Normal file
565
engines/ultima/ultima8/gumps/weasel_gump.cpp
Normal file
@@ -0,0 +1,565 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ultima/ultima8/gumps/weasel_gump.h"
|
||||
#include "ultima/ultima8/gumps/weasel_dat.h"
|
||||
#include "ultima/ultima8/games/game_data.h"
|
||||
#include "ultima/ultima8/gfx/gump_shape_archive.h"
|
||||
#include "ultima/ultima8/gfx/main_shape_archive.h"
|
||||
#include "ultima/ultima8/gfx/shape.h"
|
||||
#include "ultima/ultima8/gfx/shape_frame.h"
|
||||
#include "ultima/ultima8/ultima8.h"
|
||||
#include "ultima/ultima8/kernel/mouse.h"
|
||||
#include "ultima/ultima8/gumps/widgets/button_widget.h"
|
||||
#include "ultima/ultima8/gumps/widgets/text_widget.h"
|
||||
#include "ultima/ultima8/gumps/movie_gump.h"
|
||||
#include "ultima/ultima8/world/actors/main_actor.h"
|
||||
#include "ultima/ultima8/audio/audio_process.h"
|
||||
#include "ultima/ultima8/world/get_object.h"
|
||||
#include "ultima/ultima8/world/item_factory.h"
|
||||
|
||||
namespace Ultima {
|
||||
namespace Ultima8 {
|
||||
|
||||
DEFINE_RUNTIME_CLASSTYPE_CODE(WeaselGump)
|
||||
|
||||
static const uint16 WEASEL_CANT_BUY_SFXNO = 0xb0;
|
||||
static const int WEASEL_FONT = 6;
|
||||
static const int WEASEL_SHAPE_TOP = 22;
|
||||
|
||||
enum WeaselUiElements {
|
||||
kBtnLeft = 0,
|
||||
kBtnBlank = 1,
|
||||
kBtnRight = 2,
|
||||
kBtnYes = 3,
|
||||
kBtnNo = 4,
|
||||
kBtnBuy = 5,
|
||||
kBtnAmmo = 6,
|
||||
kBtnWeapons = 7,
|
||||
kBtnExit = 8,
|
||||
kTxtCredits = 9,
|
||||
kIconItem = 10,
|
||||
kTxtItemName = 11,
|
||||
kTxtItemCost = 12,
|
||||
kTxtItemPurch = 13,
|
||||
kTxtItemOwned = 14,
|
||||
kTxtQuestion = 15
|
||||
};
|
||||
// Coords and shapes for above list of buttons
|
||||
static const int WEASEL_BTN_X[] = { 14, 76, 138, 18, 113, 20, 19, 19, 44};
|
||||
static const int WEASEL_BTN_Y[] = {213, 213, 213, 237, 237, 280, 319, 319, 368};
|
||||
static const int WEASEL_BTN_SHAPES[] = {13, 26, 14, 16, 15, 28, 27, 83, 29};
|
||||
|
||||
static const char *const FIRST_INTRO_MOVIE = "17A";
|
||||
static const char *const INTRO_MOVIES[] = {"18A", "18B", "18C"};
|
||||
static const char *const BUYMORE_MOVIES[] = {"21A", "21B"};
|
||||
static const char *const CONFIRM_BUY_MOVIES[] = {"21A", "21B"};
|
||||
static const char *const CANCELLED_PURCHASE_MOVIES[] = {"19C", "19D"};
|
||||
static const char *const COMPLETED_PURCHASE_MOVIES[] = {"21C", "21D"};
|
||||
static const char *const INSUFFICIENT_FUND_MOVIES[] = {"20C", "20D"};
|
||||
|
||||
|
||||
namespace {
|
||||
// A small container gump that doesn't do anything except pass notifications to the parent
|
||||
class WeaselUIContainerGump : public Gump {
|
||||
void ChildNotify(Gump *child, uint32 message) override {
|
||||
_parent->ChildNotify(child, message);
|
||||
}
|
||||
};
|
||||
|
||||
static void _closeIfExists(Gump *gump) {
|
||||
if (gump)
|
||||
gump->Close();
|
||||
}
|
||||
|
||||
static const char *_getRandomMovie(const char *const *movies, int nmovies) {
|
||||
Common::RandomSource &rs = Ultima8Engine::get_instance()->getRandomSource();
|
||||
int offset = rs.getRandomNumber(nmovies - 1);
|
||||
return movies[offset];
|
||||
}
|
||||
}
|
||||
|
||||
bool WeaselGump::_playedIntroMovie = false;
|
||||
|
||||
WeaselGump::WeaselGump(uint16 level)
|
||||
: ModalGump(0, 0, 640, 480), _credits(0), _level(level),
|
||||
_state(kWeaselStart), _curItem(0), _ammoMode(false), _curItemCost(1),
|
||||
_curItemShape(0), _ui(nullptr), _movie(nullptr), _weaselDat(nullptr) {
|
||||
Mouse *mouse = Mouse::get_instance();
|
||||
mouse->pushMouseCursor(Mouse::MOUSE_HAND);
|
||||
}
|
||||
|
||||
WeaselGump::~WeaselGump() {
|
||||
}
|
||||
|
||||
|
||||
void WeaselGump::Close(bool no_del) {
|
||||
Mouse *mouse = Mouse::get_instance();
|
||||
mouse->popMouseCursor();
|
||||
ModalGump::Close(no_del);
|
||||
}
|
||||
|
||||
void WeaselGump::InitGump(Gump *newparent, bool take_focus) {
|
||||
ModalGump::InitGump(newparent, take_focus);
|
||||
|
||||
GumpShapeArchive *shapeArchive = GameData::get_instance()->getGumps();
|
||||
|
||||
const Shape *top = shapeArchive->getShape(WEASEL_SHAPE_TOP);
|
||||
const Shape *midhi = shapeArchive->getShape(WEASEL_SHAPE_TOP + 1);
|
||||
const Shape *midlo = shapeArchive->getShape(WEASEL_SHAPE_TOP + 2);
|
||||
const Shape *bot = shapeArchive->getShape(WEASEL_SHAPE_TOP + 3);
|
||||
|
||||
if (!top || !midhi || !midlo || !bot) {
|
||||
error("Couldn't load shapes for weasel");
|
||||
return;
|
||||
}
|
||||
|
||||
const ShapeFrame *tFrame = top->getFrame(0);
|
||||
const ShapeFrame *mhFrame = midhi->getFrame(0);
|
||||
const ShapeFrame *mlFrame = midlo->getFrame(0);
|
||||
const ShapeFrame *bFrame = bot->getFrame(0);
|
||||
if (!tFrame || !mhFrame || !mlFrame || !bFrame) {
|
||||
error("Couldn't load shape frames for weasel");
|
||||
return;
|
||||
}
|
||||
|
||||
_ui = new WeaselUIContainerGump();
|
||||
_ui->setDims(Common::Rect32(0, 0, mhFrame->_width,
|
||||
tFrame->_height + mhFrame->_height + mlFrame->_height + bFrame->_height));
|
||||
_ui->InitGump(this, false);
|
||||
_ui->setRelativePosition(CENTER);
|
||||
|
||||
Gump *tGump = new Gump(3, 0, tFrame->_width, tFrame->_height);
|
||||
tGump->SetShape(top, 0);
|
||||
tGump->InitGump(_ui, false);
|
||||
Gump *mhGump = new Gump(0, tFrame->_height, mhFrame->_width, mhFrame->_height);
|
||||
mhGump->SetShape(midhi, 0);
|
||||
mhGump->InitGump(_ui, false);
|
||||
Gump *mlGump = new Gump(5, tFrame->_height + mhFrame->_height, mlFrame->_width, mlFrame->_height);
|
||||
mlGump->SetShape(midlo, 0);
|
||||
mlGump->InitGump(_ui, false);
|
||||
Gump *bGump = new Gump(9, tFrame->_height + mhFrame->_height + mlFrame->_height, bFrame->_width, bFrame->_height);
|
||||
bGump->SetShape(bot, 0);
|
||||
bGump->InitGump(_ui, false);
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(WEASEL_BTN_X); i++) {
|
||||
uint32 buttonShapeNum = WEASEL_BTN_SHAPES[i];
|
||||
const Shape *buttonShape = shapeArchive->getShape(buttonShapeNum);
|
||||
if (!buttonShape) {
|
||||
error("Couldn't load shape for weasel button %d", i);
|
||||
return;
|
||||
}
|
||||
|
||||
const ShapeFrame *buttonFrame = buttonShape->getFrame(0);
|
||||
if (!buttonFrame || buttonShape->frameCount() != 2) {
|
||||
error("Couldn't load shape frame for weasel button %d", i);
|
||||
return;
|
||||
}
|
||||
|
||||
FrameID frame_up(GameData::GUMPS, buttonShapeNum, 0);
|
||||
FrameID frame_down(GameData::GUMPS, buttonShapeNum, 1);
|
||||
Gump *widget = new ButtonWidget(WEASEL_BTN_X[i], WEASEL_BTN_Y[i], frame_up, frame_down, false);
|
||||
widget->InitGump(_ui, false);
|
||||
widget->SetIndex(i);
|
||||
// some buttons start hidden, the browsingMode() call below does that.
|
||||
}
|
||||
|
||||
MainActor *av = getMainActor();
|
||||
assert(av);
|
||||
Item *item = av->getFirstItemWithShape(0x4ed, true);
|
||||
if (item)
|
||||
_credits = item->getQuality();
|
||||
|
||||
_weaselDat = GameData::get_instance()->getWeaselDat(_level);
|
||||
if (!_weaselDat || _weaselDat->getNumItems() == 0)
|
||||
Close();
|
||||
}
|
||||
|
||||
Gump *WeaselGump::playMovie(const Std::string &filename) {
|
||||
MovieGump *gump = MovieGump::CruMovieViewer(filename, 600, 450, nullptr, this, 0);
|
||||
if (!gump) {
|
||||
warning("Couldn't load flic %s", filename.c_str());
|
||||
return nullptr;
|
||||
}
|
||||
gump->CreateNotifier();
|
||||
return gump;
|
||||
}
|
||||
|
||||
void WeaselGump::run() {
|
||||
ModalGump::run();
|
||||
// Don't do much while a movie is playing.
|
||||
if (_movie)
|
||||
return;
|
||||
_ui->UnhideGump();
|
||||
switch (_state) {
|
||||
case kWeaselStart:
|
||||
_state = kWeaselShowIntro;
|
||||
break;
|
||||
case kWeaselShowIntro: {
|
||||
if (_level == 2 && !_playedIntroMovie) {
|
||||
_movie = playMovie(FIRST_INTRO_MOVIE);
|
||||
_playedIntroMovie = true;
|
||||
} else {
|
||||
_movie = playMovie(_getRandomMovie(INTRO_MOVIES, ARRAYSIZE(INTRO_MOVIES)));
|
||||
}
|
||||
_state = kWeaselBrowsing;
|
||||
browsingMode(true);
|
||||
break;
|
||||
}
|
||||
case kWeaselCheckBuyMoreMovie:
|
||||
_movie = playMovie(_getRandomMovie(BUYMORE_MOVIES, ARRAYSIZE(BUYMORE_MOVIES)));
|
||||
_state = kWeaselCheckBuyMoreText;
|
||||
break;
|
||||
case kWeaselCheckBuyMoreText:
|
||||
checkBuyMore();
|
||||
break;
|
||||
case kWeaselClosing:
|
||||
Close();
|
||||
break;
|
||||
case kWeaselConfirmPurchaseMovie:
|
||||
_movie = playMovie(_getRandomMovie(CONFIRM_BUY_MOVIES, ARRAYSIZE(CONFIRM_BUY_MOVIES)));
|
||||
_state = kWeaselConfirmPurchaseText;
|
||||
break;
|
||||
case kWeaselConfirmPurchaseText:
|
||||
confirmPurchase();
|
||||
break;
|
||||
case kWeaselCancelledPurchaseMovie:
|
||||
browsingMode(true);
|
||||
_movie = playMovie(_getRandomMovie(CANCELLED_PURCHASE_MOVIES, ARRAYSIZE(CANCELLED_PURCHASE_MOVIES)));
|
||||
_state = kWeaselBrowsing;
|
||||
break;
|
||||
case kWeaselCompletedPurchase:
|
||||
_movie = playMovie(_getRandomMovie(COMPLETED_PURCHASE_MOVIES, ARRAYSIZE(COMPLETED_PURCHASE_MOVIES)));
|
||||
_state = kWeaselCheckBuyMoreText;
|
||||
break;
|
||||
case kWeaselInsufficientFunds:
|
||||
// TODO: how does it get to this situation?
|
||||
_movie = playMovie(_getRandomMovie(INSUFFICIENT_FUND_MOVIES, ARRAYSIZE(INSUFFICIENT_FUND_MOVIES)));
|
||||
break;
|
||||
case kWeaselBrowsing:
|
||||
_ui->UnhideGump();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (_movie) {
|
||||
_ui->HideGump();
|
||||
}
|
||||
}
|
||||
|
||||
void WeaselGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled) {
|
||||
Gump::PaintThis(surf, lerp_factor, scaled);
|
||||
}
|
||||
|
||||
bool WeaselGump::OnKeyDown(int key, int mod) {
|
||||
if (Gump::OnKeyDown(key, mod)) return true;
|
||||
|
||||
// TODO: support more keyboard input
|
||||
switch (key) {
|
||||
case Common::KEYCODE_LEFT:
|
||||
if (_state == kWeaselBrowsing)
|
||||
prevItem();
|
||||
break;
|
||||
case Common::KEYCODE_RIGHT:
|
||||
if (_state == kWeaselBrowsing)
|
||||
nextItem();
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WeaselGump::ChildNotify(Gump *child, uint32 message) {
|
||||
ButtonWidget *buttonWidget = dynamic_cast<ButtonWidget *>(child);
|
||||
MovieGump *movieGump = dynamic_cast<MovieGump *>(child);
|
||||
if (buttonWidget && message == ButtonWidget::BUTTON_CLICK) {
|
||||
onButtonClick(child->GetIndex());
|
||||
} else if (movieGump && message == Gump::GUMP_CLOSING) {
|
||||
// Movie has finished.
|
||||
_movie = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void WeaselGump::onButtonClick(int entry) {
|
||||
switch (entry) {
|
||||
case kBtnWeapons:
|
||||
_ammoMode = false;
|
||||
updateForAmmoMode();
|
||||
break;
|
||||
case kBtnAmmo:
|
||||
_ammoMode = true;
|
||||
updateForAmmoMode();
|
||||
break;
|
||||
case kBtnLeft:
|
||||
prevItem();
|
||||
break;
|
||||
case kBtnRight:
|
||||
nextItem();
|
||||
break;
|
||||
case kBtnBuy:
|
||||
buyItem();
|
||||
break;
|
||||
case kBtnExit:
|
||||
checkClose();
|
||||
break;
|
||||
case kBtnYes:
|
||||
if (_state == kWeaselConfirmPurchaseText)
|
||||
completePurchase();
|
||||
else if (_state == kWeaselCheckBuyMoreText)
|
||||
browsingMode(true);
|
||||
break;
|
||||
case kBtnNo:
|
||||
if (_state == kWeaselConfirmPurchaseText)
|
||||
abortPurchase();
|
||||
else if (_state == kWeaselCheckBuyMoreText)
|
||||
Close();
|
||||
break;
|
||||
case kBtnBlank:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WeaselGump::updateForAmmoMode() {
|
||||
Gump *ammobtn = _ui->FindGump(&FindByIndex<kBtnAmmo>);
|
||||
Gump *wpnbtn = _ui->FindGump(&FindByIndex<kBtnWeapons>);
|
||||
assert(ammobtn && wpnbtn);
|
||||
ammobtn->SetVisibility(!_ammoMode);
|
||||
wpnbtn->SetVisibility(_ammoMode);
|
||||
_curItem = 0;
|
||||
|
||||
_weaselDat = GameData::get_instance()->getWeaselDat(_ammoMode ? 1 : _level);
|
||||
if (!_weaselDat || _weaselDat->getNumItems() == 0)
|
||||
Close();
|
||||
|
||||
updateItemDisplay();
|
||||
}
|
||||
|
||||
|
||||
void WeaselGump::prevItem() {
|
||||
_curItem--;
|
||||
if (_curItem < 0)
|
||||
_curItem = _weaselDat->getNumItems() - 1;
|
||||
updateItemDisplay();
|
||||
}
|
||||
|
||||
void WeaselGump::nextItem() {
|
||||
_curItem++;
|
||||
if (_curItem >= _weaselDat->getNumItems())
|
||||
_curItem = 0;
|
||||
updateItemDisplay();
|
||||
}
|
||||
|
||||
void WeaselGump::buyItem() {
|
||||
if (_curItemCost < _credits) {
|
||||
_purchases.push_back(_curItemShape);
|
||||
_credits -= _curItemCost;
|
||||
} else {
|
||||
AudioProcess::get_instance()->playSFX(WEASEL_CANT_BUY_SFXNO, 0x80, 0, 0);
|
||||
}
|
||||
updateItemDisplay();
|
||||
}
|
||||
|
||||
void WeaselGump::confirmPurchase() {
|
||||
static const char *confirm = "Are you sure you want to buy this?";
|
||||
setYesNoQuestion(confirm);
|
||||
}
|
||||
|
||||
void WeaselGump::checkClose() {
|
||||
if (_purchases.size()) {
|
||||
_state = kWeaselConfirmPurchaseMovie;
|
||||
} else {
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
void WeaselGump::completePurchase() {
|
||||
assert(_state == kWeaselConfirmPurchaseText);
|
||||
MainActor *av = getMainActor();
|
||||
uint16 mapno = av->getMapNum();
|
||||
assert(av);
|
||||
Item *item = av->getFirstItemWithShape(0x4ed, true);
|
||||
if (item)
|
||||
item->setQuality(_credits);
|
||||
for (const auto &purchase : _purchases) {
|
||||
Item *newitem = ItemFactory::createItem(purchase, 0, 0, 0, 0, mapno, 0, true);
|
||||
av->addItemCru(newitem, false);
|
||||
}
|
||||
_state = kWeaselCompletedPurchase;
|
||||
}
|
||||
|
||||
void WeaselGump::checkBuyMore() {
|
||||
static const char *buymore = "Do you want anything else?";
|
||||
setYesNoQuestion(buymore);
|
||||
}
|
||||
|
||||
void WeaselGump::setYesNoQuestion(const Std::string &msg) {
|
||||
browsingMode(false);
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtQuestion>));
|
||||
TextWidget *textWidget = new TextWidget(30, 100, msg, true, WEASEL_FONT, 150);
|
||||
textWidget->InitGump(_ui);
|
||||
textWidget->SetIndex(kTxtQuestion);
|
||||
}
|
||||
|
||||
void WeaselGump::browsingMode(bool browsing) {
|
||||
_ui->UnhideGump();
|
||||
|
||||
updateForAmmoMode();
|
||||
updateItemDisplay();
|
||||
|
||||
// Note: all these searches are not super effieient but it's
|
||||
// not a time-sensitive function and the search is relatively short
|
||||
Gump *yesbtn = _ui->FindGump(&FindByIndex<kBtnYes>);
|
||||
Gump *nobtn = _ui->FindGump(&FindByIndex<kBtnNo>);
|
||||
Gump *qtxt = _ui->FindGump(&FindByIndex<kTxtQuestion>);
|
||||
|
||||
Gump *buybtn = _ui->FindGump(&FindByIndex<kBtnBuy>);
|
||||
Gump *wpnbtn = _ui->FindGump(&FindByIndex<kBtnWeapons>);
|
||||
Gump *ammobtn = _ui->FindGump(&FindByIndex<kBtnAmmo>);
|
||||
Gump *exitbtn = _ui->FindGump(&FindByIndex<kBtnExit>);
|
||||
Gump *blankbtn = _ui->FindGump(&FindByIndex<kBtnBlank>);
|
||||
Gump *leftbtn = _ui->FindGump(&FindByIndex<kBtnLeft>);
|
||||
Gump *rightbtn = _ui->FindGump(&FindByIndex<kBtnRight>);
|
||||
Gump *credtxt = _ui->FindGump(&FindByIndex<kTxtCredits>);
|
||||
Gump *nametxt = _ui->FindGump(&FindByIndex<kTxtItemName>);
|
||||
Gump *costtxt = _ui->FindGump(&FindByIndex<kTxtItemCost>);
|
||||
Gump *purchtxt = _ui->FindGump(&FindByIndex<kTxtItemPurch>);
|
||||
Gump *ownedtxt = _ui->FindGump(&FindByIndex<kTxtItemOwned>);
|
||||
Gump *icon = _ui->FindGump(&FindByIndex<kIconItem>);
|
||||
|
||||
yesbtn->SetVisibility(!browsing);
|
||||
nobtn->SetVisibility(!browsing);
|
||||
if (qtxt)
|
||||
qtxt->SetVisibility(!browsing);
|
||||
|
||||
buybtn->SetVisibility(browsing);
|
||||
wpnbtn->SetVisibility(browsing && _ammoMode);
|
||||
ammobtn->SetVisibility(browsing && !_ammoMode);
|
||||
exitbtn->SetVisibility(browsing);
|
||||
blankbtn->SetVisibility(browsing);
|
||||
leftbtn->SetVisibility(browsing);
|
||||
rightbtn->SetVisibility(browsing);
|
||||
credtxt->SetVisibility(browsing);
|
||||
nametxt->SetVisibility(browsing);
|
||||
costtxt->SetVisibility(browsing);
|
||||
purchtxt->SetVisibility(browsing);
|
||||
ownedtxt->SetVisibility(browsing);
|
||||
icon->SetVisibility(browsing);
|
||||
}
|
||||
|
||||
void WeaselGump::abortPurchase() {
|
||||
assert(_state == kWeaselConfirmPurchaseText);
|
||||
_state = kWeaselCancelledPurchaseMovie;
|
||||
_purchases.clear();
|
||||
}
|
||||
|
||||
int WeaselGump::purchasedCount(uint16 shape) const {
|
||||
int count = 0;
|
||||
for (const auto &purchase : _purchases) {
|
||||
if (purchase == shape)
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void WeaselGump::updateItemDisplay() {
|
||||
const Std::vector<WeaselDat::WeaselEntry> &items = _weaselDat->getItems();
|
||||
|
||||
// should always have the item..
|
||||
assert(_curItem < (int)items.size());
|
||||
|
||||
_curItemCost = items[_curItem]._cost;
|
||||
_curItemShape = items[_curItem]._shapeNo;
|
||||
|
||||
const ShapeInfo *shapeinfo = GameData::get_instance()->getMainShapes()->getShapeInfo(_curItemShape);
|
||||
if (!shapeinfo || !shapeinfo->_weaponInfo) {
|
||||
warning("Weasel: no info for shape %d", _curItemShape);
|
||||
return;
|
||||
}
|
||||
const Shape *shape = GameData::get_instance()->getGumps()->getShape(shapeinfo->_weaponInfo->_displayGumpShape);
|
||||
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtCredits>));
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtItemName>));
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtItemCost>));
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtItemPurch>));
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kTxtItemOwned>));
|
||||
_closeIfExists(_ui->FindGump(&FindByIndex<kIconItem>));
|
||||
|
||||
Std::string credstr = Std::string::format("Credits:%d", _credits);
|
||||
TextWidget *textWidget = new TextWidget(30, 57, credstr, true, WEASEL_FONT);
|
||||
textWidget->InitGump(_ui);
|
||||
textWidget->SetIndex(kTxtCredits);
|
||||
|
||||
const ShapeFrame *frame = shape->getFrame(shapeinfo->_weaponInfo->_displayGumpFrame);
|
||||
Gump *icon = new Gump(105 - frame->_xoff, 120 - frame->_yoff, 200, 200);
|
||||
icon->SetShape(shape, shapeinfo->_weaponInfo->_displayGumpFrame);
|
||||
icon->UpdateDimsFromShape();
|
||||
icon->setRelativePosition(CENTER);
|
||||
icon->InitGump(_ui, false);
|
||||
icon->SetIndex(kIconItem);
|
||||
|
||||
Std::string coststr = Std::string::format("Cost:%d", _curItemCost);
|
||||
Std::string purchstr = Std::string::format("Purchased:%02d", purchasedCount(_curItemShape));
|
||||
|
||||
MainActor *av = getMainActor();
|
||||
const Item *item = av->getFirstItemWithShape(_curItemShape, true);
|
||||
int count = 0;
|
||||
if (item) {
|
||||
if (shapeinfo->_family == ShapeInfo::SF_CRUWEAPON) {
|
||||
count = 1;
|
||||
} else {
|
||||
count = item->getQuality();
|
||||
}
|
||||
}
|
||||
Std::string ownedstr = Std::string::format("Owned:%02d", count);
|
||||
|
||||
TextWidget *nametxt = new TextWidget(27, 161, shapeinfo->_weaponInfo->_name, true, WEASEL_FONT);
|
||||
nametxt->InitGump(_ui, false);
|
||||
nametxt->SetIndex(kTxtItemName);
|
||||
TextWidget *costtxt = new TextWidget(27, 171, coststr, true, WEASEL_FONT);
|
||||
costtxt->InitGump(_ui, false);
|
||||
costtxt->SetIndex(kTxtItemCost);
|
||||
TextWidget *purchtxt = new TextWidget(27, 181, purchstr, true, WEASEL_FONT);
|
||||
purchtxt->InitGump(_ui, false);
|
||||
purchtxt->SetIndex(kTxtItemPurch);
|
||||
TextWidget *ownedtxt = new TextWidget(27, 191, ownedstr, true, WEASEL_FONT);
|
||||
ownedtxt->InitGump(_ui, false);
|
||||
ownedtxt->SetIndex(kTxtItemOwned);
|
||||
}
|
||||
|
||||
bool WeaselGump::OnTextInput(int unicode) {
|
||||
if (Gump::OnTextInput(unicode)) return true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//static
|
||||
uint32 WeaselGump::I_showWeaselGump(const uint8 *args, unsigned int /*argsize*/) {
|
||||
ARG_UINT16(level);
|
||||
|
||||
WeaselGump *gump = new WeaselGump(level);
|
||||
gump->InitGump(0);
|
||||
gump->setRelativePosition(CENTER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // End of namespace Ultima8
|
||||
} // End of namespace Ultima
|
||||
Reference in New Issue
Block a user