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()
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)
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 ut.isUnproxyInstance(dst, DBString): dst = dst.GetStringMemoryAddr() args = ut.FlattenList(args) for arg in args: if ut.isUnproxyInstance(arg, bytes): dst = f_dbstr_addstr(dst, c.Db(arg + b'\0')) elif ut.isUnproxyInstance(arg, str): dst = f_dbstr_addstr(dst, c.Db(ut.u2b(arg) + b'\0')) elif ut.isUnproxyInstance(arg, DBString): dst = f_dbstr_addstr(dst, arg.GetStringMemoryAddr()) elif ut.isUnproxyInstance(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 ut.isUnproxyInstance(arg, c.EUDVariable): dst = f_dbstr_adddw(dst, arg) elif c.IsConstExpr(arg): dst = f_dbstr_adddw(dst, arg) elif ut.isUnproxyInstance(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
def QueueGameCommand_Select(n, ptrList): ptrList = EUDArray.cast(ptrList) buf = c.Db(b'\x090123456789012345678901234') bw.seekoffset(buf + 1) bw.writebyte(n) i = c.EUDVariable() i << 0 if cs.EUDWhile()(i < n): unitptr = ptrList[i] unitIndex = (unitptr - 0x59CCA8) // 336 + 1 uniquenessIdentifier = f_bread(unitptr + 0xA5) targetID = unitIndex | c.f_bitlshift(uniquenessIdentifier, 11) b0, b1 = f_dwbreak(targetID)[2:4] bw.writebyte(b0) bw.writebyte(b1) i += 1 cs.EUDEndWhile() QueueGameCommand(buf, 2 * (n + 1))
def f_lengthdir(length, angle): # sin, cos table clist = [] slist = [] 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 if cs.EUDIf()(angle >= 360): angle << c.f_div(angle, 360)[1] cs.EUDEndIf() ldir_x, ldir_y = c.EUDVariable(), c.EUDVariable() # cos, sin * 65536 # sign of cos, sin csign, ssign = c.EUDLightVariable(), c.EUDLightVariable() tableangle = c.EUDVariable() # 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() tablecos = f_dwread_epd(ut.EPD(cdb) + tableangle) tablesin = f_dwread_epd(ut.EPD(sdb) + tableangle) # 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] # 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() return ldir_x, ldir_y