diff --git a/dfhack/python/DF_CreatureType.cpp b/dfhack/python/DF_CreatureType.cpp index 663f68d52..0dd74c09b 100644 --- a/dfhack/python/DF_CreatureType.cpp +++ b/dfhack/python/DF_CreatureType.cpp @@ -69,6 +69,8 @@ struct DF_Creature_Base PyObject* like_list; PyObject* trait_list; PyObject* labor_list; + + bool inited; }; static PyObject* BuildCreature(DFHack::t_creature& creature) @@ -128,12 +130,45 @@ static PyObject* BuildCreature(DFHack::t_creature& creature) // API type Allocation, Deallocation, and Initialization +static PyObject* DF_Creature_Base_new(PyTypeObject* type, PyObject* args, PyObject* kwds) +{ + DF_Creature_Base* self; + + self = (DF_Creature_Base*)type->tp_alloc(type, 0); + + if(self != NULL) + self->inited = false; + + return (PyObject*)self; +} + +static int DF_Creature_Base_init(DF_Creature_Base* self, PyObject* args, PyObject* kwds) +{ + if(!inited) + { + self->origin = NULL; + self->flags1 = NULL; + self->flags2 = NULL; + self->name = NULL; + self->squad_name = NULL; + self->artifact_name = NULL; + + self->custom_profession = PyString_FromString(""); + + self->labor_list = NULL; + self->trait_list = NULL; + self->skill_list = NULL; + self->like_list = NULL; + } + + return 0; +} + static void DF_Creature_Base_dealloc(DF_Creature_Base* self) { if(self != NULL) { Py_CLEAR(self->position); - Py_CLEAR(self->c_type); Py_CLEAR(self->flags1); Py_CLEAR(self->flags2); @@ -169,9 +204,61 @@ static PyMemberDef DF_Creature_Base_members[] = {"profession", T_INT, offsetof(DF_Creature_base, profession), 0, ""}, {"custom_profession", T_OBJECT_EX, offsetof(DF_Creature_Base, custom_profession), 0, ""}, {"happiness", T_SHORT, offsetof(DF_Creature_Base, happiness), 0, ""}, + {"id", T_UINT, offsetof(DF_Creature_Base, c_id), 0, ""}, + {"agility", T_UINT, offsetof(DF_Creature_Base, agility), 0, ""}, + {"strength", T_UINT, offsetof(DF_Creature_Base, strength), 0, ""}, + {"toughness", T_UINT, offsetof(DF_Creature_Base, toughness), 0, ""}, + {"money", T_UINT, offsetof(DF_Creature_Base, money), 0, ""}, + {"squad_leader_id", T_INT, offsetof(DF_Creature_Base, squad_leader_id), 0, ""}, + {"sex", T_BYTE, offsetof(DF_Creature_Base, sex), 0, ""}, + {"pregnancy_timer", T_UINT, offsetof(DF_Creature_Base, pregnancy_timer), 0, ""}, + {"blood_max", T_INT, offsetof(DF_Creature_Base, blood_max), 0, ""}, + {"blood_current", T_INT, offsetof(DF_Creature_Base, blood_current), 0, ""}, + {"bleed_rate", T_UINT, offsetof(DF_Creature_Base, bleed_rate), 0, ""}, {NULL} }; +static PyObject* DF_Creature_Base_getLabors(DF_Creature_Base* self, void* closure) +{ + if(self->labor_list != NULL) + return self->labor_list; + + Py_RETURN_NONE; +} + +static PyObject* DF_Creature_Base_getTraits(DF_Creature_Base* self, void* closure) +{ + if(self->trait_list != NULL) + return self->trait_list; + + Py_RETURN_NONE; +} + +static PyObject* DF_Creature_Base_getSkills(DF_Creature_Base* self, void* closure) +{ + if(self->skill_list != NULL) + return self->skill_list; + + Py_RETURN_NONE; +} + +static PyObject* DF_Creature_Base_getLikes(DF_Creature_Base* self, void* closure) +{ + if(self->like_list != NULL) + return self->like_list; + + Py_RETURN_NONE; +} + +static PyGetSetDef DF_Creature_Base_getterSetters[] = +{ + {"labors", (getter)DF_Creature_Base_getLabors, NULL, "labors", NULL}, + {"traits", (getter)DF_Creature_Base_getTraits, NULL, "traits", NULL}, + {"skills", (getter)DF_Creature_Base_getSkills, NULL, "skills", NULL}, + {"likes", (getter)DF_Creature_Base_getLikes, NULL, "likes", NULL}, + {NULL} // Sentinel +}; + static PyTypeObject DF_Creature_Base_type = { PyObject_HEAD_INIT(NULL) @@ -202,17 +289,17 @@ static PyTypeObject DF_Creature_Base_type = 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - DF_Creature_Base_methods, /* tp_methods */ - 0, /* tp_members */ + 0, /* tp_methods */ + DF_Creature_Base_members, /* tp_members */ DF_Creature_Base_getterSetters, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - 0, /* tp_init */ + (initproc)DF_Creature_Base_init, /* tp_init */ 0, /* tp_alloc */ - 0, /* tp_new */ + DF_Creature_base_new, /* tp_new */ }; #endif \ No newline at end of file