When items in the paper doll inventory subset (primary worn and wielded items) have known BUC state, indicate what that is. It now draws a one pixel wide white border around each doll tile, and if BUC is known, that border gets its color changed (red for known cursed, yellow for known uncursed, cyan for known blessed). That isn't very visual so the first pixel inside the tile is overwritten with the same color, and alternating pixels are also overwritten for the second rectangle within. The 2..3 pixel wide border is visible without cluttering the tile for 'normal' sized paper doll. The tiles are allowed to be scrunched down to as small as 6x6 so there won't be much left after 1 or 2 around the edge are replaced. Initially I was going to try to highlight welded items but the more general BUC highlighting is simpler and usually more useful to the player. The qt_map.* bits are just reformatting. I was looking at pet and pile annotations as a way to do BUC annotations but decided not to attempt that.
162 lines
5.2 KiB
C++
162 lines
5.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"
|
|
}
|
|
|
|
#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;
|
|
int border;
|
|
|
|
if (nhobj) {
|
|
border = BORDER_DEFAULT;
|
|
if (Role_if('P') && !Blind)
|
|
nhobj->bknown = 1;
|
|
if (nhobj->bknown)
|
|
border = nhobj->cursed ? BORDER_CURSED
|
|
: !nhobj->blessed ? BORDER_UNCURSED
|
|
: BORDER_BLESSED;
|
|
glyph = obj_to_glyph(nhobj, rn2_on_display_rng);
|
|
} else {
|
|
border = NO_BORDER;
|
|
glyph = canbe ? cmap_to_glyph(S_room) : GLYPH_UNEXPLORED;
|
|
}
|
|
qt_settings->glyphs().drawBorderedCell(painter, glyph, x, y, border);
|
|
}
|
|
|
|
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
|
|
|
|
#ifdef ENHANCED_PAPERDOLL
|
|
if (!qt_settings->doll_is_shown)
|
|
return;
|
|
qt_settings->glyphs().setSize(qt_settings->dollWidth,
|
|
qt_settings->dollHeight);
|
|
#endif
|
|
|
|
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();
|
|
|
|
#ifdef ENHANCED_PAPERDOLL
|
|
qt_settings->glyphs().setSize(qt_settings->tileWidth,
|
|
qt_settings->tileHeight);
|
|
#endif
|
|
}
|
|
|
|
QSize NetHackQtInvUsageWindow::sizeHint(void) const
|
|
{
|
|
if (qt_settings) {
|
|
int w = 0, h = 0;
|
|
// 1+X+1: one pixel border surrounding each tile in the paper doll,
|
|
// so +1 left and +1 right, also +1 above and +1 below
|
|
#ifdef ENHANCED_PAPERDOLL
|
|
if (qt_settings->doll_is_shown) {
|
|
w = (1 + qt_settings->dollWidth + 1) * 3;
|
|
h = (1 + qt_settings->dollHeight + 1) * 6;
|
|
}
|
|
#else
|
|
w = (1 + qt_settings->glyphs().width() + 1) * 3;
|
|
h = (1 + qt_settings->glyphs().height() + 1) * 6;
|
|
#endif
|
|
return QSize(w, h);
|
|
} else {
|
|
return QWidget::sizeHint();
|
|
}
|
|
}
|
|
|
|
} // namespace nethack_qt_
|