浏览代码

add skill cheat

Laserlicht 4 月之前
父节点
当前提交
1659b225c6

+ 9 - 0
docs/players/Cheat_Codes.md

@@ -10,6 +10,15 @@ To use cheat code, press `Tab` key or click/tap on status bar to open game chat
 
 `nwcthereisnospoon`, `nwcmidichlorians`, `nwctim`, `vcmiistari` or `vcmispells` - give a spell book, all spells and 999 mana to currently selected hero. Also allows casting spell up to 100 times per combat round
 
+### Secondary Skills
+
+`vcmiskill <skillID> <mastery>` - give a secondary skill to currently selected hero
+
+Examples:
+`vcmiskill learning` - give expert level learning skill
+`vcmiskill leadership 2` - give advanced level leadership skill
+`vcmiskill wisdom 0` - remove wisdom skill
+
 ### Army
 
 `nwctrinity`, `nwcpadme`, `nwcavertingoureyes`, `vcmiainur` or `vcmiarchangel` - give 5 Archangels in every empty slot (to currently selected hero)  

+ 44 - 5
server/processors/PlayerMessageProcessor.cpp

@@ -18,6 +18,7 @@
 
 #include "../../lib/CPlayerState.h"
 #include "../../lib/StartInfo.h"
+#include "../../lib/constants/Enumerations.h"
 #include "../../lib/entities/artifact/CArtHandler.h"
 #include "../../lib/entities/building/CBuilding.h"
 #include "../../lib/entities/hero/CHeroHandler.h"
@@ -694,6 +695,41 @@ void PlayerMessageProcessor::cheatMaxMorale(PlayerColor player, const CGHeroInst
 	gameHandler->giveHeroBonus(&gb);
 }
 
+void PlayerMessageProcessor::cheatSkill(PlayerColor player, const CGHeroInstance * hero, std::vector<std::string> words)
+{
+	if (!hero)
+		return;
+
+	std::string identifier;
+	try
+	{
+		identifier = words.at(0);
+	}
+	catch(std::logic_error&)
+	{
+		return;
+	}
+
+	MasteryLevel::Type mastery;
+	try
+	{
+		mastery = static_cast<MasteryLevel::Type>(std::stoi(words.at(1)));
+	}
+	catch(std::logic_error&)
+	{
+		mastery = MasteryLevel::Type::EXPERT;
+	}
+
+	std::optional<int32_t> skillId = LIBRARY->identifiers()->getIdentifier(ModScope::scopeGame(), "skill", identifier, false);
+
+	if(!skillId.has_value())
+		return;
+	
+	auto skill = SecondarySkill(skillId.value());
+
+	gameHandler->changeSecSkill(hero, skill, mastery, ChangeValueMode::ABSOLUTE);
+}
+
 bool PlayerMessageProcessor::handleCheatCode(const std::string & cheat, PlayerColor player, ObjectInstanceID currObj)
 {
 	std::vector<std::string> words;
@@ -736,7 +772,8 @@ bool PlayerMessageProcessor::handleCheatCode(const std::string & cheat, PlayerCo
 		                           "vcmiluck",        "nwcfollowthewhiterabbit",                       "nwccastleanthrax",
 		                           "vcmimorale",      "nwcmorpheus",                                   "nwcmuchrejoicing",
 		                           "vcmigod",         "nwctheone",
-		                           "vcmiscrolls"
+		                           "vcmiscrolls",
+		                           "vcmiskill"
 	};
 
 	if(vstd::contains(localCheats, cheatName))
@@ -829,7 +866,8 @@ void PlayerMessageProcessor::executeCheatCode(const std::string & cheatName, Pla
 		cheatMovement(player, hero, { });
 		cheatFly(player, hero);
 	};
-	const auto & doColorSchemeChange = [&](ColorScheme filter) { cheatColorSchemeChange(player, filter); };
+	const auto & doCheatColorSchemeChange = [&](ColorScheme filter) { cheatColorSchemeChange(player, filter); };
+	const auto & doCheatSkill = [&]() { cheatSkill(player, hero, words); };
 
 	std::map<std::string, std::function<void()>> callbacks = {
 		{"vcmiainur",               [&] () {doCheatGiveArmyFixed({ "archangel", "5" });}        },
@@ -909,9 +947,10 @@ void PlayerMessageProcessor::executeCheatCode(const std::string & cheatName, Pla
 		{"vcmigod",                 doCheatTheOne                                               },
 		{"nwctheone",               doCheatTheOne                                               },
 		{"vcmiscrolls",             doCheatGiveScrolls                                          },
-		{"vcmicolor",               [&] () {doColorSchemeChange(ColorScheme::H2_SCHEME);}       },
-		{"nwcphisherprice",         [&] () {doColorSchemeChange(ColorScheme::H2_SCHEME);}       },
-		{"vcmigray",                [&] () {doColorSchemeChange(ColorScheme::GRAYSCALE);}       },
+		{"vcmicolor",               [&] () {doCheatColorSchemeChange(ColorScheme::H2_SCHEME);}  },
+		{"nwcphisherprice",         [&] () {doCheatColorSchemeChange(ColorScheme::H2_SCHEME);}  },
+		{"vcmigray",                [&] () {doCheatColorSchemeChange(ColorScheme::GRAYSCALE);}  },
+		{"vcmiskill",               doCheatSkill                                                },
 	};
 
 	assert(callbacks.count(cheatName));

+ 1 - 0
server/processors/PlayerMessageProcessor.h

@@ -59,6 +59,7 @@ class PlayerMessageProcessor
 	void cheatMaxLuck(PlayerColor player, const CGHeroInstance * hero);
 	void cheatMaxMorale(PlayerColor player, const CGHeroInstance * hero);
 	void cheatFly(PlayerColor player, const CGHeroInstance * hero);
+	void cheatSkill(PlayerColor player, const CGHeroInstance * hero, std::vector<std::string> words);
 
 	void commandExit(PlayerColor player, const std::vector<std::string> & words);
 	void commandKick(PlayerColor player, const std::vector<std::string> & words);