273 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			273 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
| /*
 | |
| www.sourceforge.net/projects/dfhack
 | |
| Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf, doomchild
 | |
| 
 | |
| 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.
 | |
| */
 | |
| 
 | |
| #ifndef __DFBUILDINGS__
 | |
| #define __DFBUILDINGS__
 | |
| 
 | |
| #include "Python.h"
 | |
| #include <map>
 | |
| #include <string>
 | |
| #include "DFIntegers.h"
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| #include "DFTypes.h"
 | |
| #include "modules/Buildings.h"
 | |
| #include "DF_Helpers.cpp"
 | |
| 
 | |
| using namespace DFHack;
 | |
| 
 | |
| static PyObject* BuildBuilding(DFHack::t_building& building)
 | |
| {
 | |
| 	PyObject* t_dict;
 | |
| 	PyObject* temp;
 | |
| 	
 | |
| 	t_dict = PyDict_New();
 | |
| 	
 | |
| 	temp = Py_BuildValue("(si)(si)(si)(sO)(s((ii)(ii)i))", \
 | |
| 		"origin", building.origin, \
 | |
| 		"vtable", building.vtable, \
 | |
| 		"type", building.type, \
 | |
| 		"material", BuildMatglossPair(building.material), \
 | |
| 		"bounds", Py_BuildValue("(ii)(ii)i", building.x1, building.y1, building.x2, building.y2, building.z));
 | |
| 	
 | |
| 	PyDict_MergeFromSeq2(t_dict, temp, 0);
 | |
| 	
 | |
| 	return t_dict;
 | |
| }
 | |
| 
 | |
| static DFHack::t_building ReverseBuildBuilding(PyObject* bDict)
 | |
| {
 | |
| 	PyObject* temp;
 | |
| 	uint32_t x1, y1, x2, y2, z;
 | |
| 	DFHack::t_building building;
 | |
| 	
 | |
| 	building.origin = (uint32_t)PyInt_AsLong(PyDict_GetItemString(bDict, "origin"));
 | |
| 	building.vtable = (uint32_t)PyInt_AsLong(PyDict_GetItemString(bDict, "vtable"));
 | |
| 	building.material = ReverseBuildMatglossPair(PyDict_GetItemString(bDict, "material"));
 | |
| 	building.type = (uint32_t)PyInt_AsLong(PyDict_GetItemString(bDict, "type"));
 | |
| 	
 | |
| 	temp = PyDict_GetItemString(bDict, "bounds");
 | |
| 	
 | |
| 	PyArg_ParseTuple(temp, "(ii)(ii)i", &x1, &y1, &x2, &y2, &z);
 | |
| 	
 | |
| 	building.x1 = x1;
 | |
| 	building.y1 = y1;
 | |
| 	building.x2 = x2;
 | |
| 	building.y2 = y2;
 | |
| 	building.z = z;
 | |
| 	
 | |
| 	return building;
 | |
| }
 | |
| 
 | |
| struct DF_Building
 | |
| {
 | |
| 	PyObject_HEAD
 | |
| 	DFHack::Buildings* b_Ptr;
 | |
| };
 | |
| 
 | |
| static PyObject* DF_Building_new(PyTypeObject* type, PyObject* args, PyObject* kwds)
 | |
| {
 | |
| 	DF_Building* self;
 | |
| 	
 | |
| 	self = (DF_Building*)type->tp_alloc(type, 0);
 | |
| 	
 | |
| 	if(self != NULL)
 | |
| 		self->b_Ptr = NULL;
 | |
| 	
 | |
| 	return (PyObject*)self;
 | |
| }
 | |
| 
 | |
| static int DF_Building_init(DF_Building* self, PyObject* args, PyObject* kwds)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static void DF_Building_dealloc(DF_Building* self)
 | |
| {
 | |
| 	PySys_WriteStdout("building dealloc\n");
 | |
| 	
 | |
| 	if(self != NULL)
 | |
| 	{
 | |
| 		PySys_WriteStdout("building not NULL\n");
 | |
| 		
 | |
| 		if(self->b_Ptr != NULL)
 | |
| 		{
 | |
| 			PySys_WriteStdout("b_Ptr = 0x%x\n", self->b_Ptr);
 | |
| 			
 | |
| 			delete self->b_Ptr;
 | |
| 			
 | |
| 			PySys_WriteStdout("b_Ptr deleted\n");
 | |
| 			
 | |
| 			self->b_Ptr = NULL;
 | |
| 		}
 | |
| 		
 | |
| 		self->ob_type->tp_free((PyObject*)self);
 | |
| 	}
 | |
| 	
 | |
| 	PySys_WriteStdout("building dealloc done\n");
 | |
| }
 | |
| 
 | |
| // Type methods
 | |
| 
 | |
| static PyObject* DF_Building_Start(DF_Building* self, PyObject* args)
 | |
| {
 | |
| 	uint32_t numBuildings = 0;
 | |
| 	
 | |
| 	if(self->b_Ptr != NULL)
 | |
| 	{
 | |
| 		if(self->b_Ptr->Start(numBuildings))
 | |
| 			return PyInt_FromLong(numBuildings);
 | |
| 		else
 | |
| 			return PyInt_FromLong(-1);
 | |
| 	}
 | |
| 	
 | |
| 	Py_RETURN_NONE;
 | |
| }
 | |
| 
 | |
| static PyObject* DF_Building_Finish(DF_Building* self, PyObject* args)
 | |
| {
 | |
| 	if(self->b_Ptr != NULL)
 | |
| 	{
 | |
| 		if(self->b_Ptr->Finish())
 | |
| 			Py_RETURN_TRUE;
 | |
| 		else
 | |
| 			Py_RETURN_FALSE;
 | |
| 	}
 | |
| 	
 | |
| 	Py_RETURN_NONE;
 | |
| }
 | |
| 
 | |
| static PyObject* DF_Building_Read(DF_Building* self, PyObject* args)
 | |
| {
 | |
| 	uint32_t index = 0;
 | |
| 	t_building building;
 | |
| 	
 | |
| 	if(self->b_Ptr != NULL)
 | |
| 	{
 | |
| 		if(!PyArg_ParseTuple(args, "I", &index))
 | |
| 			return NULL;
 | |
| 		
 | |
| 		if(self->b_Ptr->Read(index, building))
 | |
| 			return BuildBuilding(building);
 | |
| 	}
 | |
| 	
 | |
| 	Py_RETURN_NONE;
 | |
| }
 | |
| 
 | |
| static PyObject* DF_Building_ReadCustomWorkshopTypes(DF_Building* self, PyObject* args)
 | |
| {
 | |
| 	PyObject* bDict;
 | |
| 	std::map<uint32_t, string> bTypes;
 | |
| 	std::map<uint32_t, string>::iterator bIter;
 | |
| 	
 | |
| 	if(self->b_Ptr != NULL)
 | |
| 	{
 | |
| 		if(self->b_Ptr->ReadCustomWorkshopTypes(bTypes))
 | |
| 		{
 | |
| 			bDict = PyDict_New();
 | |
| 			
 | |
| 			for(bIter = bTypes.begin(); bIter != bTypes.end(); bIter++)
 | |
| 			{
 | |
| 				PyObject* temp = Py_BuildValue("is", (*bIter).first, (*bIter).second.c_str());
 | |
| 				
 | |
| 				PyDict_MergeFromSeq2(bDict, temp, 1);
 | |
| 			}
 | |
| 			
 | |
| 			return bDict;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	Py_RETURN_NONE;
 | |
| }
 | |
| 
 | |
| static PyObject* DF_Building_GetCustomWorkshopType(DF_Building* self, PyObject* args)
 | |
| {
 | |
| 	DFHack::t_building building;
 | |
| 	
 | |
| 	if(self->b_Ptr != NULL)
 | |
| 	{
 | |
| 		building = ReverseBuildBuilding(args);
 | |
| 		
 | |
| 		return PyInt_FromLong(self->b_Ptr->GetCustomWorkshopType(building));
 | |
| 	}
 | |
| 	
 | |
| 	Py_RETURN_NONE;
 | |
| }
 | |
| 
 | |
| static PyMethodDef DF_Building_methods[] =
 | |
| {
 | |
|     {"Start", (PyCFunction)DF_Building_Start, METH_NOARGS, ""},
 | |
|     {"Finish", (PyCFunction)DF_Building_Finish, METH_NOARGS, ""},
 | |
|     {"Read", (PyCFunction)DF_Building_Read, METH_VARARGS, ""},
 | |
| 	{"Read_Custom_Workshop_Types", (PyCFunction)DF_Building_ReadCustomWorkshopTypes, METH_NOARGS, ""},
 | |
| 	{"Get_Custom_Workshop_Type", (PyCFunction)DF_Building_GetCustomWorkshopType, METH_VARARGS, ""},
 | |
|     {NULL}  // Sentinel
 | |
| };
 | |
| 
 | |
| static PyTypeObject DF_Building_type =
 | |
| {
 | |
|     PyObject_HEAD_INIT(NULL)
 | |
|     0,                         /*ob_size*/
 | |
|     "pydfhack.Building",             /*tp_name*/
 | |
|     sizeof(DF_Building), /*tp_basicsize*/
 | |
|     0,                         /*tp_itemsize*/
 | |
|     (destructor)DF_Building_dealloc,                         /*tp_dealloc*/
 | |
|     0,                         /*tp_print*/
 | |
|     0,                         /*tp_getattr*/
 | |
|     0,                         /*tp_setattr*/
 | |
|     0,                         /*tp_compare*/
 | |
|     0,                         /*tp_repr*/
 | |
|     0,                         /*tp_as_number*/
 | |
|     0,                         /*tp_as_sequence*/
 | |
|     0,                         /*tp_as_mapping*/
 | |
|     0,                         /*tp_hash */
 | |
|     0,                         /*tp_call*/
 | |
|     0,                         /*tp_str*/
 | |
|     0,                         /*tp_getattro*/
 | |
|     0,                         /*tp_setattro*/
 | |
|     0,                         /*tp_as_buffer*/
 | |
|     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,        /*tp_flags*/
 | |
|     "pydfhack Building objects",           /* tp_doc */
 | |
|     0,		               /* tp_traverse */
 | |
|     0,		               /* tp_clear */
 | |
|     0,		               /* tp_richcompare */
 | |
|     0,		               /* tp_weaklistoffset */
 | |
|     0,		               /* tp_iter */
 | |
|     0,		               /* tp_iternext */
 | |
|     DF_Building_methods,             /* tp_methods */
 | |
|     0,                      /* tp_members */
 | |
|     0,      /* tp_getset */
 | |
|     0,                         /* tp_base */
 | |
|     0,                         /* tp_dict */
 | |
|     0,                         /* tp_descr_get */
 | |
|     0,                         /* tp_descr_set */
 | |
|     0,                         /* tp_dictoffset */
 | |
|     (initproc)DF_Building_init,      /* tp_init */
 | |
|     0,                         /* tp_alloc */
 | |
|     DF_Building_new,                 /* tp_new */
 | |
| };
 | |
| 
 | |
| #endif
 |