Browse Source

Moving some work in progress from one computer to another. It shall not explode.

Fixed video issue from #670.
DjWarmonger 14 years ago
parent
commit
094bb6fd8f

+ 5 - 0
AI/GeniusAI/ExpertSystem.cpp

@@ -109,6 +109,11 @@ void BonusRule::fireRule()
 	}
 	//TODO: add new fact or modify existing one
 }
+
+TLogic operator&&(const TLogic &first, const TLogic &second)
+{
+	return LogicConjunction(first, second);
+}
 //TODO: find out why it does not compile
 //template <typename input, typename conType> void Rule<input, conType>::refreshRule(std::set<conType> &conditionSet)
 //{

+ 20 - 4
AI/GeniusAI/ExpertSystem.h

@@ -17,13 +17,14 @@ struct Bonus;
 template <typename fact> class AIholder;
 template <typename input, typename output> class Rule;
 typedef Rule<Bonus, Bonus> BRule;
+typedef boost::function<bool(int, si32)> TLogic;
 bool greaterThan (int prop, si32 val);
 
 enum conditionType {LESS_THAN, EQUAL, GREATER_THAN, UNEQUAL, PRESENT};
 
 template <typename ruleType, typename fact> class ExpertSystemShell
 {
-	enum runType {ANY_GOAL, TRESHOLD, FULL};
+	enum runType {ANY_GOAL, TRESHOLD, FULL}; //Treshold - stop when received decision has high AI value
 private:
 	ICallback* m_cb;
 protected:
@@ -53,12 +54,12 @@ public:
 };
 
 template <typename input> class condition
-{//compares selected object parameter with value using functor. universal logic handler
+{//compares selected object parameter with value using functor. universal (?) logic handler
 public:
 	input object; //what the fact is, or what it's like (CSelector)
 	si32 value;
 	ui8 parameter;
-	boost::function<bool(int,si32)> functor; //value of selected parameter, condition value
+	TLogic functor; //value of selected parameter, condition value
 
 	condition(){object = NULL; value = 0; parameter = 0; functor = greaterThan;};
 
@@ -142,7 +143,7 @@ protected:
 	void fireRule();
 };
 
-inline bool greaterThan (int prop, si32 val)
+inline bool greaterThan (int prop, si32 val) //does it make any sense to keep functors inline?
 {
 	if ((si32)prop > val)
 		return true;
@@ -172,6 +173,21 @@ inline bool present (int prop, si32 val=0)
 	return(prop); //unfixable warning :(
 }
 
+class LogicConjunction
+{
+	const TLogic first, second; //TODO: universal argument list of functions?
+public:
+	LogicConjunction(const TLogic First, const TLogic Second)
+		:first(First), second(Second)
+	{
+	}
+	bool operator()(int prop, si32 val) const
+	{
+		return first(prop,val) && second(prop,val); //TODO: 
+	}
+};
+TLogic operator&&(const TLogic &first, const TLogic &second);
+
 class KnowledgeHandler///I'd opt for one omniscent knowledge manager, so no templates here
 {
 public:

+ 27 - 0
config/bonusnames.txt

@@ -0,0 +1,27 @@
+"Bonus"	"Name (24 characters?)"	"Description"
+"FLYING"	"Fly"	"Can Fly (ignores obstacles)"
+"UNLIMITED_RETALIATIONS"	"Unlimited retaliations"	"May retaliate any number of attacks"
+"SHOOTER"	"Ranged"	"Creature can make a Ranged Attack"
+"FREE_SHOOTING"	"Shoot Close"	"Can make a Ranged Attack in Close Combat"
+"NO_SHOTING_PENALTY"	"?"	"???"
+"NO_MELEE_PENALTY"	"No melee penalty"	"Creature has no Melee Penalty"
+"NO_DISTANCE_PENALTY"	"No distance penalty"	"Does full ranged damage from any distance"
+"NO_OBSTACLES_PENALTY"	"No obstacle penalty"	"Creature has no Obstacle Penalty"
+"JOUSTING"	"Champion"	"Champion Distance Bonus (+5% damage per square travelled)"
+"RETURN_AFTER_STRIKE"	"Attack and Return"	"Returns to starting position after making a melee attack"
+"BLOCKS_RETALIATION"	"No retaliation"	"Enemy cannot Retaliate"
+"TWO_HEX_ATTACK_BREATH"	"Breath"	"Creature has a Breath Attack (2-hex range)"
+"THREE_HEADED_ATTACK"	"Three-headed attack"	"Creature attacks three adjacent units"
+"ATTACKS_ALL_ADJACENT"	"Attack all around"	"Creature attacks all adjacent enemies"
+"FULL_HP_REGENERATION"	"Regeneration"	"May Regenerate full Health"
+"LIFE_DRAIN"	"Drain life"	"Drains life equal to damage dealt"
+"SELF_MORALE"	"Positive morale"	"Always has Positive Morale"
+"SELF_LUCK"	"Positive luck"	"Always has Positive Luck"
+"FEAR"	"Fear"	"Has a chance to cause Fear on an enemy stack"
+"FEARLESS"	"Fearless"	"Immune to Fear ability"
+"CHARGE_IMMUNITY"	"Immune to Charge"	"Immune to Champion charge bonus"
+"HEALER"	"Healer"	"Heals allied units"
+"CATAPULT "	"Catapult"	"Attacks siege walls"
+"DRAGON_NATURE"	"Dragon"	"Creature has a Dragon Nature"
+"NON_LIVING"	"Non living"	"Creature is immune to effects affecting Living units"
+"UNDEAD"	"Undead"	"Creature is Undead"

+ 2 - 0
global.h

@@ -16,6 +16,8 @@ typedef boost::int16_t si16; //signed int 16 bits (2 bytes)
 typedef boost::int8_t si8; //signed int 8 bits (1 byte)
 typedef si64 expType;
 typedef ui16 spelltype;
+typedef ui8 TBonusType;
+typedef si32 TBonusSubtype;
 #include "int3.h"
 #include <map>
 #include <vector>

+ 3 - 0
hch/CGeneralTextHandler.h

@@ -74,6 +74,9 @@ public:
 	std::vector <std::vector <std::string> > skillInfoTexts; //[id][level] : level 0 - basic; 2 - advanced
 	std::vector<std::string> levels;
 
+	//bonuses
+	std::map<TBonusType, std::pair<std::string, std::string>> stackBonuses; // bonus => name, description
+
 	//campaigns
 	std::vector <std::string> campaignMapNames;
 	std::vector < std::vector <std::string> > campaignRegionNames;

+ 1 - 0
hch/CSndHandler.cpp

@@ -46,6 +46,7 @@ void CMediaHandler::extract(int index, std::string dstfile) //saves selected fil
 
 void CMediaHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file
 {
+	srcfile.erase(srcfile.find_last_of('.'));
 	if (caseSens)
 	{
 		for (size_t i=0;i<entries.size();++i)

+ 50 - 0
lib/CCreatureSet.cpp

@@ -277,6 +277,56 @@ void CStackInstance::getParents(TCNodes &out, const CBonusSystemNode *source /*=
 	else
 		out.insert(&IObjectInterface::cb->gameState()->globalEffects);
 }
+std::string CStackInstance::bonusToString(Bonus *bonus, bool description) const
+{
+	std::map<TBonusType, std::pair<std::string, std::string>>::iterator it = VLC->generaltexth->stackBonuses.find(bonus->type);
+	if (it != VLC->generaltexth->stackBonuses.end())
+	{
+		std::string text;
+		if (description)
+		{
+			text = it->second.second;
+			switch (bonus->type)
+			{
+				//no additional modifiers needed
+				case Bonus::FLYING:
+				case Bonus::UNLIMITED_RETALIATIONS:
+				case Bonus::SHOOTER:
+				case Bonus::FREE_SHOOTING:
+				case Bonus::NO_SHOTING_PENALTY:
+				case Bonus::NO_MELEE_PENALTY:
+				case Bonus::NO_DISTANCE_PENALTY:
+				case Bonus::NO_OBSTACLES_PENALTY:
+				case Bonus::JOUSTING: //TODO: percent bonus?
+				case Bonus::RETURN_AFTER_STRIKE:
+				case Bonus::BLOCKS_RETALIATION:
+				case Bonus::TWO_HEX_ATTACK_BREATH:
+				case Bonus::THREE_HEADED_ATTACK:
+				case Bonus::ATTACKS_ALL_ADJACENT:
+				case Bonus::FULL_HP_REGENERATION:
+				case Bonus::LIFE_DRAIN: //TODO: chance, hp percentage?
+				case Bonus::SELF_MORALE:
+				case Bonus::SELF_LUCK:
+				case Bonus::FEAR:
+				case Bonus::FEARLESS:
+				case Bonus::CHARGE_IMMUNITY:
+				case Bonus::HEALER:
+				case Bonus::CATAPULT:
+				case Bonus::DRAGON_NATURE:
+				case Bonus::NON_LIVING:
+				case Bonus::UNDEAD:
+				break;
+			}
+		}
+		else
+		{
+			text = it->second.first;
+		}
+		return text;
+	}
+	else
+		return "";
+}
 
 std::string CStackInstance::getQuantityTXT(bool capitalized /*= true*/) const
 {

+ 1 - 0
lib/CCreatureSet.h

@@ -36,6 +36,7 @@ public:
 
 	//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
+	std::string bonusToString(Bonus *bonus, bool description) const; // how would bonus description look for this particular type of node
 
 	int getQuantityID() const;
 	std::string getQuantityTXT(bool capitalized = true) const;

+ 2 - 5
lib/HeroBonus.h

@@ -15,10 +15,6 @@
  *
  */
 
-
-typedef ui8 TBonusType;
-typedef si32 TBonusSubtype;
-
 class CCreature;
 class CSpell;
 struct Bonus;
@@ -363,7 +359,8 @@ public:
 	int getBonusesCount(const CSelector &selector, const CBonusSystemNode *root = NULL) const;
 	int valOfBonuses(const CSelector &selector, const CBonusSystemNode *root = NULL) const;
 	bool hasBonus(const CSelector &selector, const CBonusSystemNode *root = NULL) const;
-	void getModifiersWDescr(TModDescr &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;  //out: pairs<modifier value, modifier description>
+	void getModifiersWDescr(TModDescr &out, const CSelector &selector, const CBonusSystemNode *root = NULL) const;  //out: pairs<modifier value, modifier description>* 
+	virtual std::string bonusToString(Bonus *bonus, bool description) const {return "";}; //description or bonus name
 
 	//////////////////////////////////////////////////////////////////////////
 	//legacy interface