2010-04-09 08:43:00 -06:00
|
|
|
/*
|
2011-06-16 15:53:39 -06:00
|
|
|
https://github.com/peterix/dfhack
|
|
|
|
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)
|
2010-04-09 08:43:00 -06:00
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
warranty. In no event will the authors be held liable for any
|
|
|
|
damages arising from the use of this software.
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any
|
|
|
|
purpose, including commercial applications, and to alter it and
|
|
|
|
redistribute it freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must
|
|
|
|
not claim that you wrote the original software. If you use this
|
|
|
|
software in a product, an acknowledgment in the product documentation
|
|
|
|
would be appreciated but is not required.
|
|
|
|
|
|
|
|
2. Altered source versions must be plainly marked as such, and
|
|
|
|
must not be misrepresented as being the original software.
|
|
|
|
|
|
|
|
3. This notice may not be removed or altered from any source
|
|
|
|
distribution.
|
|
|
|
*/
|
|
|
|
|
2011-06-16 15:53:39 -06:00
|
|
|
|
2010-05-26 04:24:45 -06:00
|
|
|
#include "Internal.h"
|
2011-04-10 02:19:15 -06:00
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include <map>
|
|
|
|
using namespace std;
|
|
|
|
|
2011-12-31 04:48:42 -07:00
|
|
|
#include "VersionInfo.h"
|
|
|
|
#include "MemAccess.h"
|
|
|
|
#include "Types.h"
|
|
|
|
#include "Error.h"
|
|
|
|
#include "modules/Buildings.h"
|
2011-03-18 01:53:59 -06:00
|
|
|
#include "ModuleFactory.h"
|
2011-12-31 04:48:42 -07:00
|
|
|
#include "Core.h"
|
2010-04-09 08:43:00 -06:00
|
|
|
using namespace DFHack;
|
|
|
|
|
2012-01-05 15:39:14 -07:00
|
|
|
#include "DataDefs.h"
|
|
|
|
#include "df/world.h"
|
|
|
|
#include "df/world_raws.h"
|
|
|
|
#include "df/building_def.h"
|
|
|
|
#include "df/building.h"
|
|
|
|
#include "df/building_workshopst.h"
|
|
|
|
|
|
|
|
using namespace df::enums;
|
|
|
|
using df::global::world;
|
|
|
|
using df::building_def;
|
|
|
|
|
2010-04-09 08:43:00 -06:00
|
|
|
//raw
|
|
|
|
struct t_building_df40d
|
|
|
|
{
|
|
|
|
uint32_t vtable;
|
|
|
|
uint32_t x1;
|
|
|
|
uint32_t y1;
|
|
|
|
uint32_t centerx;
|
|
|
|
uint32_t x2;
|
|
|
|
uint32_t y2;
|
|
|
|
uint32_t centery;
|
|
|
|
uint32_t z;
|
|
|
|
uint32_t height;
|
|
|
|
t_matglossPair material;
|
|
|
|
// not complete
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Buildings::Private
|
|
|
|
{
|
2010-04-18 13:30:02 -06:00
|
|
|
Process * owner;
|
2010-04-09 08:43:00 -06:00
|
|
|
bool Inited;
|
|
|
|
bool Started;
|
2012-01-05 15:39:14 -07:00
|
|
|
int32_t custom_workshop_id;
|
2010-04-09 08:43:00 -06:00
|
|
|
};
|
|
|
|
|
2011-06-17 07:02:43 -06:00
|
|
|
Module* DFHack::createBuildings()
|
2011-03-18 01:53:59 -06:00
|
|
|
{
|
2011-06-17 07:02:43 -06:00
|
|
|
return new Buildings();
|
2011-03-18 01:53:59 -06:00
|
|
|
}
|
|
|
|
|
2011-06-17 07:02:43 -06:00
|
|
|
Buildings::Buildings()
|
2010-04-09 08:43:00 -06:00
|
|
|
{
|
2011-06-17 07:02:43 -06:00
|
|
|
Core & c = Core::getInstance();
|
2010-04-09 08:43:00 -06:00
|
|
|
d = new Private;
|
2012-01-05 15:39:14 -07:00
|
|
|
d->Started = false;
|
2011-06-17 07:02:43 -06:00
|
|
|
d->owner = c.p;
|
2011-02-17 18:51:17 -07:00
|
|
|
d->Inited = true;
|
2012-01-05 15:39:14 -07:00
|
|
|
c.vinfo->resolveClassnameToClassID("building_custom_workshop", d->custom_workshop_id);
|
2010-04-09 08:43:00 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
Buildings::~Buildings()
|
|
|
|
{
|
|
|
|
if(d->Started)
|
|
|
|
Finish();
|
|
|
|
delete d;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Buildings::Start(uint32_t & numbuildings)
|
|
|
|
{
|
2011-02-17 18:51:17 -07:00
|
|
|
if(!d->Inited)
|
|
|
|
return false;
|
2012-01-05 15:39:14 -07:00
|
|
|
numbuildings = world->buildings.all.size();
|
2010-04-09 08:43:00 -06:00
|
|
|
d->Started = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Buildings::Read (const uint32_t index, t_building & building)
|
|
|
|
{
|
|
|
|
if(!d->Started)
|
|
|
|
return false;
|
2012-01-05 15:39:14 -07:00
|
|
|
df::building *bld_40d = world->buildings.all[index];
|
2010-04-09 08:43:00 -06:00
|
|
|
|
|
|
|
// transform
|
|
|
|
int32_t type = -1;
|
2012-01-05 15:39:14 -07:00
|
|
|
d->owner->getDescriptor()->resolveObjectToClassID ( (char *)bld_40d, type);
|
2012-01-03 17:45:11 -07:00
|
|
|
building.x1 = bld_40d->x1;
|
|
|
|
building.x2 = bld_40d->x2;
|
|
|
|
building.y1 = bld_40d->y1;
|
|
|
|
building.y2 = bld_40d->y2;
|
|
|
|
building.z = bld_40d->z;
|
2012-01-05 16:09:49 -07:00
|
|
|
building.material.index = bld_40d->mat_index;
|
|
|
|
building.material.type = bld_40d->mat_type;
|
2010-04-09 08:43:00 -06:00
|
|
|
building.type = type;
|
2012-01-05 17:08:30 -07:00
|
|
|
building.custom_type = bld_40d->getCustomType();
|
2012-01-05 15:39:14 -07:00
|
|
|
building.origin = (void *) &bld_40d;
|
2010-04-09 08:43:00 -06:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Buildings::Finish()
|
|
|
|
{
|
|
|
|
d->Started = false;
|
2010-04-09 19:49:37 -06:00
|
|
|
return true;
|
2010-04-12 16:03:29 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Buildings::ReadCustomWorkshopTypes(map <uint32_t, string> & btypes)
|
|
|
|
{
|
2011-02-24 19:13:50 -07:00
|
|
|
if(!d->Inited)
|
2010-04-12 19:11:26 -06:00
|
|
|
return false;
|
2012-01-05 15:39:14 -07:00
|
|
|
Core & c = Core::getInstance();
|
2010-08-20 06:10:05 -06:00
|
|
|
|
2010-04-18 13:30:02 -06:00
|
|
|
Process * p = d->owner;
|
2012-01-05 15:39:14 -07:00
|
|
|
vector <building_def *> & bld_def = world->raws.buildings.all;
|
|
|
|
uint32_t size = bld_def.size();
|
2010-04-12 16:03:29 -06:00
|
|
|
btypes.clear();
|
2010-08-20 06:10:05 -06:00
|
|
|
|
2012-01-05 15:39:14 -07:00
|
|
|
c.con.print("Probing vector at 0x%x for custom workshops.\n", &bld_def);
|
|
|
|
for (auto iter = bld_def.begin(); iter != bld_def.end();iter++)
|
2010-04-12 16:03:29 -06:00
|
|
|
{
|
2012-01-05 15:39:14 -07:00
|
|
|
building_def * temp = *iter;
|
|
|
|
btypes[temp->id] = temp->code;
|
|
|
|
c.con.print("%d : %s\n",temp->id, temp->code.c_str());
|
2010-04-12 16:03:29 -06:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|