2011-07-25 02:14:58 -06:00
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
|
2011-12-31 04:48:42 -07:00
|
|
|
#include "Core.h"
|
2012-01-15 13:54:14 -07:00
|
|
|
#include "Console.h"
|
|
|
|
#include "Export.h"
|
|
|
|
#include "PluginManager.h"
|
2011-07-25 02:14:58 -06:00
|
|
|
#include <vector>
|
|
|
|
#include <string>
|
2012-01-15 13:54:14 -07:00
|
|
|
#include "modules/World.h"
|
2011-07-25 02:14:58 -06:00
|
|
|
#include <stdlib.h>
|
|
|
|
using namespace DFHack;
|
|
|
|
|
|
|
|
|
2012-02-13 21:54:08 -07:00
|
|
|
command_result mode (Core * c, vector <string> & parameters);
|
2011-07-25 02:14:58 -06:00
|
|
|
|
2012-02-21 10:19:17 -07:00
|
|
|
DFHACK_PLUGIN("mode");
|
2011-07-25 02:14:58 -06:00
|
|
|
|
|
|
|
DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
|
|
|
|
{
|
|
|
|
commands.clear();
|
2012-01-28 05:03:56 -07:00
|
|
|
commands.push_back(PluginCommand(
|
|
|
|
"mode","View, change and track game mode.",
|
|
|
|
mode, true,
|
|
|
|
" Without any parameters, this command prints the current game mode\n"
|
|
|
|
" You can interactively set the game mode with 'mode set'.\n"
|
|
|
|
"!!Setting the game modes can be dangerous and break your game!!\n"
|
|
|
|
));
|
2011-07-25 02:14:58 -06:00
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_shutdown ( Core * c )
|
|
|
|
{
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
DFhackCExport command_result plugin_onupdate ( Core * c )
|
|
|
|
{
|
|
|
|
// add tracking here
|
|
|
|
return CR_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void printCurrentModes(t_gamemodes gm, Console & con)
|
|
|
|
{
|
|
|
|
con << "Current game type:\t" << gm.g_type << " (";
|
|
|
|
switch(gm.g_type)
|
|
|
|
{
|
|
|
|
case GAMETYPE_DWARF_MAIN:
|
|
|
|
con << "Fortress)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_ADVENTURE_MAIN:
|
|
|
|
con << "Adventurer)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_VIEW_LEGENDS:
|
|
|
|
con << "Legends)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_DWARF_RECLAIM:
|
|
|
|
con << "Reclaim)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_DWARF_ARENA:
|
|
|
|
con << "Arena)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_ADVENTURE_ARENA:
|
|
|
|
con << "Arena - control creature)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPENUM:
|
|
|
|
con << "INVALID)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMETYPE_NONE:
|
|
|
|
con << "NONE)" << endl;
|
|
|
|
break;
|
2012-02-22 14:46:12 -07:00
|
|
|
default:
|
|
|
|
con << "!!UNKNOWN!!)" << endl;
|
|
|
|
break;
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
|
|
|
con << "Current game mode:\t" << gm.g_mode << " (";
|
|
|
|
switch (gm.g_mode)
|
|
|
|
{
|
|
|
|
case GAMEMODE_DWARF:
|
|
|
|
con << "Dwarf)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMEMODE_ADVENTURE:
|
|
|
|
con << "Adventure)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMEMODENUM:
|
|
|
|
con << "INVALID)" << endl;
|
|
|
|
break;
|
|
|
|
case GAMEMODE_NONE:
|
|
|
|
con << "NONE)" << endl;
|
|
|
|
break;
|
2012-02-22 14:46:12 -07:00
|
|
|
default:
|
|
|
|
con << "!!UNKNOWN!!)" << endl;
|
|
|
|
break;
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-13 21:54:08 -07:00
|
|
|
command_result mode (Core * c, vector <string> & parameters)
|
2011-07-25 02:14:58 -06:00
|
|
|
{
|
|
|
|
string command = "";
|
|
|
|
bool set = false;
|
2012-02-22 14:46:12 -07:00
|
|
|
bool abuse = false;
|
2011-07-25 02:14:58 -06:00
|
|
|
t_gamemodes gm;
|
2012-02-22 14:46:12 -07:00
|
|
|
for(auto iter = parameters.begin(); iter != parameters.end(); iter++)
|
2011-07-25 02:14:58 -06:00
|
|
|
{
|
2012-02-22 14:46:12 -07:00
|
|
|
if((*iter) == "set")
|
2011-07-25 02:14:58 -06:00
|
|
|
{
|
|
|
|
set = true;
|
|
|
|
}
|
2012-02-22 14:46:12 -07:00
|
|
|
else if((*iter) == "abuse")
|
|
|
|
{
|
|
|
|
set = abuse = true;
|
|
|
|
}
|
2011-07-25 02:14:58 -06:00
|
|
|
else
|
2012-01-28 05:03:56 -07:00
|
|
|
return CR_WRONG_USAGE;
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
|
|
|
c->Suspend();
|
|
|
|
World *world = c->getWorld();
|
|
|
|
world->Start();
|
|
|
|
world->ReadGameMode(gm);
|
|
|
|
c->Resume();
|
|
|
|
printCurrentModes(gm, c->con);
|
|
|
|
if(set)
|
|
|
|
{
|
2012-02-22 14:46:12 -07:00
|
|
|
if(!abuse)
|
2011-07-25 02:14:58 -06:00
|
|
|
{
|
2012-02-22 14:46:12 -07:00
|
|
|
if( gm.g_mode == GAMEMODE_NONE || gm.g_type == GAMETYPE_VIEW_LEGENDS)
|
|
|
|
{
|
|
|
|
c->con.printerr("It is not safe to set modes in menus.\n");
|
|
|
|
return CR_FAILURE;
|
|
|
|
}
|
|
|
|
c->con << "\nPossible choices:" << endl
|
|
|
|
<< "0 = Fortress Mode" << endl
|
|
|
|
<< "1 = Adventurer Mode" << endl
|
|
|
|
<< "2 = Arena Mode" << endl
|
|
|
|
<< "3 = Arena, controlling creature" << endl
|
|
|
|
<< "4 = Reclaim Fortress Mode" << endl
|
|
|
|
<< "c = cancel/do nothing" << endl;
|
|
|
|
uint32_t select=99;
|
2011-07-25 02:14:58 -06:00
|
|
|
|
2012-02-22 14:46:12 -07:00
|
|
|
string selected;
|
|
|
|
input_again:
|
|
|
|
CommandHistory hist;
|
|
|
|
c->con.lineedit("Enter new mode: ",selected, hist);
|
|
|
|
if(selected == "c")
|
|
|
|
return CR_OK;
|
|
|
|
const char * start = selected.c_str();
|
|
|
|
char * end = 0;
|
|
|
|
select = strtol(start, &end, 10);
|
|
|
|
if(!end || end==start || select > 4)
|
|
|
|
{
|
|
|
|
c->con.printerr("This is not a valid selection.\n");
|
|
|
|
goto input_again;
|
|
|
|
}
|
|
|
|
switch(select)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
gm.g_mode = GAMEMODE_DWARF;
|
|
|
|
gm.g_type = GAMETYPE_DWARF_MAIN;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
gm.g_mode = GAMEMODE_ADVENTURE;
|
|
|
|
gm.g_type = GAMETYPE_ADVENTURE_MAIN;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gm.g_mode = GAMEMODE_DWARF;
|
|
|
|
gm.g_type = GAMETYPE_DWARF_ARENA;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
gm.g_mode = GAMEMODE_ADVENTURE;
|
|
|
|
gm.g_type = GAMETYPE_ADVENTURE_ARENA;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
gm.g_mode = GAMEMODE_DWARF;
|
|
|
|
gm.g_type = GAMETYPE_DWARF_RECLAIM;
|
|
|
|
break;
|
|
|
|
}
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
2012-02-22 14:46:12 -07:00
|
|
|
else
|
2011-07-25 02:14:58 -06:00
|
|
|
{
|
2012-02-22 14:46:12 -07:00
|
|
|
CommandHistory hist;
|
|
|
|
string selected;
|
|
|
|
c->con.lineedit("Enter new game mode number (c for exit): ",selected, hist);
|
|
|
|
if(selected == "c")
|
|
|
|
return CR_OK;
|
|
|
|
const char * start = selected.c_str();
|
|
|
|
gm.g_mode = (GameMode) strtol(start, 0, 10);
|
|
|
|
c->con.lineedit("Enter new game type number (c for exit): ",selected, hist);
|
|
|
|
if(selected == "c")
|
|
|
|
return CR_OK;
|
|
|
|
start = selected.c_str();
|
|
|
|
gm.g_type = (GameType) strtol(start, 0, 10);
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
|
|
|
c->Suspend();
|
|
|
|
world->WriteGameMode(gm);
|
|
|
|
c->Resume();
|
2012-01-11 09:59:56 -07:00
|
|
|
c->con << endl;
|
2011-07-25 02:14:58 -06:00
|
|
|
}
|
|
|
|
return CR_OK;
|
2012-01-15 13:54:14 -07:00
|
|
|
}
|