Skip to content

Commit a49246f

Browse files
committed
replace skill-book with an overview of the hotkey-skills
1 parent aca9c28 commit a49246f

File tree

3 files changed

+61
-139
lines changed

3 files changed

+61
-139
lines changed

Source/control.cpp

Lines changed: 50 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,6 @@ static POS32 deltaSkillPos;
9696

9797
/** The number of spells/skills on a single spellbook page. */
9898
#define NUM_BOOK_ENTRIES 7
99-
/** Maps from spellbook page number and position to spell_id. */
100-
static const BYTE SpellPages[SPLBOOKTABS][NUM_BOOK_ENTRIES] = {
101-
// clang-format off
102-
{ SPL_NULL, SPL_CBOLT, SPL_LIGHTNING, SPL_CHAIN, SPL_NOVA, SPL_INVALID, SPL_INVALID },
103-
{ SPL_FIREBOLT, SPL_FIREBALL, SPL_INFERNO, SPL_FIREWALL, SPL_WAVE, SPL_GUARDIAN, SPL_ELEMENTAL },
104-
{ SPL_WHIPLASH, SPL_WALLOP, SPL_SWIPE, SPL_POINT_BLANK, SPL_FAR_SHOT, SPL_MULTI_SHOT, SPL_PIERCE_SHOT },
105-
{ SPL_GOLEM, SPL_MANASHIELD, SPL_HEAL, SPL_HEALOTHER, SPL_RNDTELEPORT, SPL_TELEPORT, SPL_TOWN },
106-
{ SPL_METEOR, SPL_HBOLT, SPL_FLARE, SPL_FLASH, SPL_POISON, SPL_BLOODBOIL, SPL_WIND },
107-
{ SPL_CHARGE, SPL_RAGE, SPL_SWAMP, SPL_SHROUD, SPL_TELEKINESIS, SPL_ATTRACT, SPL_STONE },
108-
#ifdef HELLFIRE
109-
{ SPL_FIRERING, SPL_RUNEFIRE, SPL_RUNEWAVE, SPL_RUNELIGHT, SPL_RUNENOVA, SPL_INVALID, SPL_INVALID },
110-
#endif
111-
// clang-format on
112-
};
11399
/** Maps from player-class to team-icon id in pSBkIconCels. */
114100
static const BYTE ClassIconTbl[NUM_CLASSES] = { 8, 13, 42,
115101
#ifdef HELLFIRE
@@ -1856,109 +1842,63 @@ void DrawDurIcon()
18561842

18571843
void DrawSpellBook()
18581844
{
1859-
int pnum, i, sn, mana, lvl, sx, yp, offset;
1860-
BYTE st;
1861-
1862-
// back panel
1863-
sx = SCREEN_X + gnWndBookX;
1864-
yp = SCREEN_Y + gnWndBookY;
1865-
CelDraw(sx, yp + SPANEL_HEIGHT - 1, pSpellBkCel, 1);
1866-
// selected page
1867-
snprintf(tempstr, sizeof(tempstr), "%d.", guBooktab + 1);
1868-
PrintJustifiedString(sx + 2, yp + SPANEL_HEIGHT - 7, sx + SPANEL_WIDTH, tempstr, COL_WHITE, 0);
1845+
int sx, yp;
18691846

18701847
#if SCREEN_READER_INTEGRATION
18711848
PlrSkillUse prevSkill = currSkill;
18721849
#endif
18731850
currSkill._suSkill = SPL_INVALID;
18741851

1875-
pnum = mypnum;
1852+
// back panel
1853+
sx = SCREEN_X + gnWndBookX;
1854+
yp = SCREEN_Y + gnWndBookY;
1855+
int wh = 2 * BOXBORDER_WIDTH + SBOOK_CELHEIGHT * (SDL_arraysize(myplr._pSkillHotKey) + SDL_arraysize(myplr._pAltSkillHotKey));
1856+
// draw the box
1857+
DrawColorTextBox(sx, yp, SBOOK_PNL_WIDTH, wh, COL_GOLD);
1858+
// add separator
1859+
DrawColorTextBoxSLine(sx, yp, SBOOK_PNL_WIDTH, BOXBORDER_WIDTH + SDL_arraysize(myplr._pSkillHotKey) * SBOOK_CELHEIGHT);
18761860

1877-
yp += SBOOK_TOP_BORDER + SBOOK_CELHEIGHT;
1878-
sx += SBOOK_CELBORDER;
1879-
for (i = 0; i < lengthof(SpellPages[guBooktab]); i++) {
1880-
sn = SpellPages[guBooktab][i];
1881-
if (sn == SPL_INVALID) {
1882-
continue;
1883-
}
1884-
if (sn == SPL_NULL) {
1885-
sn = Abilities[plr._pClass];
1886-
st = RSPLTYPE_ABILITY;
1887-
} else if (plr._pISpells & SPELL_MASK(sn)) {
1888-
st = RSPLTYPE_CHARGES;
1889-
} else if (plr._pInvSkills & SPELL_MASK(sn)) {
1890-
st = RSPLTYPE_INV;
1891-
} else if (plr._pMemSkills & SPELL_MASK(sn)) {
1892-
st = RSPLTYPE_SPELL;
1861+
sx += BOXBORDER_WIDTH;
1862+
yp += BOXBORDER_WIDTH - 1;
1863+
1864+
for (int i = 0; i < SDL_arraysize(myplr._pSkillHotKey) + SDL_arraysize(myplr._pAltSkillHotKey); i++) {
1865+
PlrSkillStruct* skill;
1866+
1867+
yp += SBOOK_CELHEIGHT;
1868+
if (i < SDL_arraysize(myplr._pSkillHotKey)) {
1869+
skill = &myplr._pSkillHotKey[i];
18931870
} else {
1894-
continue;
1895-
}
1896-
{
1897-
lvl = plr._pHasUnidItem ? -1 : plr._pSkillLvl[sn]; // SPLLVL_UNDEF : spllvl
1898-
// assert(lvl >= 0 || lvl == -1);
1899-
mana = 0;
1900-
switch (st) {
1901-
case RSPLTYPE_ABILITY:
1902-
copy_cstr(tempstr, "Ability");
1903-
// lvl = -1; // SPLLVL_UNDEF
1904-
break;
1905-
case RSPLTYPE_INV:
1906-
if (SPELL_RUNE(sn)) {
1907-
copy_cstr(tempstr, "Rune");
1908-
} else {
1909-
copy_cstr(tempstr, "Scroll");
1910-
}
1911-
break;
1912-
case RSPLTYPE_CHARGES:
1913-
copy_cstr(tempstr, "Equipment");
1914-
break;
1915-
case RSPLTYPE_SPELL:
1916-
if (lvl < 0) {
1917-
copy_cstr(tempstr, "Spell");
1918-
break;
1919-
}
1920-
if (lvl != 0) {
1921-
snprintf(tempstr, sizeof(tempstr), "Spell Level %d", lvl);
1922-
} else {
1923-
copy_cstr(tempstr, "Spell Level 0 - Unusable");
1924-
}
1925-
mana = GetManaAmount(pnum, sn) >> 6;
1926-
break;
1927-
default:
1928-
ASSUME_UNREACHABLE
1929-
break;
1930-
}
1931-
int min, max;
1932-
if (lvl != -1) // SPLLVL_UNDEF
1933-
GetDamageAmt(sn, lvl, &min, &max);
1934-
else
1935-
min = -1;
1936-
offset = mana == 0 && min == -1 ? 5 : 0;
1937-
PrintGameStr(sx + SBOOK_LINE_TAB, yp - 23 + offset, spelldata[sn].sNameText, COL_WHITE);
1938-
PrintGameStr(sx + SBOOK_LINE_TAB, yp - 12 + offset, tempstr, COL_WHITE);
1939-
1940-
if (offset == 0) {
1941-
if (mana != 0)
1942-
cat_str(tempstr, offset, "Mana: %d ", mana);
1943-
if (min != -1)
1944-
cat_str(tempstr, offset, "Dam: %d-%d", min, max);
1945-
PrintGameStr(sx + SBOOK_LINE_TAB, yp - 1, tempstr, COL_WHITE);
1946-
}
1947-
const PlrSkillUse bookSkill = { (BYTE)sn, (BYTE)st };
1948-
st = GetSpellTrans(bookSkill);
1949-
CelDrawTrnTbl(sx, yp, pSBkIconCels, spelldata[sn].sIcon, SkillTrns[st]);
1950-
// TODO: differenciate between Atk/Move skill ? Add icon for primary skills?
1951-
if (bookSkill == plr._pAltSkill._psAttack || bookSkill == plr._pAltSkill._psMove) {
1952-
CelDrawTrnTbl(sx, yp, pSBkIconCels, SPLICONLAST, SkillTrns[RSPLTYPE_ABILITY]);
1953-
}
1954-
if (POS_IN_RECT(MousePos.x, MousePos.y,
1955-
sx - SCREEN_X, yp - SCREEN_Y - SBOOK_CELHEIGHT,
1956-
SBOOK_CELWIDTH, SBOOK_CELHEIGHT)) {
1957-
currSkill = bookSkill;
1871+
if (i == SDL_arraysize(myplr._pSkillHotKey)) {
1872+
yp++;
19581873
}
1874+
skill = &myplr._pAltSkillHotKey[i - SDL_arraysize(myplr._pSkillHotKey)];
19591875
}
1960-
yp += SBOOK_CELBORDER + SBOOK_CELHEIGHT;
1876+
1877+
int sn;
1878+
const BYTE* st;
1879+
sn = skill->_psAttack._suType != RSPLTYPE_INVALID ? skill->_psAttack._suSkill : SPL_INVALID;
1880+
st = GetSpellTrans(skill->_psAttack);
1881+
CelDrawTrnTbl(sx, yp, pSBkIconCels, sn != SPL_INVALID ? spelldata[sn].sIcon : SPLICONLAST, st);
1882+
if (POS_IN_RECT(MousePos.x, MousePos.y,
1883+
sx - SCREEN_X, yp - SCREEN_Y - SBOOK_CELHEIGHT,
1884+
SBOOK_CELWIDTH, SBOOK_CELHEIGHT)) {
1885+
currSkill = skill->_psAttack;
1886+
}
1887+
if (sn != SPL_INVALID && spelldata[sn].sNameText != NULL)
1888+
PrintGameStr(sx + 2 * SBOOK_CELWIDTH + SBOOK_X_OFFSET, yp - ((SBOOK_CELHEIGHT - 2 * SBOOK_LINE_HEIGHT) / 2 + SBOOK_LINE_HEIGHT), spelldata[sn].sNameText, COL_WHITE);
1889+
1890+
sn = skill->_psMove._suType != RSPLTYPE_INVALID ? skill->_psMove._suSkill : SPL_INVALID;
1891+
st = GetSpellTrans(skill->_psMove);
1892+
CelDrawTrnTbl(sx + SBOOK_CELWIDTH, yp, pSBkIconCels, sn != SPL_INVALID ? spelldata[sn].sIcon : SPLICONLAST, st);
1893+
if (POS_IN_RECT(MousePos.x, MousePos.y,
1894+
sx + SBOOK_CELWIDTH - SCREEN_X, yp - SCREEN_Y - SBOOK_CELHEIGHT,
1895+
SBOOK_CELWIDTH, SBOOK_CELHEIGHT)) {
1896+
currSkill = skill->_psMove;
1897+
}
1898+
if (sn != SPL_INVALID && spelldata[sn].sNameText != NULL)
1899+
PrintGameStr(sx + 2 * SBOOK_CELWIDTH + SBOOK_X_OFFSET, yp - ((SBOOK_CELHEIGHT - 2 * SBOOK_LINE_HEIGHT) / 2), spelldata[sn].sNameText, COL_WHITE);
19611900
}
1901+
19621902
#if SCREEN_READER_INTEGRATION
19631903
if (prevSkill != currSkill) {
19641904
SpeakSpellText(currSkill);
@@ -1968,37 +1908,10 @@ void DrawSpellBook()
19681908

19691909
void CheckBookClick(bool altSkill)
19701910
{
1971-
int dx, dy;
1972-
1973-
if (currSkill._suSkill != SPL_INVALID) {
1974-
SetSkill(altSkill);
1975-
return;
1976-
}
1977-
if (altSkill) {
1978-
return;
1979-
}
1980-
1981-
dx = MousePos.x - (gnWndBookX + SBOOK_LEFT_BORDER);
1982-
dy = MousePos.y - (gnWndBookY + SBOOK_TOP_BORDER);
1983-
if (dx < 0 || dy < 0)
1984-
return;
1985-
1986-
if (dy >= lengthof(SpellPages[guBooktab]) * (SBOOK_CELBORDER + SBOOK_CELHEIGHT)) {
1987-
if (dx <= SBOOK_PAGER_WIDTH * 2) {
1988-
if (dx <= SBOOK_PAGER_WIDTH) {
1989-
guBooktab = 0;
1990-
} else {
1991-
if (guBooktab != 0)
1992-
guBooktab--;
1993-
}
1994-
} else if (dx >= SPANEL_WIDTH - SBOOK_PAGER_WIDTH * 2) {
1995-
if (dx >= SPANEL_WIDTH - SBOOK_PAGER_WIDTH) {
1996-
guBooktab = SPLBOOKTABS - 1;
1997-
} else {
1998-
if (guBooktab < SPLBOOKTABS - 1)
1999-
guBooktab++;
2000-
}
2001-
}
1911+
int dx;
1912+
dx = MousePos.x - (gnWndBookX + 2 * SBOOK_CELWIDTH);
1913+
if (dx < 0) {
1914+
HandleSkillBtn(altSkill);
20021915
} else {
20031916
StartWndDrag(WND_BOOK);
20041917
}

Source/debug.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,8 +1777,13 @@ 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
1780+
if (sd.sNameText != NULL) {
1781+
int w = GetSmallStringWidth(sd.sNameText);
1782+
if (w > (SKILLDETAILS_PNL_WIDTH - 2 * BOXBORDER_WIDTH))
1783+
app_fatal("Name of %s (%d) is too wide.", sd.sNameText, i); // required by DrawSkillDetails
1784+
if (w > (SKILLBOOK_PNL_WIDTH - (2 * SBOOK_CELWIDTH + SBOOK_X_OFFSET + 2 * BOXBORDER_WIDTH)))
1785+
app_fatal("Name of %s (%d) is too wide.", sd.sNameText, i); // required by DrawSpellBook
1786+
}
17821787

17831788
GetDamageAmt(i, 0, &mind, &maxd);
17841789
if (i == SPL_DISARM

Source/gameui.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ extern "C" {
155155
#define SBOOK_LINE_LENGTH (SPANEL_WIDTH - 2 * SBOOK_LEFT_BORDER - SBOOK_CELBORDER - SBOOK_CELWIDTH - 2 * SBOOK_LINE_BORDER)
156156
#define SBOOK_LINE_TAB (SBOOK_CELWIDTH + SBOOK_CELBORDER + SBOOK_LINE_BORDER)
157157
#define SBOOK_PAGER_WIDTH 56
158+
// #define SBOOK_PNL_WIDTH (2 * BOXBORDER_WIDTH + 140 + 2 * SBOOK_CELWIDTH)
159+
#define SBOOK_PNL_WIDTH SPANEL_WIDTH
160+
#define SBOOK_X_OFFSET 4
161+
#define SBOOK_LINE_HEIGHT 12
158162

159163
#define TBOOK_BTN_WIDTH 60
160164

0 commit comments

Comments
 (0)