diff --git a/bindings/py3devil1.py b/bindings/py3devil1.py index 7480719..dba57ee 100755 --- a/bindings/py3devil1.py +++ b/bindings/py3devil1.py @@ -1,34 +1,124 @@ #!/usr/bin/python3 import ctypes +#--------------------------------------+ +# Devil 1: PLD +#--------------------------------------+ + class PldHeader(ctypes.Structure): _fields_ = [ ("numOffset", ctypes.c_int), - ("offsets", ctypes.POINTER(ctypes.c_int)) + ("offsets", ctypes.POINTER(ctypes.c_int)) ] class Devil1PLD_FN(ctypes.Structure): _fields_ = [ - ("getheader" , ctypes.CFUNCTYPE(bool, ctypes.POINTER(PldHeader), ctypes.c_char_p)), - ("sizeofsector", ctypes.CFUNCTYPE(int, ctypes.POINTER(PldHeader), ctypes.c_int)), - ("printheader" , ctypes.CFUNCTYPE(None, ctypes.POINTER(PldHeader))) + ("getheader" , ctypes.CFUNCTYPE( + ctypes.c_bool, + ctypes.POINTER(PldHeader), + ctypes.c_char_p)), + ("sizeofsector", ctypes.CFUNCTYPE( + ctypes.c_int, + ctypes.POINTER(PldHeader), + ctypes.c_int)), + ("printheader" , ctypes.CFUNCTYPE(None, + ctypes.POINTER(PldHeader))) ] +#--------------------------------------+ +# Devil 1: TEX +#--------------------------------------+ + +class TexturePack(ctypes.Structure): + _fields_ = [ + ("id", ctypes.c_char * 4), # fixed length 4, reverse order + ("batchNumber", ctypes.c_int), + ("firstBatchOffset", ctypes.c_int), + ("unknownA", ctypes.c_int) + ] + +class TextureBatchDescriptor(ctypes.Structure): + _fields_ = [ + ("batchIdx", ctypes.c_int), + ("hash", ctypes.c_int), + ("texNumber", ctypes.c_int), + ("unknownA", ctypes.c_int * 8), + ("textureSize", ctypes.c_int), + ("unknownB", ctypes.c_int * 30) + ] + +class Texture(ctypes.Structure): + _fields_ = [ + ("data", ctypes.c_ubyte) + ] + +class TextureBatch(ctypes.Structure): + _fields_ = [ + ("batch", ctypes.POINTER(Texture)) + ] + +class Devil1TEX_FN(ctypes.Structure): + _fields_ = [ + ("printheader", ctypes.CFUNCTYPE( + None, + ctypes.POINTER(TexturePack))), + ("printbatchdesc", ctypes.CFUNCTYPE( + None, + ctypes.POINTER(TextureBatchDescriptor))), + ("getbatchdesc", ctypes.CFUNCTYPE( + ctypes.c_bool, + ctypes.POINTER(TextureBatchDescriptor), + ctypes.c_uint, + ctypes.c_char_p, + ctypes.c_uint)), + ("getbatch", ctypes.CFUNCTYPE( + ctypes.c_bool, + ctypes.POINTER(TextureBatch), + ctypes.c_uint, + ctypes.c_char_p, + ctypes.c_uint)), + ("gettexture", ctypes.CFUNCTYPE( + ctypes.c_bool, + ctypes.POINTER(Texture), + ctypes.c_uint, + ctypes.c_char_p, + ctypes.c_uint)) + ] + +#--------------------------------------+ +# Devil 1: GEO +#--------------------------------------+ + +#--------------------------------------+ +# Regular Python +#--------------------------------------+ + +def pldtest(devil1pld, pldheader): + with open("pl01.pld", "rb") as f: + data = f.read() + devil1pld.getheader(ctypes.byref(pldheader), data) + devil1pld.printheader(ctypes.byref(pldheader)) + +def textest(devil1tex, texheader): + with open("pl01.pld_1.txp", "rb") as f: + data = f.read() + texheader = ctypes.cast(data, ctypes.POINTER(TexturePack)) + devil1tex.printheader(texheader) + def main(): sharedlib='./lib3ddevil1.so' libc = ctypes.cdll.LoadLibrary(sharedlib) if (not libc): print("Couldn't load %s" % sharedlib) return 1 - print("OK") - fn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD") + pldfn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD") pldh = PldHeader() - with open("pl01.pld", "rb") as f: - data = f.read() - p = PldHeader() - fn.getheader(ctypes.byref(pldh), data) - fn.printheader(ctypes.byref(pldh)) + pldtest(pldfn, pldh) + + texfn = Devil1TEX_FN.in_dll(libc, "DEVIL1TEX") + texh = TexturePack() + textest(texfn, texh) #---------------------------------------+