From 08806c5416c82322e6ea39a9c6c1c5a17cfe8499 Mon Sep 17 00:00:00 2001 From: titison Date: Wed, 29 Oct 2014 22:23:46 +0100 Subject: [PATCH] *Finised Hp Bars *Added general settings in faction.xml --- source/glest_game/graphics/renderer.cpp | 57 +++++++++++++++--------- source/glest_game/types/faction_type.cpp | 32 +++++++++++++ source/glest_game/types/faction_type.h | 8 ++++ source/glest_game/types/unit_type.cpp | 51 +++++++++------------ source/glest_game/types/unit_type.h | 11 ++--- 5 files changed, 103 insertions(+), 56 deletions(-) diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index c8d8cbd1..fea57fc7 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -5634,32 +5634,46 @@ void Renderer::renderOnTopBars(){ for(int visibleUnitIndex = 0; visibleUnitIndex < (int)qCache.visibleQuadUnitList.size(); ++visibleUnitIndex) { Unit *unit = qCache.visibleQuadUnitList[visibleUnitIndex]; - if(unit->isAlive() && unit->getType()->isHealthbarEnabled() - && ((unit->getType()->getHealthbarVisible()&hbvAlways) - || ((unit->getType()->getHealthbarVisible()&hbvDamaged) && unit->getHp()!=unit->getType()->getMaxHp()) - || ((unit->getType()->getHealthbarVisible()&hbvSelected) && game->getGui()->isSelected(unit)))) { + + float healthbarheight; + float healthbarthickness; + int healthbarVisible; + + //get settings of the faction + healthbarheight=unit->getFaction()->getType()->getHealthbarHeight(); + healthbarthickness=unit->getFaction()->getType()->getHealthbarThickness(); + healthbarVisible=unit->getFaction()->getType()->getHealthbarVisible(); + + //replace them by the ones from the unit if existent + if(unit->getType()->getHealthbarVisible()!=hbvOff && unit->getType()->getHealthbarVisible()!=hbvUndefined) { + if(unit->getType()->getHealthbarHeight()!=-100.0f) { + healthbarheight=unit->getType()->getHealthbarHeight(); + } + if(unit->getType()->getHealthbarThickness()!=-1.0f) { + healthbarthickness=unit->getType()->getHealthbarThickness(); + } + healthbarVisible=unit->getType()->getHealthbarVisible(); + } + + if(unit->isAlive() && !(healthbarVisible==hbvUndefined || (healthbarVisible&hbvOff)) + && ((healthbarVisible&hbvAlways) + || ((healthbarVisible&hbvDamaged) && unit->getHp()!=unit->getType()->getMaxHp()) + || ((healthbarVisible&hbvSelected) && game->getGui()->isSelected(unit)))) { Vec3f currVec= unit->getCurrVectorFlat(); - float thickness; - if(unit->getType()->getHealthbarHeight()==-100.0f) { + if(healthbarheight==-100.0f) { currVec.y+=unit->getType()->getHeight()+1; } else { - currVec.y+=unit->getType()->getHealthbarHeight(); + currVec.y+=healthbarheight; } - if(unit->getType()->getHealthbarThickness()==-1.0f) { - if(unit->getType()->getMaxEp() > 0 && unit->getType()->isHealthbarShowEp()) { - thickness=0.08f; - } else { - thickness=0.05f; - } - } else { - thickness=unit->getType()->getHealthbarThickness(); + if(unit->getType()->getMaxEp() > 0) { + healthbarthickness=healthbarthickness*2; } - if(unit->getType()->getMaxEp() > 0 && unit->getType()->isHealthbarShowEp()) { - renderSelectionHpBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),thickness,unit->getEpRatio()); + if(unit->getType()->getMaxEp() > 0) { + renderSelectionHpBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,unit->getEpRatio()); } else { - renderSelectionHpBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),thickness); + renderSelectionHpBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness); } } } @@ -8293,6 +8307,7 @@ void Renderer::renderSelectionHpBar(Vec3f v, int size, float hp, float height, f hp=hp*2-1; ep=ep*2-1; + //from green to yellow to red if(hp >= 0.0f) { green=brightness; red=brightness-hp*brightness; @@ -8304,26 +8319,28 @@ void Renderer::renderSelectionHpBar(Vec3f v, int size, float hp, float height, f glColor4f(red,green,0.0f,0.4f); glBegin(GL_QUADS); if(ep < -2.0f) { + //hpbar glVertex3fv((v - (rightVector*width - upVector*height)).ptr()); glVertex3fv((v - (rightVector*width + upVector*height)).ptr()); glVertex3fv((v + (rightVector*hp*width - upVector*height)).ptr()); glVertex3fv((v + (rightVector*hp*width + upVector*height)).ptr()); } else { + //hpbar glVertex3fv((v - (rightVector*width - upVector*height)).ptr()); glVertex3fv((v - (rightVector*width + upVector*height*0.0f)).ptr()); glVertex3fv((v + (rightVector*hp*width - upVector*height*0.0f)).ptr()); glVertex3fv((v + (rightVector*hp*width + upVector*height)).ptr()); - + //epbar glColor4f(brightness,0,brightness,0.4f); glVertex3fv((v - (rightVector*width + upVector*height*0.0f)).ptr()); glVertex3fv((v - (rightVector*width + upVector*height)).ptr()); glVertex3fv((v + (rightVector*ep*width - upVector*height)).ptr()); glVertex3fv((v + (rightVector*ep*width - upVector*height*0.0f)).ptr()); - printf("Found Ep Unit\n"); } glEnd(); + //border glColor4f(red+0.1f,green+0.1f,0.1f,0.5f); glBegin(GL_LINE_LOOP); glVertex3fv((v - (rightVector*width - upVector*height)).ptr()); diff --git a/source/glest_game/types/faction_type.cpp b/source/glest_game/types/faction_type.cpp index bd8ae23f..1c335ef7 100644 --- a/source/glest_game/types/faction_type.cpp +++ b/source/glest_game/types/faction_type.cpp @@ -34,6 +34,9 @@ FactionType::FactionType() { music = NULL; personalityType = fpt_Normal; isLinked = false; + healthbarheight= -100.0f; + healthbarthickness= 0.05f; + healthbarVisible=hbvUndefined; } //load a faction, given a directory @@ -272,6 +275,35 @@ void FactionType::load(const string &factionName, const TechTree *techTree, Chec loadedFileList[musicNode->getAttribute("path")->getRestrictedValue(currentPath)].push_back(make_pair(path,musicNode->getAttribute("path")->getRestrictedValue())); } + //healthbar + if(factionNode->hasChild("healthbar")) { + const XmlNode *HealthbarNode= factionNode->getChild("healthbar"); + if(HealthbarNode->hasChild("height")) { + healthbarheight= HealthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); + } + if(HealthbarNode->hasChild("thickness")) { + healthbarthickness= HealthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); + } + if(HealthbarNode->hasChild("visible")) { + string healthbarVisibleString=HealthbarNode->getChild("visible")->getAttribute("value")->getValue(); + vector v=split(healthbarVisibleString,"|"); + for (int i = 0; i < (int)v.size(); ++i) { + string current=trim(v[i]); + if(current=="always") { + healthbarVisible=healthbarVisible|hbvAlways; + } else if(current=="selected") { + healthbarVisible=healthbarVisible|hbvSelected; + } else if(current=="damaged") { + healthbarVisible=healthbarVisible|hbvDamaged; + } else if(current=="off") { + healthbarVisible=healthbarVisible|hbvOff; + } else { + throw megaglest_runtime_error("Unknown Healthbar Visible Option: " + current, validationMode); + } + } + } + } + //read ai behavior if(factionNode->hasChild("ai-behavior") == true) { const XmlNode *aiNode= factionNode->getChild("ai-behavior"); diff --git a/source/glest_game/types/faction_type.h b/source/glest_game/types/faction_type.h index 47641598..909e9571 100644 --- a/source/glest_game/types/faction_type.h +++ b/source/glest_game/types/faction_type.h @@ -95,6 +95,10 @@ private: std::map mapAIBehaviorStaticOverrideValues; bool isLinked; + float healthbarheight; + float healthbarthickness; + int healthbarVisible; + public: //init @@ -120,6 +124,10 @@ public: int getStartingUnitCount() const {return (int)startingUnits.size();} const UnitType *getStartingUnit(int i) const {return startingUnits[i].first;} int getStartingUnitAmount(int i) const {return startingUnits[i].second;} + inline float getHealthbarHeight() const {return healthbarheight;} + inline float getHealthbarThickness() const {return healthbarthickness;} + inline int getHealthbarVisible() const {return healthbarVisible;} + const UnitType *getUnitType(const string &name) const; const UnitType *getUnitTypeById(int id) const; diff --git a/source/glest_game/types/unit_type.cpp b/source/glest_game/types/unit_type.cpp index cc3b5b18..74c3cab6 100644 --- a/source/glest_game/types/unit_type.cpp +++ b/source/glest_game/types/unit_type.cpp @@ -88,11 +88,9 @@ UnitType::UnitType() : ProducibleType() { meetingPointImage = NULL; lightColor= Vec3f(0.f); light= false; - healthbar= false; - healthbarShowEp= true; healthbarheight= -100.0f; healthbarthickness=-1.0f; - healthbarVisible=hbvUndefined; //TODO Implement default + healthbarVisible=hbvUndefined; multiSelect= false; commandable= true; armorType= NULL; @@ -454,32 +452,27 @@ void UnitType::loaddd(int id,const string &dir, const TechTree *techTree, //healthbar if(parametersNode->hasChild("healthbar")) { const XmlNode *HealthbarNode= parametersNode->getChild("healthbar"); - healthbar= HealthbarNode->getAttribute("enabled")->getBoolValue(); - if(healthbar){ - if(HealthbarNode->hasAttribute("show-ep")) { - healthbarShowEp= HealthbarNode->getAttribute("show-ep")->getBoolValue(); - } - if(HealthbarNode->hasAttribute("height")) { - healthbarheight= HealthbarNode->getAttribute("height")->getFloatValue(); - } - if(HealthbarNode->hasAttribute("thickness")) { - healthbarthickness= HealthbarNode->getAttribute("thickness")->getFloatValue(0.f, 1.f); - } - if(HealthbarNode->hasAttribute("visible")) { - string healthbarVisibleString=HealthbarNode->getAttribute("visible")->getValue(); - healthbarVisible=hbvUndefined; - vector v=split(healthbarVisibleString,"|"); - for (int i = 0; i < (int)v.size(); ++i) { - string current=trim(v[i]); - if(current=="always") { - healthbarVisible=healthbarVisible|hbvAlways; - } else if(current=="selected") { - healthbarVisible=healthbarVisible|hbvSelected; - } else if(current=="damaged") { - healthbarVisible=healthbarVisible|hbvDamaged; - } else { - throw megaglest_runtime_error("Unknown Healthbar Visible Option: " + current, validationMode); - } + if(HealthbarNode->hasChild("height")) { + healthbarheight= HealthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); + } + if(HealthbarNode->hasChild("thickness")) { + healthbarthickness= HealthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); + } + if(HealthbarNode->hasChild("visible")) { + string healthbarVisibleString=HealthbarNode->getChild("visible")->getAttribute("value")->getValue(); + vector v=split(healthbarVisibleString,"|"); + for (int i = 0; i < (int)v.size(); ++i) { + string current=trim(v[i]); + if(current=="always") { + healthbarVisible=healthbarVisible|hbvAlways; + } else if(current=="selected") { + healthbarVisible=healthbarVisible|hbvSelected; + } else if(current=="damaged") { + healthbarVisible=healthbarVisible|hbvDamaged; + } else if(current=="off") { + healthbarVisible=healthbarVisible|hbvOff; + } else { + throw megaglest_runtime_error("Unknown Healthbar Visible Option: " + current, validationMode); } } } diff --git a/source/glest_game/types/unit_type.h b/source/glest_game/types/unit_type.h index df61bdd8..27e5aa33 100644 --- a/source/glest_game/types/unit_type.h +++ b/source/glest_game/types/unit_type.h @@ -118,9 +118,10 @@ typedef vector DamageParticleSystemTypes; enum HealthbarVisible { hbvUndefined=0, - hbvAlways=1, - hbvDamaged=2, - hbvSelected=4 + hbvOff=1, + hbvAlways=2, + hbvDamaged=4, + hbvSelected=8 }; enum UnitCountsInVictoryConditions { @@ -177,8 +178,6 @@ private: const ArmorType *armorType; bool light; Vec3f lightColor; - bool healthbar; - bool healthbarShowEp; float healthbarheight; float healthbarthickness; int healthbarVisible; @@ -268,8 +267,6 @@ public: inline bool getLight() const {return light;} inline bool getRotationAllowed() const {return rotationAllowed;} inline Vec3f getLightColor() const {return lightColor;} - inline bool isHealthbarEnabled() const {return healthbar;} - inline bool isHealthbarShowEp() const {return healthbarShowEp;} inline float getHealthbarHeight() const {return healthbarheight;} inline float getHealthbarThickness() const {return healthbarthickness;} inline int getHealthbarVisible() const {return healthbarVisible;}