@@ -308,45 +308,86 @@ UnitAttackBoostEffect::~UnitAttackBoostEffect() {
const Unit * UnitAttackBoostEffect::getSource () {
if (source == NULL && unitPtr != NULL && unitId > 0 ) {
source = unitPtr->getFaction ()->findUnit (unitId);
// printf("#1 Get source - boost effect unitId = %d unitPtr = %s source = %p\n",unitId,unitPtr->getFullName(false).c_str(),source);
}
// printf("#2 Get source - boost effect unitId = %d unitPtr = %s source = %p\n",unitId,unitPtr->getFullName(false).c_str(),source);
return source;
}
void UnitAttackBoostEffect::setSource (const Unit *unit) {
source = unit;
}
void UnitAttackBoostEffect::loadGame (const XmlNode *rootNode, Unit *unit, const SkillType *skillType) {
// const XmlNode *unitAttackBoostEffectOriginatorNode = rootNode->getChild("UnitAttackBoostEffect");
const XmlNode *unitAttackBoostEffectOriginatorNode = rootNode;
void UnitAttackBoostEffect::applyLoadedAttackBoostParticles (UnitParticleSystemType *upstPtr,const XmlNode *node, Unit* unit) {
if (upstPtr != NULL ) {
bool showUnitParticles = Config::getInstance ().getBool (" UnitParticles" ," true" );
if (showUnitParticles == true ) {
upst = new UnitParticleSystemType ();
*upst = *upstPtr;
upst->loadGame (node);
ups = new UnitParticleSystem (200 );
// ups->loadGame(node2);
ups->setParticleOwner (unit);
upst->setValues (ups);
ups->setPos (unit->getCurrVector ());
if (unit->getFaction ()->getTexture ()) {
ups->setFactionColor (unit->getFaction ()->getTexture ()->getPixmapConst ()->getPixel3f (0 , 0 ));
}
// printf("Adding attack boost particle to deferred buffer: %p\n",ups);
Renderer::getInstance ().addToDeferredParticleSystemList (make_pair (ups, rsGame));
}
}
}
AttackBoost *load_boost = new AttackBoost ();
load_boost->loadGame (unitAttackBoostEffectOriginatorNode,unit->getFaction (),skillType);
boost = load_boost;
void UnitAttackBoostEffect::loadGame (const XmlNode *rootNode, Unit *unit, World *world, bool applyToOriginator) {
const XmlNode *unitAttackBoostEffectNode = rootNode;
if (unitAttackBoostEffectOriginatorNode ->hasAttribute (" source" ) == true ) {
unitId = unitAttackBoostEffectOriginatorNode ->getAttribute (" source" )->getIntValue ();
if (unitAttackBoostEffectNode ->hasAttribute (" source" ) == true ) {
unitId = unitAttackBoostEffectNode ->getAttribute (" source" )->getIntValue ();
unitPtr = unit;
source = unit->getFaction ()->findUnit (unitId);
}
if (unitAttackBoostEffectOriginatorNode->hasChild (" UnitParticleSystemType" ) == true ) {
// const XmlNode *node = unitAttackBoostEffectOriginatorNode->getChild("UnitParticleSystemType");
upst = new UnitParticleSystemType ();
upst->loadGame (unitAttackBoostEffectOriginatorNode);
// printf("#1 Loaded boost effect unitId = %d unitPtr = [%d - %s] source = %p\n",
// unitId,unitPtr->getId(),unitPtr->getType()->getName(false).c_str(),source);
}
if (unitAttackBoostEffectOriginatorNode->hasChild (" UnitParticleSystem" ) == true ) {
const XmlNode *node = unitAttackBoostEffectOriginatorNode->getChild (" UnitParticleSystem" );
// Lets determine the originator unit's attack boost based on the skill used to trigger it
if (unitAttackBoostEffectNode->hasAttribute (" source-faction" ) == true ) {
string factionName = unitAttackBoostEffectNode->getAttribute (" source-faction" )->getValue ();
string unitTypeName = unitAttackBoostEffectNode->getAttribute (" source-unit-type" )->getValue ();
string skillTypeName = unitAttackBoostEffectNode->getAttribute (" source-skill-type" )->getValue ();
SkillClass skillClass = static_cast <SkillClass>(unitAttackBoostEffectNode->getAttribute (" source-skill-class" )->getIntValue ());
ups = new UnitParticleSystem (200 );
ups->loadGame (node);
const UnitType *unitType = world->findUnitTypeByName (factionName, unitTypeName);
if (unitType != NULL ) {
const SkillType *skillType = unitType->getSkillType (skillTypeName,skillClass);
if (skillType != NULL ) {
boost = skillType->getAttackBoost ();
ups->setParticleOwner (unit);
upst->setValues (ups);
// printf("#2 boost effect unitId = %d unitPtr = [%d - %s] source = %p attackBoost src [%p] dest [%p]\n",
// unitId,unitPtr->getId(),unitPtr->getType()->getName(false).c_str(),
// source,boost->unitParticleSystemTypeForSourceUnit,boost->unitParticleSystemTypeForAffectedUnit);
}
}
}
if (boost != NULL ) {
// printf("unit [%d - %s] applyToOriginator: %d src [%p] dest [%p] Boost attackBoost->enabled = %d:\n%s\n",
// unit->getId(),unit->getType()->getName(false).c_str(),applyToOriginator,boost->unitParticleSystemTypeForSourceUnit,boost->unitParticleSystemTypeForAffectedUnit,boost->enabled,boost->getDesc(false).c_str());
Renderer::getInstance ().addToDeferredParticleSystemList (make_pair (ups, rsGame));
if (applyToOriginator == true ) {
applyLoadedAttackBoostParticles (boost->unitParticleSystemTypeForSourceUnit ,
unitAttackBoostEffectNode, unit);
}
else {
applyLoadedAttackBoostParticles (boost->unitParticleSystemTypeForAffectedUnit ,
unitAttackBoostEffectNode, unit);
}
}
else {
printf (" ******!!!! unit [%d - %s] applyToOriginator: %d NO BOOST FOUND!!!\n " ,unit->getId (),unit->getType ()->getName (false ).c_str (),applyToOriginator);
}
}
@@ -359,8 +400,13 @@ void UnitAttackBoostEffect::saveGame(XmlNode *rootNode) {
boost->saveGame (unitAttackBoostEffectNode);
}
// const Unit *source;
if (source != NULL ) {
unitAttackBoostEffectNode->addAttribute (" source" ,intToStr (source->getId ()), mapTagReplacements);
if (getSource () != NULL ) {
unitAttackBoostEffectNode->addAttribute (" source" ,intToStr (getSource ()->getId ()), mapTagReplacements);
unitAttackBoostEffectNode->addAttribute (" source-faction" ,getSource ()->getFaction ()->getType ()->getName (false ), mapTagReplacements);
unitAttackBoostEffectNode->addAttribute (" source-unit-type" ,getSource ()->getType ()->getName (false ), mapTagReplacements);
unitAttackBoostEffectNode->addAttribute (" source-skill-type" ,getSource ()->getCurrSkill ()->getName (), mapTagReplacements);
unitAttackBoostEffectNode->addAttribute (" source-skill-class" ,intToStr (getSource ()->getCurrSkill ()->getClass ()), mapTagReplacements);
}
// UnitParticleSystem *ups;
if (ups != NULL && Renderer::getInstance ().validateParticleSystemStillExists (ups,rsGame) == true ) {
@@ -383,7 +429,7 @@ UnitAttackBoostEffectOriginator::~UnitAttackBoostEffectOriginator() {
currentAppliedEffect = NULL ;
}
void UnitAttackBoostEffectOriginator::loadGame (const XmlNode *rootNode, Unit *unit) {
void UnitAttackBoostEffectOriginator::loadGame (const XmlNode *rootNode, Unit *unit, World *world ) {
const XmlNode *unitAttackBoostEffectOriginatorNode = rootNode->getChild (" UnitAttackBoostEffectOriginator" );
SkillClass skillClass = scStop;
@@ -416,7 +462,7 @@ void UnitAttackBoostEffectOriginator::loadGame(const XmlNode *rootNode, Unit *un
if (unitAttackBoostEffectOriginatorNode->hasChild (" UnitAttackBoostEffect" ) == true ) {
currentAppliedEffect = new UnitAttackBoostEffect ();
currentAppliedEffect->loadGame (unitAttackBoostEffectOriginatorNode, unit,this -> skillType );
currentAppliedEffect->loadGame (unitAttackBoostEffectOriginatorNode, unit,world, true );
}
}
@@ -2574,6 +2620,7 @@ bool Unit::update() {
}
}
// printf("Unit has attack boost? unit = [%d - %s] size = %d\n",this->getId(), this->getType()->getName(false).c_str(),(int)currentAttackBoostEffects.size());
for (unsigned int i = 0 ; i < currentAttackBoostEffects.size (); ++i) {
UnitAttackBoostEffect *effect = currentAttackBoostEffects[i];
if (effect != NULL && effect->ups != NULL ) {
@@ -2582,8 +2629,13 @@ bool Unit::update() {
effect->ups ->setPos (getCurrVector ());
effect->ups ->setRotation (getRotation ());
}
// printf("i = %d particleValid = %d\n",i,particleValid);
}
// printf("i = %d effect = %p effect->ups = %p\n",i,effect,(effect ? effect->ups : NULL));
}
if (currentAttackBoostOriginatorEffect.currentAppliedEffect != NULL ) {
if (currentAttackBoostOriginatorEffect.currentAppliedEffect ->ups != NULL ) {
bool particleValid = Renderer::getInstance ().validateParticleSystemStillExists (currentAttackBoostOriginatorEffect.currentAppliedEffect ->ups ,rsGame);
@@ -2693,6 +2745,9 @@ bool Unit::unitHasAttackBoost(const AttackBoost *boost, const Unit *source) {
break ;
}
}
// printf("Unit has attack boost? source = [%d - %s] [%p] boost [%s] result = %d\n",source->getId(), source->getType()->getName(false).c_str(),source,boost->name.c_str(),result);
return result;
}
@@ -5141,7 +5196,7 @@ Unit * Unit::loadGame(const XmlNode *rootNode, GameSettings *settings, Faction *
// UnitAttackBoostEffectOriginator currentAttackBoostOriginatorEffect;
// !!! TODO: Softcoder - in progress work to load attack boosts, not working properly yet
// result->currentAttackBoostOriginatorEffect.loadGame(unitNode,result);
result->currentAttackBoostOriginatorEffect .loadGame (unitNode,result, world );
// std::vector<UnitAttackBoostEffect *> currentAttackBoostEffects;
// for(unsigned int i = 0; i < currentAttackBoostEffects.size(); ++i) {
@@ -5150,17 +5205,18 @@ Unit * Unit::loadGame(const XmlNode *rootNode, GameSettings *settings, Faction *
// }
// !!! TODO: Softcoder - in progress work to load attack boosts, not working properly yet
// if(unitNode->hasChild("UnitAttackBoostEffect") == true) {
// vector<XmlNode *> unitParticleSystemNodeList = unitNode->getChildList("UnitAttackBoostEffect");
// for(unsigned int i = 0; i < unitParticleSystemNodeList.size(); ++i) {
// XmlNode *node = unitParticleSystemNodeList[i];
//
// UnitAttackBoostEffect *attackBoostEffect = new UnitAttackBoostEffect();
// attackBoostEffect->loadGame(node,result,result->getCurrSkill());
//
// result->currentAttackBoostEffects.push_back(attackBoostEffect);
// }
// }
if (unitNode->hasChild (" UnitAttackBoostEffect" ) == true ) {
vector<XmlNode *> unitParticleSystemNodeList = unitNode->getChildList (" UnitAttackBoostEffect" );
for (unsigned int i = 0 ; i < unitParticleSystemNodeList.size (); ++i) {
XmlNode *node = unitParticleSystemNodeList[i];
UnitAttackBoostEffect *attackBoostEffect = new UnitAttackBoostEffect ();
attackBoostEffect->loadGame (node,result,world,false );
result->currentAttackBoostEffects .push_back (attackBoostEffect);
}
}
// printf("Unit [%d - %s] has currentAttackBoostEffects count: %d\n",result->getId(),result->getType()->getName(false).c_str(),(int)result->currentAttackBoostEffects.size());
// Mutex *mutexCommands;