New tweak: "max-wheelbarrow"

develop
lethosor 2015-01-01 14:36:30 -05:00
parent ffac2f1795
commit 47d6e111c8
4 changed files with 110 additions and 2 deletions

@ -2052,7 +2052,11 @@ category when discussing an import agreement with the liaison</p>
<tr class="field"><th class="field-name">nestbox-color:</th><td class="field-body"><p class="first">Fixes the color of built nestboxes</p>
</td>
</tr>
<tr class="field"><th class="field-name">eggs-fertile:</th><td class="field-body"><p class="first last">Displays a fertility indicator on nestboxes</p>
<tr class="field"><th class="field-name">eggs-fertile:</th><td class="field-body"><p class="first">Displays a fertility indicator on nestboxes</p>
</td>
</tr>
<tr class="field"><th class="field-name" colspan="2">max-wheelbarrow:</th></tr>
<tr class="field"><td>&nbsp;</td><td class="field-body"><p class="first last">Allows assigning more than 3 wheelbarrows to a stockpile</p>
</td>
</tr>
</tbody>

@ -1330,6 +1330,7 @@ Subcommands that persist until disabled or DF quit:
:civ-view-agreement: Fixes overlapping text on the "view agreement" screen
:nestbox-color: Fixes the color of built nestboxes
:eggs-fertile: Displays a fertility indicator on nestboxes
:max-wheelbarrow: Allows assigning more than 3 wheelbarrows to a stockpile
fix-armory
----------

@ -13,6 +13,7 @@
#include "modules/Job.h"
#include "modules/Materials.h"
#include "modules/MapCache.h"
#include "modules/Buildings.h"
#include "MiscUtils.h"
@ -82,6 +83,7 @@
#include "tweaks/fast-trade.h"
#include "tweaks/import-priority-category.h"
#include "tweaks/manager-quantity.h"
#include "tweaks/max-wheelbarrow.h"
#include "tweaks/military-assign.h"
#include "tweaks/nestbox-color.h"
#include "tweaks/stable-cursor.h"
@ -148,7 +150,7 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
" Fixes overlapping text on the \"view agreement\" screen\n"
" tweak craft-age-wear [disable]\n"
" Makes cloth and leather items wear out at the correct rate (bug 6003).\n"
" tweak eggs-fertile\n"
" tweak eggs-fertile [disable]\n"
" Displays a fertile/infertile indicator on nestboxes\n"
" tweak farm-plot-select [disable]\n"
" Adds \"Select all\" and \"Deselect all\" options to farm plot menus\n"
@ -164,6 +166,8 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
" the priority of an entire category of imports.\n"
" tweak manager-quantity [disable]\n"
" Removes the limit of 30 jobs per manager order\n"
" tweak max-wheelbarrow [disable]\n"
" Allows assigning more than 3 wheelbarrows to a stockpile\n"
" tweak nestbox-color [disable]\n"
" Makes built nestboxes use the color of their material\n"
" tweak military-color-assigned [disable]\n"
@ -206,6 +210,9 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
TWEAK_HOOK("manager-quantity", manager_quantity_hook, feed);
TWEAK_HOOK("max-wheelbarrow", max_wheelbarrow_hook, render);
TWEAK_HOOK("max-wheelbarrow", max_wheelbarrow_hook, feed);
TWEAK_HOOK("military-color-assigned", military_assign_hook, render);
TWEAK_HOOK("military-stable-assign", military_assign_hook, feed);

@ -0,0 +1,96 @@
#include "df/building_stockpilest.h"
#include "df/viewscreen_dwarfmodest.h"
using namespace DFHack;
using namespace df::enums;
using df::global::world;
static bool in_wheelbarrow_entry;
static std::string wheelbarrow_entry;
struct max_wheelbarrow_hook : df::viewscreen_dwarfmodest {
typedef df::viewscreen_dwarfmodest interpose_base;
int wheelbarrow_count()
{
int ret = 0;
std::stringstream tmp(wheelbarrow_entry);
tmp >> ret;
return ret;
}
df::building_stockpilest* getStockpile()
{
if (ui->main.mode != ui_sidebar_mode::QueryBuilding)
return NULL;
return virtual_cast<df::building_stockpilest>(world->selected_building);
}
DEFINE_VMETHOD_INTERPOSE(void, render, ())
{
INTERPOSE_NEXT(render)();
df::building_stockpilest* stockpile = getStockpile();
if (stockpile && in_wheelbarrow_entry)
{
auto dims = Gui::getDwarfmodeViewDims();
Screen::paintString(Screen::Pen(' ', COLOR_LIGHTCYAN),
dims.menu_x1 + 22, dims.y1 + 6, wheelbarrow_entry + "_");
}
}
DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key>* input))
{
df::building_stockpilest* stockpile = getStockpile();
bool handled = false;
if (stockpile)
{
auto dims = Gui::getDwarfmodeViewDims();
handled = true;
if (!in_wheelbarrow_entry &&
input->count(df::interface_key::BUILDJOB_STOCKPILE_WHEELBARROW))
{
in_wheelbarrow_entry = true;
std::stringstream tmp;
tmp << stockpile->max_wheelbarrows;
tmp >> wheelbarrow_entry;
}
else if (in_wheelbarrow_entry)
{
if (input->count(df::interface_key::SELECT) ||
input->count(df::interface_key::LEAVESCREEN) ||
input->count(df::interface_key::LEAVESCREEN_ALL) ||
input->count(df::interface_key::BUILDJOB_STOCKPILE_WHEELBARROW))
{
in_wheelbarrow_entry = false;
stockpile->max_wheelbarrows = std::min(wheelbarrow_count(),
Buildings::countExtentTiles(&stockpile->room));
}
else if (input->count(df::interface_key::STRING_A000) &&
wheelbarrow_entry.size())
{
wheelbarrow_entry.resize(wheelbarrow_entry.size() - 1);
}
else
{
for (auto iter = input->begin(); iter != input->end(); ++iter)
{
df::interface_key key = *iter;
if (key >= Screen::charToKey('0') && key <= Screen::charToKey('9') &&
wheelbarrow_entry.size() < 3)
{
wheelbarrow_entry.push_back(Screen::keyToChar(key));
}
}
}
}
else
handled = false;
}
if (!handled)
INTERPOSE_NEXT(feed)(input);
}
};
IMPLEMENT_VMETHOD_INTERPOSE(max_wheelbarrow_hook, render);
IMPLEMENT_VMETHOD_INTERPOSE(max_wheelbarrow_hook, feed);