From ee9da5910b7b43c00b75a1204c4fa0481c29a75b Mon Sep 17 00:00:00 2001 From: doomchild Date: Fri, 23 Apr 2010 14:32:38 -0500 Subject: [PATCH] updated to use new namedtuples --- dfhack/python/DF_CreatureManager.cpp | 2 +- dfhack/python/DF_Helpers.cpp | 134 +++++++++++++++++++-------- dfhack/python/DF_Imports.cpp | 32 ++++++- dfhack/python/DF_Material.cpp | 78 ++++++---------- 4 files changed, 153 insertions(+), 93 deletions(-) diff --git a/dfhack/python/DF_CreatureManager.cpp b/dfhack/python/DF_CreatureManager.cpp index 4e01bb0b9..c9b4136c8 100644 --- a/dfhack/python/DF_CreatureManager.cpp +++ b/dfhack/python/DF_CreatureManager.cpp @@ -201,7 +201,7 @@ static PyObject* DF_CreatureManager_WriteLabors(DF_CreatureManager* self, PyObje sprintf(errBuff, "list must contain at least %u entries", NUM_CREATURE_LABORS); - PyErr_SetString(PyExc_StandardError, errBuff) + PyErr_SetString(PyExc_StandardError, errBuff); return NULL; } diff --git a/dfhack/python/DF_Helpers.cpp b/dfhack/python/DF_Helpers.cpp index a2a0eb33d..6c4b580cd 100644 --- a/dfhack/python/DF_Helpers.cpp +++ b/dfhack/python/DF_Helpers.cpp @@ -28,16 +28,60 @@ distribution. #include "Python.h" #include #include +#include + +using namespace std; + #include "DFTypes.h" #include "DF_Imports.cpp" using namespace DFHack; #include "modules/Creatures.h" +#include "modules/Materials.h" #define DICTADD(d, name, item) PyDict_SetItemString(d, name, item); Py_DECREF(item) #define OBJSET(o, name, item) PyObject_SetAttrString(o, name, item); Py_DECREF(item) +static PyObject* BuildTileColor(uint16_t fore, uint16_t back, uint16_t bright) +{ + PyObject *tObj, *args; + + args = Py_BuildValue("iii", fore, back, bright); + + tObj = PyObject_CallObject(TileColor_type, args); + + Py_DECREF(args); + + return tObj; +} + +static PyObject* BuildPosition2D(uint16_t x, uint16_t y) +{ + PyObject *posObj, *args; + + args = Py_BuildValue("ii", x, y); + + posObj = PyObject_CallObject(Position2D_type, args); + + Py_DECREF(args); + + return posObj; +} + +static PyObject* BuildPosition3D(uint16_t x, uint16_t y, uint16_t z) +{ + PyObject *posObj, *args; + + args = Py_BuildValue("iii", x, y, z); + + posObj = PyObject_CallObject(Position3D_type, args); + + Py_DECREF(args); + + return posObj; +} + static PyObject* BuildMatglossPair(DFHack::t_matglossPair& matgloss) { return Py_BuildValue("ii", matgloss.type, matgloss.index); @@ -55,7 +99,15 @@ static DFHack::t_matglossPair ReverseBuildMatglossPair(PyObject* mObj) static PyObject* BuildSkill(DFHack::t_skill& skill) { - return Py_BuildValue("III", skill.id, skill.experience, skill.rating); + PyObject *args, *skillObj; + + args = Py_BuildValue("III", skill.id, skill.experience, skill.rating); + + skillObj = PyObject_CallObject(Skill_type, args); + + Py_DECREF(args); + + return skillObj; } static PyObject* BuildSkillList(DFHack::t_skill (&skills)[256], uint8_t numSkills) @@ -75,24 +127,20 @@ static PyObject* BuildJob(DFHack::t_job& job) static PyObject* BuildAttribute(DFHack::t_attrib& at) { - return Py_BuildValue("IIIIIII", at.level, at.field_4, at.field_8, at.field_C, at.leveldiff, at.field_14, at.field_18); + PyObject *args, *attrObj; + + args = Py_BuildValue("IIIIIII", at.level, at.field_4, at.field_8, at.field_C, at.leveldiff, at.field_14, at.field_18); + + attrObj = PyObject_CallObject(Attribute_type, args); + + Py_DECREF(args); + + return attrObj; } static PyObject* BuildItemType(DFHack::t_itemType& item) { - PyObject *id, *name; - - if(item.id[0]) - id = PyString_FromString(item.id); - else - id = PyString_FromString(""); - - if(item.name[0]) - name = PyString_FromString(item.name); - else - name = PyString_FromString(""); - - return Py_BuildValue("OO", id, name); + return Py_BuildValue("ss", item.id, item.name); } static PyObject* BuildLike(DFHack::t_like& like) @@ -107,19 +155,20 @@ static PyObject* BuildLike(DFHack::t_like& like) static PyObject* BuildNote(DFHack::t_note& note) { PyObject* noteObj; - PyObject *args, *name, *position; + PyObject *args, *position; - if(note.name[0]) - name = PyString_FromString(note.name); - else - name = PyString_FromString(""); + args = Py_BuildValue("III", note.x, note.y, note.z); + + position = PyObject_CallObject(Position3D_type, args); - position = Py_BuildValue("III", note.x, note.y, note.z); + Py_DECREF(args); - args = Py_BuildValue("cIIsO", note.symbol, note.foreground, note.background, name, position); + args = Py_BuildValue("cIIsO", note.symbol, note.foreground, note.background, note.name, position); noteObj = PyObject_CallObject(Note_type, args); + Py_DECREF(args); + return noteObj; } @@ -245,33 +294,36 @@ static DFHack::t_name ReverseBuildName(PyObject* nameObj) static PyObject* BuildSettlement(DFHack::t_settlement& settlement) { - PyObject* setDict; - PyObject *local_pos1, *local_pos2; - PyObject* temp; + PyObject* setObj; + PyObject *world_pos, *local_pos, *args; + + args = Py_BuildValue("ii", settlement.world_x, settlement.world_y); - setDict = PyDict_New(); + world_pos = PyObject_CallObject(Position2D_type, args); - temp = PyInt_FromLong(settlement.origin); - DICTADD(setDict, "origin", temp); + Py_DECREF(args); - temp = BuildName(settlement.name); - DICTADD(setDict, "name", temp); + args = Py_BuildValue("iiii", settlement.local_x1, settlement.local_y1, settlement.local_x2, settlement.local_y2); - temp = Py_BuildValue("ii", settlement.world_x, settlement.world_y); - DICTADD(setDict, "world_pos", temp); + local_pos = PyObject_CallObject(Rectangle_type, args); - local_pos1 = Py_BuildValue("ii", settlement.local_x1, settlement.local_y1); - local_pos2 = Py_BuildValue("ii", settlement.local_x2, settlement.local_y2); + Py_DECREF(args); - temp = Py_BuildValue("OO", local_pos1, local_pos2); - DICTADD(setDict, "local_pos", temp); + args = Py_BuildValue("iOOO", settlement.origin, BuildName(settlement.name), world_pos, local_pos); - return setDict; + setObj = PyObject_CallObject(Settlement_type, args); + + Py_DECREF(args); + + return setObj; } static PyObject* BuildSoul(DFHack::t_soul& soul) { - PyObject *soulDict, *skillList, *temp; + PyObject *soulDict, *skillList, *temp, *emptyArgs; + PyObject* soulObj; + + emptyArgs = Py_BuildValue("()"); soulDict = PyDict_New(); @@ -317,7 +369,11 @@ static PyObject* BuildSoul(DFHack::t_soul& soul) temp = BuildAttribute(soul.social_awareness); DICTADD(soulDict, "social_awareness", temp); - return soulDict; + soulObj = PyObject_Call(Soul_type, emptyArgs, soulDict); + + Py_DECREF(emptyArgs); + + return soulObj; } #endif \ No newline at end of file diff --git a/dfhack/python/DF_Imports.cpp b/dfhack/python/DF_Imports.cpp index 15e93d2b3..b163a8822 100644 --- a/dfhack/python/DF_Imports.cpp +++ b/dfhack/python/DF_Imports.cpp @@ -43,10 +43,23 @@ static PyObject* MapBlock40d_type = NULL; static PyObject* Vein_type = NULL; static PyObject* FrozenLiquidVein_type = NULL; static PyObject* SpatterVein_type = NULL; +static PyObject* Position2D_type = NULL; +static PyObject* Position3D_type = NULL; +static PyObject* Rectangle_type = NULL; +static PyObject* Settlement_type = NULL; +static PyObject* Attribute_type = NULL; +static PyObject* Skill_type = NULL; +static PyObject* Soul_type = NULL; +static PyObject* Tree_type = NULL; +static PyObject* CreatureCaste_type = NULL; +static PyObject* Matgloss_type = NULL; +static PyObject* DescriptorColor_type = NULL; +static PyObject* CreatureTypeEx_type = NULL; +static PyObject* TileColor_type = NULL; static void DoImports() { - if(TypesModule == NULL) + if(FlagsModule == NULL) { FlagsModule = PyImport_ImportModule("pydfhackflags"); @@ -56,7 +69,9 @@ static void DoImports() OccupancyFlags_type = PyObject_GetAttrString(FlagsModule, "OccupancyFlags"); ItemFlags_type = PyObject_GetAttrString(FlagsModule, "ItemFlags"); BlockFlags_type = PyObject_GetAttrString(FlagsModule, "BlockFlags"); - + } + if(TypesModule == NULL) + { TypesModule = PyImport_ImportModule("pydftypes"); Note_type = PyObject_GetAttrString(TypesModule, "Note"); @@ -66,6 +81,19 @@ static void DoImports() Vein_type = PyObject_GetAttrString(TypesModule, "Vein"); FrozenLiquidVein_type = PyObject_GetAttrString(TypesModule, "FrozenLiquidVein"); SpatterVein_type = PyObject_GetAttrString(TypesModule, "SpatterVein"); + Position2D_type = PyObject_GetAttrString(TypesModule, "Position2D"); + Position3D_type = PyObject_GetAttrString(TypesModule, "Position3D"); + Rectangle_type = PyObject_GetAttrString(TypesModule, "Rectangle"); + Settlement_type = PyObject_GetAttrString(TypesModule, "Settlement"); + Attribute_type = PyObject_GetAttrString(TypesModule, "Attribute"); + Skill_type = PyObject_GetAttrString(TypesModule, "Skill"); + Soul_type = PyObject_GetAttrString(TypesModule, "Soul"); + Tree_type = PyObject_GetAttrString(TypesModule, "Tree"); + CreatureCaste_type = PyObject_GetAttrString(TypesModule, "CreatureCaste"); + Matgloss_type = PyObject_GetAttrString(TypesModule, "Matgloss"); + DescriptorColor_type = PyObject_GetAttrString(TypesModule, "DescriptorColor"); + CreatureTypeEx_type = PyObject_GetAttrString(TypesModule, "CreatureTypeEx"); + TileColor_type = PyObject_GetAttrString(TypesModule, "TileColor"); } } diff --git a/dfhack/python/DF_Material.cpp b/dfhack/python/DF_Material.cpp index b4f67154a..56813c5d9 100644 --- a/dfhack/python/DF_Material.cpp +++ b/dfhack/python/DF_Material.cpp @@ -31,6 +31,8 @@ distribution. using namespace std; #include "modules/Materials.h" +#include "DF_Imports.cpp" +#include "DF_Helpers.cpp" using namespace DFHack; @@ -44,23 +46,16 @@ struct DF_Material static PyObject* BuildMatgloss(t_matgloss& matgloss) { - PyObject* matDict; - PyObject* list; - - matDict = PyDict_New(); - list = PyList_New(5); + PyObject* matObj; + PyObject* args; - PyList_SET_ITEM(list, 0, Py_BuildValue("ss", "id", matgloss.id)); - PyList_SET_ITEM(list, 1, Py_BuildValue("si", "fore", matgloss.fore)); - PyList_SET_ITEM(list, 2, Py_BuildValue("si", "back", matgloss.back)); - PyList_SET_ITEM(list, 3, Py_BuildValue("si", "bright", matgloss.bright)); - PyList_SET_ITEM(list, 4, Py_BuildValue("ss", "name", matgloss.name)); + args = Py_BuildValue("siiis", matgloss.id, matgloss.fore, matgloss.back, matgloss.bright, matgloss.name); - PyDict_MergeFromSeq2(matDict, list, 0); + matObj = PyObject_CallObject(Matgloss_type, args); - Py_DECREF(list); + Py_DECREF(args); - return matDict; + return matObj; } static PyObject* BuildMatglossPlant(t_matglossPlant& matgloss) @@ -122,23 +117,16 @@ static PyObject* BuildMatglossList(std::vector & matVec) static PyObject* BuildDescriptorColor(t_descriptor_color& color) { - PyObject* matDict; - PyObject* list; - - matDict = PyDict_New(); - list = PyList_New(5); + PyObject* descObj; + PyObject* args; - PyList_SET_ITEM(list, 0, Py_BuildValue("ss", "id", color.id)); - PyList_SET_ITEM(list, 1, Py_BuildValue("sf", "r", color.r)); - PyList_SET_ITEM(list, 2, Py_BuildValue("sf", "v", color.v)); - PyList_SET_ITEM(list, 3, Py_BuildValue("sf", "b", color.b)); - PyList_SET_ITEM(list, 4, Py_BuildValue("ss", "name", color.name)); + args = Py_BuildValue("sfffs", color.id, color.r, color.v, color.b, color.name); - PyDict_MergeFromSeq2(matDict, list, 0); + descObj = PyObject_CallObject(DescriptorColor_type, args); - Py_DECREF(list); + Py_DECREF(args); - return matDict; + return descObj; } static PyObject* BuildDescriptorColorList(std::vector& colors) @@ -162,22 +150,16 @@ static PyObject* BuildDescriptorColorList(std::vector& color static PyObject* BuildCreatureCaste(t_creaturecaste& caste) { - PyObject* matDict; - PyObject* list; + PyObject* casteObj; + PyObject* args; - matDict = PyDict_New(); - list = PyList_New(4); - - PyList_SET_ITEM(list, 0, Py_BuildValue("ss", "rawname", caste.rawname)); - PyList_SET_ITEM(list, 1, Py_BuildValue("ss", "singular", caste.singular)); - PyList_SET_ITEM(list, 2, Py_BuildValue("ss", "plural", caste.plural)); - PyList_SET_ITEM(list, 3, Py_BuildValue("ss", "adjective", caste.adjective)); + args = Py_BuildValue("ssss", caste.rawname, caste.singular, caste.plural, caste.adjective); - PyDict_MergeFromSeq2(matDict, list, 0); + casteObj = PyObject_CallObject(CreatureCaste_type, args); - Py_DECREF(list); + Py_DECREF(args); - return matDict; + return casteObj; } static PyObject* BuildCreatureCasteList(std::vector& castes) @@ -201,23 +183,17 @@ static PyObject* BuildCreatureCasteList(std::vector& castes) static PyObject* BuildCreatureTypeEx(t_creaturetype& creature) { - PyObject* c_type; - PyObject* list; + PyObject* cObj; + PyObject* args; - c_type = PyDict_New(); - list = PyList_New(6); + args = Py_BuildValue("sOiO", creature.rawname, BuildCreatureCasteList(creature.castes), creature.tile_character, \ + BuildTileColor(creature.tilecolor.fore, creature.tilecolor.back, creature.tilecolor.bright)); - PyList_SET_ITEM(list, 0, Py_BuildValue("ss", "rawname", creature.rawname)); - PyList_SET_ITEM(list, 1, Py_BuildValue("sO", "castes", BuildCreatureCasteList(creature.castes))); - PyList_SET_ITEM(list, 2, Py_BuildValue("si", "tile_character", creature.tile_character)); - PyList_SET_ITEM(list, 3, Py_BuildValue("si", "fore", creature.tilecolor.fore)); - PyList_SET_ITEM(list, 4, Py_BuildValue("si", "back", creature.tilecolor.back)); - PyList_SET_ITEM(list, 5, Py_BuildValue("si", "bright", creature.tilecolor.bright)); + cObj = PyObject_CallObject(CreatureTypeEx_type, args); - PyDict_MergeFromSeq2(c_type, list, 0); - Py_DECREF(list); + Py_DECREF(args); - return c_type; + return cObj; } static PyObject* BuildCreatureTypeExList(std::vector& creatures)