Browse Source

Commander skill description support (#266)

* Added commander skill description support

* Add support for ZNPC00.txt not found
Dydzio 8 years ago
parent
commit
5127061e28

+ 45 - 9
client/windows/CCreatureWindow.cpp

@@ -435,17 +435,31 @@ void CStackWindow::CWindowSection::createCommander()
 		return skillToFile(skillIndex, parent->info->commander->secondarySkills[skillIndex], selected);
 	};
 
+	auto getSkillDescription = [this](int skillIndex) -> std::string
+	{
+		if (CGI->generaltexth->znpc00.size() == 0)
+			return "";
+
+		return CGI->generaltexth->znpc00[151 + (12 * skillIndex) + (parent->info->commander->secondarySkills[skillIndex] * 2)];
+	};
+
 	for (int index = ECommander::ATTACK; index <= ECommander::SPELL_POWER; ++index)
 	{
 		Point skillPos = getSkillPos(index);
 
-		auto icon = new CClickableObject(new CPicture(getSkillImage(index), skillPos.x, skillPos.y), [=]{});
+		auto icon = new CCommanderSkillIcon(new CPicture(getSkillImage(index), skillPos.x, skillPos.y),
+			[=] { LOCPLINT->showInfoDialog(getSkillDescription(index)); });
+
+		icon->text = getSkillDescription(index); //used to handle right click description via LRClickableAreaWText::ClickRight()
 
-		if (parent->selectedSkill == index)
+		if(parent->selectedSkill == index)
 			parent->selectedIcon = icon;
 
-		if (parent->info->levelupInfo && vstd::contains(parent->info->levelupInfo->skills, index)) // can be upgraded - enable selection switch
+		if(parent->info->levelupInfo && vstd::contains(parent->info->levelupInfo->skills, index)) // can be upgraded - enable selection switch
 		{
+			if(parent->selectedSkill == index)
+				parent->setSelection(index, icon);
+
 			icon->callback = [=]
 			{
 				parent->setSelection(index, icon);
@@ -472,7 +486,7 @@ CIntObject * CStackWindow::createSkillEntry(int index)
 		{
 			const auto bonus = CGI->creh->skillRequirements[skillID-100].first;
 			const CStackInstance *stack = info->commander;
-			CClickableObject * icon = new CClickableObject(new CPicture(stack->bonusToGraphics(bonus)), []{});
+			CCommanderSkillIcon * icon = new CCommanderSkillIcon(new CPicture(stack->bonusToGraphics(bonus)), []{});
 			icon->callback = [=]
 			{
 				setSelection(skillID, icon);
@@ -518,8 +532,19 @@ void CStackWindow::CWindowSection::createCommanderAbilities()
 	}
 }
 
-void CStackWindow::setSelection(si32 newSkill, CClickableObject * newIcon)
+void CStackWindow::setSelection(si32 newSkill, CCommanderSkillIcon * newIcon)
 {
+	auto getSkillDescription = [this](int skillIndex, bool selected) -> std::string
+	{
+		if (CGI->generaltexth->znpc00.size() == 0)
+			return "";
+
+		if(selected)
+			return CGI->generaltexth->znpc00[151 + (12 * skillIndex) + ((info->commander->secondarySkills[skillIndex] + 1) * 2)]; //upgrade description
+		else
+			return CGI->generaltexth->znpc00[151 + (12 * skillIndex) + (info->commander->secondarySkills[skillIndex] * 2)];
+	};
+
 	auto getSkillImage = [this](int skillIndex) -> std::string
 	{
 		bool selected = ((selectedSkill == skillIndex) && info->levelupInfo );
@@ -533,9 +558,14 @@ void CStackWindow::setSelection(si32 newSkill, CClickableObject * newIcon)
 	if (selectedIcon && oldSelection < 100) // recreate image on old selection, only for skills
 		selectedIcon->setObject(new CPicture(getSkillImage(oldSelection)));
 
+	selectedIcon->text = getSkillDescription(oldSelection, false); //update previously selected icon's message to existing skill level
+
 	selectedIcon = newIcon; // update new selection
 	if (newSkill < 100)
+	{
 		newIcon->setObject(new CPicture(getSkillImage(newSkill)));
+		newIcon->text = getSkillDescription(newSkill, true); //update currently selected icon's message to show upgrade description
+	}
 }
 
 void CStackWindow::CWindowSection::createBonuses(boost::optional<size_t> preferredSize)
@@ -646,7 +676,7 @@ CStackWindow::CWindowSection::CWindowSection(CStackWindow * parent):
 {
 }
 
-CClickableObject::CClickableObject(CIntObject *object, std::function<void()> callback):
+CCommanderSkillIcon::CCommanderSkillIcon(CIntObject *object, std::function<void()> callback):
 	object(nullptr),
 	callback(callback)
 {
@@ -654,7 +684,7 @@ CClickableObject::CClickableObject(CIntObject *object, std::function<void()> cal
 	setObject(object);
 }
 
-void CClickableObject::setObject(CIntObject *newObject)
+void CCommanderSkillIcon::setObject(CIntObject *newObject)
 {
 	delete object;
 	object = newObject;
@@ -663,12 +693,18 @@ void CClickableObject::setObject(CIntObject *newObject)
 	redraw();
 }
 
-void CClickableObject::clickLeft(tribool down, bool previousState)
+void CCommanderSkillIcon::clickLeft(tribool down, bool previousState)
 {
-	if (down)
+	if(down)
 		callback();
 }
 
+void CCommanderSkillIcon::clickRight(tribool down, bool previousState)
+{
+	if(down)
+		LRClickableAreaWText::clickRight(down, previousState);
+}
+
 CIntObject * CStackWindow::createBonusEntry(size_t index)
 {
 	auto section = new CWindowSection(this);

+ 6 - 6
client/windows/CCreatureWindow.h

@@ -22,16 +22,16 @@ struct UpgradeInfo;
 class CTabbedInt;
 class CButton;
 
-class CClickableObject : public LRClickableAreaWText
+class CCommanderSkillIcon : public LRClickableAreaWText //TODO: maybe bring commander skill button initialization logic inside?
 {
 	CIntObject * object; // passive object that will be used to determine clickable area
 public:
-	CClickableObject(CIntObject * object, std::function<void()> callback);
+	CCommanderSkillIcon(CIntObject * object, std::function<void()> callback);
 
-	std::function<void()> callback; //TODO: create more generic clickable class than AdvMapButton?
+	std::function<void()> callback;
 
 	void clickLeft(tribool down, bool previousState) override;
-	//void clickRight(tribool down, bool previousState){};
+	void clickRight(tribool down, bool previousState) override;
 
 	void setObject(CIntObject * object);
 };
@@ -83,8 +83,8 @@ class CStackWindow : public CWindowObject
 
 	std::map<int, CButton *> switchButtons;
 
-	void setSelection(si32 newSkill, CClickableObject * newIcon);
-	CClickableObject * selectedIcon;
+	void setSelection(si32 newSkill, CCommanderSkillIcon * newIcon);
+	CCommanderSkillIcon * selectedIcon;
 	si32 selectedSkill;
 
 	CIntObject * createBonusEntry(size_t index);

+ 17 - 0
lib/CGeneralTextHandler.cpp

@@ -490,4 +490,21 @@ CGeneralTextHandler::CGeneralTextHandler()
 		}
 		while (parser.endLine());
 	}
+	if (VLC->modh->modules.COMMANDERS)
+	{
+		try
+		{
+			CLegacyConfigParser parser("DATA/ZNPC00.TXT");
+			parser.endLine();//header
+
+			do
+			{
+				znpc00.push_back(parser.readString());
+			} while (parser.endLine());
+		}
+		catch (std::runtime_error)
+		{
+			logGlobal->warn("WoG file ZNPC00.TXT containing commander texts was not found");
+		}
+	}
 }

+ 2 - 0
lib/CGeneralTextHandler.h

@@ -135,6 +135,8 @@ public:
 	std::vector<std::vector<std::string>> skillInfoTexts; //[id][level] : level 0 - basic; 2 - advanced
 	std::vector<std::string> levels;
 	std::vector<std::string> zcrexp; //more or less useful content of that file
+	//commanders
+	std::vector<std::string> znpc00; //more or less useful content of that file
 
 	//campaigns
 	std::vector<std::string> campaignMapNames;