Merge branch 'master' of git://github.com/angavrilov/dfhack

develop
Quietust 2013-11-10 14:04:48 -06:00
commit 5c51f7dd2a
3 changed files with 44 additions and 3 deletions

@ -565,7 +565,7 @@ static int dfhack_matinfo_find(lua_State *state)
{ {
std::vector<std::string> tokens; std::vector<std::string> tokens;
for (int i = 1; i < argc; i++) for (int i = 1; i <= argc; i++)
tokens.push_back(luaL_checkstring(state, i)); tokens.push_back(luaL_checkstring(state, i));
info.find(tokens); info.find(tokens);

@ -42,11 +42,14 @@ using namespace std;
#include "MiscUtils.h" #include "MiscUtils.h"
#include "VTableInterpose.h"
#include "DataDefs.h" #include "DataDefs.h"
#include "df/world.h" #include "df/world.h"
#include "df/historical_figure.h" #include "df/historical_figure.h"
#include "df/map_block.h" #include "df/map_block.h"
#include "df/block_square_event_world_constructionst.h" #include "df/block_square_event_world_constructionst.h"
#include "df/viewscreen_legendsst.h"
using namespace DFHack; using namespace DFHack;
using namespace df::enums; using namespace df::enums;
@ -154,14 +157,51 @@ static PersistentDataItem dataFromHFig(df::historical_figure *hfig)
return PersistentDataItem(hfig->id, hfig->name.first_name, &hfig->name.nickname, hfig->name.words); return PersistentDataItem(hfig->id, hfig->name.first_name, &hfig->name.nickname, hfig->name.words);
} }
// Hide fake histfigs from legends xml export
static bool in_export_xml = false;
struct hide_fake_histfigs_hook : df::viewscreen_legendsst {
typedef df::viewscreen_legendsst interpose_base;
DEFINE_VMETHOD_INTERPOSE(void, feed, (set<df::interface_key> *input))
{
if (input->count(interface_key::LEGENDS_EXPORT_XML))
{
auto &figs = df::historical_figure::get_vector();
auto it = figs.begin();
while (it != figs.end() && (*it)->id <= -100)
++it;
// Move our histfigs to a temporary vector
std::vector<df::historical_figure*> fakes(figs.begin(), it);
figs.erase(figs.begin(), it);
in_export_xml = true;
INTERPOSE_NEXT(feed)(input);
in_export_xml = false;
figs.insert(figs.begin(), fakes.begin(), fakes.end());
}
else
INTERPOSE_NEXT(feed)(input);
}
};
IMPLEMENT_VMETHOD_INTERPOSE_PRIO(hide_fake_histfigs_hook, feed, -10000);
void World::ClearPersistentCache() void World::ClearPersistentCache()
{ {
next_persistent_id = 0; next_persistent_id = 0;
persistent_index.clear(); persistent_index.clear();
INTERPOSE_HOOK(hide_fake_histfigs_hook, feed).apply(Core::getInstance().isWorldLoaded());
} }
static bool BuildPersistentCache() static bool BuildPersistentCache()
{ {
if (in_export_xml)
return false;
if (next_persistent_id) if (next_persistent_id)
return true; return true;
if (!Core::getInstance().isWorldLoaded()) if (!Core::getInstance().isWorldLoaded())

@ -1,4 +1,5 @@
#include "Core.h" #include "Core.h"
#include "Error.h"
#include <Console.h> #include <Console.h>
#include <Export.h> #include <Export.h>
#include <PluginManager.h> #include <PluginManager.h>
@ -228,8 +229,8 @@ static void enableEvent(int evType,int freq)
{ {
if (freq < 0) if (freq < 0)
return; return;
if (evType < 0 || evType >= EventManager::EventType::EVENT_MAX || evType == EventManager::EventType::TICK) CHECK_INVALID_ARGUMENT(evType >= 0 && evType < EventManager::EventType::EVENT_MAX &&
throw std::runtime_error("invalid event type to enable"); evType != EventManager::EventType::TICK);
EventManager::EventHandler::callback_t fun_ptr = eventHandlers[evType]; EventManager::EventHandler::callback_t fun_ptr = eventHandlers[evType];
EventManager::EventType::EventType typeToEnable=static_cast<EventManager::EventType::EventType>(evType); EventManager::EventType::EventType typeToEnable=static_cast<EventManager::EventType::EventType>(evType);