In case you haven't seen it, the Qt screen layout is (a bigger instance of): +--------------------+------+--------------------------------+ | messages |invent| status | | |subset| | | | | | | | | | +------------------------------------------------------------+ | map | | | ... | | +------------------------------------------------------------+ where some status fields include an icon and the inventory subset is a miniature map showing a paper doll-style display of object tiles for worn and wielded items. The two separating lines in the top half can be dragged to resize the three windows there. The default message window width to too small to see full text of some messages but can be scrolled left and right. The window for the equipped subset of inventory is unconditionally present; 'perm_invent' is a no-op. Paper doll inventory layout (view with fixed-width font...): Old New two-hand dual-wield x H b x H b x H b . H b S " w S " w W " W X " w G C G G C q G C q G C q = A = = A = = A = = A = . U . l U L l U L l U L . F . . F . . F . . F . Legend: '.' = blank, b = blindfold, '"' = amulet, '=' = left and right rings, w/W = primary weapon, x/X = alternate/secondary weapon, q = quiver, H = helmet, S = shield, G = gloves, C = cloak, A = suit, U = shirt, F = boots, l = leash, L = active light source (lamp/candle/Sunsword). Slots which don't have something equipped are shown blank. 'q' was missing; 'G' used to be shown on both sides. 'l' and 'L' are new; for either, it picks the first one in inventory that's in active use. The 'S' and 'x' slots vary depending upon weapon situation since wearing a shield, wielding a two-handed weapon, and engaging in two-weapon combat are all mutually exclusive.
140 lines
4.2 KiB
C++
140 lines
4.2 KiB
C++
// Copyright (c) Warwick Allison, 1999.
|
|
// Qt4 conversion copyright (c) Ray Chason, 2012-2014.
|
|
// NetHack may be freely redistributed. See license for details.
|
|
|
|
// qt_inv.cpp -- inventory usage window
|
|
//
|
|
// Essentially a "paper doll" style display. [grep fodder]
|
|
//
|
|
// This is at the top center of the main window
|
|
|
|
extern "C" {
|
|
#include "hack.h"
|
|
}
|
|
#undef Invisible
|
|
#undef Warning
|
|
#undef index
|
|
#undef msleep
|
|
#undef rindex
|
|
#undef wizard
|
|
#undef yn
|
|
#undef min
|
|
#undef max
|
|
|
|
#include "qt_pre.h"
|
|
#include <QtGui/QtGui>
|
|
#if QT_VERSION >= 0x050000
|
|
#include <QtWidgets/QtWidgets>
|
|
#endif
|
|
#include "qt_post.h"
|
|
#include "qt_inv.h"
|
|
#include "qt_glyph.h"
|
|
#include "qt_set.h"
|
|
|
|
namespace nethack_qt_ {
|
|
|
|
static struct obj *
|
|
find_tool(int tooltyp)
|
|
{
|
|
struct obj *o;
|
|
|
|
for (o = g.invent; o; o = o->nobj) {
|
|
if ((tooltyp == LEASH && o->otyp == LEASH && o->leashmon)
|
|
// OIL_LAMP is used for candles, lamps, lantern, candelabrum too
|
|
|| (tooltyp == OIL_LAMP && o->lamplit))
|
|
break;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
NetHackQtInvUsageWindow::NetHackQtInvUsageWindow(QWidget* parent) :
|
|
QWidget(parent)
|
|
{
|
|
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
}
|
|
|
|
void NetHackQtInvUsageWindow::drawWorn(QPainter& painter, obj* nhobj,
|
|
int x, int y, bool canbe)
|
|
{
|
|
short int glyph;
|
|
if (nhobj)
|
|
glyph=obj_to_glyph(nhobj, rn2_on_display_rng);
|
|
else if (canbe)
|
|
glyph=cmap_to_glyph(S_room);
|
|
else
|
|
glyph=cmap_to_glyph(S_stone);
|
|
|
|
qt_settings->glyphs().drawCell(painter,glyph,x,y);
|
|
}
|
|
|
|
void NetHackQtInvUsageWindow::paintEvent(QPaintEvent*)
|
|
{
|
|
// 0 1 2 two dual
|
|
// hander wielding
|
|
// 0 x H b x H b . H b
|
|
// 1 S " w W " W X " w
|
|
// 2 G C q G C q G C q
|
|
// 3 = A = = A = = A =
|
|
// 4 l U L l U L l U L
|
|
// 5 . F . . F . . F .
|
|
//
|
|
// 3.7: use a different legend for the layout
|
|
// show quiver instead of repeating gloves on both sides;
|
|
// show secondary weapon in shield slot when two-weapon is active;
|
|
// show two-handed primary weapon in both shield and uwep slots;
|
|
// show lit lamp/lantern/candle/candelabrum on lower right side;
|
|
// show leash-in-use on lower left side
|
|
|
|
QPainter painter;
|
|
painter.begin(this);
|
|
|
|
// Blanks
|
|
drawWorn(painter, 0, 0, 5, false);
|
|
drawWorn(painter, 0, 2, 5, false);
|
|
if (u.twoweap) // empty alt weapon slot, show uswapwep in shield slot
|
|
drawWorn(painter, 0, 0, 0, false);
|
|
|
|
// TODO: render differently if known to be non-removable (known cursed)
|
|
drawWorn(painter, uarm, 1, 3); // Armour
|
|
drawWorn(painter, uarmc, 1, 2); // Cloak
|
|
drawWorn(painter, uarmh, 1, 0); // Helmet
|
|
// shield slot varies depending upon weapon usage
|
|
if (u.twoweap)
|
|
drawWorn(painter, uswapwep, 0, 1); // Secondary weapon, in use
|
|
else if (uwep && bimanual(uwep))
|
|
drawWorn(painter, uwep, 0, 1); // Two-handed weapon shown twice
|
|
else
|
|
drawWorn(painter, uarms, 0, 1); // Shield (might be blank)
|
|
drawWorn(painter, uarmg, 0, 2); // Gloves
|
|
drawWorn(painter, uarmf, 1, 5); // Shoes (feet)
|
|
drawWorn(painter, uarmu, 1, 4); // Undershirt
|
|
drawWorn(painter, uleft, 0, 3); // RingL
|
|
drawWorn(painter, uright, 2, 3); // RingR
|
|
|
|
drawWorn(painter, uwep, 2, 1); // Weapon
|
|
drawWorn(painter, !u.twoweap ? uswapwep : NULL, 0, 0); // Alternate weapon
|
|
drawWorn(painter, uquiver, 2, 2); // Quiver
|
|
drawWorn(painter, uamul, 1, 1); // Amulet
|
|
drawWorn(painter, ublindf, 2, 0); // Blindfold/Towel/Lenses
|
|
|
|
// light source and leash aren't unique and don't have pointers defined
|
|
drawWorn(painter, find_tool(LEASH), 0, 4);
|
|
// OIL_LAMP matches lit candles, lamps, lantern, and candelabrum (and will
|
|
// also duplicate Sunsword when it is wielded and shown in the uwep slot)
|
|
drawWorn(painter, find_tool(OIL_LAMP), 2, 4);
|
|
|
|
painter.end();
|
|
}
|
|
|
|
QSize NetHackQtInvUsageWindow::sizeHint(void) const
|
|
{
|
|
if (qt_settings) {
|
|
return QSize(qt_settings->glyphs().width()*3,
|
|
qt_settings->glyphs().height()*6);
|
|
} else {
|
|
return QWidget::sizeHint();
|
|
}
|
|
}
|
|
|
|
} // namespace nethack_qt_
|