first commit
parent
ccc234fc4a
commit
4a0670248d
@ -0,0 +1,273 @@
|
|||||||
|
from ctypes import *
|
||||||
|
from pydftypes import *
|
||||||
|
|
||||||
|
int_ptr = POINTER(c_int)
|
||||||
|
uint_ptr = POINTER(c_uint)
|
||||||
|
|
||||||
|
libdfhack = cdll.libdfhack
|
||||||
|
libdfhack.API_Alloc.restype = c_void_p
|
||||||
|
libdfhack.API_Free.argtypes = [ c_void_p ]
|
||||||
|
|
||||||
|
libdfhack.API_getMemoryInfo.restype = c_void_p
|
||||||
|
libdfhack.API_getProcess.restype = c_void_p
|
||||||
|
libdfhack.API_getWindow.restype = c_void_p
|
||||||
|
|
||||||
|
libdfhack.API_getCreatures.restype = c_void_p
|
||||||
|
libdfhack.API_getMaps.restype = c_void_p
|
||||||
|
libdfhack.API_getGui.restype = c_void_p
|
||||||
|
libdfhack.API_getPosition.restype = c_void_p
|
||||||
|
libdfhack.API_getMaterials.restype = c_void_p
|
||||||
|
libdfhack.API_getTranslation.restype = c_void_p
|
||||||
|
libdfhack.API_getVegetation.restype = c_void_p
|
||||||
|
libdfhack.API_getBuildings.restype = c_void_p
|
||||||
|
libdfhack.API_getConstructions.restype = c_void_p
|
||||||
|
|
||||||
|
class API(object):
|
||||||
|
def __init__(self, memory_path):
|
||||||
|
self._api_ptr = libdfhack.API_Alloc(create_string_buffer(memory_path))
|
||||||
|
|
||||||
|
self._pos_obj = None
|
||||||
|
self._mat_obj = None
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
libdfhack.API_Free(self._api_ptr)
|
||||||
|
|
||||||
|
def attach(self):
|
||||||
|
return libdfhack.API_Attach(self._api_ptr) > 0
|
||||||
|
|
||||||
|
def detach(self):
|
||||||
|
return libdfhack.API_Detach(self._api_ptr) > 0
|
||||||
|
|
||||||
|
def suspend(self):
|
||||||
|
return libdfhack.API_Suspend(self._api_ptr) > 0
|
||||||
|
|
||||||
|
def resume(self):
|
||||||
|
return libdfhack.API_Resume(self._api_ptr) > 0
|
||||||
|
|
||||||
|
def force_resume(self):
|
||||||
|
return libdfhack.API_ForceResume(self._api_ptr) > 0
|
||||||
|
|
||||||
|
def async_suspend(self):
|
||||||
|
return libdfhack.API_AsyncSuspend(self._api_ptr) > 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_attached(self):
|
||||||
|
return libdfhack.API_isAttached(self._api_ptr) > 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_suspended(self):
|
||||||
|
return libdfhack.API_isSuspended(self._api_ptr) > 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def position(self):
|
||||||
|
if self._pos_obj is None:
|
||||||
|
ptr = libdfhack.API_getPosition(self._api_ptr)
|
||||||
|
|
||||||
|
if ptr is not None:
|
||||||
|
return Position(ptr)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return self._pos_obj
|
||||||
|
|
||||||
|
@property
|
||||||
|
def materials(self):
|
||||||
|
if self._mat_obj is None:
|
||||||
|
ptr = libdfhack.API_getMaterials(self._api_ptr)
|
||||||
|
|
||||||
|
if ptr is not None:
|
||||||
|
return Materials(ptr)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return self._mat_obj
|
||||||
|
|
||||||
|
class Position(object):
|
||||||
|
def __init__(self, ptr):
|
||||||
|
self._pos_ptr = ptr
|
||||||
|
|
||||||
|
self._vx, self._vy, self._vz = c_int(), c_int(), c_int()
|
||||||
|
self._cx, self._cy, self._cz = c_int(), c_int(), c_int()
|
||||||
|
self._ww, self._wh = c_int(), c_int()
|
||||||
|
|
||||||
|
def get_view_coords(self):
|
||||||
|
if libdfhack.Position_getViewCoords(self._pos_ptr, byref(self._vx), byref(self._vy), byref(self._vz)) > 0:
|
||||||
|
return (self._vx.value, self._vy.value, self._vz.value)
|
||||||
|
else:
|
||||||
|
return (-1, -1, -1)
|
||||||
|
|
||||||
|
def set_view_coords(self, v_coords):
|
||||||
|
self._vx.value, self._vy.value, self._vz.value = v_coords
|
||||||
|
|
||||||
|
libdfhack.Position_setViewCoords(self._pos_ptr, self._vx, self._vy, self._vz)
|
||||||
|
|
||||||
|
view_coords = property(get_view_coords, set_view_coords)
|
||||||
|
|
||||||
|
def get_cursor_coords(self):
|
||||||
|
if libdfhack.Position_getCursorCoords(self._pos_ptr, byref(self._cx), byref(self._cy), byref(self._cz)) > 0:
|
||||||
|
return (self._cx.value, self._cy.value, self._cz.value)
|
||||||
|
else:
|
||||||
|
return (-1, -1, -1)
|
||||||
|
|
||||||
|
def set_cursor_coords(self, c_coords):
|
||||||
|
self._cx.value, self._cy.value, self_cz.value = c_coords
|
||||||
|
|
||||||
|
libdfhack.Position_setCursorCoords(self._pos_ptr, self._cx, self._cy, self._cz)
|
||||||
|
|
||||||
|
cursor_coords = property(get_cursor_coords, set_cursor_coords)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def window_size(self):
|
||||||
|
if libdfhack.Position_getWindowSize(self._pos_ptr, byref(self._ww), byref(self._wh)) > 0:
|
||||||
|
return (self._ww.value, self._wh.value)
|
||||||
|
else:
|
||||||
|
return (-1, -1)
|
||||||
|
|
||||||
|
libdfhack.Gui_ReadViewScreen.argtypes = [ c_void_p, c_void_p ]
|
||||||
|
|
||||||
|
class Gui(object):
|
||||||
|
def __init__(self, ptr):
|
||||||
|
self._gui_ptr = ptr
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
return libdfhack.Gui_Start(self._gui_ptr)
|
||||||
|
|
||||||
|
def finish(self):
|
||||||
|
return libdfhack.Gui_Finish(self._gui_ptr)
|
||||||
|
|
||||||
|
def read_pause_state(self):
|
||||||
|
return libdfhack.Gui_ReadPauseState(self._pos_ptr) > 0
|
||||||
|
|
||||||
|
def read_view_screen(self):
|
||||||
|
s = ViewScreen()
|
||||||
|
|
||||||
|
if libdfhack.Gui_ReadViewScreen(self._gui_ptr, byref(s)) > 0:
|
||||||
|
return s
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
arr_create_func = CFUNCTYPE(c_void_p, c_int)
|
||||||
|
|
||||||
|
get_arg_types = [ c_void_p, arr_create_func ]
|
||||||
|
|
||||||
|
libdfhack.Materials_getInorganic.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getOrganic.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getTree.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getPlant.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getRace.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getRaceEx.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getColor.argtypes = get_arg_types
|
||||||
|
libdfhack.Materials_getOther.argtypes = get_arg_types
|
||||||
|
|
||||||
|
class Materials(object):
|
||||||
|
def __init__(self, ptr):
|
||||||
|
self._mat_ptr = ptr
|
||||||
|
|
||||||
|
self.inorganic = None
|
||||||
|
self.organic = None
|
||||||
|
self.tree = None
|
||||||
|
self.plant = None
|
||||||
|
self.race = None
|
||||||
|
self.race_ex = None
|
||||||
|
self.color = None
|
||||||
|
self.other = None
|
||||||
|
|
||||||
|
def read_inorganic(self):
|
||||||
|
return libdfhack.Materials_ReadInorganicMaterials(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_organic(self):
|
||||||
|
return libdfhack.Materials_ReadOrganicMaterials(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_wood(self):
|
||||||
|
return libdfhack.Materials_ReadWoodMaterials(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_plant(self):
|
||||||
|
return libdfhack.Materials_ReadPlantMaterials(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_creature_types(self):
|
||||||
|
return libdfhack.Materials_ReadCreatureTypes(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_creature_types_ex(self):
|
||||||
|
return libdfhack.Materials_ReadCreatureTypesEx(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_descriptor_colors(self):
|
||||||
|
return libdfhack.Materials_ReadDescriptorColors(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_others(self):
|
||||||
|
return libdfhack.Materials_ReadOthers(self._mat_ptr)
|
||||||
|
|
||||||
|
def read_all(self):
|
||||||
|
libdfhack.Materials_ReadAllMaterials(self._mat_ptr)
|
||||||
|
|
||||||
|
def get_description(self, material):
|
||||||
|
return libdfhack.Materials_getDescription(self._mat_ptr, byref(material))
|
||||||
|
|
||||||
|
def _allocate_matgloss_array(self, count):
|
||||||
|
arr_type = Matgloss * count
|
||||||
|
|
||||||
|
arr = arr_type()
|
||||||
|
|
||||||
|
ptr = c_void_p()
|
||||||
|
ptr = addressof(arr)
|
||||||
|
|
||||||
|
return (arr, ptr)
|
||||||
|
|
||||||
|
def update_inorganic_cache(self):
|
||||||
|
def update_callback(count):
|
||||||
|
allocated = self._allocate_matgloss_array(count)
|
||||||
|
|
||||||
|
self.inorganic = allocated[0]
|
||||||
|
|
||||||
|
return allocated[1]
|
||||||
|
|
||||||
|
callback = arr_create_func(update_callback)
|
||||||
|
|
||||||
|
return libdfhack.Materials_getInorganic(self._mat_ptr, callback)
|
||||||
|
|
||||||
|
def update_organic_cache(self):
|
||||||
|
def update_callback(count):
|
||||||
|
allocated = self._allocate_matgloss_array(count)
|
||||||
|
|
||||||
|
self.organic = allocated[0]
|
||||||
|
|
||||||
|
return allocated[1]
|
||||||
|
|
||||||
|
callback = arr_create_func(update_callback)
|
||||||
|
|
||||||
|
return libdfhack.Materials_getOrganic(self._mat_ptr, callback)
|
||||||
|
|
||||||
|
def update_tree_cache(self):
|
||||||
|
def update_callback(count):
|
||||||
|
allocated = self._allocate_matgloss_array(count)
|
||||||
|
|
||||||
|
self.tree = allocated[0]
|
||||||
|
|
||||||
|
return allocated[1]
|
||||||
|
|
||||||
|
callback = arr_create_func(update_callback)
|
||||||
|
|
||||||
|
return libdfhack.Materials_getTree(self._mat_ptr, callback)
|
||||||
|
|
||||||
|
def update_plant_cache(self):
|
||||||
|
def update_callback(count):
|
||||||
|
allocated = self._allocate_matgloss_array(count)
|
||||||
|
|
||||||
|
self.plant = allocated[0]
|
||||||
|
|
||||||
|
return allocated[1]
|
||||||
|
|
||||||
|
callback = arr_create_func(update_callback)
|
||||||
|
|
||||||
|
return libdfhack.Materials_getPlant(self._mat_ptr, callback)
|
||||||
|
|
||||||
|
def update_race_cache(self):
|
||||||
|
def update_callback(count):
|
||||||
|
allocated = self._allocate_matgloss_array(count)
|
||||||
|
|
||||||
|
self.race = allocated[0]
|
||||||
|
|
||||||
|
return allocated[1]
|
||||||
|
|
||||||
|
callback = arr_create_func(update_callback)
|
||||||
|
|
||||||
|
return libdfhack.Materials_getRace(self._mat_ptr, callback)
|
@ -0,0 +1,97 @@
|
|||||||
|
#found this in the cookbook: http://code.activestate.com/recipes/576415/
|
||||||
|
|
||||||
|
from ctypes import c_uint
|
||||||
|
|
||||||
|
class C_EnumerationType(type(c_uint)):
|
||||||
|
def __new__(metacls, name, bases, dictionary):
|
||||||
|
if not "_members_" in dictionary:
|
||||||
|
_members_ = {}
|
||||||
|
|
||||||
|
for key, value in dictionary.iteritems():
|
||||||
|
if not key.startswith("_"):
|
||||||
|
_members_[key] = value
|
||||||
|
|
||||||
|
dictionary["_members_"] = _members_
|
||||||
|
|
||||||
|
cls = type(c_uint).__new__(metacls, name, bases, dictionary)
|
||||||
|
|
||||||
|
for key, value in cls._members_.iteritems():
|
||||||
|
globals()[key] = value
|
||||||
|
|
||||||
|
return cls
|
||||||
|
|
||||||
|
def __contains__(self, value):
|
||||||
|
return value in self._members_.values()
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Enumeration %s>" % self.__name__
|
||||||
|
|
||||||
|
class C_Enumeration(c_uint):
|
||||||
|
__metaclass__ = C_EnumerationType
|
||||||
|
_members_ = {}
|
||||||
|
|
||||||
|
def __init__(self, value):
|
||||||
|
for key, value in self._members_.iteritems():
|
||||||
|
if v == value:
|
||||||
|
self.name = key
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise ValueError("No enumeration member with value %r" % value)
|
||||||
|
|
||||||
|
c_uint.__init__(self, value)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<member %s=%d of %r>" % (self.name, self.value, self.__class__)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_param(cls, param):
|
||||||
|
if isinstance(param, C_Enumeration):
|
||||||
|
if param.__class__ != cls:
|
||||||
|
raise ValueError("Cannot mix enumeration members")
|
||||||
|
else:
|
||||||
|
return param
|
||||||
|
else:
|
||||||
|
return cls(param)
|
||||||
|
|
||||||
|
FeatureType = C_EnumerationType("FeatureType",
|
||||||
|
(c_uint,),
|
||||||
|
{"Other" : 0,
|
||||||
|
"Adamantine_Tube" : 1,
|
||||||
|
"Underworld" : 2,
|
||||||
|
"Hell_Temple" : 3})
|
||||||
|
|
||||||
|
BiomeOffset = C_EnumerationType("BiomeOffset",
|
||||||
|
(c_uint,),
|
||||||
|
{"NorthWest" : 0,
|
||||||
|
"North" : 1,
|
||||||
|
"NorthEast" : 2,
|
||||||
|
"West" : 3,
|
||||||
|
"Here" : 4,
|
||||||
|
"East" : 5,
|
||||||
|
"SouthWest" : 6,
|
||||||
|
"South" : 7,
|
||||||
|
"SouthEast" : 8,
|
||||||
|
"BiomeCount" : 9})
|
||||||
|
|
||||||
|
TrafficType = C_EnumerationType("TrafficType",
|
||||||
|
(c_uint,),
|
||||||
|
{"Normal" : 0,
|
||||||
|
"Low" : 1,
|
||||||
|
"High" : 2,
|
||||||
|
"Restricted" : 3})
|
||||||
|
|
||||||
|
DesignationType = C_EnumerationType("DesignationType",
|
||||||
|
(c_uint,),
|
||||||
|
{"No" : 0,
|
||||||
|
"Default" : 1,
|
||||||
|
"UD_Stair" : 2,
|
||||||
|
"Channel" : 3,
|
||||||
|
"Ramp" : 4,
|
||||||
|
"D_Stair" : 5,
|
||||||
|
"U_Stair" : 6,
|
||||||
|
"Whatever" : 7})
|
||||||
|
|
||||||
|
LiquidType = C_EnumerationType("LiquidType",
|
||||||
|
(c_uint,),
|
||||||
|
{"Water" : 0,
|
||||||
|
"Magma" : 1})
|
@ -0,0 +1,200 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from ctypes import Structure, Union, c_uint
|
||||||
|
from enum import *
|
||||||
|
|
||||||
|
class DesignationStruct(Structure):
|
||||||
|
_fields_ = [("flow_size", c_uint, 3),
|
||||||
|
("pile", c_uint, 1),
|
||||||
|
("dig", DesignationType, 3),
|
||||||
|
("smooth", c_uint, 2),
|
||||||
|
("hidden", c_uint, 1),
|
||||||
|
("geolayer_index", c_uint, 4),
|
||||||
|
("light", c_uint, 1),
|
||||||
|
("subterranean", c_uint, 1),
|
||||||
|
("skyview", c_uint, 1),
|
||||||
|
("biome", c_uint, 4),
|
||||||
|
("liquid_type", c_uint, 1),
|
||||||
|
("water_table", c_uint, 1),
|
||||||
|
("rained", c_uint, 1),
|
||||||
|
("traffic", c_uint, 2),
|
||||||
|
("flow_forbid", c_uint, 1),
|
||||||
|
("liquid_static", c_uint, 1),
|
||||||
|
("feature_local", c_uint, 1),
|
||||||
|
("feature_global", c_uint, 1),
|
||||||
|
("liquid_character", c_uint, 2)]
|
||||||
|
|
||||||
|
class DesignationFlags(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", DesignationStruct)]
|
||||||
|
|
||||||
|
def __init__(self, initial = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
||||||
|
|
||||||
|
class OccupancyStruct(Structure):
|
||||||
|
_fields_ = [("building", c_uint, 3),
|
||||||
|
("unit", c_uint, 1),
|
||||||
|
("unit_grounded", c_uint, 1),
|
||||||
|
("item", c_uint, 1),
|
||||||
|
("splatter", c_uint, 26)]
|
||||||
|
|
||||||
|
class OccupancyFlags(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", OccupancyStruct)]
|
||||||
|
|
||||||
|
def __init__(self, initial = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
||||||
|
|
||||||
|
class CreatureStruct1(Structure):
|
||||||
|
_fields_ = [("move_state", c_uint, 1),
|
||||||
|
("dead", c_uint, 1),
|
||||||
|
("has_mood", c_uint, 1),
|
||||||
|
("had_mood", c_uint, 1),
|
||||||
|
("marauder", c_uint, 1),
|
||||||
|
("drowning", c_uint, 1),
|
||||||
|
("merchant", c_uint, 1),
|
||||||
|
("forest", c_uint, 1),
|
||||||
|
("left", c_uint, 1),
|
||||||
|
("rider", c_uint, 1),
|
||||||
|
("incoming", c_uint, 1),
|
||||||
|
("diplomat", c_uint, 1),
|
||||||
|
("zombie", c_uint, 1),
|
||||||
|
("skeleton", c_uint, 1),
|
||||||
|
("can_swap", c_uint, 1),
|
||||||
|
("on_ground", c_uint, 1),
|
||||||
|
("projectile", c_uint, 1),
|
||||||
|
("active_invader", c_uint, 1),
|
||||||
|
("hidden_in_ambush", c_uint, 1),
|
||||||
|
("invader_origin", c_uint, 1),
|
||||||
|
("coward", c_uint, 1),
|
||||||
|
("hidden_ambusher", c_uint, 1),
|
||||||
|
("invades", c_uint, 1),
|
||||||
|
("check_flows", c_uint, 1),
|
||||||
|
("ridden", c_uint, 1),
|
||||||
|
("caged", c_uint, 1),
|
||||||
|
("tame", c_uint, 1),
|
||||||
|
("chained", c_uint, 1),
|
||||||
|
("royal_guard", c_uint, 1),
|
||||||
|
("fortress_guard", c_uint, 1),
|
||||||
|
("suppress_wield", c_uint, 1),
|
||||||
|
("important_historical_figure", c_uint, 1)]
|
||||||
|
|
||||||
|
class CreatureFlags1(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", CreatureStruct1)]
|
||||||
|
|
||||||
|
def __init__(self, initial = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
||||||
|
|
||||||
|
class CreatureStruct2(Structure):
|
||||||
|
_fields_ = [("swimming", c_uint, 1),
|
||||||
|
("sparring", c_uint, 1),
|
||||||
|
("no_notify", c_uint, 1),
|
||||||
|
("unused", c_uint, 1),
|
||||||
|
("calculated_nerves", c_uint, 1),
|
||||||
|
("calculated_bodyparts", c_uint, 1),
|
||||||
|
("important_historical_figure", c_uint, 1),
|
||||||
|
("killed", c_uint, 1),
|
||||||
|
("cleanup_1", c_uint, 1),
|
||||||
|
("cleanup_2", c_uint, 1),
|
||||||
|
("cleanup_3", c_uint, 1),
|
||||||
|
("for_trade", c_uint, 1),
|
||||||
|
("trade_resolved", c_uint, 1),
|
||||||
|
("has_breaks", c_uint, 1),
|
||||||
|
("gutted", c_uint, 1),
|
||||||
|
("circulatory_spray", c_uint, 1),
|
||||||
|
("locked_in_for_trading", c_uint, 1),
|
||||||
|
("slaughter", c_uint, 1),
|
||||||
|
("underworld", c_uint, 1),
|
||||||
|
("resident", c_uint, 1),
|
||||||
|
("cleanup_4", c_uint, 1),
|
||||||
|
("calculated_insulation", c_uint, 1),
|
||||||
|
("visitor_uninvited", c_uint, 1),
|
||||||
|
("visitor", c_uint, 1),
|
||||||
|
("calculated_inventory", c_uint, 1),
|
||||||
|
("vision_good", c_uint, 1),
|
||||||
|
("vision_damaged", c_uint, 1),
|
||||||
|
("vision_missing", c_uint, 1),
|
||||||
|
("breathing_good", c_uint, 1),
|
||||||
|
("breathing_problem", c_uint, 1),
|
||||||
|
("roaming_wilderness_population_source", c_uint, 1),
|
||||||
|
("roaming_wilderness_population_source_not_a_map_feature", c_uint, 1)]
|
||||||
|
|
||||||
|
class CreatureFlags2(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", CreatureStruct2)]
|
||||||
|
|
||||||
|
def __init__(self, initial = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
||||||
|
|
||||||
|
class ItemStruct(Structure):
|
||||||
|
_fields_ = [("on_ground", c_uint, 1),
|
||||||
|
("in_job", c_uint, 1),
|
||||||
|
("in_inventory", c_uint, 1),
|
||||||
|
("u_ngrd1", c_uint, 1),
|
||||||
|
("in_workshop", c_uint, 1),
|
||||||
|
("u_ngrd2", c_uint, 1),
|
||||||
|
("u_ngrd3", c_uint, 1),
|
||||||
|
("rotten", c_uint, 1),
|
||||||
|
("unk1", c_uint, 1),
|
||||||
|
("u_ngrd4", c_uint, 1),
|
||||||
|
("unk2", c_uint, 1),
|
||||||
|
("u_ngrd5", c_uint, 1),
|
||||||
|
("unk3", c_uint, 1),
|
||||||
|
("u_ngrd6", c_uint, 1),
|
||||||
|
("narrow", c_uint, 1),
|
||||||
|
("u_ngrd7", c_uint, 1),
|
||||||
|
("worn", c_uint, 1),
|
||||||
|
("unk4", c_uint, 1),
|
||||||
|
("u_ngrd8", c_uint, 1),
|
||||||
|
("forbid", c_uint, 1),
|
||||||
|
("unk5", c_uint, 1),
|
||||||
|
("dump", c_uint, 1),
|
||||||
|
("on_fire", c_uint, 1),
|
||||||
|
("melt", c_uint, 1),
|
||||||
|
("hidden", c_uint, 1),
|
||||||
|
("u_ngrd9", c_uint, 1),
|
||||||
|
("unk6", c_uint, 1),
|
||||||
|
("unk7", c_uint, 1),
|
||||||
|
("unk8", c_uint, 1),
|
||||||
|
("unk9", c_uint, 1),
|
||||||
|
("unk10", c_uint, 1),
|
||||||
|
("unk11", c_uint, 1)]
|
||||||
|
|
||||||
|
class ItemFlags(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", ItemStruct)]
|
||||||
|
|
||||||
|
def __init__(self, initial = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
||||||
|
|
||||||
|
class BlockFlagStruct(Structure):
|
||||||
|
_fields_ = [("designated", c_uint, 1),
|
||||||
|
("unk_1", c_uint, 1),
|
||||||
|
("liquid_1", c_uint, 1),
|
||||||
|
("liquid_2", c_uint, 1),
|
||||||
|
("unk_2", c_uint, 28)]
|
||||||
|
|
||||||
|
class BlockFlags(Union):
|
||||||
|
_fields_ = [("whole", c_uint, 32),
|
||||||
|
("bits", BlockFlagStruct)]
|
||||||
|
|
||||||
|
def __init__(self, inital = 0):
|
||||||
|
self.whole = initial
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return self.whole
|
@ -0,0 +1,134 @@
|
|||||||
|
from ctypes import *
|
||||||
|
from collections import namedtuple
|
||||||
|
from pydfhackflags import *
|
||||||
|
from enum import *
|
||||||
|
|
||||||
|
Position3D = namedtuple("Position3D", "x, y, z")
|
||||||
|
Rectangle = namedtuple("Rectangle", "x1, y1, x2, y2")
|
||||||
|
Note = namedtuple("Note", "symbol, foreground, background, name, position")
|
||||||
|
Settlement = namedtuple("Settlement", "origin, name, world_pos, local_pos")
|
||||||
|
Attribute = namedtuple("Attribute", "level, field_4, field_8, field_C, leveldiff, field_14, field_18");
|
||||||
|
Skill = namedtuple("Skill", "id, experience, rating")
|
||||||
|
Tree = namedtuple("Tree", "type, material, position, address")
|
||||||
|
CreatureCaste = namedtuple("CreatureCaste", "rawname, singular, plural, adjective")
|
||||||
|
CreatureTypeEx = namedtuple("CreatureTypeEx", "rawname, castes, tile_character, tilecolor")
|
||||||
|
TileColor = namedtuple("TileColor", "fore, back, bright")
|
||||||
|
Name = namedtuple("Name", "first_name, nickname, language, has_name, words, parts_of_speech")
|
||||||
|
|
||||||
|
TileTypes40d = ((c_int * 16) * 16)
|
||||||
|
BiomeIndices40d = c_ubyte * 16
|
||||||
|
Temperatures = ((c_ushort * 16) * 16)
|
||||||
|
Designations40d = ((DesignationFlags * 16) * 16)
|
||||||
|
Occupancies40d = ((OccupancyFlags * 16) * 16)
|
||||||
|
|
||||||
|
class Position2D(Structure):
|
||||||
|
_fields_ = [("x", c_ushort),
|
||||||
|
("y", c_ushort)]
|
||||||
|
|
||||||
|
class PlaneCoord(Union):
|
||||||
|
_fields_ = [("xy", c_uint),
|
||||||
|
("dim", Position2D)]
|
||||||
|
|
||||||
|
def __cmp__(self, other):
|
||||||
|
if isinstance(other, PlaneCoord):
|
||||||
|
return self.xy - other.xy
|
||||||
|
else:
|
||||||
|
raise TypeError("argument must be of type %s" % type(self))
|
||||||
|
|
||||||
|
class Feature(Structure):
|
||||||
|
_fields_ = [("type", FeatureType),
|
||||||
|
("main_material", c_short),
|
||||||
|
("sub_material", c_short),
|
||||||
|
("discovered", c_byte),
|
||||||
|
("origin", c_uint)]
|
||||||
|
|
||||||
|
class Vein(Structure):
|
||||||
|
_fields_ = [("vtable", c_uint),
|
||||||
|
("type", c_int),
|
||||||
|
("assignment", c_short * 16),
|
||||||
|
("flags", c_uint),
|
||||||
|
("address_of", c_uint)]
|
||||||
|
|
||||||
|
class FrozenLiquidVein(Structure):
|
||||||
|
_fields_ = [("vtable", c_uint),
|
||||||
|
("tiles", TileTypes40d),
|
||||||
|
("address_of", c_uint)]
|
||||||
|
|
||||||
|
class SpatterVein(Structure):
|
||||||
|
_fields_ = [("vtable", c_uint),
|
||||||
|
("mat1", c_ushort),
|
||||||
|
("unk1", c_ushort),
|
||||||
|
("mat2", c_uint),
|
||||||
|
("mat3", c_ushort),
|
||||||
|
("intensity", ((c_ubyte * 16) * 16)),
|
||||||
|
("address_of", c_uint)]
|
||||||
|
|
||||||
|
class Soul(object):
|
||||||
|
def __init__(self, *args, **kwds):
|
||||||
|
if kwds:
|
||||||
|
for k, v in kwds.iteritems():
|
||||||
|
self.__dict__[k] = v
|
||||||
|
|
||||||
|
class MapBlock40d(Structure):
|
||||||
|
_fields_ = [("tiletypes", TileTypes40d),
|
||||||
|
("designation", Designations40d),
|
||||||
|
("occupancy", Occupancies40d),
|
||||||
|
("biome_indices", BiomeIndices40d),
|
||||||
|
("origin", c_uint),
|
||||||
|
("blockflags", BlockFlags),
|
||||||
|
("global_feature", c_short),
|
||||||
|
("local_feature", c_short)]
|
||||||
|
|
||||||
|
|
||||||
|
class ViewScreen(Structure):
|
||||||
|
_fields_ = [("type", c_int)]
|
||||||
|
|
||||||
|
class Matgloss(Structure):
|
||||||
|
_fields_ = [("id", c_char * 128),
|
||||||
|
("fore", c_byte),
|
||||||
|
("back", c_byte),
|
||||||
|
("bright", c_byte),
|
||||||
|
("name", c_char * 128)]
|
||||||
|
|
||||||
|
class MatglossPair(Structure):
|
||||||
|
_fields_ [("type", c_short),
|
||||||
|
("index", c_int)]
|
||||||
|
|
||||||
|
class Descriptor_Color(Structure):
|
||||||
|
_fields_ = [("id", c_char * 128),
|
||||||
|
("r", c_float),
|
||||||
|
("v", c_float),
|
||||||
|
("b", c_float),
|
||||||
|
("name", c_char * 128)]
|
||||||
|
|
||||||
|
class MatglossOther(Structure):
|
||||||
|
_fields_ = [("rawname", c_char * 128)]
|
||||||
|
|
||||||
|
class Building(Structure):
|
||||||
|
_fields_ = [("origin", c_uint),
|
||||||
|
("vtable", c_uint),
|
||||||
|
("x1", c_uint),
|
||||||
|
("y1", c_uint),
|
||||||
|
("x2", c_uint),
|
||||||
|
("y2", c_uint),
|
||||||
|
("z", c_uint),
|
||||||
|
("material", MatglossPair),
|
||||||
|
("type", c_uint)]
|
||||||
|
|
||||||
|
class CustomWorkshop(Structure):
|
||||||
|
_fields_ = [("index", c_uint),
|
||||||
|
("name", c_char * 256)]
|
||||||
|
|
||||||
|
class Construction(Structure):
|
||||||
|
_fields_ = [("x", c_ushort),
|
||||||
|
("y", c_ushort),
|
||||||
|
("z", c_ushort),
|
||||||
|
("form", c_ushort),
|
||||||
|
("unk_8", c_ushort),
|
||||||
|
("mat_type", c_ushort),
|
||||||
|
("mat_idx", c_ushort),
|
||||||
|
("unk3", c_ushort),
|
||||||
|
("unk4", c_ushort),
|
||||||
|
("unk5", c_ushort),
|
||||||
|
("unk6", c_uint),
|
||||||
|
("origin", c_uint)]
|
Loading…
Reference in New Issue