// 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" {
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)
+void NetHackQtInvUsageWindow::drawWorn(QPainter& painter, obj* nhobj,
+ int x, int y, bool canbe)
{
short int glyph;
if (nhobj)
void NetHackQtInvUsageWindow::paintEvent(QPaintEvent*)
{
- // 012
+ // 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 .
//
- //0 WhB
- //1 s"w
- //2 gCg
- //3 =A=
- //4 T
- //5 S
+ // 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,4,false);
- drawWorn(painter,0,0,5,false);
- drawWorn(painter,0,2,4,false);
- drawWorn(painter,0,2,5,false);
-
- drawWorn(painter,uarm,1,3); // Armour
- drawWorn(painter,uarmc,1,2); // Cloak
- drawWorn(painter,uarmh,1,0); // Helmet
- drawWorn(painter,uarms,0,1); // Shield
- drawWorn(painter,uarmg,0,2); // Gloves - repeated
- drawWorn(painter,uarmg,2,2); // Gloves - repeated
- 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,uswapwep,0,0); // Secondary weapon
- drawWorn(painter,uamul,1,1); // Amulet
- drawWorn(painter,ublindf,2,0); // Blindfold
+ 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();
}