2008-09-10 15:19:48 +03:00
# include "CSpellWindow.h"
2008-09-12 11:51:46 +03:00
# include "Graphics.h"
# include "../hch/CDefHandler.h"
# include "../hch/CObjectHandler.h"
2008-09-12 16:06:53 +03:00
# include "../hch/CSpellHandler.h"
2008-09-15 19:46:54 +03:00
# include "../hch/CGeneralTextHandler.h"
2009-06-20 04:42:19 +03:00
# include "../hch/CVideoHandler.h"
2009-05-20 13:08:56 +03:00
# include "CAdvmapInterface.h"
# include "CBattleInterface.h"
# include "CGameInfo.h"
# include "SDL_Extensions.h"
# include "CMessage.h"
# include "CPlayerInterface.h"
2009-08-23 16:41:57 +03:00
# include "../CCallback.h"
2008-09-10 15:19:48 +03:00
# include <boost/bind.hpp>
# include <sstream>
2009-11-13 18:02:25 +02:00
# include <boost/algorithm/string/replace.hpp>
# include <boost/lexical_cast.hpp>
2008-09-10 15:19:48 +03:00
2009-04-15 17:03:31 +03:00
/*
* CSpellWindow . cpp , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
2008-09-10 15:19:48 +03:00
extern SDL_Surface * screen ;
2009-10-03 13:51:05 +03:00
extern SDL_Color tytulowy , zwykly , darkTitle ;
2008-09-10 15:19:48 +03:00
extern TTF_Font * GEOR16 ;
2008-09-25 17:09:31 +03:00
SpellbookInteractiveArea : : SpellbookInteractiveArea ( const SDL_Rect & myRect , boost : : function < void ( ) > funcL , const std : : string & textR , boost : : function < void ( ) > funcHon , boost : : function < void ( ) > funcHoff )
2008-09-10 15:19:48 +03:00
{
pos = myRect ;
2008-09-11 15:29:22 +03:00
onLeft = funcL ;
textOnRclick = textR ;
onHoverOn = funcHon ;
onHoverOff = funcHoff ;
2008-09-10 15:19:48 +03:00
}
2009-08-11 19:05:33 +03:00
void SpellbookInteractiveArea : : clickLeft ( tribool down , bool previousState )
2008-09-10 15:19:48 +03:00
{
if ( ! down )
{
2008-09-11 15:29:22 +03:00
onLeft ( ) ;
2008-09-10 15:19:48 +03:00
}
}
2009-08-11 19:05:33 +03:00
void SpellbookInteractiveArea : : clickRight ( tribool down , bool previousState )
2008-09-11 15:29:22 +03:00
{
LOCPLINT - > adventureInt - > handleRightClick ( textOnRclick , down , this ) ;
}
void SpellbookInteractiveArea : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2008-09-11 15:29:22 +03:00
if ( on )
{
onHoverOn ( ) ;
}
else
{
onHoverOff ( ) ;
}
}
void SpellbookInteractiveArea : : activate ( )
2008-09-10 15:19:48 +03:00
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
2008-09-12 16:06:53 +03:00
2008-09-10 15:19:48 +03:00
}
2008-09-11 15:29:22 +03:00
void SpellbookInteractiveArea : : deactivate ( )
2008-09-10 15:19:48 +03:00
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
2008-09-10 15:19:48 +03:00
}
2009-07-21 16:53:26 +03:00
CSpellWindow : : CSpellWindow ( const SDL_Rect & myRect , const CGHeroInstance * _myHero , bool openOnBattleSpells ) :
2009-07-03 22:57:14 +03:00
battleSpellsOnly ( openOnBattleSpells ) ,
2008-12-23 15:59:03 +02:00
selectedTab ( 4 ) ,
2009-07-21 16:53:26 +03:00
spellSite ( 0 ) ,
myHero ( _myHero )
2008-09-10 15:19:48 +03:00
{
* support for new hero bonuses (BLOCK_MORALE, SECONDARY_SKILL_PREMY (archery), AIR_SPELL_DMG_PREMY, EARTH_SPELL_DMG_PREMY, FIRE_SPELL_DMG_PREMY, WATER_SPELL_DMG_PREMY, BLOCK_SPELLS_ABOVE_LEVEL, SPELL_IMMUNITY, BLOCK_MORALE, FIRE_SPELLS, AIR_SPELLS, WATER_SPELLS, EARTH_SPELLS, SPELL, SPELLS_OF_LEVEL). It means that following artifacts are now supported:
- Orb of the Firmament
- Orb of Silt
- Orb of Tempestuous Fire
- Orb of Driving Rain
- Bow of Elven Cherrywood
- Bowstring of the Unicorn's Mane
- Angel Feather Arrows
- Tome of Fire Magic
- Tome of Air Magic
- Tome of Water Magic
- Tome of Earth Magic
- Recanter's Cloak
- Orb of Inhibition
- Pendant of Dispassion
- Pendant of Second Sight
- Pendant of Holiness
- Pendant of Life
- Pendant of Death
- Pendant of Free Will
- Pendant of Negativity
- Pendant of Total Recall
- Spellbinder's Hat
- Spirit of Oppression
- Sphere of Permanence
I hope I listed them all here :). Please try them and report if something's wrong.
2009-05-03 19:14:16 +03:00
//initializing castable spells
for ( ui32 v = 0 ; v < CGI - > spellh - > spells . size ( ) ; + + v )
{
if ( ! CGI - > spellh - > spells [ v ] . creatureAbility & & myHero - > canCastThisSpell ( & CGI - > spellh - > spells [ v ] ) )
mySpells . insert ( v ) ;
}
2008-09-15 19:46:54 +03:00
* support for new hero bonuses (BLOCK_MORALE, SECONDARY_SKILL_PREMY (archery), AIR_SPELL_DMG_PREMY, EARTH_SPELL_DMG_PREMY, FIRE_SPELL_DMG_PREMY, WATER_SPELL_DMG_PREMY, BLOCK_SPELLS_ABOVE_LEVEL, SPELL_IMMUNITY, BLOCK_MORALE, FIRE_SPELLS, AIR_SPELLS, WATER_SPELLS, EARTH_SPELLS, SPELL, SPELLS_OF_LEVEL). It means that following artifacts are now supported:
- Orb of the Firmament
- Orb of Silt
- Orb of Tempestuous Fire
- Orb of Driving Rain
- Bow of Elven Cherrywood
- Bowstring of the Unicorn's Mane
- Angel Feather Arrows
- Tome of Fire Magic
- Tome of Air Magic
- Tome of Water Magic
- Tome of Earth Magic
- Recanter's Cloak
- Orb of Inhibition
- Pendant of Dispassion
- Pendant of Second Sight
- Pendant of Holiness
- Pendant of Life
- Pendant of Death
- Pendant of Free Will
- Pendant of Negativity
- Pendant of Total Recall
- Spellbinder's Hat
- Spirit of Oppression
- Sphere of Permanence
I hope I listed them all here :). Please try them and report if something's wrong.
2009-05-03 19:14:16 +03:00
//initializing schools' levels
2008-09-15 19:46:54 +03:00
for ( int b = 0 ; b < 4 ; + + b ) schoolLvls [ b ] = 0 ;
2008-12-21 21:17:35 +02:00
for ( size_t b = 0 ; b < myHero - > secSkills . size ( ) ; + + b )
2008-09-15 19:46:54 +03:00
{
switch ( myHero - > secSkills [ b ] . first )
{
case 14 : //fire magic
schoolLvls [ 1 ] = myHero - > secSkills [ b ] . second ;
break ;
case 15 : //air magic
schoolLvls [ 0 ] = myHero - > secSkills [ b ] . second ;
break ;
case 16 : //water magic
schoolLvls [ 2 ] = myHero - > secSkills [ b ] . second ;
break ;
case 17 : //earth magic
schoolLvls [ 3 ] = myHero - > secSkills [ b ] . second ;
break ;
}
2008-09-12 16:06:53 +03:00
}
//initializing sizes of spellbook's parts
for ( int b = 0 ; b < 5 ; + + b )
sitesPerTabAdv [ b ] = 0 ;
for ( int b = 0 ; b < 5 ; + + b )
sitesPerTabBattle [ b ] = 0 ;
2008-09-15 19:46:54 +03:00
for ( std : : set < ui32 > : : const_iterator g = mySpells . begin ( ) ; g ! = mySpells . end ( ) ; + + g )
2008-09-12 16:06:53 +03:00
{
2008-09-15 19:46:54 +03:00
if ( CGI - > spellh - > spells [ * g ] . combatSpell )
{
+ + ( sitesPerTabBattle [ 4 ] ) ;
}
else
{
+ + ( sitesPerTabAdv [ 4 ] ) ;
}
2008-09-12 16:06:53 +03:00
if ( CGI - > spellh - > spells [ * g ] . air )
{
if ( CGI - > spellh - > spells [ * g ] . combatSpell )
{
+ + ( sitesPerTabBattle [ 0 ] ) ;
}
else
{
+ + ( sitesPerTabAdv [ 0 ] ) ;
}
}
if ( CGI - > spellh - > spells [ * g ] . fire )
{
if ( CGI - > spellh - > spells [ * g ] . combatSpell )
{
+ + ( sitesPerTabBattle [ 1 ] ) ;
}
else
{
+ + ( sitesPerTabAdv [ 1 ] ) ;
}
}
if ( CGI - > spellh - > spells [ * g ] . water )
{
if ( CGI - > spellh - > spells [ * g ] . combatSpell )
{
+ + ( sitesPerTabBattle [ 2 ] ) ;
}
else
{
+ + ( sitesPerTabAdv [ 2 ] ) ;
}
}
if ( CGI - > spellh - > spells [ * g ] . earth )
{
if ( CGI - > spellh - > spells [ * g ] . combatSpell )
{
+ + ( sitesPerTabBattle [ 3 ] ) ;
}
else
{
+ + ( sitesPerTabAdv [ 3 ] ) ;
}
}
}
if ( sitesPerTabAdv [ 4 ] % 12 = = 0 )
sitesPerTabAdv [ 4 ] / = 12 ;
else
sitesPerTabAdv [ 4 ] = sitesPerTabAdv [ 4 ] / 12 + 1 ;
for ( int v = 0 ; v < 4 ; + + v )
{
if ( sitesPerTabAdv [ v ] < = 10 )
sitesPerTabAdv [ v ] = 1 ;
else
{
if ( ( sitesPerTabAdv [ v ] - 10 ) % 12 = = 0 )
sitesPerTabAdv [ v ] = ( sitesPerTabAdv [ v ] - 10 ) / 12 + 1 ;
else
sitesPerTabAdv [ v ] = ( sitesPerTabAdv [ v ] - 10 ) / 12 + 2 ;
}
}
if ( sitesPerTabBattle [ 4 ] % 12 = = 0 )
sitesPerTabBattle [ 4 ] / = 12 ;
else
sitesPerTabBattle [ 4 ] = sitesPerTabBattle [ 4 ] / 12 + 1 ;
for ( int v = 0 ; v < 4 ; + + v )
{
if ( sitesPerTabBattle [ v ] < = 10 )
sitesPerTabBattle [ v ] = 1 ;
else
{
if ( ( sitesPerTabBattle [ v ] - 10 ) % 12 = = 0 )
sitesPerTabBattle [ v ] = ( sitesPerTabBattle [ v ] - 10 ) / 12 + 1 ;
else
sitesPerTabBattle [ v ] = ( sitesPerTabBattle [ v ] - 10 ) / 12 + 2 ;
}
}
//numbers of spell pages computed
2008-09-10 15:19:48 +03:00
pos = myRect ;
background = BitmapHandler : : loadBitmap ( " SpelBack.bmp " ) ;
graphics - > blueToPlayersAdv ( background , myHero - > tempOwner ) ;
2009-06-17 19:46:16 +03:00
std : : ostringstream mana ;
2008-09-10 15:19:48 +03:00
mana < < myHero - > mana ;
CSDL_Ext : : printAtMiddle ( mana . str ( ) , 434 , 425 , GEOR16 , tytulowy , background ) ;
2008-09-12 16:06:53 +03:00
leftCorner = BitmapHandler : : loadBitmap ( " SpelTrnL.bmp " , true ) ;
rightCorner = BitmapHandler : : loadBitmap ( " SpelTrnR.bmp " , true ) ;
2008-09-10 15:19:48 +03:00
spells = CDefHandler : : giveDef ( " Spells.def " ) ;
spellTab = CDefHandler : : giveDef ( " SpelTab.def " ) ;
schools = CDefHandler : : giveDef ( " Schools.def " ) ;
2008-09-15 19:46:54 +03:00
schoolBorders [ 0 ] = CDefHandler : : giveDef ( " SplevA.def " ) ;
schoolBorders [ 1 ] = CDefHandler : : giveDef ( " SplevF.def " ) ;
schoolBorders [ 2 ] = CDefHandler : : giveDef ( " SplevW.def " ) ;
schoolBorders [ 3 ] = CDefHandler : : giveDef ( " SplevE.def " ) ;
2008-09-10 15:19:48 +03:00
2008-09-11 15:29:22 +03:00
2009-01-07 21:40:19 +02:00
statusBar = new CStatusBar ( 7 + pos . x , 569 + pos . y , " Spelroll.bmp " ) ;
SDL_Rect temp_rect = genRect ( 45 , 35 , 479 + pos . x , 405 + pos . y ) ;
2008-11-28 03:36:34 +02:00
exitBtn = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fexitb , this ) , CGI - > generaltexth - > zelp [ 460 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 460 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 45 , 35 , 221 + pos . x , 405 + pos . y ) ;
2008-11-28 03:36:34 +02:00
battleSpells = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fbattleSpellsb , this ) , CGI - > generaltexth - > zelp [ 453 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 453 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 45 , 35 , 355 + pos . x , 405 + pos . y ) ;
2008-11-28 03:36:34 +02:00
adventureSpells = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fadvSpellsb , this ) , CGI - > generaltexth - > zelp [ 452 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 452 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 45 , 35 , 418 + pos . x , 405 + pos . y ) ;
2008-11-28 03:36:34 +02:00
manaPoints = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fmanaPtsb , this ) , CGI - > generaltexth - > zelp [ 459 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 459 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2008-09-11 15:29:22 +03:00
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 36 , 56 , 549 + pos . x , 94 + pos . y ) ;
2008-11-28 03:36:34 +02:00
selectSpellsA = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fspellsAb , this ) , CGI - > generaltexth - > zelp [ 454 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 454 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 36 , 56 , 549 + pos . x , 151 + pos . y ) ;
2008-11-28 03:36:34 +02:00
selectSpellsE = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fspellsEb , this ) , CGI - > generaltexth - > zelp [ 457 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 457 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 36 , 56 , 549 + pos . x , 210 + pos . y ) ;
2008-11-28 03:36:34 +02:00
selectSpellsF = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fspellsFb , this ) , CGI - > generaltexth - > zelp [ 455 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 455 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 36 , 56 , 549 + pos . x , 270 + pos . y ) ;
2008-11-28 03:36:34 +02:00
selectSpellsW = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fspellsWb , this ) , CGI - > generaltexth - > zelp [ 456 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 456 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( 36 , 56 , 549 + pos . x , 330 + pos . y ) ;
2008-11-28 03:36:34 +02:00
selectSpellsAll = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fspellsAllb , this ) , CGI - > generaltexth - > zelp [ 458 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 458 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2008-09-12 16:06:53 +03:00
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( leftCorner - > h , leftCorner - > w , 97 + pos . x , 77 + pos . y ) ;
2008-11-28 03:36:34 +02:00
lCorner = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fLcornerb , this ) , CGI - > generaltexth - > zelp [ 450 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 450 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2009-01-07 21:40:19 +02:00
temp_rect = genRect ( rightCorner - > h , rightCorner - > w , 487 + pos . x , 72 + pos . y ) ;
2008-11-28 03:36:34 +02:00
rCorner = new SpellbookInteractiveArea ( temp_rect , boost : : bind ( & CSpellWindow : : fRcornerb , this ) , CGI - > generaltexth - > zelp [ 451 ] . second , boost : : bind ( & CStatusBar : : print , statusBar , ( CGI - > generaltexth - > zelp [ 451 ] . first ) ) , boost : : bind ( & CStatusBar : : clear , statusBar ) ) ;
2008-09-15 19:46:54 +03:00
//areas for spells
2009-01-07 21:40:19 +02:00
int xpos = 117 + pos . x , ypos = 90 + pos . y ;
2008-09-15 19:46:54 +03:00
for ( int v = 0 ; v < 12 ; + + v )
{
temp_rect = genRect ( 65 , 78 , xpos , ypos ) ;
spellAreas [ v ] = new SpellArea ( temp_rect , this ) ;
if ( v = = 5 ) //to right page
{
2009-01-07 21:40:19 +02:00
xpos = 336 + pos . x ; ypos = 90 + pos . y ;
2008-09-15 19:46:54 +03:00
}
else
{
if ( v % 2 = = 0 )
{
xpos + = 85 ;
}
else
{
xpos - = 85 ; ypos + = 97 ;
}
}
}
computeSpellsPerArea ( ) ;
2008-09-10 15:19:48 +03:00
}
CSpellWindow : : ~ CSpellWindow ( )
{
SDL_FreeSurface ( background ) ;
SDL_FreeSurface ( leftCorner ) ;
SDL_FreeSurface ( rightCorner ) ;
delete spells ;
delete spellTab ;
delete schools ;
2008-09-15 19:46:54 +03:00
for ( int b = 0 ; b < 4 ; + + b )
delete schoolBorders [ b ] ;
2008-09-10 15:19:48 +03:00
delete exitBtn ;
2008-09-11 15:29:22 +03:00
delete battleSpells ;
delete adventureSpells ;
delete manaPoints ;
2008-09-10 15:19:48 +03:00
delete statusBar ;
2008-09-11 15:29:22 +03:00
delete selectSpellsA ;
delete selectSpellsE ;
delete selectSpellsF ;
delete selectSpellsW ;
delete selectSpellsAll ;
2008-09-12 16:06:53 +03:00
delete lCorner ;
delete rCorner ;
2008-09-15 19:46:54 +03:00
for ( int g = 0 ; g < 12 ; + + g )
{
delete spellAreas [ g ] ;
}
2008-09-10 15:19:48 +03:00
}
void CSpellWindow : : fexitb ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2008-09-10 15:19:48 +03:00
}
2008-09-11 15:29:22 +03:00
void CSpellWindow : : fadvSpellsb ( )
{
2009-06-20 05:14:25 +03:00
if ( battleSpellsOnly = = true ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
battleSpellsOnly = false ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fbattleSpellsb ( )
{
2009-06-20 05:14:25 +03:00
if ( battleSpellsOnly = = false ) {
2009-06-20 04:42:19 +03:00
turnPageLeft ( ) ;
2009-06-20 05:14:25 +03:00
battleSpellsOnly = true ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fmanaPtsb ( )
{
}
void CSpellWindow : : fspellsAb ( )
{
2009-06-20 05:14:25 +03:00
if ( selectedTab ! = 0 ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
selectedTab = 0 ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fspellsEb ( )
{
2009-06-20 05:14:25 +03:00
if ( selectedTab ! = 3 ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
selectedTab = 3 ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fspellsFb ( )
{
2009-06-20 05:14:25 +03:00
if ( selectedTab ! = 1 ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
selectedTab = 1 ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fspellsWb ( )
{
2009-06-20 05:14:25 +03:00
if ( selectedTab ! = 2 ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
selectedTab = 2 ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
void CSpellWindow : : fspellsAllb ( )
{
2009-06-20 05:14:25 +03:00
if ( selectedTab ! = 4 ) {
2009-06-20 04:42:19 +03:00
turnPageRight ( ) ;
2009-06-20 05:14:25 +03:00
selectedTab = 4 ;
spellSite = 0 ;
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-12 16:06:53 +03:00
}
void CSpellWindow : : fLcornerb ( )
{
2009-06-20 04:42:19 +03:00
if ( spellSite > 0 ) {
turnPageLeft ( ) ;
2008-09-12 16:06:53 +03:00
- - spellSite ;
2009-06-20 04:42:19 +03:00
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-12 16:06:53 +03:00
}
void CSpellWindow : : fRcornerb ( )
{
2009-06-20 04:42:19 +03:00
if ( ( spellSite + 1 ) < ( battleSpellsOnly ? sitesPerTabBattle [ selectedTab ] : sitesPerTabAdv [ selectedTab ] ) ) {
turnPageRight ( ) ;
2008-09-12 16:06:53 +03:00
+ + spellSite ;
2009-06-20 04:42:19 +03:00
}
2008-09-15 19:46:54 +03:00
computeSpellsPerArea ( ) ;
2008-09-11 15:29:22 +03:00
}
2008-09-10 15:19:48 +03:00
void CSpellWindow : : show ( SDL_Surface * to )
{
SDL_BlitSurface ( background , NULL , to , & pos ) ;
2009-06-20 05:14:25 +03:00
blitAt ( spellTab - > ourImages [ selectedTab ] . bitmap , 524 + pos . x , 88 + pos . y , to ) ;
2008-09-10 15:19:48 +03:00
2009-04-14 15:47:09 +03:00
statusBar - > show ( to ) ;
2008-09-12 16:06:53 +03:00
2008-09-15 19:46:54 +03:00
//printing school images
2008-09-12 16:06:53 +03:00
if ( selectedTab ! = 4 & & spellSite = = 0 )
{
2009-01-07 21:40:19 +02:00
blitAt ( schools - > ourImages [ selectedTab ] . bitmap , 117 + pos . x , 74 + pos . y , to ) ;
2008-09-12 16:06:53 +03:00
}
2008-09-15 19:46:54 +03:00
//printing corners
2008-09-12 16:06:53 +03:00
if ( spellSite ! = 0 )
{
blitAt ( leftCorner , lCorner - > pos . x , lCorner - > pos . y , to ) ;
}
2009-06-20 05:14:25 +03:00
if ( ( spellSite + 1 ) < ( battleSpellsOnly ? sitesPerTabBattle [ selectedTab ] : sitesPerTabAdv [ selectedTab ] ) )
2008-09-12 16:06:53 +03:00
{
blitAt ( rightCorner , rCorner - > pos . x , rCorner - > pos . y , to ) ;
}
2008-09-15 19:46:54 +03:00
//printing spell info
for ( int b = 0 ; b < 12 ; + + b )
{
if ( spellAreas [ b ] - > mySpell = = - 1 )
continue ;
2009-08-23 16:41:57 +03:00
const CSpell * spell = & CGI - > spellh - > spells [ spellAreas [ b ] - > mySpell ] ;
2008-12-21 21:17:35 +02:00
//int b2 = -1; //TODO use me
2008-09-15 19:46:54 +03:00
blitAt ( spells - > ourImages [ spellAreas [ b ] - > mySpell ] . bitmap , spellAreas [ b ] - > pos . x , spellAreas [ b ] - > pos . y , to ) ;
2009-07-21 16:53:26 +03:00
Uint8 bestSchool = - 1 ,
2009-08-23 16:41:57 +03:00
bestslvl = myHero - > getSpellSchoolLevel ( spell ) ;
2009-07-21 16:53:26 +03:00
2009-08-23 16:41:57 +03:00
if ( spell - > air )
2009-07-21 16:53:26 +03:00
bestSchool = 0 ;
2009-08-23 16:41:57 +03:00
if ( spell - > fire )
2009-07-21 16:53:26 +03:00
bestSchool = 1 ;
2009-08-23 16:41:57 +03:00
if ( spell - > water )
2009-07-21 16:53:26 +03:00
bestSchool = 2 ;
2009-08-23 16:41:57 +03:00
if ( spell - > earth )
2009-07-21 16:53:26 +03:00
bestSchool = 3 ;
2008-09-15 19:46:54 +03:00
//printing border (indicates level of magic school)
blitAt ( schoolBorders [ bestSchool ] - > ourImages [ bestslvl ] . bitmap , spellAreas [ b ] - > pos . x , spellAreas [ b ] - > pos . y , to ) ;
2009-10-03 13:51:05 +03:00
SDL_Color firstLineColor , secondLineColor ;
if ( LOCPLINT - > cb - > getSpellCost ( spell , myHero ) > myHero - > mana ) //hero cannot cast this spell
{
firstLineColor = zwykly ;
secondLineColor = darkTitle ;
}
else
{
firstLineColor = tytulowy ;
secondLineColor = zwykly ;
}
2008-09-15 19:46:54 +03:00
//printing spell's name
2009-10-03 13:51:05 +03:00
CSDL_Ext : : printAtMiddle ( spell - > name , spellAreas [ b ] - > pos . x + 39 , spellAreas [ b ] - > pos . y + 70 , FONT_TIMES , firstLineColor , to ) ;
2008-09-15 19:46:54 +03:00
//printing lvl
2009-10-03 13:51:05 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 171 + spell - > level ] , spellAreas [ b ] - > pos . x + 39 , spellAreas [ b ] - > pos . y + 82 , FONT_TIMES , secondLineColor , to ) ;
2008-09-15 19:46:54 +03:00
//printing cost
2009-06-17 19:46:16 +03:00
std : : ostringstream ss ;
2009-08-23 16:41:57 +03:00
ss < < CGI - > generaltexth - > allTexts [ 387 ] < < " : " < < LOCPLINT - > cb - > getSpellCost ( spell , myHero ) ;
2008-09-15 19:46:54 +03:00
2009-10-03 13:51:05 +03:00
CSDL_Ext : : printAtMiddle ( ss . str ( ) , spellAreas [ b ] - > pos . x + 39 , spellAreas [ b ] - > pos . y + 94 , FONT_TIMES , secondLineColor , to ) ;
2008-09-15 19:46:54 +03:00
}
}
2008-09-16 18:23:44 +03:00
class SpellbookSpellSorter
{
public :
bool operator ( ) ( const int & a , const int & b )
{
CSpell A = CGI - > spellh - > spells [ a ] ;
CSpell B = CGI - > spellh - > spells [ b ] ;
if ( A . level < B . level )
return true ;
if ( A . level > B . level )
return false ;
if ( A . air & & ! B . air )
return true ;
if ( ! A . air & & B . air )
return false ;
if ( A . fire & & ! B . fire )
return true ;
if ( ! A . fire & & B . fire )
return false ;
if ( A . water & & ! B . water )
return true ;
if ( ! A . water & & B . water )
return false ;
if ( A . earth & & ! B . earth )
return true ;
if ( ! A . earth & & B . earth )
return false ;
return A . name < B . name ;
}
} spellsorter ;
2008-09-15 19:46:54 +03:00
void CSpellWindow : : computeSpellsPerArea ( )
{
std : : vector < ui32 > spellsCurSite ;
for ( std : : set < ui32 > : : const_iterator it = mySpells . begin ( ) ; it ! = mySpells . end ( ) ; + + it )
{
if ( CGI - > spellh - > spells [ * it ] . combatSpell ^ ! battleSpellsOnly
& & ( ( CGI - > spellh - > spells [ * it ] . air & & selectedTab = = 0 ) | |
( CGI - > spellh - > spells [ * it ] . fire & & selectedTab = = 1 ) | |
( CGI - > spellh - > spells [ * it ] . water & & selectedTab = = 2 ) | |
( CGI - > spellh - > spells [ * it ] . earth & & selectedTab = = 3 ) | |
selectedTab = = 4 )
)
{
spellsCurSite . push_back ( * it ) ;
}
}
2008-09-16 18:23:44 +03:00
std : : sort ( spellsCurSite . begin ( ) , spellsCurSite . end ( ) , spellsorter ) ;
2008-09-15 19:46:54 +03:00
if ( selectedTab = = 4 )
{
if ( spellsCurSite . size ( ) > 12 )
{
spellsCurSite = std : : vector < ui32 > ( spellsCurSite . begin ( ) + spellSite * 12 , spellsCurSite . end ( ) ) ;
if ( spellsCurSite . size ( ) > 12 )
{
spellsCurSite . erase ( spellsCurSite . begin ( ) + 12 , spellsCurSite . end ( ) ) ;
}
}
}
else //selectedTab == 0, 1, 2 or 3
{
if ( spellsCurSite . size ( ) > 10 )
{
if ( spellSite = = 0 )
{
spellsCurSite . erase ( spellsCurSite . begin ( ) + 10 , spellsCurSite . end ( ) ) ;
}
else
{
spellsCurSite = std : : vector < ui32 > ( spellsCurSite . begin ( ) + ( spellSite - 1 ) * 12 + 10 , spellsCurSite . end ( ) ) ;
if ( spellsCurSite . size ( ) > 12 )
{
spellsCurSite . erase ( spellsCurSite . begin ( ) + 12 , spellsCurSite . end ( ) ) ;
}
}
}
}
//applying
if ( selectedTab = = 4 | | spellSite ! = 0 )
{
2008-12-21 21:17:35 +02:00
for ( size_t c = 0 ; c < 12 ; + + c )
2008-09-15 19:46:54 +03:00
{
2008-12-23 15:59:03 +02:00
if ( c < spellsCurSite . size ( ) )
{
2008-09-15 19:46:54 +03:00
spellAreas [ c ] - > mySpell = spellsCurSite [ c ] ;
2008-12-23 15:59:03 +02:00
}
else
{
2008-09-15 19:46:54 +03:00
spellAreas [ c ] - > mySpell = - 1 ;
2008-12-23 15:59:03 +02:00
}
2008-09-15 19:46:54 +03:00
}
}
else
{
spellAreas [ 0 ] - > mySpell = - 1 ;
spellAreas [ 1 ] - > mySpell = - 1 ;
2008-12-21 21:17:35 +02:00
for ( size_t c = 0 ; c < 10 ; + + c )
2008-09-15 19:46:54 +03:00
{
if ( c < spellsCurSite . size ( ) )
spellAreas [ c + 2 ] - > mySpell = spellsCurSite [ c ] ;
else
spellAreas [ c + 2 ] - > mySpell = - 1 ;
}
}
2008-09-10 15:19:48 +03:00
}
void CSpellWindow : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateKeys ( ) ;
2008-09-10 15:19:48 +03:00
exitBtn - > activate ( ) ;
2008-09-11 15:29:22 +03:00
battleSpells - > activate ( ) ;
adventureSpells - > activate ( ) ;
manaPoints - > activate ( ) ;
selectSpellsA - > activate ( ) ;
selectSpellsE - > activate ( ) ;
selectSpellsF - > activate ( ) ;
selectSpellsW - > activate ( ) ;
selectSpellsAll - > activate ( ) ;
2008-09-12 16:06:53 +03:00
lCorner - > activate ( ) ;
rCorner - > activate ( ) ;
2008-09-15 19:46:54 +03:00
for ( int g = 0 ; g < 12 ; + + g )
{
spellAreas [ g ] - > activate ( ) ;
}
2008-09-10 15:19:48 +03:00
}
void CSpellWindow : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateKeys ( ) ;
2008-09-10 15:19:48 +03:00
exitBtn - > deactivate ( ) ;
2008-09-11 15:29:22 +03:00
battleSpells - > deactivate ( ) ;
adventureSpells - > deactivate ( ) ;
manaPoints - > deactivate ( ) ;
selectSpellsA - > deactivate ( ) ;
selectSpellsE - > deactivate ( ) ;
selectSpellsF - > deactivate ( ) ;
selectSpellsW - > deactivate ( ) ;
selectSpellsAll - > deactivate ( ) ;
2008-09-12 16:06:53 +03:00
lCorner - > deactivate ( ) ;
rCorner - > deactivate ( ) ;
2008-09-15 19:46:54 +03:00
for ( int g = 0 ; g < 12 ; + + g )
{
spellAreas [ g ] - > deactivate ( ) ;
}
}
2009-06-20 04:42:19 +03:00
void CSpellWindow : : turnPageLeft ( )
{
2009-06-24 09:56:36 +03:00
CGI - > videoh - > openAndPlayVideo ( " PGTRNLFT.SMK " , pos . x + 13 , pos . y + 15 , screen ) ;
2009-06-20 04:42:19 +03:00
}
void CSpellWindow : : turnPageRight ( )
{
2009-06-24 09:56:36 +03:00
CGI - > videoh - > openAndPlayVideo ( " PGTRNRGH.SMK " , pos . x + 13 , pos . y + 15 , screen ) ;
2009-06-20 04:42:19 +03:00
}
2009-07-03 22:57:14 +03:00
void CSpellWindow : : keyPressed ( const SDL_KeyboardEvent & key )
{
if ( key . keysym . sym = = SDLK_ESCAPE | | key . keysym . sym = = SDLK_RETURN )
fexitb ( ) ;
}
2008-09-15 19:46:54 +03:00
CSpellWindow : : SpellArea : : SpellArea ( SDL_Rect pos , CSpellWindow * owner )
{
this - > pos = pos ;
this - > owner = owner ;
}
2009-08-11 19:05:33 +03:00
void CSpellWindow : : SpellArea : : clickLeft ( tribool down , bool previousState )
2008-09-15 19:46:54 +03:00
{
2008-10-17 20:43:25 +03:00
if ( ! down & & mySpell ! = - 1 )
2008-10-17 19:30:56 +03:00
{
2008-10-17 20:43:25 +03:00
//we will cast a spell
2009-10-03 13:51:05 +03:00
if ( LOCPLINT - > battleInt & & LOCPLINT - > cb - > battleCanCastSpell ( ) & & LOCPLINT - > cb - > getSpellCost ( & CGI - > spellh - > spells [ mySpell ] , owner - > myHero ) < = owner - > myHero - > mana ) //if battle window is open
2008-10-17 20:43:25 +03:00
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > battleInt - > castThisSpell ( mySpell ) ;
2009-10-03 13:51:05 +03:00
owner - > fexitb ( ) ;
2008-10-17 20:43:25 +03:00
}
2008-10-17 19:30:56 +03:00
}
2008-09-15 19:46:54 +03:00
}
2009-08-11 19:05:33 +03:00
void CSpellWindow : : SpellArea : : clickRight ( tribool down , bool previousState )
2008-09-15 19:46:54 +03:00
{
2008-09-16 18:23:44 +03:00
if ( down & & mySpell ! = - 1 )
2008-09-15 19:46:54 +03:00
{
2009-11-08 16:44:58 +02:00
std : : string dmgInfo ;
int causedDmg = LOCPLINT - > cb - > estimateSpellDamage ( & CGI - > spellh - > spells [ mySpell ] ) ;
if ( causedDmg = = 0 )
dmgInfo = " " ;
else
{
dmgInfo = CGI - > generaltexth - > allTexts [ 343 ] ;
boost : : algorithm : : replace_first ( dmgInfo , " %d " , boost : : lexical_cast < std : : string > ( causedDmg ) ) ;
}
2009-08-23 21:23:21 +03:00
SDL_Surface * spellBox = CMessage : : drawBoxTextBitmapSub (
2009-04-14 15:47:09 +03:00
LOCPLINT - > playerID ,
2009-11-08 16:44:58 +02:00
CGI - > spellh - > spells [ mySpell ] . descriptions [ 0 ] + dmgInfo , this - > owner - > spells - > ourImages [ mySpell ] . bitmap ,
2008-09-15 19:46:54 +03:00
CGI - > spellh - > spells [ mySpell ] . name , 30 , 30 ) ;
2009-08-23 21:23:21 +03:00
CInfoPopup * vinya = new CInfoPopup ( spellBox , true ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( vinya ) ;
2008-09-15 19:46:54 +03:00
}
}
void CSpellWindow : : SpellArea : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2008-09-16 18:23:44 +03:00
if ( mySpell ! = - 1 )
2008-09-15 19:46:54 +03:00
{
2008-09-16 18:23:44 +03:00
if ( on )
{
2009-06-17 19:46:16 +03:00
std : : ostringstream ss ;
2008-09-16 18:23:44 +03:00
ss < < CGI - > spellh - > spells [ mySpell ] . name < < " ( " < < CGI - > generaltexth - > allTexts [ 171 + CGI - > spellh - > spells [ mySpell ] . level ] < < " ) " ;
owner - > statusBar - > print ( ss . str ( ) ) ;
}
else
{
owner - > statusBar - > clear ( ) ;
}
2008-09-15 19:46:54 +03:00
}
}
void CSpellWindow : : SpellArea : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
2008-09-15 19:46:54 +03:00
}
void CSpellWindow : : SpellArea : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
2008-09-10 15:19:48 +03:00
}