mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Support for creature skill icons. Several fixes for creature abilities.
This commit is contained in:
parent
7209f158a1
commit
bc51c0006f
@ -21,6 +21,7 @@
|
|||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
|
||||||
using namespace CSDL_Ext;
|
using namespace CSDL_Ext;
|
||||||
|
|
||||||
@ -80,15 +81,17 @@ void CCreatureWindow::init(const CStackInstance *stack, const CBonusSystemNode *
|
|||||||
node.bonuses.remove_if (Selector::typeSybtype(b->type, b->subtype)); //remove used bonuses
|
node.bonuses.remove_if (Selector::typeSybtype(b->type, b->subtype)); //remove used bonuses
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<std::string, std::string> > descriptions; //quick, yet slow solution
|
typedef boost::tuple<std::string,std::string, std::string> skillLine; //jeez
|
||||||
std::string text, text2;
|
std::vector<skillLine> descriptions; //quick, yet slow solution
|
||||||
|
std::string text, text2, bonusGfx;
|
||||||
BOOST_FOREACH(Bonus* b, bl)
|
BOOST_FOREACH(Bonus* b, bl)
|
||||||
{
|
{
|
||||||
text = stack->bonusToString(b, false);
|
text = stack->bonusToString(b, false);
|
||||||
if (text.size())
|
if (text.size())
|
||||||
{
|
{
|
||||||
text2 = stack->bonusToString(b, true);
|
text2 = stack->bonusToString(b, true);
|
||||||
descriptions.push_back(std::pair<std::string,std::string>(text, text2));
|
bonusGfx = stack->bonusToGraphics(b); // may be empty
|
||||||
|
descriptions.push_back(boost::tuple<std::string,std::string, std::string>(text, text2, bonusGfx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,23 +177,26 @@ void CCreatureWindow::init(const CStackInstance *stack, const CBonusSystemNode *
|
|||||||
//All bonuses - abilities
|
//All bonuses - abilities
|
||||||
|
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
typedef std::pair<std::string, std::string> stringpair; //jeez
|
std::string gfxName;
|
||||||
BOOST_FOREACH(stringpair p, descriptions)
|
BOOST_FOREACH(skillLine p, descriptions)
|
||||||
{
|
{
|
||||||
int offsetx = 257*j;
|
int offsetx = 257*j;
|
||||||
int offsety = 60*i;
|
int offsety = 60*i + (bonusRows > 1 ? 1 : 0); //lack of precision :<
|
||||||
|
|
||||||
printAt(p.first, 84 + offsetx, 238 + offsety, FONT_SMALL, tytulowy, *bitmap);
|
printAt(p.get<0>(), 84 + offsetx, 238 + offsety, FONT_SMALL, tytulowy, *bitmap);
|
||||||
printAt(p.second, 84 + offsetx, 258 + offsety, FONT_SMALL, zwykly, *bitmap);
|
printAt(p.get<1>(), 84 + offsetx, 258 + offsety, FONT_SMALL, zwykly, *bitmap);
|
||||||
|
gfxName = p.get<2>();
|
||||||
|
if (gfxName.size())
|
||||||
|
{
|
||||||
|
CPicture * bonusGfx = new CPicture(gfxName, 22 + offsetx, 232 + offsety);
|
||||||
|
bonusGraphics.push_back(bonusGfx);
|
||||||
|
}
|
||||||
|
|
||||||
if (++j > 1) //next line
|
if (++j > 1) //next line
|
||||||
{
|
{
|
||||||
++i;
|
++i;
|
||||||
j = 0;
|
j = 0;
|
||||||
}
|
}
|
||||||
//text = stack->bonusToString(*it, true);
|
|
||||||
//if (text.size())
|
|
||||||
// printAt(text, 80 + offsety, 262 + offsetx, FONT_SMALL, zwykly, *bitmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//AUIDAT.DEF
|
//AUIDAT.DEF
|
||||||
@ -286,6 +292,6 @@ void CCreatureWindow::close()
|
|||||||
|
|
||||||
CCreatureWindow::~CCreatureWindow()
|
CCreatureWindow::~CCreatureWindow()
|
||||||
{
|
{
|
||||||
for(int i=0; i<upgResCost.size();i++)
|
for (int i=0; i<upgResCost.size(); ++i)
|
||||||
delete upgResCost[i];
|
delete upgResCost[i];
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ public:
|
|||||||
CCreaturePic *anim; //related creature's animation
|
CCreaturePic *anim; //related creature's animation
|
||||||
const CCreature *c; //related creature
|
const CCreature *c; //related creature
|
||||||
std::vector<SComponent*> upgResCost; //cost of upgrade (if not possible then empty)
|
std::vector<SComponent*> upgResCost; //cost of upgrade (if not possible then empty)
|
||||||
|
std::vector<CPicture*> bonusGraphics;
|
||||||
|
|
||||||
MoraleLuckBox *luck, *morale;
|
MoraleLuckBox *luck, *morale;
|
||||||
LRClickableAreaWText * expArea; //displays exp details
|
LRClickableAreaWText * expArea; //displays exp details
|
||||||
|
@ -103,10 +103,12 @@
|
|||||||
+ 79 SELF_MORALE 0 0 0 //minotaur kings
|
+ 79 SELF_MORALE 0 0 0 //minotaur kings
|
||||||
+ 81 SPELL_AFTER_ATTACK 0 74 20 //scorpicore
|
+ 81 SPELL_AFTER_ATTACK 0 74 20 //scorpicore
|
||||||
+ 82 LEVEL_SPELL_IMMUNITY 3 0 0 //red dragon's spell immunity
|
+ 82 LEVEL_SPELL_IMMUNITY 3 0 0 //red dragon's spell immunity
|
||||||
|
+ 82 TWO_HEX_ATTACK_BREATH 0 0 0 //Red Dragon has breath attack
|
||||||
+ 82 DRAGON_NATURE 0 0 0 //red dragon is a dragon
|
+ 82 DRAGON_NATURE 0 0 0 //red dragon is a dragon
|
||||||
+ 83 LEVEL_SPELL_IMMUNITY 5 0 0 //black dragon's spell immunity
|
+ 83 LEVEL_SPELL_IMMUNITY 5 0 0 //black dragon's spell immunity
|
||||||
+ 83 HATE 50 40 0 //Hate Ggiants
|
+ 83 HATE 50 40 0 //Hate Giants
|
||||||
+ 83 HATE 50 41 0 //Hate Titans
|
+ 83 HATE 50 41 0 //Hate Titans
|
||||||
|
+ 83 TWO_HEX_ATTACK_BREATH 0 0 0 //Black Dragon has breath attack
|
||||||
+ 83 DRAGON_NATURE 0 0 0 //black dragon is a dragon
|
+ 83 DRAGON_NATURE 0 0 0 //black dragon is a dragon
|
||||||
+ 87 ADDITIONAL_ATTACK 1 0 0 //wolf raider
|
+ 87 ADDITIONAL_ATTACK 1 0 0 //wolf raider
|
||||||
+ 91 SPELLCASTER 2 43 6 //ogre magi cast bloodlust
|
+ 91 SPELLCASTER 2 43 6 //ogre magi cast bloodlust
|
||||||
@ -191,4 +193,5 @@
|
|||||||
- 47 FLYING //cerberus doesn't fly
|
- 47 FLYING //cerberus doesn't fly
|
||||||
- 120 DOUBLE_WIDE //psychic elemental
|
- 120 DOUBLE_WIDE //psychic elemental
|
||||||
- 121 DOUBLE_WIDE //magic elemental
|
- 121 DOUBLE_WIDE //magic elemental
|
||||||
|
- 157 SHOOTER //Hell Hydra certainly does not shoot
|
||||||
0
|
0
|
||||||
|
@ -595,6 +595,142 @@ std::string CStackInstance::bonusToString(Bonus *bonus, bool description) const
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CStackInstance::bonusToGraphics(Bonus *bonus) const
|
||||||
|
{
|
||||||
|
std::string fileName;
|
||||||
|
switch (bonus->type)
|
||||||
|
{
|
||||||
|
//"E_ALIVE.bmp"
|
||||||
|
//"E_ART.bmp"
|
||||||
|
//"E_BLESS.bmp"
|
||||||
|
//"E_BLOCK.bmp"
|
||||||
|
//"E_BLOCK1.bmp"
|
||||||
|
//"E_BLOCK2.bmp"
|
||||||
|
case Bonus::TWO_HEX_ATTACK_BREATH:
|
||||||
|
fileName = "E_BREATH.bmp"; break;
|
||||||
|
case Bonus::SPELL_AFTER_ATTACK:
|
||||||
|
fileName = "E_CAST.bmp"; break;
|
||||||
|
//"E_CAST1.bmp"
|
||||||
|
//"E_CAST2.bmp"
|
||||||
|
//"E_CASTER.bmp"
|
||||||
|
case Bonus::JOUSTING:
|
||||||
|
fileName = "E_CHAMP.bmp"; break;
|
||||||
|
case Bonus::DOUBLE_DAMAGE_CHANCE:
|
||||||
|
fileName = "E_DBLOW.bmp"; break;
|
||||||
|
//"E_DEATH.bmp"
|
||||||
|
//"E_DEFBON.bmp"
|
||||||
|
case Bonus::NO_DISTANCE_PENALTY:
|
||||||
|
fileName = "E_DIST.bmp"; break;
|
||||||
|
case Bonus::ADDITIONAL_ATTACK:
|
||||||
|
fileName = "E_DOUBLE.bmp"; break;
|
||||||
|
case Bonus::DRAGON_NATURE:
|
||||||
|
fileName = "E_DRAGON.bmp"; break;
|
||||||
|
case Bonus::MAGIC_RESISTANCE:
|
||||||
|
fileName = "E_DWARF.bmp"; break;
|
||||||
|
case Bonus::FEAR:
|
||||||
|
fileName = "E_FEAR.bmp"; break;
|
||||||
|
case Bonus::FEARLESS:
|
||||||
|
fileName = "E_FEARL.bmp"; break;
|
||||||
|
//"E_FIRE.bmp"
|
||||||
|
case Bonus::FLYING:
|
||||||
|
fileName = "E_FLY.bmp"; break;
|
||||||
|
case Bonus::SPELL_DAMAGE_REDUCTION:
|
||||||
|
fileName = "E_GOLEM.bmp"; break;
|
||||||
|
case Bonus::RETURN_AFTER_STRIKE:
|
||||||
|
fileName = "E_HARPY.bmp"; break;
|
||||||
|
case Bonus::HATE:
|
||||||
|
fileName = "E_HATE.bmp"; break;
|
||||||
|
case Bonus::KING1:
|
||||||
|
fileName = "E_KING1.bmp"; break;
|
||||||
|
case Bonus::KING2:
|
||||||
|
fileName = "E_KING2.bmp"; break;
|
||||||
|
case Bonus::KING3:
|
||||||
|
fileName = "E_KING3.bmp"; break;
|
||||||
|
//"E_LIGHT.bmp"
|
||||||
|
case Bonus::CHANGES_SPELL_COST_FOR_ALLY:
|
||||||
|
fileName = "E_MANA.bmp"; break;
|
||||||
|
case Bonus::NO_MELEE_PENALTY:
|
||||||
|
fileName = "E_MELEE.bmp"; break;
|
||||||
|
//"E_MIND.bmp"
|
||||||
|
case Bonus::SELF_MORALE:
|
||||||
|
fileName = "E_MINOT.bmp"; break;
|
||||||
|
case Bonus::NO_MORALE:
|
||||||
|
fileName = "E_MORAL.bmp"; break;
|
||||||
|
//"E_NOFRIM.bmp"
|
||||||
|
case Bonus::NO_OBSTACLES_PENALTY:
|
||||||
|
fileName = "E_OBST.bmp"; break;
|
||||||
|
case Bonus::ENEMY_DEFENCE_REDUCTION:
|
||||||
|
fileName = "E_RDEF.bmp"; break;
|
||||||
|
//"E_REBIRTH.bmp"
|
||||||
|
case Bonus::BLOCKS_RETALIATION:
|
||||||
|
fileName = "E_RETAIL.bmp"; break;
|
||||||
|
case Bonus::ADDITIONAL_RETALIATION:
|
||||||
|
fileName = "E_RETAIL1.bmp"; break;
|
||||||
|
case Bonus::ATTACKS_ALL_ADJACENT:
|
||||||
|
fileName = "E_ROUND.bmp"; break;
|
||||||
|
//"E_SGNUM.bmp"
|
||||||
|
//"E_SGTYPE.bmp"
|
||||||
|
case Bonus::SHOOTER:
|
||||||
|
fileName = "E_SHOOT.bmp"; break;
|
||||||
|
case Bonus::FREE_SHOOTING: //shooter is not blocked by enemy
|
||||||
|
fileName = "E_SHOOTA.bmp"; break;
|
||||||
|
//"E_SHOOTN.bmp"
|
||||||
|
//"E_SPAIR.bmp"
|
||||||
|
//"E_SPAIR1.bmp"
|
||||||
|
case Bonus::SPELL_IMMUNITY:
|
||||||
|
{
|
||||||
|
switch (bonus->subtype)
|
||||||
|
{
|
||||||
|
case 74: //Blind
|
||||||
|
fileName = "E_SPBLIND.bmp"; break;
|
||||||
|
case 60: //Hypnotize
|
||||||
|
fileName = "E_SPHYPN.bmp"; break;
|
||||||
|
case 18: //Implosion
|
||||||
|
fileName = "E_SPIMP.bmp"; break;
|
||||||
|
case 59: //Berserk
|
||||||
|
fileName = "E_SPBERS.bmp"; break;
|
||||||
|
case 23: //Meteor Shower
|
||||||
|
fileName = "E_SPMET.bmp"; break;
|
||||||
|
case 26: //Armageddon
|
||||||
|
fileName = "E_SPARM.bmp"; break;
|
||||||
|
case 54: //Slow
|
||||||
|
fileName = "E_SPSLOW.bmp"; break;
|
||||||
|
//TODO: some generic spell handling?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//"E_SPAWILL.bmp"
|
||||||
|
//"E_SPCOLD.bmp"
|
||||||
|
//"E_SPDFIRE.bmp"
|
||||||
|
//"E_SPDIR.bmp"
|
||||||
|
//"E_SPDISB.bmp"
|
||||||
|
//"E_SPDISP.bmp"
|
||||||
|
//"E_SPEATH.bmp"
|
||||||
|
//"E_SPEATH1.bmp"
|
||||||
|
//"E_SPFIRE.bmp"
|
||||||
|
//"E_SPFIRE1.bmp"
|
||||||
|
case Bonus::LEVEL_SPELL_IMMUNITY:
|
||||||
|
{
|
||||||
|
if (iswith(bonus->val, 1 , 5))
|
||||||
|
{
|
||||||
|
fileName = "E_SPLVL" + boost::lexical_cast<std::string>(bonus->val) + ".bmp";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//"E_SPWATER.bmp"
|
||||||
|
//"E_SPWATER1.bmp"
|
||||||
|
//"E_SUMMON.bmp"
|
||||||
|
//"E_SUMMON1.bmp"
|
||||||
|
//"E_SUMMON2.bmp"
|
||||||
|
case Bonus::FULL_HP_REGENERATION:
|
||||||
|
fileName = "E_TROLL.bmp"; break;
|
||||||
|
case Bonus::UNDEAD:
|
||||||
|
fileName = "E_UNDEAD.bmp"; break;
|
||||||
|
case Bonus::SPELL_RESISTANCE_AURA:
|
||||||
|
fileName = "E_UNIC.bmp"; break;
|
||||||
|
}
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
void CStackInstance::setArmyObj(const CArmedInstance *ArmyObj)
|
void CStackInstance::setArmyObj(const CArmedInstance *ArmyObj)
|
||||||
{
|
{
|
||||||
if(_armyObj)
|
if(_armyObj)
|
||||||
|
@ -47,6 +47,7 @@ public:
|
|||||||
//overrides CBonusSystemNode
|
//overrides CBonusSystemNode
|
||||||
//void getParents(TCNodes &out, const CBonusSystemNode *source = NULL) const; //retrieves list of parent nodes (nodes to inherit bonuses from), source is the prinary asker
|
//void getParents(TCNodes &out, const CBonusSystemNode *source = NULL) const; //retrieves list of parent nodes (nodes to inherit bonuses from), source is the prinary asker
|
||||||
std::string bonusToString(Bonus *bonus, bool description) const; // how would bonus description look for this particular type of node
|
std::string bonusToString(Bonus *bonus, bool description) const; // how would bonus description look for this particular type of node
|
||||||
|
std::string bonusToGraphics(Bonus *bonus) const; //file name of graphics from StackSkills , in future possibly others
|
||||||
|
|
||||||
int getQuantityID() const;
|
int getQuantityID() const;
|
||||||
std::string getQuantityTXT(bool capitalized = true) const;
|
std::string getQuantityTXT(bool capitalized = true) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user