54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
#include <stdexcept>
|
|
|
|
#include "df/viewscreen_createquotast.h"
|
|
#include "df/manager_order.h"
|
|
|
|
using df::global::world;
|
|
|
|
struct manager_quantity_hook : df::viewscreen_createquotast {
|
|
typedef df::viewscreen_createquotast interpose_base;
|
|
DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key>* input))
|
|
{
|
|
bool cancel = false;
|
|
bool wanted_quantity = want_quantity;
|
|
if (want_quantity)
|
|
{
|
|
for (auto it = input->begin(); it != input->end(); ++it)
|
|
{
|
|
char c = DFHack::Screen::keyToChar(*it);
|
|
if (c >= '0' && c <= '9')
|
|
{
|
|
cancel = true;
|
|
size_t len = strlen(str_filter);
|
|
if (len < 5)
|
|
{
|
|
str_filter[len] = c;
|
|
str_filter[len + 1] = '\0';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (cancel)
|
|
return;
|
|
// Native feed() adds manager order, updates want_quantity, and removes SELECT from input
|
|
int select = input->count(df::interface_key::SELECT);
|
|
INTERPOSE_NEXT(feed)(input);
|
|
if (wanted_quantity && select && strlen(str_filter) > 0)
|
|
{
|
|
df::manager_order* order = world->manager_orders[world->manager_orders.size() - 1];
|
|
int16_t count = 1;
|
|
try
|
|
{
|
|
count = std::stoi(str_filter);
|
|
}
|
|
catch (...) { }
|
|
if (count < 1)
|
|
count = 1;
|
|
order->amount_total = count;
|
|
order->amount_left = count;
|
|
}
|
|
}
|
|
};
|
|
|
|
IMPLEMENT_VMETHOD_INTERPOSE(manager_quantity_hook, feed);
|