mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Merge pull request #2013 from krs0/feature/Split_processCommand_into_functions
Split Process console commands code into individual functions
This commit is contained in:
@@ -42,7 +42,34 @@
|
|||||||
|
|
||||||
#include <SDL_surface.h>
|
#include <SDL_surface.h>
|
||||||
|
|
||||||
void ClientCommandManager::handleGoSolo()
|
void ClientCommandManager::handleQuitCommand()
|
||||||
|
{
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleSaveCommand(std::istringstream & singleWordBuffer)
|
||||||
|
{
|
||||||
|
if(!CSH->client)
|
||||||
|
{
|
||||||
|
printCommandMessage("Game is not in playing state");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string saveFilename;
|
||||||
|
singleWordBuffer >> saveFilename;
|
||||||
|
CSH->client->save(saveFilename);
|
||||||
|
printCommandMessage("Game saved as: " + saveFilename);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleLoadCommand(std::istringstream& singleWordBuffer)
|
||||||
|
{
|
||||||
|
// TODO: this code should end the running game and manage to call startGame instead
|
||||||
|
//std::string fname;
|
||||||
|
//singleWordBuffer >> fname;
|
||||||
|
//CSH->client->loadGame(fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleGoSoloCommand()
|
||||||
{
|
{
|
||||||
Settings session = settings.write["session"];
|
Settings session = settings.write["session"];
|
||||||
|
|
||||||
@@ -80,21 +107,33 @@ void ClientCommandManager::handleGoSolo()
|
|||||||
session["aiSolo"].Bool() = !session["aiSolo"].Bool();
|
session["aiSolo"].Bool() = !session["aiSolo"].Bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCommandManager::handleControlAi(const std::string &colorName)
|
void ClientCommandManager::handleAutoskipCommand()
|
||||||
{
|
{
|
||||||
|
Settings session = settings.write["session"];
|
||||||
|
session["autoSkip"].Bool() = !session["autoSkip"].Bool();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleControlaiCommand(std::istringstream& singleWordBuffer)
|
||||||
|
{
|
||||||
|
std::string colorName;
|
||||||
|
singleWordBuffer >> colorName;
|
||||||
|
boost::to_lower(colorName);
|
||||||
|
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
||||||
if(!CSH->client)
|
if(!CSH->client)
|
||||||
{
|
{
|
||||||
printCommandMessage("Game is not in playing state");
|
printCommandMessage("Game is not in playing state");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerColor color;
|
PlayerColor color;
|
||||||
if(LOCPLINT)
|
if(LOCPLINT)
|
||||||
color = LOCPLINT->playerID;
|
color = LOCPLINT->playerID;
|
||||||
|
|
||||||
for(auto & elem : CSH->client->gameState()->players)
|
for(auto & elem : CSH->client->gameState()->players)
|
||||||
{
|
{
|
||||||
if(elem.second.human || (colorName.length() &&
|
if(elem.second.human ||
|
||||||
elem.first.getNum() != vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, colorName)))
|
(colorName.length() && elem.first.getNum() != vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, colorName)))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -102,28 +141,40 @@ void ClientCommandManager::handleControlAi(const std::string &colorName)
|
|||||||
CSH->client->removeGUI();
|
CSH->client->removeGUI();
|
||||||
CSH->client->installNewPlayerInterface(std::make_shared<CPlayerInterface>(elem.first), elem.first);
|
CSH->client->installNewPlayerInterface(std::make_shared<CPlayerInterface>(elem.first), elem.first);
|
||||||
}
|
}
|
||||||
|
|
||||||
GH.totalRedraw();
|
GH.totalRedraw();
|
||||||
if(color != PlayerColor::NEUTRAL)
|
if(color != PlayerColor::NEUTRAL)
|
||||||
giveTurn(color);
|
giveTurn(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCommandManager::processCommand(const std::string &message, bool calledFromIngameConsole)
|
void ClientCommandManager::handleSetBattleAICommand(std::istringstream& singleWordBuffer)
|
||||||
{
|
{
|
||||||
std::istringstream singleWordBuffer;
|
std::string aiName;
|
||||||
singleWordBuffer.str(message);
|
singleWordBuffer >> aiName;
|
||||||
std::string commandName;
|
|
||||||
singleWordBuffer >> commandName;
|
|
||||||
currentCallFromIngameConsole = calledFromIngameConsole;
|
|
||||||
|
|
||||||
if(message==std::string("die, fool"))
|
printCommandMessage("Will try loading that AI to see if it is correct name...\n");
|
||||||
|
try
|
||||||
{
|
{
|
||||||
exit(EXIT_SUCCESS);
|
if(auto ai = CDynLibHandler::getNewBattleAI(aiName)) //test that given AI is indeed available... heavy but it is easy to make a typo and break the game
|
||||||
|
{
|
||||||
|
Settings neutralAI = settings.write["server"]["neutralAI"];
|
||||||
|
neutralAI->String() = aiName;
|
||||||
|
printCommandMessage("Setting changed, from now the battle ai will be " + aiName + "!\n");
|
||||||
}
|
}
|
||||||
else if(commandName == "redraw")
|
}
|
||||||
|
catch(std::exception &e)
|
||||||
|
{
|
||||||
|
printCommandMessage("Failed opening " + aiName + ": " + e.what(), ELogLevel::WARN);
|
||||||
|
printCommandMessage("Setting not changed, AI not found or invalid!", ELogLevel::WARN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleRedrawCommand()
|
||||||
{
|
{
|
||||||
GH.totalRedraw();
|
GH.totalRedraw();
|
||||||
}
|
}
|
||||||
else if(commandName == "screen")
|
|
||||||
|
void ClientCommandManager::handleScreenCommand()
|
||||||
{
|
{
|
||||||
printCommandMessage("Screenbuf points to ");
|
printCommandMessage("Screenbuf points to ");
|
||||||
|
|
||||||
@@ -137,25 +188,25 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
SDL_SaveBMP(screen, "Screen_c.bmp");
|
SDL_SaveBMP(screen, "Screen_c.bmp");
|
||||||
SDL_SaveBMP(screen2, "Screen2_c.bmp");
|
SDL_SaveBMP(screen2, "Screen2_c.bmp");
|
||||||
}
|
}
|
||||||
else if(commandName == "save")
|
|
||||||
|
void ClientCommandManager::handleNotDialogCommand()
|
||||||
{
|
{
|
||||||
if(!CSH->client)
|
LOCPLINT->showingDialog->setn(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleGuiCommand()
|
||||||
{
|
{
|
||||||
printCommandMessage("Game is not in playing state");
|
for(const auto & child : GH.listInt)
|
||||||
return;
|
{
|
||||||
|
const auto childPtr = child.get();
|
||||||
|
if(const CIntObject * obj = dynamic_cast<const CIntObject*>(childPtr))
|
||||||
|
printInfoAboutInterfaceObject(obj, 0);
|
||||||
|
else
|
||||||
|
printCommandMessage(std::string(typeid(childPtr).name()) + "\n");
|
||||||
}
|
}
|
||||||
std::string fname;
|
|
||||||
singleWordBuffer >> fname;
|
|
||||||
CSH->client->save(fname);
|
|
||||||
}
|
}
|
||||||
// else if(commandName=="load")
|
|
||||||
// {
|
void ClientCommandManager::handleConvertTextCommand()
|
||||||
// // TODO: this code should end the running game and manage to call startGame instead
|
|
||||||
// std::string fname;
|
|
||||||
// singleWordBuffer >> fname;
|
|
||||||
// CSH->client->loadGame(fname);
|
|
||||||
// }
|
|
||||||
else if(message=="convert txt")
|
|
||||||
{
|
{
|
||||||
logGlobal->info("Searching for available maps");
|
logGlobal->info("Searching for available maps");
|
||||||
std::unordered_set<ResourceID> mapList = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident)
|
std::unordered_set<ResourceID> mapList = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident)
|
||||||
@@ -194,12 +245,12 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
|
|
||||||
VLC->generaltexth->dumpAllTexts();
|
VLC->generaltexth->dumpAllTexts();
|
||||||
}
|
}
|
||||||
else if(message=="get config")
|
|
||||||
|
void ClientCommandManager::handleGetConfigCommand()
|
||||||
{
|
{
|
||||||
printCommandMessage("Command accepted.\t");
|
printCommandMessage("Command accepted.\t");
|
||||||
|
|
||||||
const boost::filesystem::path outPath =
|
const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / "configuration";
|
||||||
VCMIDirs::get().userExtractedPath() / "configuration";
|
|
||||||
|
|
||||||
boost::filesystem::create_directories(outPath);
|
boost::filesystem::create_directories(outPath);
|
||||||
|
|
||||||
@@ -234,13 +285,13 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
printCommandMessage("\rExtracting done :)\n");
|
printCommandMessage("\rExtracting done :)\n");
|
||||||
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
||||||
}
|
}
|
||||||
#if SCRIPTING_ENABLED
|
|
||||||
else if(message=="get scripts")
|
void ClientCommandManager::handleGetScriptsCommand()
|
||||||
{
|
{
|
||||||
|
#if SCRIPTING_ENABLED
|
||||||
printCommandMessage("Command accepted.\t");
|
printCommandMessage("Command accepted.\t");
|
||||||
|
|
||||||
const boost::filesystem::path outPath =
|
const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / "scripts";
|
||||||
VCMIDirs::get().userExtractedPath() / "scripts";
|
|
||||||
|
|
||||||
boost::filesystem::create_directories(outPath);
|
boost::filesystem::create_directories(outPath);
|
||||||
|
|
||||||
@@ -256,9 +307,10 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
}
|
}
|
||||||
printCommandMessage("\rExtracting done :)\n");
|
printCommandMessage("\rExtracting done :)\n");
|
||||||
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
else if(message=="get txt")
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleGetTextCommand()
|
||||||
{
|
{
|
||||||
printCommandMessage("Command accepted.\t");
|
printCommandMessage("Command accepted.\t");
|
||||||
|
|
||||||
@@ -286,24 +338,51 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
printCommandMessage("\rExtracting done :)\n");
|
printCommandMessage("\rExtracting done :)\n");
|
||||||
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
printCommandMessage("Extracted files can be found in " + outPath.string() + " directory\n");
|
||||||
}
|
}
|
||||||
else if(commandName == "crash")
|
|
||||||
|
void ClientCommandManager::handleDef2bmpCommand(std::istringstream& singleWordBuffer)
|
||||||
{
|
{
|
||||||
int *ptr = nullptr;
|
std::string URI;
|
||||||
*ptr = 666;
|
singleWordBuffer >> URI;
|
||||||
//disaster!
|
std::unique_ptr<CAnimation> anim = std::make_unique<CAnimation>(URI);
|
||||||
|
anim->preload();
|
||||||
|
anim->exportBitmaps(VCMIDirs::get().userExtractedPath());
|
||||||
}
|
}
|
||||||
else if(commandName == "mp" && adventureInt)
|
|
||||||
|
void ClientCommandManager::handleExtractCommand(std::istringstream& singleWordBuffer)
|
||||||
{
|
{
|
||||||
if(const CGHeroInstance *h = adventureInt->curHero())
|
std::string URI;
|
||||||
printCommandMessage(std::to_string(h->movement) + "; max: " + std::to_string(h->maxMovePoints(true)) + "/" + std::to_string(h->maxMovePoints(false)) + "\n");
|
singleWordBuffer >> URI;
|
||||||
|
|
||||||
|
if(CResourceHandler::get()->existsResource(ResourceID(URI)))
|
||||||
|
{
|
||||||
|
const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / URI;
|
||||||
|
|
||||||
|
auto data = CResourceHandler::get()->load(ResourceID(URI))->readAll();
|
||||||
|
|
||||||
|
boost::filesystem::create_directories(outPath.parent_path());
|
||||||
|
boost::filesystem::ofstream outFile(outPath, boost::filesystem::ofstream::binary);
|
||||||
|
outFile.write((char*)data.first.get(), data.second);
|
||||||
}
|
}
|
||||||
else if(commandName == "bonuses")
|
else
|
||||||
|
printCommandMessage("File not found!", ELogLevel::ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleBonusesCommand(std::istringstream & singleWordBuffer)
|
||||||
{
|
{
|
||||||
bool jsonFormat = (message == "bonuses json");
|
if(currentCallFromIngameConsole)
|
||||||
auto format = [jsonFormat](const BonusList & b) -> std::string
|
|
||||||
{
|
{
|
||||||
if(jsonFormat)
|
printCommandMessage("Output for this command is too large for ingame chat! Please run it from client console.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string outputFormat;
|
||||||
|
singleWordBuffer >> outputFormat;
|
||||||
|
|
||||||
|
auto format = [outputFormat](const BonusList & b) -> std::string
|
||||||
|
{
|
||||||
|
if(outputFormat == "json")
|
||||||
return b.toJsonNode().toJson(true);
|
return b.toJsonNode().toJson(true);
|
||||||
|
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
ss << b;
|
ss << b;
|
||||||
return ss.str();
|
return ss.str();
|
||||||
@@ -319,26 +398,13 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
printCommandMessage(std::string("\nBonuses from ") + typeid(*parent).name() + "\n" + format(*parent->getAllBonuses(Selector::all, Selector::all)) + "\n");
|
printCommandMessage(std::string("\nBonuses from ") + typeid(*parent).name() + "\n" + format(*parent->getAllBonuses(Selector::all, Selector::all)) + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(commandName == "not dialog")
|
|
||||||
{
|
void ClientCommandManager::handleTellCommand(std::istringstream& singleWordBuffer)
|
||||||
LOCPLINT->showingDialog->setn(false);
|
|
||||||
}
|
|
||||||
else if(commandName == "gui")
|
|
||||||
{
|
|
||||||
for(auto & child : GH.listInt)
|
|
||||||
{
|
|
||||||
const auto childPtr = child.get();
|
|
||||||
if(const CIntObject * obj = dynamic_cast<const CIntObject *>(childPtr))
|
|
||||||
printInfoAboutInterfaceObject(obj, 0);
|
|
||||||
else
|
|
||||||
printCommandMessage(std::string(typeid(childPtr).name()) + "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(commandName == "tell")
|
|
||||||
{
|
{
|
||||||
std::string what;
|
std::string what;
|
||||||
int id1, id2;
|
int id1, id2;
|
||||||
singleWordBuffer >> what >> id1 >> id2;
|
singleWordBuffer >> what >> id1 >> id2;
|
||||||
|
|
||||||
if(what == "hs")
|
if(what == "hs")
|
||||||
{
|
{
|
||||||
for(const CGHeroInstance* h : LOCPLINT->cb->getHeroesInfo())
|
for(const CGHeroInstance* h : LOCPLINT->cb->getHeroesInfo())
|
||||||
@@ -347,7 +413,14 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
printCommandMessage(a->nodeName());
|
printCommandMessage(a->nodeName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (commandName == "set")
|
|
||||||
|
void ClientCommandManager::handleMpCommand()
|
||||||
|
{
|
||||||
|
if(const CGHeroInstance* h = adventureInt->curHero())
|
||||||
|
printCommandMessage(std::to_string(h->movement) + "; max: " + std::to_string(h->maxMovePoints(true)) + "/" + std::to_string(h->maxMovePoints(false)) + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::handleSetCommand(std::istringstream& singleWordBuffer)
|
||||||
{
|
{
|
||||||
std::string what, value;
|
std::string what, value;
|
||||||
singleWordBuffer >> what;
|
singleWordBuffer >> what;
|
||||||
@@ -367,121 +440,20 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
|||||||
printCommandMessage("Option " + what + " disabled!", ELogLevel::INFO);
|
printCommandMessage("Option " + what + " disabled!", ELogLevel::INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(commandName == "unlock")
|
|
||||||
|
void ClientCommandManager::handleUnlockCommand(std::istringstream& singleWordBuffer)
|
||||||
{
|
{
|
||||||
std::string mxname;
|
std::string mxname;
|
||||||
singleWordBuffer >> mxname;
|
singleWordBuffer >> mxname;
|
||||||
if(mxname == "pim" && LOCPLINT)
|
if(mxname == "pim" && LOCPLINT)
|
||||||
LOCPLINT->pim->unlock();
|
LOCPLINT->pim->unlock();
|
||||||
}
|
}
|
||||||
else if(commandName == "def2bmp")
|
|
||||||
{
|
|
||||||
std::string URI;
|
|
||||||
singleWordBuffer >> URI;
|
|
||||||
std::unique_ptr<CAnimation> anim = std::make_unique<CAnimation>(URI);
|
|
||||||
anim->preload();
|
|
||||||
anim->exportBitmaps(VCMIDirs::get().userExtractedPath());
|
|
||||||
}
|
|
||||||
else if(commandName == "extract")
|
|
||||||
{
|
|
||||||
std::string URI;
|
|
||||||
singleWordBuffer >> URI;
|
|
||||||
|
|
||||||
if (CResourceHandler::get()->existsResource(ResourceID(URI)))
|
void ClientCommandManager::handleCrashCommand()
|
||||||
{
|
{
|
||||||
const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / URI;
|
int* ptr = nullptr;
|
||||||
|
*ptr = 666;
|
||||||
auto data = CResourceHandler::get()->load(ResourceID(URI))->readAll();
|
//disaster!
|
||||||
|
|
||||||
boost::filesystem::create_directories(outPath.parent_path());
|
|
||||||
boost::filesystem::ofstream outFile(outPath, boost::filesystem::ofstream::binary);
|
|
||||||
outFile.write((char*)data.first.get(), data.second);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printCommandMessage("File not found!", ELogLevel::ERROR);
|
|
||||||
}
|
|
||||||
else if(commandName == "setBattleAI")
|
|
||||||
{
|
|
||||||
std::string fname;
|
|
||||||
singleWordBuffer >> fname;
|
|
||||||
printCommandMessage("Will try loading that AI to see if it is correct name...\n");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if(auto ai = CDynLibHandler::getNewBattleAI(fname)) //test that given AI is indeed available... heavy but it is easy to make a typo and break the game
|
|
||||||
{
|
|
||||||
Settings neutralAI = settings.write["server"]["neutralAI"];
|
|
||||||
neutralAI->String() = fname;
|
|
||||||
printCommandMessage("Setting changed, from now the battle ai will be " + fname + "!\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(std::exception &e)
|
|
||||||
{
|
|
||||||
printCommandMessage("Failed opening " + fname + ": " + e.what(), ELogLevel::WARN);
|
|
||||||
printCommandMessage("Setting not changed, AI not found or invalid!", ELogLevel::WARN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(commandName == "autoskip")
|
|
||||||
{
|
|
||||||
Settings session = settings.write["session"];
|
|
||||||
session["autoSkip"].Bool() = !session["autoSkip"].Bool();
|
|
||||||
}
|
|
||||||
else if(commandName == "gosolo")
|
|
||||||
{
|
|
||||||
ClientCommandManager::handleGoSolo();
|
|
||||||
}
|
|
||||||
else if(commandName == "controlai")
|
|
||||||
{
|
|
||||||
std::string colorName;
|
|
||||||
singleWordBuffer >> colorName;
|
|
||||||
boost::to_lower(colorName);
|
|
||||||
|
|
||||||
ClientCommandManager::handleControlAi(colorName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!commandName.empty() && !vstd::iswithin(commandName[0], 0, ' ')) // filter-out debugger/IDE noise
|
|
||||||
printCommandMessage("Command not found :(", ELogLevel::ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientCommandManager::giveTurn(const PlayerColor &colorIdentifier)
|
|
||||||
{
|
|
||||||
YourTurn yt;
|
|
||||||
yt.player = colorIdentifier;
|
|
||||||
yt.daysWithoutCastle = CSH->client->getPlayerState(colorIdentifier)->daysWithoutCastle;
|
|
||||||
|
|
||||||
ApplyClientNetPackVisitor visitor(*CSH->client, *CSH->client->gameState());
|
|
||||||
yt.visit(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientCommandManager::printInfoAboutInterfaceObject(const CIntObject *obj, int level)
|
|
||||||
{
|
|
||||||
std::stringstream sbuffer;
|
|
||||||
sbuffer << std::string(level, '\t');
|
|
||||||
|
|
||||||
sbuffer << typeid(*obj).name() << " *** ";
|
|
||||||
if (obj->active)
|
|
||||||
{
|
|
||||||
#define PRINT(check, text) if (obj->active & CIntObject::check) sbuffer << text
|
|
||||||
PRINT(LCLICK, 'L');
|
|
||||||
PRINT(RCLICK, 'R');
|
|
||||||
PRINT(HOVER, 'H');
|
|
||||||
PRINT(MOVE, 'M');
|
|
||||||
PRINT(KEYBOARD, 'K');
|
|
||||||
PRINT(TIME, 'T');
|
|
||||||
PRINT(GENERAL, 'A');
|
|
||||||
PRINT(WHEEL, 'W');
|
|
||||||
PRINT(DOUBLECLICK, 'D');
|
|
||||||
#undef PRINT
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sbuffer << "inactive";
|
|
||||||
sbuffer << " at " << obj->pos.x <<"x"<< obj->pos.y;
|
|
||||||
sbuffer << " (" << obj->pos.w <<"x"<< obj->pos.h << ")";
|
|
||||||
printCommandMessage(sbuffer.str(), ELogLevel::INFO);
|
|
||||||
|
|
||||||
for(const CIntObject *child : obj->children)
|
|
||||||
printInfoAboutInterfaceObject(child, level+1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCommandManager::printCommandMessage(const std::string &commandMessage, ELogLevel::ELogLevel messageType)
|
void ClientCommandManager::printCommandMessage(const std::string &commandMessage, ELogLevel::ELogLevel messageType)
|
||||||
@@ -520,3 +492,131 @@ void ClientCommandManager::printCommandMessage(const std::string &commandMessage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::printInfoAboutInterfaceObject(const CIntObject *obj, int level)
|
||||||
|
{
|
||||||
|
std::stringstream sbuffer;
|
||||||
|
sbuffer << std::string(level, '\t');
|
||||||
|
|
||||||
|
sbuffer << typeid(*obj).name() << " *** ";
|
||||||
|
if (obj->active)
|
||||||
|
{
|
||||||
|
#define PRINT(check, text) if (obj->active & CIntObject::check) sbuffer << text
|
||||||
|
PRINT(LCLICK, 'L');
|
||||||
|
PRINT(RCLICK, 'R');
|
||||||
|
PRINT(HOVER, 'H');
|
||||||
|
PRINT(MOVE, 'M');
|
||||||
|
PRINT(KEYBOARD, 'K');
|
||||||
|
PRINT(TIME, 'T');
|
||||||
|
PRINT(GENERAL, 'A');
|
||||||
|
PRINT(WHEEL, 'W');
|
||||||
|
PRINT(DOUBLECLICK, 'D');
|
||||||
|
#undef PRINT
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sbuffer << "inactive";
|
||||||
|
sbuffer << " at " << obj->pos.x <<"x"<< obj->pos.y;
|
||||||
|
sbuffer << " (" << obj->pos.w <<"x"<< obj->pos.h << ")";
|
||||||
|
printCommandMessage(sbuffer.str(), ELogLevel::INFO);
|
||||||
|
|
||||||
|
for(const CIntObject *child : obj->children)
|
||||||
|
printInfoAboutInterfaceObject(child, level+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::giveTurn(const PlayerColor &colorIdentifier)
|
||||||
|
{
|
||||||
|
YourTurn yt;
|
||||||
|
yt.player = colorIdentifier;
|
||||||
|
yt.daysWithoutCastle = CSH->client->getPlayerState(colorIdentifier)->daysWithoutCastle;
|
||||||
|
|
||||||
|
ApplyClientNetPackVisitor visitor(*CSH->client, *CSH->client->gameState());
|
||||||
|
yt.visit(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCommandManager::processCommand(const std::string & message, bool calledFromIngameConsole)
|
||||||
|
{
|
||||||
|
// split the message into individual words
|
||||||
|
std::istringstream singleWordBuffer;
|
||||||
|
singleWordBuffer.str(message);
|
||||||
|
|
||||||
|
// get command name, to be used for single word commands
|
||||||
|
std::string commandName;
|
||||||
|
singleWordBuffer >> commandName;
|
||||||
|
|
||||||
|
currentCallFromIngameConsole = calledFromIngameConsole;
|
||||||
|
|
||||||
|
if(message == std::string("die, fool"))
|
||||||
|
handleQuitCommand();
|
||||||
|
|
||||||
|
else if(commandName == "save")
|
||||||
|
handleSaveCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName=="load")
|
||||||
|
handleLoadCommand(singleWordBuffer); // not implemented
|
||||||
|
|
||||||
|
else if(commandName == "gosolo")
|
||||||
|
handleGoSoloCommand();
|
||||||
|
|
||||||
|
else if(commandName == "autoskip")
|
||||||
|
handleAutoskipCommand();
|
||||||
|
|
||||||
|
else if(commandName == "controlai")
|
||||||
|
handleControlaiCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "setBattleAI")
|
||||||
|
handleSetBattleAICommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "redraw")
|
||||||
|
handleRedrawCommand();
|
||||||
|
|
||||||
|
else if(commandName == "screen")
|
||||||
|
handleScreenCommand();
|
||||||
|
|
||||||
|
else if(commandName == "not dialog")
|
||||||
|
handleNotDialogCommand();
|
||||||
|
|
||||||
|
else if(commandName == "gui")
|
||||||
|
handleGuiCommand();
|
||||||
|
|
||||||
|
else if(message=="convert txt")
|
||||||
|
handleConvertTextCommand();
|
||||||
|
|
||||||
|
else if(message=="get config")
|
||||||
|
handleGetConfigCommand();
|
||||||
|
|
||||||
|
else if(message=="get scripts")
|
||||||
|
handleGetScriptsCommand();
|
||||||
|
|
||||||
|
else if(message=="get txt")
|
||||||
|
handleGetTextCommand();
|
||||||
|
|
||||||
|
else if(commandName == "def2bmp")
|
||||||
|
handleDef2bmpCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "extract")
|
||||||
|
handleExtractCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "bonuses")
|
||||||
|
handleBonusesCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "tell")
|
||||||
|
handleTellCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "mp" && adventureInt)
|
||||||
|
handleMpCommand();
|
||||||
|
|
||||||
|
else if (commandName == "set")
|
||||||
|
handleSetCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "unlock")
|
||||||
|
handleUnlockCommand(singleWordBuffer);
|
||||||
|
|
||||||
|
else if(commandName == "crash")
|
||||||
|
handleCrashCommand();
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!commandName.empty() && !vstd::iswithin(commandName[0], 0, ' ')) // filter-out debugger/IDE noise
|
||||||
|
printCommandMessage("Command not found :(", ELogLevel::ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -17,13 +17,83 @@ class CIntObject;
|
|||||||
|
|
||||||
class ClientCommandManager //take mantis #2292 issue about account if thinking about handling cheats from command-line
|
class ClientCommandManager //take mantis #2292 issue about account if thinking about handling cheats from command-line
|
||||||
{
|
{
|
||||||
bool currentCallFromIngameConsole = false;
|
bool currentCallFromIngameConsole = false; // commands can come from 2 sources: ingame console (chat) and client console
|
||||||
|
|
||||||
void giveTurn(const PlayerColor &color);
|
// Quits the game (die, fool command)
|
||||||
void printInfoAboutInterfaceObject(const CIntObject *obj, int level);
|
void handleQuitCommand();
|
||||||
|
|
||||||
|
// Saves current game under the given filename
|
||||||
|
void handleSaveCommand(std::istringstream & singleWordBuffer);
|
||||||
|
|
||||||
|
// Loads a game with the given filename
|
||||||
|
void handleLoadCommand(std::istringstream & singleWordBuffer);
|
||||||
|
|
||||||
|
// AI takes over until the end of turn (unlike original H3 currently causes AI to take over until typed again)
|
||||||
|
void handleGoSoloCommand();
|
||||||
|
|
||||||
|
// Toggles autoskip mode on and off. In this mode, player turns are automatically skipped and only AI moves.
|
||||||
|
// However, GUI is still present and allows to observe AI moves. After this option is activated, you need to end first turn manually.
|
||||||
|
// Press [Shift] before your turn starts to not skip it.
|
||||||
|
void handleAutoskipCommand();
|
||||||
|
|
||||||
|
// Gives you control over specified AI player. If none is specified gives you control over all AI players
|
||||||
|
void handleControlaiCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Change battle AI used by neutral creatures to the one specified. Persists through game quit
|
||||||
|
void handleSetBattleAICommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Redraw the current screen
|
||||||
|
void handleRedrawCommand();
|
||||||
|
|
||||||
|
// Prints information about current screen, and saves both screens as .bmp in root folder
|
||||||
|
void handleScreenCommand();
|
||||||
|
|
||||||
|
// Set the state indicating if dialog box is active to "no"
|
||||||
|
void handleNotDialogCommand();
|
||||||
|
|
||||||
|
// Displays tree view of currently present VCMI common GUI elements
|
||||||
|
void handleGuiCommand();
|
||||||
|
|
||||||
|
// Dumps all game text, maps text and campaign maps text into Client log between BEGIN TEXT EXPORT and END TEXT EXPORT
|
||||||
|
void handleConvertTextCommand();
|
||||||
|
|
||||||
|
// Saves current game configuration into extracted/configuration folder
|
||||||
|
void handleGetConfigCommand();
|
||||||
|
|
||||||
|
// Dumps all scripts in Extracted/Scripts
|
||||||
|
void handleGetScriptsCommand();
|
||||||
|
|
||||||
|
// Dumps all .txt files from DATA into Extracted/DATA
|
||||||
|
void handleGetTextCommand();
|
||||||
|
|
||||||
|
// Extract .def animation as BMP files
|
||||||
|
void handleDef2bmpCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Export file into Extracted directory
|
||||||
|
void handleExtractCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Print in console the current bonuses for curent army
|
||||||
|
void handleBonusesCommand(std::istringstream & singleWordBuffer);
|
||||||
|
|
||||||
|
// Get what artifact is present on artifact slot with specified ID for hero with specified ID
|
||||||
|
void handleTellCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Show current movement points, max movement points on land / max movement points on water.
|
||||||
|
void handleMpCommand();
|
||||||
|
|
||||||
|
// set <command> <on/off> - sets special temporary settings that reset on game quit.
|
||||||
|
void handleSetCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Unlocks specific mutex known in VCMI code as "pim"
|
||||||
|
void handleUnlockCommand(std::istringstream& singleWordBuffer);
|
||||||
|
|
||||||
|
// Crashes the game forcing an exception
|
||||||
|
void handleCrashCommand();
|
||||||
|
|
||||||
|
// Prints in Chat the given message
|
||||||
void printCommandMessage(const std::string &commandMessage, ELogLevel::ELogLevel messageType = ELogLevel::NOT_SET);
|
void printCommandMessage(const std::string &commandMessage, ELogLevel::ELogLevel messageType = ELogLevel::NOT_SET);
|
||||||
void handleGoSolo();
|
void printInfoAboutInterfaceObject(const CIntObject *obj, int level);
|
||||||
void handleControlAi(const std::string &colorName);
|
void giveTurn(const PlayerColor &color);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ClientCommandManager() = default;
|
ClientCommandManager() = default;
|
||||||
|
Reference in New Issue
Block a user