@@ -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+
15301640void 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 ;
0 commit comments