@@ -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. */
114100static const BYTE ClassIconTbl[NUM_CLASSES] = { 8 , 13 , 42 ,
115101#ifdef HELLFIRE
@@ -1856,109 +1842,63 @@ void DrawDurIcon()
18561842
18571843void 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
19691909void 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 }
0 commit comments