def update(self, log): diplomacy = pm.struct(self.ptr + 0x7C, "iiiiiiiii") diplomacy = list(filter(lambda x: x != -1, diplomacy)) if diplomacy != self: log += [(copy(diplomacy), copy(self))] self.clear() self.extend(diplomacy)
def update(self): self.prev_hp = self.hp self.hp = pm.float(self.ptr + 0x34) self.status = pm.int8(self.ptr + 0x4C) self.resource_amount = pm.float(self.ptr + 0x48) self.resource_type = Primitive.ResourceTable[pm.int8(self.ptr + 0x50)] self.position = pm.struct(self.ptr + 0x3c, "ff") self.selected = pm.int8(self.ptr + 0x3a)
def __new__(cls, ptr, owner): if pm.int16(ptr + 0x4) == SuperclassData.building: # Main unit in TC has 4 buildings.. annex = list(pm.struct(ptr + 0x1F4, "hhhh")) annex += [pm.int16(ptr + 0x21c)] annex = list(filter(lambda x: x != -1, annex)) if len(annex) == 1: # part of TC or gate return None return super(UnitData, cls).__new__(cls)
def __init__(self, udata): super(Armor, self).__init__() cnt = pm.int16(udata.ptr + 0x142) self.displayed = pm.int16(udata.ptr + 0x17C) self.displayed_pierce = pm.int16(udata.ptr + 0x1A4) if cnt != 0: ptr = pm.pointer(udata.ptr + 0x144) big_struct = pm.struct(ptr, "hh" * cnt) iterator = iter(big_struct) self.extend(zip(iterator, iterator))
def update(self): """Creates a list of objects.""" self.clear() # sucks but ok ptr_array = pm.pointer(self.ptr + 0x4) length = pm.uint32(self.ptr + 0x8) object_pointers = pm.struct(ptr_array, "I" * length) length = pm.int8(self.owner.ptr + 0x254) Objects.selected_pointers += pm.struct(self.owner.ptr + 0x160, "I" * length) for ptr in object_pointers: r = Objects._create_(ptr, self.owner) if r is not None: r.update() self.append(r) # Appends the object to the list and sets that the object will not be deleted Objects._all[self.owner][ptr] = [r, False] # adds it into selected objects if ptr in Objects.selected_pointers: Objects.selected.append(r)
def update(self): # Check if the game is running: 0 not running, 1 running pm.update() if not pm.int32(pm.base_address + 0x9E0708): self.running = False return False # Second check. try: ptr = pm.pointer( pm.base_address + 0x006FDA30 ) # three offsets are avaliable here: 006DC7F8, 006DDCA0, 006FDA30 each should point to the same address.. if not remove one You need to check for each address in record game. pm.pointer(ptr + 0x184) except NullAddress: self.running = False return False # Third check. Time if pm.int32(ptr + 0x68) <= 0: return False self.running = True # And get the common stuff GTime.set(pm.int32(ptr + 0x68)) self.screen_position = pm.struct(ptr + 0xD8, "ff") self.speed = pm.float(ptr + 0x16C) self.pov = self.players[pm.int8(ptr + 0x174) - 1] # Must be -1 if self.pov != self.player: if self.player is not None: self.player.pov = False self.player = self.pov # Set the new pov self.player.pov = True self.__update_teams__() market_price = pm.struct( ptr + 0x238, "fff" ) # Wood, food, stone coeficient see spirit of the law - markets Objects.selected.clear() Objects.selected_pointers.clear() # Update all players data for player in self.players: player.update(market_price) self.gaia.update(market_price) return True
def __init__(self, udata): super(Attack, self).__init__() self.range = pm.float(udata.ptr + 0x154) self.reload_time = pm.float(udata.ptr + 0x160) self.accurancy = pm.int16(udata.ptr + 0x166) self.displayed = pm.int16(udata.ptr + 0x17e) cnt = pm.int16(udata.ptr + 0x148) if cnt != 0: ptr = pm.pointer(udata.ptr + 0x14c) big_struct = pm.struct(ptr, "hh" * cnt) iterator = iter(big_struct) self.extend(zip(iterator, iterator))
def update(self): # Check if the game is running pm.update() if not pm.int32(pm.base_address + 0x9C8FB0): self.running = False return False # Second check. try: ptr = pm.pointer(pm.base_address + 0x006E62D8) pm.pointer(ptr + 0x184) except NullAddress: self.running = False return False # Third check. Time if pm.int32(ptr + 0x68) <= 0: return False self.running = True # And get the common stuff GTime.set(pm.int32(ptr + 0x68)) self.screen_position = pm.struct(ptr + 0xD8, "ff") self.speed = pm.float(ptr + 0x16C) self.pov = self.players[pm.int8(ptr + 0x174) - 1] # Must be -1 if self.pov != self.player: if self.player is not None: self.player.pov = False self.player = self.pov # Set the new pov self.player.pov = True self.__update_teams__() market_price = pm.struct( ptr + 0x238, "fff" ) # Wood, food, stone coeficient see spirit of the law - markets Objects.selected.clear() Objects.selected_pointers.clear() # Update all players data for player in self.players: player.update(market_price) self.gaia.update(market_price) return True
def _check_garrison_(self): garrison = [] if not self.udata.max_garrison: return garrison try: ptr = pm.pointer(self.ptr + 0x28) ptr, cnt = pm.struct(ptr, "II") if not ptr: return garrison arr = pm.struct(ptr, "I"*cnt) for ptr in arr: udata = UnitData(pm.pointer(ptr + 0xC), self.owner) """ if r is not None: return garrison if udata and udata.superclass == SuperclassData.combatant: # << checks recursion garrison.append(Unit(ptr, self.owner, udata)) # trebuchet shouldnt bug this """ garrison.append(Unit(ptr, self.owner, udata)) # trebuchet shouldnt bug this except NullAddress: return garrison self.garrison.clear() self.garrison.extend(garrison)
def create(self): self.length = pm.int16(self.building.ptr + 0x21c) try: ptr = pm.pointer(self.building.ptr + 0x214) except NullAddress: return None while len(self) < self.length: uid, units_amount = pm.struct(ptr, "hh") for i in range(units_amount): try: ptr_icon = self.building.owner.ptr ptr_icon = pm.pointer(ptr_icon + 0x14) ptr_icon = pm.pointer(ptr_icon + 0x4 * uid) icon = pm.int16(ptr_icon + 0x54) except NullAddress: return None self.append((uid, icon)) ptr += 4 return self
def __init__(self, udata): super(Costs, self).__init__() r_type, r_amount, r_pay = pm.struct(udata.ptr + 0x18c, "hhh") if r_amount != -1: self.append((Resources.keys[r_type], r_amount, Costs.pay[r_pay]))
def __init__(self, owner): super(Resources, self).__init__() self.owner = owner self.ptr = pm.pointer(owner.ptr + 0x3c) # Pointer should be unchanged self.keys = Resources.keys self.values = pm.struct(self.ptr, Resources.fmt)
def update(self): self.values = pm.struct(self.ptr, Resources.fmt)
def __init__(self, owner): self.owner = owner self.ptr = owner.ptr diplomacy = pm.struct(self.ptr + 0x7C, "iiiiiiiii") diplomacy = filter(lambda x: x != -1, diplomacy) super(Diplomacy, self).__init__(diplomacy)