Skip to content

Commit aca9c28

Browse files
committed
draw skill-details from spell-book as tooltips in the skill-list
1 parent 297159d commit aca9c28

File tree

3 files changed

+119
-22
lines changed

3 files changed

+119
-22
lines changed

Source/control.cpp

Lines changed: 112 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,116 @@ static void DrawTrigInfo()
15271527
DrawTooltip(infostr, pos.x, pos.y, COL_WHITE);
15281528
}
15291529

1530+
static void PrintSkillString(int x, int& y, const char* str, BYTE col)
1531+
{
1532+
PrintJustifiedString(x, y, x + (SKILLDETAILS_PNL_WIDTH - 2 * BOXBORDER_WIDTH), str, col, FONT_KERN_SMALL);
1533+
y += SKILLDETAILS_LINE_HEIGHT;
1534+
}
1535+
1536+
static void PrintSkillString(int x, int& y)
1537+
{
1538+
PrintJustifiedString(x, y, x + (SKILLDETAILS_PNL_WIDTH - 2 * BOXBORDER_WIDTH), tempstr, COL_WHITE, FONT_KERN_SMALL);
1539+
y += SKILLDETAILS_LINE_HEIGHT;
1540+
}
1541+
1542+
static void DrawSkillDetails(const PlrSkillUse &skill)
1543+
{
1544+
const int headerLinesOfSkillDetails = 2;
1545+
int x, y, wh;
1546+
int linesOfSkillDetails;
1547+
// prepare the details
1548+
int pnum, sn, lvl, mana;
1549+
int min, max;
1550+
const char* src;
1551+
pnum = mypnum;
1552+
sn = skill._suSkill;
1553+
lvl = plr._pHasUnidItem ? -1 : plr._pSkillLvl[sn]; // SPLLVL_UNDEF : spllvl
1554+
mana = 0;
1555+
switch (skill._suType) {
1556+
case RSPLTYPE_ABILITY:
1557+
src = "Ability";
1558+
break;
1559+
case RSPLTYPE_SPELL:
1560+
if (lvl < 0) {
1561+
src = "Spell";
1562+
break;
1563+
}
1564+
if (lvl != 0) {
1565+
src = "Spell Level %d";
1566+
} else {
1567+
src = "Spell Level 0 - Unusable";
1568+
}
1569+
mana = GetManaAmount(pnum, sn) >> 6;
1570+
break;
1571+
case RSPLTYPE_INV:
1572+
src = SPELL_RUNE(sn) ? "Rune" : "Scroll";
1573+
break;
1574+
case RSPLTYPE_CHARGES:
1575+
src = "Equipment";
1576+
break;
1577+
//case RSPLTYPE_INVALID:
1578+
// break;
1579+
default:
1580+
ASSUME_UNREACHABLE
1581+
break;
1582+
}
1583+
if (lvl != -1) // SPLLVL_UNDEF
1584+
GetDamageAmt(sn, lvl, &min, &max);
1585+
else
1586+
min = -1;
1587+
1588+
linesOfSkillDetails = (mana != 0 ? 1 : 0) + (min != -1 ? 1 : 0);
1589+
1590+
wh = BOXBORDER_WIDTH + SKILLDETAILS_LINE_HEIGHT/2 + headerLinesOfSkillDetails * SKILLDETAILS_LINE_HEIGHT + SKILLDETAILS_LINE_HEIGHT/2 + BOXBORDER_WIDTH;
1591+
wh += linesOfSkillDetails ? (SKILLDETAILS_LINE_HEIGHT/2 + linesOfSkillDetails * SKILLDETAILS_LINE_HEIGHT + SKILLDETAILS_LINE_HEIGHT/2 + BOXBORDER_WIDTH) : 0;
1592+
x = MousePos.x;
1593+
y = MousePos.y;
1594+
if (x > SCREEN_MIDX(0)) {
1595+
x -= SKILLDETAILS_PNL_WIDTH + SKILLDETAILS_POPUP_OFFSET;
1596+
} else {
1597+
x += SKILLDETAILS_POPUP_OFFSET;
1598+
}
1599+
if (y > SCREEN_MIDY(0)) {
1600+
y -= wh + SKILLDETAILS_POPUP_OFFSET;
1601+
} else {
1602+
y += SKILLDETAILS_POPUP_OFFSET;
1603+
}
1604+
x += SCREEN_X;
1605+
y += SCREEN_Y;
1606+
1607+
// draw the box
1608+
DrawColorTextBox(x, y, SKILLDETAILS_PNL_WIDTH, wh, COL_GOLD);
1609+
// add separator
1610+
if (linesOfSkillDetails)
1611+
DrawColorTextBoxSLine(x, y, SKILLDETAILS_PNL_WIDTH, BOXBORDER_WIDTH + SKILLDETAILS_LINE_HEIGHT/2 + SKILLDETAILS_LINE_HEIGHT * headerLinesOfSkillDetails + SKILLDETAILS_LINE_HEIGHT/2);
1612+
1613+
x += BOXBORDER_WIDTH;
1614+
y += BOXBORDER_WIDTH + SKILLDETAILS_LINE_HEIGHT / 2 + SKILLDETAILS_LINE_HEIGHT - 1;
1615+
1616+
// print the name of the skill
1617+
PrintSkillString(x, y, spelldata[skill._suSkill].sNameText, skill._suType == RSPLTYPE_SPELL ? COL_BLUE : (skill._suType == RSPLTYPE_ABILITY ? COL_GOLD : COL_WHITE));
1618+
1619+
// print the source of the skill
1620+
snprintf(tempstr, sizeof(tempstr), src, lvl);
1621+
PrintSkillString(x, y);
1622+
1623+
y += SKILLDETAILS_LINE_HEIGHT/2 + BOXBORDER_WIDTH + SKILLDETAILS_LINE_HEIGHT/2;
1624+
1625+
// print mana cost
1626+
if (mana != 0) {
1627+
snprintf(tempstr, sizeof(tempstr), "Mana: %d", mana);
1628+
PrintSkillString(x, y);
1629+
}
1630+
if (min != -1) {
1631+
if (min == max) {
1632+
snprintf(tempstr, sizeof(tempstr), "Damage: %d", min);
1633+
} else {
1634+
snprintf(tempstr, sizeof(tempstr), "Damage: %d-%d", min, max);
1635+
}
1636+
PrintSkillString(x, y);
1637+
}
1638+
}
1639+
15301640
void DrawInfoStr()
15311641
{
15321642
POS32 pos;
@@ -1564,29 +1674,9 @@ void DrawInfoStr()
15641674
pos.x += DrawTooltip2(p->_pName, infostr, pos.x, pos.y, COL_GOLD);
15651675
DrawHealthBar(p->_pHitPoints, p->_pMaxHP, pos.x, pos.y + TOOLTIP2_HEIGHT - HEALTHBAR_HEIGHT / 2);
15661676
} else if (gbSkillListFlag) {
1567-
if (currSkill._suSkill == SPL_INVALID || currSkill._suSkill == SPL_NULL)
1568-
return;
1569-
const char* src;
1570-
switch (currSkill._suType) {
1571-
case RSPLTYPE_ABILITY:
1572-
src = "Ability";
1573-
break;
1574-
case RSPLTYPE_SPELL:
1575-
src = "Spell";
1576-
break;
1577-
case RSPLTYPE_INV:
1578-
src = SPELL_RUNE(currSkill._suSkill) ? "Rune" : "Scroll";
1579-
break;
1580-
case RSPLTYPE_CHARGES:
1581-
src = "Equipment";
1582-
break;
1583-
//case RSPLTYPE_INVALID:
1584-
// break;
1585-
default:
1586-
ASSUME_UNREACHABLE
1587-
break;
1677+
if (currSkill._suSkill != SPL_INVALID && currSkill._suSkill != SPL_NULL) {
1678+
DrawSkillDetails(currSkill);
15881679
}
1589-
DrawTooltip2(spelldata[currSkill._suSkill].sNameText, src, MousePos.x, MousePos.y - (SPLICON_HEIGHT / 4 + TOOLTIP_OFFSET), COL_WHITE);
15901680
} else if (gbCampaignMapFlag != CMAP_NONE) {
15911681
if (currCamEntry.ceIndex == 0)
15921682
return;

Source/debug.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,9 @@ void ValidateData()
17771777
for (i = 0; i < NUM_SPELLS; i++) {
17781778
const SpellData& sd = spelldata[i];
17791779
int mind, maxd;
1780+
if (sd.sNameText != NULL && GetSmallStringWidth(sd.sNameText) > (SKILLDETAILS_PNL_WIDTH - 2 * BOXBORDER_WIDTH))
1781+
app_fatal("Name of %s (%d) is too wide.", sd.sNameText, i); // required by DrawSkillDetails
1782+
17801783
GetDamageAmt(i, 0, &mind, &maxd);
17811784
if (i == SPL_DISARM
17821785
|| i == SPL_HEALOTHER || i == SPL_RESURRECT

Source/gameui.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,10 @@ extern "C" {
244244
#define ITEMDETAILS_PNL_WIDTH 271
245245
#define ITEMDETAILS_POPUP_OFFSET INV_SLOT_SIZE_PX
246246

247+
#define SKILLDETAILS_LINE_HEIGHT 12
248+
#define SKILLDETAILS_PNL_WIDTH 140
249+
#define SKILLDETAILS_POPUP_OFFSET INV_SLOT_SIZE_PX
250+
247251
//////////////////////////////////////////////////
248252
// DIABLO UI (MENU)
249253
//////////////////////////////////////////////////

0 commit comments

Comments
 (0)