From 159805412b29e0d1fe57ec9dc01922b12cfe025e Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 12:59:38 +0900 Subject: [PATCH 1/8] feat: basic 'scenario.chk.patch' file (section-level bsdiff of input & output chk) --- eudplib/core/mapdata/chktok.py | 5 +++++ eudplib/core/mapdata/mapdata.py | 9 ++++++++- eudplib/maprw/chkdiff.py | 19 +++++++++++++++++++ eudplib/maprw/savemap.py | 6 ++++++ setup.py | 3 +++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 eudplib/maprw/chkdiff.py diff --git a/eudplib/core/mapdata/chktok.py b/eudplib/core/mapdata/chktok.py index ed264db8..abb34252 100644 --- a/eudplib/core/mapdata/chktok.py +++ b/eudplib/core/mapdata/chktok.py @@ -80,6 +80,11 @@ def loadchk(self, b): return True + def clone (self): + t = CHK() + t.sections = dict(self.sections) + return t + def savechk(self): # calculate output size blist = [] diff --git a/eudplib/core/mapdata/mapdata.py b/eudplib/core/mapdata/mapdata.py index 179354f8..ff3c1fa6 100644 --- a/eudplib/core/mapdata/mapdata.py +++ b/eudplib/core/mapdata/mapdata.py @@ -30,12 +30,14 @@ _inited = False _chkt = None +_origchkt = None _rawfile = None def InitMapData(chkt, rawfile): - global _inited, _chkt, _rawfile + global _inited, _origchkt, _chkt, _rawfile _chkt = chkt + _origchkt = chkt.clone() _rawfile = rawfile InitStringMap(chkt) @@ -58,5 +60,10 @@ def GetChkTokenized(): return _chkt +def GetOriginalChkTokenized(): + """ NEVER MODIFY ANYTHING WITHIN THIS CHKTOK """ + return _origchkt + + def GetRawFile(): return _rawfile diff --git a/eudplib/maprw/chkdiff.py b/eudplib/maprw/chkdiff.py new file mode 100644 index 00000000..b2b9936e --- /dev/null +++ b/eudplib/maprw/chkdiff.py @@ -0,0 +1,19 @@ +import bsdiff4 +from ..core.mapdata.chktok import CHK + +def chkdiff(src, dst): + """CHK Diff""" + + out = CHK() + + for sectionName in dst.enumsection(): + try: + srcSec = src.getsection(sectionName) + except KeyError: + srcSec = b'' + dstSec = dst.getsection(sectionName) + diff = bsdiff4.diff(srcSec, dstSec) + + out.setsection(sectionName, diff) + + return out.savechk() diff --git a/eudplib/maprw/savemap.py b/eudplib/maprw/savemap.py index a871928a..d1bdefbc 100644 --- a/eudplib/maprw/savemap.py +++ b/eudplib/maprw/savemap.py @@ -30,6 +30,7 @@ from .injector.mainloop import _MainStarter from .mpqadd import UpdateMPQ from ..core.eudfunc.trace.tracetool import _GetTraceMap, _ResetTraceMap +from .chkdiff import chkdiff import binascii @@ -72,12 +73,17 @@ def SaveMap(fname, rootf): rawchk = chkt.savechk() print("Output scenario.chk : %.3fMB" % (len(rawchk) / 1000000)) + # Get diff + origchkt = mapdata.GetOriginalChkTokenized() + diff = chkdiff(origchkt, chkt) + # Process by modifying existing mpqfile open(fname, "wb").write(mapdata.GetRawFile()) mw = mpqapi.MPQ() mw.Open(fname) mw.PutFile("staredit\\scenario.chk", rawchk) + mw.PutFile("staredit\\scenario.chk.patch", diff) UpdateMPQ(mw) mw.Compact() mw.Close() diff --git a/setup.py b/setup.py index 2ef0b251..2599acc6 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,9 @@ def cythonize(x): package_data={"": ["*.c", "*.pyx", "*.dll", "*.dylib", "*.lst"]}, ext_modules=cythonize(["eudplib/**/*.pyx"]), python_requires=">=3", + install_requires=[ + 'bsdiff4', + ], # metadata for upload to PyPI author="Trgk", author_email="whyask37@naver.com", From efadaee5eeb1eb41a52cf5138756f65278e12a1d Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 13:21:53 +0900 Subject: [PATCH 2/8] fix: vbuf.pyx now supports cython this seems to be broken w/ eudx patch. Now it's fixed --- eudplib/core/variable/vbuf.pyx | 25 ++++++++---- tests/unittests/__epspy__/test_eps_epsfile.py | 38 +++---------------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/eudplib/core/variable/vbuf.pyx b/eudplib/core/variable/vbuf.pyx index 3319c1f0..629056b9 100644 --- a/eudplib/core/variable/vbuf.pyx +++ b/eudplib/core/variable/vbuf.pyx @@ -43,19 +43,24 @@ class EUDVarBuffer(EUDObject): self._vdict = {} self._initvals = [] + self._flags = [] def DynamicConstructed(self): return True - def CreateVarTrigger(self, v, initval): + def CreateVarTrigger(self, v, initval, flag=None): ret = self + (72 * len(self._initvals)) self._initvals.append(initval) + self._flags.append(flag) self._vdict[v] = ret return ret - def CreateMultipleVarTriggers(self, v, initvals): + def CreateMultipleVarTriggers(self, v, initvals, flags=None): ret = self + (72 * len(self._initvals)) self._initvals.extend(initvals) + if flags is None: + flags = [None] * len(initvals) + self._flags.extend(flags) self._vdict[v] = ret return ret @@ -70,14 +75,20 @@ class EUDVarBuffer(EUDObject): def WritePayload(self, emitbuffer): cdef size_t i, heads, heade cdef size_t olen = 2408 + 72 * (len(self._initvals) - 1) - cdef uint8_t* output = PyMem_Malloc(olen) + cdef uint8_t * output = PyMem_Malloc(olen) memset(output, 0, olen) cdef uint32_t iv2 - + for i in range(len(self._initvals)): # 'preserve rawtrigger' - ((output + 72 * i + 2376))[0] = 4 - ((output + 72 * i + 352))[0] = 0x072D0000 + ( < uint32_t*>(output + 72 * i + 2376))[0] = 4 + ( < uint32_t*>(output + 72 * i + 352))[0] = 0x072D0000 + + for i, flag in enumerate(self._flags): + if flag is None: + continue + ( < uint32_t*>(output + 72 * i + 328))[0] = (flag & 0xFFFFFFFF) + ( < uint32_t*>(output + 72 * i + 356))[0] = 0x43530000 heads = 0 for i, initval in enumerate(self._initvals): @@ -86,7 +97,7 @@ class EUDVarBuffer(EUDObject): continue elif isinstance(initval, int): iv2 = initval & 0xFFFFFFFF - ((output + heade))[0] = iv2 + ( < uint32_t*>(output + heade))[0] = iv2 continue emitbuffer.WriteBytes(output[heads:heade]) emitbuffer.WriteDword(initval) diff --git a/tests/unittests/__epspy__/test_eps_epsfile.py b/tests/unittests/__epspy__/test_eps_epsfile.py index 4f6fa993..c41ef4f6 100644 --- a/tests/unittests/__epspy__/test_eps_epsfile.py +++ b/tests/unittests/__epspy__/test_eps_epsfile.py @@ -1,42 +1,33 @@ ## NOTE: THIS FILE IS GENERATED BY EPSCRIPT! DO NOT MODITY from eudplib import * - def _IGVA(vList, exprListGen): def _(): exprList = exprListGen() SetVariables(vList, exprList) - EUDOnStart(_) - def _CGFW(exprf, retn): rets = [ExprProxy(None) for _ in range(retn)] - def _(): vals = exprf() for ret, val in zip(rets, vals): ret._value = val - EUDOnStart(_) return rets - def _ARR(items): k = EUDArray(len(items)) for i, item in enumerate(items): k[i] = item return k - def _SRET(v, klist): return List2Assignable([v[k] for k in klist]) - def _SV(dL, sL): [d << s for d, s in zip(FlattenList(dL), FlattenList(sL))] - class _ATTW: def __init__(self, obj, attrName): self.obj = obj @@ -73,7 +64,6 @@ def __ixor__(self, v): ov = getattr(self.obj, self.attrName) setattr(self.obj, self.attrName, ov ^ v) - class _ARRW: def __init__(self, obj, index): self.obj = obj @@ -110,7 +100,6 @@ def __ixor__(self, v): ov = self.obj[self.index] self.obj[self.index] = ov ^ v - def _L2V(l): ret = EUDVariable() if EUDIf()(l): @@ -120,19 +109,14 @@ def _L2V(l): EUDEndIf() return ret - def _MVAR(vs): - return List2Assignable( - [v.makeL() if IsEUDVariable(v) else EUDVariable() << v for v in FlattenList(vs)] - ) - + return List2Assignable([ + v.makeL() if IsEUDVariable(v) else EUDVariable() << v + for v in FlattenList(vs)]) def _LSH(l, r): - if IsEUDVariable(l): - return f_bitlshift(l, r) - else: - return l << r - + if IsEUDVariable(l): return f_bitlshift(l, r) + else: return l << r ## NOTE: THIS FILE IS GENERATED BY EPSCRIPT! DO NOT MODITY @@ -144,16 +128,7 @@ def _LSH(l, r): # (Line 7) square(4), # (Line 8) square(5) # (Line 9) ]; -a = _CGFW( - lambda: [ - _ARR( - FlattenList( - [f_square(1), f_square(2), f_square(3), f_square(4), f_square(5)] - ) - ) - ], - 1, -)[0] +a = _CGFW(lambda: [_ARR(FlattenList([f_square(1), f_square(2), f_square(3), f_square(4), f_square(5)]))], 1)[0] # (Line 11) function square(x) { @EUDFunc def f_square(x): @@ -162,7 +137,6 @@ def f_square(x): # (Line 14) } # (Line 16) function constv_thing() { - @EUDFunc def f_constv_thing(): # (Line 17) return a[0] + a[1] + a[2] + a[3] + a[4]; From 2cfdace334fa3ec277327bf7bf133819104ca794 Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 13:35:05 +0900 Subject: [PATCH 3/8] fix: f_wwrite_epd acting as f_bwrite_epd --- eudplib/eudlib/memiof/bwepdio.py | 16 +++++++++++----- tests/unittests/test_ctypes.py | 8 ++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/eudplib/eudlib/memiof/bwepdio.py b/eudplib/eudlib/memiof/bwepdio.py index 876f4ace..0534092b 100644 --- a/eudplib/eudlib/memiof/bwepdio.py +++ b/eudplib/eudlib/memiof/bwepdio.py @@ -54,11 +54,17 @@ def _wwriter(epd, subp, w): def f_wwrite_epd(epd, subp, w): - try: - cs.DoActions( - c.SetDeathsX(epd, c.SetTo, w * (256 ** subp), 0, 255 * 2 ** (8 * subp)) - ) - except (TypeError): + if type(subp) is int: + if subp == 3: + return _wwriter(epd, subp, w) + + try: + cs.DoActions( + c.SetDeathsX(epd, c.SetTo, w << (8 * subp), 0, 0xffff << (8 * subp)) + ) + except (TypeError): + _wwriter(epd, subp, w) + else: _wwriter(epd, subp, w) diff --git a/tests/unittests/test_ctypes.py b/tests/unittests/test_ctypes.py index 2b0ead1b..81ecbb25 100644 --- a/tests/unittests/test_ctypes.py +++ b/tests/unittests/test_ctypes.py @@ -26,7 +26,11 @@ def test_ctypes(): a_.c = 0x0302 a_.e = 0x11 - test_assert( + m = f_dwread_epd(EPD(a) + 0) + n = f_dwread_epd(EPD(a) + 1) + + test_equality( "Writing to EPDOffsetMap", - [Memory(a + 0, Exactly, 0x03020B0A), Memory(a + 4, Exactly, 0x11060504)], + [f_dwread_epd(EPD(a) + 0), f_dwread_epd(EPD(a) + 1)], + [0x03020B0A, 0x11060504] ) From 0ecaf9c8a8937ed49bbf44b939c0cda6d6792c75 Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 13:50:45 +0900 Subject: [PATCH 4/8] feat(unprotection): lzma & encryption for scenario.chk.patch --- eudplib/maprw/__init__.py | 2 +- eudplib/maprw/chkdiff.py | 5 ++++- eudplib/maprw/savemap.py | 28 ++++++++++++++++++++++------ setup.py | 2 ++ tests/test_unittest.py | 1 + 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/eudplib/maprw/__init__.py b/eudplib/maprw/__init__.py index f4e6c8f1..58ec4d2f 100644 --- a/eudplib/maprw/__init__.py +++ b/eudplib/maprw/__init__.py @@ -24,7 +24,7 @@ """ from .loadmap import LoadMap -from .savemap import SaveMap +from .savemap import SaveMap, PRT_SetPatchPassword from .injector.mainloop import EUDDoEvents, EUDOnStart from .mpqadd import MPQAddFile, MPQAddWave from .inlinecode.ilcprocesstrig import PRT_SetInliningRate diff --git a/eudplib/maprw/chkdiff.py b/eudplib/maprw/chkdiff.py index b2b9936e..b81ca490 100644 --- a/eudplib/maprw/chkdiff.py +++ b/eudplib/maprw/chkdiff.py @@ -12,7 +12,10 @@ def chkdiff(src, dst): except KeyError: srcSec = b'' dstSec = dst.getsection(sectionName) - diff = bsdiff4.diff(srcSec, dstSec) + if srcSec == dstSec: + diff = b'' + else: + diff = bsdiff4.diff(srcSec, dstSec) out.setsection(sectionName, diff) diff --git a/eudplib/maprw/savemap.py b/eudplib/maprw/savemap.py index d1bdefbc..0ad2f1e2 100644 --- a/eudplib/maprw/savemap.py +++ b/eudplib/maprw/savemap.py @@ -31,12 +31,20 @@ from .mpqadd import UpdateMPQ from ..core.eudfunc.trace.tracetool import _GetTraceMap, _ResetTraceMap from .chkdiff import chkdiff -import binascii +import binascii +import lzma +import simplecrypt traceHeader = None traceMap = [] +patchPassword = None + +def PRT_SetPatchPassword(password): + global patchPassword + patchPassword = password + def getTraceMap(): global traceMap, traceHeader @@ -73,17 +81,25 @@ def SaveMap(fname, rootf): rawchk = chkt.savechk() print("Output scenario.chk : %.3fMB" % (len(rawchk) / 1000000)) - # Get diff - origchkt = mapdata.GetOriginalChkTokenized() - diff = chkdiff(origchkt, chkt) - # Process by modifying existing mpqfile open(fname, "wb").write(mapdata.GetRawFile()) mw = mpqapi.MPQ() mw.Open(fname) mw.PutFile("staredit\\scenario.chk", rawchk) - mw.PutFile("staredit\\scenario.chk.patch", diff) + + # Get diff + if patchPassword: + print('[U] Patch-based unprotection enabled.') + origchkt = mapdata.GetOriginalChkTokenized() + print(' 1. Calculating bsdiff btw original & new chk') + diff = chkdiff(origchkt, chkt) + print(' 2. Compressing') + diff = lzma.compress(diff) + print(' 3. Encrypting') + diff = simplecrypt.encrypt(patchPassword, diff) + mw.PutFile("staredit\\scenario.chk.patch", diff) + UpdateMPQ(mw) mw.Compact() mw.Close() diff --git a/setup.py b/setup.py index 2599acc6..505ff809 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,8 @@ def cythonize(x): python_requires=">=3", install_requires=[ 'bsdiff4', + 'simple-crypt', + 'appdirs', ], # metadata for upload to PyPI author="Trgk", diff --git a/tests/test_unittest.py b/tests/test_unittest.py index 446d383b..698a1f8c 100644 --- a/tests/test_unittest.py +++ b/tests/test_unittest.py @@ -57,6 +57,7 @@ def f(): + helper.PRT_SetPatchPassword('whatislove?') helper.test_runall("unittest") From 443d5bf2df9b71ab727025b2df20b778a1037e46 Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 14:03:18 +0900 Subject: [PATCH 5/8] utf-8 licensing --- encoding_apply.py | 24 +++---------------- eudplib/epscript/cpp/atomRunTest.py | 4 ++++ eudplib/epscript/cpp/epGlobalGetter.py | 4 ++++ .../epscript/cpp/parser/parsePathFinder.py | 4 ++++ eudplib/eudlib/epdoffsetmap.py | 4 ++++ eudplib/eudlib/stringf/cp949_table.py | 4 ++++ eudplib/eudlib/stringf/cputf8.py | 4 ++++ eudplib/maprw/chkdiff.py | 4 ++++ 8 files changed, 31 insertions(+), 21 deletions(-) diff --git a/encoding_apply.py b/encoding_apply.py index 8ce40116..f07cbe25 100644 --- a/encoding_apply.py +++ b/encoding_apply.py @@ -4,32 +4,14 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -''' -Copyright (c) 2014 trgk - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -''' """ print('Auto "license inserter') for root, dirs, files in os.walk("eudplib"): + if 'pybind11' in root: + continue + for f in files: if f[-3:] == ".py": finalpath = os.path.join(root, f) diff --git a/eudplib/epscript/cpp/atomRunTest.py b/eudplib/epscript/cpp/atomRunTest.py index 5f984ba3..32d55c80 100644 --- a/eudplib/epscript/cpp/atomRunTest.py +++ b/eudplib/epscript/cpp/atomRunTest.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + import os os.execv("../epScript-build/epScriptTest", ["../epScript-build/epScriptTest"]) diff --git a/eudplib/epscript/cpp/epGlobalGetter.py b/eudplib/epscript/cpp/epGlobalGetter.py index 6919c870..1e7d9bdb 100644 --- a/eudplib/epscript/cpp/epGlobalGetter.py +++ b/eudplib/epscript/cpp/epGlobalGetter.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + import eudplib import types import re diff --git a/eudplib/epscript/cpp/parser/parsePathFinder.py b/eudplib/epscript/cpp/parser/parsePathFinder.py index 938eac8d..23eb8d88 100644 --- a/eudplib/epscript/cpp/parser/parsePathFinder.py +++ b/eudplib/epscript/cpp/parser/parsePathFinder.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + # Print possible path to each states import re diff --git a/eudplib/eudlib/epdoffsetmap.py b/eudplib/eudlib/epdoffsetmap.py index a2104553..3ac8e0d2 100644 --- a/eudplib/eudlib/epdoffsetmap.py +++ b/eudplib/eudlib/epdoffsetmap.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + from .memiof import ( f_epdread_epd, f_dwread_epd, diff --git a/eudplib/eudlib/stringf/cp949_table.py b/eudplib/eudlib/stringf/cp949_table.py index 870cde93..3a78d162 100644 --- a/eudplib/eudlib/stringf/cp949_table.py +++ b/eudplib/eudlib/stringf/cp949_table.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + cp949_table = [ ((0x81, 0x41), (0xAC02)), #HANGUL SYLLABLE KIYEOK A SSANGKIYEOK ((0x81, 0x42), (0xAC03)), #HANGUL SYLLABLE KIYEOK A KIYEOKSIOS diff --git a/eudplib/eudlib/stringf/cputf8.py b/eudplib/eudlib/stringf/cputf8.py index d6e3bf02..d2f1b264 100644 --- a/eudplib/eudlib/stringf/cputf8.py +++ b/eudplib/eudlib/stringf/cputf8.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + from ..eudarray import EUDArray from ...ctrlstru import EUDInfLoop, EUDEndInfLoop, EUDIf, EUDElse, EUDEndIf, EUDBreakIf diff --git a/eudplib/maprw/chkdiff.py b/eudplib/maprw/chkdiff.py index b81ca490..a9648c8b 100644 --- a/eudplib/maprw/chkdiff.py +++ b/eudplib/maprw/chkdiff.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + import bsdiff4 from ..core.mapdata.chktok import CHK From c271814add4015bf591944a21e3726a04fd0fdca Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Sun, 24 Mar 2019 14:13:17 +0900 Subject: [PATCH 6/8] Cleaned root folder: split docs/tools folder --- .eggs/README.txt | 6 - cython_src/Profile.prof | Bin 385 -> 0 bytes cython_src/out.txt | 60 - cython_src/setup.py | 8 - cython_src/stackdata.bin | Bin 10397393 -> 0 bytes cython_src/stackobjs.c | 2443 -- cython_src/stackobjs.pyd | Bin 29696 -> 0 bytes cython_src/stackobjs.pyx | 66 - cython_src/stackobjs_py.py | 63 - cython_src/stkobj_test.py | 32 - cython_src/teststackobjs.py | 30 - cython_src/testverifyf.py | 19 - cython_src/verifyf.c | 2031 -- cython_src/verifyf.pyd | Bin 25088 -> 0 bytes cython_src/verifyf.pyx | 39 - api.rst => docs/api.rst | 0 docdiff.py => docs/docdiff.py | 5 + funclist.txt => docs/funclist.txt | 0 example_tool/unlimiter/setup.py | 38 - example_tool/unlimiter/unlimiter.py | 71 - examples/cardshuffle.py | 52 - examples/prj_cardgame_stack.py | 187 - funclist.py | 57 - linecounter.py | 52 - mpqapi_test/basemap.scx | Bin 39578 -> 0 bytes mpqapi_test/mpqapi.py | 199 - mpqapi_test/test.scx | Bin 23260 -> 0 bytes out.html | 25886 ----------------- encoding_apply.py => tools/encoding_apply.py | 2 +- tools/linecounter.py | 21 + mkdist.bat => tools/mkdist.bat | 0 reinstall.bat => tools/reinstall.bat | 3 + reinstall.sh => tools/reinstall.sh | 2 + tracemain.py | 1 - traceperf.py | 25 - 35 files changed, 32 insertions(+), 31366 deletions(-) delete mode 100644 .eggs/README.txt delete mode 100644 cython_src/Profile.prof delete mode 100644 cython_src/out.txt delete mode 100644 cython_src/setup.py delete mode 100644 cython_src/stackdata.bin delete mode 100644 cython_src/stackobjs.c delete mode 100644 cython_src/stackobjs.pyd delete mode 100644 cython_src/stackobjs.pyx delete mode 100644 cython_src/stackobjs_py.py delete mode 100644 cython_src/stkobj_test.py delete mode 100644 cython_src/teststackobjs.py delete mode 100644 cython_src/testverifyf.py delete mode 100644 cython_src/verifyf.c delete mode 100644 cython_src/verifyf.pyd delete mode 100644 cython_src/verifyf.pyx rename api.rst => docs/api.rst (100%) rename docdiff.py => docs/docdiff.py (96%) rename funclist.txt => docs/funclist.txt (100%) delete mode 100644 example_tool/unlimiter/setup.py delete mode 100644 example_tool/unlimiter/unlimiter.py delete mode 100644 examples/cardshuffle.py delete mode 100644 examples/prj_cardgame_stack.py delete mode 100644 funclist.py delete mode 100644 linecounter.py delete mode 100644 mpqapi_test/basemap.scx delete mode 100644 mpqapi_test/mpqapi.py delete mode 100644 mpqapi_test/test.scx delete mode 100644 out.html rename encoding_apply.py => tools/encoding_apply.py (91%) create mode 100644 tools/linecounter.py rename mkdist.bat => tools/mkdist.bat (100%) rename reinstall.bat => tools/reinstall.bat (87%) rename reinstall.sh => tools/reinstall.sh (81%) delete mode 100644 tracemain.py delete mode 100644 traceperf.py diff --git a/.eggs/README.txt b/.eggs/README.txt deleted file mode 100644 index 5d016688..00000000 --- a/.eggs/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins. - -This directory caches those eggs to prevent repeated downloads. - -However, it is safe to delete this directory. - diff --git a/cython_src/Profile.prof b/cython_src/Profile.prof deleted file mode 100644 index 4223d86db233ff3d62c7058695626cf44f2b3702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmeyZ$$X2$rnsaiGcVolB_jg^1CX1WpHiBWYNyFs!~_%o6X^y=;@2eKxL}vQ{ni&o z?n9^Tt2LQ_G1k2VDq#2}W|LH!nNy;hnWvDOT9T2UqL5mVnrx@Zg3ka0P39sNkol}2 zf(=NZSon7Pq+O=|Jof32n*+X{KMb@GMZ+%x8>m(4DVfEINja(N3i)XY>hU?n1x5L3 zdI3NpGbgnOD4LX&np{$h>YZ0nTGqEpx7nq`7-*(T0K+6PIUA_AST7jF^2cV%k4D|V fmj_SVr^6V)Kq&$RBE;X!AU`380ZbWOy@3G$u{L^A diff --git a/cython_src/out.txt b/cython_src/out.txt deleted file mode 100644 index 156a92fd..00000000 --- a/cython_src/out.txt +++ /dev/null @@ -1,60 +0,0 @@ -Timer unit: 4.46246e-07 s - -Total time: 27.8427 s -File: stackobjs_py.py -Function: StackObjects at line 3 - -Line # Hits Time Per Hit % Time Line Contents -============================================================== - 3 @profile - 4 def StackObjects(found_objects, dwoccupmap_dict, alloctable): - 5 1 7 7.0 0.0 dwoccupmap_max_size = 0 - 6 3784 6932 1.8 0.0 for obj in found_objects: - 7 3783 9224 2.4 0.0 dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - 8 - 9 # Buffer to sum all dwoccupmaps - 10 1 19518 19518.0 0.0 dwoccupmap_sum = [-1] * (dwoccupmap_max_size + 1) - 11 1 19050 19050.0 0.0 dwoccupmap = [0] * (dwoccupmap_max_size + 1) - 12 1 3 3.0 0.0 lallocaddr = 0 - 13 1 2 2.0 0.0 payload_size = 0 - 14 - 15 3784 8673 2.3 0.0 for obj in found_objects: - 16 # Convert to faster c array - 17 3783 12818 3.4 0.0 py_dwoccupmap = dwoccupmap_dict[obj] - 18 3783 12312 3.3 0.0 oclen = len(py_dwoccupmap) - 19 2141973 3916335 1.8 6.3 for j in range(oclen): - 20 2138190 4344122 2.0 7.0 dwoccupmap[j] = py_dwoccupmap[j] - 21 - 22 # preprocess dwoccupmap - 23 2141973 3921979 1.8 6.3 for i in range(oclen): - 24 2138190 4200713 2.0 6.7 if dwoccupmap[i] == 0: - 25 44005 82528 1.9 0.1 dwoccupmap[i] = -1 - 26 2094185 4788096 2.3 7.7 elif i == 0 or dwoccupmap[i - 1] == -1: - 27 3528 6959 2.0 0.0 dwoccupmap[i] = i - 28 else: - 29 2090657 4553136 2.2 7.3 dwoccupmap[i] = dwoccupmap[i - 1] - 30 - 31 # Find appropriate position to allocate object - 32 3783 7366 1.9 0.0 j = 0 - 33 2175164 4147732 1.9 6.6 while j < oclen: - 34 # Update on conflict map - 35 2171381 5329201 2.5 8.5 if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - 36 3527 10183 2.9 0.0 lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] - 37 3527 6543 1.9 0.0 j = 0 - 38 - 39 else: - 40 2167854 4282381 2.0 6.9 j += 1 - 41 - 42 # Apply occupation map - 43 2141973 4029980 1.9 6.5 for j in range(oclen - 1, -1, -1): - 44 2138190 4352813 2.0 7.0 curoff = lallocaddr + j - 45 2138190 4539934 2.1 7.3 if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - 46 2126200 4896621 2.3 7.8 if dwoccupmap_sum[curoff + 1] == -1: - 47 3530 9447 2.7 0.0 dwoccupmap_sum[curoff] = curoff + 1 - 48 else: - 49 2122670 4844253 2.3 7.8 dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] - 50 - 51 3783 15631 4.1 0.0 alloctable[obj] = lallocaddr * 4 - 52 3783 10508 2.8 0.0 if (lallocaddr + oclen) * 4 > payload_size: - 53 3510 8203 2.3 0.0 payload_size = (lallocaddr + oclen) * 4 - diff --git a/cython_src/setup.py b/cython_src/setup.py deleted file mode 100644 index 809bafcd..00000000 --- a/cython_src/setup.py +++ /dev/null @@ -1,8 +0,0 @@ -from distutils.core import setup -from Cython.Build import cythonize - -import sys - -sys.argv.extend(["build_ext", "--inplace"]) - -setup(name="My hello app", ext_modules=cythonize("*.pyx")) diff --git a/cython_src/stackdata.bin b/cython_src/stackdata.bin deleted file mode 100644 index 24a1198f0b748ec0b998bec886bb70971e204037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10397393 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≪J!aNJ#?yPW!_px0I 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

IugoH>qCnU_%?%iJ4cck5amv)!x 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 D751TU diff --git a/cython_src/stackobjs.c b/cython_src/stackobjs.c deleted file mode 100644 index 77c79022..00000000 --- a/cython_src/stackobjs.c +++ /dev/null @@ -1,2443 +0,0 @@ -/* Generated by Cython 0.22 */ - -/* BEGIN: Cython Metadata -{ - "distutils": { - "depends": [] - } -} -END: Cython Metadata */ - -#define PY_SSIZE_T_CLEAN -#ifndef CYTHON_USE_PYLONG_INTERNALS -#ifdef PYLONG_BITS_IN_DIGIT -#define CYTHON_USE_PYLONG_INTERNALS 0 -#else -#include "pyconfig.h" -#ifdef PYLONG_BITS_IN_DIGIT -#define CYTHON_USE_PYLONG_INTERNALS 1 -#else -#define CYTHON_USE_PYLONG_INTERNALS 0 -#endif -#endif -#endif -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) - #error Cython requires Python 2.6+ or Python 3.2+. -#else -#define CYTHON_ABI "0_22" -#include -#ifndef offsetof -#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION -#define CYTHON_COMPILING_IN_PYPY 1 -#define CYTHON_COMPILING_IN_CPYTHON 0 -#else -#define CYTHON_COMPILING_IN_PYPY 0 -#define CYTHON_COMPILING_IN_CPYTHON 1 -#endif -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) -#define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyType_Type -#endif -#if PY_MAJOR_VERSION >= 3 - #define Py_TPFLAGS_CHECKTYPES 0 - #define Py_TPFLAGS_HAVE_INDEX 0 - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE) - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) -#else - #define CYTHON_PEP393_ENABLED 0 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) - #define __Pyx_PyFrozenSet_Size(s) PyObject_Size(s) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) - #define __Pyx_PyFrozenSet_Size(s) PySet_Size(s) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#ifndef CYTHON_INLINE - #if defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and - a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is - a quiet NaN. */ - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None) -#ifdef __cplusplus -template -void __Pyx_call_destructor(T* x) { - x->~T(); -} -template -class __Pyx_FakeReference { - public: - __Pyx_FakeReference() : ptr(NULL) { } - __Pyx_FakeReference(T& ref) : ptr(&ref) { } - T *operator->() { return ptr; } - operator T&() { return *ptr; } - private: - T *ptr; -}; -#endif - - -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) -#define _USE_MATH_DEFINES -#endif -#include -#define __PYX_HAVE__stackobjs -#define __PYX_HAVE_API__stackobjs -#include "string.h" -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#ifdef PYREX_WITHOUT_ASSERTIONS -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ - (sizeof(type) < sizeof(Py_ssize_t)) || \ - (sizeof(type) > sizeof(Py_ssize_t) && \ - likely(v < (type)PY_SSIZE_T_MAX || \ - v == (type)PY_SSIZE_T_MAX) && \ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ - v == (type)PY_SSIZE_T_MIN))) || \ - (sizeof(type) == sizeof(Py_ssize_t) && \ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if PY_MAJOR_VERSION < 3 -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen -#endif -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_COMPILING_IN_CPYTHON -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ - -static PyObject *__pyx_m; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "stackobjs.pyx", -}; - -/*--- Type declarations ---*/ - -/* --- Runtime support code (head) --- */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil) \ - if (acquire_gil) { \ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ - PyGILState_Release(__pyx_gilstate_save); \ - } else { \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil) \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext() \ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do { \ - PyObject *tmp = (PyObject *) r; \ - r = v; __Pyx_XDECREF(tmp); \ - } while (0) -#define __Pyx_DECREF_SET(r, v) do { \ - PyObject *tmp = (PyObject *) r; \ - r = v; __Pyx_DECREF(tmp); \ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ - const char* function_name); - -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -typedef struct { - int code_line; - PyCodeObject* code_object; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -static int __Pyx_check_binary_version(void); - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'stackobjs' */ -#define __Pyx_MODULE_NAME "stackobjs" -int __pyx_module_is_main_stackobjs = 0; - -/* Implementation of 'stackobjs' */ -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_pf_9stackobjs_StackObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_found_objects, PyObject *__pyx_v_dwoccupmap_dict, PyObject *__pyx_v_alloctable); /* proto */ -static char __pyx_k_i[] = "i"; -static char __pyx_k_j[] = "j"; -static char __pyx_k_obj[] = "obj"; -static char __pyx_k_main[] = "__main__"; -static char __pyx_k_test[] = "__test__"; -static char __pyx_k_oclen[] = "oclen"; -static char __pyx_k_range[] = "range"; -static char __pyx_k_curoff[] = "curoff"; -static char __pyx_k_objsize[] = "objsize"; -static char __pyx_k_stackobjs[] = "stackobjs"; -static char __pyx_k_alloctable[] = "alloctable"; -static char __pyx_k_dwoccupmap[] = "dwoccupmap"; -static char __pyx_k_lallocaddr[] = "lallocaddr"; -static char __pyx_k_StackObjects[] = "StackObjects"; -static char __pyx_k_payload_size[] = "payload_size"; -static char __pyx_k_found_objects[] = "found_objects"; -static char __pyx_k_py_dwoccupmap[] = "py_dwoccupmap"; -static char __pyx_k_dwoccupmap_sum[] = "dwoccupmap_sum"; -static char __pyx_k_dwoccupmap_dict[] = "dwoccupmap_dict"; -static char __pyx_k_dwoccupmap_max_size[] = "dwoccupmap_max_size"; -static char __pyx_k_C_Users_Documents_GitHub_eudtrgl[] = "C:\\Users\\\353\260\225\355\230\204\354\232\260\\Documents\\GitHub\\eudtrglib\\cython_src\\stackobjs.pyx"; -static PyObject *__pyx_kp_s_C_Users_Documents_GitHub_eudtrgl; -static PyObject *__pyx_n_s_StackObjects; -static PyObject *__pyx_n_s_alloctable; -static PyObject *__pyx_n_s_curoff; -static PyObject *__pyx_n_s_dwoccupmap; -static PyObject *__pyx_n_s_dwoccupmap_dict; -static PyObject *__pyx_n_s_dwoccupmap_max_size; -static PyObject *__pyx_n_s_dwoccupmap_sum; -static PyObject *__pyx_n_s_found_objects; -static PyObject *__pyx_n_s_i; -static PyObject *__pyx_n_s_j; -static PyObject *__pyx_n_s_lallocaddr; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_obj; -static PyObject *__pyx_n_s_objsize; -static PyObject *__pyx_n_s_oclen; -static PyObject *__pyx_n_s_payload_size; -static PyObject *__pyx_n_s_py_dwoccupmap; -static PyObject *__pyx_n_s_range; -static PyObject *__pyx_n_s_stackobjs; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_int_0; -static PyObject *__pyx_int_1; -static PyObject *__pyx_tuple_; -static PyObject *__pyx_codeobj__2; - -/* "stackobjs.pyx":7 - * from libc.string cimport memset - * - * def StackObjects( # <<<<<<<<<<<<<< - * found_objects, - * dwoccupmap_dict, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_9stackobjs_1StackObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_9stackobjs_1StackObjects = {"StackObjects", (PyCFunction)__pyx_pw_9stackobjs_1StackObjects, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_9stackobjs_1StackObjects(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_found_objects = 0; - PyObject *__pyx_v_dwoccupmap_dict = 0; - PyObject *__pyx_v_alloctable = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("StackObjects (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_found_objects,&__pyx_n_s_dwoccupmap_dict,&__pyx_n_s_alloctable,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_found_objects)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - case 1: - if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dwoccupmap_dict)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("StackObjects", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 2: - if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_alloctable)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("StackObjects", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "StackObjects") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v_found_objects = values[0]; - __pyx_v_dwoccupmap_dict = values[1]; - __pyx_v_alloctable = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("StackObjects", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_L3_error:; - __Pyx_AddTraceback("stackobjs.StackObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_9stackobjs_StackObjects(__pyx_self, __pyx_v_found_objects, __pyx_v_dwoccupmap_dict, __pyx_v_alloctable); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_9stackobjs_StackObjects(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_found_objects, PyObject *__pyx_v_dwoccupmap_dict, PyObject *__pyx_v_alloctable) { - int __pyx_v_dwoccupmap_max_size; - PyObject *__pyx_v_obj = NULL; - int *__pyx_v_dwoccupmap_sum; - int *__pyx_v_dwoccupmap; - int __pyx_v_lallocaddr; - int __pyx_v_payload_size; - int __pyx_v_curoff; - int __pyx_v_j; - int __pyx_v_oclen; - PyObject *__pyx_v_py_dwoccupmap = NULL; - PyObject *__pyx_v_i = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - PyObject *(*__pyx_t_3)(PyObject *); - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; - int __pyx_t_7; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - PyObject *(*__pyx_t_10)(PyObject *); - Py_ssize_t __pyx_t_11; - int __pyx_t_12; - int __pyx_t_13; - Py_ssize_t __pyx_t_14; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("StackObjects", 0); - - /* "stackobjs.pyx":12 - * alloctable, - * ): - * cdef int dwoccupmap_max_size = 0 # <<<<<<<<<<<<<< - * for obj in found_objects: - * dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - */ - __pyx_v_dwoccupmap_max_size = 0; - - /* "stackobjs.pyx":13 - * ): - * cdef int dwoccupmap_max_size = 0 - * for obj in found_objects: # <<<<<<<<<<<<<< - * dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - * - */ - if (likely(PyList_CheckExact(__pyx_v_found_objects)) || PyTuple_CheckExact(__pyx_v_found_objects)) { - __pyx_t_1 = __pyx_v_found_objects; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - __pyx_t_3 = NULL; - } else { - __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_found_objects); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - for (;;) { - if (likely(!__pyx_t_3)) { - if (likely(PyList_CheckExact(__pyx_t_1))) { - if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } else { - if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } - } else { - __pyx_t_4 = __pyx_t_3(__pyx_t_1); - if (unlikely(!__pyx_t_4)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - break; - } - __Pyx_GOTREF(__pyx_t_4); - } - __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_4); - __pyx_t_4 = 0; - - /* "stackobjs.pyx":14 - * cdef int dwoccupmap_max_size = 0 - * for obj in found_objects: - * dwoccupmap_max_size += len(dwoccupmap_dict[obj]) # <<<<<<<<<<<<<< - * - * # Buffer to sum all dwoccupmaps - */ - __pyx_t_4 = PyObject_GetItem(__pyx_v_dwoccupmap_dict, __pyx_v_obj); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyObject_Length(__pyx_t_4); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_v_dwoccupmap_max_size = (__pyx_v_dwoccupmap_max_size + __pyx_t_5); - - /* "stackobjs.pyx":13 - * ): - * cdef int dwoccupmap_max_size = 0 - * for obj in found_objects: # <<<<<<<<<<<<<< - * dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - * - */ - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "stackobjs.pyx":17 - * - * # Buffer to sum all dwoccupmaps - * cdef int* dwoccupmap_sum = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) # <<<<<<<<<<<<<< - * cdef int* dwoccupmap = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - * memset(dwoccupmap_sum, -1, (dwoccupmap_max_size + 1) * sizeof(int)) - */ - __pyx_v_dwoccupmap_sum = ((int *)PyMem_Malloc(((__pyx_v_dwoccupmap_max_size + 1) * (sizeof(int))))); - - /* "stackobjs.pyx":18 - * # Buffer to sum all dwoccupmaps - * cdef int* dwoccupmap_sum = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - * cdef int* dwoccupmap = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) # <<<<<<<<<<<<<< - * memset(dwoccupmap_sum, -1, (dwoccupmap_max_size + 1) * sizeof(int)) - * - */ - __pyx_v_dwoccupmap = ((int *)PyMem_Malloc(((__pyx_v_dwoccupmap_max_size + 1) * (sizeof(int))))); - - /* "stackobjs.pyx":19 - * cdef int* dwoccupmap_sum = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - * cdef int* dwoccupmap = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - * memset(dwoccupmap_sum, -1, (dwoccupmap_max_size + 1) * sizeof(int)) # <<<<<<<<<<<<<< - * - * cdef int lallocaddr = 0 - */ - memset(__pyx_v_dwoccupmap_sum, -1, ((__pyx_v_dwoccupmap_max_size + 1) * (sizeof(int)))); - - /* "stackobjs.pyx":21 - * memset(dwoccupmap_sum, -1, (dwoccupmap_max_size + 1) * sizeof(int)) - * - * cdef int lallocaddr = 0 # <<<<<<<<<<<<<< - * cdef int payload_size = 0 - * cdef int curoff, objsize, j, oclen - */ - __pyx_v_lallocaddr = 0; - - /* "stackobjs.pyx":22 - * - * cdef int lallocaddr = 0 - * cdef int payload_size = 0 # <<<<<<<<<<<<<< - * cdef int curoff, objsize, j, oclen - * - */ - __pyx_v_payload_size = 0; - - /* "stackobjs.pyx":25 - * cdef int curoff, objsize, j, oclen - * - * for obj in found_objects: # <<<<<<<<<<<<<< - * # Convert to faster c array - * py_dwoccupmap = dwoccupmap_dict[obj] - */ - if (likely(PyList_CheckExact(__pyx_v_found_objects)) || PyTuple_CheckExact(__pyx_v_found_objects)) { - __pyx_t_1 = __pyx_v_found_objects; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - __pyx_t_3 = NULL; - } else { - __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_found_objects); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - for (;;) { - if (likely(!__pyx_t_3)) { - if (likely(PyList_CheckExact(__pyx_t_1))) { - if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } else { - if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } - } else { - __pyx_t_4 = __pyx_t_3(__pyx_t_1); - if (unlikely(!__pyx_t_4)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - break; - } - __Pyx_GOTREF(__pyx_t_4); - } - __Pyx_XDECREF_SET(__pyx_v_obj, __pyx_t_4); - __pyx_t_4 = 0; - - /* "stackobjs.pyx":27 - * for obj in found_objects: - * # Convert to faster c array - * py_dwoccupmap = dwoccupmap_dict[obj] # <<<<<<<<<<<<<< - * oclen = len(py_dwoccupmap) - * for j in range(oclen): - */ - __pyx_t_4 = PyObject_GetItem(__pyx_v_dwoccupmap_dict, __pyx_v_obj); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __Pyx_GOTREF(__pyx_t_4); - __Pyx_XDECREF_SET(__pyx_v_py_dwoccupmap, __pyx_t_4); - __pyx_t_4 = 0; - - /* "stackobjs.pyx":28 - * # Convert to faster c array - * py_dwoccupmap = dwoccupmap_dict[obj] - * oclen = len(py_dwoccupmap) # <<<<<<<<<<<<<< - * for j in range(oclen): - * dwoccupmap[j] = py_dwoccupmap[j] - */ - __pyx_t_5 = PyObject_Length(__pyx_v_py_dwoccupmap); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_v_oclen = __pyx_t_5; - - /* "stackobjs.pyx":29 - * py_dwoccupmap = dwoccupmap_dict[obj] - * oclen = len(py_dwoccupmap) - * for j in range(oclen): # <<<<<<<<<<<<<< - * dwoccupmap[j] = py_dwoccupmap[j] - * - */ - __pyx_t_6 = __pyx_v_oclen; - for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { - __pyx_v_j = __pyx_t_7; - - /* "stackobjs.pyx":30 - * oclen = len(py_dwoccupmap) - * for j in range(oclen): - * dwoccupmap[j] = py_dwoccupmap[j] # <<<<<<<<<<<<<< - * - * # preprocess dwoccupmap - */ - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_py_dwoccupmap, __pyx_v_j, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - (__pyx_v_dwoccupmap[__pyx_v_j]) = __pyx_t_8; - } - - /* "stackobjs.pyx":33 - * - * # preprocess dwoccupmap - * for i in range(oclen): # <<<<<<<<<<<<<< - * if dwoccupmap[i] == 0: - * dwoccupmap[i] = -1 - */ - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_oclen); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_4); - __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - if (likely(PyList_CheckExact(__pyx_t_4)) || PyTuple_CheckExact(__pyx_t_4)) { - __pyx_t_9 = __pyx_t_4; __Pyx_INCREF(__pyx_t_9); __pyx_t_5 = 0; - __pyx_t_10 = NULL; - } else { - __pyx_t_5 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext; if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - for (;;) { - if (likely(!__pyx_t_10)) { - if (likely(PyList_CheckExact(__pyx_t_9))) { - if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_9)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } else { - if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_9)) break; - #if CYTHON_COMPILING_IN_CPYTHON - __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #else - __pyx_t_4 = PySequence_ITEM(__pyx_t_9, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - } - } else { - __pyx_t_4 = __pyx_t_10(__pyx_t_9); - if (unlikely(!__pyx_t_4)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - break; - } - __Pyx_GOTREF(__pyx_t_4); - } - __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_4); - __pyx_t_4 = 0; - - /* "stackobjs.pyx":34 - * # preprocess dwoccupmap - * for i in range(oclen): - * if dwoccupmap[i] == 0: # <<<<<<<<<<<<<< - * dwoccupmap[i] = -1 - * elif i == 0 or dwoccupmap[i - 1] == -1: - */ - __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_12 = (((__pyx_v_dwoccupmap[__pyx_t_11]) == 0) != 0); - if (__pyx_t_12) { - - /* "stackobjs.pyx":35 - * for i in range(oclen): - * if dwoccupmap[i] == 0: - * dwoccupmap[i] = -1 # <<<<<<<<<<<<<< - * elif i == 0 or dwoccupmap[i - 1] == -1: - * dwoccupmap[i] = i - */ - __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - (__pyx_v_dwoccupmap[__pyx_t_11]) = -1; - goto __pyx_L11; - } - - /* "stackobjs.pyx":36 - * if dwoccupmap[i] == 0: - * dwoccupmap[i] = -1 - * elif i == 0 or dwoccupmap[i - 1] == -1: # <<<<<<<<<<<<<< - * dwoccupmap[i] = i - * else: - */ - __pyx_t_4 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (!__pyx_t_13) { - } else { - __pyx_t_12 = __pyx_t_13; - goto __pyx_L12_bool_binop_done; - } - __pyx_t_4 = PyNumber_Subtract(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_13 = (((__pyx_v_dwoccupmap[__pyx_t_11]) == -1) != 0); - __pyx_t_12 = __pyx_t_13; - __pyx_L12_bool_binop_done:; - if (__pyx_t_12) { - - /* "stackobjs.pyx":37 - * dwoccupmap[i] = -1 - * elif i == 0 or dwoccupmap[i - 1] == -1: - * dwoccupmap[i] = i # <<<<<<<<<<<<<< - * else: - * dwoccupmap[i] = dwoccupmap[i - 1] - */ - __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_i); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - (__pyx_v_dwoccupmap[__pyx_t_11]) = __pyx_t_6; - goto __pyx_L11; - } - /*else*/ { - - /* "stackobjs.pyx":39 - * dwoccupmap[i] = i - * else: - * dwoccupmap[i] = dwoccupmap[i - 1] # <<<<<<<<<<<<<< - * - * # Find appropriate position to allocate object - */ - __pyx_t_4 = PyNumber_Subtract(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - (__pyx_v_dwoccupmap[__pyx_t_14]) = (__pyx_v_dwoccupmap[__pyx_t_11]); - } - __pyx_L11:; - - /* "stackobjs.pyx":33 - * - * # preprocess dwoccupmap - * for i in range(oclen): # <<<<<<<<<<<<<< - * if dwoccupmap[i] == 0: - * dwoccupmap[i] = -1 - */ - } - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "stackobjs.pyx":42 - * - * # Find appropriate position to allocate object - * j = 0 # <<<<<<<<<<<<<< - * while j < oclen: - * # Update on conflict map - */ - __pyx_v_j = 0; - - /* "stackobjs.pyx":43 - * # Find appropriate position to allocate object - * j = 0 - * while j < oclen: # <<<<<<<<<<<<<< - * # Update on conflict map - * if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - */ - while (1) { - __pyx_t_12 = ((__pyx_v_j < __pyx_v_oclen) != 0); - if (!__pyx_t_12) break; - - /* "stackobjs.pyx":45 - * while j < oclen: - * # Update on conflict map - * if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: # <<<<<<<<<<<<<< - * lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] - * j = 0 - */ - __pyx_t_13 = (((__pyx_v_dwoccupmap[__pyx_v_j]) != -1) != 0); - if (__pyx_t_13) { - } else { - __pyx_t_12 = __pyx_t_13; - goto __pyx_L17_bool_binop_done; - } - __pyx_t_13 = (((__pyx_v_dwoccupmap_sum[(__pyx_v_lallocaddr + __pyx_v_j)]) != -1) != 0); - __pyx_t_12 = __pyx_t_13; - __pyx_L17_bool_binop_done:; - if (__pyx_t_12) { - - /* "stackobjs.pyx":46 - * # Update on conflict map - * if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - * lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] # <<<<<<<<<<<<<< - * j = 0 - * - */ - __pyx_v_lallocaddr = ((__pyx_v_dwoccupmap_sum[(__pyx_v_lallocaddr + __pyx_v_j)]) - (__pyx_v_dwoccupmap[__pyx_v_j])); - - /* "stackobjs.pyx":47 - * if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - * lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] - * j = 0 # <<<<<<<<<<<<<< - * - * else: - */ - __pyx_v_j = 0; - goto __pyx_L16; - } - /*else*/ { - - /* "stackobjs.pyx":50 - * - * else: - * j += 1 # <<<<<<<<<<<<<< - * - * # Apply occupation map - */ - __pyx_v_j = (__pyx_v_j + 1); - } - __pyx_L16:; - } - - /* "stackobjs.pyx":53 - * - * # Apply occupation map - * for j in range(oclen - 1, -1, -1): # <<<<<<<<<<<<<< - * curoff = lallocaddr + j - * if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - */ - for (__pyx_t_6 = (__pyx_v_oclen - 1); __pyx_t_6 > -1; __pyx_t_6-=1) { - __pyx_v_j = __pyx_t_6; - - /* "stackobjs.pyx":54 - * # Apply occupation map - * for j in range(oclen - 1, -1, -1): - * curoff = lallocaddr + j # <<<<<<<<<<<<<< - * if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - * if dwoccupmap_sum[curoff + 1] == -1: - */ - __pyx_v_curoff = (__pyx_v_lallocaddr + __pyx_v_j); - - /* "stackobjs.pyx":55 - * for j in range(oclen - 1, -1, -1): - * curoff = lallocaddr + j - * if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: # <<<<<<<<<<<<<< - * if dwoccupmap_sum[curoff + 1] == -1: - * dwoccupmap_sum[curoff] = curoff + 1 - */ - __pyx_t_13 = (((__pyx_v_dwoccupmap[__pyx_v_j]) != -1) != 0); - if (!__pyx_t_13) { - } else { - __pyx_t_12 = __pyx_t_13; - goto __pyx_L22_bool_binop_done; - } - __pyx_t_13 = (((__pyx_v_dwoccupmap_sum[__pyx_v_curoff]) != -1) != 0); - __pyx_t_12 = __pyx_t_13; - __pyx_L22_bool_binop_done:; - if (__pyx_t_12) { - - /* "stackobjs.pyx":56 - * curoff = lallocaddr + j - * if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - * if dwoccupmap_sum[curoff + 1] == -1: # <<<<<<<<<<<<<< - * dwoccupmap_sum[curoff] = curoff + 1 - * else: - */ - __pyx_t_12 = (((__pyx_v_dwoccupmap_sum[(__pyx_v_curoff + 1)]) == -1) != 0); - if (__pyx_t_12) { - - /* "stackobjs.pyx":57 - * if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - * if dwoccupmap_sum[curoff + 1] == -1: - * dwoccupmap_sum[curoff] = curoff + 1 # <<<<<<<<<<<<<< - * else: - * dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] - */ - (__pyx_v_dwoccupmap_sum[__pyx_v_curoff]) = (__pyx_v_curoff + 1); - goto __pyx_L24; - } - /*else*/ { - - /* "stackobjs.pyx":59 - * dwoccupmap_sum[curoff] = curoff + 1 - * else: - * dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] # <<<<<<<<<<<<<< - * - * alloctable[obj] = lallocaddr * 4 - */ - (__pyx_v_dwoccupmap_sum[__pyx_v_curoff]) = (__pyx_v_dwoccupmap_sum[(__pyx_v_curoff + 1)]); - } - __pyx_L24:; - goto __pyx_L21; - } - __pyx_L21:; - } - - /* "stackobjs.pyx":61 - * dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] - * - * alloctable[obj] = lallocaddr * 4 # <<<<<<<<<<<<<< - * if (lallocaddr + oclen) * 4 > payload_size: - * payload_size = (lallocaddr + oclen) * 4 - */ - __pyx_t_9 = __Pyx_PyInt_From_long((__pyx_v_lallocaddr * 4)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - if (unlikely(PyObject_SetItem(__pyx_v_alloctable, __pyx_v_obj, __pyx_t_9) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "stackobjs.pyx":62 - * - * alloctable[obj] = lallocaddr * 4 - * if (lallocaddr + oclen) * 4 > payload_size: # <<<<<<<<<<<<<< - * payload_size = (lallocaddr + oclen) * 4 - * - */ - __pyx_t_12 = ((((__pyx_v_lallocaddr + __pyx_v_oclen) * 4) > __pyx_v_payload_size) != 0); - if (__pyx_t_12) { - - /* "stackobjs.pyx":63 - * alloctable[obj] = lallocaddr * 4 - * if (lallocaddr + oclen) * 4 > payload_size: - * payload_size = (lallocaddr + oclen) * 4 # <<<<<<<<<<<<<< - * - * PyMem_Free(dwoccupmap) - */ - __pyx_v_payload_size = ((__pyx_v_lallocaddr + __pyx_v_oclen) * 4); - goto __pyx_L25; - } - __pyx_L25:; - - /* "stackobjs.pyx":25 - * cdef int curoff, objsize, j, oclen - * - * for obj in found_objects: # <<<<<<<<<<<<<< - * # Convert to faster c array - * py_dwoccupmap = dwoccupmap_dict[obj] - */ - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "stackobjs.pyx":65 - * payload_size = (lallocaddr + oclen) * 4 - * - * PyMem_Free(dwoccupmap) # <<<<<<<<<<<<<< - * PyMem_Free(dwoccupmap_sum) - */ - PyMem_Free(__pyx_v_dwoccupmap); - - /* "stackobjs.pyx":66 - * - * PyMem_Free(dwoccupmap) - * PyMem_Free(dwoccupmap_sum) # <<<<<<<<<<<<<< - */ - PyMem_Free(__pyx_v_dwoccupmap_sum); - - /* "stackobjs.pyx":7 - * from libc.string cimport memset - * - * def StackObjects( # <<<<<<<<<<<<<< - * found_objects, - * dwoccupmap_dict, - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("stackobjs.StackObjects", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XDECREF(__pyx_v_py_dwoccupmap); - __Pyx_XDECREF(__pyx_v_i); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef __pyx_moduledef = { - #if PY_VERSION_HEX < 0x03020000 - { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, - #else - PyModuleDef_HEAD_INIT, - #endif - "stackobjs", - 0, /* m_doc */ - -1, /* m_size */ - __pyx_methods /* m_methods */, - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_kp_s_C_Users_Documents_GitHub_eudtrgl, __pyx_k_C_Users_Documents_GitHub_eudtrgl, sizeof(__pyx_k_C_Users_Documents_GitHub_eudtrgl), 0, 0, 1, 0}, - {&__pyx_n_s_StackObjects, __pyx_k_StackObjects, sizeof(__pyx_k_StackObjects), 0, 0, 1, 1}, - {&__pyx_n_s_alloctable, __pyx_k_alloctable, sizeof(__pyx_k_alloctable), 0, 0, 1, 1}, - {&__pyx_n_s_curoff, __pyx_k_curoff, sizeof(__pyx_k_curoff), 0, 0, 1, 1}, - {&__pyx_n_s_dwoccupmap, __pyx_k_dwoccupmap, sizeof(__pyx_k_dwoccupmap), 0, 0, 1, 1}, - {&__pyx_n_s_dwoccupmap_dict, __pyx_k_dwoccupmap_dict, sizeof(__pyx_k_dwoccupmap_dict), 0, 0, 1, 1}, - {&__pyx_n_s_dwoccupmap_max_size, __pyx_k_dwoccupmap_max_size, sizeof(__pyx_k_dwoccupmap_max_size), 0, 0, 1, 1}, - {&__pyx_n_s_dwoccupmap_sum, __pyx_k_dwoccupmap_sum, sizeof(__pyx_k_dwoccupmap_sum), 0, 0, 1, 1}, - {&__pyx_n_s_found_objects, __pyx_k_found_objects, sizeof(__pyx_k_found_objects), 0, 0, 1, 1}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, - {&__pyx_n_s_lallocaddr, __pyx_k_lallocaddr, sizeof(__pyx_k_lallocaddr), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, - {&__pyx_n_s_objsize, __pyx_k_objsize, sizeof(__pyx_k_objsize), 0, 0, 1, 1}, - {&__pyx_n_s_oclen, __pyx_k_oclen, sizeof(__pyx_k_oclen), 0, 0, 1, 1}, - {&__pyx_n_s_payload_size, __pyx_k_payload_size, sizeof(__pyx_k_payload_size), 0, 0, 1, 1}, - {&__pyx_n_s_py_dwoccupmap, __pyx_k_py_dwoccupmap, sizeof(__pyx_k_py_dwoccupmap), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_stackobjs, __pyx_k_stackobjs, sizeof(__pyx_k_stackobjs), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - return 0; - __pyx_L1_error:; - return -1; -} - -static int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "stackobjs.pyx":7 - * from libc.string cimport memset - * - * def StackObjects( # <<<<<<<<<<<<<< - * found_objects, - * dwoccupmap_dict, - */ - __pyx_tuple_ = PyTuple_Pack(15, __pyx_n_s_found_objects, __pyx_n_s_dwoccupmap_dict, __pyx_n_s_alloctable, __pyx_n_s_dwoccupmap_max_size, __pyx_n_s_obj, __pyx_n_s_dwoccupmap_sum, __pyx_n_s_dwoccupmap, __pyx_n_s_lallocaddr, __pyx_n_s_payload_size, __pyx_n_s_curoff, __pyx_n_s_objsize, __pyx_n_s_j, __pyx_n_s_oclen, __pyx_n_s_py_dwoccupmap, __pyx_n_s_i); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(3, 0, 15, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_C_Users_Documents_GitHub_eudtrgl, __pyx_n_s_StackObjects, 7, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - return 0; - __pyx_L1_error:; - return -1; -} - -#if PY_MAJOR_VERSION < 3 -PyMODINIT_FUNC initstackobjs(void); /*proto*/ -PyMODINIT_FUNC initstackobjs(void) -#else -PyMODINIT_FUNC PyInit_stackobjs(void); /*proto*/ -PyMODINIT_FUNC PyInit_stackobjs(void) -#endif -{ - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_REFNANNY - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); - if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); - } - #endif - __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_stackobjs(void)", 0); - if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #ifdef __Pyx_CyFunction_USED - if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - #ifdef WITH_THREAD /* Python build with threading support? */ - PyEval_InitThreads(); - #endif - #endif - /*--- Module creation code ---*/ - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("stackobjs", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #if CYTHON_COMPILING_IN_PYPY - Py_INCREF(__pyx_b); - #endif - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - /*--- Initialize various global constants etc. ---*/ - if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - if (__pyx_module_is_main_stackobjs) { - if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (!PyDict_GetItemString(modules, "stackobjs")) { - if (unlikely(PyDict_SetItemString(modules, "stackobjs", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - } - #endif - /*--- Builtin init code ---*/ - if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Constants init code ---*/ - if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Global init code ---*/ - /*--- Variable export code ---*/ - /*--- Function export code ---*/ - /*--- Type init code ---*/ - /*--- Type import code ---*/ - /*--- Variable import code ---*/ - /*--- Function import code ---*/ - /*--- Execution code ---*/ - - /* "stackobjs.pyx":7 - * from libc.string cimport memset - * - * def StackObjects( # <<<<<<<<<<<<<< - * found_objects, - * dwoccupmap_dict, - */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9stackobjs_1StackObjects, NULL, __pyx_n_s_stackobjs); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_StackObjects, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "stackobjs.pyx":1 - * #!python # <<<<<<<<<<<<<< - * #cython: language_level=3, boundscheck=False, wraparound=False - * - */ - __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init stackobjs", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_DECREF(__pyx_m); __pyx_m = 0; - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init stackobjs"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if PY_MAJOR_VERSION < 3 - return; - #else - return __pyx_m; - #endif -} - -/* --- Runtime support code --- */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule((char *)modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck) { -#if CYTHON_COMPILING_IN_CPYTHON - if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); - if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck) { -#if CYTHON_COMPILING_IN_CPYTHON - if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck) { -#if CYTHON_COMPILING_IN_CPYTHON - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_Clear(); - else - return NULL; - } - } - return m->sq_item(o, i); - } - } -#else - if (is_list || PySequence_Check(o)) { - return PySequence_GetItem(o, i); - } -#endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = func->ob_type->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = (start + end) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - py_code = __pyx_find_code_object(c_line ? c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? c_line : py_line, py_code); - } - py_frame = PyFrame_New( - PyThreadState_GET(), /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - py_frame->f_lineno = py_line; - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { - const int neg_one = (int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - } else if (sizeof(int) <= sizeof(unsigned long long)) { - return PyLong_FromUnsignedLongLong((unsigned long long) value); - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(long long)) { - return PyLong_FromLongLong((long long) value); - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } -} - -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value) \ - { \ - func_type value = func_value; \ - if (sizeof(target_type) < sizeof(func_type)) { \ - if (unlikely(value != (func_type) (target_type) value)) { \ - func_type zero = 0; \ - if (is_unsigned && unlikely(value < zero)) \ - goto raise_neg_overflow; \ - else \ - goto raise_overflow; \ - } \ - } \ - return (target_type) value; \ - } - -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #endif -#endif - -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { - const int neg_one = (int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x)) - } else if (sizeof(int) <= sizeof(unsigned long long)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x)) - } - } else { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +(((PyLongObject*)x)->ob_digit[0])); - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x)) - } else if (sizeof(int) <= sizeof(long long)) { - __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x)) - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - const long neg_one = (long) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - } else if (sizeof(long) <= sizeof(unsigned long long)) { - return PyLong_FromUnsignedLongLong((unsigned long long) value); - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(long long)) { - return PyLong_FromLongLong((long long) value); - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { - const long neg_one = (long) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong(x)) - } else if (sizeof(long) <= sizeof(unsigned long long)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong(x)) - } - } else { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +(((PyLongObject*)x)->ob_digit[0])); - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong(x)) - } else if (sizeof(long) <= sizeof(long long)) { - __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong(x)) - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { -#if PY_VERSION_HEX < 0x03030000 - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -#else - if (__Pyx_PyUnicode_READY(o) == -1) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (PyUnicode_IS_ASCII(o)) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -#endif - } else -#endif -#if !CYTHON_COMPILING_IN_PYPY - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { - PyNumberMethods *m; - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (PyInt_Check(x) || PyLong_Check(x)) -#else - if (PyLong_Check(x)) -#endif - return Py_INCREF(x), x; - m = Py_TYPE(x)->tp_as_number; -#if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = PyNumber_Long(x); - } -#else - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Long(x); - } -#endif - if (res) { -#if PY_MAJOR_VERSION < 3 - if (!PyInt_Check(res) && !PyLong_Check(res)) { -#else - if (!PyLong_Check(res)) { -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - name, name, Py_TYPE(res)->tp_name); - Py_DECREF(res); - return NULL; - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) - return PyInt_AS_LONG(b); -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(b)) { - case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; - case 0: return 0; - case 1: return ((PyLongObject*)b)->ob_digit[0]; - } - #endif - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/cython_src/stackobjs.pyd b/cython_src/stackobjs.pyd deleted file mode 100644 index 37d5456b52dc14e2b0ad1bb0032109d17f7ee8f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29696 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 HU-S7t3vYcB diff --git a/cython_src/stackobjs.pyx b/cython_src/stackobjs.pyx deleted file mode 100644 index 1daad96f..00000000 --- a/cython_src/stackobjs.pyx +++ /dev/null @@ -1,66 +0,0 @@ -#!python -#cython: language_level=3, boundscheck=False, wraparound=False - -from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free -from libc.string cimport memset - -def StackObjects( - found_objects, - dwoccupmap_dict, - alloctable, -): - cdef int dwoccupmap_max_size = 0 - for obj in found_objects: - dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - - # Buffer to sum all dwoccupmaps - cdef int* dwoccupmap_sum = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - cdef int* dwoccupmap = PyMem_Malloc((dwoccupmap_max_size + 1) * sizeof(int)) - memset(dwoccupmap_sum, -1, (dwoccupmap_max_size + 1) * sizeof(int)) - - cdef int lallocaddr = 0 - cdef int payload_size = 0 - cdef int curoff, objsize, j, oclen - - for obj in found_objects: - # Convert to faster c array - py_dwoccupmap = dwoccupmap_dict[obj] - oclen = len(py_dwoccupmap) - for j in range(oclen): - dwoccupmap[j] = py_dwoccupmap[j] - - # preprocess dwoccupmap - for i in range(oclen): - if dwoccupmap[i] == 0: - dwoccupmap[i] = -1 - elif i == 0 or dwoccupmap[i - 1] == -1: - dwoccupmap[i] = i - else: - dwoccupmap[i] = dwoccupmap[i - 1] - - # Find appropriate position to allocate object - j = 0 - while j < oclen: - # Update on conflict map - if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] - j = 0 - - else: - j += 1 - - # Apply occupation map - for j in range(oclen - 1, -1, -1): - curoff = lallocaddr + j - if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - if dwoccupmap_sum[curoff + 1] == -1: - dwoccupmap_sum[curoff] = curoff + 1 - else: - dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] - - alloctable[obj] = lallocaddr * 4 - if (lallocaddr + oclen) * 4 > payload_size: - payload_size = (lallocaddr + oclen) * 4 - - PyMem_Free(dwoccupmap) - PyMem_Free(dwoccupmap_sum) diff --git a/cython_src/stackobjs_py.py b/cython_src/stackobjs_py.py deleted file mode 100644 index 91bded9f..00000000 --- a/cython_src/stackobjs_py.py +++ /dev/null @@ -1,63 +0,0 @@ -import pickle - - -def StackObjects(found_objects, dwoccupmap_dict, alloctable): - dwoccupmap_max_size = sum(map(lambda x: len(dwoccupmap_dict[x]), found_objects)) - # for obj in found_objects: - # dwoccupmap_max_size += len(dwoccupmap_dict[obj]) - - # Buffer to sum all dwoccupmaps - dwoccupmap_sum = [-1] * (dwoccupmap_max_size + 1) - lallocaddr = 0 - payload_size = 0 - objnum = len(found_objects) - - for objid, obj in enumerate(found_objects): - if objid % 100 == 0: - print("[StackObjects] Stacking object %d/%d..." % (objid, objnum), end="\r") - # Convert to faster c array - dwoccupmap = dwoccupmap_dict[obj] - oclen = len(dwoccupmap) - - # preprocess dwoccupmap - for i in range(oclen): - if dwoccupmap[i] == 0: - dwoccupmap[i] = -1 - elif i == 0 or dwoccupmap[i - 1] == -1: - dwoccupmap[i] = i - else: - dwoccupmap[i] = dwoccupmap[i - 1] - - # Find appropriate position to allocate object - j = 0 - while j < oclen: - # Update on conflict map - if dwoccupmap[j] != -1 and dwoccupmap_sum[lallocaddr + j] != -1: - lallocaddr = dwoccupmap_sum[lallocaddr + j] - dwoccupmap[j] - j = 0 - - else: - j += 1 - - # Apply occupation map - for j in range(oclen - 1, -1, -1): - curoff = lallocaddr + j - if dwoccupmap[j] != -1 or dwoccupmap_sum[curoff] != -1: - if dwoccupmap_sum[curoff + 1] == -1: - dwoccupmap_sum[curoff] = curoff + 1 - else: - dwoccupmap_sum[curoff] = dwoccupmap_sum[curoff + 1] - - alloctable[obj] = lallocaddr * 4 - if (lallocaddr + oclen) * 4 > payload_size: - payload_size = (lallocaddr + oclen) * 4 - - print("[StackObjects] Stacking object %d/%d..." % (objnum, objnum)) - - -if __name__ == "__main__": - obj = pickle.load(open("stackdata.bin", "rb")) - found_objects = obj["found_objects"] - dwoccupmap_dict = obj["dwoccupmap_dict"] - alloctable = {} - StackObjects(found_objects, dwoccupmap_dict, alloctable) diff --git a/cython_src/stkobj_test.py b/cython_src/stkobj_test.py deleted file mode 100644 index c9038dd4..00000000 --- a/cython_src/stkobj_test.py +++ /dev/null @@ -1,32 +0,0 @@ -import pyximport - -pyximport.install() - -from stackobjs import StackObjects - -found_objects = [1, 2, 3, 4, 5] -dwoccupmap_dict = { - 1: [0, 1, 1, 0, 0, 1], - 2: [0, 0, 0, 0, 0, 1], - 3: [1, 1, 1, 1, 1, 1], - 4: [0, 1, 0, 0, 0, 0], - 5: [2, 2, 2, 2, 2, 2], -} -alloctable = {} - -StackObjects(found_objects, dwoccupmap_dict, alloctable) - -print(alloctable) - -for obj in found_objects: - s = [] - s.append("%4s: " % obj) - s.append(" " * (alloctable[obj] // 4)) - dwoccupmap = dwoccupmap_dict[obj] - for j in dwoccupmap: - if j: - s.append("#") - else: - s.append(" ") - - print("".join(s)) diff --git a/cython_src/teststackobjs.py b/cython_src/teststackobjs.py deleted file mode 100644 index b6eb833b..00000000 --- a/cython_src/teststackobjs.py +++ /dev/null @@ -1,30 +0,0 @@ -import pyximport - -pyximport.install() -from stackobjs import StackObjects -import pickle - -obj = pickle.load(open("stackdata.bin", "rb")) -found_objects = obj["found_objects"] -dwoccupmap_dict = obj["dwoccupmap_dict"] -alloctable = {} - -print(len(found_objects)) - -import os - -testvector = bytearray(os.urandom(10 * 1024 * 1024)) - - -import cProfile -import pstats - -cProfile.runctx( - "StackObjects(found_objects, dwoccupmap_dict, alloctable)", - globals(), - locals(), - "Profile.prof", -) - -s = pstats.Stats("Profile.prof") -s.strip_dirs().sort_stats("time").print_stats() diff --git a/cython_src/testverifyf.py b/cython_src/testverifyf.py deleted file mode 100644 index 010b2950..00000000 --- a/cython_src/testverifyf.py +++ /dev/null @@ -1,19 +0,0 @@ -import pyximport - -pyximport.install() - -import verifyf -import os - -testvector = bytearray(os.urandom(10)) - - -import cProfile -import pstats - -cProfile.runctx( - "verifyf.verifyf(testvector, len(testvector))", globals(), locals(), "Profile.prof" -) - -s = pstats.Stats("Profile.prof") -s.strip_dirs().sort_stats("time").print_stats() diff --git a/cython_src/verifyf.c b/cython_src/verifyf.c deleted file mode 100644 index 6f076f27..00000000 --- a/cython_src/verifyf.c +++ /dev/null @@ -1,2031 +0,0 @@ -/* Generated by Cython 0.22 */ - -/* BEGIN: Cython Metadata -{ - "distutils": {} -} -END: Cython Metadata */ - -#define PY_SSIZE_T_CLEAN -#ifndef CYTHON_USE_PYLONG_INTERNALS -#ifdef PYLONG_BITS_IN_DIGIT -#define CYTHON_USE_PYLONG_INTERNALS 0 -#else -#include "pyconfig.h" -#ifdef PYLONG_BITS_IN_DIGIT -#define CYTHON_USE_PYLONG_INTERNALS 1 -#else -#define CYTHON_USE_PYLONG_INTERNALS 0 -#endif -#endif -#endif -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) - #error Cython requires Python 2.6+ or Python 3.2+. -#else -#define CYTHON_ABI "0_22" -#include -#ifndef offsetof -#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION -#define CYTHON_COMPILING_IN_PYPY 1 -#define CYTHON_COMPILING_IN_CPYTHON 0 -#else -#define CYTHON_COMPILING_IN_PYPY 0 -#define CYTHON_COMPILING_IN_CPYTHON 1 -#endif -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) -#define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyType_Type -#endif -#if PY_MAJOR_VERSION >= 3 - #define Py_TPFLAGS_CHECKTYPES 0 - #define Py_TPFLAGS_HAVE_INDEX 0 - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE) - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) -#else - #define CYTHON_PEP393_ENABLED 0 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) - #define __Pyx_PyFrozenSet_Size(s) PyObject_Size(s) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) - #define __Pyx_PyFrozenSet_Size(s) PySet_Size(s) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#ifndef CYTHON_INLINE - #if defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and - a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is - a quiet NaN. */ - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None) -#ifdef __cplusplus -template -void __Pyx_call_destructor(T* x) { - x->~T(); -} -template -class __Pyx_FakeReference { - public: - __Pyx_FakeReference() : ptr(NULL) { } - __Pyx_FakeReference(T& ref) : ptr(&ref) { } - T *operator->() { return ptr; } - operator T&() { return *ptr; } - private: - T *ptr; -}; -#endif - - -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) -#define _USE_MATH_DEFINES -#endif -#include -#define __PYX_HAVE__verifyf -#define __PYX_HAVE_API__verifyf -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#ifdef PYREX_WITHOUT_ASSERTIONS -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ - (sizeof(type) < sizeof(Py_ssize_t)) || \ - (sizeof(type) > sizeof(Py_ssize_t) && \ - likely(v < (type)PY_SSIZE_T_MAX || \ - v == (type)PY_SSIZE_T_MAX) && \ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ - v == (type)PY_SSIZE_T_MIN))) || \ - (sizeof(type) == sizeof(Py_ssize_t) && \ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if PY_MAJOR_VERSION < 3 -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen -#endif -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_COMPILING_IN_CPYTHON -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ - -static PyObject *__pyx_m; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "verifyf.pyx", -}; - -/*--- Type declarations ---*/ - -/* --- Runtime support code (head) --- */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil) \ - if (acquire_gil) { \ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ - PyGILState_Release(__pyx_gilstate_save); \ - } else { \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil) \ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext() \ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do { \ - PyObject *tmp = (PyObject *) r; \ - r = v; __Pyx_XDECREF(tmp); \ - } while (0) -#define __Pyx_DECREF_SET(r, v) do { \ - PyObject *tmp = (PyObject *) r; \ - r = v; __Pyx_DECREF(tmp); \ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ - const char* function_name); - -#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ - __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) : \ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) : \ - __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) -static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); -static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, - int is_list, int wraparound, int boundscheck); - -typedef struct { - int code_line; - PyCodeObject* code_object; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -static int __Pyx_check_binary_version(void); - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'verifyf' */ -static int *__pyx_v_7verifyf_cargs; -#define __Pyx_MODULE_NAME "verifyf" -int __pyx_module_is_main_verifyf = 0; - -/* Implementation of 'verifyf' */ -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_pf_7verifyf_verifyf(CYTHON_UNUSED PyObject *__pyx_self, unsigned char *__pyx_v_buf, int __pyx_v_buflen); /* proto */ -static char __pyx_k_i[] = "i"; -static char __pyx_k_j[] = "j"; -static char __pyx_k_dw[] = "dw"; -static char __pyx_k_buf[] = "buf"; -static char __pyx_k_idx[] = "idx"; -static char __pyx_k_carg[] = "carg"; -static char __pyx_k_main[] = "__main__"; -static char __pyx_k_test[] = "__test__"; -static char __pyx_k_compv[] = "compv"; -static char __pyx_k_count[] = "count"; -static char __pyx_k_range[] = "range"; -static char __pyx_k_buflen[] = "buflen"; -static char __pyx_k_counts[] = "counts"; -static char __pyx_k_verifyf[] = "verifyf"; -static char __pyx_k_C_Users_Documents_GitHub_eudtrgl[] = "C:\\Users\\\353\260\225\355\230\204\354\232\260\\Documents\\GitHub\\eudtrglib\\cython_src\\verifyf.pyx"; -static PyObject *__pyx_kp_s_C_Users_Documents_GitHub_eudtrgl; -static PyObject *__pyx_n_s_buf; -static PyObject *__pyx_n_s_buflen; -static PyObject *__pyx_n_s_carg; -static PyObject *__pyx_n_s_compv; -static PyObject *__pyx_n_s_count; -static PyObject *__pyx_n_s_counts; -static PyObject *__pyx_n_s_dw; -static PyObject *__pyx_n_s_i; -static PyObject *__pyx_n_s_idx; -static PyObject *__pyx_n_s_j; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_range; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_verifyf; -static PyObject *__pyx_int_0; -static PyObject *__pyx_tuple_; -static PyObject *__pyx_codeobj__2; - -/* "verifyf.pyx":16 - * ] - * - * def verifyf(unsigned char* buf, int buflen): # <<<<<<<<<<<<<< - * cdef unsigned int i, j, compv, count, idx, carg, dw - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7verifyf_1verifyf(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_7verifyf_1verifyf = {"verifyf", (PyCFunction)__pyx_pw_7verifyf_1verifyf, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_7verifyf_1verifyf(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - unsigned char *__pyx_v_buf; - int __pyx_v_buflen; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("verifyf (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_buf,&__pyx_n_s_buflen,0}; - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_buf)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - case 1: - if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_buflen)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("verifyf", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "verifyf") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - } - __pyx_v_buf = __Pyx_PyObject_AsUString(values[0]); if (unlikely((!__pyx_v_buf) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_v_buflen = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_buflen == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("verifyf", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_L3_error:; - __Pyx_AddTraceback("verifyf.verifyf", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7verifyf_verifyf(__pyx_self, __pyx_v_buf, __pyx_v_buflen); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7verifyf_verifyf(CYTHON_UNUSED PyObject *__pyx_self, unsigned char *__pyx_v_buf, int __pyx_v_buflen) { - unsigned int __pyx_v_j; - unsigned int __pyx_v_compv; - unsigned int __pyx_v_count; - unsigned int __pyx_v_idx; - unsigned int __pyx_v_carg; - unsigned int __pyx_v_dw; - PyObject *__pyx_v_counts = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - unsigned int __pyx_t_2; - int __pyx_t_3; - unsigned int __pyx_t_4; - int __pyx_t_5; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("verifyf", 0); - - /* "verifyf.pyx":19 - * cdef unsigned int i, j, compv, count, idx, carg, dw - * - * counts = [0] * 10 # <<<<<<<<<<<<<< - * - * for idx in range(10): - */ - __pyx_t_1 = PyList_New(1 * 10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < 10; __pyx_temp++) { - __Pyx_INCREF(__pyx_int_0); - PyList_SET_ITEM(__pyx_t_1, __pyx_temp, __pyx_int_0); - __Pyx_GIVEREF(__pyx_int_0); - } - } - __pyx_v_counts = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "verifyf.pyx":21 - * counts = [0] * 10 - * - * for idx in range(10): # <<<<<<<<<<<<<< - * carg = cargs[idx] - * - */ - for (__pyx_t_2 = 0; __pyx_t_2 < 10; __pyx_t_2+=1) { - __pyx_v_idx = __pyx_t_2; - - /* "verifyf.pyx":22 - * - * for idx in range(10): - * carg = cargs[idx] # <<<<<<<<<<<<<< - * - * compv = 12345 * carg - */ - __pyx_v_carg = (__pyx_v_7verifyf_cargs[__pyx_v_idx]); - - /* "verifyf.pyx":24 - * carg = cargs[idx] - * - * compv = 12345 * carg # <<<<<<<<<<<<<< - * count = 0 - * for j in range(0, buflen, 4): - */ - __pyx_v_compv = (12345 * __pyx_v_carg); - - /* "verifyf.pyx":25 - * - * compv = 12345 * carg - * count = 0 # <<<<<<<<<<<<<< - * for j in range(0, buflen, 4): - * dw = ( - */ - __pyx_v_count = 0; - - /* "verifyf.pyx":26 - * compv = 12345 * carg - * count = 0 - * for j in range(0, buflen, 4): # <<<<<<<<<<<<<< - * dw = ( - * (buf[j + 0] << 0) | - */ - __pyx_t_3 = __pyx_v_buflen; - for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=4) { - __pyx_v_j = __pyx_t_4; - - /* "verifyf.pyx":30 - * (buf[j + 0] << 0) | - * (buf[j + 1] << 8) | - * (buf[j + 2] << 16) | # <<<<<<<<<<<<<< - * (buf[j + 3] << 24) - * ) - */ - __pyx_v_dw = (((((__pyx_v_buf[(__pyx_v_j + 0)]) << 0) | ((__pyx_v_buf[(__pyx_v_j + 1)]) << 8)) | ((__pyx_v_buf[(__pyx_v_j + 2)]) << 16)) | ((__pyx_v_buf[(__pyx_v_j + 3)]) << 24)); - - /* "verifyf.pyx":34 - * ) - * - * if dw >= compv: # <<<<<<<<<<<<<< - * count += 1 - * compv = compv + carg - */ - __pyx_t_5 = ((__pyx_v_dw >= __pyx_v_compv) != 0); - if (__pyx_t_5) { - - /* "verifyf.pyx":35 - * - * if dw >= compv: - * count += 1 # <<<<<<<<<<<<<< - * compv = compv + carg - * counts[idx] = count - */ - __pyx_v_count = (__pyx_v_count + 1); - goto __pyx_L7; - } - __pyx_L7:; - - /* "verifyf.pyx":36 - * if dw >= compv: - * count += 1 - * compv = compv + carg # <<<<<<<<<<<<<< - * counts[idx] = count - * - */ - __pyx_v_compv = (__pyx_v_compv + __pyx_v_carg); - } - - /* "verifyf.pyx":37 - * count += 1 - * compv = compv + carg - * counts[idx] = count # <<<<<<<<<<<<<< - * - * return counts - */ - __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (unlikely(__Pyx_SetItemInt(__pyx_v_counts, __pyx_v_idx, __pyx_t_1, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 1, 0, 0) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } - - /* "verifyf.pyx":39 - * counts[idx] = count - * - * return counts # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_counts); - __pyx_r = __pyx_v_counts; - goto __pyx_L0; - - /* "verifyf.pyx":16 - * ] - * - * def verifyf(unsigned char* buf, int buflen): # <<<<<<<<<<<<<< - * cdef unsigned int i, j, compv, count, idx, carg, dw - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("verifyf.verifyf", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_counts); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef __pyx_moduledef = { - #if PY_VERSION_HEX < 0x03020000 - { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, - #else - PyModuleDef_HEAD_INIT, - #endif - "verifyf", - 0, /* m_doc */ - -1, /* m_size */ - __pyx_methods /* m_methods */, - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_kp_s_C_Users_Documents_GitHub_eudtrgl, __pyx_k_C_Users_Documents_GitHub_eudtrgl, sizeof(__pyx_k_C_Users_Documents_GitHub_eudtrgl), 0, 0, 1, 0}, - {&__pyx_n_s_buf, __pyx_k_buf, sizeof(__pyx_k_buf), 0, 0, 1, 1}, - {&__pyx_n_s_buflen, __pyx_k_buflen, sizeof(__pyx_k_buflen), 0, 0, 1, 1}, - {&__pyx_n_s_carg, __pyx_k_carg, sizeof(__pyx_k_carg), 0, 0, 1, 1}, - {&__pyx_n_s_compv, __pyx_k_compv, sizeof(__pyx_k_compv), 0, 0, 1, 1}, - {&__pyx_n_s_count, __pyx_k_count, sizeof(__pyx_k_count), 0, 0, 1, 1}, - {&__pyx_n_s_counts, __pyx_k_counts, sizeof(__pyx_k_counts), 0, 0, 1, 1}, - {&__pyx_n_s_dw, __pyx_k_dw, sizeof(__pyx_k_dw), 0, 0, 1, 1}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_idx, __pyx_k_idx, sizeof(__pyx_k_idx), 0, 0, 1, 1}, - {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_verifyf, __pyx_k_verifyf, sizeof(__pyx_k_verifyf), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - return 0; - __pyx_L1_error:; - return -1; -} - -static int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "verifyf.pyx":16 - * ] - * - * def verifyf(unsigned char* buf, int buflen): # <<<<<<<<<<<<<< - * cdef unsigned int i, j, compv, count, idx, carg, dw - * - */ - __pyx_tuple_ = PyTuple_Pack(10, __pyx_n_s_buf, __pyx_n_s_buflen, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_compv, __pyx_n_s_count, __pyx_n_s_idx, __pyx_n_s_carg, __pyx_n_s_dw, __pyx_n_s_counts); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(2, 0, 10, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_C_Users_Documents_GitHub_eudtrgl, __pyx_n_s_verifyf, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - return 0; - __pyx_L1_error:; - return -1; -} - -#if PY_MAJOR_VERSION < 3 -PyMODINIT_FUNC initverifyf(void); /*proto*/ -PyMODINIT_FUNC initverifyf(void) -#else -PyMODINIT_FUNC PyInit_verifyf(void); /*proto*/ -PyMODINIT_FUNC PyInit_verifyf(void) -#endif -{ - static int __pyx_t_1[10]; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_REFNANNY - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); - if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); - } - #endif - __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_verifyf(void)", 0); - if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #ifdef __Pyx_CyFunction_USED - if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - #ifdef WITH_THREAD /* Python build with threading support? */ - PyEval_InitThreads(); - #endif - #endif - /*--- Module creation code ---*/ - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("verifyf", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #if CYTHON_COMPILING_IN_PYPY - Py_INCREF(__pyx_b); - #endif - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - /*--- Initialize various global constants etc. ---*/ - if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - if (__pyx_module_is_main_verifyf) { - if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (!PyDict_GetItemString(modules, "verifyf")) { - if (unlikely(PyDict_SetItemString(modules, "verifyf", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - } - #endif - /*--- Builtin init code ---*/ - if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Constants init code ---*/ - if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Global init code ---*/ - /*--- Variable export code ---*/ - /*--- Function export code ---*/ - /*--- Type init code ---*/ - /*--- Type import code ---*/ - /*--- Variable import code ---*/ - /*--- Function import code ---*/ - /*--- Execution code ---*/ - - /* "verifyf.pyx":3 - * #cython: boundscheck=False - * - * cdef int* cargs = [ # <<<<<<<<<<<<<< - * 0x08D3DCB1, - * 0x05F417D1, - */ - __pyx_t_1[0] = 0x08D3DCB1; - __pyx_t_1[1] = 0x05F417D1; - __pyx_t_1[2] = 0x01886E5F; - __pyx_t_1[3] = 0x01539095; - __pyx_t_1[4] = 0x00980E41; - __pyx_t_1[5] = 0x006D0B81; - __pyx_t_1[6] = 0x0060CDB5; - __pyx_t_1[7] = 0x0059686D; - __pyx_t_1[8] = 0x0045A523; - __pyx_t_1[9] = 0x0041BBB3; - __pyx_v_7verifyf_cargs = __pyx_t_1; - - /* "verifyf.pyx":16 - * ] - * - * def verifyf(unsigned char* buf, int buflen): # <<<<<<<<<<<<<< - * cdef unsigned int i, j, compv, count, idx, carg, dw - * - */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7verifyf_1verifyf, NULL, __pyx_n_s_verifyf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_verifyf, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "verifyf.pyx":1 - * #cython: boundscheck=False # <<<<<<<<<<<<<< - * - * cdef int* cargs = [ - */ - __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init verifyf", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_DECREF(__pyx_m); __pyx_m = 0; - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init verifyf"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if PY_MAJOR_VERSION < 3 - return; - #else - return __pyx_m; - #endif -} - -/* --- Runtime support code --- */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule((char *)modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { - int r; - if (!j) return -1; - r = PyObject_SetItem(o, j, v); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, - int is_list, int wraparound, int boundscheck) { -#if CYTHON_COMPILING_IN_CPYTHON - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); - if ((!boundscheck) || likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { - PyObject* old = PyList_GET_ITEM(o, n); - Py_INCREF(v); - PyList_SET_ITEM(o, n, v); - Py_DECREF(old); - return 1; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_ass_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_Clear(); - else - return -1; - } - } - return m->sq_ass_item(o, i, v); - } - } -#else -#if CYTHON_COMPILING_IN_PYPY - if (is_list || (PySequence_Check(o) && !PyDict_Check(o))) { -#else - if (is_list || PySequence_Check(o)) { -#endif - return PySequence_SetItem(o, i, v); - } -#endif - return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); -} - -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = (start + end) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - py_code = __pyx_find_code_object(c_line ? c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? c_line : py_line, py_code); - } - py_frame = PyFrame_New( - PyThreadState_GET(), /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - py_frame->f_lineno = py_line; - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value) \ - { \ - func_type value = func_value; \ - if (sizeof(target_type) < sizeof(func_type)) { \ - if (unlikely(value != (func_type) (target_type) value)) { \ - func_type zero = 0; \ - if (is_unsigned && unlikely(value < zero)) \ - goto raise_neg_overflow; \ - else \ - goto raise_overflow; \ - } \ - } \ - return (target_type) value; \ - } - -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #endif -#endif - -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { - const int neg_one = (int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x)) - } else if (sizeof(int) <= sizeof(unsigned long long)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x)) - } - } else { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +(((PyLongObject*)x)->ob_digit[0])); - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x)) - } else if (sizeof(int) <= sizeof(long long)) { - __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x)) - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { - const unsigned int neg_one = (unsigned int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(unsigned int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (unsigned int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } - if (sizeof(unsigned int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) - } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { - __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long long, PyLong_AsUnsignedLongLong(x)) - } - } else { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +(((PyLongObject*)x)->ob_digit[0])); - case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (sizeof(unsigned int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT(unsigned int, long, PyLong_AsLong(x)) - } else if (sizeof(unsigned int) <= sizeof(long long)) { - __PYX_VERIFY_RETURN_INT(unsigned int, long long, PyLong_AsLongLong(x)) - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - unsigned int val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (unsigned int) -1; - } - } else { - unsigned int val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (unsigned int) -1; - val = __Pyx_PyInt_As_unsigned_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to unsigned int"); - return (unsigned int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned int"); - return (unsigned int) -1; -} - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { - const int neg_one = (int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - } else if (sizeof(int) <= sizeof(unsigned long long)) { - return PyLong_FromUnsignedLongLong((unsigned long long) value); - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(long long)) { - return PyLong_FromLongLong((long long) value); - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } -} - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { - const unsigned int neg_one = (unsigned int) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(unsigned int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { - return PyLong_FromUnsignedLongLong((unsigned long long) value); - } - } else { - if (sizeof(unsigned int) <= sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(unsigned int) <= sizeof(long long)) { - return PyLong_FromLongLong((long long) value); - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(unsigned int), - little, !is_unsigned); - } -} - -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - const long neg_one = (long) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); - } else if (sizeof(long) <= sizeof(unsigned long long)) { - return PyLong_FromUnsignedLongLong((unsigned long long) value); - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(long long)) { - return PyLong_FromLongLong((long long) value); - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { - const long neg_one = (long) -1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong(x)) - } else if (sizeof(long) <= sizeof(unsigned long long)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong(x)) - } - } else { -#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(x)) { - case 0: return 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +(((PyLongObject*)x)->ob_digit[0])); - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); - } - #endif -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong(x)) - } else if (sizeof(long) <= sizeof(long long)) { - __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong(x)) - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_Int(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { -#if PY_VERSION_HEX < 0x03030000 - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -#else - if (__Pyx_PyUnicode_READY(o) == -1) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (PyUnicode_IS_ASCII(o)) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -#endif - } else -#endif -#if !CYTHON_COMPILING_IN_PYPY - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { - PyNumberMethods *m; - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (PyInt_Check(x) || PyLong_Check(x)) -#else - if (PyLong_Check(x)) -#endif - return Py_INCREF(x), x; - m = Py_TYPE(x)->tp_as_number; -#if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = PyNumber_Long(x); - } -#else - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Long(x); - } -#endif - if (res) { -#if PY_MAJOR_VERSION < 3 - if (!PyInt_Check(res) && !PyLong_Check(res)) { -#else - if (!PyLong_Check(res)) { -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - name, name, Py_TYPE(res)->tp_name); - Py_DECREF(res); - return NULL; - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) - return PyInt_AS_LONG(b); -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 - #if CYTHON_USE_PYLONG_INTERNALS - switch (Py_SIZE(b)) { - case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; - case 0: return 0; - case 1: return ((PyLongObject*)b)->ob_digit[0]; - } - #endif - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/cython_src/verifyf.pyd b/cython_src/verifyf.pyd deleted file mode 100644 index 0eb394ef07038ad36a3b59fee295a367dd1fe3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25088 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 diff --git a/cython_src/verifyf.pyx b/cython_src/verifyf.pyx deleted file mode 100644 index d18724ec..00000000 --- a/cython_src/verifyf.pyx +++ /dev/null @@ -1,39 +0,0 @@ -#cython: boundscheck=False - -cdef int* cargs = [ - 0x08D3DCB1, - 0x05F417D1, - 0x01886E5F, - 0x01539095, - 0x00980E41, - 0x006D0B81, - 0x0060CDB5, - 0x0059686D, - 0x0045A523, - 0x0041BBB3, -] - -def verifyf(unsigned char* buf, int buflen): - cdef unsigned int i, j, compv, count, idx, carg, dw - - counts = [0] * 10 - - for idx in range(10): - carg = cargs[idx] - - compv = 12345 * carg - count = 0 - for j in range(0, buflen, 4): - dw = ( - (buf[j + 0] << 0) | - (buf[j + 1] << 8) | - (buf[j + 2] << 16) | - (buf[j + 3] << 24) - ) - - if dw >= compv: - count += 1 - compv = compv + carg - counts[idx] = count - - return counts diff --git a/api.rst b/docs/api.rst similarity index 100% rename from api.rst rename to docs/api.rst diff --git a/docdiff.py b/docs/docdiff.py similarity index 96% rename from docdiff.py rename to docs/docdiff.py index 03a0295c..4433bef7 100644 --- a/docdiff.py +++ b/docs/docdiff.py @@ -1,3 +1,8 @@ +import sys +import os +sys.path.insert(1, os.path.abspath( + os.path.join(os.path.dirname(__file__), ".."))) + import eudplib import types import re diff --git a/funclist.txt b/docs/funclist.txt similarity index 100% rename from funclist.txt rename to docs/funclist.txt diff --git a/example_tool/unlimiter/setup.py b/example_tool/unlimiter/setup.py deleted file mode 100644 index 4dbeaffd..00000000 --- a/example_tool/unlimiter/setup.py +++ /dev/null @@ -1,38 +0,0 @@ -# distutils setup file - -import os -import sys - -from cx_Freeze import Executable, setup - -eudplibPath = os.path.dirname( - os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -) - -# Dependencies are automatically detected, but it might need fine tuning. -build_exe_options = { - "packages": ["os", "eudplib"], - "include_msvcr": True, - "include_files": [ - eudplibPath + "/eudplib/core/mapdata/StormLib32.dll", - eudplibPath + "/eudplib/epscript/libepScriptLib.dll", - ], - "excludes": ["tkinter"], - "optimize": 2, - "zip_include_packages": "*", - "zip_exclude_packages": "", -} - -# GUI applications require a different base on Windows (the default is for a -# console application). -base = None - -setup( - name="SC Unlimiter", - version="0.2", - description="My GUI application!", - options={"build_exe": build_exe_options}, - executables=[Executable("unlimiter.py", base=base)], -) - -# add SFmpq32.dll manually diff --git a/example_tool/unlimiter/unlimiter.py b/example_tool/unlimiter/unlimiter.py deleted file mode 100644 index 9c4ec187..00000000 --- a/example_tool/unlimiter/unlimiter.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -unlimiter v1 -""" - -from eudplib import * -import sys, os - - -def connectDList(el_start, el_end, itemSize, itemN, isSprite): - dataDb = Db(bytes(itemSize * itemN)) - - a1, a2, a3 = Forward(), Forward(), Forward() - if EUDLoopN()(itemN): - DoActions( - [ - a1 << SetMemory(dataDb, SetTo, dataDb - itemSize), - a2 << SetMemory(dataDb + 4, SetTo, dataDb + itemSize), - SetMemory(a1 + 16, Add, itemSize // 4), - SetMemory(a1 + 20, Add, itemSize), - SetMemory(a2 + 16, Add, itemSize // 4), - SetMemory(a2 + 20, Add, itemSize), - ] - ) - Trigger( - isSprite >= 1, - [ - a3 << SetMemory(dataDb + 0x10, SetTo, 10000), - SetMemory(a3 + 16, Add, itemSize // 4), - SetMemory(a3 + 20, Add, 1), - ], - ) - EUDEndLoopN() - - DoActions( - [ - SetMemory(el_start, SetTo, dataDb), - SetMemory(dataDb, SetTo, 0), - SetMemory(el_end, SetTo, dataDb + itemSize * (itemN - 1)), - SetMemory(dataDb + itemSize * (itemN - 1) + 4, SetTo, 0), - ] - ) - - -def inj_main(): - connectDList(0x64EED8, 0x64EEDC, 112, 8192, 0) # Patch bullet count - connectDList(0x63FE30, 0x63FE34, 36, 65536, 1) # Patch sprite count - connectDList(0x57EB68, 0x57EB70, 64, 65536, 0) # Patch image count - connectDList(0x64B2E0, 0x64B2E4, 20, 65536, 0) # Patch order count - - if EUDInfLoop()(): - RunTrigTrigger() - DoActions(SetMemory(0x64DEBC, SetTo, 40)) # Valkyrie fix - EUDDoEvents() - EUDEndInfLoop() - - -if len(sys.argv) != 2: - print("Usage : unlimiter [input map]") - os.system("Pause") - sys.exit() - -ifname = sys.argv[1] -if ifname[-4:] != ".scx": - print("Map extension should be '.scx'") - os.system("Pause") - sys.exit() - -LoadMap(ifname) -SaveMap(ifname[:-4] + " ulm.scx", inj_main) - -print("Complete") diff --git a/examples/cardshuffle.py b/examples/cardshuffle.py deleted file mode 100644 index 9a65e719..00000000 --- a/examples/cardshuffle.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -Card shuffling part only on mycardgame.py -""" - -import sys -import os - -sys.path.insert(0, os.path.abspath("..\\")) - -from eudplib import * - -cards = EUDArray(54) - - -def ShuffleArray(arr, n): - """ Array shuffler - :param EUDArray arr: Array to shuffle - :param n: Number of elements insode array - """ - i = EUDVariable() - t = EUDVariable() - i << 0 - - if EUDWhile(i < n): - j = i + f_div(f_rand(), n - i)[1] - t << arr.get(i) - arr.set(i, arr.get(j)) - arr.set(j, t) - i << i + 1 - EUDEndWhile() - - -@EUDFunc -def PrepareDeck(): - for i in range(54): - cards.set(i, i) - - ShuffleArray(cards, 54) - - -def main(): - if EUDInfLoop(): - PrepareDeck() - for i in range(54): - SeqCompute([(EPD(0x58D740) + i, SetTo, cards.get(i))]) - EUDDoEvents() - EUDEndInfLoop() - - -LoadMap("basemap/basemap.scx") -# CompressPayload(True) -SaveMap("outputmap/shuffle.scx", main) diff --git a/examples/prj_cardgame_stack.py b/examples/prj_cardgame_stack.py deleted file mode 100644 index fe18f987..00000000 --- a/examples/prj_cardgame_stack.py +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -""" -스택(Stack) 규칙 - -1. 카드는 다음 순서와 같이 강함이 정의된다. -> ♠A > ♥A > ♦A > ♣A -> ♠K > ♥K > ♦K > ♣K -> ♠Q > ♥Q > ♦Q > ♣Q -> ♠J > ♥J > ♦J > ♣J -> ♠10 > ♥10 > ♦10 > ♣10 -> ♠9 > ♥9 > ♦9 > ♣9 -> ♠8 > ♥8 > ♦8 > ♣8 -> ♠7 > ♥7 > ♦7 > ♣7 -> ♠6 > ♥6 > ♦6 > ♣6 -> ♠5 > ♥5 > ♦5 > ♣5 -> ♠4 > ♥4 > ♦4 > ♣4 -> ♠3 > ♥3 > ♦3 > ♣3 -> ♠2 > ♥2 > ♦2 > ♣2 - - -즉, 스페이드 A는 클로버 10보다 강하다. - - -2. 트럼프 52장 (AKQJ10987654321 * (스페이드 하트 다이아몬드 클로버), 총 52장의 카드로 플레이한다. - 플레이어 수는 2~6명. - -3. 게임 시작할 때 각 플레이어들에게 7장의 카드씩을 배분한다. 남는 카드는 모아서 뒤집어서 덮어놓는다. 이것을 덱이라 한다. - -4. 각 라운드는 다음과 같이 진행한다. - 4-1 :​ 덱에서 카드 한장을 뽑아서 오픈(앞면이 보이게 둠)한다. - - 4-2 : 각 플레이어마다 - 1) 오픈된 마지막 카드보다 더 강한 카드를 내던가(새로 오픈) - cf) 오픈된 마지막 카드가 A이면 그 카드보다 더 강한 A를 내거나 A가 아닌 카드를 아무거나 낼 수 있음 - - 2) 지금까지 오픈된 카드 숫자를 N이라 할 때 - N이 홀수면 (N + 1) / 2장을 - N이 짝수면 N / 2 장을 - 덱에서 뽑은 다음, 지금까지 오픈된 모든 카드들을 덮어서 따로 모아둔다 (덱2라고 하자). 새로운 라운드를 다시 시작한다. - 새로운 라운드는 다음 플레이이어부터 시작한다. - - 4-3 : 4-2를 라운드가 끝날때까지 반복한다. - - -5. 라운드 진행 중에 예외사항 - 5-1 : 덱에 카드가 없는데 덱에서 카드를 뽑아야 할 경우 - 5-1-1 : 4-1 에 따라서 덱에서 카드를 뽑아야 할 경우 - 1) 지금까지 덱2에 쌓인 카드들을 섞어서 덱으로 옮기고 덱에서 옮긴다. - 2) 덱2가 원래 비었으면 각 플레이어는 카드를 자유롭게 하나씩 버릴 수 있다. 버린 카드들을 섞어 덱을 구성해서 게임을 진행한다. - - 5-1-2: 4-2-2)에 따라서 덱에서 카드를 뽑아야 할 경우 - 1) 일단 이미 있던 덱에서 최대한 카드를 뽑고, 해당 라운드에서 오픈되지 않았던 덱2의 카드들을 섞어서 덱으로 옮긴다. - 해당 라운드에서 오픈됬던 카드를 덱2로 삼는다. 즉, 해당 라운드에서 오픈됬던 카드는 3-2-2) 과정에서 뽑을 수 없다. - 2) 남아있던 덱과 이미 있던 덱 2의 카드를 합쳐서도 카드 갯수가 부족하면 이미 있던 덱2의 카드들을 모두 뽑은 다음에 - 해당 라운드에서 오픈됬던 카드를로 덱을 재구성해서 카드를 뽑는다. - - 5-2 : 어느 한 사람이 카드를 모두 소비했을 경우 - - 그 사람은 이긴 것으로 치며, 게임에서 빠진다. - -6. 기타 규칙 - - 카드가 1장 남아있고 그 1장이 조커일 때, 조커를 라운드에서 낼 수 없다. (조커를 맨 마지막 카드로 낼 수 없습니다) - - 스페이드 2, 하트 2, 다이아몬드 2, 클로버 2를 모두 모은 사람은 게임에서 즉시 이긴다. (2 포카드 규칙) - - - *) 잘 일어나지 않는 일은 회색으로 표시했습니다. -""" - -import sys -import os - -sys.path.insert(0, os.path.abspath("..\\")) -from eudplib import * - -# Global variable : card deck -deck1 = EUDArray(53) -deck2 = EUDArray(53) - - -def ShuffleArray(arr, n): - i = EUDVariable() - t = EUDVariable() - i << 0 - - if EUDWhile(i < n): - j = i + f_div(f_rand(), n - i)[1] - t << arr.get(i) - arr.set(i, arr.get(j)) - arr.set(j, t) - i << i + 1 - EUDEndWhile() - - -@EUDFunc -def InitDecks(): - for i in range(53): - deck1.set(i, i) - - for i in range(53): - deck2.set(i, 0xFFFFFFFF) - - ShuffleArray(deck1, 53) - - -@EUDFunc -def PopDeck(): - if EUDIf(deck1.get(0) == 0xFFFFFFFF): # deck empty 5-1-1 - # copy deck2 to deck1 - deck2n = EUDVariable() - deck2n << 0 - for i in range(53): - card = deck2.get(i) - EUDBreakIf(card == 0xFFFFFFFF) - deck1.set(i, card) - deck2n += 1 - - if EUDIf(deck2n == 0): # so sad - # query each player to drop cards - DoActions( - [ - ( - SetCurrentPlayer(player), - ## TODO : DisplayTextText is removed - DisplayExtText( - SCMD2Text( - """\ -<0F>Rule 5-1-1 2) <04>덱, 덱2가 비었습니다. -<17>카드 한장씩을 버려주십시오.""" - ) - ), - ) - for player in range(8) - ] - ) - - for player in range(8): - if EUDIf(IsPlayerPlaying(player)): - QueuePlayerDraw(player) - EUDEndIf() - - if EUDInfLoop(): - flag = EUDVariable() - flag << 0 - for player in range(8): - if EUDIfNot([IsPlayerPlaying(player), HasPlayerDrawn(player)]): - flag << 1 - EUDEndIf() - EUDBreakIf(flag == 0) - EUDEndInfLoop() - - if EUDElse(): - DoActions( - [ - ( - SetCurrentPlayer(player), - ## TODO : DisplayTextText is removed - DisplayExtText( - SCMD2Text( - """\ -<0F>Rule 5-1-1 1) <04>덱이 비워졌으므로 덱2에서 보충합니다.""" - ) - ), - ) - for player in range(8) - ] - ) - EUDEndIf() - EUDEndIf() - - ret = deck1.get(0) - for i in range(52): - deck1.set(i, deck1.get(i + 1)) - deck1.set(52, 0xFFFFFFFF) # no card - return ret - - -def main(): - if EUDInfLoop(): - PrepareDeck() - EUDDoEvents() - EUDEndInfLoop() - - -LoadMap("basemap/basemap_stack.scx") -# CompressPayload(True) -SaveMap("outputmap/Card Game [Stack].scx", main) diff --git a/funclist.py b/funclist.py deleted file mode 100644 index fd858a4b..00000000 --- a/funclist.py +++ /dev/null @@ -1,57 +0,0 @@ -reimport eudplib -import types - -module_to_doc = eudplib - -exclude_types = [dict, str, types.ModuleType] -eudftypes = [eudplib.EUDFuncN] -allowed_type = eudftypes + [type, types.FunctionType] -exclude_names = ['__loader__', '__path__', '__spec__'] -section_header_charr = ['=', '-', '\'', '~', '^'] - - -print('Collecting list of documentation-needed structures') -doc_needed_functions = set() -doc_needed_classes = set() - - -# Document module -for name, value in module_to_doc.__dict__.items(): - # Exclude list - if name in exclude_names or type(value) in exclude_types: - continue - - if not any(isinstance(value, t) for t in allowed_type): - continue - - if ( - isinstance(value, types.FunctionType) or - isinstance(value, eudplib.EUDFuncN) - ): - # Get function prototype - while isinstance(value, eudplib.EUDFuncN): - value = value._bodyfunc - - args = value.__code__.co_varnames[:value.__code__.co_argcount] - name = ('%s(%s)' % (name, ', '.join(args))) - doc_needed_functions.add(name) - - elif isinstance(value, type): - if name != 'EPError': - args = value.__init__.__code__.co_varnames[1:value.__init__.__code__.co_argcount] - name = ('%s(%s)' % (name, ', '.join(args))) - else: - name = 'EPError(msg)' # EPError는 Exception의 일종이라 __init__를 못 얻는다. - doc_needed_classes.add(name) - -print('\n==================================\n') - - -# Summary -print('Current entries:') -for k in sorted(doc_needed_functions): - print('%s' % k) -print('==================================') -for k in sorted(doc_needed_classes): - print('%s' % k) -print('==================================') diff --git a/linecounter.py b/linecounter.py deleted file mode 100644 index 42e2744f..00000000 --- a/linecounter.py +++ /dev/null @@ -1,52 +0,0 @@ -import os - -from pygments import highlight -from pygments.lexers import get_lexer_by_name -from pygments.formatters import HtmlFormatter - -totlinen = 0 -totsize = 0 -totstrlist = [] - -lexer = get_lexer_by_name("python", stripall=True) -formatter = HtmlFormatter(linenos=True) - -for root, dirs, files in os.walk("eudplib"): - for f in files: - if f[-3:] == ".py": - finalpath = os.path.join(root, f) - code = open(finalpath, "r").read() - totsize += len(code) - linen = code.count("\n") + 1 - print("%-40s : %4d" % (finalpath, linen)) - totlinen += linen - - highlighted_code = highlight(code, lexer, formatter) - - totstrlist.append( - "

{finalpath} : {linen} lines

\n" - "{highlighted_code}

".format(**locals()) - ) - -print("Total lines: %d" % totlinen) -print("Total size: %d" % totsize) - -cssstyle = HtmlFormatter().get_style_defs(".highlight") - -totstr = "".join(totstrlist) - -open("out.html", "w").write( - """\ - - - Output - - - -{totstr} - - -""".format( - **locals() - ) -) diff --git a/mpqapi_test/basemap.scx b/mpqapi_test/basemap.scx deleted file mode 100644 index 755a6b95c79d623b7fafc4f53023406c5290eedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39578 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

!$j~X=%7WP9TumZ)B1O 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ⅈq*dCz3={fU z!Iv{=vzUwKxmt*Rn+wiB#VQH2REz@;2s&)u(1X|Vv*n}!-pzq6&zV%OCHq|9X0DqhZ&0ZPE(@OO5o!nZ1P0liR)~*YPLkWdoNXO+9%KnMMlgRtrt3$>9__i!7mu_ zpwpLQrch_UkBCT)PNP1|xwxDpm?>_iRtT-x5*#D-iotz^u=^TYZTH z0c2T_)sGKoEaW?Ca}_cj$jnK(=!kmA#;&kNIWth+2K11ioFFL^7(F6yHv?fl>~dy& z4Sc@TVOPjjR_{!S2;;w{HfOUm(pCjBvfMdJoy@O{01P94`IK2(MpuKX*htf8hY!X; z8Ct?Z`$&iNN^wPz#=YvGUwJ(!l&zLTt7(suz2Lw-v)cL3pni4%*lni^pxv z)xrB|tRHK503NjVsENUjY#1$2xY0?&sS#Np|7mjWsj{RjfwRPfOMR6FcGA8%9x85C z0+A}@6S`sIDX1d)3J0=0B$R9~lOfa#7I#lto?;^y17aEQ3jBZaA}RT$Xjbz`ZUti49OPjmI|d%w(C!4_E-o!UctW1IPLqkjhFZS|y35ID9ug z@?2p6^ri-LTaK{L=6t!Hha%406dxQkRa@G&wQ-;6Q?X(N?*6Zob>)rkA;6&j$owPkpd zi9dYef;s7+comv>F&-Cs8jy4?QJmY!lSxL{(}eU^=*kZ6mw_U%PhjjLEpttO?)&mi zg@QMX$bPZpez6;76^#p-sW?)#`EZa#_n3o1d1HWDMl8pi%U~vtCWFUo6$`JriFS2( zTJx+4KoDs_|%<#6x_G8b8iH zr+m~-Lu;N8XMg2`Fm-C*T|Tg`;1Zqej~dBDGR7vxG&p(rv`2LnabXptT9~GyNKXU0 z0g|Wu@_iHUIYn5@ln+=M^$I`OF%_z?5fvx00b_$@AI!u7DRWg25aH;KtFDeF!rh+e zz(Mp|#ez|{jsAFs3)y|d6{f-*bHY)ckh}xYi&s$XB5YE8NBM+$(9NxqgyEso(7jj3 z(tsqRNWQD`BajHNJ3yp}R-tB!;dit>`g|DKUOyk`05t4ow_p7JNU*}dB4v^@ViL5E z#epqeKEuMCqt>MKy99c6^hY$QYEP2I++WjFJY*zNV3#^-58cPCwkkcJbBecn1pJ@M zT7`s&P28SfqrbFb$zR45-C<|3oWM%J`P_#-%O?%i*Lv)jjDhtF2fTV`1z^cGd1=~o zIYhC{3?&p!U~&?HQO7l%p48u?U03 zx+l3|FhbRE1Ce6x3SB;i4Om1-cm+wjXuUocosA9V21=wPeKxmz#$VX}PXt~uH<$BG zI-yWMxFcHLuqCzhME}YMg&gN-|D>PCXcR7b*=v^wzA;5>mWpfcmGUoyktJcs`M^^wMmeA#`9r?kSNJ)=|P ztF}Sc50y=`CtCLc<)_EM9#BS@o2^Qk$P5}y!>%ytNvb{gP5jq(rZHg-8ooDx zw_3KJywrGZ7j<~7p2H9X8Ifa#^IuQ7OJ@+(-*XgXq4ieta*wSUFui2R!j2NnSEKTG_ zg8Nd0WEVW#nO*r_kG!6dVpmJ8(PphY&PhKyFE6rEyKXX+-|_i}xi$@B2QjO%x?1*d zs$EM+oow++0IZn(@HB&&E%xB3r^MtYHU$U1p9La-QDxloXc#_Eq)7N4^=0NC+YP4b#2Bwz6MZ%pAd2!@o5v!GuN-(t-{ asK-uS&EFpEKjPo&*41SKS?XFuGvP5mwBEx2 diff --git a/mpqapi_test/mpqapi.py b/mpqapi_test/mpqapi.py deleted file mode 100644 index db5c2c52..00000000 --- a/mpqapi_test/mpqapi.py +++ /dev/null @@ -1,199 +0,0 @@ -from cffi import FFI -import os, sys, struct, platform -from tempfile import NamedTemporaryFile -from eudplib.utils import u2b - - -filename_u2b = None - - -# Constants -MPQ_FILE_COMPRESS = 0x00000200 -MPQ_FILE_ENCRYPTED = 0x00010000 -MPQ_FILE_FIX_KEY = 0x00020000 -MPQ_FILE_REPLACEEXISTING = 0x80000000 - -MPQ_WAVE_QUALITY_MEDIUM = 0x1 - -# Logic -ffi = FFI() - -ffi.cdef( - """ -typedef void *HANDLE, *LPOVERLAPPED; -typedef void VOID; -typedef unsigned int DWORD, BOOL; -typedef unsigned short WORD; -typedef unsigned char BYTE; - -BOOL WINAPI SFileOpenArchive(const char*, DWORD, DWORD, HANDLE*); -BOOL WINAPI SFileCompactArchive(HANDLE, const char*, BOOL); -BOOL WINAPI SFileCloseArchive(HANDLE); -BOOL WINAPI SFileOpenFileEx(HANDLE, const char*, DWORD, HANDLE*); -DWORD WINAPI SFileGetFileSize(HANDLE, DWORD*); -BOOL WINAPI SFileReadFile(HANDLE, VOID*, DWORD, DWORD*, LPOVERLAPPED); -BOOL WINAPI SFileCloseFile(HANDLE); -BOOL WINAPI SFileAddFile(HANDLE, const char*, const char*, DWORD); -BOOL WINAPI SFileAddWave(HANDLE, const char*, const char*, DWORD, DWORD); - -""" -) - - -libstorm = None - - -def InitMpqLibrary(): - global libstorm, filename_u2b - - try: - platformName = platform.system() - if platformName == "Windows": # windows - if struct.calcsize("P") == 4: # 32bit - libstorm = ffi.dlopen("dlls/StormLib32.dll") - else: # 64bit - libstorm = ffi.dlopen("dlls/StormLib64.dll") - filename_u2b = u2b - - elif platformName == "Darwin": # mac - try: - libstorm = ffi.dlopen("libstorm.dylib") - filename_u2b = lambda x: x.encode("utf-8") - except OSError: - print("You need to install stormlib before using eudplib.") - print(" $ brew install homebrew/games/stormlib") - return False - - return True - - except OSError: - print("Loading SFmpq failed.") - libstorm = None - return False - - -class MPQ: - def __init__(self): - self.mpqh = None - self.libstorm = libstorm - - def __del__(self): - self.Close() - - def Open(self, fname): - if self.mpqh is not None: - raise RuntimeError("Duplicate opening") - - h = ffi.new("HANDLE*") - ret = self.libstorm.SFileOpenArchive(filename_u2b(fname), 0, 0, h) - if not ret: - self.mpqh = None - return False - - self.mpqh = h[0] - return True - - def Close(self): - if self.mpqh is None: - return None - - self.libstorm.SFileCloseArchive(self.mpqh) - self.mpqh = None - return True - - # Extract - def Extract(self, fname): - if self.libstorm is None: - return None - elif not self.mpqh: - return None - - # Open file - fileh = ffi.new("HANDLE*") - ret = self.libstorm.SFileOpenFileEx(self.mpqh, u2b(fname), 0, fileh) - if not ret: - return None - fileh = fileh[0] - - # Get file size & allocate buffer - # Note : this version only supports 32bit mpq file - fsize = self.libstorm.SFileGetFileSize(fileh, ffi.NULL) - fdata = ffi.new("BYTE[]", fsize) - - # Read file - pfread = ffi.new("DWORD*") - self.libstorm.SFileReadFile(fileh, fdata, fsize, pfread, ffi.NULL) - self.libstorm.SFileCloseFile(fileh) - - if pfread[0] == fsize: - return ffi.buffer(fdata)[:] - else: - return None - - # Writer - - def PutFile(self, fname, buffer): - if not self.mpqh: - return None - - # Create temporary file - f = NamedTemporaryFile(delete=False) - f.write(buffer) - tmpfname = f.name - f.close() - - # Add to mpq - ret = self.libstorm.SFileAddFile( - self.mpqh, - u2b(tmpfname), - u2b(fname), - MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY, - ) - os.unlink(tmpfname) - return ret - - def PutWave(self, fname, buffer): - if not self.mpqh: - return None - - # Create temporary file - f = NamedTemporaryFile(delete=False) - f.write(buffer) - tmpfname = f.name - f.close() - - # Add to mpq - ret = self.libstorm.SFileAddWave( - self.mpqh, - filename_u2b(tmpfname), - u2b(fname), - MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY, - MPQ_WAVE_QUALITY_MEDIUM, - ) - os.unlink(tmpfname) - return ret - - def Compact(self): - self.libstorm.SFileCompactArchive(self.mpqh, ffi.NULL, 0) - - -InitMpqLibrary() - -if __name__ == "__main__": - mr = MPQ() - mr.Open("basemap.scx") - a = mr.Extract("staredit\\scenario.chk") - mr.Close() - print(len(a)) - - if os.path.exists("test.scx"): - os.unlink("test.scx") - open("test.scx", "wb").write(open("basemap.scx", "rb").read()) - - mr.Open("test.scx") - a = mr.Extract("staredit\\scenario.chk") - print(len(a)) - mr.PutFile("test", b"1234") - b = mr.Extract("test") - mr.Compact() - print(b) diff --git a/mpqapi_test/test.scx b/mpqapi_test/test.scx deleted file mode 100644 index 60cba7c955b6dc1d19b9cf03e502821e6e52d4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23260 zcmV(xK|qDs75E!QRgrE2 zEYoHiG9AKkppBL;5LFAmm~FLf#_W0EPBmj$f`>kBze|QCToJmpyV#k;dCWbnB+*d2v6*C$kzK05vQd33nPj5e@hnBqO$+W_Ko%XxfAWInBKs`WhZxrBu#hDX*C z9(mLv^Ta!}Awi3FwP@R5RBy$;(#A(^4__vUbNX{&A zh3ha@A*0TOtx6U*kZn5l-e?(~@B zlVGy&3LvXbDb!MJGcS}R0t4r6t5_$!w@%m)qX1@(K!7f` zJrU#vCL8NQ8|NM&PoWTCI&t*-JW~d2*BfYohMWJrSP?3tK?%BvKE%XC%Y_k&dfFA< zGtuU^&96$9hdj9yRN%uTJX?~zlq?KRFuC5~gXZLp=pbj+bs3OyS^h2996E6k;Z>u|g zGmB3E#e2F;x#qcm`AEjK!Z6`B6{?P3J%0ArtJouOnq=1CPqo)za*C1N!I<6zh-}1f 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 - - Output - - - -

eudplib\__init__.py : 59 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .utils import *
-from .core import *
-from .trigger import *
-from .ctrlstru import *
-from .eudlib import *
-from .trigtrg import *
-from .maprw import *
-
-__version__ = '0.53a0'
-
-import types
-
-# remove modules from __all__
-
-_alllist = []
-for _k, _v in dict(globals()).items():
-    if isinstance(_v, types.ModuleType):
-        continue
-    if _k[0] == '_':
-        continue
-    _alllist.append(_k)
-
-__all__ = _alllist
-
-
-del _k
-del _v
-
-
-def eudplibVersion():
-    return __version__
-
-_alllist.append('eudplibVersion')
-
-


eudplib\core\curpl.py : 59 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-from .allocator import Forward
-from .variable import EUDVariable
-from .rawtrigger import (
-    EncodePlayer,
-    Memory,
-    SetMemory,
-    SetTo,
-    Exactly,
-)
-
-
-_curpl_var = EUDVariable()
-_curpl_checkcond = Forward()
-
-
-def cpcacheMatchCond():
-    cond = Memory(0x6509A0, Exactly, 0)
-    _curpl_checkcond << cond
-    return cond
-
-
-def SetCurrentPlayer(p):
-    p = EncodePlayer(p)
-    return [
-        _curpl_var.SetNumber(p),
-        SetMemory(_curpl_checkcond + 8, SetTo, p),
-        SetMemory(0x6509B0, SetTo, p),
-    ]
-
-
-def GetCPCache():
-    return _curpl_var
-
-


eudplib\core\inlinens.py : 53 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-_objns = {}
-
-
-def EUDClearNamespace():
-    _objns.clear()
-
-
-def EUDRegisterObjectToNamespace(funcname, obj):
-    """ Register object to inline code namespace. """
-    if funcname[0] != '_':
-        if funcname in _objns:
-            _objns[funcname] = None
-        else:
-            _objns[funcname] = obj
-
-    return obj
-
-
-def EUDRegistered(func):
-    """ Decoreator for registering class / function. """
-    return EUDRegisterObjectToNamespace(func.__name__, func)
-
-
-def GetEUDNamespace():
-    """ Get list of functions that inline code can use. """
-    return _objns
-
-


eudplib\core\__init__.py : 38 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-from .allocator import *
-from .eudobj import *
-from .rawtrigger import *
-from .mapdata import *
-from .variable import *
-from .eudstruct import *
-from .eudfunc import *
-from .calcf import *
-
-from .inlinens import *
-from .curpl import SetCurrentPlayer
-
-


eudplib\core\allocator\payload.py : 407 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
-365
-366
-367
-368
-369
-370
-371
-372
-373
-374
-375
-376
-377
-378
-379
-380
-381
-382
-383
-384
-385
-386
-387
-388
-389
-390
-391
-392
-393
-394
-395
-396
-397
-398
-399
-400
-401
-402
-403
-404
-405
-406
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from . import rlocint, pbuffer
-from . import constexpr
-from eudplib import utils as ut
-from eudplib.utils import stackobjs
-
-import random
-import time
-
-_found_objects = []
-_found_objects_set = set()
-_untraversed_objects = []
-_dynamic_objects = []
-_dynamic_objects_set = set()
-_alloctable = {}
-_payload_size = 0
-
-PHASE_COLLECTING = 1
-PHASE_ALLOCATING = 2
-PHASE_WRITING = 3
-phase = None
-
-_payload_compress = False
-
-# -------
-
-_lastTime = 0
-_doLog = False
-
-
-def setPayloadLoggerMode(mode):
-    global _doLog
-    _doLog = mode
-
-
-def lprint(text, flush=False, _endingdict={True: '\n', False: '\r'}):
-    global _lastTime, _doLog
-    if not _doLog:
-        return
-
-    currentTime = time.time()
-    if flush or (currentTime - _lastTime) >= 0.5:
-        _lastTime = currentTime
-        print(text, end=_endingdict[flush])
-
-
-def CompressPayload(mode):
-    ''' Set payload compression mode.
-
-    :param mode: If true, enable object stacking (compression). If false,
-    disable it.
-    '''
-
-    global _payload_compress
-    if mode not in [True, False]:
-        raise ut.EPError('Invalid type')
-
-    if mode:
-        _payload_compress = True
-    else:
-        _payload_compress = False
-
-
-class ObjCollector:
-
-    '''
-    Object having PayloadBuffer-like interfaces. Collects all objects by
-    calling RegisterObject() for every related objects.
-    '''
-
-    def __init__(self):
-        pass
-
-    def StartWrite(self):
-        pass
-
-    def EndWrite(self):
-        pass
-
-    def WriteByte(self, number):
-        pass
-
-    def WriteWord(self, number):
-        pass
-
-    def WriteDword(self, number):
-        constexpr.Evaluate(number)
-
-    def WritePack(self, structformat, *arglist):
-        for arg in arglist:
-            constexpr.Evaluate(arg)
-
-    def WriteBytes(self, b):
-        pass
-
-    def WriteSpace(self, spacesize):
-        pass
-
-
-def CollectObjects(root):
-    global phase
-    global _found_objects
-    global _found_objects_set
-    global _dynamic_objects
-    global _dynamic_objects_set
-    global _untraversed_objects
-
-    lprint('[Stage 1/3] CollectObjects', flush=True)
-
-    phase = PHASE_COLLECTING
-
-    objc = ObjCollector()
-    _found_objects = []
-    _found_objects_set = set()
-    _dynamic_objects = []
-    _dynamic_objects_set = set()
-    _untraversed_objects = []
-
-    # Evaluate root to register root object.
-    # root may not have WritePayload() method e.g: Forward()
-    constexpr.Evaluate(root)
-
-    while _untraversed_objects:
-        while _untraversed_objects:
-            lprint(
-                " - Collected %d / %d objects" % (
-                    len(_found_objects),
-                    len(_found_objects) + len(_untraversed_objects)
-                )
-            )
-
-            obj = _untraversed_objects.pop()
-
-            objc.StartWrite()
-            obj.WritePayload(objc)
-            objc.EndWrite()
-
-        # Check for new objects
-        for obj in _dynamic_objects[:]:
-            objc.StartWrite()
-            obj.WritePayload(objc)
-            objc.EndWrite()
-
-    if len(_found_objects) == 0:
-        raise ut.EPError('No object collected')
-
-    # Shuffle objects -> Randomize(?) addresses
-    fo2 = _found_objects[1:]
-    random.shuffle(fo2)
-    _found_objects = [_found_objects[0]] + fo2
-
-    # cleanup
-    _found_objects_set = None
-    phase = None
-
-    # Final
-    lprint(
-        " - Collected %d / %d objects" %
-        (
-            len(_found_objects),
-            len(_found_objects)
-        ), flush=True
-    )
-
-
-# -------
-
-
-class ObjAllocator:
-
-    '''
-    Object having PayloadBuffer-like interfaces. Collects all objects by
-    calling RegisterObject() for every related objects.
-    '''
-
-    def __init__(self):
-        self._sizes = {}
-
-    def StartWrite(self):
-        self._suboccupmap = 0
-        self._suboccupidx = 0
-        self._occupmap = []
-
-    def _Occup0(self):
-        self._suboccupidx += 1
-        if self._suboccupidx == 4:
-            self._occupmap.append(self._suboccupmap)
-            self._suboccupidx = 0
-            self._suboccupmap = 0
-
-    def _Occup1(self):
-        self._suboccupmap = 1
-        self._suboccupidx += 1
-        if self._suboccupidx == 4:
-            self._occupmap.append(self._suboccupmap)
-            self._suboccupidx = 0
-            self._suboccupmap = 0
-
-    def EndWrite(self):
-        if self._suboccupidx:
-            self._occupmap.append(self._suboccupmap)
-            self._suboccupidx = 0
-        return self._occupmap
-
-    def WriteByte(self, number):
-        if number is None:
-            self._Occup0()
-        else:
-            self._Occup1()
-
-    def WriteWord(self, number):
-        if number is None:
-            self._Occup0()
-            self._Occup0()
-        else:
-            self._Occup1()
-            self._Occup1()
-
-    def WriteDword(self, number):
-        self._occupmap.append(1)
-
-    def WritePack(self, structformat, *arglist):
-        if structformat not in self._sizes:
-            ssize = 0
-            sizedict = {'B': 1, 'H': 2, 'I': 4}
-            for i in range(len(arglist)):
-                ssize += sizedict[structformat[i]]
-            self._sizes[structformat] = ssize
-
-        ssize = self._sizes[structformat]
-
-        # Add occupiation index
-        self._occupmap.extend([1] * (ssize >> 2))
-        ssize &= 3
-        for i in range(ssize):
-            self._Occup1()
-
-    def WriteBytes(self, b):
-        ssize = len(b)
-        self._occupmap.extend([1] * (ssize >> 2))
-        for i in range(ssize & 3):
-            self._Occup1()
-
-    def WriteSpace(self, ssize):
-        while ssize and self._suboccupidx:
-            self._Occup0()
-            ssize -= 1
-
-        self._occupmap.extend([0] * (ssize >> 2))
-        ssize &= 3
-        for i in range(ssize):
-            self._Occup0()
-
-
-def AllocObjects():
-    global phase
-    global _alloctable
-    global _payload_size
-
-    phase = PHASE_ALLOCATING
-    objn = len(_found_objects)
-
-    lprint("[Stage 2/3] AllocObjects", flush=True)
-
-    # Quick and less space-efficient approach
-    if not _payload_compress:
-        lallocaddr = 0
-        for i, obj in enumerate(_found_objects):
-            objsize = obj.GetDataSize()
-            allocsize = (objsize + 3) & ~3
-            _alloctable[obj] = lallocaddr
-            lallocaddr += allocsize
-
-            lprint(" - Allocated %d / %d objects" % (i + 1, objn))
-        _payload_size = lallocaddr
-
-        lprint(" - Allocated %d / %d objects" % (objn, objn), flush=True)
-        phase = None
-        return
-
-    obja = ObjAllocator()
-
-    _alloctable = {}
-    dwoccupmap_dict = {}
-
-    # Get occupation map for all objects
-    for i, obj in enumerate(_found_objects):
-        obja.StartWrite()
-        obj.WritePayload(obja)
-        dwoccupmap = obja.EndWrite()
-        dwoccupmap_dict[obj] = dwoccupmap
-        ut.ep_assert(
-            len(dwoccupmap) == (obj.GetDataSize() + 3) >> 2,
-            'Occupation map length & Object size mismatch for object'
-        )
-        lprint(" - Preprocessed %d / %d objects" % (i + 1, objn))
-
-    lprint(" - Preprocessed %d / %d objects" % (objn, objn), flush=True)
-
-    lprint(" - Allocating objects..", flush=True)
-    stackobjs.StackObjects(_found_objects, dwoccupmap_dict, _alloctable)
-
-    # Get payload length
-    _payload_size = max(map(
-        lambda obj: _alloctable[obj] + obj.GetDataSize(), _found_objects
-    ))
-
-    phase = None
-
-
-# -------
-
-
-def ConstructPayload():
-    global phase
-
-    phase = PHASE_WRITING
-    lprint("[Stage 3/3] ConstructPayload", flush=True)
-    objn = len(_found_objects)
-
-    pbuf = pbuffer.PayloadBuffer(_payload_size)
-
-    for i, obj in enumerate(_found_objects):
-        objaddr, objsize = _alloctable[obj], obj.GetDataSize()
-
-        pbuf.StartWrite(objaddr)
-        obj.WritePayload(pbuf)
-        written_bytes = pbuf.EndWrite()
-        ut.ep_assert(
-            written_bytes == objsize,
-            'obj.GetDataSize()(%d) != Real payload size(%d) for object %s'
-            % (objsize, written_bytes, obj)
-        )
-
-        lprint(" - Written %d / %d objects" % (i + 1, objn))
-
-    lprint(" - Written %d / %d objects" % (objn, objn), flush=True)
-    phase = None
-    return pbuf.CreatePayload()
-
-
-_on_create_payload_callbacks = []
-
-
-def RegisterCreatePayloadCallback(f):
-    _on_create_payload_callbacks.append(f)
-
-
-def CreatePayload(root):
-    # Call callbacks
-    for f in _on_create_payload_callbacks:
-        f()
-    CollectObjects(root)
-    AllocObjects()
-    return ConstructPayload()
-
-
-def GetObjectAddr(obj):
-    global _alloctable
-    global _found_objects
-    global _found_objects_set
-    global _untraversed_objects
-    global _dynamic_objects
-    global _dynamic_objects_set
-
-    if phase == PHASE_COLLECTING:
-        if obj not in _found_objects_set:
-            _untraversed_objects.append(obj)
-            if obj.DynamicConstructed():
-                _dynamic_objects.append(obj)
-                _dynamic_objects_set.add(obj)
-            _found_objects.append(obj)
-            _found_objects_set.add(obj)
-
-        return rlocint.RlocInt(0, 4)
-
-    elif phase == PHASE_ALLOCATING:
-        return rlocint.RlocInt(0, 4)
-
-    elif phase == PHASE_WRITING:
-        assert _alloctable[obj] & 3 == 0
-        return rlocint.RlocInt(_alloctable[obj], 4)
-
-


eudplib\core\allocator\__init__.py : 44 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .constexpr import (
-    ConstExpr,
-    Forward,
-    Evaluate,
-    IsConstExpr,
-)
-
-from .rlocint import (
-    RlocInt,
-    toRlocInt
-)
-
-from .payload import (
-    GetObjectAddr,
-    CreatePayload,
-    CompressPayload,
-    RegisterCreatePayloadCallback,
-)
-
-


eudplib\core\calcf\bitwise.py : 185 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import allocator as ac
-from .. import variable as ev
-from .. import eudfunc as ef
-from .. import rawtrigger as rt
-from .muldiv import f_mul
-
-
-def bw_gen(cond, docstring=None):
-    @ef.EUDFunc
-    def f_bitsize_template(a, b):
-        tmp = ev.EUDLightVariable()
-        ret = ev.EUDVariable()
-
-        ret << 0
-
-        for i in range(31, -1, -1):
-            rt.RawTrigger(
-                conditions=[
-                    a.AtLeast(2 ** i)
-                ],
-                actions=[
-                    tmp.AddNumber(1),
-                    a.SubtractNumber(2 ** i)
-                ]
-            )
-
-            rt.RawTrigger(
-                conditions=[
-                    b.AtLeast(2 ** i)
-                ],
-                actions=[
-                    tmp.AddNumber(1),
-                    b.SubtractNumber(2 ** i)
-                ]
-            )
-
-            rt.RawTrigger(
-                conditions=cond(tmp),
-                actions=ret.AddNumber(2 ** i)
-            )
-
-            tmp << 0
-
-        return ret
-
-    if docstring:
-        f_bitsize_template.__doc__ = docstring
-
-    return f_bitsize_template
-
-
-f_bitand = bw_gen(lambda x: x.Exactly(2), "Calculate a & b")
-f_bitor = bw_gen(lambda x: x.AtLeast(1), "Calculate a | b")
-f_bitxor = bw_gen(lambda x: x.Exactly(1), "Calculate a ^ b")
-f_bitnand = bw_gen(lambda x: x.Exactly(0), "Calculate ~(a & b)")
-f_bitnor = bw_gen(lambda x: x.AtMost(1), "Calculate ~(a | b)")
-
-
-def f_bitnxor(a, b):
-    """Calculate ~(a ^ b)"""
-    return f_bitnot(f_bitxor(a, b))
-
-
-def f_bitnot(a):
-    """Calculate ~a"""
-    return 0xFFFFFFFF - a
-
-
-# -------
-
-
-@ef.EUDFunc
-def f_bitsplit(a):
-    """Splits bit of given number
-
-    :returns: int bits[32];  // bits[i] = (ith bit from LSB of a is set)
-    """
-    bits = ev.EUDCreateVariables(32)
-    for i in range(31, -1, -1):
-        bits[i] << 0
-        rt.RawTrigger(
-            conditions=a.AtLeast(2 ** i),
-            actions=[
-                a.SubtractNumber(2 ** i),
-                bits[i].SetNumber(1)
-            ]
-        )
-    return bits
-
-
-# -------
-
-@ef.EUDFunc
-def _exp2_vv(n):
-    ret = ev.EUDVariable()
-    ret << 0
-    for i in range(32):
-        rt.RawTrigger(
-            conditions=[n == i],
-            actions=[ret.SetNumber((2 ** i))]
-        )
-    return ret
-
-
-def _exp2(n):
-    if isinstance(n, int):
-        return 1 << n
-        if n >= 32:
-            return 0
-        else:
-            return 1 << n
-
-    else:
-        return _exp2_vv(n)
-
-
-@ef.EUDFunc
-def _f_bitlshift(a, b):
-    loopstart = ac.Forward()
-    loopend = ac.Forward()
-    loopcnt = ac.Forward()
-
-    rt.RawTrigger(
-        actions=[
-            rt.SetNextPtr(a.GetVTable(), loopcnt),
-            a.QueueAddTo(a),
-        ]
-    )
-
-    loopstart << rt.RawTrigger(
-        nextptr=a.GetVTable(),
-        conditions=b.Exactly(0),
-        actions=rt.SetNextPtr(loopstart, loopend)
-    )
-    loopcnt << rt.RawTrigger(
-        nextptr=loopstart,
-        actions=b.SubtractNumber(1)
-    )
-    loopend << rt.RawTrigger(
-        actions=rt.SetNextPtr(loopstart, a.GetVTable())
-    )
-
-    return a
-
-
-def f_bitlshift(a, b):
-    """ Calculate a << b """
-    if isinstance(b, int):
-        return f_mul(a, _exp2(b))
-    else:
-        return _f_bitlshift(a, b)
-
-
-def f_bitrshift(a, b):
-    """ Calculate a >> b """
-    if isinstance(b, int) and b >= 32:
-        return 0
-
-    return a // _exp2(b)
-
-


eudplib\core\calcf\muldiv.py : 257 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import (
-    allocator as ac,
-    rawtrigger as rt,
-    variable as ev,
-    eudfunc as ef,
-)
-
-from eudplib import utils as ut
-
-
-def f_mul(a, b):
-    """Calculate a * b"""
-    if isinstance(a, ev.EUDVariable) and isinstance(b, ev.EUDVariable):
-        return _f_mul(a, b)
-
-    elif isinstance(a, ev.EUDVariable):
-        return f_constmul(b)(a)
-
-    elif isinstance(b, ev.EUDVariable):
-        return f_constmul(a)(b)
-
-    else:
-        ret = ev.EUDVariable()
-        ret << a * b
-        return ret
-
-
-def f_div(a, b):
-    """Calculate (a//b, a%b) """
-    if isinstance(b, ev.EUDVariable):
-        return _f_div(a, b)
-
-    elif isinstance(a, ev.EUDVariable):
-        return f_constdiv(b)(a)
-
-    else:
-        if b:
-            q, m = a // b, a % b
-        else:
-            q, m = 0xFFFFFFFF, a
-        vq, vm = ev.EUDCreateVariables(2)
-        ev.SeqCompute([
-            (vq, rt.SetTo, q),
-            (vm, rt.SetTo, m)
-        ])
-        return vq, vm
-
-
-# -------
-
-
-def f_constmul(number):
-    """
-    f_constnum(a)(b) calculates b * a.
-
-    :param number: Constant integer being multiplied to other numbers.
-    :return: Function taking one parameter.
-    """
-    if not hasattr(f_constmul, 'mulfdict'):
-        f_constmul.mulfdict = {}
-
-    mulfdict = f_constmul.mulfdict
-
-    try:
-        return mulfdict[number]
-    except KeyError:
-        @ef.EUDFunc
-        def _mulf(a):
-            ret = ev.EUDVariable()
-            ret << 0
-            for i in range(31, -1, -1):
-                rt.RawTrigger(
-                    conditions=a.AtLeast(2 ** i),
-                    actions=[
-                        a.SubtractNumber(2 ** i),
-                        ret.AddNumber(2 ** i * number)
-                    ]
-                )
-            return ret
-
-        mulfdict[number] = _mulf
-        return _mulf
-
-
-def f_constdiv(number):
-    """
-    f_constdiv(a)(b) calculates (b // a, b % a)
-
-    :param number: Constant integer to divide other numbers by.
-    :return: Function taking one parameter.
-    """
-    if not hasattr(f_constdiv, 'divfdict'):
-        f_constdiv.divfdict = {}
-
-    divfdict = f_constdiv.divfdict
-
-    try:
-        return divfdict[number]
-    except KeyError:
-        @ef.EUDFunc
-        def _divf(a):
-            ret = ev.EUDVariable()
-            ret << 0
-            for i in range(31, -1, -1):
-                # number too big
-                if 2 ** i * number >= 2 ** 32:
-                    continue
-
-                rt.RawTrigger(
-                    conditions=a.AtLeast(2 ** i * number),
-                    actions=[
-                        a.SubtractNumber(2 ** i * number),
-                        ret.AddNumber(2 ** i)
-                    ]
-                )
-            return ret, a
-
-        divfdict[number] = _divf
-        return _divf
-
-
-# -------
-
-
-@ef.EUDFunc
-def _f_mul(a, b):
-    ret, y0 = ev.EUDCreateVariables(2)
-
-    # Init
-    ev.SeqCompute([
-        (ret, rt.SetTo, 0),
-        (y0, rt.SetTo, b)
-    ])
-
-    chain = [ac.Forward() for _ in range(32)]
-    chain_y0 = [ac.Forward() for _ in range(32)]
-
-    # Calculate chain_y0
-    for i in range(32):
-        ev.SeqCompute((
-            (ut.EPD(chain_y0[i]), rt.SetTo, y0),
-            (y0, rt.Add, y0)
-        ))
-        if i <= 30:
-            p1, p2, p3 = ac.Forward(), ac.Forward(), ac.Forward()
-            p1 << rt.RawTrigger(
-                nextptr=p2,
-                conditions=a.AtMost(2 ** (i + 1) - 1),
-                actions=rt.SetNextPtr(p1, p3)
-            )
-            p3 << rt.RawTrigger(
-                nextptr=chain[i],
-                actions=rt.SetNextPtr(p1, p2)
-            )
-            p2 << rt.NextTrigger()
-
-    # Run multiplication chain
-    for i in range(31, -1, -1):
-        cy0 = ac.Forward()
-
-        chain[i] << rt.RawTrigger(
-            conditions=[
-                a.AtLeast(2 ** i)
-            ],
-            actions=[
-                a.SubtractNumber(2 ** i),
-                cy0 << ret.AddNumber(0)
-            ]
-        )
-
-        chain_y0[i] << cy0 + 20
-
-    return ret
-
-
-@ef.EUDFunc
-def _f_div(a, b):
-    ret, x = ev.EUDCreateVariables(2)
-
-    # Init
-    ev.SeqCompute([
-        (ret, rt.SetTo, 0),
-        (x, rt.SetTo, b),
-    ])
-
-    # Chain ac.Forward decl
-    chain_x0 = [ac.Forward() for _ in range(32)]
-    chain_x1 = [ac.Forward() for _ in range(32)]
-    chain = [ac.Forward() for _ in range(32)]
-
-    # Fill in chain
-    for i in range(32):
-        ev.SeqCompute([
-            (ut.EPD(chain_x0[i]), rt.SetTo, x),
-            (ut.EPD(chain_x1[i]), rt.SetTo, x),
-        ])
-
-        # Skip if over 0x80000000
-        p1, p2, p3 = ac.Forward(), ac.Forward(), ac.Forward()
-        p1 << rt.RawTrigger(
-            nextptr=p2,
-            conditions=x.AtLeast(0x80000000),
-            actions=rt.SetNextPtr(p1, p3)
-        )
-        p3 << rt.RawTrigger(
-            nextptr=chain[i],
-            actions=rt.SetNextPtr(p1, p2)
-        )
-        p2 << rt.NextTrigger()
-
-        ev.SeqCompute([
-            (x, rt.Add, x),
-        ])
-
-    # Run division chain
-    for i in range(31, -1, -1):
-        cx0, cx1 = ac.Forward(), ac.Forward()
-        chain[i] << rt.RawTrigger(
-            conditions=[
-                cx0 << a.AtLeast(0)
-            ],
-            actions=[
-                cx1 << a.SubtractNumber(0),
-                ret.AddNumber(2 ** i)
-            ]
-        )
-
-        chain_x0[i] << cx0 + 8
-        chain_x1[i] << cx1 + 20
-
-    return ret, a  # a : remainder
-
-


eudplib\core\calcf\_eudvsupport.py : 66 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .muldiv import f_mul, f_div
-from .bitwise import (
-    f_bitand,
-    f_bitor,
-    f_bitxor,
-    f_bitnot,
-)
-
-
-from ..variable import EUDVariable
-
-
-def DefClsMethod(name, f):
-    f.__name__ = 'EUDVariable.%s' % name
-    setattr(EUDVariable, name, f)
-
-
-def DefOperator(name, f):
-    DefClsMethod(name, f)
-
-    def iop(self, rhs):
-        self << f(self, rhs)
-        return self
-    DefClsMethod('__i%s' % name[2:], iop)
-
-    def rop(self, lhs):
-        return f(lhs, self)
-    DefClsMethod('__r%s' % name[2:], rop)
-
-
-DefOperator('__mul__', lambda x, y: f_mul(x, y))
-DefOperator('__floordiv__', lambda x, y: f_div(x, y)[0])
-DefOperator('__mod__', lambda x, y: f_div(x, y)[1])
-DefOperator('__and__', lambda x, y: f_bitand(x, y))
-DefOperator('__or__', lambda x, y: f_bitor(x, y))
-DefOperator('__xor__', lambda x, y: f_bitxor(x, y))
-DefClsMethod('__neg__', lambda x: 0 - x)
-DefClsMethod('__invert__', lambda x: f_bitnot(x))
-
-# Shift operator is reserved for assigning, so we won't overload them.
-
-


eudplib\core\calcf\__init__.py : 47 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .bitwise import (
-    f_bitand,
-    f_bitor,
-    f_bitxor,
-    f_bitnand,
-    f_bitnor,
-    f_bitnxor,
-    f_bitnot,
-    f_bitlshift,
-    f_bitrshift,
-    f_bitsplit,
-)
-
-from .muldiv import (
-    f_mul,
-    f_div,
-)
-
-# Just run _eudvsupport. This won't be visible in user side.
-from . import _eudvsupport
-
-


eudplib\core\eudfunc\eudf.py : 47 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import inspect
-import functools
-
-from .eudfuncn import EUDFuncN
-from ... import utils as ut
-
-
-def EUDFunc(fdecl_func):
-    argspec = inspect.getargspec(fdecl_func)
-    ut.ep_assert(
-        argspec[1] is None,
-        'No variadic arguments (*args) allowed for EUDFunc.'
-    )
-    ut.ep_assert(
-        argspec[2] is None,
-        'No variadic keyword arguments (*kwargs) allowed for EUDFunc.'
-    )
-
-    ret = EUDFuncN(fdecl_func, len(argspec[0]))
-    functools.update_wrapper(ret, fdecl_func)
-    return ret
-
-


eudplib\core\eudfunc\eudfmethod.py : 84 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import functools
-import inspect
-
-from ... import utils as ut
-from .. import variable as ev
-from . import eudf
-
-
-_mth_classtype = {}
-
-
-def EUDFuncMethod(method):
-    # Get argument number of fdecl_func
-    argspec = inspect.getargspec(method)
-    ut.ep_assert(
-        argspec[1] is None,
-        'No variadic arguments (*args) allowed for EUDFunc.'
-    )
-    ut.ep_assert(
-        argspec[2] is None,
-        'No variadic keyword arguments (*kwargs) allowed for EUDFunc.'
-    )
-
-    # Get number of arguments excluding self
-    argn = len(argspec[0]) - 1
-
-    constexpr_callmap = {}
-
-    # Generic caller
-    def genericCaller(self, *args):
-        selftype = _mth_classtype[method]
-        self = selftype(self)
-        return method(self, *args)
-
-    genericCaller = eudf.EUDFuncN(genericCaller, argn + 1, bodyfunc=method)
-
-    # Return function
-    def call(self, *args):
-        # Else use purely eudfun method
-        if ev.IsEUDVariable(self):
-            selftype = type(self)
-            if method not in _mth_classtype:
-                _mth_classtype[method] = selftype
-            return genericCaller(self, *args)
-
-        # Const expression. Can use optimizations
-        else:
-            if self not in constexpr_callmap:
-                def caller(*args):
-                    return method(self, *args)
-
-                constexpr_callmap[self] = eudf.EUDFuncN(
-                    caller, argn, bodyfunc=method)
-
-            return constexpr_callmap[self](*args)
-
-    functools.update_wrapper(call, method)
-    return call
-
-


eudplib\core\eudfunc\eudfptr.py : 192 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import rawtrigger as rt
-from .. import allocator as ac
-from ... import utils as ut
-
-from .eudfuncn import EUDFuncN
-from ..variable import (
-    VProc,
-    EUDVariable,
-    SetVariables,
-)
-from ..eudstruct import EUDStruct
-
-
-#
-# Common argument / returns storage
-#
-
-def getArgStorage(argn, _argstorage_dict={}):
-    """ Get common arguments storage for argn """
-    if argn not in _argstorage_dict:
-        _argstorage_dict[argn] = [EUDVariable() for _ in range(argn)]
-    return _argstorage_dict[argn]
-
-
-def getRetStorage(retn, _retstorage_dict={}):
-    """ Get common returns storage for retn """
-    if retn not in _retstorage_dict:
-        _retstorage_dict[retn] = [EUDVariable() for _ in range(retn)]
-    return _retstorage_dict[retn]
-
-
-def fillArguments(f):
-    """ Copy values from common argument storage to f._args """
-    if f._argn:
-        argStorage = getArgStorage(f._argn)
-        for farg, arg in zip(f._fargs, argStorage):
-            VProc(arg, arg.QueueAssignTo(farg))
-
-
-def fillReturns(f):
-    """ Copy values from f_rets to common returns storage """
-    if f._retn:
-        retStorage = getRetStorage(f._retn)
-        for fret, ret in zip(f._frets, retStorage):
-            VProc(fret, fret.QueueAssignTo(ret))
-
-
-def callFuncBody(fstart, fend):
-    """ Call function's body triggers """
-    fcallend = ac.Forward()
-
-    rt.RawTrigger(
-        nextptr=fstart,
-        actions=[rt.SetNextPtr(fend, fcallend)]
-    )
-
-    fcallend << rt.NextTrigger()
-
-
-def createIndirectCaller(f, _caller_dict={}):
-    """ Create function caller using common argument/return storage """
-
-    # Cache function in _caller_dict. If uncached,
-    if f not in _caller_dict:
-        rt.PushTriggerScope()
-        caller_start = rt.NextTrigger()
-        fillArguments(f)
-        callFuncBody(f._fstart, f._fend)
-        fillReturns(f)
-        caller_end = rt.RawTrigger()
-        rt.PopTriggerScope()
-
-        _caller_dict[f] = (caller_start, caller_end)
-
-    return _caller_dict[f]
-
-
-# ---------------------------------
-
-
-def EUDFuncPtr(argn, retn):
-    class PtrDataClass(EUDStruct):
-        _fields_ = [
-            '_fstart',
-            '_fendnext_epd'
-        ]
-
-        def __init__(self, f_init=None):
-            """ Constructor with function prototype
-
-            :param argn: Number of arguments function can accepy
-            :param retn: Number of variables function will return.
-            :param f_init: First function
-            """
-
-            if f_init:
-                if isinstance(f_init, EUDFuncN):
-                    self.checkValidFunction(f_init)
-                    f_idcstart, f_idcend = createIndirectCaller(f_init)
-                    super().__init__([
-                        f_idcstart,  # fstart
-                        ut.EPD(f_idcend + 4)  # fendnext_epd
-                    ])
-                else:
-                    super().__init__(f_init)
-
-            else:
-                super().__init__()
-
-        def checkValidFunction(self, f):
-            ut.ep_assert(isinstance(f, EUDFuncN))
-            if not f._fstart:
-                f._CreateFuncBody()
-
-            f_argn = f._argn
-            f_retn = f._retn
-            ut.ep_assert(argn == f_argn, "Function with different prototype")
-            ut.ep_assert(retn == f_retn, "Function with different prototype")
-
-        def setFunc(self, f):
-            """ Set function pointer's target to function
-
-            :param f: Target function
-            """
-            self.checkValidFunction(f)
-
-            # Build actions
-            f_idcstart, f_idcend = createIndirectCaller(f)
-            self._fstart = f_idcstart
-            self._fendnext_epd = ut.EPD(f_idcend + 4)
-
-        def __lshift__(self, rhs):
-            self.setFunc(rhs)
-
-        def __call__(self, *args):
-            """ Call target function with given arguments """
-
-            rt.RawTrigger(actions=rt.SetDeaths(2, rt.SetTo, 5, 0))
-
-            if argn:
-                argStorage = getArgStorage(argn)
-                SetVariables(argStorage, args)
-
-            # Call function
-            t, a = ac.Forward(), ac.Forward()
-            SetVariables(
-                [ut.EPD(t + 4), ut.EPD(a + 16)],
-                [self._fstart, self._fendnext_epd]
-            )
-
-            fcallend = ac.Forward()
-            t << rt.RawTrigger(
-                actions=[
-                    a << rt.SetNextPtr(0, fcallend),
-                    rt.SetDeaths(2, rt.SetTo, 4, 0),
-                ]
-            )
-            fcallend << rt.NextTrigger()
-
-            if retn:
-                tmpRets = [EUDVariable() for _ in range(retn)]
-                retStorage = getRetStorage(retn)
-                SetVariables(tmpRets, retStorage)
-                return ut.List2Assignable(tmpRets)
-
-    return PtrDataClass
-
-


eudplib\core\eudfunc\eudfuncn.py : 184 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import functools
-import inspect
-
-from ... import utils as ut
-
-from .. import allocator as ac
-from .. import rawtrigger as bt
-from .. import variable as ev
-
-from ...utils.blockstru import (
-    BlockStruManager,
-    SetCurrentBlockStruManager
-)
-
-
-_currentCompiledFunc = None
-_currentTriggerCount = 0
-
-
-def _updateFuncTriggerCount():
-    global _currentTriggerCount
-    currentCounter = bt.GetTriggerCounter()
-    addedTriggerCount = currentCounter - _currentTriggerCount
-
-    if _currentCompiledFunc:
-        _currentCompiledFunc._triggerCount += addedTriggerCount
-    _currentTriggerCount = currentCounter
-
-
-def _setCurrentCompiledFunc(func):
-    global _currentCompiledFunc
-
-    lastCompiledFunc = _currentCompiledFunc
-    _updateFuncTriggerCount()
-    _currentCompiledFunc = func
-    return lastCompiledFunc
-
-
-class EUDFuncN:
-    def __init__(self, fdecl_func, argn, *, bodyfunc=None):
-        """ EUDFuncN
-
-        :param fdecl_func: Function to be wrapped.
-        :param argn: Count of arguments got by fdecl_func
-        :param bodyfunc: Function which implements real logic This
-            may be different from fdecl_func if fdecl_func is a wrapper
-            around bodyfunc. For instance, in EUDFuncMethod.
-        """
-
-        if bodyfunc is None:
-            bodyfunc = fdecl_func
-
-        self._argn = argn
-        self._retn = None
-        self._fdecl_func = fdecl_func
-        self._bodyfunc = bodyfunc
-        self._fstart = None
-        self._fend = None
-        self._fargs = None
-        self._frets = None
-        self._triggerCount = None
-
-    def size(self):
-        if not self._fstart:
-            self._CreateFuncBody()
-
-        return self._triggerCount
-
-    def _CreateFuncBody(self):
-        self._triggerCount = 0
-        lastCompiledFunc = _setCurrentCompiledFunc(self)
-
-        # Add return point
-        self._fend = ac.Forward()
-
-        # Prevent double compilication
-        ut.ep_assert(self._fstart is None)
-
-        # Initalize new namespace
-        f_bsm = BlockStruManager()
-        prev_bsm = SetCurrentBlockStruManager(f_bsm)
-        bt.PushTriggerScope()
-
-        f_args = [ev.EUDVariable() for _ in range(self._argn)]
-        self._fargs = f_args
-
-        fstart = bt.NextTrigger()
-        self._fstart = fstart
-
-        final_rets = self._fdecl_func(*f_args)
-        if final_rets is not None:
-            self._AddReturn(ut.Assignable2List(final_rets), False)
-        fend = bt.RawTrigger()
-        bt.PopTriggerScope()
-
-        # Finalize
-        ut.ep_assert(f_bsm.empty(), 'Block start/end mismatch inside function')
-        SetCurrentBlockStruManager(prev_bsm)
-
-        self._fend << fend
-        # No return -> set return count to 0
-        if self._retn is None:
-            self._retn = 0
-        _setCurrentCompiledFunc(lastCompiledFunc)
-
-    def _AddReturn(self, retv, needjump):
-        if self._frets is None:
-            self._frets = [ev.EUDVariable() for _ in range(len(retv))]
-            self._retn = len(retv)
-
-        ut.ep_assert(
-            len(retv) == len(self._frets),
-            "Numbers of returned value should be constant."
-            " (From function %s)" % self._fdecl_func.__name__
-        )
-
-        ev.SetVariables(self._frets, retv)
-
-        if needjump:
-            bt.RawTrigger(nextptr=self._fend)
-
-    def __call__(self, *args):
-        if self._fstart is None:
-            self._CreateFuncBody()
-
-        ut.ep_assert(len(args) == self._argn, 'Argument number mismatch')
-
-        # Assign arguments into argument space
-        print('args', args)
-        ev.SeqCompute(
-            [(farg, bt.SetTo, arg) for farg, arg in zip(self._fargs, args)]
-        )
-
-        # Call body
-        fcallend = ac.Forward()
-
-        bt.RawTrigger(
-            nextptr=self._fstart,
-            actions=[bt.SetNextPtr(self._fend, fcallend)]
-        )
-
-        fcallend << bt.NextTrigger()
-
-        if self._frets is not None:
-            retn = len(self._frets)
-            tmp_rets = [ev.EUDVariable() for _ in range(retn)]
-            ev.SetVariables(tmp_rets, self._frets)
-            return ut.List2Assignable(tmp_rets)
-
-
-def EUDReturn(*args):
-    callerName = inspect.stack()[1][3]
-    currentFuncName = _currentCompiledFunc.__name__
-    if callerName != currentFuncName:
-        print('[Warning] EUDReturn may have been called from a '
-              'different function (%s) than compiled function(%s)' %
-              (callerName, currentFuncName))
-    _currentCompiledFunc._AddReturn(args, True)
-
-


eudplib\core\eudfunc\eudtypedf.py : 48 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
import functools
-import inspect
-
-from ... import utils as ut
-from .. import variable as ev
-
-from .eudfuncn import EUDFuncN
-
-
-def EUDTypedFunc(argtypes, rettypes=None):
-    def applyTypes(typesdecl, varlist):
-        print(typesdecl, varlist)
-        if typesdecl is None:
-            return varlist
-
-        ut.ep_assert(len(varlist) == len(typesdecl))
-
-        rets = []
-        for vartype, var in zip(typesdecl, varlist):
-            if vartype == ev.EUDVariable or vartype is None:
-                rets.append(var)
-            else:
-                rets.append(vartype(var))
-
-        return rets
-
-    def _EUDTypedFunc(fdecl_func):
-        argspec = inspect.getargspec(fdecl_func)
-        ut.ep_assert(
-            argspec[1] is None,
-            'No variadic arguments (*args) allowed for EUDFunc.'
-        )
-        ut.ep_assert(
-            argspec[2] is None,
-            'No variadic keyword arguments (*kwargs) allowed for EUDFunc.'
-        )
-
-        def caller(self, *args):
-            args = applyTypes(argtypes, args)
-            rets = applyTypes(rettypes, self.callfunc(args))
-            return rets
-
-        ret = EUDFuncN(caller, len(argspec[0]), bodyfunc=fdecl_func)
-        functools.update_wrapper(ret, fdecl_func)
-        return ret
-
-    return _EUDTypedFunc
-
-


eudplib\core\eudfunc\__init__.py : 31 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eudf import EUDFunc
-from .eudfptr import EUDFuncPtr
-from .eudfmethod import EUDFuncMethod
-from .eudfuncn import EUDFuncN, EUDReturn
-from .eudtypedf import EUDTypedFunc
-
-


eudplib\core\eudobj\bytedump.py : 42 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eudobj import EUDObject
-
-
-class Db(EUDObject):
-
-    """Class for raw data object"""
-
-    def __init__(self, b):
-        super().__init__()
-        self.content = bytes(b)
-
-    def GetDataSize(self):
-        return len(self.content)
-
-    def WritePayload(self, pbuffer):
-        pbuffer.WriteBytes(self.content)
-
-


eudplib\core\eudobj\eudobj.py : 81 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..allocator import ConstExpr
-from ..allocator.payload import GetObjectAddr
-from eudplib import utils as ut
-
-
-class EUDObject(ConstExpr):
-
-    """
-    Class for standalone object on memory
-
-    .. note::
-        Object collection occures in three steps:
-
-        - Collection phase : collects object used in map generation. Object
-        used in WritePayload method are being collected. Methods Evaluate
-        and WritePayload are called during this phase.
-        - Allocation phase : Object have their offset assigned. GetDataSize
-        method is called on this phase, so if GetDataSize is being called,
-        it means that every object required in map has been collected.
-        WritePayload and GetDataSize method should behave exactly the same as
-        it should on Writing phase here.
-        - Writing phase : Object is written into payload.
-    """
-
-    def __init__(self):
-        super().__init__(self)
-
-    def DynamicConstructed(self):
-        """ Whether function is constructed dynamically.
-
-        Dynamically constructed EUDObject may have their dependency list
-        generated during object construction. So their dependency list is
-        re-examined before allocation phase.
-        """
-        return False
-
-    def Evaluate(self):
-        """
-        What this object should be evaluated to when used in eudplib program.
-
-        :return: Default) Memory address of this object.
-
-        .. note::
-            In overriding this method, you can use
-            :func:`eudplib.GetObjectAddr`.
-        """
-        return GetObjectAddr(self)
-
-    def GetDataSize(self):
-        """Memory size of object."""
-        raise ut.EPError('Override')
-
-    def WritePayload(self, pbuffer):
-        """Write object"""
-        raise ut.EPError('Override')
-
-


eudplib\core\eudobj\__init__.py : 28 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eudobj import EUDObject
-from .bytedump import Db
-
-


eudplib\core\eudstruct\eudstruct.py : 110 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import utils as ut
-
-from .vararray import EUDVArray
-from .structarr import _EUDStruct_Metaclass
-
-class EUDStruct(ut.ExprProxy, metaclass=_EUDStruct_Metaclass):
-    def __init__(self, initvar=None):
-        basetype = type(self)
-        fields = basetype._fields_
-        fieldn = len(fields)
-
-        # Fill fielddict
-        fielddict = {}
-        for index, nametype in enumerate(fields):
-            if isinstance(nametype, str):
-                fielddict[nametype] = (index, None)
-            else:
-                fielddict[nametype[0]] = (index, nametype[1])
-        self._fielddict = fielddict
-
-        # With initialization
-        if initvar is None:
-            initvals = []
-            for nametype in fields:
-                if isinstance(nametype, str):
-                    initvals.append(0)
-                else:
-                    _, attrtype = nametype
-                    initvals.append(attrtype())
-
-            super().__init__(EUDVArray(fieldn)(initvals))
-
-        else:
-            super().__init__(EUDVArray(fieldn)(initvar))
-
-        self._initialized = True
-
-    def clone(self):
-        """ Create struct clone """
-        basetype = type(self)
-        inst = basetype()
-        self.deepcopy(inst)
-        return inst
-
-    def setall(self, values):
-        self.fill(values, assert_expected_values_len=len(self._fielddict))
-
-    def deepcopy(self, inst):
-        """ Copy struct to other instance """
-        basetype = type(self)
-        fields = basetype._fields_
-        for i, nametype in enumerate(fields):
-            if isinstance(nametype, str):
-                inst.set(i, self.get(i))
-            else:
-                _, attrtype = nametype
-                attrtype(self.get(i)).deepcopy(attrtype(inst.get(i)))
-
-    def getfield(self, name):
-        attrid, attrtype = self._fielddict[name]
-        attr = self.get(attrid)
-        if attrtype:
-            return attrtype(attr)
-        else:
-            return attr
-
-    def setfield(self, name, value):
-        attrid, _ = self._fielddict[name]
-        self.set(attrid, value)
-
-    def __getattr__(self, name):
-        try:
-            return super().__getattr__(name)
-        except AttributeError:
-            return self.getfield(name)
-
-    def __setattr__(self, name, value):
-        if '_initialized' in self.__dict__:
-            try:
-                self.setfield(name, value)
-            except KeyError:
-                self.__dict__[name] = value
-        else:
-            self.__dict__[name] = value
-
-


eudplib\core\eudstruct\structarr.py : 71 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .vararray import EUDVArray
-from ...utils import ExprProxy
-
-
-class _EUDStruct_Metaclass(type):
-    def __mul__(self, times):
-        basetype = self
-
-        class EUDStructArray(ExprProxy):
-            __metaclass__ = _EUDStruct_Metaclass
-
-            def __init__(self, initvar=None):
-                if initvar is None:
-                    initvals = [basetype() for _ in range(times)]
-                    super().__init__(EUDVArray(times, basetype)(initvals))
-                else:
-                    super().__init__(EUDVArray(times, basetype)(initvar))
-
-                self._initialized = True
-
-            def clone(self):
-                """ Create struct clone """
-                arraytype = type(self)
-                inst = arraytype()
-                self.deepcopy(inst)
-                return inst
-
-            def deepcopy(self, inst):
-                """ Copy struct to other instance """
-                for i in range(times):
-                    self[i].deepcopy(inst[i])
-
-            def __getitem__(self, index):
-                return self.getValue()[index]
-
-            def __setitem__(self, index, newval):
-                self.getValue()[index] = newval
-
-            def __getattr__(self, name):
-                return super().__getattr__(name)
-
-            def __setattr__(self, name, value):
-                self.__dict__[name] = value
-
-        return EUDStructArray
-
-


eudplib\core\eudstruct\vararray.py : 168 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import weakref
-import collections
-
-from .. import rawtrigger as bt
-from ..allocator import (
-    Evaluate,
-    Forward,
-    ConstExpr,
-    IsConstExpr,
-)
-
-from ...utils import (
-    EPD,
-    ExprProxy,
-    ep_assert,
-    unProxy,
-    cachedfunc
-)
-
-from ..variable import EUDVariable, SeqCompute
-from ..variable.vbuf import GetCurrentVariableBuffer
-
-
-@cachedfunc
-def EUDVArrayData(size):
-    ep_assert(isinstance(size, int))
-
-    class _EUDVArrayData(ConstExpr):
-        def __init__(self, initvars):
-            super().__init__(self)
-            ep_assert(len(initvars) == size, "%d items expected" % size)
-            self._initvars = initvars
-            self._vdict = weakref.WeakKeyDictionary()
-
-        def Evaluate(self):
-            evb = GetCurrentVariableBuffer()
-            if evb not in self._vdict:
-                variables = [
-                    evb.CreateVarTrigger(ival) for ival in self._initvars]
-                self._vdict[evb] = variables[0]
-
-            return Evaluate(self._vdict[evb])
-
-    return _EUDVArrayData
-
-
-@cachedfunc
-def EUDVArray(size, basetype=None):
-    ep_assert(isinstance(size, int))
-
-    class _EUDVArray(ExprProxy):
-        def __init__(self, initvars=None):
-            # Int -> interpret as sequence of 0s
-            if isinstance(initvars, int):
-                initvars = [0] * size
-
-            # For python iterables
-            if isinstance(initvars, collections.Iterable):
-                baseobj = EUDVArrayData(size)(initvars)
-
-            # Initialization by constant reference
-            elif IsConstExpr(initvars):
-                initvars = unProxy(initvars)
-                ep_assert(isinstance(initvars, EUDVArrayData(size)))
-                baseobj = initvars
-
-            # Initialization by variable reference
-            else:
-                baseobj = EUDVariable()
-                baseobj << initvars
-
-            super().__init__(baseobj)
-            self._epd = EPD(self)
-            self._basetype = basetype
-
-        def getItemPtr(self, i):
-            return self + 60 * i
-
-        def getItemEPD(self, i):
-            return self._epd + 15 * i
-
-        def get(self, i):
-            # This function is hand-optimized
-
-            r = EUDVariable()
-            itemptr = self.getItemPtr(i)
-            itemepd = self.getItemEPD(i)
-
-            vtproc = Forward()
-            nptr = Forward()
-            a0, a1, a2 = Forward(), Forward(), Forward()
-
-            SeqCompute([
-                (EPD(vtproc + 4), bt.SetTo, itemptr),
-                (EPD(a0 + 16), bt.SetTo, itemepd + (8 + 320 + 16) // 4),
-                (EPD(a1 + 16), bt.SetTo, itemepd + (8 + 320 + 24) // 4),
-                (EPD(a2 + 16), bt.SetTo, itemepd + 1),
-            ])
-
-            vtproc << bt.RawTrigger(
-                nextptr=0,
-                actions=[
-                    a0 << bt.SetDeaths(0, bt.SetTo, EPD(r.getValueAddr()), 0),
-                    a1 << bt.SetDeaths(0, bt.SetTo, 0x072D0000, 0),
-                    a2 << bt.SetDeaths(0, bt.SetTo, nptr, 0),
-                ]
-            )
-
-            nptr << bt.NextTrigger()
-            if self._basetype:
-                r = self._basetype(r)
-            return r
-
-        def set(self, i, value):
-            itemepd = self.getItemEPD(i)
-            a0, t = Forward(), Forward()
-            SeqCompute([
-                (EPD(a0 + 16), bt.SetTo, itemepd + (8 + 320 + 20) // 4),
-                (EPD(a0 + 20), bt.SetTo, value),
-            ])
-            t << bt.RawTrigger(
-                actions=[
-                    a0 << bt.SetDeaths(0, bt.SetTo, 0, 0),
-                ]
-            )
-
-        def fill(self, values, *, assert_expected_values_len=None):
-            if assert_expected_values_len:
-                ep_assert(len(values) == assert_expected_values_len)
-
-            SeqCompute([
-                (EPD(self + 344 + i * 60), bt.SetTo, value)
-                for i, value in enumerate(values)
-            ])
-
-        def __getitem__(self, i):
-            return self.get(i)
-
-        def __setitem__(self, i, value):
-            return self.set(i, value)
-
-    return _EUDVArray
-
-


eudplib\core\eudstruct\__init__.py : 28 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .vararray import EUDVArray
-from .eudstruct import EUDStruct
-
-


eudplib\core\mapdata\chktok.py : 155 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-'''
-scenario.chk section tokenizer. Internally used in eudplib.
-'''
-
-from eudplib import utils as ut
-
-"""
-General CHK class.
-"""
-
-
-def sectionname_format(sn):
-    if type(sn) is str:
-        sn = ut.u2b(sn)
-
-    if len(sn) < 4:
-        sn += b' ' * (4 - len(sn))
-
-    elif len(sn) > 4:
-        raise ut.EPError('Length of section name cannot be longer than 4')
-
-    return sn
-
-
-class CHK:
-    def __init__(self):
-        self.sections = {}
-
-    def loadblank(self):
-        self.sections = {}
-
-    def loadchk(self, b):
-        # this code won't handle protection methods properly such as...
-        # - duplicate section name
-        # - jump section protection
-        #
-        # this program although handles
-        #  - invalid section length (too high)
-        #  - unused sections
-
-        t = self.sections  # temporarilly store
-        self.sections = {}
-
-        index = 0
-        while index < len(b):
-            # read data
-            sectionname = b[index: index + 4]
-            sectionlength = ut.b2i4(b, index + 4)
-
-            if sectionlength < 0:
-                # jsp with negative section size.
-                self.sections = t
-                return False
-
-            section = b[index + 8: index + 8 + sectionlength]
-            index += sectionlength + 8
-
-            self.sections[sectionname] = section
-
-        return True
-
-    def savechk(self):
-        # calculate output size
-        blist = []
-        for name, binary in self.sections.items():
-            blist.append(name + ut.i2b4(len(binary)) + binary)
-
-        return b''.join(blist)
-
-    def enumsection(self):
-        return list(self.sections.keys())
-
-    def getsection(self, sectionname):
-        sectionname = sectionname_format(sectionname)
-        return self.sections[sectionname]  # Nameerror may be raised.
-
-    def setsection(self, sectionname, b):
-        sectionname = sectionname_format(sectionname)
-        self.sections[sectionname] = bytes(b)
-
-    def delsection(self, sectionname):
-        sectionname = sectionname_format(sectionname)
-        del self.sections[sectionname]
-
-    def optimize(self):
-
-        # Delete unused sections
-        used_section = [
-            b'VER ', b'VCOD', b'OWNR', b'ERA ', b'DIM ', b'SIDE', b'MTXM',
-            b'UNIT', b'THG2', b'MASK', b'STR ', b'UPRP', b'MRGN', b'TRIG',
-            b'MBRF', b'SPRP', b'FORC', b'COLR', b'PUNI', b'PUPx', b'PTEx',
-            b'UNIx', b'UPGx', b'TECx',
-        ]
-
-        unused_section = [
-            sn for sn in self.sections.keys() if sn not in used_section]
-        for sn in unused_section:
-            del self.sections[sn]
-
-        # Terrain optimization
-        dim = self.getsection(b'DIM ')
-        mapw = ut.b2i2(dim, 0)
-        maph = ut.b2i2(dim, 2)
-        terrainsize = mapw * maph
-
-        # MASK optimization : cancel 0xFFs.
-        mask = self.getsection(b'MASK')
-        clippos = 0
-        for i in range(terrainsize - 1, -1, -1):
-            if mask[i] != 0xff:
-                clippos = i + 1
-                break
-
-        mask = mask[:clippos]
-        self.setsection(b'MASK', mask)
-
-        # MTXM optimization
-        # MASK optimization : cancel 0xFFs.
-        mtxm = self.getsection(b'MTXM')
-        clippos = 0
-        for i in range(terrainsize - 1, -1, -1):
-            if mtxm[2 * i] != 0x00 or mtxm[2 * i + 1] != 0x00:
-                clippos = i + 1
-                break
-
-        mtxm = mtxm[:2 * clippos]
-        self.setsection(b'MTXM', mtxm)
-
-        # More optimization would be possible, but I don't care.
-
-


eudplib\core\mapdata\mapdata.py : 61 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .stringmap import InitStringMap, ApplyStringMap
-from .proptable import InitPropertyMap, ApplyPropertyMap
-from .playerinfo import InitPlayerInfo
-
-_inited = False
-_chkt = None
-_rawfile = None
-
-
-def InitMapData(chkt, rawfile):
-    global _inited, _chkt, _rawfile
-    _chkt = chkt
-    _rawfile = rawfile
-
-    InitStringMap(chkt)
-    InitPropertyMap(chkt)
-    InitPlayerInfo(chkt)
-    _inited = True
-
-
-def UpdateMapData():
-    ApplyStringMap(_chkt)
-    ApplyPropertyMap(_chkt)
-
-
-def IsMapdataInitalized():
-    return _inited
-
-
-def GetChkTokenized():
-    return _chkt
-
-
-def GetRawFile():
-    return _rawfile
-
-


eudplib\core\mapdata\mpqapi.py : 302 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-'''
-SFmpq.dll wrapper. Used internally inside eudplib.
-'''
-
-from ctypes import *  # @UnusedWildImport
-import struct
-import os
-import sys
-
-from eudplib import utils as ut
-
-
-"""
-find where sfmpq.dll is.
-"""
-
-# These can be an argument to for MpqWrite.PutWave
-WAVCOMP_NOCOMPRESSION = 0
-WAVCOMP_HIGHQUALITY = 1
-WAVCOMP_MIDQUALITY = 2
-WAVCOMP_LOWQUALITY = 3
-
-SFmpq = None
-
-
-def find_data_file(filename):
-    if getattr(sys, 'frozen', False):
-        # The application is frozen
-        datadir = os.path.dirname(sys.executable)
-    else:
-        # The application is not frozen
-        # Change this bit to match where you store your data files:
-        datadir = os.path.dirname(__file__)
-
-    return os.path.join(datadir, filename)
-
-
-currentdir = os.path.dirname(__file__)
-
-
-def InitMpqLibrary():
-    global SFmpq
-
-    try:
-        if struct.calcsize("P") == 4:  # 32bit
-            SFmpq = WinDLL(find_data_file('SFmpq32.dll'))
-        else:
-            SFmpq = WinDLL(find_data_file('SFmpq64.dll'))
-
-        # for MpqRead
-        SFmpq.SFileOpenArchive.restype = c_int
-        SFmpq.SFileCloseArchive.restype = c_int
-        SFmpq.SFileOpenFileEx.restype = c_int
-        SFmpq.SFileGetFileSize.restype = c_int
-        SFmpq.SFileReadFile.restype = c_int
-        SFmpq.SFileCloseFile.restype = c_int
-
-        SFmpq.SFileOpenArchive.argtypes = [c_char_p, c_int, c_int, c_void_p]
-        SFmpq.SFileCloseArchive.argtypes = [c_void_p]
-        SFmpq.SFileOpenFileEx.argtypes = [c_int, c_char_p, c_int, c_void_p]
-        SFmpq.SFileGetFileSize.argtypes = [c_int, c_void_p]
-        SFmpq.SFileReadFile.argtypes = [
-            c_int, c_char_p, c_int, c_void_p, c_int]
-        SFmpq.SFileCloseFile.argtypes = [c_int]
-
-        # for MpqWrite
-        SFmpq.MpqOpenArchiveForUpdate.restype = c_int
-        SFmpq.MpqAddFileFromBuffer.restype = c_int
-        SFmpq.MpqAddWaveFromBuffer.restype = c_int
-        SFmpq.MpqRenameFile.restype = c_int
-        SFmpq.MpqDeleteFile.restype = c_int
-        SFmpq.MpqCloseUpdatedArchive.restype = c_int
-        SFmpq.MpqCompactArchive.restype = c_int
-
-        SFmpq.MpqOpenArchiveForUpdate.argtypes = [c_char_p, c_int, c_int]
-        SFmpq.MpqAddFileFromBuffer.argtypes = [
-            c_int, c_void_p, c_int, c_char_p, c_int, c_int, c_int]
-        SFmpq.MpqAddWaveFromBuffer.argtypes = [
-            c_int, c_void_p, c_int, c_char_p, c_int, c_int]
-        SFmpq.MpqRenameFile.argtypes = [c_int, c_char_p, c_char_p]
-        SFmpq.MpqDeleteFile.argtypes = [c_int, c_char_p]
-        SFmpq.MpqCloseUpdatedArchive.argtypes = [c_int, c_int]
-        SFmpq.MpqCompactArchive.argtypes = [c_int]
-
-        return True
-
-    except OSError:
-        print('Loading SFmpq failed.')
-        SFmpq = None
-        return False
-
-
-class MpqRead:
-
-    def __init__(self):
-        self.mpqh = None
-        self.SFmpq = SFmpq  # SFmpq are global variable. We cannot rely on it
-
-    def __del__(self):
-        self.Close()
-
-    def Open(self, fname):
-        if self.mpqh is not None:
-            raise ut.EPError("double open")
-
-        h = c_int()
-        ret = self.SFmpq.SFileOpenArchive(ut.u2b(fname), 0, 0, byref(h))
-        if not ret:
-            self.mpqh = None
-            return False
-
-        self.mpqh = h.value
-        return True
-
-    def Close(self):
-        if self.mpqh is None:
-            return None
-
-        self.SFmpq.SFileCloseArchive(self.mpqh)
-        self.mpqh = None
-        return True
-
-    def EnumFiles(self):
-        # using listfile.
-        lst = self.Extract('(listfile)')
-        if lst is None:
-            return []
-
-        return ut.b2u(lst).replace('\r', '').split('\n')
-
-    def Extract(self, fname):
-        if self.mpqh is None:
-            return None
-
-        # Open file
-        fileh = c_int()
-        ret = self.SFmpq.SFileOpenFileEx(
-            self.mpqh, ut.u2b(fname), 0, byref(fileh))
-        if not ret:
-            return None
-        fileh = fileh.value
-
-        # Get file size & allocate buffer
-        # Note : this version only supports 32bit mpq file
-        fsize = self.SFmpq.SFileGetFileSize(fileh, 0)
-        f = create_string_buffer(fsize)
-        readleft = fsize
-        read = 0
-
-        # read data
-        while readleft > 0:
-            buffer = create_string_buffer(readleft)
-            readbyte = c_int()
-            ret = self.SFmpq.SFileReadFile(
-                fileh, buffer, readleft, byref(readbyte), 0)
-            ut.ep_assert(readbyte.value <= readleft)
-            if not ret or readbyte.value == 0:  # read failed
-                self.SFmpq.SFileCloseFile(fileh)
-                return None
-
-            f[read:read + readbyte.value] = buffer[0:readbyte.value]
-            readleft -= readbyte.value
-            read += readbyte.value
-
-        self.SFmpq.SFileCloseFile(fileh)
-        return f.raw
-
-
-# flags internally used by MpqWrite
-MOAU_OPEN_ALWAYS = 0x20
-MOAU_CREATE_ALWAYS = 0x08
-MOAU_MAINTAIN_LISTFILE = 0x01
-
-MAFA_MODCRYPTKEY = 0x00020000
-MAFA_ENCRYPT = 0x00010000
-MAFA_COMPRESS = 0x00000200
-MAFA_REPLACE_EXISTING = 0x00000001
-MAFA_COMPRESS_STANDARD = 0x08
-
-# NEVER USE THESE FOR MpqWrite.PutWave!!!!!!
-MAWA_QUALITY_HIGH = 1
-MAWA_QUALITY_MEDIUM = 0
-MAWA_QUALITY_LOW = 2
-WaveCmpDict = {
-    WAVCOMP_NOCOMPRESSION: -1,
-    WAVCOMP_HIGHQUALITY: MAWA_QUALITY_HIGH,
-    WAVCOMP_MIDQUALITY: MAWA_QUALITY_MEDIUM,
-    WAVCOMP_LOWQUALITY: MAWA_QUALITY_LOW
-}
-# NEVER USE THESE FOR MpqWrite.PutWave!!!!!!
-
-
-class MpqWrite:
-
-    def __init__(self):
-        self.mpqh = None
-
-    def __del__(self):
-        self.Close()
-
-    def Open(self, fname, preserve_content=True):
-        if self.mpqh:
-            raise ut.EPError("double open")
-
-        if preserve_content:
-            flag = MOAU_OPEN_ALWAYS | MOAU_MAINTAIN_LISTFILE
-        else:
-            flag = MOAU_CREATE_ALWAYS | MOAU_MAINTAIN_LISTFILE
-
-        ret = SFmpq.MpqOpenArchiveForUpdate(ut.u2b(fname), flag, 1024)
-        if not ret:
-            return False
-
-        self.mpqh = ret
-        return True
-
-    def Close(self):
-        if not self.mpqh:
-            return None
-
-        # Close archive
-        ret = SFmpq.MpqCloseUpdatedArchive(self.mpqh, 0)
-        if not ret:
-            return False
-
-        self.mpqh = None
-        self.flist = None
-        return True
-
-    def PutFile(self, fname, buffer, replace=True):
-        if not self.mpqh:
-            return None
-
-        # Replace file if existing
-        flag = MAFA_ENCRYPT | MAFA_COMPRESS
-        if replace:
-            flag |= MAFA_REPLACE_EXISTING
-        cmptype = MAFA_COMPRESS_STANDARD
-
-        ret = SFmpq.MpqAddFileFromBufferEx(
-            self.mpqh, buffer, len(buffer), ut.u2b(fname), flag, cmptype, 0)
-        return bool(ret)
-
-    def PutWave(self, fname, buffer, complev=WAVCOMP_LOWQUALITY, replace=True):
-        if not self.mpqh:
-            return None
-
-        cmplevel = WaveCmpDict.get(complev, MAWA_QUALITY_HIGH)
-        if cmplevel == -1:
-            self.PutFile(fname, buffer)
-
-        flag = MAFA_ENCRYPT | MAFA_COMPRESS
-        if replace:
-            flag |= MAFA_REPLACE_EXISTING
-
-        ret = SFmpq.MpqAddWaveFromBuffer(
-            self.mpqh, buffer, len(buffer), ut.u2b(fname), flag, cmplevel)
-        return bool(ret)
-
-    def DeleteFile(self, fname):
-        if not self.mpqh:
-            return None
-
-        ret = SFmpq.MpqDeleteFile(self.mpqh, ut.u2b(fname))
-        return bool(ret)
-
-    def Compact(self):
-        if not self.mpqh:
-            return None
-
-        ret = SFmpq.MpqCompactArchive(self.mpqh)
-        return bool(ret)
-
-
-if not InitMpqLibrary():
-    raise ut.EPError("Cannot load SFmpq.dll. SFmpq not initalized")
-
-


eudplib\core\mapdata\playerinfo.py : 77 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import utils as ut
-
-_playerinfo = None
-
-
-class PlayerInfo:
-    pass
-
-
-def InitPlayerInfo(chkt):
-    global _playerinfo
-
-    section_forc = chkt.getsection('FORC')
-    section_ownr = chkt.getsection('OWNR')
-    section_side = chkt.getsection('SIDE')
-
-    _playerinfo = [PlayerInfo() for _ in range(8)]
-
-    for player in range(8):
-        pinfo = _playerinfo[player]
-
-        # Numeric info
-        pinfo.force = section_forc[player]
-        pinfo.race = section_side[player]
-        pinfo.type = section_ownr[player]
-
-        # String info
-        pinfo.racestr = {
-            0x00: "Zerg",
-            0x01: "Terran",
-            0x02: "Protoss",
-            0x03: "Independent",
-            0x04: "Neutral",
-            0x05: "User selectable",
-            0x07: "Inactive",
-            0x08: "Human",
-            0x0A: "Human",
-            0x0D: "Starcraft Campaign Editor",
-        }.get(pinfo.race, "")
-
-        pinfo.typestr = {
-            0x00: "Unused",
-            0x03: "Rescuable",
-            0x05: "Computer",
-            0x06: "Human",
-            0x07: "Neutral",
-        }.get(pinfo.type, "")
-
-
-def GetPlayerInfo(player):
-    return _playerinfo[player]
-
-


eudplib\core\mapdata\proptable.py : 74 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-from eudplib import utils as ut
-from .unitprp import UnitProperty
-
-_uprpdict = {}
-_uprptable = []
-
-
-def InitPropertyMap(chkt):
-    global _prptable, _uprpdict
-    _uprpdict.clear()
-    _uprptable.clear()
-    _uprptable.extend([None] * 64)
-
-    # Backup UPRP data
-    uprp = chkt.getsection('UPRP')
-    upus = chkt.getsection('UPUS') or bytes([1] * 64)
-
-    for i in range(64):
-        if upus[i]:
-            uprpdata = uprp[20 * i: 20 * i + 20]
-            _uprpdict[uprpdata] = i
-            _uprptable[i] = uprpdata
-
-
-def GetPropertyIndex(prop):
-    ut.ep_assert(isinstance(prop, UnitProperty) or isinstance(prop, bytes),
-                 'Invalid property type')
-
-    prop = bytes(prop)
-    try:
-        return _uprpdict[prop] + 1  # SC counts unit properties from 1. Sucks
-
-    except KeyError:
-        for uprpindex in range(64):
-            if _uprptable[uprpindex] is None:
-                break
-
-        ut.ep_assert(uprpindex < 64, 'Unit property table overflow')
-
-        _uprptable[uprpindex] = prop
-        _uprpdict[prop] = uprpindex
-        return uprpindex + 1  # SC counts unit properties from 1. Sucks
-
-
-def ApplyPropertyMap(chkt):
-    uprpdata = b''.join([uprpdata or bytes(20) for uprpdata in _uprptable])
-    chkt.setsection('UPRP', uprpdata)
-
-


eudplib\core\mapdata\stringmap.py : 115 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from . import tblformat
-from ...utils import b2i2, b2i4, u2b
-
-
-class StringIdMap:
-    def __init__(self):
-        self._s2id = {}
-
-    def AddItem(self, string, id):
-        string = u2b(string)
-        if string in self._s2id:  # ambiguous string
-            self._s2id[string] = None
-
-        else:
-            self._s2id[string] = id
-
-    def GetStringIndex(self, string):
-        string = u2b(string)
-        return self._s2id[string]
-
-
-strmap = None
-unitmap = None
-locmap = None
-swmap = None
-
-
-def IgnoreColor(s):
-    return bytes(filter(lambda x: not (0x01 <= x <= 0x1F or x == 0x7F), s))
-
-
-def InitStringMap(chkt):
-    global strmap, unitmap, locmap, swmap
-
-    strmap = tblformat.TBL(chkt.getsection('STR'))
-    unitmap = StringIdMap()
-    locmap = StringIdMap()
-    swmap = StringIdMap()
-
-    unix = chkt.getsection('UNIx')
-    mrgn = chkt.getsection('MRGN')
-    swnm = chkt.getsection('SWNM')
-
-    # Get location names
-    if mrgn:
-        locn = len(mrgn) // 20
-        for i in range(locn):
-            locstrid = b2i2(mrgn, i * 20 + 16)
-            locstr = strmap.GetString(locstrid)
-            if locstr:
-                locmap.AddItem(locstr, i)
-
-    # Get unit names
-    if unix:
-        for i in range(228):
-            unitstrid = b2i2(unix, 3192 + i * 2)
-            unitstr = strmap.GetString(unitstrid)
-            if unitstr:
-                unitmap.AddItem(unitstr, i)
-                if unitstr != IgnoreColor(unitstr):
-                    unitmap.AddItem(IgnoreColor(unitstr), i)
-
-    # Get switch names
-    if swnm:
-        for i in range(256):
-            switchstrid = b2i4(swnm, i * 4)
-            switchstr = strmap.GetString(switchstrid)
-            if switchstr:
-                swmap.AddItem(switchstr, i)
-
-
-def GetLocationIndex(l):
-    return locmap.GetStringIndex(l)
-
-
-def GetStringIndex(s):
-    return strmap.GetStringIndex(s)
-
-
-def GetSwitchIndex(s):
-    return swmap.GetStringIndex(s)
-
-
-def GetUnitIndex(u):
-    return unitmap.GetStringIndex(u)
-
-
-def ApplyStringMap(chkt):
-    chkt.setsection('STR', strmap.SaveTBL())
-
-


eudplib\core\mapdata\tblformat.py : 136 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-'''
-String table manager. Internally used in eudplib.
-'''
-
-from eudplib import utils as ut
-
-
-class TBL:
-    def __init__(self, content=None):
-        #
-        # datatb : table of strings                       : string data table
-        # dataindextb : string id -> data id              : string offset table
-        # stringmap : string -> representative string id
-        #
-
-        self._datatb = []
-        self._stringmap = {}
-        self._dataindextb = []  # String starts from #1
-        self._capacity = 2  # Size of STR section
-
-        if content is not None:
-            self.LoadTBL(content)
-
-    def LoadTBL(self, content):
-        self._datatb.clear()
-        self._stringmap.clear()
-        self._capacity = 2
-
-        stringcount = ut.b2i2(content, 0)
-        for i in range(stringcount):
-            i += 1
-            stringoffset = ut.b2i2(content, i * 2)
-            send = stringoffset
-            while content[send] != 0:
-                send += 1
-
-            string = content[stringoffset:send]
-            self.AddString(string)
-
-    def AddString(self, string):
-        string = ut.u2b(string)  # Starcraft uses multibyte encoding.
-        if not isinstance(string, bytes):
-            raise ut.EPError('Invalid type for string')
-
-        stringindex = len(self._dataindextb)
-
-        # If duplicate text exist -> just proxy it
-        try:
-            repr_stringid = self._stringmap[string]
-            dataindex = self._dataindextb[repr_stringid]
-            self._dataindextb.append(dataindex)
-            self._capacity += 2  # just string offset
-
-        # Else -> Create new entry
-        except KeyError:
-            dataindex = len(self._datatb)
-            self._stringmap[string] = stringindex
-            self._datatb.append(string)
-            self._dataindextb.append(dataindex)
-            # string + b'\0' + string offset
-            self._capacity += len(string) + 1 + 2
-
-        ut.ep_assert(self._capacity < 65536, 'String table overflow')
-
-        return stringindex
-
-    def GetString(self, index):
-        if index == 0:
-            return None
-        else:
-            try:
-                dataindex = self._dataindextb[index - 1]
-                return self._datatb[dataindex]
-            except IndexError:
-                return None
-
-    def GetStringIndex(self, string):
-        string = ut.u2b(string)
-        if not isinstance(string, bytes):
-            raise ut.EPError('Invalid type for string')
-
-        try:
-            return self._stringmap[string] + 1
-
-        except KeyError:
-            return self.AddString(string) + 1
-
-    def SaveTBL(self):
-        outbytes = []
-
-        # calculate offset of each string
-        stroffset = []
-        outindex = 2 * len(self._dataindextb) + 2
-        for s in self._datatb:
-            stroffset.append(outindex)
-            outindex += len(s) + 1
-
-        # String count
-        outbytes.append(ut.i2b2(len(self._dataindextb)))
-
-        # String offsets
-        for dataidx in self._dataindextb:
-            outbytes.append(ut.i2b2(stroffset[dataidx]))
-
-        # String data
-        for s in self._datatb:
-            outbytes.append(s)
-            outbytes.append(b'\0')
-
-        return b''.join(outbytes)
-
-


eudplib\core\mapdata\unitprp.py : 144 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ctypes import *
-from eudplib import utils as ut
-
-
-class UnitProperty(LittleEndianStructure):
-
-    '''
-    UnitProperty class. Used in 'Create Unit with Properties' action.
-    '''
-
-    _fields_ = [
-        ('sprpvalid', c_ushort),
-        ('prpvalid', c_ushort),
-        ('player', c_byte),
-        ('hitpoint', c_byte),
-        ('shield', c_byte),
-        ('energy', c_byte),
-        ('resource', c_uint),
-        ('hanger', c_ushort),
-        ('sprpflag', c_ushort),
-        ('unused', c_uint)
-    ]
-
-    def __init__(
-            self,
-            hitpoint=None,
-            shield=None,
-            energy=None,
-            resource=None,
-            hanger=None,
-            cloaked=None,
-            burrowed=None,
-            intransit=None,
-            hallucinated=None,
-            invincible=None
-    ):
-        '''
-        Properties : Value/None (Don't care)
-
-        - hitpoint : 0~100(%)  if) When unit's hitpoint is greater than 167772,
-        - shield   : 0~100(%)   you should give hitpoint None to make 100%% HP.
-        - energy   : 0~100(%)
-        - resource : 0~4294967295
-        - hanger   : 0~65536 (Count)
-
-        Special properties : True(Enabled)/False(Disabled)/None(Don't care)
-
-        - clocked      : Unit is clocked.
-        - burrowed     : Unit is burrowed.
-        - intransit    : Unit is lifted. (In transit)
-        - hallucinated : Unit is hallucination.
-        - invincible   : Unit is invincible.
-
-        >>> UnitProperty(hitpoint = 50, burrowed = True) # HP 50%, burrowed
-        '''
-        ut.ep_assert(hitpoint is None or 0 <= hitpoint <= 100)
-        ut.ep_assert(shield is None or 0 <= shield <= 100)
-        ut.ep_assert(energy is None or 0 <= energy <= 100)
-        ut.ep_assert(resource is None or 0 <= resource)
-        ut.ep_assert(hanger is None or 0 <= hanger <= 255)
-
-        ut.ep_assert(cloaked in [None, True, False])
-        ut.ep_assert(burrowed in [None, True, False])
-        ut.ep_assert(intransit in [None, True, False])
-        ut.ep_assert(hallucinated in [None, True, False])
-        ut.ep_assert(invincible in [None, True, False])
-
-        def prop2int(p):
-            if p is None:
-                return 0
-            else:
-                return p
-
-        def prop2valid(p, v):
-            if p is None:
-                return 0
-            else:
-                return v
-
-        def prop2flag(p, v):
-            if p:
-                return v
-            else:
-                return 0
-
-        self.player = 0
-
-        # Set properties
-        self.hitpoint = prop2int(hitpoint)
-        self.shield = prop2int(shield)
-        self.energy = prop2int(energy)
-        self.resource = prop2int(resource)
-        self.hanger = prop2int(hanger)
-
-        self.prpvalid = (
-            prop2valid(hitpoint, 1 << 1) |
-            prop2valid(shield, 1 << 2) |
-            prop2valid(energy, 1 << 3) |
-            prop2valid(resource, 1 << 4) |
-            prop2valid(hanger, 1 << 5)
-        )
-
-        # Set special properties
-        self.sprpvalid = (
-            prop2valid(cloaked, 1 << 0) |
-            prop2valid(burrowed, 1 << 1) |
-            prop2valid(intransit, 1 << 2) |
-            prop2valid(hallucinated, 1 << 3) |
-            prop2valid(invincible, 1 << 4)
-        )
-
-        self.sprpflag = (
-            prop2flag(cloaked, 1 << 0) |
-            prop2flag(burrowed, 1 << 1) |
-            prop2flag(intransit, 1 << 2) |
-            prop2flag(hallucinated, 1 << 3) |
-            prop2flag(invincible, 1 << 4)
-        )
-
-


eudplib\core\mapdata\__init__.py : 42 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .stringmap import (
-    GetLocationIndex,
-    GetStringIndex,
-    GetSwitchIndex,
-    GetUnitIndex
-)
-
-from .proptable import GetPropertyIndex
-from .unitprp import UnitProperty
-from .mapdata import (
-    IsMapdataInitalized,
-    GetChkTokenized
-)
-
-from .tblformat import TBL
-
-from .playerinfo import GetPlayerInfo
-
-


eudplib\core\rawtrigger\action.py : 154 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..allocator import ConstExpr, Evaluate, IsConstExpr
-from eudplib import utils as ut
-
-
-class Action(ConstExpr):
-
-    '''
-    Action class.
-
-    Memory layout.
-
-     ======  ============= ========  ==========
-     Offset  Field Name    Position  EPD Player
-     ======  ============= ========  ==========
-       +00   locid1         dword0   EPD(act)+0
-       +04   strid          dword1   EPD(act)+1
-       +08   wavid          dword2   EPD(act)+2
-       +0C   time           dword3   EPD(act)+3
-       +10   player1        dword4   EPD(act)+4
-       +14   player2        dword5   EPD(act)+5
-       +18   unitid         dword6   EPD(act)+6
-       +1A   acttype
-       +1B   amount
-       +1C   flags          dword7   EPD(act)+7
-       +1D   internal[3
-     ======  ============= ========  ==========
-    '''
-
-    def __init__(self, locid1, strid, wavid, time, player1, player2,
-                 unitid, acttype, amount, flags):
-        '''
-        See :mod:`eudplib.base.stocktrg` for stock actions list.
-        '''
-        super().__init__(self)
-
-        self.locid1 = locid1
-        self.strid = strid
-        self.wavid = wavid
-        self.time = time
-        self.player1 = player1
-        self.player2 = player2
-        self.unitid = unitid
-        self.acttype = acttype
-        self.amount = amount
-        self.flags = flags
-
-        self.parenttrg = None
-        self.actindex = None
-
-    def Disable(self):
-        self.flags |= 2
-
-    # -------
-
-    def CheckArgs(self):
-        ut.ep_assert(
-            self.locid1 is None or IsConstExpr(self.locid1),
-            'Invalid arg %s' % self.locid1
-        )
-        ut.ep_assert(
-            self.strid is None or IsConstExpr(self.strid),
-            'Invalid arg %s' % self.strid
-        )
-        ut.ep_assert(
-            self.wavid is None or IsConstExpr(self.wavid),
-            'Invalid arg %s' % self.wavid
-        )
-        ut.ep_assert(
-            self.time is None or IsConstExpr(self.time),
-            'Invalid arg %s' % self.time
-        )
-        ut.ep_assert(
-            self.player1 is None or IsConstExpr(self.player1),
-            'Invalid arg %s' % self.player1
-        )
-        ut.ep_assert(
-            self.player2 is None or IsConstExpr(self.player2),
-            'Invalid arg %s' % self.player2
-        )
-        ut.ep_assert(
-            self.unitid is None or IsConstExpr(self.unitid),
-            'Invalid arg %s' % self.unitid
-        )
-        ut.ep_assert(
-            self.acttype is None or IsConstExpr(self.acttype),
-            'Invalid arg %s' % self.acttype
-        )
-        ut.ep_assert(
-            self.amount is None or IsConstExpr(self.amount),
-            'Invalid arg %s' % self.amount
-        )
-        ut.ep_assert(
-            self.flags is None or IsConstExpr(self.flags),
-            'Invalid arg %s' % self.flags
-        )
-        return True
-
-    def SetParentTrigger(self, trg, index):
-        ut.ep_assert(
-            self.parenttrg is None,
-            'Actions cannot be shared by two triggers.'
-        )
-
-        ut.ep_assert(trg is not None, 'Trigger should not be null.')
-        ut.ep_assert(0 <= index < 64, 'Triggers out of range')
-
-        self.parenttrg = trg
-        self.actindex = index
-
-    def Evaluate(self):
-        return Evaluate(self.parenttrg) + 8 + 320 + 32 * self.actindex
-
-    def WritePayload(self, pbuffer):
-        pbuffer.WritePack(
-            'IIIIIIHBBBBH',
-            self.locid1,
-            self.strid,
-            self.wavid,
-            self.time,
-            self.player1,
-            self.player2,
-            self.unitid,
-            self.acttype,
-            self.amount,
-            self.flags,
-            0,
-            0
-        )
-
-


eudplib\core\rawtrigger\condition.py : 137 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..allocator import ConstExpr, Evaluate, IsConstExpr
-from eudplib import utils as ut
-
-
-class Condition(ConstExpr):
-
-    '''
-    Condition class.
-
-    Memory layout:
-
-     ======  =============  ========  ===========
-     Offset  Field name     Position  EPD Player
-     ======  =============  ========  ===========
-       +00   locid           dword0   EPD(cond)+0
-       +04   player          dword1   EPD(cond)+1
-       +08   amount          dword2   EPD(cond)+2
-       +0C   unitid          dword3   EPD(cond)+3
-       +0E   comparison
-       +0F   condtype
-       +10   restype         dword4   EPD(cond)+4
-       +11   flags
-       +12   internal[2]
-     ======  =============  ========  ===========
-    '''
-
-    def __init__(self, locid, player, amount, unitid,
-                 comparison, condtype, restype, flags):
-        super().__init__(self)
-
-        self.locid = locid
-        self.player = player
-        self.amount = amount
-        self.unitid = unitid
-        self.comparison = comparison
-        self.condtype = condtype
-        self.restype = restype
-        self.flags = flags
-
-        self.parenttrg = None
-        self.condindex = None
-
-    def Disable(self):
-        self.flags |= 2
-
-    # -------
-
-    def CheckArgs(self):
-        ut.ep_assert(
-            self.locid is None or IsConstExpr(self.locid),
-            'Invalid arg %s' % self.locid
-        )
-        ut.ep_assert(
-            self.player is None or IsConstExpr(self.player),
-            'Invalid arg %s' % self.player
-        )
-        ut.ep_assert(
-            self.amount is None or IsConstExpr(self.amount),
-            'Invalid arg %s' % self.amount
-        )
-        ut.ep_assert(
-            self.unitid is None or IsConstExpr(self.unitid),
-            'Invalid arg %s' % self.unitid
-        )
-        ut.ep_assert(
-            self.comparison is None or IsConstExpr(self.comparison),
-            'Invalid arg %s' % self.comparison
-        )
-        ut.ep_assert(
-            self.condtype is None or IsConstExpr(self.condtype),
-            'Invalid arg %s' % self.condtype
-        )
-        ut.ep_assert(
-            self.restype is None or IsConstExpr(self.restype),
-            'Invalid arg %s' % self.restype
-        )
-        ut.ep_assert(
-            self.flags is None or IsConstExpr(self.flags),
-            'Invalid arg %s' % self.flags
-        )
-        return True
-
-    def SetParentTrigger(self, trg, index):
-        ut.ep_assert(
-            self.parenttrg is None,
-            'Condition cannot be shared by two triggers. '
-        )
-
-        ut.ep_assert(trg is not None, 'Trigger should not be null.')
-        ut.ep_assert(0 <= index < 16, 'WTF')
-
-        self.parenttrg = trg
-        self.condindex = index
-
-    def Evaluate(self):
-        ut.ep_assert(self.parenttrg is not None, 'Orphan condition')
-        return Evaluate(self.parenttrg) + 8 + self.condindex * 20
-
-    def WritePayload(self, pbuffer):
-        pbuffer.WritePack(
-            'IIIHBBBBH',
-            self.locid,
-            self.player,
-            self.amount,
-            self.unitid,
-            self.comparison,
-            self.condtype,
-            self.restype,
-            self.flags,
-            0
-        )
-
-


eudplib\core\rawtrigger\constenc.py : 350 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..mapdata import GetPropertyIndex
-
-
-class _Unique:
-    pass
-
-
-class _KillsSpecialized:
-    def __call__(self, a, b, c, d):
-        return self._internalf(a, b, c, d)
-
-
-All = _Unique()
-Enemy = _Unique()
-Ally = _Unique()
-AlliedVictory = _Unique()
-AtLeast = _Unique()
-AtMost = _Unique()
-Exactly = _Unique()
-SetTo = _Unique()
-Add = _Unique()
-Subtract = _Unique()
-Move = _Unique()
-Patrol = _Unique()
-Attack = _Unique()
-P1 = _Unique()
-P2 = _Unique()
-P3 = _Unique()
-P4 = _Unique()
-P5 = _Unique()
-P6 = _Unique()
-P7 = _Unique()
-P8 = _Unique()
-P9 = _Unique()
-P10 = _Unique()
-P11 = _Unique()
-P12 = _Unique()
-Player1 = _Unique()
-Player2 = _Unique()
-Player3 = _Unique()
-Player4 = _Unique()
-Player5 = _Unique()
-Player6 = _Unique()
-Player7 = _Unique()
-Player8 = _Unique()
-Player9 = _Unique()
-Player10 = _Unique()
-Player11 = _Unique()
-Player12 = _Unique()
-CurrentPlayer = _Unique()
-Foes = _Unique()
-Allies = _Unique()
-NeutralPlayers = _Unique()
-AllPlayers = _Unique()
-Force1 = _Unique()
-Force2 = _Unique()
-Force3 = _Unique()
-Force4 = _Unique()
-NonAlliedVictoryPlayers = _Unique()
-Enable = _Unique()
-Disable = _Unique()
-Toggle = _Unique()
-Ore = _Unique()
-Gas = _Unique()
-OreAndGas = _Unique()
-Total = _Unique()
-Units = _Unique()
-Buildings = _Unique()
-UnitsAndBuildings = _Unique()
-
-# Name 'Kills' is used for both condition type and score type.
-# To resolve conflict, we initialize Kills differently from others.
-Kills = _KillsSpecialized()
-Razings = _Unique()
-KillsAndRazings = _Unique()
-Custom = _Unique()
-Set = _Unique()
-Clear = _Unique()
-Random = _Unique()
-Cleared = _Unique()
-
-AllyStatusDict = {
-    Enemy: 0,
-    Ally: 1,
-    AlliedVictory: 2,
-}
-
-ComparisonDict = {
-    AtLeast: 0,
-    AtMost: 1,
-    Exactly: 10,
-}
-
-ModifierDict = {
-    SetTo: 7,
-    Add: 8,
-    Subtract: 9,
-}
-
-OrderDict = {
-    Move: 0,
-    Patrol: 1,
-    Attack: 2,
-}
-
-PlayerDict = {
-    P1: 0,
-    P2: 1,
-    P3: 2,
-    P4: 3,
-    P5: 4,
-    P6: 5,
-    P7: 6,
-    P8: 7,
-    P9: 8,
-    P10: 9,
-    P11: 10,
-    P12: 11,
-    Player1: 0,
-    Player2: 1,
-    Player3: 2,
-    Player4: 3,
-    Player5: 4,
-    Player6: 5,
-    Player7: 6,
-    Player8: 7,
-    Player9: 8,
-    Player10: 9,
-    Player11: 10,
-    Player12: 11,
-    CurrentPlayer: 13,
-    Foes: 14,
-    Allies: 15,
-    NeutralPlayers: 16,
-    AllPlayers: 17,
-    Force1: 18,
-    Force2: 19,
-    Force3: 20,
-    Force4: 21,
-    NonAlliedVictoryPlayers: 26,
-}
-
-PropStateDict = {
-    Enable: 4,
-    Disable: 5,
-    Toggle: 6,
-}
-
-ResourceDict = {
-    Ore: 0,
-    Gas: 1,
-    OreAndGas: 2,
-}
-
-ScoreDict = {
-    Total: 0,
-    Units: 1,
-    Buildings: 2,
-    UnitsAndBuildings: 3,
-    Kills: 4,
-    Razings: 5,
-    KillsAndRazings: 6,
-    Custom: 7,
-}
-
-SwitchActionDict = {
-    Set: 4,
-    Clear: 5,
-    Toggle: 6,
-    Random: 11,
-}
-
-SwitchStateDict = {
-    Set: 2,
-    Cleared: 3,
-}
-
-
-def _EncodeConst(d, s):
-    try:
-        return d.get(s, s)
-    except TypeError:  # unhashable type
-        return s
-
-
-def EncodeAllyStatus(s):
-    '''
-    Convert [Enemy, Ally, AlliedVictory] to number [0, 1, 2].
-    '''
-    return _EncodeConst(AllyStatusDict, s)
-
-
-def EncodeComparison(s):
-    '''
-    Convert [AtLeast, AtMost, Exactly] to number [0, 1, 10].
-    '''
-    return _EncodeConst(ComparisonDict, s)
-
-
-def EncodeModifier(s):
-    '''
-    Convert [SetTo, Add, Subtract] to number [7, 8, 9].
-    '''
-    return _EncodeConst(ModifierDict, s)
-
-
-def EncodeOrder(s):
-    '''
-    Convert [Move, Patrol, Attack] to number [0, 1, 2].
-    '''
-    return _EncodeConst(OrderDict, s)
-
-
-def EncodePlayer(s):
-    '''
-    Convert player identifier to corresponding number.
-
-    ======================= ========
-        Identifier           Number
-    ======================= ========
-    P1                         0
-    P2                         1
-    P3                         2
-    P4                         3
-    P5                         4
-    P6                         5
-    P7                         6
-    P8                         7
-    P9                         8
-    P10                        9
-    P11                        10
-    P12                        11
-    Player1                    0
-    Player2                    1
-    Player3                    2
-    Player4                    3
-    Player5                    4
-    Player6                    5
-    Player7                    6
-    Player8                    7
-    Player9                    8
-    Player10                   9
-    Player11                   10
-    Player12                   11
-    CurrentPlayer              13
-    Foes                       14
-    Allies                     15
-    NeutralPlayers             16
-    AllPlayers                 17
-    Force1                     18
-    Force2                     19
-    Force3                     20
-    Force4                     21
-    NonAlliedVictoryPlayers    26
-    ======================= ========
-
-    '''
-    return _EncodeConst(PlayerDict, s)
-
-
-def EncodePropState(s):
-    '''
-    Convert [Enable, Disable, Toogle] to number [4, 5, 6]
-    '''
-    return _EncodeConst(PropStateDict, s)
-
-
-def EncodeResource(s):
-    '''
-    Convert [Ore, Gas, OreAndGas] to [0, 1, 2]
-    '''
-    return _EncodeConst(ResourceDict, s)
-
-
-def EncodeScore(s):
-    '''
-    Convert score type identifier to number.
-
-    ================= ========
-        Score type     Number
-    ================= ========
-    Total                0
-    Units                1
-    Buildings            2
-    UnitsAndBuildings    3
-    Kills                4
-    Razings              5
-    KillsAndRazings      6
-    Custom               7
-    ================= ========
-
-    '''
-    return _EncodeConst(ScoreDict, s)
-
-
-def EncodeSwitchAction(s):
-    '''
-    Convert [Set, Clear, Toogle, Random] to [4, 5, 6, 11].
-    '''
-    return _EncodeConst(SwitchActionDict, s)
-
-
-def EncodeSwitchState(s):
-    '''
-    Convert [Set, Cleared] to [2, 3].
-    '''
-    return _EncodeConst(SwitchStateDict, s)
-
-
-def EncodeCount(s):
-    '''
-    Convert [All, (other numbers)] to number [0, (as-is)].
-    '''
-    if s is All:
-        return 0
-    else:
-        return s
-
-
-# ========================
-
-
-def EncodeProperty(prop):
-    return GetPropertyIndex(prop)
-
-


eudplib\core\rawtrigger\rawtriggerdef.py : 159 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..eudobj import EUDObject
-from .triggerscope import NextTrigger, _RegisterTrigger
-from .condition import Condition
-from .action import Action
-from eudplib import utils as ut
-
-
-# Trigger counter thing
-
-_trgCounter = 0
-
-
-def GetTriggerCounter():
-    return _trgCounter
-
-
-# Aux
-
-def _bool2Cond(x):
-    if x is True:
-        return Condition(0, 0, 0, 0, 0, 22, 0, 0)  # Always
-    elif x is False:
-        return Condition(0, 0, 0, 0, 0, 23, 0, 0)  # Never
-    else:
-        return x
-
-
-def Disabled(arg):
-    """Disable condition or action"""
-    arg.Disabled()
-
-
-# RawTrigger
-
-class RawTrigger(EUDObject):
-
-    def __init__(
-            self,
-            prevptr=None,
-            nextptr=None,
-            conditions=None,
-            actions=None,
-            preserved=True
-    ):
-        super().__init__()
-
-        global _trgCounter
-        _trgCounter += 1
-
-        _RegisterTrigger(self)  # This should be called before (1)
-
-        if prevptr is None:
-            prevptr = 0
-
-        if nextptr is None:
-            nextptr = NextTrigger()  # (1)
-
-        if conditions is None:
-            conditions = []
-
-        if actions is None:
-            actions = []
-
-        conditions = ut.FlattenList(conditions)
-        actions = ut.FlattenList(actions)
-
-        ut.ep_assert(len(conditions) <= 16, 'Too many conditions')
-        ut.ep_assert(len(actions) <= 64, 'Too many actions')
-        ut.ep_assert(isinstance(preserved, bool), 'preserved should be bool')
-
-        conditions = list(map(_bool2Cond, conditions))
-        self._prevptr = prevptr
-        self._nextptr = nextptr
-        self._conditions = conditions
-        self._actions = actions
-
-        for i, cond in enumerate(self._conditions):
-            ut.ep_assert(isinstance(cond, Condition))
-            try:
-                cond.CheckArgs()
-            except ut.EPError:
-                print('Error on condition %d' % i)
-                raise
-
-            cond.SetParentTrigger(self, i)
-
-        for i, act in enumerate(self._actions):
-            ut.ep_assert(isinstance(act, Action))
-            try:
-                act.CheckArgs()
-            except ut.EPError:
-                print('Error on action %d' % i)
-                raise
-
-            act.SetParentTrigger(self, i)
-
-        self.preserved = preserved
-
-    def GetNextPtrMemory(self):
-        return self + 4
-
-    def GetDataSize(self):
-        return 2408
-
-    def WritePayload(self, pbuffer):
-        pbuffer.WriteDword(self._prevptr)
-        pbuffer.WriteDword(self._nextptr)
-
-        # Conditions
-        for cond in self._conditions:
-            cond.WritePayload(pbuffer)
-
-        if len(self._conditions) != 16:
-            pbuffer.WriteBytes(bytes(20))
-            pbuffer.WriteSpace(20 * (15 - len(self._conditions)))
-
-        # Actions
-        for act in self._actions:
-            act.WritePayload(pbuffer)
-
-        if len(self._actions) != 64:
-            pbuffer.WriteBytes(bytes(32))
-            pbuffer.WriteSpace(32 * (63 - len(self._actions)))
-
-        # Preserved flag
-
-        if self.preserved:
-            pbuffer.WriteDword(4)
-        else:
-            pbuffer.WriteDword(0)
-
-        pbuffer.WriteSpace(27)
-        pbuffer.WriteByte(0)
-
-


eudplib\core\rawtrigger\stockact.py : 414 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
-365
-366
-367
-368
-369
-370
-371
-372
-373
-374
-375
-376
-377
-378
-379
-380
-381
-382
-383
-384
-385
-386
-387
-388
-389
-390
-391
-392
-393
-394
-395
-396
-397
-398
-399
-400
-401
-402
-403
-404
-405
-406
-407
-408
-409
-410
-411
-412
-413
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .action import Action
-from .constenc import (
-    EncodeAllyStatus,
-    EncodeCount,
-    EncodeModifier,
-    EncodeOrder,
-    EncodePlayer,
-    EncodeProperty,
-    EncodePropState,
-    EncodeResource,
-    EncodeScore,
-    EncodeSwitchAction,
-)
-
-from .strenc import (
-    EncodeAIScript,
-    EncodeLocation,
-    EncodeString,
-    EncodeSwitch,
-    EncodeUnit,
-)
-from ...utils import EPD
-
-
-def Victory():
-    return Action(0, 0, 0, 0, 0, 0, 0, 1, 0, 4)
-
-
-def Defeat():
-    return Action(0, 0, 0, 0, 0, 0, 0, 2, 0, 4)
-
-
-def PreserveTrigger():
-    return Action(0, 0, 0, 0, 0, 0, 0, 3, 0, 4)
-
-
-def Wait(Time):
-    print("[Warning] Don't use Wait action UNLESS YOU KNOW WHAT YOU'RE DOING!")
-    return Action(0, 0, 0, Time, 0, 0, 0, 4, 0, 4)
-
-
-def PauseGame():
-    return Action(0, 0, 0, 0, 0, 0, 0, 5, 0, 4)
-
-
-def UnpauseGame():
-    return Action(0, 0, 0, 0, 0, 0, 0, 6, 0, 4)
-
-
-def Transmission(Unit, Where, WAVName, TimeModifier,
-                 Time, Text, AlwaysDisplay=4):
-    Unit = EncodeUnit(Unit)
-    Where = EncodeLocation(Where)
-    WAVName = EncodeString(WAVName)
-    TimeModifier = EncodeModifier(TimeModifier)
-    Text = EncodeString(Text)
-    return Action(Where, Text, WAVName, Time, 0, 0,
-                  Unit, 7, TimeModifier, AlwaysDisplay)
-
-
-def PlayWAV(WAVName):
-    WAVName = EncodeString(WAVName)
-    return Action(0, 0, WAVName, 0, 0, 0, 0, 8, 0, 4)
-
-
-def DisplayText(Text, AlwaysDisplay=4):
-    Text = EncodeString(Text)
-    return Action(0, Text, 0, 0, 0, 0, 0, 9, 0, AlwaysDisplay)
-
-
-def CenterView(Where):
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, 0, 0, 0, 10, 0, 4)
-
-
-def CreateUnitWithProperties(Count, Unit, Where, Player, Properties):
-    Unit = EncodeUnit(Unit)
-    Where = EncodeLocation(Where)
-    Player = EncodePlayer(Player)
-    Properties = EncodeProperty(Properties)
-    return Action(Where, 0, 0, 0, Player, Properties, Unit, 11, Count, 28)
-
-
-def SetMissionObjectives(Text):
-    Text = EncodeString(Text)
-    return Action(0, Text, 0, 0, 0, 0, 0, 12, 0, 4)
-
-
-def SetSwitch(Switch, State):
-    Switch = EncodeSwitch(Switch)
-    State = EncodeSwitchAction(State)
-    return Action(0, 0, 0, 0, 0, Switch, 0, 13, State, 4)
-
-
-def SetCountdownTimer(TimeModifier, Time):
-    TimeModifier = EncodeModifier(TimeModifier)
-    return Action(0, 0, 0, Time, 0, 0, 0, 14, TimeModifier, 4)
-
-
-def RunAIScript(Script):
-    Script = EncodeAIScript(Script)
-    return Action(0, 0, 0, 0, 0, Script, 0, 15, 0, 4)
-
-
-def RunAIScriptAt(Script, Where):
-    Script = EncodeAIScript(Script)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, 0, Script, 0, 16, 0, 4)
-
-
-def LeaderBoardControl(Unit, Label):
-    Unit = EncodeUnit(Unit)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, 0, Unit, 17, 0, 20)
-
-
-def LeaderBoardControlAt(Unit, Location, Label):
-    Unit = EncodeUnit(Unit)
-    Location = EncodeLocation(Location)
-    Label = EncodeString(Label)
-    return Action(Location, Label, 0, 0, 0, 0, Unit, 18, 0, 20)
-
-
-def LeaderBoardResources(ResourceType, Label):
-    ResourceType = EncodeResource(ResourceType)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, 0, ResourceType, 19, 0, 4)
-
-
-def LeaderBoardKills(Unit, Label):
-    Unit = EncodeUnit(Unit)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, 0, Unit, 20, 0, 20)
-
-
-def LeaderBoardScore(ScoreType, Label):
-    ScoreType = EncodeScore(ScoreType)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, 0, ScoreType, 21, 0, 4)
-
-
-def KillUnit(Unit, Player):
-    Unit = EncodeUnit(Unit)
-    Player = EncodePlayer(Player)
-    return Action(0, 0, 0, 0, Player, 0, Unit, 22, 0, 20)
-
-
-def KillUnitAt(Count, Unit, Where, ForPlayer):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Where = EncodeLocation(Where)
-    ForPlayer = EncodePlayer(ForPlayer)
-    return Action(Where, 0, 0, 0, ForPlayer, 0, Unit, 23, Count, 20)
-
-
-def RemoveUnit(Unit, Player):
-    Unit = EncodeUnit(Unit)
-    Player = EncodePlayer(Player)
-    return Action(0, 0, 0, 0, Player, 0, Unit, 24, 0, 20)
-
-
-def RemoveUnitAt(Count, Unit, Where, ForPlayer):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Where = EncodeLocation(Where)
-    ForPlayer = EncodePlayer(ForPlayer)
-    return Action(Where, 0, 0, 0, ForPlayer, 0, Unit, 25, Count, 20)
-
-
-def SetResources(Player, Modifier, Amount, ResourceType):
-    Player = EncodePlayer(Player)
-    Modifier = EncodeModifier(Modifier)
-    ResourceType = EncodeResource(ResourceType)
-    return Action(0, 0, 0, 0, Player, Amount, ResourceType, 26, Modifier, 4)
-
-
-def SetScore(Player, Modifier, Amount, ScoreType):
-    Player = EncodePlayer(Player)
-    Modifier = EncodeModifier(Modifier)
-    ScoreType = EncodeScore(ScoreType)
-    return Action(0, 0, 0, 0, Player, Amount, ScoreType, 27, Modifier, 4)
-
-
-def MinimapPing(Where):
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, 0, 0, 0, 28, 0, 4)
-
-
-def TalkingPortrait(Unit, Time):
-    Unit = EncodeUnit(Unit)
-    return Action(0, 0, 0, Time, 0, 0, Unit, 29, 0, 20)
-
-
-def MuteUnitSpeech():
-    return Action(0, 0, 0, 0, 0, 0, 0, 30, 0, 4)
-
-
-def UnMuteUnitSpeech():
-    return Action(0, 0, 0, 0, 0, 0, 0, 31, 0, 4)
-
-
-def LeaderBoardComputerPlayers(State):
-    State = EncodePropState(State)
-    return Action(0, 0, 0, 0, 0, 0, 0, 32, State, 4)
-
-
-def LeaderBoardGoalControl(Goal, Unit, Label):
-    Unit = EncodeUnit(Unit)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, Goal, Unit, 33, 0, 20)
-
-
-def LeaderBoardGoalControlAt(Goal, Unit, Location, Label):
-    Unit = EncodeUnit(Unit)
-    Location = EncodeLocation(Location)
-    Label = EncodeString(Label)
-    return Action(Location, Label, 0, 0, 0, Goal, Unit, 34, 0, 20)
-
-
-def LeaderBoardGoalResources(Goal, ResourceType, Label):
-    ResourceType = EncodeResource(ResourceType)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, Goal, ResourceType, 35, 0, 4)
-
-
-def LeaderBoardGoalKills(Goal, Unit, Label):
-    Unit = EncodeUnit(Unit)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, Goal, Unit, 36, 0, 20)
-
-
-def LeaderBoardGoalScore(Goal, ScoreType, Label):
-    ScoreType = EncodeScore(ScoreType)
-    Label = EncodeString(Label)
-    return Action(0, Label, 0, 0, 0, Goal, ScoreType, 37, 0, 4)
-
-
-def MoveLocation(Location, OnUnit, Owner, DestLocation):
-    Location = EncodeLocation(Location)
-    OnUnit = EncodeUnit(OnUnit)
-    Owner = EncodePlayer(Owner)
-    DestLocation = EncodeLocation(DestLocation)
-    return Action(DestLocation, 0, 0, 0, Owner, Location, OnUnit, 38, 0, 20)
-
-
-def MoveUnit(Count, UnitType, Owner, StartLocation, DestLocation):
-    Count = EncodeCount(Count)
-    UnitType = EncodeUnit(UnitType)
-    Owner = EncodePlayer(Owner)
-    StartLocation = EncodeLocation(StartLocation)
-    DestLocation = EncodeLocation(DestLocation)
-    return Action(StartLocation, 0, 0, 0, Owner, DestLocation,
-                  UnitType, 39, Count, 20)
-
-
-def LeaderBoardGreed(Goal):
-    return Action(0, 0, 0, 0, 0, Goal, 0, 40, 0, 4)
-
-
-def SetNextScenario(ScenarioName):
-    ScenarioName = EncodeString(ScenarioName)
-    return Action(0, ScenarioName, 0, 0, 0, 0, 0, 41, 0, 4)
-
-
-def SetDoodadState(State, Unit, Owner, Where):
-    State = EncodePropState(State)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, 0, Unit, 42, State, 20)
-
-
-def SetInvincibility(State, Unit, Owner, Where):
-    State = EncodePropState(State)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, 0, Unit, 43, State, 20)
-
-
-def CreateUnit(Number, Unit, Where, ForPlayer):
-    Unit = EncodeUnit(Unit)
-    Where = EncodeLocation(Where)
-    ForPlayer = EncodePlayer(ForPlayer)
-    return Action(Where, 0, 0, 0, ForPlayer, 0, Unit, 44, Number, 20)
-
-
-def SetDeaths(Player, Modifier, Number, Unit):
-    Player = EncodePlayer(Player)
-    Modifier = EncodeModifier(Modifier)
-    Unit = EncodeUnit(Unit)
-    return Action(0, 0, 0, 0, Player, Number, Unit, 45, Modifier, 20)
-
-
-def Order(Unit, Owner, StartLocation, OrderType, DestLocation):
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    StartLocation = EncodeLocation(StartLocation)
-    OrderType = EncodeOrder(OrderType)
-    DestLocation = EncodeLocation(DestLocation)
-    return Action(StartLocation, 0, 0, 0, Owner, DestLocation,
-                  Unit, 46, OrderType, 20)
-
-
-def Comment(Text):
-    Text = EncodeString(Text)
-    return Action(0, Text, 0, 0, 0, 0, 0, 47, 0, 4)
-
-
-def GiveUnits(Count, Unit, Owner, Where, NewOwner):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    NewOwner = EncodePlayer(NewOwner)
-    return Action(Where, 0, 0, 0, Owner, NewOwner, Unit, 48, Count, 20)
-
-
-def ModifyUnitHitPoints(Count, Unit, Owner, Where, Percent):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, Percent, Unit, 49, Count, 20)
-
-
-def ModifyUnitEnergy(Count, Unit, Owner, Where, Percent):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, Percent, Unit, 50, Count, 20)
-
-
-def ModifyUnitShields(Count, Unit, Owner, Where, Percent):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, Percent, Unit, 51, Count, 20)
-
-
-def ModifyUnitResourceAmount(Count, Owner, Where, NewValue):
-    Count = EncodeCount(Count)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, NewValue, 0, 52, Count, 4)
-
-
-def ModifyUnitHangarCount(Add, Count, Unit, Owner, Where):
-    Count = EncodeCount(Count)
-    Unit = EncodeUnit(Unit)
-    Owner = EncodePlayer(Owner)
-    Where = EncodeLocation(Where)
-    return Action(Where, 0, 0, 0, Owner, Add, Unit, 53, Count, 20)
-
-
-def PauseTimer():
-    return Action(0, 0, 0, 0, 0, 0, 0, 54, 0, 4)
-
-
-def UnpauseTimer():
-    return Action(0, 0, 0, 0, 0, 0, 0, 55, 0, 4)
-
-
-def Draw():
-    return Action(0, 0, 0, 0, 0, 0, 0, 56, 0, 4)
-
-
-def SetAllianceStatus(Player, Status):
-    Player = EncodePlayer(Player)
-    Status = EncodeAllyStatus(Status)
-    return Action(0, 0, 0, 0, Player, 0, Status, 57, 0, 4)
-
-
-def SetMemory(dest, modtype, value):
-    modtype = EncodeModifier(modtype)
-    return Action(0, 0, 0, 0, EPD(dest), value, 0, 45, modtype, 20)
-
-
-def SetMemoryEPD(dest, modtype, value):
-    dest = EncodePlayer(dest)
-    modtype = EncodeModifier(modtype)
-    return Action(0, 0, 0, 0, dest, value, 0, 45, modtype, 20)
-
-
-def SetNextPtr(trg, dest):
-    return SetMemory(trg + 4, 7, dest)
-
-


eudplib\core\rawtrigger\stockcond.py : 200 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .condition import Condition
-from .constenc import (
-    EncodeComparison,
-    EncodePlayer,
-    EncodeResource,
-    EncodeScore,
-    EncodeSwitchState,
-    Kills  # for __calls__ binding
-)
-
-from .strenc import (
-    EncodeLocation,
-    EncodeSwitch,
-    EncodeUnit,
-)
-
-from ...utils import EPD
-
-
-def CountdownTimer(Comparison, Time):
-    """Checks countdown timer.
-
-    Example::
-
-        CountdownTimer(AtLeast, 10)
-
-    Memory Layout::
-
-        0000 0000 0000 0000 TTTT TTTT 0000 CP01 0000
-
-        T : Time, CP : Comparison.
-    """
-    Comparison = EncodeComparison(Comparison)
-    return Condition(0, 0, Time, 0, Comparison, 1, 0, 0)
-
-
-def Command(Player, Comparison, Number, Unit):
-    """[Player] commands [Comparison] [Number] [Unit].
-
-    Example::
-        Command(Player1, AtLeast, 30, "Terran Marine")
-
-
-    """
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    Unit = EncodeUnit(Unit)
-    return Condition(0, Player, Number, Unit, Comparison, 2, 0, 0)
-
-
-def Bring(Player, Comparison, Number, Unit, Location):
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    Unit = EncodeUnit(Unit)
-    Location = EncodeLocation(Location)
-    return Condition(Location, Player, Number, Unit, Comparison, 3, 0, 0)
-
-
-def Accumulate(Player, Comparison, Number, ResourceType):
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    ResourceType = EncodeResource(ResourceType)
-    return Condition(0, Player, Number, 0, Comparison, 4, ResourceType, 0)
-
-
-# 'Kills' is already defined inside constenc, so we just add __call__ method
-# to there instead of creating new function
-def __Kills__internal(Player, Comparison, Number, Unit):
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    Unit = EncodeUnit(Unit)
-    return Condition(0, Player, Number, Unit, Comparison, 5, 0, 0)
-
-
-Kills._internalf = __Kills__internal
-
-
-def CommandMost(Unit):
-    Unit = EncodeUnit(Unit)
-    return Condition(0, 0, 0, Unit, 0, 6, 0, 0)
-
-
-def CommandMostAt(Unit, Location):
-    Unit = EncodeUnit(Unit)
-    Location = EncodeLocation(Location)
-    return Condition(Location, 0, 0, Unit, 0, 7, 0, 0)
-
-
-def MostKills(Unit):
-    Unit = EncodeUnit(Unit)
-    return Condition(0, 0, 0, Unit, 0, 8, 0, 0)
-
-
-def HighestScore(ScoreType):
-    ScoreType = EncodeScore(ScoreType)
-    return Condition(0, 0, 0, 0, 0, 9, ScoreType, 0)
-
-
-def MostResources(ResourceType):
-    ResourceType = EncodeResource(ResourceType)
-    return Condition(0, 0, 0, 0, 0, 10, ResourceType, 0)
-
-
-def Switch(Switch, State):
-    Switch = EncodeSwitch(Switch)
-    State = EncodeSwitchState(State)
-    return Condition(0, 0, 0, 0, State, 11, Switch, 0)
-
-
-def ElapsedTime(Comparison, Time):
-    Comparison = EncodeComparison(Comparison)
-    return Condition(0, 0, Time, 0, Comparison, 12, 0, 0)
-
-
-def Opponents(Player, Comparison, Number):
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    return Condition(0, Player, Number, 0, Comparison, 14, 0, 0)
-
-
-def Deaths(Player, Comparison, Number, Unit):
-    Player = EncodePlayer(Player)
-    Comparison = EncodeComparison(Comparison)
-    Unit = EncodeUnit(Unit)
-    return Condition(0, Player, Number, Unit, Comparison, 15, 0, 0)
-
-
-def CommandLeast(Unit):
-    Unit = EncodeUnit(Unit)
-    return Condition(0, 0, 0, Unit, 0, 16, 0, 0)
-
-
-def CommandLeastAt(Unit, Location):
-    Unit = EncodeUnit(Unit)
-    Location = EncodeLocation(Location)
-    return Condition(Location, 0, 0, Unit, 0, 17, 0, 0)
-
-
-def LeastKills(Unit):
-    Unit = EncodeUnit(Unit)
-    return Condition(0, 0, 0, Unit, 0, 18, 0, 0)
-
-
-def LowestScore(ScoreType):
-    ScoreType = EncodeScore(ScoreType)
-    return Condition(0, 0, 0, 0, 0, 19, ScoreType, 0)
-
-
-def LeastResources(ResourceType):
-    ResourceType = EncodeResource(ResourceType)
-    return Condition(0, 0, 0, 0, 0, 20, ResourceType, 0)
-
-
-def Score(Player, ScoreType, Comparison, Number):
-    Player = EncodePlayer(Player)
-    ScoreType = EncodeScore(ScoreType)
-    Comparison = EncodeComparison(Comparison)
-    return Condition(0, Player, Number, 0, Comparison, 21, ScoreType, 0)
-
-
-def Always():
-    return Condition(0, 0, 0, 0, 0, 22, 0, 0)
-
-
-def Never():
-    return Condition(0, 0, 0, 0, 0, 23, 0, 0)
-
-
-def Memory(dest, cmptype, value):
-    return Deaths(EPD(dest), cmptype, value, 0)
-
-
-def MemoryEPD(dest, cmptype, value):
-    return Deaths(dest, cmptype, value, 0)
-
-


eudplib\core\rawtrigger\strdict.py : 574 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
-365
-366
-367
-368
-369
-370
-371
-372
-373
-374
-375
-376
-377
-378
-379
-380
-381
-382
-383
-384
-385
-386
-387
-388
-389
-390
-391
-392
-393
-394
-395
-396
-397
-398
-399
-400
-401
-402
-403
-404
-405
-406
-407
-408
-409
-410
-411
-412
-413
-414
-415
-416
-417
-418
-419
-420
-421
-422
-423
-424
-425
-426
-427
-428
-429
-430
-431
-432
-433
-434
-435
-436
-437
-438
-439
-440
-441
-442
-443
-444
-445
-446
-447
-448
-449
-450
-451
-452
-453
-454
-455
-456
-457
-458
-459
-460
-461
-462
-463
-464
-465
-466
-467
-468
-469
-470
-471
-472
-473
-474
-475
-476
-477
-478
-479
-480
-481
-482
-483
-484
-485
-486
-487
-488
-489
-490
-491
-492
-493
-494
-495
-496
-497
-498
-499
-500
-501
-502
-503
-504
-505
-506
-507
-508
-509
-510
-511
-512
-513
-514
-515
-516
-517
-518
-519
-520
-521
-522
-523
-524
-525
-526
-527
-528
-529
-530
-531
-532
-533
-534
-535
-536
-537
-538
-539
-540
-541
-542
-543
-544
-545
-546
-547
-548
-549
-550
-551
-552
-553
-554
-555
-556
-557
-558
-559
-560
-561
-562
-563
-564
-565
-566
-567
-568
-569
-570
-571
-572
-573
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-DefLocationDict = dict(
-    list({"Location %d" % i: i for i in range(255)}.items()) +
-    [('Anywhere', 63)]
-)
-
-DefSwitchDict = {"Switch %d" % i: i for i in range(1, 256)}
-
-# ======================================
-
-DefUnitDict = {
-    "Terran Marine": 0,
-    "Terran Ghost": 1,
-    "Terran Vulture": 2,
-    "Terran Goliath": 3,
-    "Goliath Turret": 4,
-    "Terran Siege Tank (Tank Mode)": 5,
-    "Siege Tank Turret (Tank Mode)": 6,
-    "Terran SCV": 7,
-    "Terran Wraith": 8,
-    "Terran Science Vessel": 9,
-    "Gui Montag (Firebat)": 10,
-    "Terran Dropship": 11,
-    "Terran Battlecruiser": 12,
-    "Spider Mine": 13,
-    "Nuclear Missile": 14,
-    "Terran Civilian": 15,
-    "Sarah Kerrigan (Ghost)": 16,
-    "Alan Schezar (Goliath)": 17,
-    "Alan Schezar Turret": 18,
-    "Jim Raynor (Vulture)": 19,
-    "Jim Raynor (Marine)": 20,
-    "Tom Kazansky (Wraith)": 21,
-    "Magellan (Science Vessel)": 22,
-    "Edmund Duke (Tank Mode)": 23,
-    "Edmund Duke Turret (Tank Mode)": 24,
-    "Edmund Duke (Siege Mode)": 25,
-    "Edmund Duke Turret (Siege Mode)": 26,
-    "Arcturus Mengsk (Battlecruiser)": 27,
-    "Hyperion (Battlecruiser)": 28,
-    "Norad II (Battlecruiser)": 29,
-    "Terran Siege Tank (Siege Mode)": 30,
-    "Siege Tank Turret (Siege Mode)": 31,
-    "Terran Firebat": 32,
-    "Scanner Sweep": 33,
-    "Terran Medic": 34,
-    "Zerg Larva": 35,
-    "Zerg Egg": 36,
-    "Zerg Zergling": 37,
-    "Zerg Hydralisk": 38,
-    "Zerg Ultralisk": 39,
-    "Zerg Broodling": 40,
-    "Zerg Drone": 41,
-    "Zerg Overlord": 42,
-    "Zerg Mutalisk": 43,
-    "Zerg Guardian": 44,
-    "Zerg Queen": 45,
-    "Zerg Defiler": 46,
-    "Zerg Scourge": 47,
-    "Torrasque (Ultralisk)": 48,
-    "Matriarch (Queen)": 49,
-    "Infested Terran": 50,
-    "Infested Kerrigan (Infested Terran)": 51,
-    "Unclean One (Defiler)": 52,
-    "Hunter Killer (Hydralisk)": 53,
-    "Devouring One (Zergling)": 54,
-    "Kukulza (Mutalisk)": 55,
-    "Kukulza (Guardian)": 56,
-    "Yggdrasill (Overlord)": 57,
-    "Terran Valkyrie": 58,
-    "Mutalisk Cocoon": 59,
-    "Protoss Corsair": 60,
-    "Protoss Dark Templar (Unit)": 61,
-    "Zerg Devourer": 62,
-    "Protoss Dark Archon": 63,
-    "Protoss Probe": 64,
-    "Protoss Zealot": 65,
-    "Protoss Dragoon": 66,
-    "Protoss High Templar": 67,
-    "Protoss Archon": 68,
-    "Protoss Shuttle": 69,
-    "Protoss Scout": 70,
-    "Protoss Arbiter": 71,
-    "Protoss Carrier": 72,
-    "Protoss Interceptor": 73,
-    "Protoss Dark Templar (Hero)": 74,
-    "Zeratul (Dark Templar)": 75,
-    "Tassadar/Zeratul (Archon)": 76,
-    "Fenix (Zealot)": 77,
-    "Fenix (Dragoon)": 78,
-    "Tassadar (Templar)": 79,
-    "Mojo (Scout)": 80,
-    "Warbringer (Reaver)": 81,
-    "Gantrithor (Carrier)": 82,
-    "Protoss Reaver": 83,
-    "Protoss Observer": 84,
-    "Protoss Scarab": 85,
-    "Danimoth (Arbiter)": 86,
-    "Aldaris (Templar)": 87,
-    "Artanis (Scout)": 88,
-    "Rhynadon (Badlands Critter)": 89,
-    "Bengalaas (Jungle Critter)": 90,
-    "Cargo Ship (Unused)": 91,
-    "Mercenary Gunship (Unused)": 92,
-    "Scantid (Desert Critter)": 93,
-    "Kakaru (Twilight Critter)": 94,
-    "Ragnasaur (Ashworld Critter)": 95,
-    "Ursadon (Ice World Critter)": 96,
-    "Lurker Egg": 97,
-    "Raszagal (Corsair)": 98,
-    "Samir Duran (Ghost)": 99,
-    "Alexei Stukov (Ghost)": 100,
-    "Map Revealer": 101,
-    "Gerard DuGalle (BattleCruiser)": 102,
-    "Zerg Lurker": 103,
-    "Infested Duran (Infested Terran)": 104,
-    "Disruption Web": 105,
-    "Terran Command Center": 106,
-    "Terran Comsat Station": 107,
-    "Terran Nuclear Silo": 108,
-    "Terran Supply Depot": 109,
-    "Terran Refinery": 110,
-    "Terran Barracks": 111,
-    "Terran Academy": 112,
-    "Terran Factory": 113,
-    "Terran Starport": 114,
-    "Terran Control Tower": 115,
-    "Terran Science Facility": 116,
-    "Terran Covert Ops": 117,
-    "Terran Physics Lab": 118,
-    "Starbase (Unused)": 119,
-    "Terran Machine Shop": 120,
-    "Repair Bay (Unused)": 121,
-    "Terran Engineering Bay": 122,
-    "Terran Armory": 123,
-    "Terran Missile Turret": 124,
-    "Terran Bunker": 125,
-    "Norad II (Crashed)": 126,
-    "Ion Cannon": 127,
-    "Uraj Crystal": 128,
-    "Khalis Crystal": 129,
-    "Infested Command Center": 130,
-    "Zerg Hatchery": 131,
-    "Zerg Lair": 132,
-    "Zerg Hive": 133,
-    "Zerg Nydus Canal": 134,
-    "Zerg Hydralisk Den": 135,
-    "Zerg Defiler Mound": 136,
-    "Zerg Greater Spire": 137,
-    "Zerg Queen's Nest": 138,
-    "Zerg Evolution Chamber": 139,
-    "Zerg Ultralisk Cavern": 140,
-    "Zerg Spire": 141,
-    "Zerg Spawning Pool": 142,
-    "Zerg Creep Colony": 143,
-    "Zerg Spore Colony": 144,
-    "Unused Zerg Building1": 145,
-    "Zerg Sunken Colony": 146,
-    "Zerg Overmind (With Shell)": 147,
-    "Zerg Overmind": 148,
-    "Zerg Extractor": 149,
-    "Mature Chrysalis": 150,
-    "Zerg Cerebrate": 151,
-    "Zerg Cerebrate Daggoth": 152,
-    "Unused Zerg Building2": 153,
-    "Protoss Nexus": 154,
-    "Protoss Robotics Facility": 155,
-    "Protoss Pylon": 156,
-    "Protoss Assimilator": 157,
-    "Unused Protoss Building1": 158,
-    "Protoss Observatory": 159,
-    "Protoss Gateway": 160,
-    "Unused Protoss Building2": 161,
-    "Protoss Photon Cannon": 162,
-    "Protoss Citadel of Adun": 163,
-    "Protoss Cybernetics Core": 164,
-    "Protoss Templar Archives": 165,
-    "Protoss Forge": 166,
-    "Protoss Stargate": 167,
-    "Stasis Cell/Prison": 168,
-    "Protoss Fleet Beacon": 169,
-    "Protoss Arbiter Tribunal": 170,
-    "Protoss Robotics Support Bay": 171,
-    "Protoss Shield Battery": 172,
-    "Khaydarin Crystal Formation": 173,
-    "Protoss Temple": 174,
-    "Xel'Naga Temple": 175,
-    "Mineral Field (Type 1)": 176,
-    "Mineral Field (Type 2)": 177,
-    "Mineral Field (Type 3)": 178,
-    "Cave (Unused)": 179,
-    "Cave-in (Unused)": 180,
-    "Cantina (Unused)": 181,
-    "Mining Platform (Unused)": 182,
-    "Independent Command Center (Unused)": 183,
-    "Independent Starport (Unused)": 184,
-    "Independent Jump Gate (Unused)": 185,
-    "Ruins (Unused)": 186,
-    "Khaydarin Crystal Formation (Unused)": 187,
-    "Vespene Geyser": 188,
-    "Warp Gate": 189,
-    "Psi Disrupter": 190,
-    "Zerg Marker": 191,
-    "Terran Marker": 192,
-    "Protoss Marker": 193,
-    "Zerg Beacon": 194,
-    "Terran Beacon": 195,
-    "Protoss Beacon": 196,
-    "Zerg Flag Beacon": 197,
-    "Terran Flag Beacon": 198,
-    "Protoss Flag Beacon": 199,
-    "Power Generator": 200,
-    "Overmind Cocoon": 201,
-    "Dark Swarm": 202,
-    "Floor Missile Trap": 203,
-    "Floor Hatch (Unused)": 204,
-    "Left Upper Level Door": 205,
-    "Right Upper Level Door": 206,
-    "Left Pit Door": 207,
-    "Right Pit Door": 208,
-    "Floor Gun Trap": 209,
-    "Left Wall Missile Trap": 210,
-    "Left Wall Flame Trap": 211,
-    "Right Wall Missile Trap": 212,
-    "Right Wall Flame Trap": 213,
-    "Start Location": 214,
-    "Flag": 215,
-    "Young Chrysalis": 216,
-    "Psi Emitter": 217,
-    "Data Disc": 218,
-    "Khaydarin Crystal": 219,
-    "Mineral Cluster Type 1": 220,
-    "Mineral Cluster Type 2": 221,
-    "Protoss Vespene Gas Orb Type 1": 222,
-    "Protoss Vespene Gas Orb Type 2": 223,
-    "Zerg Vespene Gas Sac Type 1": 224,
-    "Zerg Vespene Gas Sac Type 2": 225,
-    "Terran Vespene Gas Tank Type 1": 226,
-    "Terran Vespene Gas Tank Type 2": 227,
-    "(any unit)": 229,
-    "(men)": 230,
-    "(buildings)": 231,
-    "(factories)": 232
-}
-
-# ======================================
-
-# Data from http://cafe.daum.net/rpgguild/6cWR/158
-# Original data from ScAIEdit
-DefAIScriptDict = {
-    # Custom AI Scripts
-    b'Terran Custom Level': b'TMCu',
-    b'Zerg Custom Level': b'ZMCu',
-    b'Protoss Custom Level': b'PMCu',
-    b'Terran Expansion Custom Level': b'TMCx',
-    b'Zerg Expansion Custom Level': b'ZMCx',
-    b'Protoss Expansion Custom Level': b'PMCx',
-    b'Terran Campaign Easy': b'TLOf',
-    b'Terran Campaign Medium': b'TMED',
-    b'Terran Campaign Difficult': b'THIf',
-    b'Terran Campaign Insane': b'TSUP',
-    b'Terran Campaign Area Town': b'TARE',
-    b'Zerg Campaign Easy': b'ZLOf',
-    b'Zerg Campaign Medium': b'ZMED',
-    b'Zerg Campaign Difficult': b'ZHIf',
-    b'Zerg Campaign Insane': b'ZSUP',
-    b'Zerg Campaign Area Town': b'ZARE',
-    b'Protoss Campaign Easy': b'PLOf',
-    b'Protoss Campaign Medium': b'PMED',
-    b'Protoss Campaign Difficult': b'PHIf',
-    b'Protoss Campaign Insane': b'PSUP',
-    b'Protoss Campaign Area Town': b'PARE',
-    b'Expansion Terran Campaign Easy': b'TLOx',
-    b'Expansion Terran Campaign Medium': b'TMEx',
-    b'Expansion Terran Campaign Difficult': b'THIx',
-    b'Expansion Terran Campaign Insane': b'TSUx',
-    b'Expansion Terran Campaign Area Town': b'TARx',
-    b'Expansion Zerg Campaign Easy': b'ZLOx',
-    b'Expansion Zerg Campaign Medium': b'ZMEx',
-    b'Expansion Zerg Campaign Difficult': b'ZHIx',
-    b'Expansion Zerg Campaign Insane': b'ZSUx',
-    b'Expansion Zerg Campaign Area Town': b'ZARx',
-    b'Expansion Protoss Campaign Easy': b'PLOx',
-    b'Expansion Protoss Campaign Medium': b'PMEx',
-    b'Expansion Protoss Campaign Difficult': b'PHIx',
-    b'Expansion Protoss Campaign Insane': b'PSUx',
-    b'Expansion Protoss Campaign Area Town': b'PARx',
-    b'Send All Units on Strategic Suicide Missions': b'Suic',
-    b'Send All Units on Random Suicide Missions': b'SuiR',
-    b'Switch Computer Player to Rescue Passive': b'Rscu',
-    b'Turn ON Shared Vision for Player 1': b'+Vi0',
-    b'Turn ON Shared Vision for Player 2': b'+Vi1',
-    b'Turn ON Shared Vision for Player 3': b'+Vi2',
-    b'Turn ON Shared Vision for Player 4': b'+Vi3',
-    b'Turn ON Shared Vision for Player 5': b'+Vi4',
-    b'Turn ON Shared Vision for Player 6': b'+Vi5',
-    b'Turn ON Shared Vision for Player 7': b'+Vi6',
-    b'Turn ON Shared Vision for Player 8': b'+Vi7',
-    b'Turn OFF Shared Vision for Player 1': b'-Vi0',
-    b'Turn OFF Shared Vision for Player 2': b'-Vi1',
-    b'Turn OFF Shared Vision for Player 3': b'-Vi2',
-    b'Turn OFF Shared Vision for Player 4': b'-Vi3',
-    b'Turn OFF Shared Vision for Player 5': b'-Vi4',
-    b'Turn OFF Shared Vision for Player 6': b'-Vi5',
-    b'Turn OFF Shared Vision for Player 7': b'-Vi6',
-    b'Turn OFF Shared Vision for Player 8': b'-Vi7',
-    b'Move Dark Templars to Region': b'MvTe',
-    b'Clear Previous Combat Data': b'ClrC',
-    b'Set Player to Enemy': b'Enmy',
-    b'Set Player to Ally  ': b'y   ',
-    b'Value This Area Higher': b'VluA',
-    b'Enter Closest Bunker': b'EnBk',
-    b'Set Generic Command Target': b'StTg',
-    b'Make These Units Patrol': b'StPt',
-    b'Enter Transport': b'EnTr',
-    b'Exit Transport': b'ExTr',
-    b'AI Nuke Here': b'NuHe',
-    b'AI Harass Here': b'HaHe',
-    b'Set Unit Order To: Junk Yard Dog': b'JYDg',
-    b'Disruption Web Here': b'DWHe',
-    b'Recall Here': b'ReHe',
-
-    # StarCraft AI Scripts
-    b'Terran 3 - Zerg Town': b'Ter3',
-    b'Terran 5 - Terran Main Town': b'Ter5',
-    b'Terran 5 - Terran Harvest Town': b'Te5H',
-    b'Terran 6 - Air Attack Zerg': b'Ter6',
-    b'Terran 6 - Ground Attack Zerg': b'Te6b',
-    b'Terran 6 - Zerg Support Town': b'Te6c',
-    b'Terran 7 - Bottom Zerg Town': b'Ter7',
-    b'Terran 7 - Right Zerg Town': b'Te7s',
-    b'Terran 7 - Middle Zerg Town': b'Te7m',
-    b'Terran 8 - Confederate Town': b'Ter8',
-    b'Terran 9 - Light Attack': b'Tr9L',
-    b'Terran 9 - Heavy Attack': b'Tr9H',
-    b'Terran 10 - Confederate Towns': b'Te10',
-    b'Terran 11 - Zerg Town': b'T11z',
-    b'Terran 11 - Lower Protoss Town': b'T11a',
-    b'Terran 11 - Upper Protoss Town': b'T11b',
-    b'Terran 12 - Nuke Town': b'T12N',
-    b'Terran 12 - Phoenix Town': b'T12P',
-    b'Terran 12 - Tank Town': b'T12T',
-    b'Terran 1 - Electronic Distribution': b'TED1',
-    b'Terran 2 - Electronic Distribution': b'TED2',
-    b'Terran 3 - Electronic Distribution': b'TED3',
-    b'Terran 1 - Shareware': b'TSW1',
-    b'Terran 2 - Shareware': b'TSW2',
-    b'Terran 3 - Shareware': b'TSW3',
-    b'Terran 4 - Shareware': b'TSW4',
-    b'Terran 5 - Shareware': b'TSW5',
-    b'Zerg 1 - Terran Town': b'Zer1',
-    b'Zerg 2 - Protoss Town': b'Zer2',
-    b'Zerg 3 - Terran Town': b'Zer3',
-    b'Zerg 4 - Right Terran Town': b'Zer4',
-    b'Zerg 4 - Lower Terran Town': b'Ze4S',
-    b'Zerg 6 - Protoss Town': b'Zer6',
-    b'Zerg 7 - Air Town': b'Zr7a',
-    b'Zerg 7 - Ground Town': b'Zr7g',
-    b'Zerg 7 - Support Town': b'Zr7s',
-    b'Zerg 8 - Scout Town': b'Zer8',
-    b'Zerg 8 - Templar Town': b'Ze8T',
-    b'Zerg 9 - Teal Protoss': b'Zer9',
-    b'Zerg 9 - Left Yellow Protoss': b'Z9ly',
-    b'Zerg 9 - Right Yellow Protoss': b'Z9ry',
-    b'Zerg 9 - Left Orange Protoss': b'Z9lo',
-    b'Zerg 9 - Right Orange Protoss': b'Z9ro',
-    b'Zerg 10 - Left Teal (Attack': b'Z10a',
-    b'Zerg 10 - Right Teal (Support': b'Z10b',
-    b'Zerg 10 - Left Yellow (Support': b'Z10c',
-    b'Zerg 10 - Right Yellow (Attack': b'Z10d',
-    b'Zerg 10 - Red Protoss': b'Z10e',
-    b'Protoss 1 - Zerg Town': b'Pro1',
-    b'Protoss 2 - Zerg Town': b'Pro2',
-    b'Protoss 3 - Air Zerg Town': b'Pr3R',
-    b'Protoss 3 - Ground Zerg Town': b'Pr3G',
-    b'Protoss 4 - Zerg Town': b'Pro4',
-    b'Protoss 5 - Zerg Town Island': b'Pr5I',
-    b'Protoss 5 - Zerg Town Base': b'Pr5B',
-    b'Protoss 7 - Left Protoss Town': b'Pro7',
-    b'Protoss 7 - Right Protoss Town': b'Pr7B',
-    b'Protoss 7 - Shrine Protoss': b'Pr7S',
-    b'Protoss 8 - Left Protoss Town': b'Pro8',
-    b'Protoss 8 - Right Protoss Town': b'Pr8B',
-    b'Protoss 8 - Protoss Defenders': b'Pr8D',
-    b'Protoss 9 - Ground Zerg': b'Pro9',
-    b'Protoss 9 - Air Zerg': b'Pr9W',
-    b'Protoss 9 - Spell Zerg': b'Pr9Y',
-    b'Protoss 10 - Mini-Towns': b'Pr10',
-    b'Protoss 10 - Mini-Town Master': b'P10C',
-    b'Protoss 10 - Overmind Defenders': b'P10o',
-
-    # Brood Wars AI Scripts
-    b'Brood Wars Protoss 1 - Town A': b'PB1A',
-    b'Brood Wars Protoss 1 - Town B': b'PB1B',
-    b'Brood Wars Protoss 1 - Town C': b'PB1C',
-    b'Brood Wars Protoss 1 - Town D': b'PB1D',
-    b'Brood Wars Protoss 1 - Town E': b'PB1E',
-    b'Brood Wars Protoss 1 - Town F': b'PB1F',
-    b'Brood Wars Protoss 2 - Town A': b'PB2A',
-    b'Brood Wars Protoss 2 - Town B': b'PB2B',
-    b'Brood Wars Protoss 2 - Town C': b'PB2C',
-    b'Brood Wars Protoss 2 - Town D': b'PB2D',
-    b'Brood Wars Protoss 2 - Town E': b'PB2E',
-    b'Brood Wars Protoss 2 - Town F': b'PB2F',
-    b'Brood Wars Protoss 3 - Town A': b'PB3A',
-    b'Brood Wars Protoss 3 - Town B': b'PB3B',
-    b'Brood Wars Protoss 3 - Town C': b'PB3C',
-    b'Brood Wars Protoss 3 - Town D': b'PB3D',
-    b'Brood Wars Protoss 3 - Town E': b'PB3E',
-    b'Brood Wars Protoss 3 - Town F': b'PB3F',
-    b'Brood Wars Protoss 4 - Town A': b'PB4A',
-    b'Brood Wars Protoss 4 - Town B': b'PB4B',
-    b'Brood Wars Protoss 4 - Town C': b'PB4C',
-    b'Brood Wars Protoss 4 - Town D': b'PB4D',
-    b'Brood Wars Protoss 4 - Town E': b'PB4E',
-    b'Brood Wars Protoss 4 - Town F': b'PB4F',
-    b'Brood Wars Protoss 5 - Town A': b'PB5A',
-    b'Brood Wars Protoss 5 - Town B': b'PB5B',
-    b'Brood Wars Protoss 5 - Town C': b'PB5C',
-    b'Brood Wars Protoss 5 - Town D': b'PB5D',
-    b'Brood Wars Protoss 5 - Town E': b'PB5E',
-    b'Brood Wars Protoss 5 - Town F': b'PB5F',
-    b'Brood Wars Protoss 6 - Town A': b'PB6A',
-    b'Brood Wars Protoss 6 - Town B': b'PB6B',
-    b'Brood Wars Protoss 6 - Town C': b'PB6C',
-    b'Brood Wars Protoss 6 - Town D': b'PB6D',
-    b'Brood Wars Protoss 6 - Town E': b'PB6E',
-    b'Brood Wars Protoss 6 - Town F': b'PB6F',
-    b'Brood Wars Protoss 7 - Town A': b'PB7A',
-    b'Brood Wars Protoss 7 - Town B': b'PB7B',
-    b'Brood Wars Protoss 7 - Town C': b'PB7C',
-    b'Brood Wars Protoss 7 - Town D': b'PB7D',
-    b'Brood Wars Protoss 7 - Town E': b'PB7E',
-    b'Brood Wars Protoss 7 - Town F': b'PB7F',
-    b'Brood Wars Protoss 8 - Town A': b'PB8A',
-    b'Brood Wars Protoss 8 - Town B': b'PB8B',
-    b'Brood Wars Protoss 8 - Town C': b'PB8C',
-    b'Brood Wars Protoss 8 - Town D': b'PB8D',
-    b'Brood Wars Protoss 8 - Town E': b'PB8E',
-    b'Brood Wars Protoss 8 - Town F': b'PB8F',
-    b'Brood Wars Terran 1 - Town A': b'TB1A',
-    b'Brood Wars Terran 1 - Town B': b'TB1B',
-    b'Brood Wars Terran 1 - Town C': b'TB1C',
-    b'Brood Wars Terran 1 - Town D': b'TB1D',
-    b'Brood Wars Terran 1 - Town E': b'TB1E',
-    b'Brood Wars Terran 1 - Town F': b'TB1F',
-    b'Brood Wars Terran 2 - Town A': b'TB2A',
-    b'Brood Wars Terran 2 - Town B': b'TB2B',
-    b'Brood Wars Terran 2 - Town C': b'TB2C',
-    b'Brood Wars Terran 2 - Town D': b'TB2D',
-    b'Brood Wars Terran 2 - Town E': b'TB2E',
-    b'Brood Wars Terran 2 - Town F': b'TB2F',
-    b'Brood Wars Terran 3 - Town A': b'TB3A',
-    b'Brood Wars Terran 3 - Town B': b'TB3B',
-    b'Brood Wars Terran 3 - Town C': b'TB3C',
-    b'Brood Wars Terran 3 - Town D': b'TB3D',
-    b'Brood Wars Terran 3 - Town E': b'TB3E',
-    b'Brood Wars Terran 3 - Town F': b'TB3F',
-    b'Brood Wars Terran 4 - Town A': b'TB4A',
-    b'Brood Wars Terran 4 - Town B': b'TB4B',
-    b'Brood Wars Terran 4 - Town C': b'TB4C',
-    b'Brood Wars Terran 4 - Town D': b'TB4D',
-    b'Brood Wars Terran 4 - Town E': b'TB4E',
-    b'Brood Wars Terran 4 - Town F': b'TB4F',
-    b'Brood Wars Terran 5 - Town A': b'TB5A',
-    b'Brood Wars Terran 5 - Town B': b'TB5B',
-    b'Brood Wars Terran 5 - Town C': b'TB5C',
-    b'Brood Wars Terran 5 - Town D': b'TB5D',
-    b'Brood Wars Terran 5 - Town E': b'TB5E',
-    b'Brood Wars Terran 5 - Town F': b'TB5F',
-    b'Brood Wars Terran 6 - Town A': b'TB6A',
-    b'Brood Wars Terran 6 - Town B': b'TB6B',
-    b'Brood Wars Terran 6 - Town C': b'TB6C',
-    b'Brood Wars Terran 6 - Town D': b'TB6D',
-    b'Brood Wars Terran 6 - Town E': b'TB6E',
-    b'Brood Wars Terran 6 - Town F': b'TB6F',
-    b'Brood Wars Terran 7 - Town A': b'TB7A',
-    b'Brood Wars Terran 7 - Town B': b'TB7B',
-    b'Brood Wars Terran 7 - Town C': b'TB7C',
-    b'Brood Wars Terran 7 - Town D': b'TB7D',
-    b'Brood Wars Terran 7 - Town E': b'TB7E',
-    b'Brood Wars Terran 7 - Town F': b'TB7F',
-    b'Brood Wars Terran 8 - Town A': b'TB8A',
-    b'Brood Wars Terran 8 - Town B': b'TB8B',
-    b'Brood Wars Terran 8 - Town C': b'TB8C',
-    b'Brood Wars Terran 8 - Town D': b'TB8D',
-    b'Brood Wars Terran 8 - Town E': b'TB8E',
-    b'Brood Wars Terran 8 - Town F': b'TB8F',
-    b'Brood Wars Zerg 1 - Town A': b'ZB1A',
-    b'Brood Wars Zerg 1 - Town B': b'ZB1B',
-    b'Brood Wars Zerg 1 - Town C': b'ZB1C',
-    b'Brood Wars Zerg 1 - Town D': b'ZB1D',
-    b'Brood Wars Zerg 1 - Town E': b'ZB1E',
-    b'Brood Wars Zerg 1 - Town F': b'ZB1F',
-    b'Brood Wars Zerg 2 - Town A': b'ZB2A',
-    b'Brood Wars Zerg 2 - Town B': b'ZB2B',
-    b'Brood Wars Zerg 2 - Town C': b'ZB2C',
-    b'Brood Wars Zerg 2 - Town D': b'ZB2D',
-    b'Brood Wars Zerg 2 - Town E': b'ZB2E',
-    b'Brood Wars Zerg 2 - Town F': b'ZB2F',
-    b'Brood Wars Zerg 3 - Town A': b'ZB3A',
-    b'Brood Wars Zerg 3 - Town B': b'ZB3B',
-    b'Brood Wars Zerg 3 - Town C': b'ZB3C',
-    b'Brood Wars Zerg 3 - Town D': b'ZB3D',
-    b'Brood Wars Zerg 3 - Town E': b'ZB3E',
-    b'Brood Wars Zerg 3 - Town F': b'ZB3F',
-    b'Brood Wars Zerg 4 - Town A': b'ZB4A',
-    b'Brood Wars Zerg 4 - Town B': b'ZB4B',
-    b'Brood Wars Zerg 4 - Town C': b'ZB4C',
-    b'Brood Wars Zerg 4 - Town D': b'ZB4D',
-    b'Brood Wars Zerg 4 - Town E': b'ZB4E',
-    b'Brood Wars Zerg 4 - Town F': b'ZB4F',
-    b'Brood Wars Zerg 5 - Town A': b'ZB5A',
-    b'Brood Wars Zerg 5 - Town B': b'ZB5B',
-    b'Brood Wars Zerg 5 - Town C': b'ZB5C',
-    b'Brood Wars Zerg 5 - Town D': b'ZB5D',
-    b'Brood Wars Zerg 5 - Town E': b'ZB5E',
-    b'Brood Wars Zerg 5 - Town F': b'ZB5F',
-    b'Brood Wars Zerg 6 - Town A': b'ZB6A',
-    b'Brood Wars Zerg 6 - Town B': b'ZB6B',
-    b'Brood Wars Zerg 6 - Town C': b'ZB6C',
-    b'Brood Wars Zerg 6 - Town D': b'ZB6D',
-    b'Brood Wars Zerg 6 - Town E': b'ZB6E',
-    b'Brood Wars Zerg 6 - Town F': b'ZB6F',
-    b'Brood Wars Zerg 7 - Town A': b'ZB7A',
-    b'Brood Wars Zerg 7 - Town B': b'ZB7B',
-    b'Brood Wars Zerg 7 - Town C': b'ZB7C',
-    b'Brood Wars Zerg 7 - Town D': b'ZB7D',
-    b'Brood Wars Zerg 7 - Town E': b'ZB7E',
-    b'Brood Wars Zerg 7 - Town F': b'ZB7F',
-    b'Brood Wars Zerg 8 - Town A': b'ZB8A',
-    b'Brood Wars Zerg 8 - Town B': b'ZB8B',
-    b'Brood Wars Zerg 8 - Town C': b'ZB8C',
-    b'Brood Wars Zerg 8 - Town D': b'ZB8D',
-    b'Brood Wars Zerg 8 - Town E': b'ZB8E',
-    b'Brood Wars Zerg 8 - Town F': b'ZB8F',
-    b'Brood Wars Zerg 9 - Town A': b'ZB9A',
-    b'Brood Wars Zerg 9 - Town B': b'ZB9B',
-    b'Brood Wars Zerg 9 - Town C': b'ZB9C',
-    b'Brood Wars Zerg 9 - Town D': b'ZB9D',
-    b'Brood Wars Zerg 9 - Town E': b'ZB9E',
-    b'Brood Wars Zerg 9 - Town F': b'ZB9F',
-    b'Brood Wars Zerg 10 - Town A': b'ZB0A',
-    b'Brood Wars Zerg 10 - Town B': b'ZB0B',
-    b'Brood Wars Zerg 10 - Town C': b'ZB0C',
-    b'Brood Wars Zerg 10 - Town D': b'ZB0D',
-    b'Brood Wars Zerg 10 - Town E': b'ZB0E',
-    b'Brood Wars Zerg 10 - Town F': b'ZB0F',
-}
-
-


eudplib\core\rawtrigger\strenc.py : 86 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..mapdata import (
-    GetLocationIndex,
-    GetStringIndex,
-    GetSwitchIndex,
-    GetUnitIndex
-)
-
-from eudplib import utils as ut
-
-from .strdict import (
-    DefAIScriptDict,
-    DefLocationDict,
-    DefSwitchDict,
-    DefUnitDict
-)
-
-
-def EncodeAIScript(ais):
-    if type(ais) is str:
-        ais = ut.u2b(ais)
-
-    if type(ais) is bytes:
-        ut.ep_assert(len(ais) >= 4, 'AIScript name too short')
-
-        if len(ais) > 4:
-            return ut.b2i4(DefAIScriptDict[ais])
-
-        elif len(ais) == 4:
-            return ut.b2i4(ais)
-
-    else:
-        return ais
-
-
-def _EncodeAny(f, dl, s):
-    try:
-        return f(s)
-
-    except:
-        try:
-            return dl.get(s, s)
-
-        except TypeError:  # unhashable
-            return s
-
-
-def EncodeLocation(loc):
-    return _EncodeAny(lambda s: GetLocationIndex(s) + 1, DefLocationDict, loc)
-
-
-def EncodeString(s):
-    return _EncodeAny(GetStringIndex, {}, s)
-
-
-def EncodeSwitch(sw):
-    return _EncodeAny(GetSwitchIndex, DefSwitchDict, sw)
-
-
-def EncodeUnit(u):
-    return _EncodeAny(GetUnitIndex, DefUnitDict, u)
-
-


eudplib\core\rawtrigger\triggerscope.py : 55 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ...utils import EUDCreateBlock, EUDGetLastBlockOfName, EUDPopBlock
-from ..allocator import Forward
-
-
-def PushTriggerScope():
-    EUDCreateBlock('triggerscope', {
-        'nexttrigger_list': []
-    })
-    return True  # Allow `if PushTriggerScope()` syntax for indent
-
-
-def NextTrigger():
-    fw = Forward()
-    nt_list = EUDGetLastBlockOfName('triggerscope')[1]['nexttrigger_list']
-    nt_list.append(fw)
-    return fw
-
-
-def _RegisterTrigger(trg):
-    nt_list = EUDGetLastBlockOfName('triggerscope')[1]['nexttrigger_list']
-    for fw in nt_list:
-        fw << trg
-    nt_list.clear()
-
-
-def PopTriggerScope():
-    nt_list = EUDPopBlock('triggerscope')[1]['nexttrigger_list']
-    for fw in nt_list:
-        fw << 0
-
-


eudplib\core\rawtrigger\__init__.py : 89 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .rawtriggerdef import Disabled, RawTrigger, GetTriggerCounter
-from .triggerscope import PushTriggerScope, PopTriggerScope, NextTrigger
-from .condition import Condition
-from .action import Action
-from .stockcond import (
-    CountdownTimer, Command, Bring, Accumulate, Kills,
-    CommandMost, CommandMostAt, MostKills, HighestScore, MostResources,
-    Switch, ElapsedTime, Opponents, Deaths, CommandLeast,
-    CommandLeastAt, LeastKills, LowestScore, LeastResources, Score,
-    Always, Never, Memory, MemoryEPD,
-)
-
-from .stockact import (
-    Victory, Defeat, PreserveTrigger, Wait, PauseGame,
-    UnpauseGame, Transmission, PlayWAV, DisplayText, CenterView,
-    CreateUnitWithProperties, SetMissionObjectives, SetSwitch,
-    SetCountdownTimer, RunAIScript, RunAIScriptAt, LeaderBoardControl,
-    LeaderBoardControlAt, LeaderBoardResources, LeaderBoardKills,
-    LeaderBoardScore, KillUnit, KillUnitAt, RemoveUnit, RemoveUnitAt,
-    SetResources, SetScore, MinimapPing, TalkingPortrait, MuteUnitSpeech,
-    UnMuteUnitSpeech, LeaderBoardComputerPlayers, LeaderBoardGoalControl,
-    LeaderBoardGoalControlAt, LeaderBoardGoalResources,
-    LeaderBoardGoalKills, LeaderBoardGoalScore, MoveLocation, MoveUnit,
-    LeaderBoardGreed, SetNextScenario, SetDoodadState, SetInvincibility,
-    CreateUnit, SetDeaths, Order, Comment, GiveUnits, ModifyUnitHitPoints,
-    ModifyUnitEnergy, ModifyUnitShields, ModifyUnitResourceAmount,
-    ModifyUnitHangarCount, PauseTimer, UnpauseTimer, Draw,
-    SetAllianceStatus, SetMemory, SetNextPtr, SetMemoryEPD,
-)
-
-from .constenc import (
-    All, Enemy, Ally, AlliedVictory, AtLeast, AtMost, Exactly, SetTo, Add,
-    Subtract, Move, Patrol, Attack, P1, P2, P3, P4, P5, P6, P7, P8, P9,
-    P10, P11, P12, Player1, Player2, Player3, Player4, Player5, Player6,
-    Player7, Player8, Player9, Player10, Player11, Player12,
-    CurrentPlayer, Foes, Allies, NeutralPlayers, AllPlayers, Force1,
-    Force2, Force3, Force4, NonAlliedVictoryPlayers, Enable, Disable,
-    Toggle, Ore, Gas, OreAndGas, Total, Units, Buildings,
-    UnitsAndBuildings, Kills, Razings, KillsAndRazings, Custom, Set,
-    Clear, Random, Cleared,
-
-# encoders
-    EncodeAllyStatus,
-    EncodeComparison,
-    EncodeCount,
-    EncodeModifier,
-    EncodeOrder,
-    EncodePlayer,
-    EncodeProperty,
-    EncodePropState,
-    EncodeResource,
-    EncodeScore,
-    EncodeSwitchAction,
-    EncodeSwitchState,
-)
-
-from .strenc import (
-    EncodeAIScript,
-    EncodeLocation,
-    EncodeString,
-    EncodeSwitch,
-    EncodeUnit,
-)
-
-


eudplib\core\variable\eudlv.py : 41 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..eudobj import Db
-from ...utils import i2b4
-from .vbase import VariableBase
-
-
-class EUDLightVariable(VariableBase):
-    def __init__(self, initvalue=0):
-        super().__init__()
-        self._memaddr = Db(i2b4(initvalue))
-
-    def getValueAddr(self):
-        return self._memaddr
-
-    def __hash__(self):
-        return id(self)
-
-


eudplib\core\variable\eudv.py : 475 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
-365
-366
-367
-368
-369
-370
-371
-372
-373
-374
-375
-376
-377
-378
-379
-380
-381
-382
-383
-384
-385
-386
-387
-388
-389
-390
-391
-392
-393
-394
-395
-396
-397
-398
-399
-400
-401
-402
-403
-404
-405
-406
-407
-408
-409
-410
-411
-412
-413
-414
-415
-416
-417
-418
-419
-420
-421
-422
-423
-424
-425
-426
-427
-428
-429
-430
-431
-432
-433
-434
-435
-436
-437
-438
-439
-440
-441
-442
-443
-444
-445
-446
-447
-448
-449
-450
-451
-452
-453
-454
-455
-456
-457
-458
-459
-460
-461
-462
-463
-464
-465
-466
-467
-468
-469
-470
-471
-472
-473
-474
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import weakref
-import traceback
-
-from .. import rawtrigger as bt
-from ..allocator import (
-    Evaluate,
-    Forward,
-    ConstExpr,
-    IsConstExpr
-)
-from ...utils import (
-    FlattenList,
-    EPD,
-    List2Assignable,
-    unProxy,
-    ep_assert
-)
-from .vbase import VariableBase
-from .vbuf import GetCurrentVariableBuffer
-
-
-# Unused variable don't need to be allocated.
-class VariableTriggerForward(ConstExpr):
-
-    def __init__(self, initval):
-        super().__init__(self)
-        self._vdict = weakref.WeakKeyDictionary()
-        self._initval = initval
-
-    def Evaluate(self):
-        evb = GetCurrentVariableBuffer()
-        if evb not in self._vdict:
-            self._vdict[evb] = evb.CreateVarTrigger(self._initval)
-
-        return Evaluate(self._vdict[evb])
-
-
-class EUDVariable(VariableBase):
-
-    '''
-    Full variable.
-    '''
-
-    def __init__(self, initval=0):
-        self._vartrigger = VariableTriggerForward(initval)
-        self._varact = self._vartrigger + (8 + 320)
-
-    def GetVTable(self):
-        return self._vartrigger
-
-    def getValueAddr(self):
-        return self._varact + 20
-
-    def __hash__(self):
-        return id(self)
-
-    # -------
-
-    def QueueAssignTo(self, dest):
-        try:
-            dest = EPD(dest.getValueAddr())
-        except AttributeError:
-            pass
-
-        return [
-            bt.SetDeaths(EPD(self._varact + 16), bt.SetTo, dest, 0),
-            bt.SetDeaths(EPD(self._varact + 24), bt.SetTo, 0x072D0000, 0),
-        ]
-
-    def QueueAddTo(self, dest):
-        try:
-            dest = EPD(dest.getValueAddr())
-        except AttributeError:
-            pass
-
-        return [
-            bt.SetDeaths(EPD(self._varact + 16), bt.SetTo, dest, 0),
-            bt.SetDeaths(EPD(self._varact + 24), bt.SetTo, 0x082D0000, 0),
-        ]
-
-    def QueueSubtractTo(self, dest):
-        try:
-            dest = EPD(dest.getValueAddr())
-        except AttributeError:
-            pass
-
-        return [
-            bt.SetDeaths(EPD(self._varact + 16), bt.SetTo, dest, 0),
-            bt.SetDeaths(EPD(self._varact + 24), bt.SetTo, 0x092D0000, 0),
-        ]
-
-    # -------
-
-    def Assign(self, other):
-        SeqCompute((
-            (self, bt.SetTo, other),
-        ))
-
-    def __lshift__(self, other):
-        self.Assign(other)
-        return self
-
-    def __iadd__(self, other):
-        SeqCompute(((self, bt.Add, other),))
-        return self
-
-    def __isub__(self, other):
-        self << self - other
-        return self
-
-    # -------
-
-    def __add__(self, other):
-        t = EUDVariable()
-        SeqCompute([
-            (t, bt.SetTo, self),
-            (t, bt.Add, other)
-        ])
-        return t
-
-    def __radd__(self, other):
-        return self + other
-
-    def __sub__(self, other):
-        t = EUDVariable()
-
-        SeqCompute([
-            (t, bt.SetTo, 0xffffffff),
-            (t, bt.Subtract, other),
-            (t, bt.Add, 1),
-            (t, bt.Add, self),
-        ])
-        return t
-
-    def __rsub__(self, other):
-        t = EUDVariable()
-        SeqCompute([
-            (t, bt.SetTo, 0xffffffff),
-            (t, bt.Subtract, self),
-            (t, bt.Add, 1),
-            (t, bt.Add, other),
-        ])
-        return t
-
-    def __neg__(self):
-        return 0 - self
-
-    def __invert__(self):
-        t = EUDVariable()
-        SeqCompute([
-            (t, bt.SetTo, 0xffffffff),
-            (t, bt.Subtract, self)
-        ])
-        return t
-
-    # -------
-
-    def __eq__(self, other):
-        if IsConstExpr(other):
-            return self.Exactly(other)
-
-        else:
-            return (self - other).Exactly(0)
-
-    def __ne__(self, other):
-        return (self - other).AtLeast(1)
-
-    def __le__(self, other):
-        if IsConstExpr(other):
-            return self.AtMost(other)
-
-        else:
-            t = EUDVariable()
-            SeqCompute((
-                (t, bt.SetTo, self),
-                (t, bt.Subtract, other)
-            ))
-            return t.Exactly(0)
-
-    def __ge__(self, other):
-        if IsConstExpr(other):
-            return self.AtLeast(other)
-
-        else:
-            t = EUDVariable()
-            SeqCompute((
-                (t, bt.SetTo, other),
-                (t, bt.Subtract, self)
-            ))
-            return t.Exactly(0)
-
-    def __lt__(self, other):
-        if isinstance(other, int) and other <= 0:
-            print('[Warning] No unsigned number can be leq than %d' % other)
-            traceback.print_stack()
-            return [bt.Never()]  # No unsigned number is less than 0
-
-        if IsConstExpr(other):
-            return self.AtMost(other - 1)
-
-        else:
-            t = EUDVariable()
-            SeqCompute((
-                (t, bt.SetTo, 1),
-                (t, bt.Add, self),
-                (t, bt.Subtract, other)
-            ))
-            return t.Exactly(0)
-
-    def __gt__(self, other):
-        if isinstance(other, int) and other >= 0xFFFFFFFF:
-            print('[Warning] No unsigned int can be greater than %d' % other)
-            traceback.print_stack()
-            return [bt.Never()]  # No unsigned number is less than 0
-
-        if IsConstExpr(other):
-            return self.AtLeast(other + 1)
-
-        else:
-            t = EUDVariable()
-            SeqCompute((
-                (t, bt.SetTo, self),
-                (t, bt.Subtract, other)
-            ))
-            return t.AtLeast(1)
-
-    # operator placeholders
-    def __mul__(self, a):
-        pass
-
-    def __rmul__(self, a):
-        pass
-
-    def __imul__(self, a):
-        pass
-
-    def __floordiv__(self, a):
-        raise NotImplementedError('')
-
-    def __rfloordiv__(self, a):
-        pass
-
-    def __ifloordiv__(self, a):
-        pass
-
-    def __mod__(self, a):
-        pass
-
-    def __rmod__(self, a):
-        pass
-
-    def __imod__(self, a):
-        pass
-
-    def __and__(self, a):
-        pass
-
-    def __rand__(self, a):
-        pass
-
-    def __iand__(self, a):
-        pass
-
-    def __or__(self, a):
-        pass
-
-    def __ror__(self, a):
-        pass
-
-    def __ior__(self, a):
-        pass
-
-    def __xor__(self, a):
-        pass
-
-    def __rxor__(self, a):
-        pass
-
-    def __ixor__(self, a):
-        pass
-
-
-def IsEUDVariable(x):
-    x = unProxy(x)
-    return isinstance(x, EUDVariable)
-
-
-# ---------
-
-
-def VProc(v, actions):
-    nexttrg = Forward()
-
-    bt.RawTrigger(
-        nextptr=v.GetVTable(),
-        actions=[actions] + [bt.SetNextPtr(v.GetVTable(), nexttrg)]
-    )
-
-    nexttrg << bt.NextTrigger()
-
-
-# From vbuffer.py
-def EUDCreateVariables(varn):
-    return List2Assignable([EUDVariable() for _ in range(varn)])
-
-
-# -------
-
-def _GetComputeDest(dst):
-    try:
-        return EPD(dst.getValueAddr())
-    except AttributeError:
-        return dst
-
-
-def _SeqComputeSub(assignpairs):
-    """
-    Subset of SeqCompute with following restrictions
-
-    - Assignment from variable should be after assignment from constant.
-    - Total number of actions should be leq than 64
-    """
-
-    actionlist = []
-
-    # Collect constant-assigning actions
-    const_assigning_index = len(assignpairs)
-
-    for i, assignpair in enumerate(assignpairs):
-        dst, mdt, src = assignpair
-        if IsEUDVariable(src):
-            const_assigning_index = i
-            break
-
-    for dst, mdt, src in assignpairs[0:const_assigning_index]:
-        dst = _GetComputeDest(dst)
-        actionlist.append(bt.SetDeaths(dst, mdt, src, 0))
-
-    # Only constant-assigning function : skip
-    if const_assigning_index == len(assignpairs):
-        bt.RawTrigger(actions=actionlist)
-        return
-
-    #
-    # Rest is for non-constant assigning actions
-    #
-
-    nextptr = None  # nextptr for this rawtrigger
-    vt_nextptr = None  # what to set for nextptr of current vtable
-
-    for dst, mdt, src in assignpairs[const_assigning_index:]:
-        dst = _GetComputeDest(dst)
-
-        if nextptr is None:
-            nextptr = src.GetVTable()
-        else:
-            vt_nextptr << src.GetVTable()
-
-        vt_nextptr = Forward()
-        queuef = {
-            bt.SetTo: EUDVariable.QueueAssignTo,
-            bt.Add: EUDVariable.QueueAddTo,
-            bt.Subtract: EUDVariable.QueueSubtractTo,
-        }[mdt]
-
-        actionlist.append([
-            queuef(src, dst),
-            bt.SetNextPtr(src.GetVTable(), vt_nextptr)
-        ])
-
-    bt.RawTrigger(
-        nextptr=nextptr,
-        actions=actionlist
-    )
-
-    vt_nextptr << bt.NextTrigger()
-
-
-def SeqCompute(assignpairs):
-    # We need dependency map while writing assignment pairs
-    dstvarset = set()
-    srcvarset = set()
-
-    # Sublist of assignments to put in _SeqComputeSub
-    subassignpairs = []
-
-    # Is we collecting constant-assigning pairs?
-    constcollecting = True
-
-    # Number of expected actions.
-    actioncount = 0
-
-    def FlushPairs():
-        nonlocal constcollecting, actioncount
-
-        if actioncount == 0:  # Already flushed before
-            return
-
-        _SeqComputeSub(subassignpairs)
-
-        dstvarset.clear()
-        srcvarset.clear()
-        subassignpairs.clear()
-        constcollecting = True
-        actioncount = 0
-
-    for assignpair in assignpairs:
-        dst, mdt, src = assignpair
-        dst = unProxy(dst)
-        src = unProxy(src)
-
-        # Flush action set before preceeding
-        if IsEUDVariable(src):
-            if src in dstvarset:
-                FlushPairs()
-            elif src in srcvarset:
-                FlushPairs()
-            elif actioncount >= 64 - 3:
-                FlushPairs()
-
-            srcvarset.add(src)
-            constcollecting = False
-            actioncount += 3
-
-        else:
-            if not constcollecting:
-                FlushPairs()
-            elif actioncount >= 64 - 3:
-                FlushPairs()
-
-            actioncount += 1
-
-        subassignpairs.append(assignpair)
-        if IsEUDVariable(dst):
-            dstvarset.add(dst)
-
-    FlushPairs()
-
-
-def SetVariables(srclist, dstlist, mdtlist=None):
-    srclist = FlattenList(srclist)
-    dstlist = FlattenList(dstlist)
-    ep_assert(len(srclist) == len(dstlist), 'Input/output size mismatch')
-
-    if mdtlist is None:
-        mdtlist = [bt.SetTo] * len(srclist)
-
-    sqa = [(src, mdt, dst) for src, dst, mdt in zip(srclist, dstlist, mdtlist)]
-    SeqCompute(sqa)
-
-


eudplib\core\variable\vbase.py : 103 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import rawtrigger as bt
-from eudplib import utils as ut
-
-
-class VariableBase:
-    def __init__(self):
-        pass
-
-    def getValueAddr(self):
-        raise ut.EPError('override')
-
-    # -------
-
-    def AtLeast(self, value):
-        return bt.Memory(self.getValueAddr(), bt.AtLeast, value)
-
-    def AtMost(self, value):
-        return bt.Memory(self.getValueAddr(), bt.AtMost, value)
-
-    def Exactly(self, value):
-        return bt.Memory(self.getValueAddr(), bt.Exactly, value)
-
-    # -------
-
-    def SetNumber(self, value):
-        return bt.SetMemory(self.getValueAddr(), bt.SetTo, value)
-
-    def AddNumber(self, value):
-        return bt.SetMemory(self.getValueAddr(), bt.Add, value)
-
-    def SubtractNumber(self, value):
-        return bt.SetMemory(self.getValueAddr(), bt.Subtract, value)
-
-    # -------
-
-    def Assign(self, value):
-        bt.RawTrigger(actions=[
-            bt.SetMemory(
-                self.getValueAddr(),
-                bt.SetTo,
-                value
-            )
-        ])
-
-    def __lshift__(self, value):
-        self.Assign(value)
-
-    def __iadd__(self, value):
-        bt.RawTrigger(actions=[
-            bt.SetMemory(
-                self.getValueAddr(),
-                bt.Add,
-                value
-            )
-        ])
-        return self
-
-    def __isub__(self, value):
-        bt.RawTrigger(actions=[
-            bt.SetMemory(
-                self.getValueAddr(),
-                bt.Subtract,
-                value
-            )
-        ])
-        return self
-
-    # -------
-
-    def __eq__(self, other):
-        return self.Exactly(other)
-
-    def __le__(self, other):
-        return self.AtMost(other)
-
-    def __ge__(self, other):
-        return self.AtLeast(other)
-
-


eudplib\core\variable\vbuf.py : 82 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..eudobj import EUDObject
-from ..allocator import RegisterCreatePayloadCallback
-
-
-class EUDVarBuffer(EUDObject):
-    """Variable buffer
-
-    40 bytes per variable.
-    """
-
-    def __init__(self):
-        super().__init__()
-
-        self._initvals = []
-
-    def DynamicConstructed(self):
-        return True
-
-    def CreateVarTrigger(self, initval):
-        ret = self + (60 * len(self._initvals))
-        self._initvals.append(initval)
-        return ret
-
-    def GetDataSize(self):
-        return 2408 + 60 * (len(self._initvals) - 1)
-
-    def WritePayload(self, emitbuffer):
-        output = bytearray(2408 + 60 * (len(self._initvals) - 1))
-
-        for i in range(len(self._initvals)):
-            # 'preserve rawtrigger'
-            output[60 * i + 2376:60 * i + 2380] = b'\x04\0\0\0'
-
-        for i, initval in enumerate(self._initvals):
-            heads = 60 * (i - 1) + 352 if i > 0 else 0
-            heade = 60 * i + 348
-            emitbuffer.WriteBytes(output[heads:heade])
-            emitbuffer.WriteDword(initval)
-            # output[60 * i + 320 + 20:60 * i + 320 + 24] = ut.i2b4(initval)
-
-        tails = 60 * (len(self._initvals) - 1) + 352
-        emitbuffer.WriteBytes(output[tails:])
-
-_evb = None
-
-
-def RegisterNewVariableBuffer():
-    global _evb
-    _evb = EUDVarBuffer()
-
-
-def GetCurrentVariableBuffer():
-    return _evb
-
-
-RegisterCreatePayloadCallback(RegisterNewVariableBuffer)
-
-


eudplib\core\variable\__init__.py : 36 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eudv import (
-    EUDVariable,
-    VProc,
-    IsEUDVariable,
-    EUDCreateVariables,
-    SeqCompute,
-    SetVariables,
-)
-
-from .eudlv import EUDLightVariable
-
-


eudplib\ctrlstru\basicstru.py : 68 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .. import trigger as tg
-from eudplib import utils as ut
-
-
-def DoActions(actions, preserved=True):
-    tg.Trigger(actions=ut.FlattenList(actions), preserved=preserved)
-
-
-def EUDJump(nextptr):
-    if isinstance(nextptr, c.EUDVariable):
-        t = c.Forward()
-        c.SeqCompute([(ut.EPD(t + 4), c.SetTo, nextptr)])
-        t << c.RawTrigger()
-    else:
-        c.RawTrigger(nextptr=nextptr)
-
-
-def EUDJumpIf(conditions, ontrue):
-    onfalse = c.Forward()
-    tg.EUDBranch(conditions, ontrue, onfalse)
-    onfalse << c.NextTrigger()
-
-
-def EUDJumpIfNot(conditions, onfalse):
-    ontrue = c.Forward()
-    tg.EUDBranch(conditions, ontrue, onfalse)
-    ontrue << c.NextTrigger()
-
-
-def EUDTernary(conditions, ontrue, onfalse):
-    v = c.EUDVariable()
-    t = c.Forward()
-    end = c.Forward()
-
-    EUDJumpIf(conditions, t)
-    v << onfalse
-    EUDJump(end)
-    t << c.NextTrigger()
-    v << ontrue
-    end << c.NextTrigger()
-    return v
-
-


eudplib\ctrlstru\breakcont.py : 91 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from . import (
-    loopblock as lb,
-    swblock as sb
-)
-
-from .. import utils as ut
-
-
-def EUDContinue():
-    return lb.EUDLoopContinue()
-
-
-def EUDContinueIf(conditions):
-    return lb.EUDLoopContinueIf(conditions)
-
-
-def EUDContinueIfNot(conditions):
-    return lb.EUDLoopContinueIfNot(conditions)
-
-
-def EUDSetContinuePoint():
-    return lb.EUDLoopSetContinuePoint()
-
-
-def EUDIsContinuePointSet():
-    return lb.EUDLoopIsContinuePointSet()
-
-
-# -------
-
-
-def EUDBreak():
-    for block in reversed(ut.EUDGetBlockList()):
-        if lb._IsLoopBlock(block[1]):
-            lb.EUDLoopBreak()
-            return
-        elif sb._IsSwitchBlockId(block[0]):
-            sb.EUDSwitchBreak()
-            return
-
-    raise ut.EPError('No loop/switch block surrounding this code area')
-
-
-def EUDBreakIf(conditions):
-    for block in reversed(ut.EUDGetBlockList()):
-        if lb._IsLoopBlock(block[1]):
-            lb.EUDLoopBreakIf(conditions)
-            return
-        elif sb._IsSwitchBlockId(block[0]):
-            sb.EUDSwitchBreakIf(conditions)
-            return
-
-    raise ut.EPError('No loop/switch block surrounding this code area')
-
-
-def EUDBreakIfNot(conditions):
-    for block in reversed(ut.EUDGetBlockList()):
-        if lb._IsLoopBlock(block[1]):
-            lb.EUDLoopBreakIfNot(conditions)
-            return
-        elif sb._IsSwitchBlockId(block[0]):
-            sb.EUDSwitchBreakIfNot(conditions)
-            return
-
-    raise ut.EPError('No loop/switch block surrounding this code area')
-
-


eudplib\ctrlstru\cshelper.py : 47 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-class CtrlStruOpener:
-
-    def __init__(self, f):
-        self._f = f
-        self._called = False
-
-    def __del__(self):
-        if not self._called:
-            raise RuntimeError(
-                'Control structures must be double-parenthesised.' +
-                ' ex) EUDInfLoop()()')
-
-    def __bool__(self):
-        raise RuntimeError(
-            'Control structures must be double-parenthesised.' +
-            ' ex) EUDInfLoop()()')
-
-    def __call__(self, *args, **kwargs):
-        self._called = True
-        return self._f(*args, **kwargs)
-
-


eudplib\ctrlstru\loopblock.py : 214 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from eudplib import utils as ut
-from .basicstru import (
-    EUDJump,
-    EUDJumpIf,
-    EUDJumpIfNot
-)
-from .cshelper import CtrlStruOpener
-
-
-def _IsLoopBlock(block):
-    return 'contpoint' in block
-
-
-# -------
-
-
-def EUDInfLoop():
-    def _footer():
-        block = {
-            'loopstart': c.NextTrigger(),
-            'loopend': c.Forward(),
-            'contpoint': c.Forward()
-        }
-
-        ut.EUDCreateBlock('infloopblock', block)
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDEndInfLoop():
-    block = ut.EUDPopBlock('infloopblock')[1]
-    if not block['contpoint'].IsSet():
-        block['contpoint'] << block['loopstart']
-    EUDJump(block['loopstart'])
-    block['loopend'] << c.NextTrigger()
-
-
-# -------
-
-
-def EUDLoopN():
-    def _footer(n):
-        vardb = c.Db(4)
-        c.RawTrigger(actions=c.SetMemory(vardb, c.SetTo, n))
-
-        block = {
-            'loopstart': c.NextTrigger(),
-            'loopend': c.Forward(),
-            'contpoint': c.Forward(),
-            'vardb': vardb
-        }
-
-        ut.EUDCreateBlock('loopnblock', block)
-        EUDJumpIf(c.Memory(vardb, c.Exactly, 0), block['loopend'])
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDEndLoopN():
-    block = ut.EUDPopBlock('loopnblock')[1]
-    if not block['contpoint'].IsSet():
-        block['contpoint'] << c.NextTrigger()
-
-    vardb = block['vardb']
-    c.RawTrigger(actions=c.SetMemory(vardb, c.Subtract, 1))
-    EUDJump(block['loopstart'])
-    block['loopend'] << c.NextTrigger()
-
-
-# -------
-
-
-def EUDLoopRange(start, end=None):
-    ut.EUDCreateBlock('looprangeblock', None)
-    if end is None:
-        start, end = 0, start
-
-    v = c.EUDVariable()
-    v << start
-    if EUDWhile()(v < end):
-        yield v
-        EUDLoopSetContinuePoint()
-        v += 1
-    EUDEndWhile()
-    ut.EUDPopBlock('looprangeblock')
-
-
-# -------
-
-
-def EUDWhile():
-    def _header():
-        block = {
-            'loopstart': c.NextTrigger(),
-            'loopend': c.Forward(),
-            'contpoint': c.Forward(),
-        }
-
-        ut.EUDCreateBlock('whileblock', block)
-
-    def _footer(conditions):
-        block = ut.EUDPeekBlock('whileblock')[1]
-        EUDJumpIfNot(conditions, block['loopend'])
-        return True
-
-    _header()
-    return CtrlStruOpener(_footer)
-
-
-def EUDWhileNot():
-    def _header():
-        block = {
-            'loopstart': c.NextTrigger(),
-            'loopend': c.Forward(),
-            'contpoint': c.Forward(),
-        }
-
-        ut.EUDCreateBlock('whileblock', block)
-
-    def _footer(conditions):
-        block = ut.EUDPeekBlock('whileblock')[1]
-        EUDJumpIf(conditions, block['loopend'])
-        return True
-
-    _header()
-    return CtrlStruOpener(_footer)
-
-
-def EUDEndWhile():
-    block = ut.EUDPopBlock('whileblock')[1]
-    if not block['contpoint'].IsSet():
-        block['contpoint'] << block['loopstart']
-    EUDJump(block['loopstart'])
-    block['loopend'] << c.NextTrigger()
-
-
-# -------
-
-
-def _GetLastLoopBlock():
-    for block in reversed(ut.EUDGetBlockList()):
-        if _IsLoopBlock(block[1]):
-            return block
-
-    raise ut.EPError('No loop block surrounding this code area')
-
-
-def EUDLoopContinue():
-    block = _GetLastLoopBlock()[1]
-    EUDJump(block['contpoint'])
-
-
-def EUDLoopContinueIf(conditions):
-    block = _GetLastLoopBlock()[1]
-    EUDJumpIf(conditions, block['contpoint'])
-
-
-def EUDLoopContinueIfNot(conditions):
-    block = _GetLastLoopBlock()[1]
-    EUDJumpIfNot(conditions, block['contpoint'])
-
-
-def EUDLoopIsContinuePointSet():
-    block = _GetLastLoopBlock()[1]
-    return block['contpoint'].IsSet()
-
-
-def EUDLoopSetContinuePoint():
-    block = _GetLastLoopBlock()[1]
-    block['contpoint'] << c.NextTrigger()
-
-
-def EUDLoopBreak():
-    block = _GetLastLoopBlock()[1]
-    EUDJump(block['loopend'])
-
-
-def EUDLoopBreakIf(conditions):
-    block = _GetLastLoopBlock()[1]
-    EUDJumpIf(conditions, block['loopend'])
-
-
-def EUDLoopBreakIfNot(conditions):
-    block = _GetLastLoopBlock()[1]
-    EUDJumpIfNot(conditions, block['loopend'])
-
-


eudplib\ctrlstru\simpleblock.py : 170 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from eudplib import utils as ut
-from .basicstru import EUDJump, EUDJumpIf, EUDJumpIfNot
-from .cshelper import CtrlStruOpener
-
-
-'''
-There are code duplication between EUDIf - EUDIfNot, EUDElseIf - EUDElseIfNot.
-TODO : Remove code duplication if possible.
-'''
-
-
-def EUDIf():
-    def _footer(conditions):
-        block = {
-            'ifend': c.Forward(),
-            'next_elseif': c.Forward()
-        }
-        ut.EUDCreateBlock('ifblock', block)
-
-        EUDJumpIfNot(conditions, block['next_elseif'])
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDIfNot():
-    def _footer(conditions):
-        block = {
-            'ifend': c.Forward(),
-            'next_elseif': c.Forward()
-        }
-        ut.EUDCreateBlock('ifblock', block)
-
-        EUDJumpIf(conditions, block['next_elseif'])
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-# -------
-
-def EUDElseIf():
-    def _header():
-        block = ut.EUDPeekBlock('ifblock')[1]
-        ut.ep_assert(
-            block['next_elseif'] is not None,
-            'Cannot have EUDElseIf after EUDElse'
-        )
-
-        # Finish previous if/elseif block
-        EUDJump(block['ifend'])
-
-        block['next_elseif'] << c.NextTrigger()
-        block['next_elseif'] = c.Forward()
-
-    def _footer(conditions):
-        lb = ut.EUDPeekBlock('ifblock')
-        block = lb[1]
-
-        EUDJumpIfNot(conditions, block['next_elseif'])
-        return True
-
-    _header()
-    return CtrlStruOpener(_footer)
-
-
-def EUDElseIfNot():
-    def _header():
-        block = ut.EUDPeekBlock('ifblock')[1]
-        ut.ep_assert(
-            block['next_elseif'] is not None,
-            'Cannot have EUDElseIfNot after EUDElse'
-        )
-
-        # Finish previous if/elseif block
-        EUDJump(block['ifend'])
-        block['next_elseif'] << c.NextTrigger()
-        block['next_elseif'] = c.Forward()
-
-    def _footer(conditions):
-        block = ut.EUDPeekBlock('ifblock')[1]
-        EUDJumpIf(conditions, block['next_elseif'])
-        return True
-
-    _header()
-    return CtrlStruOpener(_footer)
-
-
-# -------
-
-
-def EUDElse():
-    def _footer():
-        block = ut.EUDPeekBlock('ifblock')[1]
-        ut.ep_assert(
-            block['next_elseif'] is not None,
-            'Cannot have EUDElse after EUDElse'
-        )
-
-        # Finish previous if/elseif block
-        EUDJump(block['ifend'])
-        block['next_elseif'] << c.NextTrigger()
-        block['next_elseif'] = None
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDEndIf():
-    lb = ut.EUDPopBlock('ifblock')
-    block = lb[1]
-
-    # Finalize
-    nei_fw = block['next_elseif']
-    if nei_fw:
-        nei_fw << c.NextTrigger()
-
-    block['ifend'] << c.NextTrigger()
-
-
-# -------
-
-def EUDExecuteOnce():
-    def _footer():
-        block = {
-            'blockend': c.Forward()
-        }
-        ut.EUDCreateBlock('executeonceblock', block)
-
-        tv = c.EUDLightVariable()
-        EUDJumpIf(tv == 1, block['blockend'])
-        tv << 1
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDEndExecuteOnce():
-    lb = ut.EUDPopBlock('executeonceblock')
-    ut.ep_assert(lb[0] == 'executeonceblock', 'Block start/end mismatch')
-    block = lb[1]
-
-    block['blockend'] << c.NextTrigger()
-
-


eudplib\ctrlstru\swblock.py : 142 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .. import trigger as tg
-from eudplib import utils as ut
-from .basicstru import EUDJump, EUDJumpIf, EUDJumpIfNot
-from .cshelper import CtrlStruOpener
-
-
-def _IsSwitchBlockId(idf):
-    return idf == 'swblock'
-
-
-def EUDSwitch(var):
-    block = {
-        'targetvar': var,
-        'casebrlist': {},
-        'defaultbr': c.Forward(),
-        'swend': c.Forward()
-    }
-
-    c.PushTriggerScope()
-    ut.EUDCreateBlock('swblock', block)
-
-    return True
-
-
-def EUDSwitchCase():
-    def _footer(*numbers):
-        for number in numbers:
-            ut.ep_assert(
-                isinstance(number, int) or isinstance(number, c.ConstExpr),
-                'Invalid selector start for EUDSwitch'
-            )
-
-        lb = ut.EUDGetLastBlock()
-        ut.ep_assert(lb[0] == 'swblock', 'Block start/end mismatch')
-        block = lb[1]
-
-        for number in numbers:
-            ut.ep_assert(number not in block['casebrlist'], 'Duplicate cases')
-            block['casebrlist'][number] = c.NextTrigger()
-
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDSwitchDefault():
-    def _footer():
-        lb = ut.EUDGetLastBlock()
-        ut.ep_assert(lb[0] == 'swblock', 'Block start/end mismatch')
-        block = lb[1]
-
-        ut.ep_assert(not block['defaultbr'].IsSet(), 'Duplicate default')
-        block['defaultbr'] << c.NextTrigger()
-
-        return True
-
-    return CtrlStruOpener(_footer)
-
-
-def EUDSwitchBreak():
-    block = ut.EUDGetLastBlockOfName('swblock')[1]
-    EUDJump(block['swend'])
-
-
-def EUDSwitchBreakIf(conditions):
-    block = ut.EUDGetLastBlockOfName('swblock')[1]
-    EUDJumpIf(conditions, block['swend'])
-
-
-def EUDSwitchBreakIfNot(conditions):
-    block = ut.EUDGetLastBlockOfName('swblock')[1]
-    EUDJumpIfNot(conditions, block['swend'])
-
-
-def EUDEndSwitch():
-    lb = ut.EUDPopBlock('swblock')
-    block = lb[1]
-    swend = block['swend']
-    EUDJump(swend)  # Exit switch block
-    c.PopTriggerScope()
-
-    # If default block is not specified, skip it
-    if not block['defaultbr'].IsSet():
-        block['defaultbr'] << swend
-
-    # Create key selector
-    casebrlist = block['casebrlist']
-    defbranch = block['defaultbr']
-    casekeylist = sorted(block['casebrlist'].keys())
-    var = block['targetvar']
-
-    def KeySelector(keys):
-        # Uses simple binary search
-        ret = c.NextTrigger()
-        if len(keys) == 1:  # Only one keys on the list
-            tg.EUDBranch(var == keys[0], casebrlist[keys[0]], defbranch)
-
-        elif len(keys) >= 2:
-            br1 = c.Forward()
-            br2 = c.Forward()
-            midpos = len(keys) // 2
-            midval = keys[midpos]
-            EUDJumpIf(var == midval, casebrlist[midval])
-            tg.EUDBranch(var <= midval, br1, br2)
-            br1 << KeySelector(keys[:midpos])
-            br2 << KeySelector(keys[midpos + 1:])
-
-        else:  # len(keys) == 0
-            return defbranch
-
-        return ret
-
-    KeySelector(casekeylist)
-
-    swend << c.NextTrigger()
-
-


eudplib\ctrlstru\__init__.py : 80 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .cshelper import CtrlStruOpener
-
-from .basicstru import (
-    DoActions,
-    EUDJump,
-    EUDJumpIf,
-    EUDJumpIfNot,
-    EUDTernary,
-)
-
-from .simpleblock import (
-    EUDIf,
-    EUDIfNot,
-    EUDElseIf,
-    EUDElseIfNot,
-    EUDElse,
-    EUDEndIf,
-
-    EUDExecuteOnce,
-    EUDEndExecuteOnce,
-)
-
-from .loopblock import (
-    EUDInfLoop,
-    EUDEndInfLoop,
-
-    EUDLoopN,
-    EUDEndLoopN,
-
-    EUDLoopRange,
-
-    EUDWhile,
-    EUDWhileNot,
-    EUDEndWhile,
-)
-
-from .swblock import (
-    EUDSwitch,
-    EUDSwitchCase,
-    EUDSwitchDefault,
-    EUDEndSwitch,
-)
-
-from .breakcont import (
-    EUDContinue,
-    EUDContinueIf,
-    EUDContinueIfNot,
-    EUDSetContinuePoint,
-    EUDIsContinuePointSet,
-
-    EUDBreak,
-    EUDBreakIf,
-    EUDBreakIfNot
-)
-
-


eudplib\eudlib\eudarray.py : 104 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import collections
-
-from .. import core as c
-from .. import utils as ut
-from .memiof import f_dwread_epd, f_dwwrite_epd
-
-
-class EUDArrayData(c.EUDObject):
-    '''
-    Structure for storing multiple values.
-    '''
-
-    def __init__(self, arr):
-        super().__init__()
-
-        if isinstance(arr, int):
-            arrlen = arr
-            self._datas = [0] * arrlen
-            self._arrlen = arrlen
-
-        else:
-            for i, item in enumerate(arr):
-                ut.ep_assert(c.IsConstExpr(item), 'Invalid item #%d' % i)
-            self._datas = arr
-            self._arrlen = len(arr)
-
-    def GetDataSize(self):
-        return self._arrlen * 4
-
-    def WritePayload(self, buf):
-        for item in self._datas:
-            buf.WriteDword(item)
-
-    # --------
-
-    def GetArraySize(self):
-        """ Get size of array """
-        return self._arrlen
-
-    @c.EUDFuncMethod
-    def get(self, key):
-        return f_dwread_epd(ut.EPD(self) + key)
-
-    def __getitem__(self, key):
-        return self.get(key)
-
-    @c.EUDFuncMethod
-    def set(self, key, item):
-        return f_dwwrite_epd(ut.EPD(self) + key, item)
-
-    def __setitem__(self, key, item):
-        return self.set(key, item)
-
-
-class EUDArray(ut.ExprProxy):
-    def __init__(self, initval):
-        if (
-            isinstance(initval, int) or
-            isinstance(initval, collections.Iterable)
-        ):
-            dataObj = EUDArrayData(initval)
-        else:
-            dataObj = initval
-
-        super().__init__(dataObj)
-        self._epd = ut.EPD(self)
-
-    def get(self, key):
-        return f_dwread_epd(self._epd + key)
-
-    def __getitem__(self, key):
-        return self.get(key)
-
-    def set(self, key, item):
-        return f_dwwrite_epd(self._epd + key, item)
-
-    def __setitem__(self, key, item):
-        return self.set(key, item)
-
-


eudplib\eudlib\eudgrp.py : 72 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-import struct
-
-
-class EUDGrp(c.EUDObject):
-    """Object for GRP
-
-    Starcraft modifies GRP in certain way before it is used ingame. This object
-    emulates that modification so that SC recognizes GRP correctly.
-    """
-    def __init__(self, content):
-        super().__init__()
-        if type(content) is str:
-            content = open(content, 'rb').read()
-        self._content = content
-
-    def Evaluate(self):
-        return c.GetObjectAddr(self) + 2
-
-    def GetDataSize(self):
-        return len(self._content) + 2
-
-    def WritePayload(self, buf):
-        buf.WriteBytes(b'\0\0')  # 2byte padding to align dwords at (*)
-
-        # fill in grp header
-        b = self._content
-        fn, w, h = struct.unpack('<HHH', b[0:6])
-        buf.WriteWord(fn)
-        buf.WriteWord(w)
-        buf.WriteWord(h)
-
-        # fill in grp frame headers table
-        selfaddr = self.Evaluate()
-
-        for i in range(fn):
-            fhoffset = 6 + 8 * i
-            xoff, yoff, w, h, lto = struct.unpack(
-                '<BBBBI', b[fhoffset: fhoffset + 8])
-            buf.WriteByte(xoff)
-            buf.WriteByte(yoff)
-            buf.WriteByte(w)
-            buf.WriteByte(h)
-            buf.WriteDword(lto + selfaddr)  # (*)
-
-        buf.WriteBytes(b[6 + 8 * fn:])
-
-


eudplib\eudlib\eudstack.py : 57 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eudarray import EUDArray
-from .. import core as c
-
-
-class EUDStack(c.EUDStruct):
-    _fields_ = [
-        ('data', EUDArray),
-        'pos'
-    ]
-
-    def __init__(self, size, basetype=None):
-        super().__init__([
-            # data
-            EUDArray(size),
-            0
-        ])
-        self._basetype = basetype
-
-    def push(self, value):
-        self.data[self.pos] = value
-        self.pos += 1
-
-    def pop(self):
-        self.pos -= 1
-        data = self.data[self.pos]
-        if self._basetype:
-            data = self._basetype(data)
-        return data
-
-    def empty(self):
-        return self.pos == 0
-
-


eudplib\eudlib\__init__.py : 35 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .memiof import *
-from .stringf import *
-from .utilf import *
-from .qgcf import *
-from .mathf import *
-
-from .eudarray import EUDArray
-from .eudgrp import EUDGrp
-from .eudstack import EUDStack
-
-


eudplib\eudlib\mathf\atan2.py : 108 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-)
-
-
-# Formula source : http://nghiaho.com/?p=997
-
-@c.EUDFunc
-def f_atan2(y, x):
-    signflags = c.EUDVariable()
-    signflags << 0
-
-    # Check x sign
-    if cs.EUDIf()(x >= 0x80000000):
-        x << -x
-        signflags += 1  # set xsign
-    cs.EUDEndIf()
-
-    # Check y sign
-    if cs.EUDIf()(y >= 0x80000000):
-        y << -y
-        signflags += 2  # set ysign
-    cs.EUDEndIf()
-
-    # Check x/y order
-    if cs.EUDIf()(y >= x):
-        z = c.EUDVariable()
-        # Swap x, y so that y <= x
-        z << x
-        x << y
-        y << z
-        signflags += 4  # set xyabscmp
-    cs.EUDEndIf()
-
-    # To prevent overflow, we limit values of y and x.
-    # atan value is maximized when x = y, then atan_value = 45 * x**3
-    # 45 * x**3 <= 0xFFFFFFFF : x <= 456.99....
-    if cs.EUDIf()(x >= 400):
-        # Normalize below 400
-        divn = x // 400 + 1
-        x //= divn
-        y //= divn
-    cs.EUDEndIf()
-
-    # Calculate arctan value
-    # arctan(z) ~= z * (45 - (z-1) * (14 + 4*z)), 0 <= z <= 1
-    # arctan(y/x) ~= y/x * (45 - (y-x)/x * (14x + 4y)/x))
-    # arctan(y/x) ~= y * (45*x*x - (y-x)(14x+4y)) / (x*x*x)
-    t1 = x * x
-    t2 = y * (45 * t1 - (y - x) * (14 * x + 4 * y))
-    t3 = x * t1
-    atan_value = t2 // t3
-
-    # Translate angles by sign flags
-    #
-    #      |  0 |  1 | xsign          |  0 |  1 | xsign
-    # -----+----+----+-----      -----+----+----+-----
-    #   0  |  0+|180-|             0  | 90-| 90+|
-    # -----+----+----+           -----+----+----+
-    #   1  |360-|180+|             1  |270+|270-|
-    # -----+----+----+           -----+----+----+
-    # ysign|      xyabscmp=0     ysign|      xyabscmp=1
-
-    cs.EUDSwitch(signflags)
-    cs.EUDSwitchCase()(0)  # xsign, ysign, xyabscmp = 0, 0, 0
-    c.EUDReturn(atan_value)
-    cs.EUDSwitchCase()(1)  # xsign, ysign, xyabscmp = 1, 0, 0
-    c.EUDReturn(180 - atan_value)
-    cs.EUDSwitchCase()(2)  # xsign, ysign, xyabscmp = 0, 1, 0
-    c.EUDReturn(360 - atan_value)
-    cs.EUDSwitchCase()(3)  # xsign, ysign, xyabscmp = 1, 1, 0
-    c.EUDReturn(180 + atan_value)
-    cs.EUDSwitchCase()(4)  # xsign, ysign, xyabscmp = 0, 0, 1
-    c.EUDReturn(90 - atan_value)
-    cs.EUDSwitchCase()(5)  # xsign, ysign, xyabscmp = 1, 0, 1
-    c.EUDReturn(90 + atan_value)
-    cs.EUDSwitchCase()(6)  # xsign, ysign, xyabscmp = 0, 1, 1
-    c.EUDReturn(270 + atan_value)
-    cs.EUDSwitchCase()(7)  # xsign, ysign, xyabscmp = 1, 1, 1
-    c.EUDReturn(270 - atan_value)
-    cs.EUDEndSwitch()
-
-


eudplib\eudlib\mathf\lengthdir.py : 111 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import math
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-)
-
-from ..memiof import f_dwread_epd
-
-
-@c.EUDFunc
-def f_lengthdir(length, angle):
-    # sin, cos table
-    clist = []
-    slist = []
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    for i in range(91):
-        cosv = math.floor(math.cos(math.pi / 180 * i) * 65536 + 0.5)
-        sinv = math.floor(math.sin(math.pi / 180 * i) * 65536 + 0.5)
-        clist.append(ut.i2b4(cosv))
-        slist.append(ut.i2b4(sinv))
-
-    cdb = c.Db(b''.join(clist))
-    sdb = c.Db(b''.join(slist))
-
-    # MAIN LOGIC
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    if cs.EUDIf()(angle >= 360):
-        angle << c.f_div(angle, 360)[1]
-    cs.EUDEndIf()
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    ldir_x, ldir_y = c.EUDVariable(), c.EUDVariable()  # cos, sin * 65536
-    # sign of cos, sin
-    csign, ssign = c.EUDLightVariable(), c.EUDLightVariable()
-    tableangle = c.EUDVariable()
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    # get cos, sin from table
-    if cs.EUDIf()(angle <= 89):
-        tableangle << angle
-        csign << 1
-        ssign << 1
-
-    if cs.EUDElseIf()(angle <= 179):
-        tableangle << 180 - angle
-        csign << -1
-        ssign << 1
-
-    if cs.EUDElseIf()(angle <= 269):
-        tableangle << angle - 180
-        csign << -1
-        ssign << -1
-
-    if cs.EUDElse()():
-        tableangle << 360 - angle
-        csign << 1
-        ssign << -1
-
-    cs.EUDEndIf()
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    tablecos = f_dwread_epd(ut.EPD(cdb) + tableangle)
-    tablesin = f_dwread_epd(ut.EPD(sdb) + tableangle)
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    # calculate lengthdir
-    ldir_x << c.f_div(c.f_mul(tablecos, length), 65536)[0]
-    ldir_y << c.f_div(c.f_mul(tablesin, length), 65536)[0]
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    # restore sign of cos, sin
-    if cs.EUDIf()(csign == -1):
-        ldir_x << 0xFFFFFFFF - ldir_x + 1
-    cs.EUDEndIf()
-
-    if cs.EUDIf()(ssign == -1):
-        ldir_y << 0xFFFFFFFF - ldir_y + 1
-    cs.EUDEndIf()
-
-    cs.DoActions(c.SetDeaths(1, c.Add, 1, 0))
-    return ldir_x, ldir_y
-
-


eudplib\eudlib\mathf\sqrt.py : 33 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import core as c
-from ..utilf import EUDBinaryMax
-
-
-@c.EUDFunc
-def f_sqrt(n):
-    return EUDBinaryMax(lambda x: x * x <= n, 0, 0xFFFF)
-
-


eudplib\eudlib\mathf\__init__.py : 29 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .lengthdir import f_lengthdir
-from .atan2 import f_atan2
-from .sqrt import f_sqrt
-
-


eudplib\eudlib\memiof\byterw.py : 268 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-
-from . import dwmemio as dwm
-
-
-_epd, _suboffset = c.EUDCreateVariables(2)
-
-
-class EUDByteReader:
-    """Read byte by byte."""
-
-    def __init__(self):
-        self._dw = c.EUDVariable()
-        self._b = c.EUDCreateVariables(4)
-        self._suboffset = c.EUDVariable()
-        self._offset = c.EUDVariable()
-
-    # -------
-
-    @c.EUDFuncMethod
-    def seekepd(self, epdoffset):
-        """Seek EUDByteReader to specific epd player address"""
-        c.SeqCompute([
-            (self._offset, c.SetTo, epdoffset),
-            (self._suboffset, c.SetTo, 0)
-        ])
-
-        c.SetVariables(self._dw, dwm.f_dwread_epd(epdoffset))
-
-        c.SetVariables([
-            self._b[0],
-            self._b[1],
-            self._b[2],
-            self._b[3],
-        ], dwm.f_dwbreak(self._dw)[2:6])
-
-    @c.EUDFuncMethod
-    def seekoffset(self, offset):
-        """Seek EUDByteReader to specific address"""
-        global _epd, _suboffset
-
-        # convert offset to epd offset & suboffset
-        c.SetVariables([_epd, _suboffset], c.f_div(offset, 4))
-        c.SeqCompute([(_epd, c.Add, -0x58A364 // 4)])
-
-        # seek to epd & set suboffset
-        self.seekepd(_epd)
-        c.SeqCompute([
-            (self._suboffset, c.SetTo, _suboffset)
-        ])
-
-    # -------
-
-    @c.EUDFuncMethod
-    def readbyte(self):
-        """Read byte from current address. Reader will advance by 1 bytes.
-
-        :returns: Read byte
-        """
-        case0, case1, case2, case3, swend = [c.Forward() for _ in range(5)]
-        ret = c.EUDVariable()
-
-        # suboffset == 0
-        case0 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(0), case1)
-        c.SeqCompute([
-            (ret, c.SetTo, self._b[0]),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        # suboffset == 1
-        case1 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(1), case2)
-        c.SeqCompute([
-            (ret, c.SetTo, self._b[1]),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        # suboffset == 2
-        case2 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(2), case3)
-        c.SeqCompute([
-            (ret, c.SetTo, self._b[2]),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        # suboffset == 3
-        # read more dword
-        case3 << c.NextTrigger()
-
-        c.SeqCompute([
-            (ret, c.SetTo, self._b[3]),
-            (self._offset, c.Add, 1),
-            (self._suboffset, c.SetTo, 0)
-        ])
-
-        c.SetVariables(self._dw, dwm.f_dwread_epd(self._offset))
-        c.SetVariables([
-            self._b[0],
-            self._b[1],
-            self._b[2],
-            self._b[3],
-        ], dwm.f_dwbreak(self._dw)[2:6])
-
-        swend << c.NextTrigger()
-        return ret
-
-
-class EUDByteWriter:
-    """Write byte by byte"""
-
-    def __init__(self):
-        self._dw = None
-        self._suboffset = None
-        self._offset = None
-
-        self._dw, self._suboffset, self._offset = c.EUDCreateVariables(3)
-
-        self._b = [c.EUDLightVariable() for _ in range(4)]
-
-        self.secaller = None
-        self.socaller = None
-        self.wbcaller = None
-
-    @c.EUDFuncMethod
-    def seekepd(self, epdoffset):
-        """Seek EUDByteWriter to specific epd player addresss"""
-
-        c.SeqCompute([
-            (self._offset, c.SetTo, epdoffset),
-            (self._suboffset, c.SetTo, 0)
-        ])
-
-        c.SetVariables(self._dw, dwm.f_dwread_epd(epdoffset))
-
-        c.SetVariables([
-            self._b[0],
-            self._b[1],
-            self._b[2],
-            self._b[3],
-        ], dwm.f_dwbreak(self._dw)[2:6])
-
-    @c.EUDFuncMethod
-    def seekoffset(self, offset):
-        """Seek EUDByteWriter to specific address"""
-
-        global _epd, _suboffset
-
-        # convert offset to epd offset & suboffset
-        c.SetVariables([_epd, _suboffset], c.f_div(offset, 4))
-        c.SeqCompute([(_epd, c.Add, (0x100000000 - 0x58A364) // 4)])
-
-        self.seekepd(_epd)
-        c.SeqCompute([
-            (self._suboffset, c.SetTo, _suboffset)
-        ])
-
-    @c.EUDFuncMethod
-    def writebyte(self, byte):
-        """Write byte to current position.
-
-        Write a byte to current position of EUDByteWriter. Writer will advance
-        by 1 byte.
-
-        .. note::
-            Bytes could be buffered before written to memory. After you
-            finished using writebytes, you must call `flushdword` to flush the
-            buffer.
-        """
-
-        case0, case1, case2, case3, swend = [c.Forward() for _ in range(5)]
-
-        case0 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(0), case1)
-        c.SeqCompute([
-            (self._b[0], c.SetTo, byte),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        case1 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(1), case2)
-        c.SeqCompute([
-            (self._b[1], c.SetTo, byte),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        case2 << c.NextTrigger()
-        cs.EUDJumpIfNot(self._suboffset.Exactly(2), case3)
-        c.SeqCompute([
-            (self._b[2], c.SetTo, byte),
-            (self._suboffset, c.Add, 1)
-        ])
-        cs.EUDJump(swend)
-
-        case3 << c.NextTrigger()
-
-        c.SeqCompute([
-            (self._b[3], c.SetTo, byte)
-        ])
-
-        self.flushdword()
-
-        c.SeqCompute([
-            (self._offset, c.Add, 1),
-            (self._suboffset, c.SetTo, 0)
-        ])
-
-        c.SetVariables(self._dw, dwm.f_dwread_epd(self._offset))
-        c.SetVariables([
-            self._b[0],
-            self._b[1],
-            self._b[2],
-            self._b[3],
-        ], dwm.f_dwbreak(self._dw)[2:6])
-
-        swend << c.NextTrigger()
-
-    @c.EUDFuncMethod
-    def flushdword(self):
-        """Flush buffer."""
-        # mux bytes
-        c.RawTrigger(actions=self._dw.SetNumber(0))
-
-        for i in range(7, -1, -1):
-            for j in range(4):
-                c.RawTrigger(
-                    conditions=[
-                        self._b[j].AtLeast(2 ** i)
-                    ],
-                    actions=[
-                        self._b[j].SubtractNumber(2 ** i),
-                        self._dw.AddNumber(2 ** (i + j * 8))
-                    ]
-                )
-
-        dwm.f_dwwrite_epd(self._offset, self._dw)
-
-


eudplib\eudlib\memiof\cpmemio.py : 93 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-)
-
-
-@c.EUDFunc
-def _reader(cpo):
-    ptr, epd = c.EUDVariable(), c.EUDVariable()
-    ptr << 0
-    epd << ut.EPD(0)
-    for i in range(31, -1, -1):
-        c.RawTrigger(
-            conditions=[
-                c.Deaths(c.CurrentPlayer, c.AtLeast, 2**i, 0)
-            ],
-            actions=[
-                c.SetDeaths(c.CurrentPlayer, c.Subtract, 2**i, 0),
-                ptr.AddNumber(2 ** i),
-                epd.AddNumber(2 ** (i - 2)) if i >= 2 else []
-            ]
-        )
-    cs.DoActions(c.SetDeaths(c.CurrentPlayer, c.SetTo, ptr, 0))
-
-    return ptr, epd
-
-
-def f_dwepdread_cp(cpo):
-    if cpo != 0:
-        cs.DoActions(c.SetMemory(0x6509B0, c.Add, cpo))
-    ptr, epd = _reader(cpo)
-    if cpo != 0:
-        cs.DoActions(c.SetMemory(0x6509B0, c.Add, -cpo))
-    return ptr, epd
-
-
-def f_dwread_cp(cpo):
-    return f_dwepdread_cp(cpo)[0]
-
-
-def f_epdread_cp(cpo):
-    return f_dwepdread_cp(cpo)[1]
-
-
-def f_dwwrite_cp(cpo, value):
-    cs.DoActions([
-        c.SetMemory(0x6509B0, c.Add, cpo),
-        c.SetDeaths(c.CurrentPlayer, c.SetTo, value, 0),
-        c.SetMemory(0x6509B0, c.Add, -cpo),
-    ])
-
-
-def f_dwadd_cp(cpo, value):
-    cs.DoActions([
-        c.SetMemory(0x6509B0, c.Add, cpo),
-        c.SetDeaths(c.CurrentPlayer, c.Add, value, 0),
-        c.SetMemory(0x6509B0, c.Add, -cpo),
-    ])
-
-
-def f_dwsubtract_cp(cpo, value):
-    cs.DoActions([
-        c.SetMemory(0x6509B0, c.Add, cpo),
-        c.SetDeaths(c.CurrentPlayer, c.subtract, value, 0),
-        c.SetMemory(0x6509B0, c.Add, -cpo),
-    ])
-
-


eudplib\eudlib\memiof\dwmemio.py : 204 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-)
-
-from .modcurpl import (
-    f_setcurpl,
-    f_getcurpl,
-)
-
-
-@c.EUDFunc
-def f_dwepdread_epd(targetplayer):
-    origcp = f_getcurpl()
-    f_setcurpl(targetplayer)
-
-    ptr, epd = c.EUDVariable(), c.EUDVariable()
-    ptr << 0
-    epd << ut.EPD(0)
-    for i in range(31, -1, -1):
-        c.RawTrigger(
-            conditions=[
-                c.Deaths(c.CurrentPlayer, c.AtLeast, 2**i, 0)
-            ],
-            actions=[
-                c.SetDeaths(c.CurrentPlayer, c.Subtract, 2**i, 0),
-                ptr.AddNumber(2 ** i),
-                epd.AddNumber(2 ** (i - 2)) if i >= 2 else []
-            ]
-        )
-
-    cs.DoActions(c.SetDeaths(c.CurrentPlayer, c.SetTo, ptr, 0))
-    f_setcurpl(origcp)
-
-    return ptr, epd
-
-
-def f_dwread_epd(targetplayer):
-    return f_dwepdread_epd(targetplayer)[0]
-
-
-def f_epdread_epd(targetplayer):
-    return f_dwepdread_epd(targetplayer)[1]
-
-
-# Special flag reading functions
-def f_flagread_epd(targetplayer, *flags, _readerdict={}):
-    flags = tuple(flags)    # Make flags hashable
-
-    if flags in _readerdict:
-        readerf = _readerdict[flags]
-    else:
-        # Create reader function
-        @c.EUDFunc
-        def readerf(targetplayer):
-            origcp = f_getcurpl()
-            f_setcurpl(targetplayer)
-
-            resetteract = c.Forward()
-            flagsv = [c.EUDVariable() for _ in range(len(flags))]
-
-            # All set to 0
-            c.RawTrigger(
-                actions=[
-                    c.SetMemory(resetteract + 20, c.SetTo, 0),
-                    [flagv.SetNumber(0) for flagv in flagsv]
-                ]
-            )
-
-            # Fill flags
-            for i in range(31, -1, -1):
-                c.RawTrigger(
-                    conditions=[
-                        c.Deaths(c.CurrentPlayer, c.AtLeast, 2**i, 0)
-                    ],
-                    actions=[
-                        c.SetDeaths(c.CurrentPlayer, c.Subtract, 2**i, 0),
-                        c.SetMemory(resetteract + 20, c.Add, 2 ** i),
-                        [
-                            flagv.AddNumber(2 ** i)
-                            for j, flagv in enumerate(flagsv)
-                            if flags[j] & (2 ** i)
-                        ]
-                    ]
-                )
-
-            c.RawTrigger(actions=[
-                resetteract << c.SetDeaths(c.CurrentPlayer, c.SetTo, 0, 0)
-            ])
-            f_setcurpl(origcp)
-
-            return flagsv
-
-        _readerdict[flags] = readerf
-
-    return readerf(targetplayer)
-
-
-# Writing functions
-
-def f_dwwrite_epd(targetplayer, value):
-    cs.DoActions(c.SetDeaths(targetplayer, c.SetTo, value, 0))
-
-
-def f_dwadd_epd(targetplayer, value):
-    cs.DoActions(c.SetDeaths(targetplayer, c.Add, value, 0))
-
-
-def f_dwsubtract_epd(targetplayer, value):
-    cs.DoActions(c.SetDeaths(targetplayer, c.Subtract, value, 0))
-
-
-# Dword breaking functions
-@c.EUDFunc
-def f_dwbreak(number):
-    """Get hiword/loword/4byte of dword"""
-    word = c.EUDCreateVariables(2)
-    byte = c.EUDCreateVariables(4)
-
-    # Clear byte[], word[]
-    cs.DoActions([
-        word[0].SetNumber(0),
-        word[1].SetNumber(0),
-        byte[0].SetNumber(0),
-        byte[1].SetNumber(0),
-        byte[2].SetNumber(0),
-        byte[3].SetNumber(0)
-    ])
-
-    for i in range(31, -1, -1):
-        byteidx = i // 8
-        wordidx = i // 16
-        byteexp = i % 8
-        wordexp = i % 16
-
-        c.RawTrigger(
-            conditions=number.AtLeast(2 ** i),
-            actions=[
-                byte[byteidx].AddNumber(2 ** byteexp),
-                word[wordidx].AddNumber(2 ** wordexp),
-                number.SubtractNumber(2 ** i)
-            ]
-        )
-
-    return word[0], word[1], byte[0], byte[1], byte[2], byte[3]
-
-
-@c.EUDFunc
-def f_dwbreak2(number):
-    """Get hiword/loword/4byte of dword"""
-    word = c.EUDCreateVariables(2)
-    byte = c.EUDCreateVariables(4)
-
-    # Clear byte[], word[]
-    cs.DoActions([
-        word[0].SetNumber(0),
-        word[1].SetNumber(0),
-        byte[0].SetNumber(0),
-        byte[1].SetNumber(0),
-        byte[2].SetNumber(0),
-        byte[3].SetNumber(0)
-    ])
-
-    for i in range(31, -1, -1):
-        byteidx = i // 8
-        wordidx = i // 16
-
-        c.RawTrigger(
-            conditions=number.AtLeast(2 ** i),
-            actions=[
-                byte[byteidx].AddNumber(2 ** i),
-                word[wordidx].AddNumber(2 ** i),
-                number.SubtractNumber(2 ** i)
-            ]
-        )
-
-    return word[0], word[1], byte[0], byte[1], byte[2], byte[3]
-
-


eudplib\eudlib\memiof\mblockio.py : 131 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-
-from . import modcurpl as cp
-from . import byterw as bm
-
-
-@c.EUDFunc
-def f_repmovsd_epd(dstepdp, srcepdp, copydwn):
-    epd_diff = dstepdp - srcepdp
-    tempv = c.Forward()
-
-    # Backup original cp.
-    origcp = cp.f_getcurpl()
-
-    cp.f_setcurpl(srcepdp)
-
-    # Set cpmodas.
-    cpmoda1_list = [c.Forward() for _ in range(32)]
-    cpmoda2_list = [c.Forward() for _ in range(32)]
-    cpmoda0_list = [c.Forward(), c.Forward()]
-    cs.DoActions([
-        [c.SetMemory(cpmoda1 + 20, c.SetTo, epd_diff)
-            for cpmoda1 in cpmoda1_list],
-        [c.SetMemory(cpmoda2 + 20, c.SetTo, -epd_diff)
-            for cpmoda2 in cpmoda2_list],
-        [
-            c.SetMemory(cpmoda0_list[0] + 20, c.SetTo, epd_diff),
-            c.SetMemory(cpmoda0_list[1] + 20, c.SetTo, -epd_diff),
-        ]
-    ])
-
-    if cs.EUDWhileNot()(copydwn == 0):
-        cpmoda01, cpmoda02 = cpmoda0_list
-
-        # *dstepdp, tempv = 0
-        c.RawTrigger(
-            actions=[
-                cpmoda01 << c.SetMemory(0x6509B0, c.Add, 0),
-                c.SetDeaths(c.CurrentPlayer, c.SetTo, 0, 0),
-                cpmoda02 << c.SetMemory(0x6509B0, c.Add, 0),
-                c.SetMemory(tempv, c.SetTo, 0),
-            ]
-        )
-
-        for i in range(31, -1, -1):
-            cpmoda1, cpmoda2 = cpmoda1_list[i], cpmoda2_list[i]
-            # if *srcepdp >= 2**i:
-            #     *srcepdp -= 2 ** i
-            #     *dstepdp += 2 ** i
-            #     tempv += 2 ** i
-            c.RawTrigger(
-                conditions=c.Deaths(c.CurrentPlayer, c.AtLeast, 2 ** i, 0),
-                actions=[
-                    c.SetDeaths(c.CurrentPlayer, c.Subtract, 2 ** i, 0),
-                    cpmoda1 << c.SetMemory(0x6509B0, c.Add, 0),
-                    c.SetDeaths(c.CurrentPlayer, c.Add, 2 ** i, 0),
-                    cpmoda2 << c.SetMemory(0x6509B0, c.Add, 0),
-                    c.SetMemory(tempv, c.Add, 2 ** i),
-                ]
-            )
-
-        resetteract = c.Forward()
-        tempv << resetteract + 20
-
-        c.RawTrigger(
-            actions=[
-                resetteract << c.SetDeaths(c.CurrentPlayer, c.SetTo, 0, 0),
-                c.SetMemory(0x6509B0, c.Add, 1),
-                copydwn.SubtractNumber(1),
-            ]
-        )
-
-    cs.EUDEndWhile()
-
-    cp.f_setcurpl(origcp)
-
-
-# -------
-
-
-_br = bm.EUDByteReader()
-_bw = bm.EUDByteWriter()
-
-
-@c.EUDFunc
-def f_memcpy(dst, src, copylen):
-    b = c.EUDVariable()
-
-    _br.seekoffset(src)
-    _bw.seekoffset(dst)
-
-    loopstart = c.NextTrigger()
-    loopend = c.Forward()
-
-    cs.EUDJumpIf(copylen.Exactly(0), loopend)
-
-    c.SetVariables(b, _br.readbyte())
-    _bw.writebyte(b)
-
-    cs.DoActions(copylen.SubtractNumber(1))
-    cs.EUDJump(loopstart)
-
-    loopend << c.NextTrigger()
-    _bw.flushdword()
-
-


eudplib\eudlib\memiof\modcurpl.py : 54 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-)
-
-
-def f_setcurpl(cp):
-    cs.DoActions(c.SetCurrentPlayer(cp))
-
-
-# This function initializes _curpl_checkcond, so should be called at least once
-@c.EUDFunc
-def f_getcurpl():
-    cpcache = c.curpl.GetCPCache()
-    cpcond = c.curpl.cpcacheMatchCond()
-    if cs.EUDIfNot()(cpcond):
-        cpcache << 0
-        for i in range(31, -1, -1):
-            c.RawTrigger(
-                conditions=[c.Memory(0x6509B0, c.AtLeast, 2**i)],
-                actions=[
-                    c.SetMemory(0x6509B0, c.Subtract, 2**i),
-                    cpcache.AddNumber(2**i)
-                ]
-            )
-        cs.DoActions(c.SetCurrentPlayer(cpcache))
-    cs.EUDEndIf()
-    return cpcache
-
-


eudplib\eudlib\memiof\ptrmemio.py : 89 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from . import safedwmemio as dwm
-from . import byterw as brw
-
-# Helper functions
-
-_bw = brw.EUDByteWriter()
-_br = brw.EUDByteReader()
-
-
-def f_dwwrite(ptr, dw):
-    chars = dwm.f_dwbreak(dw)[2:]
-    _bw.seekoffset(ptr)
-    _bw.writebyte(chars[0])
-    _bw.writebyte(chars[1])
-    _bw.writebyte(chars[2])
-    _bw.writebyte(chars[3])
-    _bw.flushdword()
-
-
-def f_wwrite(ptr, w):
-    chars = dwm.f_dwbreak(w)[2:]
-    _bw.seekoffset(ptr)
-    _bw.writebyte(chars[0])
-    _bw.writebyte(chars[1])
-    _bw.flushdword()
-
-
-def f_bwrite(ptr, b):
-    _bw.seekoffset(ptr)
-    _bw.writebyte(b)
-    _bw.flushdword()
-
-
-# -----------------------------
-
-
-def f_dwread(ptr):
-    _br.seekoffset(ptr)
-    chars0 = _br.readbyte()
-    chars1 = _br.readbyte()
-    chars2 = _br.readbyte()
-    chars3 = _br.readbyte()
-    return (
-        chars0 +
-        chars1 * 0x100 +
-        chars2 * 0x10000 +
-        chars3 * 0x1000000
-    )
-
-
-def f_wread(ptr):
-    _br.seekoffset(ptr)
-    chars0 = _br.readbyte()
-    chars1 = _br.readbyte()
-    return (
-        chars0 +
-        chars1 * 0x100
-    )
-
-
-def f_bread(ptr):
-    _br.seekoffset(ptr)
-    return _br.readbyte()
-
-


eudplib\eudlib\memiof\safedwmemio.py : 105 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-from eudplib import utils as ut
-
-
-@c.EUDFunc
-def f_dwepdread_epd_safe(targetplayer):
-    ret, retepd = c.EUDVariable(), c.EUDVariable()
-
-    # Common comparison rawtrigger
-    c.PushTriggerScope()
-    cmpc = c.Forward()
-    cmp_player = cmpc + 4
-    cmp_number = cmpc + 8
-    cmpact = c.Forward()
-
-    cmptrigger = c.Forward()
-    cmptrigger << c.RawTrigger(
-        conditions=[
-            cmpc << c.Memory(0, c.AtMost, 0)
-        ],
-        actions=[
-            cmpact << c.SetMemory(cmptrigger + 4, c.SetTo, 0)
-        ]
-    )
-    cmpact_ontrueaddr = cmpact + 20
-    c.PopTriggerScope()
-
-    # static_for
-    chain1 = [c.Forward() for _ in range(32)]
-    chain2 = [c.Forward() for _ in range(32)]
-
-    # Main logic start
-    c.SeqCompute([
-        (ut.EPD(cmp_player), c.SetTo, targetplayer),
-        (ut.EPD(cmp_number), c.SetTo, 0xFFFFFFFF),
-        (ret, c.SetTo, 0xFFFFFFFF),
-        (retepd, c.SetTo, ut.EPD(0) + 0x3FFFFFFF)
-    ])
-
-    readend = c.Forward()
-
-    for i in range(31, -1, -1):
-        nextchain = chain1[i - 1] if i > 0 else readend
-        if i >= 2:
-            epdsubact = [retepd.AddNumber(-2 ** (i - 2))]
-            epdaddact = [retepd.AddNumber(2 ** (i - 2))]
-        else:
-            epdsubact = []
-            epdaddact = []
-
-        chain1[i] << c.RawTrigger(
-            nextptr=cmptrigger,
-            actions=[
-                c.SetMemory(cmp_number, c.Subtract, 2 ** i),
-                c.SetNextPtr(cmptrigger, chain2[i]),
-                c.SetMemory(cmpact_ontrueaddr, c.SetTo, nextchain),
-                ret.SubtractNumber(2 ** i),
-            ] + epdsubact
-        )
-
-        chain2[i] << c.RawTrigger(
-            actions=[
-                c.SetMemory(cmp_number, c.Add, 2 ** i),
-                ret.AddNumber(2 ** i),
-            ] + epdaddact
-        )
-
-    readend << c.NextTrigger()
-
-    return ret, retepd
-
-
-def f_dwread_epd_safe(targetplayer):
-    return f_dwepdread_epd_safe(targetplayer)[0]
-
-
-def f_epdread_epd_safe(targetplayer):
-    return f_dwepdread_epd_safe(targetplayer)[1]
-
-


eudplib\eudlib\memiof\__init__.py : 82 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .modcurpl import (
-    f_setcurpl,
-    f_getcurpl
-)
-
-
-from .dwmemio import (
-    f_dwepdread_epd,
-    f_dwread_epd,
-    f_epdread_epd,
-
-    f_flagread_epd,
-
-    f_dwwrite_epd,
-    f_dwadd_epd,
-    f_dwsubtract_epd,
-    f_dwbreak,
-    f_dwbreak2,
-)
-
-from .cpmemio import (
-    f_dwepdread_cp,
-    f_dwread_cp,
-    f_epdread_cp,
-
-    f_dwwrite_cp,
-    f_dwadd_cp,
-    f_dwsubtract_cp,
-)
-
-
-from .safedwmemio import (
-    f_dwread_epd_safe,
-    f_epdread_epd_safe,
-    f_dwepdread_epd_safe,
-)
-
-
-from .byterw import (
-    EUDByteReader,
-    EUDByteWriter,
-)
-
-from .ptrmemio import (
-    f_dwwrite,
-    f_wwrite,
-    f_bwrite,
-    f_dwread,
-    f_wread,
-    f_bread,
-)
-
-from .mblockio import (
-    f_repmovsd_epd,
-    f_memcpy,
-)
-
-


eudplib\eudlib\qgcf\qgc.py : 69 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut
-)
-
-from ..memiof import f_dwread_epd, f_memcpy
-
-
-@c.EUDFunc
-def QueueGameCommand(data, size):
-    """Queue game command to packet queue.
-
-    Starcraft periodically boradcasts game packets to other player. Game
-    packets are stored to queue, and this function add data to that queue, so
-    that SC can boradcast it.
-
-    :param data: Data to put in queue
-    :param size: Size of data
-
-    .. note::
-        If packet queue is full, this function fails. This behavior is silent
-        without any warning or error, since this behavior shouldn't happen in
-        common situations. So **Don't use this function too much in a frame.**
-
-    """
-    prov_maxbuffer = f_dwread_epd(ut.EPD(0x57F0D8))
-    cmdqlen = f_dwread_epd(ut.EPD(0x654AA0))
-    if cs.EUDIfNot()(cmdqlen + size + 1 >= prov_maxbuffer):
-        f_memcpy(0x654880 + cmdqlen, data, size)
-        c.SetVariables(ut.EPD(0x654AA0), cmdqlen + size)
-    cs.EUDEndIf()
-
-
-@c.EUDFunc
-def QueueGameCommand_RightClick(xy):
-    """Queue right click action.
-
-    :param xy: (y * 65536) + x, where (x, y) is coordinate for right click.
-    """
-    RightClickCommand = c.Db(b'...\x14XXYY\0\0\xE4\0\x00')
-    c.SetVariables(ut.EPD(RightClickCommand + 4), xy)
-    QueueGameCommand(RightClickCommand + 3, 10)
-
-


eudplib\eudlib\qgcf\__init__.py : 30 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .qgc import (
-    QueueGameCommand,
-    QueueGameCommand_RightClick,
-)
-
-


eudplib\eudlib\stringf\dbstr.py : 187 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-)
-from ..memiof import f_dwread_epd, f_dwwrite_epd
-
-
-class DBString(ut.ExprProxy):
-    """Object for storing single modifiable string.
-
-    Manipluating STR section is hard. DBString stores only one string, so that
-    modifying its structure is substantially easier than modifying entire STR
-    section. You can do anything you would do with normal string with DBString.
-    """
-
-    def __init__(self, content):
-        """Constructor for DBString
-
-        :param content: Initial DBString content / capacity. Capacity of
-            DBString is determined by size of this. If content is integer, then
-            initial capacity and content of DBString will be set to
-            content(int) and empty string.
-
-        :type content: str, bytes, int
-        """
-        if isinstance(content, (int, str, bytes)):
-            super().__init__(DBStringData(content))
-        else:
-            super().__init__(content)
-
-    def GetStringMemoryAddr(self):
-        """Get memory address of DBString content.
-
-        :returns: Memory address of DBString content.
-        """
-        return self + 4
-
-    def GetDisplayAction(self):
-        """DisplayText equivilant for DBString.
-
-        :returns: List of actions for printing DBString content.
-        """
-        resetter = c.Forward()
-        fw = c.Forward()
-        acts = [
-            c.SetMemory(0x5993D4, c.SetTo, self),
-            c.DisplayText(fw),
-            resetter << c.SetMemory(0x5993D4, c.SetTo, 0)
-        ]
-        fw << ExtendedStringIndex_FW(resetter)
-        return acts
-
-class DBStringData(c.EUDObject):
-    """Object containing DBString data
-    """
-
-    def __init__(self, content):
-        """Constructor for DBString
-
-        :param content: Initial DBString content / capacity. Capacity of
-            DBString is determined by size of this. If content is integer, then
-            initial capacity and content of DBString will be set to
-            content(int) and empty string.
-
-        :type content: str, bytes, int
-        """
-        super().__init__()
-        if isinstance(content, int):
-            self.content = bytes(content)
-        else:
-            self.content = ut.u2b(content)
-
-    def GetDataSize(self):
-        return len(self.content) + 5
-
-    def WritePayload(self, pbuf):
-        pbuf.WriteBytes(b'\x01\x00\x04\x00')
-        pbuf.WriteBytes(self.content)
-        pbuf.WriteByte(0)
-
-
-class ExtendedStringIndex_FW(c.ConstExpr):
-
-    def __init__(self, resetter):
-        super().__init__(self)
-        self._resetter = resetter
-
-    def Evaluate(self):
-        _RegisterResetterAction(self._resetter)
-        return c.toRlocInt(1)
-
-
-_resetteracts = set()
-
-
-def RCPC_ResetActionSet():
-    _resetteracts.clear()
-
-
-c.RegisterCreatePayloadCallback(RCPC_ResetActionSet)
-
-
-def _RegisterResetterAction(resetteract):
-    _resetteracts.add(resetteract)
-
-
-class ResetterBuffer(c.EUDObject):
-
-    def __init__(self):
-        super().__init__()
-
-    def GetDataSize(self):
-        return (len(_resetteracts) + 1) * 4
-
-    def WritePayload(self, pbuf):
-        for ra in _resetteracts:
-            pbuf.WriteDword(ut.EPD(ra + 20))
-        pbuf.WriteDword(0xFFFFFFFF)
-
-
-_extstr_dict = {}
-
-
-def DisplayExtText(text):
-    """Equivilant to DisplayText, but doesn't use string table to store text.
-
-    :param text: Text to display.
-    :type text: str or bytes
-
-    .. note:: You need to call `f_initextstr` before using DisplayExtText.
-    """
-    text = ut.u2b(text)
-    if text not in _extstr_dict:
-        _extstr_dict[text] = DBString(text)
-    return _extstr_dict[text].GetDisplayAction()
-
-
-def _f_initextstr():
-    """(internal)Initialize DBString system."""
-    rb = ResetterBuffer()
-    ptr, v = c.EUDVariable(), c.EUDVariable()
-    ptr << ut.EPD(rb)
-    origstrptr = f_dwread_epd(ut.EPD(0x5993D4))
-
-    if cs.EUDInfLoop()():
-        v << f_dwread_epd(ptr)
-        cs.EUDBreakIf(v == 0xFFFFFFFF)
-        f_dwwrite_epd(v, origstrptr)
-        ptr += 1
-
-    cs.EUDEndInfLoop()
-
-
-def f_initextstr():
-    """This function does nothing.
-
-    .. warning::
-        This function is deprecated.
-    """
-    pass
-
-


eudplib\eudlib\stringf\eudprint.py : 182 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-)
-
-from .rwcommon import br1, bw1
-from .dbstr import DBString
-
-
-@c.EUDFunc
-def f_dbstr_addstr(dst, src):
-    """Print string as string to dst. Same as strcpy except of return value.
-
-    :param dst: Destination address (Not EPD player)
-    :param src: Source address (Not EPD player)
-
-    :returns: dst + strlen(src)
-    """
-    b = c.EUDVariable()
-
-    br1.seekoffset(src)
-    bw1.seekoffset(dst)
-
-    if cs.EUDInfLoop()():
-        c.SetVariables(b, br1.readbyte())
-        bw1.writebyte(b)
-        cs.EUDBreakIf(b == 0)
-        dst += 1
-    cs.EUDEndInfLoop()
-
-    bw1.flushdword()
-
-    return dst
-
-
-@c.EUDFunc
-def f_dbstr_adddw(dst, number):
-    """Print number as string to dst.
-
-    :param dst: Destination address (Not EPD player)
-    :param number: DWORD to print
-
-    :returns: dst + strlen(itoa(number))
-    """
-    bw1.seekoffset(dst)
-
-    skipper = [c.Forward() for _ in range(9)]
-    ch = [0] * 10
-
-    # Get digits
-    for i in range(10):
-        number, ch[i] = c.f_div(number, 10)
-        if i != 9:
-            cs.EUDJumpIf(number == 0, skipper[i])
-
-    # print digits
-    for i in range(9, -1, -1):
-        if i != 9:
-            skipper[i] << c.NextTrigger()
-        bw1.writebyte(ch[i] + b'0'[0])
-        dst += 1
-
-    bw1.writebyte(0)  # EOS
-    bw1.flushdword()
-
-    return dst
-
-
-@c.EUDFunc
-def f_dbstr_addptr(dst, number):
-    """Print number as string to dst.
-
-    :param dst: Destination address (Not EPD player)
-    :param number: DWORD to print
-
-    :returns: dst + strlen(itoa(number))
-    """
-    bw1.seekoffset(dst)
-    ch = [0] * 8
-
-    # Get digits
-    for i in range(8):
-        number, ch[i] = c.f_div(number, 16)
-
-    # print digits
-    for i in range(7, -1, -1):
-        if cs.EUDIf()(ch[i] <= 9):
-            bw1.writebyte(ch[i] + b'0'[0])
-        if cs.EUDElse()():
-            bw1.writebyte(ch[i] + (b'A'[0] - 10))
-        cs.EUDEndIf()
-        dst += 1
-
-    bw1.writebyte(0)  # EOS
-    bw1.flushdword()
-
-    return dst
-
-
-class hptr:
-    def __init__(self, value):
-        self._value = value
-
-
-def f_dbstr_print(dst, *args):
-    """Print multiple string / number to dst.
-
-    :param dst: Destination address (Not EPD player)
-    :param args: Things to print
-
-    """
-    if isinstance(dst, DBString):
-        dst = dst.GetStringMemoryAddr()
-
-    args = ut.FlattenList(args)
-    for arg in args:
-        if isinstance(arg, bytes):
-            dst = f_dbstr_addstr(dst, c.Db(arg + b'\0'))
-        elif isinstance(arg, str):
-            dst = f_dbstr_addstr(dst, c.Db(ut.u2b(arg) + b'\0'))
-        elif isinstance(arg, DBString):
-            dst = f_dbstr_addstr(dst, arg.GetStringMemoryAddr())
-        elif isinstance(arg, int):
-            # int and c.EUDVariable should act the same if possible.
-            # EUDVariable has a value of 32bit unsigned integer.
-            # So we adjust arg to be in the same range.
-            dst = f_dbstr_addstr(dst, c.Db(
-                ut.u2b(str(arg & 0xFFFFFFFF)) + b'\0'))
-        elif isinstance(arg, c.EUDVariable):
-            dst = f_dbstr_adddw(dst, arg)
-        elif isinstance(arg, hptr):
-            dst = f_dbstr_addptr(dst, arg._value)
-        else:
-            raise ut.EPError(
-                'Object wit unknown parameter type %s given to f_eudprint.'
-                % type(arg)
-            )
-
-    return dst
-
-
-_printf_buffer = DBString(8192)
-
-
-def f_simpleprint(*args, spaced=True):
-    # Add spaces between arguments
-    if spaced:
-        spaced_args = []
-        for arg in args:
-            spaced_args.extend([arg, ' '])
-        args = spaced_args[:-1]
-
-    # Print
-    f_dbstr_print(_printf_buffer, *args)
-    cs.DoActions(_printf_buffer.GetDisplayAction())
-
-


eudplib\eudlib\stringf\rwcommon.py : 34 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..memiof import byterw as bm
-
-br1 = bm.EUDByteReader()
-br2 = bm.EUDByteReader()
-br3 = bm.EUDByteReader()
-bw1 = bm.EUDByteWriter()
-bw2 = bm.EUDByteWriter()
-bw3 = bm.EUDByteWriter()
-
-


eudplib\eudlib\stringf\strfunc.py : 75 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-
-from .rwcommon import br1, br2, bw1
-
-
-@c.EUDFunc
-def f_strcpy(dst, src):
-    '''
-    Strcpy equivilant in eudplib. Copy C-style string.
-
-    :param dst: Destination address (Not EPD player)
-    :param src: Source address (Not EPD player)
-
-    :return: dst
-    '''
-    b = c.EUDVariable()
-
-    br1.seekoffset(src)
-    bw1.seekoffset(dst)
-
-    if cs.EUDInfLoop()():
-        c.SetVariables(b, br1.readbyte())
-        bw1.writebyte(b)
-        cs.EUDBreakIf(b == 0)
-    cs.EUDEndInfLoop()
-
-    bw1.flushdword()
-
-    return dst
-
-
-@c.EUDFunc
-def f_strcmp(s1, s2):
-    br1.seekoffset(s1)
-    br2.seekoffset(s2)
-
-    if cs.EUDInfLoop()():
-        ch1 = br1.readbyte()
-        ch2 = br2.readbyte()
-        if cs.EUDIf()(ch1 == ch2):
-            if cs.EUDIf()(ch1 == 0):
-                c.EUDReturn(0)
-            cs.EUDEndIf()
-            cs.EUDContinue()
-        if cs.EUDElse()():
-            c.EUDReturn(ch1 - ch2)
-        cs.EUDEndIf()
-    cs.EUDEndInfLoop()
-
-


eudplib\eudlib\stringf\__init__.py : 40 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .dbstr import DBString, DisplayExtText, f_initextstr
-from .strfunc import (
-    f_strcpy,
-    f_strcmp,
-)
-
-from .eudprint import (
-    f_dbstr_adddw,
-    f_dbstr_addptr,
-    f_dbstr_addstr,
-    hptr,
-    f_dbstr_print,
-    f_simpleprint
-)
-
-


eudplib\eudlib\utilf\binsearch.py : 109 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-)
-
-
-def EUDBinaryMax(cond, minv=0, maxv=0xFFFFFFFF):
-    """ Find maximum x satisfying cond(x) using binary search
-
-    :param cond: Test condition
-    :param minv: Minimum value in domain
-    :param maxv: Maximum value in domain
-
-    Cond should be binary classifier, meaning that for some N
-        for all x > N, cond(x) is false.
-        for all x <= N, cond(x) is true
-    Then EUDBinaryMin will find such N.
-
-    .. note:: If none of the value satisfies condition, then this
-        function will return maxv.
-    """
-
-    x = c.EUDVariable()
-    x << minv
-
-    if isinstance(minv, int) and isinstance(maxv, int):
-        r = maxv - minv
-        if r == 0:
-            return minv
-
-    else:
-        r = None
-
-    for i in range(31, -1, -1):
-        if r and 2 ** i > r:
-            continue
-
-        cs.DoActions(x.AddNumber(2**i))
-        if cs.EUDIfNot()([x <= maxv, cond(x)]):
-            cs.DoActions(x.SubtractNumber(2**i))
-        cs.EUDEndIf()
-
-    return x
-
-
-def EUDBinaryMin(cond, minv=0, maxv=0xFFFFFFFF):
-    """ Find minimum x satisfying cond(x) using binary search
-
-    :param cond: Test condition
-    :param minv: Minimum value in domain
-    :param maxv: Maximum value in domain
-
-    Cond should be binary classifier, meaning that for some N
-        for all x < N, cond(x) is false.
-        for all x >= N, cond(x) is true
-    Then EUDBinaryMin will find such N
-
-    .. note:: If none of the value satisfies condition, then this
-        function will return maxv.
-    """
-    x = c.EUDVariable()
-    x << maxv
-
-    if isinstance(minv, int) and isinstance(maxv, int):
-        r = maxv - minv
-        if r == 0:
-            return minv
-
-    else:
-        r = None
-
-    for i in range(31, -1, -1):
-        if r and 2 ** i > r:
-            continue
-
-        if cs.EUDIf()([x >= 2**i]):
-            cs.DoActions(x.SubtractNumber(2**i))
-            if cs.EUDIfNot()([x >= minv, cond(x)]):
-                cs.DoActions(x.AddNumber(2**i))
-            cs.EUDEndIf()
-        cs.EUDEndIf()
-
-    return x
-
-


eudplib\eudlib\utilf\listloop.py : 95 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..memiof import f_dwepdread_epd
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-    trigtrg as tt
-)
-
-
-def EUDLoopList(header_offset, break_offset=None):
-    blockname = 'listloop'
-    ut.EUDCreateBlock(blockname, header_offset)
-
-    ptr, epd = f_dwepdread_epd(ut.EPD(header_offset))
-
-    if break_offset is not None:
-        cs.EUDWhileNot()(ptr == break_offset)
-    else:
-        cs.EUDWhile()([ptr > 0, ptr <= 0x7FFFFFFF])
-
-    yield ptr, epd
-    cs.EUDSetContinuePoint()
-    c.SetVariables([ptr, epd], f_dwepdread_epd(epd + 1))
-    cs.EUDEndWhile()
-
-    ut.ep_assert(
-        ut.EUDPopBlock(blockname)[1] == header_offset,
-        'listloop mismatch'
-    )
-
-
-def EUDLoopUnit():
-    for ptr, epd in EUDLoopList(0x628430):
-        yield ptr, epd
-
-
-def EUDLoopBullet():
-    for ptr, epd in EUDLoopList(0x64DEC4):
-        yield ptr, epd
-
-
-def EUDLoopSprite():
-    y_epd = c.EUDVariable()
-    y_epd << ut.EPD(0x629688)
-
-    ut.EUDCreateBlock('spriteloop', 'sprlo')
-
-    if cs.EUDWhile()(y_epd < ut.EPD(0x629688) + 256):
-        ptr, epd = f_dwepdread_epd(y_epd)
-        if cs.EUDWhile()(ptr >= 1):
-            yield ptr, epd
-            cs.EUDSetContinuePoint()
-            c.SetVariables([ptr, epd], f_dwepdread_epd(epd + 1))
-        cs.EUDEndWhile()
-        y_epd += 1
-    cs.EUDEndWhile()
-
-    ut.EUDPopBlock('spriteloop')
-
-
-def EUDLoopTrigger(player):
-    player = c.EncodePlayer(player)
-
-    tbegin = tt.TrigTriggerBegin(player)
-    if cs.EUDIfNot()(tbegin == 0):
-        tend = tt.TrigTriggerEnd(player)
-        for ptr, epd in EUDLoopList(tbegin, tend):
-            yield ptr, epd
-    cs.EUDEndIf()
-
-


eudplib\eudlib\utilf\logic.py : 90 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-)
-
-
-def EUDOr(cond1, *conds):
-    """ cond1 || cond2 || ... || condn
-
-    .. warning:: Short circuiting is not supported
-
-    :param conds: List of conditions
-    """
-
-    v = c.EUDVariable()
-    if cs.EUDIf()(cond1):
-        v << 1
-    for cond in conds:
-        if cs.EUDElseIf()(cond):
-            v << 1
-    if cs.EUDElse()():
-        v << 0
-    cs.EUDEndIf()
-    return v
-
-
-def EUDAnd(cond1, *conds):
-    """ cond1 && cond2 && ... && condn
-
-    .. note::
-        This function computes AND value of various conditions.
-        If you don't want to do much computation, you should better use
-        plain list instead of this function.
-
-    .. warning:: Short circuiting is not supported.
-
-    :param conds: List of conditions
-    """
-
-    v = c.EUDVariable()
-    if cs.EUDIfNot()(cond1):
-        v << 0
-    for cond in conds:
-        if cs.EUDElseIfNot()(cond):
-            v << 0
-    if cs.EUDElse()():
-        v << 1
-    cs.EUDEndIf()
-    return v
-
-
-def EUDNot(cond):
-    """ !cond
-
-    :param conds: Condition to negate
-    """
-
-    v = c.EUDVariable()
-    if cs.EUDIf(cond):
-        v << 0
-    if cs.EUDElse():
-        v << 1
-    cs.EUDEndIf()
-    return v
-
-


eudplib\eudlib\utilf\mempatch.py : 121 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut,
-    trigger as t,
-)
-from ..eudarray import EUDArray
-from ..memiof import (
-    f_dwread_epd,
-    f_dwwrite_epd,
-    f_repmovsd_epd,
-)
-
-patchMax = 8192
-
-patchstack = EUDArray(3 * patchMax)
-dws_top, ps_top = c.EUDVariable(), c.EUDVariable()
-dwstack = EUDArray(patchMax)
-
-
-def pushpatchstack(value):
-    global ps_top
-    patchstack[ps_top] = value
-    ps_top += 1
-
-
-def poppatchstack():
-    global ps_top
-    ps_top -= 1
-    return patchstack[ps_top]
-
-
-@c.EUDFunc
-def f_dwpatch_epd(dstepd, value):
-    global patchstack, ps_top, dws_top
-
-    prev_value = f_dwread_epd(dstepd)
-    f_dwwrite_epd(dstepd, value)
-    cs.DoActions([
-        c.SetMemoryEPD(dstepd, c.SetTo, value),
-        c.SetMemoryEPD(ut.EPD(dwstack) + dws_top, c.SetTo, prev_value)
-    ])
-
-    pushpatchstack(dstepd)
-    pushpatchstack(ut.EPD(dwstack) + dws_top)
-    pushpatchstack(1)
-    dws_top += 1
-
-
-@c.EUDFunc
-def f_blockpatch_epd(dstepd, srcepd, dwn):
-    """ Patch 4*dwn bytes of memory at dstepd with memory of srcepd.
-
-    .. note::
-        After calling this function, contents at srcepd memory may change.
-        Since new contents are required for :py:`f_unpatchall` to run, you
-        shouldn't use the memory for any other means.
-    """
-
-    global dws_top
-
-    # Push to stack
-    pushpatchstack(dstepd)
-    pushpatchstack(srcepd)
-    pushpatchstack(dwn)
-    dws_top += 1
-
-    # Swap contents btw dstepd, srcepd
-    tmpbuffer = c.Db(1024)
-
-    if cs.EUDWhile()(dwn > 0):
-        copydwn = c.EUDVariable()
-        copydwn << 256
-        t.Trigger(
-            dwn <= 256,
-            copydwn.SetNumber(dwn)
-        )
-        dwn -= copydwn
-
-        f_repmovsd_epd(ut.EPD(tmpbuffer), dstepd, copydwn)
-        f_repmovsd_epd(dstepd, srcepd, copydwn)
-        f_repmovsd_epd(srcepd, ut.EPD(tmpbuffer), copydwn)
-    cs.EUDEndWhile()
-
-
-@c.EUDFunc
-def f_unpatchall():
-    global ps_top, dws_top
-    if cs.EUDWhile()(ps_top >= 1):
-        dws_top -= 1
-        dwn = poppatchstack()
-        unpatchsrcepd = poppatchstack()
-        dstepd = poppatchstack()
-        f_repmovsd_epd(dstepd, unpatchsrcepd, dwn)
-    cs.EUDEndWhile()
-
-


eudplib\eudlib\utilf\pexist.py : 86 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..memiof import (
-    f_dwread_epd,
-    f_getcurpl,
-    f_setcurpl,
-)
-
-from eudplib import (
-    core as c,
-    ctrlstru as cs,
-    utils as ut
-)
-
-
-@c.EUDFunc
-def f_playerexist(player):
-    """Check if player has not left the game.
-
-    :returns: 1 if player exists, 0 if not.
-    """
-    pts = 0x51A280
-
-    ret = c.EUDVariable()
-    prevtstart = f_dwread_epd(ut.EPD(pts + player * 12 + 8))
-    if cs.EUDIf()(prevtstart == ~(pts + player * 12 + 4)):
-        ret << 0
-    if cs.EUDElse()():
-        ret << 1
-    cs.EUDEndIf()
-    return ret
-
-
-# --------
-
-def EUDPlayerLoop():
-    def _footer():
-        block = {'origcp': f_getcurpl(), 'playerv': c.EUDVariable()}
-        playerv = block['playerv']
-
-        playerv << 0
-        cs.EUDWhile()(playerv <= 7)
-        cs.EUDContinueIfNot(f_playerexist(playerv))
-        f_setcurpl(playerv)
-
-        ut.EUDCreateBlock('ploopblock', block)
-        return True
-
-    return cs.CtrlStruOpener(_footer)
-
-
-def EUDEndPlayerLoop():
-    block = ut.EUDPopBlock('ploopblock')[1]
-    playerv = block['playerv']
-    origcp = block['origcp']
-
-    if not cs.EUDIsContinuePointSet():
-        cs.EUDSetContinuePoint()
-
-    playerv += 1
-    cs.EUDEndWhile()
-    f_setcurpl(origcp)
-
-


eudplib\eudlib\utilf\random.py : 86 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-# This code uses simple LCG algorithm.
-
-from eudplib import core as c
-from eudplib import utils as ut
-from ..memiof import f_dwbreak, f_dwread_epd
-
-_seed = c.EUDVariable()
-
-
-def f_getseed():
-    t = c.EUDVariable()
-    t << _seed
-    return t
-
-
-def f_srand(seed):
-    _seed << seed
-
-
-def f_randomize():
-    current_rv = f_dwread_epd(ut.EPD(0x51CA14))
-    _seed << current_rv
-
-
-@c.EUDFunc
-def f_rand():
-    _seed << c.f_mul(_seed, 1103515245) + 12345
-    return f_dwbreak(_seed)[1]  # Only HIWORD is returned
-
-
-@c.EUDFunc
-def f_dwrand():
-    seed1 = c.f_mul(_seed, 1103515245) + 12345
-    seed2 = c.f_mul(seed1, 1103515245) + 12345
-    _seed << seed2
-
-    ret = c.EUDVariable()
-    ret << 0
-
-    # HIWORD
-    for i in range(31, 15, -1):
-        c.RawTrigger(
-            conditions=seed1.AtLeast(2 ** i),
-            actions=[
-                seed1.SubtractNumber(2 ** i),
-                ret.AddNumber(2 ** i),
-            ]
-        )
-
-    # LOWORD
-    for i in range(31, 15, -1):
-        c.RawTrigger(
-            conditions=seed2.AtLeast(2 ** i),
-            actions=[
-                seed2.SubtractNumber(2 ** i),
-                ret.AddNumber(2 ** (i - 16)),
-            ]
-        )
-
-    return ret
-
-


eudplib\eudlib\utilf\userpl.py : 36 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from eudplib import (
-    core as c,
-    utils as ut
-)
-from ..memiof import f_dwread_epd
-
-
-@c.EUDFunc
-def f_getuserplayerid():
-    return f_dwread_epd(ut.EPD(0x512684))
-
-


eudplib\eudlib\utilf\__init__.py : 66 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .logic import (
-    EUDAnd,
-    EUDOr,
-    EUDNot
-)
-
-from .userpl import f_getuserplayerid
-
-from .random import (
-    f_getseed,
-    f_srand,
-    f_rand,
-    f_dwrand,
-    f_randomize
-)
-
-from .mempatch import (
-    f_dwpatch_epd,
-    f_blockpatch_epd,
-    f_unpatchall,
-)
-
-from .pexist import (
-    f_playerexist,
-    EUDPlayerLoop,
-    EUDEndPlayerLoop
-)
-
-from .listloop import (
-    EUDLoopList,
-    EUDLoopUnit,
-    EUDLoopSprite,
-    EUDLoopBullet,
-    EUDLoopTrigger
-)
-
-from .binsearch import (
-    EUDBinaryMin,
-    EUDBinaryMax,
-)
-
-


eudplib\maprw\loadmap.py : 45 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..core.mapdata import chktok, mpqapi, mapdata
-from .mpqadd import UpdateFileListByListfile
-
-
-def LoadMap(fname):
-    """Load basemap from fname
-
-    :param fname: Path for basemap.
-    """
-
-    print('Loading map %s' % fname)
-    rawfile = open(fname, 'rb').read()
-    mpqr = mpqapi.MpqRead()
-    mpqr.Open(fname)
-    chkt = chktok.CHK()
-    chkt.loadchk(mpqr.Extract('staredit\\scenario.chk'))
-    mapdata.InitMapData(chkt, rawfile)
-    UpdateFileListByListfile(mpqr)
-    mpqr.Close()
-
-


eudplib\maprw\mpqadd.py : 108 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import utils as ut
-
-_addedFiles = {}
-
-
-def UpdateFileListByListfile(mpqr):
-    """Use listfile to get list of already existing files."""
-
-    _addedFiles.clear()
-
-    flist = mpqr.EnumFiles()
-
-    # no listfile -> add default listfile
-    if not flist:
-        flist = [
-            'staredit\\scenario.chk',
-            '(listfile)'
-        ]
-
-    for fname in flist:
-        MPQAddFile(fname, None)
-
-
-def MPQAddFile(fname, content, isWave=False):
-    """Add file/wave to output map.
-
-    :param fname: Desired filename in mpq
-    :param content: Content to put inside.
-    :param isWave: Is file wave file? Wave file can be lossy compressed if this
-        flag is set to True.
-
-    .. note::
-        This function may error if duplicate filenames is found. However, not
-        all duplicated filenames are guaranteed to be catched here. Some of
-        them may be catched at UpdateMPQ(internal) function.
-    """
-
-    # make fname case_insensitive
-    fname_key = ut.u2b(fname.upper())
-
-    ut.ep_assert(
-        isinstance(content, bytes) or
-        isinstance(content, bytearray) or
-        content is None,
-        "Invalid content type"
-    )
-
-    ut.ep_assert(
-        fname_key not in _addedFiles,
-        "MPQ filename duplicate : \"%s\"" % fname
-    )
-
-    _addedFiles[fname_key] = (fname, content, isWave)
-
-
-def MPQAddWave(fname, content):
-    """Add wave to output map.
-
-    :param fname: Desired filename in mpq
-    :param content: Content to put inside.
-
-    .. note:: See `MPQAddFile` for more info
-    """
-    return MPQAddFile(fname, content, True)
-
-
-def UpdateMPQ(mpqw):
-    """Really append additional mpq file to mpq file.
-
-    `MPQAddFile` queues addition, and UpdateMPQ really adds them.
-    """
-
-    for fname, content, isWave in _addedFiles.values():
-        if content is not None:
-            if isWave:
-                ret = mpqw.PutWave(ut.u2b(fname), content, replace=False)
-            else:
-                ret = mpqw.PutFile(ut.u2b(fname), content, replace=False)
-            if not ret:
-                raise ut.EPError(
-                    'Failed adding file %s to mpq: May be duplicate' % fname
-                )
-
-


eudplib\maprw\savemap.py : 64 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ..core.mapdata import mapdata, mpqapi
-
-from .injector.applyInjector import applyInjector
-from .inlinecode.ilcprocesstrig import PreprocessInlineCode
-from .injector.doevents import _MainStarter
-from .mpqadd import UpdateMPQ
-
-
-def SaveMap(fname, rootf):
-    """Save output map with root function.
-
-    :param fname: Path for output map.
-    :param rootf: Main entry function.
-    """
-
-    print('Saving to %s...' % fname)
-    chkt = mapdata.GetChkTokenized()
-
-    # Add payload
-    root = _MainStarter(rootf)
-    PreprocessInlineCode(chkt)
-    mapdata.UpdateMapData()
-    applyInjector(chkt, root)
-
-    chkt.optimize()
-    rawchk = chkt.savechk()
-    print('Output scenario.chk : %.3fMB' % (len(rawchk) / 1000000))
-
-    # Process by modifying existing mpqfile
-    open(fname, 'wb').write(mapdata.GetRawFile())
-
-    mw = mpqapi.MpqWrite()
-    mw.Open(fname)
-    mw.PutFile('staredit\\scenario.chk', rawchk, replace=True)
-    UpdateMPQ(mw)
-    # mw.DeleteFile('(listfile)')
-    mw.Compact()
-    mw.Close()
-
-


eudplib\maprw\__init__.py : 30 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .loadmap import LoadMap
-from .savemap import SaveMap
-from .injector.doevents import EUDDoEvents
-from .mpqadd import MPQAddFile, MPQAddWave
-
-


eudplib\maprw\injector\applyInjector.py : 53 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ...core.allocator.payload import setPayloadLoggerMode
-from ...utils.blockstru import (
-    BlockStruManager,
-    SetCurrentBlockStruManager,
-)
-
-from .vectorReloc import CreateVectorRelocator
-from .payloadReloc import CreatePayloadRelocator
-from .injFinalizer import CreateInjectFinalizer
-
-
-def applyInjector(chkt, root):
-    # Create injector triggers
-    bsm = BlockStruManager()
-    prev_bsm = SetCurrentBlockStruManager(bsm)
-
-    root = CreateInjectFinalizer(chkt, root)
-
-    setPayloadLoggerMode(True)
-    payload = c.CreatePayload(root)
-    setPayloadLoggerMode(False)
-
-    final_payload = CreatePayloadRelocator(payload)
-    CreateVectorRelocator(chkt, final_payload)
-
-    SetCurrentBlockStruManager(prev_bsm)
-
-


eudplib\maprw\injector\doevents.py : 67 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-from ... import eudlib as sf
-from ...eudlib.stringf.dbstr import _f_initextstr
-
-
-jumper = None
-
-
-def _MainStarter(mf):
-    global jumper
-    jumper = c.Forward()
-
-    if c.PushTriggerScope():
-        rootstarter = c.NextTrigger()
-
-        _f_initextstr()
-        sf.f_getcurpl()  # Nessecary. See comments on f_getcurpl
-
-        mf()
-
-        c.RawTrigger(
-            nextptr=0x80000000,
-            actions=c.SetNextPtr(jumper, 0x80000000)
-        )
-        jumper << c.RawTrigger(nextptr=rootstarter)
-
-    c.PopTriggerScope()
-
-    return jumper
-
-
-def EUDDoEvents():
-    oldcp = sf.f_getcurpl()
-
-    _t = c.Forward()
-    cs.DoActions(c.SetNextPtr(jumper, _t))
-    cs.EUDJump(0x80000000)
-    _t << c.NextTrigger()
-
-    sf.f_setcurpl(oldcp)
-
-


eudplib\maprw\injector\injFinalizer.py : 250 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import ctrlstru as cs
-from ... import trigger as trg
-from ... import eudlib as sf
-from ... import utils as ut
-from ...trigtrg import runtrigtrg as rtt
-from ..inlinecode.ilcprocesstrig import GetInlineCodeList
-
-
-''' Stage 3:
-- Fixes nextptr modification to TRIG triggers by stage 1
-- Flip property value by trig section
-- Dispatch inline codes
-- Create infinite executer for root
-'''
-
-
-def _DispatchInlineCode(trigepd):
-    cs0 = c.Forward()  # set cs0+20 to codeStart
-    cs1 = c.Forward()  # set cs1+20 to ut.EPD(codeEnd) + 1
-    cs2 = c.Forward()  # set cs2+20 to cs_a0_epd + 4
-    cs3 = c.Forward()  # set cs3+20 to cs_a0_epd + 5
-    resetter = c.Forward()
-    end = c.Forward()
-
-    nextptr = sf.f_dwread_epd(trigepd + 1)
-
-    cs.DoActions(c.SetMemory(0x6509B0, c.SetTo, trigepd + 2))
-
-    for funcID, func in GetInlineCodeList():
-        codeStart, codeEnd = func
-        cs_a0_epd = ut.EPD(codeStart) + (8 + 320) // 4
-
-        t = c.Forward()
-        nt = c.Forward()
-        t << c.RawTrigger(
-            conditions=[
-                c.Deaths(c.CurrentPlayer, c.Exactly, funcID, 0)
-            ],
-            actions=[
-                c.SetMemory(cs0 + 20, c.SetTo, codeStart),
-                c.SetMemory(cs1 + 20, c.SetTo, ut.EPD(codeEnd + 4)),
-                c.SetMemory(cs2 + 20, c.SetTo, cs_a0_epd + 4),
-                c.SetMemory(cs3 + 20, c.SetTo, cs_a0_epd + 5),
-                c.SetMemory(resetter + 16, c.SetTo, ut.EPD(t + 4)),
-                c.SetMemory(resetter + 20, c.SetTo, nt),
-                c.SetNextPtr(t, end),
-            ]
-        )
-        nt << c.NextTrigger()
-
-    end << c.NextTrigger()
-
-    cs.DoActions([
-        # Reset t's nextptr
-        resetter << c.SetNextPtr(0, 0),
-
-        # SetNextPtr for this trigger
-        # action #1
-        c.SetMemory(0x6509B0, c.Add, -2 + (8 + 320) // 4 + 4),
-        c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, trigepd + 1),
-        c.SetMemory(0x6509B0, c.Add, 1),
-        cs0 << c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, 0),
-
-        # SetNextPtr for codeend
-        # action #2
-        c.SetMemory(0x6509B0, c.Add, 7),
-        cs1 << c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, 0),
-        c.SetMemory(0x6509B0, c.Add, 1),
-        c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, nextptr),
-
-        # This trigger sets argument for cs_a0_epd
-        # cs_a0 will be SetNextPtr(trigepd + 1, nextptr) after this
-        # action #3
-        c.SetMemory(0x6509B0, c.Add, 7),
-        cs2 << c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, 0),
-        c.SetMemory(0x6509B0, c.Add, 1),
-        c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, trigepd + 1),
-
-        # action #4
-        c.SetMemory(0x6509B0, c.Add, 7),
-        cs3 << c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, 0),
-        c.SetMemory(0x6509B0, c.Add, 1),
-        c.SetMemoryEPD(c.CurrentPlayer, c.SetTo, nextptr),
-    ])
-
-
-@c.EUDFunc
-def _FlipProp(trigepd):
-    '''Iterate through triggers and flip 'Trigger disabled' flag
-
-    Also, dispatch inline codes
-    '''
-
-    if cs.EUDWhileNot()([trigepd >= 0x3FD56E6E, trigepd <= 0x3FD56E86]):
-        prop_epd = trigepd + (8 + 320 + 2048) // 4
-        # trigepd's nextptr may change during flipping process, so
-        # we get it now.
-        nexttrigepd = sf.f_epdread_epd(trigepd + (4 // 4))
-
-        if cs.EUDIf()(c.Deaths(prop_epd, c.Exactly, 4, 0)):  # Preserved
-            sf.f_dwwrite_epd(prop_epd, 8)  # Disable now
-        if cs.EUDElse()():
-            sf.f_dwsubtract_epd(prop_epd, 8)
-        cs.EUDEndIf()
-
-        # Dispatch inline code
-        if cs.EUDIf()(c.Deaths(prop_epd, c.Exactly, 0x10000000, 0)):
-            sf.f_dwwrite_epd(prop_epd, 4)  # Preserve
-            _DispatchInlineCode(trigepd)
-        cs.EUDEndIf()
-
-        trigepd << nexttrigepd
-
-    cs.EUDEndWhile()
-
-
-def CreateInjectFinalizer(chkt, root):
-    rtt.AllocTrigTriggerLink()
-
-    pts = 0x51A280
-
-    # Apply inline code patch
-    if c.PushTriggerScope():
-        ret = c.NextTrigger()
-
-        # Revert nextptr
-        triggerend = sf.f_dwread_epd(9)
-        ptsprev_epd = sf.f_dwread_epd(10)
-        sf.f_dwwrite_epd(ptsprev_epd, triggerend)
-        cs.DoActions([
-            c.SetDeaths(9, c.SetTo, 0, 0),
-            c.SetDeaths(10, c.SetTo, 0, 0)
-        ])
-
-        # revert mrgndata
-        mrgndata = chkt.getsection('MRGN')
-        mrgndata_db = c.Db(mrgndata)
-        sf.f_repmovsd_epd(ut.EPD(0x58DC60), ut.EPD(mrgndata_db), 5100 // 4)
-
-        # Flip TRIG properties
-        i = c.EUDVariable()
-        if cs.EUDWhile()(i <= 7):
-            _FlipProp(sf.f_epdread_epd(ut.EPD(pts + 8) + i + i + i))
-            i << i + 1
-        cs.EUDEndWhile()
-
-        # Create payload for each players & Link them with pts
-        lasttime = c.EUDVariable()
-        curtime = c.EUDVariable()
-        tmcheckt = c.Forward()
-
-        for player in range(8):
-            trs = rtt._runner_start[player]
-            tre = rtt._runner_end[player]
-
-            c.PushTriggerScope()
-
-            # Crash preventer
-            tstart, _t0 = c.Forward(), c.Forward()
-            tstart << c.RawTrigger(
-                prevptr=pts + player * 12 + 4,
-                nextptr=trs,
-                actions=[c.SetNextPtr(tstart, _t0)]
-            )
-
-            _t0 << c.RawTrigger(
-                nextptr=tmcheckt,
-                actions=[
-                    # reset
-                    c.SetNextPtr(tstart, trs)
-                ]
-            )
-
-            c.PopTriggerScope()
-
-            prevtstart = sf.f_dwread_epd(ut.EPD(pts + player * 12 + 8))
-            prevtend = sf.f_dwread_epd(ut.EPD(pts + player * 12 + 4))
-
-            # If there were triggers
-            if cs.EUDIfNot()(prevtstart == ~(pts + player * 12 + 4)):
-                cs.DoActions([
-                    # Link pts
-                    c.SetMemory(pts + player * 12 + 8, c.SetTo, tstart),
-                    c.SetMemory(pts + player * 12 + 4, c.SetTo, tre),
-
-                    # Link trs
-                    c.SetMemory(trs + 4, c.SetTo, prevtstart),
-                    c.SetMemory(prevtend + 4, c.SetTo, tre),
-
-                    # Cache dlist start & end
-                    c.SetMemory(rtt.orig_tstart + player * 4, c.SetTo,
-                                prevtstart),
-                    c.SetMemory(rtt.orig_tend + player * 4, c.SetTo,
-                                prevtend),
-                ])
-            cs.EUDEndIf()
-
-        if c.PushTriggerScope():
-            tmcheckt << c.NextTrigger()
-            curtime << sf.f_dwread_epd(ut.EPD(0x57F23C))
-            if cs.EUDIf()(lasttime < curtime):
-                lasttime << curtime
-                cs.EUDJump(root)
-            cs.EUDEndIf()
-
-            # Set current player to 1.
-            cs.DoActions(c.SetMemory(0x6509B0, c.SetTo, 0))
-
-            cs.EUDJump(0x80000000)
-        c.PopTriggerScope()
-
-        # lasttime << curtime
-        curtime << sf.f_dwread_epd(ut.EPD(0x57F23C))
-        lasttime << curtime
-
-        cs.DoActions(c.SetMemory(0x6509B0, c.SetTo, 0))  # Current player = 1
-
-        # now jump to root
-        cs.EUDJump(root)
-
-    c.PopTriggerScope()
-
-    return ret
-
-


eudplib\maprw\injector\payloadReloc.py : 83 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import core as c
-from ... import eudlib as sf
-from ... import ctrlstru as cs
-from eudplib import utils as ut
-
-''' Stage 2 :
-- Initialize payload (stage3+ + user code) & execute it
-'''
-
-
-def CreatePayloadRelocator(payload):
-    # We first build code injector.
-    prtdb = c.Db(b''.join([ut.i2b4(x // 4) for x in payload.prttable]))
-    prtn = c.EUDVariable()
-
-    ortdb = c.Db(b''.join([ut.i2b4(x // 4) for x in payload.orttable]))
-    ortn = c.EUDVariable()
-
-    orig_payload = c.Db(payload.data)
-
-    if c.PushTriggerScope():
-        root = c.NextTrigger()
-
-        # Verify payload
-        # Note : this is very, very basic protection method. Intended attackers
-        # should be able to penetrate through this very easily
-
-        # init prt
-        prtn << len(payload.prttable)
-        if payload.prttable:
-            if cs.EUDWhile()(prtn >= 1):
-                cs.DoActions(prtn.SubtractNumber(1))
-                sf.f_dwadd_epd(
-                    ut.EPD(orig_payload) +
-                    sf.f_dwread_epd(prtn + ut.EPD(prtdb)),
-                    orig_payload // 4
-                )
-            cs.EUDEndWhile()
-
-        # init ort
-        ortn << len(payload.orttable)
-        if payload.orttable:
-            if cs.EUDWhile()(ortn >= 1):
-                cs.DoActions(ortn.SubtractNumber(1))
-                sf.f_dwadd_epd(
-                    ut.EPD(orig_payload) +
-                    sf.f_dwread_epd(ortn + ut.EPD(ortdb)),
-                    orig_payload
-                )
-            cs.EUDEndWhile()
-
-        # Jump
-        cs.EUDJump(orig_payload)
-
-    c.PopTriggerScope()
-
-    return c.CreatePayload(root)
-
-


eudplib\maprw\injector\vectorReloc.py : 365 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
-278
-279
-280
-281
-282
-283
-284
-285
-286
-287
-288
-289
-290
-291
-292
-293
-294
-295
-296
-297
-298
-299
-300
-301
-302
-303
-304
-305
-306
-307
-308
-309
-310
-311
-312
-313
-314
-315
-316
-317
-318
-319
-320
-321
-322
-323
-324
-325
-326
-327
-328
-329
-330
-331
-332
-333
-334
-335
-336
-337
-338
-339
-340
-341
-342
-343
-344
-345
-346
-347
-348
-349
-350
-351
-352
-353
-354
-355
-356
-357
-358
-359
-360
-361
-362
-363
-364
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-''' Stage 1 : works in TRIG section.
-- Check if EUD is available. If not, defeat
-- Initialize stage 2 & execute it
-- Modifies TRIG rawtrigger's nextptr. Modification is fixed in stage 3.
-'''
-
-from ... import core as c
-from eudplib import utils as ut
-from ...trigtrg import trigtrg as tt
-
-
-trglist = []
-
-
-def Trigger(*args, **kwargs):
-    global trglist
-    trglist.append(tt.Trigger(*args, **kwargs))
-
-
-def CopyDeaths(iplayer, oplayer, copyepd=False, initvalue=None):
-    tmpplayer = 11
-
-    if initvalue is None:
-        if copyepd:
-            initvalue = tt.EPD(0)
-        else:
-            initvalue = 0
-
-    Trigger(
-        actions=[
-            tt.SetDeaths(oplayer, tt.SetTo, initvalue, 0),
-            tt.SetDeaths(tmpplayer, tt.SetTo, 0, 0),
-        ]
-    )
-
-    for i in range(31, 1, -1):
-        if copyepd:
-            subval = 2 ** (i - 2)
-
-        else:
-            subval = 2 ** i
-
-        Trigger(
-            conditions=[tt.Deaths(iplayer, tt.AtLeast, 2 ** i, 0)],
-            actions=[
-                tt.SetDeaths(iplayer, tt.Subtract, 2 ** i, 0),
-                tt.SetDeaths(tmpplayer, tt.Add, 2 ** i, 0),
-                tt.SetDeaths(oplayer, tt.Add, subval, 0),
-            ]
-        )
-
-    for i in range(31, 1, -1):
-        Trigger(
-            players=[tt.AllPlayers],
-            conditions=[tt.Deaths(tmpplayer, tt.AtLeast, 2 ** i, 0)],
-            actions=[
-                tt.SetDeaths(iplayer, tt.Add, 2 ** i, 0),
-                tt.SetDeaths(tmpplayer, tt.Subtract, 2 ** i, 0),
-            ]
-        )
-
-
-def CreateVectorRelocator(chkt, payload):
-    global trglist
-
-    # Append 'Require EUD enabler' to string table
-    str_section = chkt.getsection('STR')
-    strtb = c.TBL(str_section)
-    eude_needed = strtb.GetStringIndex('This map requires EUD Enabler to run')
-    str_section = strtb.SaveTBL()
-
-    '''
-    Algorithm credit to klassical_31@naver.com
-
-    Overall algorithm : STR <-> MRGN cycle
-
-    MRGN:
-      SetMemory(payload, Add, payload_offset // 4)
-
-    MRGN <-> STR0  =  Trigger(actions=[
-             STR1        [SetMemory(
-                            mrgn.action[i].player,
-                            Add,
-                            prttable[j+packn] - prttable[j]
-                          ) for i in range(packn)],
-             STR2        SetNextPtr(mrgn, STR[k+1])
-             ...      )
-    '''
-
-    mrgn = 0x58DC60
-    packn = 15
-
-    #############
-    # STR SECTION
-    #############
-    str_sled = []
-    sledheader_prt = b'\0\0\0\0' + ut.i2b4(mrgn)
-    sledheader_ort = b'\0\0\0\0' + ut.i2b4(mrgn + 2408)
-
-    # apply prt
-    prttrg_start = 2408 * len(str_sled)  # = 0
-    # mrgn.action[i].player = EPD(payload_offset) + prevoffset[i]
-    prevoffset = [-1] * packn
-    for i in range(0, len(payload.prttable), packn):
-        prts = list(map(lambda x: x // 4, payload.prttable[i: i + packn]))
-        prts = prts + [-1] * (packn - len(prts))  # -1 : dummy space
-        pch = [prts[j] - prevoffset[j] for j in range(packn)]
-        str_sled.append(sledheader_prt + tt.Trigger(
-            actions=[
-                [tt.SetMemory(mrgn + 328 + 32 * j + 16, tt.Add, pch[j])
-                 for j in range(packn)],
-            ]
-        ))
-
-        prevoffset = prts
-
-    # apply ort
-    orttrg_start = 2408 * len(str_sled)  # = 0
-    # mrgn.action[i].player = EPD(payload_offset) + prevoffset[i]
-    prevoffset = [-1] * packn
-    for i in range(0, len(payload.orttable), packn):
-        orts = list(map(lambda x: x // 4, payload.orttable[i: i + packn]))
-        orts = orts + [-1] * (packn - len(orts))  # -1 : dummy space
-        pch = [orts[j] - prevoffset[j] for j in range(packn)]
-        str_sled.append(sledheader_ort + tt.Trigger(
-            actions=[
-                [tt.SetMemory(mrgn + 2408 + 328 + 32 * j + 16, tt.Add, pch[j])
-                 for j in range(packn)],
-            ]
-        ))
-
-        prevoffset = orts
-
-    # jump to ort
-    str_sled.append(sledheader_ort + tt.Trigger(
-        actions=[
-            [tt.SetMemory(mrgn + 2408 + 328 + 32 * j + 16, tt.Add,
-                          0xFFFFFFFF - prevoffset[j]) for j in range(packn)],
-            tt.SetMemory(mrgn + 2408 + 4, tt.Add, 4)  # skip garbage area
-        ]
-    ))
-
-    # sled completed
-    str_sled = b''.join(str_sled)
-
-    str_padding_length = -len(str_section) & 3
-    strsled_offset = len(str_section) + str_padding_length
-    payload_offset = strsled_offset + len(str_sled) + 4
-    str_section = str_section + \
-        bytes(str_padding_length) + str_sled + b'\0\0\0\0' + payload.data
-    chkt.setsection('STR', str_section)
-
-    ##############
-    # MRGN SECTION
-    ##############
-    mrgn_trigger = []
-    mrgn_trigger.append(
-        bytes(4) + ut.i2b4(prttrg_start + strsled_offset) +
-        tt.Trigger(
-            actions=[
-                # SetDeaths actions in MRGN initially points to EPD(payload -
-                # 4)
-                [tt.SetMemory(payload_offset - 4, tt.Add, payload_offset // 4)
-                 for _ in range(packn)],
-                tt.SetMemory(mrgn + 4, tt.Add, 2408)
-            ]
-        )
-    )
-
-    mrgn_trigger.append(
-        bytes(4) + ut.i2b4(orttrg_start + strsled_offset) +
-        tt.Trigger(
-            actions=[
-                [tt.SetMemory(payload_offset - 4, tt.Add, payload_offset)
-                 for _ in range(packn)],
-                tt.SetMemory(mrgn + 2408 + 4, tt.Add, 2408)
-            ]
-        )
-    )
-
-    mrgn_section = b''.join(mrgn_trigger) + bytes(5100 - 2408 * 2)
-    chkt.setsection('MRGN', mrgn_section)
-
-    ##############
-    # TRIG SECTION
-    ##############
-    trglist.clear()
-
-    # Check if epd is supported
-    Trigger(actions=[
-        tt.SetDeaths(-12, tt.SetTo, 1, 1)
-    ])
-
-    Trigger(
-        conditions=[
-            tt.Deaths(0, tt.Exactly, 0, 0)
-        ],
-        actions=[
-            tt.DisplayTextMessage(eude_needed),
-            tt.Draw()
-        ]
-    )
-
-    # End trigger execution if EUDA is not supported
-    #  - using condition #115 twice.
-    Trigger(
-        conditions=[
-            tt.Deaths(0, tt.Exactly, 0, 0),
-            tt.Condition(0, 0, 0, 0, 0, 115, 0, 0),
-            tt.Condition(0, 0, 0, 0, 0, 115, 0, 0),
-        ]
-    )
-
-    Trigger(actions=[
-        tt.SetDeaths(-12, tt.SetTo, 0, 1)
-    ])
-
-    # -------
-
-    # Init mrgn rawtrigger
-    strs = 0x5993D4
-    for e in range(31, 1, -1):
-        # prt table
-        # player
-        Trigger(
-            conditions=tt.Memory(strs, tt.AtLeast, 2 ** e),
-            actions=[
-                [tt.SetMemory(mrgn + 328 + 32 * i + 16, tt.Add, 2 ** (e - 2))
-                 for i in range(packn)],
-                tt.SetDeaths(11, tt.Add, 2 ** e, 0),
-                [tt.SetMemory(mrgn + 328 + 32 * i + 20, tt.Add, 2 ** (e - 2))
-                 for i in range(packn)],
-                tt.SetMemory(mrgn + 4, tt.Add, 2 ** e),
-                [tt.SetMemory(
-                    mrgn + 2408 + 328 + 32 * i + 16, tt.Add, 2 ** (e - 2))
-                 for i in range(packn)],
-                tt.SetMemory(mrgn + 2408 + 4, tt.Add, 2 ** e),
-                [tt.SetMemory(mrgn + 2408 + 328 + 32 * i + 20, tt.Add, 2 ** e)
-                 for i in range(packn)],
-                tt.SetMemory(strs, tt.Subtract, 2 ** e),
-            ]
-        )
-
-    for e in range(31, 1, -1):
-        Trigger(
-            conditions=tt.Deaths(11, tt.AtLeast, 2 ** e, 0),
-            actions=[
-                tt.SetDeaths(11, tt.Subtract, 2 ** e, 0),
-                tt.SetMemory(strs, tt.Add, 2 ** e)
-            ]
-        )
-
-    # Payload update
-    curpl = 0x6509B0
-
-    # -------
-
-    # pts[player].lasttrigger->next = value(strs) + strsled_offset
-
-    pts = 0x51A280
-
-    for player in range(8):
-        triggerend = ~(0x51A284 + player * 12)
-
-        Trigger(
-            players=[player],
-            actions=[
-                tt.SetMemory(curpl, tt.SetTo, ut.EPD(pts + 12 * player + 4)),
-                tt.SetDeaths(9, tt.SetTo, triggerend, 0)  # Used in stage 2
-            ]
-        )
-
-    # read pts[player].lasttrigger
-    for e in range(31, 1, -1):
-        Trigger(
-            conditions=tt.Deaths(tt.CurrentPlayer, tt.AtLeast, 2 ** e, 0),
-            actions=[
-                tt.SetDeaths(tt.CurrentPlayer, tt.Subtract, 2 ** e, 0),
-                tt.SetDeaths(10, tt.Add, 2 ** e, 0),
-                tt.SetDeaths(11, tt.Add, 2 ** e, 0),
-            ]
-        )
-
-    for e in range(31, 1, -1):
-        Trigger(
-            conditions=tt.Deaths(10, tt.AtLeast, 2 ** e, 0),
-            actions=[
-                tt.SetDeaths(10, tt.Subtract, 2 ** e, 0),
-                tt.SetDeaths(tt.CurrentPlayer, tt.Add, 2 ** e, 0)
-            ]
-        )
-
-    # apply to curpl
-    Trigger(actions=[
-        tt.SetDeaths(10, tt.SetTo, ut.EPD(4), 0),
-        tt.SetMemory(curpl, tt.SetTo, ut.EPD(4))
-    ])
-    for e in range(31, 1, -1):
-        Trigger(
-            conditions=tt.Deaths(11, tt.AtLeast, 2 ** e, 0),
-            actions=[
-                tt.SetDeaths(11, tt.Subtract, 2 ** e, 0),
-                # used for nextptr recovery in stage 3
-                tt.SetDeaths(10, tt.Add, 2 ** (e - 2), 0),
-                tt.SetMemory(curpl, tt.Add, 2 ** (e - 2))
-            ]
-        )
-
-    # now curpl = EPD(value(ptsprev) + 4)
-    # value(EPD(value(ptsprev) + 4)) = strs + payload_offset
-    CopyDeaths(tt.EPD(strs), tt.CurrentPlayer, False, strsled_offset)
-
-    # Done!
-    trigdata = b''.join(trglist)
-
-    # Stage 1 created
-
-    # -------
-
-    # Previous rawtrigger datas
-
-    oldtrigraw = chkt.getsection('TRIG')
-    oldtrigs = [oldtrigraw[i:i + 2400]
-                for i in range(0, len(oldtrigraw), 2400)]
-    proc_trigs = []
-
-    # Collect only enabled triggers
-    for trig in oldtrigs:
-        trig = bytearray(trig)
-        flag = ut.b2i4(trig, 320 + 2048)
-        if flag & 8:  # Trigger already disabled
-            pass
-
-        flag ^= 8  # Disable it temporarilly. It will be re-enabled at stage 3
-        trig[320 + 2048: 320 + 2048 + 4] = ut.i2b4(flag)
-        proc_trigs.append(bytes(trig))
-
-    oldtrigraw_processed = b''.join(proc_trigs)
-    chkt.setsection('TRIG', trigdata + oldtrigraw_processed)
-
-


eudplib\maprw\injector\__init__.py : 25 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-


eudplib\maprw\inlinecode\ilccompile.py : 84 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-from ... import utils as ut
-from ... import core as c
-from ... import trigger as t
-from ... import ctrlstru as cs
-from ... import eudlib as sf
-
-import types
-
-_inlineGlobals = {}
-
-
-def ComputeBaseInlineCodeGlobals():
-    """
-    Return list of globals inline eudplib code can call.
-    """
-
-    global _inlineGlobals
-
-    # Add eudplib functions
-    G = {}
-    modules = [c, cs, sf, ut, t]
-    for module in modules:
-        for k, v in module.__dict__.items():
-            if isinstance(v, types.ModuleType):
-                continue
-            if k[0] == '_':
-                continue
-
-            G[k] = v
-
-    _inlineGlobals = G
-
-
-def GetInlineCodeGlobals():
-    """
-    Return list of globals inline eudplib code can call.
-    """
-
-    G = _inlineGlobals.copy()
-
-    # Add custom registered functions
-    for k, v in c.GetEUDNamespace().items():
-        G[k] = v
-
-    return G
-
-
-def CompileInlineCode(code):
-    code = compile(code, '<string>', 'exec')
-
-    if c.PushTriggerScope():
-        tStart = c.RawTrigger(actions=c.SetDeaths(0, c.SetTo, 0, 0))
-        exec(code, GetInlineCodeGlobals(), {})
-        tEnd = c.RawTrigger()
-    c.PopTriggerScope()
-
-    return (tStart, tEnd)
-
-


eudplib\maprw\inlinecode\ilcprocesstrig.py : 137 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from ... import utils as ut
-from ...trigtrg import trigtrg as tt
-
-from .ilccompile import (
-    ComputeBaseInlineCodeGlobals,
-    CompileInlineCode,
-)
-
-
-_inlineCodes = []
-
-
-def PreprocessInlineCode(chkt):
-    global _inlineCodes
-    trigSection = chkt.getsection('TRIG')
-    _inlineCodes, trigSection = PreprocessTrigSection(trigSection)
-    chkt.setsection('TRIG', trigSection)
-
-
-def PreprocessTrigSection(trigSection):
-    """ Fetch inline codes & compiles them """
-    ComputeBaseInlineCodeGlobals()
-
-    inlineCodes = []
-    trigSegments = []
-    for i in range(0, len(trigSection), 2400):
-        trigSegment = trigSection[i:i + 2400]
-        if len(trigSegment) != 2400:
-            continue
-
-        decoded = DecodeSpecialData(inlineCodes, trigSegment)
-        if decoded:
-            trigSegment = decoded
-
-        trigSegments.append(trigSegment)
-
-    '''
-    This is rather hard to explain, but we need blank trigger.
-
-    If inline_eudplib trigger is at the last of the trigger, then its
-    nextptr should be modified to codeStart.
-
-    But after flipprop works, RunTrigTrigger engine will re-change its nextptr
-    to somewhere else, where everything quits.
-
-    So we need 'normal' trigger at the last of TRIG triggers for every player.
-    '''
-    trigSegments.append(tt.Trigger(players=[tt.AllPlayers]))
-
-    trigSection = b''.join(trigSegments)
-    return inlineCodes, trigSection
-
-
-def GetInlineCodeList():
-    """ Get list of compiled inline_eudplib code """
-    return _inlineCodes
-
-
-def DecodeSpecialData(inlineCodes, trigger_bytes):
-    """ Check if trigger segment has special data. """
-    # Check if effplayer & current_action is empty
-    for player in range(28):
-        if trigger_bytes[320 + 2048 + 4 + player] != 0:
-            return None
-
-    # trg.cond[0].condtype != 0
-    if trigger_bytes[15] != 0:
-        return None
-    # trg.act[0].acttype != 0
-    if trigger_bytes[346] != 0:
-        return None
-
-    data = trigger_bytes[20:320] + trigger_bytes[352:2372]
-    return ProcessInlineCode(inlineCodes, data)
-
-
-def ProcessInlineCode(inlineCodes, data):
-    """ Check if trigger segment has inline_eudplib code. """
-    magicCode = ut.b2i4(data, 0)
-
-    # inline_eudplib code
-    if magicCode == 0x10978d4a:
-        playerCode = ut.b2i4(data, 4)
-        codeData = ut.b2u(data[8:]).rstrip('\0')
-
-        # Compile code
-        func = CompileInlineCode(codeData)
-        funcID = len(inlineCodes) + 1024
-        inlineCodes.append((funcID, func))
-
-        # Return new trigger
-        newTrigger = bytearray(2400)
-
-        # Apply effplayer
-        for player in range(27):
-            if playerCode & (1 << player):
-                newTrigger[320 + 2048 + 4 + player] = 1
-
-        # Apply 4 SetDeaths
-        SetDeathsTemplate = tt.SetDeaths(0, tt.SetTo, 0, 0)
-        newTrigger[320 + 32 * 0: 320 + 32 * 1] = SetDeathsTemplate
-        newTrigger[320 + 32 * 1: 320 + 32 * 2] = SetDeathsTemplate
-        newTrigger[320 + 32 * 2: 320 + 32 * 3] = SetDeathsTemplate
-        newTrigger[320 + 32 * 3: 320 + 32 * 4] = SetDeathsTemplate
-
-        # Apply flag
-        newTrigger[0:4] = ut.i2b4(funcID)
-        newTrigger[2368:2372] = b'\0\0\0\x10'
-        return newTrigger
-
-    return None
-
-


eudplib\maprw\inlinecode\__init__.py : 26 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .ilcprocesstrig import PreprocessTrigSection
-
-


eudplib\trigger\branch.py : 82 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from eudplib import utils as ut
-from .tpatcher import PatchCondition
-
-
-def _EUDBranchSub(conditions, ontrue, onfalse):
-    """
-    Reduced version of EUDBranch with following restructions.
-    - All fields of conditions/actions should be constant.
-    - type(conditions) is list
-    - len(conditions) <= 16
-    """
-    assert len(conditions) <= 16
-
-    brtrg = c.Forward()
-    tjtrg = c.Forward()
-    brtrg << c.RawTrigger(
-        nextptr=onfalse,
-        conditions=conditions,
-        actions=[
-            c.SetNextPtr(brtrg, tjtrg)
-        ]
-    )
-
-    tjtrg << c.RawTrigger(
-        nextptr=ontrue,
-        actions=[
-            c.SetNextPtr(brtrg, onfalse)
-        ]
-    )
-
-
-def EUDBranch(conditions, ontrue, onfalse):
-    """Branch by whether conditions is satisfied or not.
-
-    :param conditions: Nested list of conditions.
-    :param ontrue: When all conditions are true, this branch is taken.
-    :param onfalse: When any of the conditions are false, this branch is taken.
-    """
-    conditions = ut.FlattenList(conditions)
-    conditions = list(map(PatchCondition, conditions))
-
-    if len(conditions) == 0:
-        c.RawTrigger(nextptr=ontrue)  # Just jump
-        return
-
-    # Check all conditions
-    for i in range(0, len(conditions), 16):
-        subontrue = c.Forward()
-        subonfalse = onfalse
-        _EUDBranchSub(conditions[i:i+16], subontrue, subonfalse)
-
-        if i + 16 < len(conditions):
-            subontrue << c.NextTrigger()
-        else:
-            subontrue << ontrue
-
-


eudplib\trigger\filler.py : 100 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
-97
-98
-99
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .. import utils as ut
-
-
-def _dww(dstepd, v):
-    act = c.Forward()
-    c.SeqCompute((
-        (ut.EPD(act + 16), c.SetTo, dstepd),
-        (ut.EPD(act + 20), c.SetTo, v),
-    ))
-    c.RawTrigger(
-        actions=(act << c.SetMemory(0, c.SetTo, 0))
-    )
-
-
-def _filldw(dstepd, v1):
-    c.SeqCompute((
-        (dstepd, c.SetTo, v1),
-    ))
-
-
-@c.EUDFunc
-def _fillwbb(dstepd, v1, v2, v3):
-    ret = c.EUDVariable()
-    ret << 0
-
-    for i in range(15, -1, -1):
-        c.RawTrigger(
-            conditions=v1.AtLeast(2 ** i),
-            actions=[
-                v1.SubtractNumber(2 ** i),
-                ret.AddNumber(2 ** i)
-            ]
-        )
-
-    for i in range(7, -1, -1):
-        c.RawTrigger(
-            conditions=v2.AtLeast(2 ** i),
-            actions=[
-                v2.SubtractNumber(2 ** i),
-                ret.AddNumber(2 ** (i + 16))
-            ]
-        )
-
-    for i in range(7, -1, -1):
-        c.RawTrigger(
-            conditions=v3.AtLeast(2 ** i),
-            actions=[
-                v3.SubtractNumber(2 ** i),
-                ret.AddNumber(2 ** (i + 24))
-            ]
-        )
-
-    _dww(dstepd, ret)
-
-
-@c.EUDFunc
-def _fillbbbb(dstepd, v1, v2, v3, v4):
-    ret = c.EUDVariable()
-    ret << 0
-
-    vlist = (v1, v2, v3, v4)
-    for i, v in enumerate(vlist):
-        lsf = 8 * i
-        for i in range(7, -1, -1):
-            c.RawTrigger(
-                conditions=v.AtLeast(2 ** i),
-                actions=[
-                    v.SubtractNumber(2 ** i),
-                    ret.AddNumber(2 ** (i + lsf))
-                ]
-            )
-
-    _dww(dstepd, ret)
-
-


eudplib\trigger\ptrigger.py : 131 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .triggerdef import Trigger
-from eudplib import utils as ut
-
-
-_pt_db = c.Db
-_pinfos = None
-_pdbtable = {}
-
-
-def InitPTrigger():
-    """(Internal) Enable PTrigger. Internally called by eudplib"""
-    global _pinfos
-    if _pinfos is None:
-        _pinfos = [c.GetPlayerInfo(player) for player in range(8)]
-
-
-def PTrigger(players, conditions=None, actions=None):
-    """Execute trigger by player basis
-
-    :param players: Players the trigger should execute with. When Current
-        Player specifies any of the players, trigger will execute.
-    :param conditions: List of conditions. If all conditions are met, then
-        actions will be executed.
-    :param actions: List of actions.
-    """
-
-    InitPTrigger()
-
-    players = ut.FlattenList(players)
-    effp = [False] * 8
-
-    # Trigger is never executed if it has no effplayers.
-    if len(players) == 0:
-        return
-
-    # Check whose the player is executed to.
-    for player in players:
-        player = c.EncodePlayer(player)
-
-        if 0 <= player <= 7:
-            effp[player] = True
-
-        elif 0x12 <= player <= 0x15:  # Force 1 ~ 4
-            forceIndex = player - 0x12
-            for p in range(8):
-                if _pinfos[p].force == forceIndex:
-                    effp[p] = True
-
-        elif player == 0x11:  # All players
-            for p in range(8):
-                effp[p] = True
-            break
-
-    # Create player table!
-    dbb = b''.join([b'\0\0\0\0' if eff is False else b'aaaa' for eff in effp])
-    if dbb in _pdbtable:
-        pdb = _pdbtable[dbb]
-
-    else:
-        pdb = c.Db(dbb)
-        _pdbtable[dbb] = pdb
-
-    # effplayer[p] is True  -> Memory(EPD(pdb) + p) == b'aaaa'
-    # effplayer[p] is False -> Memory(EPD(pdb) + p) == b'\0\0\0\0'
-
-    # Create triggers
-    offset_curpl = 0x6509B0
-    t1, t2, tc, t3 = c.Forward(), c.Forward(), c.Forward(), c.Forward()
-
-    t1 << c.RawTrigger(
-        nextptr=t3,
-        conditions=c.Memory(offset_curpl, c.AtMost, 7),
-        actions=[
-            c.SetNextPtr(t1, t2),
-            c.SetMemory(offset_curpl, c.Add, ut.EPD(pdb))
-        ]
-    )
-
-    t2 << c.RawTrigger(
-        nextptr=t3,
-        conditions=c.Deaths(c.CurrentPlayer, c.Exactly, ut.b2i4(b'aaaa'), 0),
-        actions=[
-            c.SetNextPtr(t2, tc),
-            c.SetMemory(offset_curpl, c.Subtract, ut.EPD(pdb)),
-        ]
-    )
-
-    tc << c.NextTrigger()
-
-    Trigger(conditions, actions)
-
-    c.RawTrigger(
-        actions=[
-            c.SetNextPtr(t2, t3),
-            c.SetMemory(offset_curpl, c.Add, ut.EPD(pdb))
-        ]
-    )
-
-    t3 << c.RawTrigger(
-        actions=[
-            c.SetNextPtr(t1, t3),
-            c.SetMemory(offset_curpl, c.Subtract, ut.EPD(pdb))
-        ]
-    )
-
-


eudplib\trigger\tpatcher.py : 100 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
-97
-98
-99
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .. import utils as ut
-from .filler import _filldw, _fillwbb, _fillbbbb
-
-
-def HasEUDVariable(l):
-    for i in l:
-        i = ut.unProxy(i)
-        if isinstance(i, c.EUDVariable):
-            return True
-    return False
-
-
-def ApplyPatchTable(initepd, obj, patchTable):
-    def fieldSelector(fieldName):
-        if type(fieldName) is str:
-            return getattr(obj, fieldName)
-        else:
-            return fieldName
-
-    for i, patchEntry in enumerate(patchTable):
-        patchFields = patchEntry
-        memoryFiller = {
-            1: _filldw,
-            3: _fillwbb,
-            4: _fillbbbb,
-        }[len(patchFields)]
-
-        fieldList = list(map(fieldSelector, patchFields))
-        if HasEUDVariable(fieldList):
-            memoryFiller(initepd + i, *fieldList)
-            for fieldName in patchFields:
-                if type(fieldName) is str:
-                    setattr(obj, fieldName, 0)
-
-
-condpt = [
-    ['locid'],
-    ['player'],
-    ['amount'],
-    ['unitid', 'comparison', 'condtype'],
-    ['restype', 'flags', 0, 0],
-]
-
-actpt = [
-    ['locid1'],
-    ['strid'],
-    ['wavid'],
-    ['time'],
-    ['player1'],
-    ['player2'],
-    ['unitid', 'acttype', 'amount'],
-    ['flags', 0, 0, 0]
-]
-
-
-def PatchCondition(cond):
-    if isinstance(cond, c.EUDVariable):
-        return cond >= 1
-
-    elif isinstance(cond, int) or isinstance(cond, bool):
-        if cond:
-            return c.Always()
-        else:
-            return c.Never()
-
-    else:
-        ApplyPatchTable(ut.EPD(cond), cond, condpt)
-        return cond
-
-
-def PatchAction(act):
-    ApplyPatchTable(ut.EPD(act), act, actpt)
-    return act
-
-


eudplib\trigger\triggerdef.py : 127 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .tpatcher import PatchCondition, PatchAction
-from eudplib import utils as ut
-
-
-def Trigger(conditions=None, actions=None, preserved=True):
-    """General easy-to-use trigger
-
-    :param conditions: List of conditions. If there are none, trigger will
-        always execute.
-    :param actions: List of actions. If there are none, trigger will have no
-        actions.
-    :param preserved: Is trigger preserved? True by default.
-
-    .. note::
-        This is 'extended' trigger. All conditions and variables can contain
-        `EUDVariable` object, and there may be more than 16 conditions and 64
-        actions. Trigger internally uses `RawTrigger`.
-    """
-
-    ut.ep_assert(isinstance(preserved, bool), 'preserved should be bool')
-
-    if conditions is None:
-        conditions = []
-    if actions is None:
-        actions = None
-
-    conditions = ut.FlattenList(conditions)
-    actions = ut.FlattenList(actions)
-
-    # Translate boolean conditions.
-    for i, cond in enumerate(conditions):
-        if isinstance(cond, bool):
-            if cond:
-                conditions[i] = c.Always()
-            else:
-                conditions[i] = c.Never()
-
-    # Normal
-    if len(conditions) <= 16 and len(actions) <= 64:
-        patched_conds = []
-        for cond in conditions:
-            patched_conds.append(PatchCondition(cond))
-
-        patched_actions = []
-        for act in actions:
-            patched_actions.append(PatchAction(act))
-
-        c.RawTrigger(
-            conditions=patched_conds,
-            actions=patched_actions,
-            preserved=preserved
-        )
-
-    else:
-        # Extended trigger
-        condts = []
-        cend = c.Forward()
-
-        # Check conditions
-        for i in range(0, len(conditions), 16):
-            conds = conditions[i:i + 16]
-            cts = c.Forward()
-
-            patched_conds = []
-            for cond in conds:
-                patched_conds.append(PatchCondition(cond))
-
-            nextcond = c.Forward()
-            cts << c.RawTrigger(
-                nextptr=cend,
-                conditions=patched_conds,
-                actions=c.SetNextPtr(cts, nextcond)
-            )
-            nextcond << c.NextTrigger()
-
-            condts.append(cts)
-
-        skipt = c.Forward()
-        if not preserved:
-            a = c.RawTrigger()
-            c.RawTrigger(actions=c.SetNextPtr(a, skipt))
-
-        # Execute actions
-        for i in range(0, len(actions), 64):
-            acts = actions[i:i + 64]
-            patched_actions = []
-            for act in acts:
-                patched_actions.append(PatchAction(act))
-
-            c.RawTrigger(actions=patched_actions)
-
-        if not preserved:
-            skipt << c.NextTrigger()
-
-        # Revert conditions
-        cend << c.NextTrigger()
-        for i in range(0, len(condts), 64):
-            c.RawTrigger(
-                actions=[c.SetNextPtr(cts, cend) for cts in condts[i:i + 64]]
-            )
-
-


eudplib\trigger\__init__.py : 29 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .triggerdef import Trigger
-from .branch import EUDBranch
-from .ptrigger import PTrigger
-
-


eudplib\trigtrg\runtrigtrg.py : 112 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .. import core as c
-from .. import ctrlstru as cs
-
-_runner_start = [c.Forward() for _ in range(8)]
-_runner_end = [c.Forward() for _ in range(8)]
-
-c.PushTriggerScope()
-for player in range(8):
-    _runner_start[player] << c.RawTrigger(nextptr=_runner_end[player])
-    _runner_end[player] << c.RawTrigger(nextptr=~(0x51A280 + player * 12 + 4))
-c.PopTriggerScope()
-
-
-@c.EUDFunc
-def RunTrigTrigger():
-    from .. import eudlib as sf
-
-    oldcp = sf.f_getcurpl()
-
-    for player in range(8):
-        skipt = c.Forward()
-        cs.EUDJumpIf(
-            c.Memory(
-                0x51A280 + 12 * player + 4,
-                c.Exactly,
-                0x51A280 + 12 * player + 4
-            ), skipt)
-        nt = c.Forward()
-        c.RawTrigger(
-            nextptr=_runner_start[player],
-            actions=[
-                c.SetMemory(0x6509B0, c.SetTo, player),
-                c.SetNextPtr(_runner_end[player], nt)
-            ]
-        )
-        nt << c.RawTrigger(
-            actions=c.SetNextPtr(
-                _runner_end[player],
-                ~(0x51A280 + player * 12 + 4)
-            )
-        )
-        skipt << c.NextTrigger()
-
-    sf.f_setcurpl(oldcp)
-
-
-#######
-
-orig_tstart = None
-orig_tend = None
-runner_end_array = None
-
-
-def AllocTrigTriggerLink():
-    global orig_tstart, orig_tend, runner_end_array
-    if not orig_tstart:
-        from .. import eudlib as sf
-
-        orig_tstart = sf.EUDArray(8)
-        orig_tend = sf.EUDArray(8)
-        runner_end_array = sf.EUDArray(_runner_end)
-
-
-def GetFirstTrigTrigger(player):
-    """ Get dlist start of trig-trigger for player """
-    AllocTrigTriggerLink()
-    return orig_tstart[player]
-
-
-def GetLastTrigTrigger(player):
-    """ Get dlist end of trig-trigger for player"""
-    AllocTrigTriggerLink()
-    return orig_tend[player]
-
-
-def TrigTriggerBegin(player):
-    AllocTrigTriggerLink()
-    return GetFirstTrigTrigger(player)
-
-
-def TrigTriggerEnd(player):
-    AllocTrigTriggerLink()
-    if isinstance(player, int):
-        return _runner_end[player]
-    else:
-        return runner_end_array[player]
-
-


eudplib\trigtrg\trigtrg.py : 194 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-'''
-WARNING! This code is speciallized for use on eudplib
-- Default player of rawtrigger is 'All Player'.
-- Only conditions/actions used in eudplib are declared
-- Condition/Action input filtering (& 0xFFFFFFFF thing) are only applied to
-  player & number section of Deaths/SetDeaths
-Note this when using this code outside of eudplib.
-'''
-
-from struct import pack
-from eudplib import utils as ut
-
-
-def i2b1(i):
-    return bytes((i & 0xFF,))
-
-
-def i2b2(i):
-    return bytes((i & 0xFF, (i >> 8) & 0xFF))
-
-
-def i2b4(i):
-    return bytes((
-        i & 0xFF,
-        (i >> 8) & 0xFF,
-        (i >> 16) & 0xFF,
-        (i >> 24) & 0xFF,
-    ))
-
-
-# for Deaths
-AtLeast = 0
-AtMost = 1
-Exactly = 10
-
-# for Set Death
-SetTo = 7
-Add = 8
-Subtract = 9
-
-# player enum
-CurrentPlayer = 13
-AllPlayers = 17
-
-# constructor
-_bc_dict = {
-    1: i2b1,
-    2: i2b2,
-    4: i2b4,
-    None: (lambda x: x)
-}
-
-
-def FlattenList(l):
-    if type(l) is bytes or type(l) is str:
-        return [l]
-
-    try:
-        ret = []
-        for item in l:
-            ret.extend(FlattenList(item))
-        return ret
-
-    except TypeError:  # l is not iterable
-        return [l]
-
-
-def Condition(locid, player, amount, unitid,
-              comparison, condtype, restype, flag):
-    if player < 0:
-        player += 0x100000000  # EPD
-
-    player &= 0xFFFFFFFF
-    amount &= 0xFFFFFFFF
-
-    return pack('<IIIHBBBBBB', locid, player, amount, unitid,
-                comparison, condtype, restype, flag, 0, 0)
-
-
-def Action(locid1, strid, wavid, time, player1,
-           player2, unitid, acttype, amount, flags):
-    player1 &= 0xFFFFFFFF
-    player2 &= 0xFFFFFFFF
-
-    if player1 < 0:
-        player1 += 0x100000000  # EPD
-    if player2 < 0:
-        player2 += 0x100000000  # EPD
-    return pack('<IIIIIIHBBBBBB', locid1, strid, wavid, time, player1, player2,
-                unitid, acttype, amount, flags, 0, 0, 0)
-
-
-def Trigger(players=[AllPlayers], conditions=[], actions=[], prtrig=True):
-    conditions = FlattenList(conditions)
-    actions = FlattenList(actions)
-
-    ut.ep_assert(type(players) is list)
-    ut.ep_assert(type(conditions) is list)
-    ut.ep_assert(type(actions) is list)
-    ut.ep_assert(len(conditions) <= 16)
-    ut.ep_assert(len(actions) <= 64)
-    peff = bytearray(28)
-    for p in players:
-        peff[p] = 1
-
-    b = b''.join(
-        conditions +
-        [bytes(20 * (16 - len(conditions)))] +
-        actions +
-        [bytes(32 * (64 - len(actions)))] +
-        [prtrig and b'\x04\0\0\0' or b'\0\0\0\0'] +
-        [bytes(peff)]
-    )
-    ut.ep_assert(len(b) == 2400)
-    return b
-
-
-# conditions
-def Deaths(player, comparison, number, unit):
-    return Condition(
-        0x00000000, player, number, unit,
-        comparison, 0x0F, 0x00, 0x10)
-
-
-def Memory(offset, comparison, number):
-    ut.ep_assert(offset % 4 == 0)  # only this kind of comparison is possible
-    player = EPD(offset)
-
-    if 0 <= player < 12 * 228:  # eud possible
-        unit = player // 12
-        player = player % 12
-        return Deaths(player, comparison, number, unit)
-
-    else:  # use epd
-        return Deaths(player, comparison, number, 0)
-
-
-# actions
-def SetDeaths(player, settype, number, unit):
-    return Action(
-        0x00000000, 0x00000000, 0x00000000, 0x00000000,
-        player, number, unit, 0x2D, settype, 0x14)
-
-
-def SetMemory(offset, settype, number):
-    ut.ep_assert(offset % 4 == 0)
-    player = EPD(offset)
-
-    if 0 <= player < 12 * 228:  # eud possible
-        unit = player // 12
-        player = player % 12
-        return SetDeaths(player, settype, number, unit)
-
-    else:  # use epd
-        return SetDeaths(player, settype, number, 0)
-
-
-def DisplayTextMessage(Text):
-    return Action(0, Text, 0, 0, 0, 0, 0, 9, 0, 4)
-
-
-def Draw():
-    return Action(0, 0, 0, 0, 0, 0, 0, 56, 0, 4)
-
-
-def EPD(offset):
-    ut.ep_assert(offset % 4 == 0)
-    return (offset - 0x0058A364) // 4
-
-


eudplib\trigtrg\__init__.py : 35 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .runtrigtrg import (
-    RunTrigTrigger,
-
-    GetFirstTrigTrigger,
-    GetLastTrigTrigger,
-
-    TrigTriggerBegin,
-    TrigTriggerEnd,
-)
-
-


eudplib\utils\binio.py : 61 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-def b2i1(b, index=0):
-    return b[index]
-
-
-def b2i2(b, index=0):
-    return b[index] | (b[index + 1] << 8)
-
-
-def b2i4(b, index=0):
-    return (
-        b[index] |
-        (b[index + 1] << 8) |
-        (b[index + 2] << 16) |
-        (b[index + 3] << 24)
-    )
-
-
-def i2b1(i):
-    return bytes((i & 0xFF,))
-
-
-def i2b2(i):
-    i &= 0xFFFF
-    return bytes((i & 0xFF, (i >> 8) & 0xFF))
-
-
-def i2b4(i):
-    i &= 0xFFFFFFFF
-    return bytes((
-        i & 0xFF,
-        (i >> 8) & 0xFF,
-        (i >> 16) & 0xFF,
-        (i >> 24) & 0xFF,
-    ))
-
-


eudplib\utils\blockstru.py : 94 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .eperror import ep_assert
-
-
-class BlockStruManager:
-
-    def __init__(self):
-        self._blockstru = []
-        self._lastblockdict = {}
-
-    def empty(self):
-        return not self._blockstru
-
-
-_current_bsm = BlockStruManager()  # Default one
-
-
-def SetCurrentBlockStruManager(bsm):
-    global _current_bsm
-    old_bsm = _current_bsm
-    _current_bsm = bsm
-    return old_bsm
-
-
-def EUDCreateBlock(name, userdata):
-    _blockstru = _current_bsm._blockstru
-    _lastblockdict = _current_bsm._lastblockdict
-
-    block = (name, userdata)
-    _blockstru.append(block)
-
-    if name not in _lastblockdict:
-        _lastblockdict[name] = []
-    _lastblockdict[name].append(block)
-
-
-def EUDGetLastBlock():
-    _blockstru = _current_bsm._blockstru
-    return _blockstru[-1]
-
-
-def EUDGetLastBlockOfName(name):
-    _lastblockdict = _current_bsm._lastblockdict
-
-    return _lastblockdict[name][-1]
-
-
-def EUDPeekBlock(name):
-    lastblock = EUDGetLastBlock()
-    ep_assert(lastblock[0] == name, 'Block starting/ending mismatch')
-    return lastblock
-
-
-def EUDPopBlock(name):
-    _blockstru = _current_bsm._blockstru
-    _lastblockdict = _current_bsm._lastblockdict
-
-    lastblock = _blockstru.pop()
-    ep_assert(lastblock[0] == name, """\
-Block starting/ending mismatch:
-    - Started with %s
-    - Ended with %s\
-""" % (lastblock[0], name))
-    _lastblockdict[name].pop()
-    return lastblock
-
-
-def EUDGetBlockList():
-    return _current_bsm._blockstru
-
-


eudplib\utils\eperror.py : 34 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-class EPError(Exception):
-    pass
-
-
-def ep_assert(statement, message="Assertion failed"):
-    if not statement:
-        raise EPError(message)
-
-


eudplib\utils\etc.py : 172 lines

-
  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import functools
-import collections
-import itertools
-
-
-def EPD(p):
-    return (p + (-0x58A364)) // 4
-
-
-# -------
-
-
-def FlattenList(l):
-    if isinstance(l, bytes) or isinstance(l, str):
-        return [l]
-
-    try:
-        ret = []
-        for item in l:
-            ret.extend(FlattenList(item))
-        return ret
-
-    except TypeError:  # l is not iterable
-        return [l]
-
-
-def eqsplit(iterable, eqr):
-    if isinstance(iterable, list):
-        for i in range(0, len(iterable), eqr):
-            yield iterable[i:i + eqr]
-
-    else:
-        it = iter(iterable)
-        item = list(itertools.islice(it, eqr))
-        while item:
-            yield item
-            item = list(itertools.islice(it, eqr))
-
-
-def List2Assignable(l):
-    if len(l) == 1:
-        return l[0]
-
-    else:
-        return l
-
-
-def Assignable2List(a):
-    if a is None:
-        return []
-
-    elif isinstance(a, collections.Iterable):
-        return list(a)
-
-    else:
-        return [a]
-
-
-def cachedfunc(function):
-    memo = {}
-
-    @functools.wraps(function)
-    def wrapper(*args):
-        args_hashable = tuple(args)
-        if args_hashable in memo:
-            return memo[args_hashable]
-        else:
-            rv = function(*args)
-            memo[args_hashable] = rv
-            return rv
-    return wrapper
-
-
-# -------
-
-# Original code from TrigEditPlus::ConvertString_SCMD2ToRaw
-
-def SCMD2Text(s):
-        #
-        # normal -> xdigitinput1 -> xdigitinput2 -> xdigitinput3 -> normal
-        #        '<'           xdigit          xdigit            '>'
-        #                        -> normal
-        #                       '>' emit '<>'
-        #                                        -> normal
-        #                                        '>' emit x00
-        #                                                        -> normal
-        # xdigit/normal  emit '<xx'
-    def toxdigit(i):
-        if '0' <= i <= '9':
-            return ord(i) - 48
-        elif 'a' <= i <= 'z':
-            return ord(i) - 97 + 10
-        elif 'A' <= i <= 'Z':
-            return ord(i) - 65 + 10
-        else:
-            return None
-
-    state = 0
-    buf = [None, None]
-    bufch = [None, None]
-    out = []
-
-    # simple fsm
-    for i in s:
-        if state == 0:
-            if i == '<':
-                state = 1
-            else:
-                out.append(i)
-
-        elif state == 1:
-            xdi = toxdigit(i)
-            if xdi is not None:
-                buf[0] = xdi
-                bufch[0] = i
-                state = 2
-
-            else:
-                out.extend(['<', i])
-                state = 0
-
-        elif state == 2:
-            xdi = toxdigit(i)
-            if xdi is not None:
-                buf[1] = xdi
-                bufch[1] = i
-                state = 3
-
-            elif i == '>':
-                out.append(chr(buf[0]))
-                state = 0
-
-            else:
-                out.extend(['<', bufch[0], i])
-                state = 0
-
-        elif state == 3:
-            if i == '>':
-                out.append(chr(buf[0] * 16 + buf[1]))
-                state = 0
-
-            else:
-                out.extend(['<', bufch[0], bufch[1], i])
-                state = 0
-
-    return ''.join(out)
-
-


eudplib\utils\exprproxy.py : 91 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-
-class ExprProxy:
-
-    ''' Class which can contain both constxpr and eudvariable '''
-
-    def __init__(self, initval):
-        self._value = initval
-
-    def getValue(self):
-        return self._value
-
-    # Proxy operators
-    def __add__(self, other):
-        return self._value + other
-
-    def __radd__(self, other):
-        return other + self._value
-
-    def __sub__(self, other):
-        return self._value - other
-
-    def __rsub__(self, other):
-        return other - self._value
-
-    def __mul__(self, k):
-        return self._value * k
-
-    def __rmul__(self, k):
-        return k * self._value
-
-    def __floordiv__(self, k):
-        return self._value // k
-
-    # Proxy other methods
-    def __getattr__(self, name):
-        return getattr(self._value, name)
-
-
-def unProxy(x):
-    try:
-        return unProxy(x.getValue())
-    except AttributeError:
-        return x
-
-


eudplib\utils\stackobjs.py : 74 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from cffi import FFI
-import os
-import sys
-
-
-def find_data_file(filename):
-    if getattr(sys, 'frozen', False):
-        # The application is frozen
-        datadir = os.path.dirname(sys.executable)
-    else:
-        # The application is not frozen
-        # Change this bit to match where you store your data files:
-        datadir = os.path.dirname(__file__)
-
-    return os.path.join(datadir, filename)
-
-
-#  initFFI()
-ffi = FFI()
-ffi.cdef("""
-typedef struct
-{
-    size_t _size;
-    int* _data;
-} OccupMap;
-
-void StackOccupmaps(OccupMap occupList[], size_t* ret, int size);
-""")
-stackObjDLL = ffi.dlopen(find_data_file("StackOccupmap.dll"))
-
-
-# Function def
-
-def StackObjects(found_objects, dwoccupmap_dict, alloctable):
-    occupListPy = []
-    objn = len(found_objects)
-
-    for obj in found_objects:
-        dwoccupmap = dwoccupmap_dict[obj]
-        dwOccupmapData = ffi.new("int[]", dwoccupmap)
-        occupListPy.append((len(dwoccupmap), dwOccupmapData))
-
-    occupList = ffi.new("OccupMap[]", occupListPy)
-    retList = ffi.new("size_t[]", objn)
-    stackObjDLL.StackOccupmaps(occupList, retList, objn)
-
-    for i, obj in enumerate(found_objects):
-        alloctable[obj] = retList[i]
-
-


eudplib\utils\ubconv.py : 53 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-import locale
-from .eperror import EPError
-
-g_encoding = locale.getpreferredencoding()
-
-
-def UbconvSetEncoding(encoding):
-    global g_encoding
-    g_encoding = encoding
-
-
-def u2b(s):
-    if isinstance(s, str):
-        return s.encode(g_encoding)
-    elif isinstance(s, bytes):
-        return s
-    else:
-        raise EPError('Invalid type %s' % type(s))
-
-
-def b2u(b):
-    if isinstance(b, bytes):
-        return b.decode(g_encoding)
-    elif isinstance(b, str):
-        return b
-    else:
-        raise EPError('Invalid type %s' % type(b))
-
-


eudplib\utils\__init__.py : 54 lines

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-'''
-Copyright (c) 2014 trgk
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-'''
-
-from .ubconv import u2b, b2u
-from .binio import b2i1, b2i2, b2i4, i2b1, i2b2, i2b4
-from .blockstru import (
-    EUDCreateBlock,
-    EUDGetLastBlock,
-    EUDGetLastBlockOfName,
-    EUDPeekBlock,
-    EUDPopBlock,
-    EUDGetBlockList,
-)
-from .etc import (
-    EPD,
-    FlattenList,
-    List2Assignable,
-    Assignable2List,
-    SCMD2Text,
-    cachedfunc
-)
-
-from .eperror import (
-    EPError,
-    ep_assert
-)
-
-from .exprproxy import (
-    ExprProxy,
-    unProxy,
-)
-
-


- - diff --git a/encoding_apply.py b/tools/encoding_apply.py similarity index 91% rename from encoding_apply.py rename to tools/encoding_apply.py index f07cbe25..e07fbbe8 100644 --- a/encoding_apply.py +++ b/tools/encoding_apply.py @@ -8,7 +8,7 @@ print('Auto "license inserter') -for root, dirs, files in os.walk("eudplib"): +for root, dirs, files in os.walk("../eudplib"): if 'pybind11' in root: continue diff --git a/tools/linecounter.py b/tools/linecounter.py new file mode 100644 index 00000000..8aa83bfb --- /dev/null +++ b/tools/linecounter.py @@ -0,0 +1,21 @@ +import os + +totlinen = 0 +totsize = 0 +totstrlist = [] + +for root, dirs, files in os.walk("../eudplib"): + for f in files: + if 'cp949' in f: + continue + + if f[-3:] == ".py": + finalpath = os.path.join(root, f) + code = open(finalpath, "r").read() + totsize += len(code) + linen = code.count("\n") + 1 + print("%-40s : %4d" % (finalpath, linen)) + totlinen += linen + +print("Total lines: %d" % totlinen) +print("Total size: %d" % totsize) diff --git a/mkdist.bat b/tools/mkdist.bat similarity index 100% rename from mkdist.bat rename to tools/mkdist.bat diff --git a/reinstall.bat b/tools/reinstall.bat similarity index 87% rename from reinstall.bat rename to tools/reinstall.bat index b70a0184..243d5542 100644 --- a/reinstall.bat +++ b/tools/reinstall.bat @@ -1,4 +1,7 @@ @echo off + +cd .. pip uninstall -y eudplib del C:\Python34\Lib\site-packages\eudplib\ python setup.py install +cd tools \ No newline at end of file diff --git a/reinstall.sh b/tools/reinstall.sh similarity index 81% rename from reinstall.sh rename to tools/reinstall.sh index cd63bb77..b8034608 100755 --- a/reinstall.sh +++ b/tools/reinstall.sh @@ -1,4 +1,6 @@ # !/usr/bin/sh +cd .. pip3 uninstall eudplib python3 setup.py install +cd tools diff --git a/tracemain.py b/tracemain.py deleted file mode 100644 index 89a8881e..00000000 --- a/tracemain.py +++ /dev/null @@ -1 +0,0 @@ -# Uses pip install https://github.com/n1nj4sec/memorpy/archive/master.zip diff --git a/traceperf.py b/traceperf.py deleted file mode 100644 index 4bb710da..00000000 --- a/traceperf.py +++ /dev/null @@ -1,25 +0,0 @@ -import inspect -import timeit -import sys - - -def f(): - frame = sys._getframe(1) - try: - msg = "%s|%s|%s" % ( - frame.f_code.co_filename, - frame.f_code.co_name, - frame.f_lineno, - ) - return msg - finally: - del frame - - -def g(): - print(f()) - - -g() - -print(timeit.timeit("f()", setup="from __main__ import f", number=1000)) From 08a85b0eaf190509bf27b55395feeaa4e85dfbb3 Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Mon, 25 Mar 2019 00:26:15 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix(unprotect):=20chkdiff=20direction=20wer?= =?UTF-8?q?e=20wrong.=20(now=20correct:=20compiled=20=E2=86=92=20original)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: Patch file is incompatible. Prior version of patches were useless anyway so I doubt there's any difference. --- eudplib/maprw/savemap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eudplib/maprw/savemap.py b/eudplib/maprw/savemap.py index 0ad2f1e2..37547fde 100644 --- a/eudplib/maprw/savemap.py +++ b/eudplib/maprw/savemap.py @@ -93,7 +93,7 @@ def SaveMap(fname, rootf): print('[U] Patch-based unprotection enabled.') origchkt = mapdata.GetOriginalChkTokenized() print(' 1. Calculating bsdiff btw original & new chk') - diff = chkdiff(origchkt, chkt) + diff = chkdiff(chkt, origchkt) print(' 2. Compressing') diff = lzma.compress(diff) print(' 3. Encrypting') From 7e7c43a8ead927d6629f00045e48d26087efdea8 Mon Sep 17 00:00:00 2001 From: Hyun Woo Park Date: Mon, 25 Mar 2019 00:28:20 +0900 Subject: [PATCH 8/8] =?UTF-8?q?build(unprotect):=20simple-crypt=20?= =?UTF-8?q?=E2=86=92=20pycryptodomex=20(pycrypto/simple-crypt=20seems=20ab?= =?UTF-8?q?andoned)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PyCrypto won't install to windows version well. So going to PyCryptodomex. BREAKING CHANGE: Library change → Patch file format change --- eudplib/maprw/savemap.py | 20 +++++++++++++++++--- setup.py | 3 +-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/eudplib/maprw/savemap.py b/eudplib/maprw/savemap.py index 37547fde..85400019 100644 --- a/eudplib/maprw/savemap.py +++ b/eudplib/maprw/savemap.py @@ -31,10 +31,13 @@ from .mpqadd import UpdateMPQ from ..core.eudfunc.trace.tracetool import _GetTraceMap, _ResetTraceMap from .chkdiff import chkdiff +from eudplib.utils import u2utf8 +import os import binascii import lzma -import simplecrypt +import hashlib +from Cryptodome.Cipher import AES traceHeader = None traceMap = [] @@ -97,8 +100,19 @@ def SaveMap(fname, rootf): print(' 2. Compressing') diff = lzma.compress(diff) print(' 3. Encrypting') - diff = simplecrypt.encrypt(patchPassword, diff) - mw.PutFile("staredit\\scenario.chk.patch", diff) + + aesKey = hashlib.sha256(u2utf8(patchPassword)).digest()[:16] + cipher = AES.new(aesKey, AES.MODE_EAX) + nonce = cipher.nonce + ciphertext, tag = cipher.encrypt_and_digest(diff) + + mw.PutFile("staredit\\scenario.chk.diff", ciphertext) + mw.PutFile("staredit\\scenario.chk.nonce", nonce) + mw.PutFile("staredit\\scenario.chk.tag", tag) + + open(os.path.expanduser('~/chk.diff'), 'wb').write(ciphertext) + open(os.path.expanduser('~/chk.nonce'), 'wb').write(nonce) + open(os.path.expanduser('~/chk.tag'), 'wb').write(tag) UpdateMPQ(mw) mw.Compact() diff --git a/setup.py b/setup.py index 505ff809..562fa89b 100644 --- a/setup.py +++ b/setup.py @@ -20,8 +20,7 @@ def cythonize(x): python_requires=">=3", install_requires=[ 'bsdiff4', - 'simple-crypt', - 'appdirs', + 'pycryptodomex', ], # metadata for upload to PyPI author="Trgk",