Source code for ocatari.ram.alien

from .game_objects import GameObject, ValueObject
import sys 

MAX_NB_OBJECTS = {"Player": 1, "Alien": 3, "Pulsar": 1, "Egg": 156}
MAX_NB_OBJECTS_HUD = {}# 'Score': 1}

[docs] class Player(GameObject): def __init__(self): super(Player, self).__init__() self._xy = 0, 0 self.wh = (6, 13) self.rgb = 132, 144, 252 self.hud = False
[docs] class Alien(GameObject): def __init__(self): super(Alien, self).__init__() self._xy = 0, 0 self.wh = (8, 13) self.rgb = 236, 140, 224 self.vulnerable = False self.hud = False
[docs] class Egg(GameObject): def __init__(self): super(Egg, self).__init__() self._xy = 0, 0 self.wh = (1, 2) self.rgb = 198, 108, 58 self.hud = False
[docs] class Pulsar(GameObject): def __init__(self): super(Pulsar, self).__init__() self._xy = 0, 0 self.wh = (7, 5) self.rgb = 252, 144, 144 self.hud = False
[docs] class Score(ValueObject): def __init__(self): super(Score, self).__init__() self._xy = 0, 0 self.wh = (6, 7) self.rgb = 132, 144, 252 self.hud = False
[docs] class Life(GameObject): def __init__(self): super(Life, self).__init__() self._xy = 0, 0 self.wh = (5, 5) self.rgb = 132, 144, 252 self.hud = False
# parses MAX_NB* dicts, returns default init list of objects def _get_max_objects(hud=False): def fromdict(max_obj_dict): objects = [] mod = sys.modules[__name__] for k, v in max_obj_dict.items(): for _ in range(0, v): objects.append(getattr(mod, k)()) return objects if hud: return fromdict(MAX_NB_OBJECTS_HUD) return fromdict(MAX_NB_OBJECTS) def _init_objects_ram(hud=False): """ (Re)Initialize the objects """ objects = [Player()] objects.extend([None] * 172) if hud: objects.extend([None] * 7) return objects def _detect_objects_ram(objects, ram_state, hud=False): """ For all 3 objects: (x, y, w, h, r, g, b) """ player = objects[0] player.xy = ram_state[52] + 18, 196 - ram_state[45]*2 + 1 # y 110 = 43 152 = 22 for i in range(3): if ram_state[42+i] and ram_state[49+i]: alien = Alien() objects[1+i] = alien alien.xy = ram_state[49+i] + 17, 196 - ram_state[42+i]*2 if ram_state[117] == 139: alien.rgb = 101, 111, 228 alien.vulnerable = True elif i == 0: alien.rgb = 132, 252, 212 alien.vulnerable = False elif i == 1: alien.rgb = 252, 252, 84 alien.vulnerable = False elif i == 2: alien.rgb = 236, 140, 224 alien.vulnerable = False else: objects[1+i] = None if ram_state[103]: if ram_state[103] == 1: pulsar = Pulsar() objects[4] = pulsar pulsar.xy = 123, 137 elif ram_state[103] == 2: pulsar = Pulsar() objects[4] = pulsar pulsar.xy = 31, 137 elif ram_state[103] == 3: pulsar = Pulsar() objects[4] = pulsar pulsar.xy = 77, 17 else: objects[4] = None ############################################## # ============================================ ############################################## y = 19 for i in range(13): if ram_state[65+i]&4: egg0 = Egg() objects[5+i*6] = egg0 egg0.xy = 26, y else: objects[5+i*6] = None if ram_state[65+i]&8: egg1 = Egg() objects[6+i*6] = egg1 egg1.xy = 56, y else: objects[6+i*6] = None if ram_state[65+i]&16: egg2 = Egg() objects[7+i*6] = egg2 egg2.xy = 34, y+2 else: objects[7+i*6] = None if ram_state[65+i]&32: egg3 = Egg() objects[8+i*6] = egg3 egg3.xy = 64, y+2 else: objects[8+i*6] = None if ram_state[65+i]&64: egg4 = Egg() objects[9+i*6] = egg4 egg4.xy = 42, y+4 else: objects[9+i*6] = None if ram_state[65+i]&128: egg5 = Egg() objects[10+i*6] = egg5 egg5.xy = 72, y+4 else: objects[10+i*6] = None y += 12 y = 19 for i in range(13): if ram_state[78+i]&4: egg0 = Egg() objects[83+i*6] = egg0 egg0.xy = 89, y else: objects[83+i*6] = None if ram_state[78+i]&8: egg1 = Egg() objects[84+i*6] = egg1 egg1.xy = 118, y else: objects[84+i*6] = None if ram_state[78+i]&16: egg2 = Egg() objects[85+i*6] = egg2 egg2.xy = 97, y+2 else: objects[85+i*6] = None if ram_state[78+i]&32: egg3 = Egg() objects[86+i*6] = egg3 egg3.xy = 126, y+2 else: objects[86+i*6] = None if ram_state[78+i]&64: egg4 = Egg() objects[87+i*6] = egg4 egg4.xy = 105, y+4 else: objects[87+i*6] = None if ram_state[78+i]&128: egg5 = Egg() objects[88+i*6] = egg5 egg5.xy = 134, y+4 else: objects[88+i*6] = None y += 12 if hud: score = Score() objects[173] = score score.xy = 63, 176 score.wh = 6, 7 x = 23 w = 46 for i in [3, 5, 7, 9, 11]: if ram_state[i] != 128: score.xy = x, 176 score.wh = w, 7 else: x += 8 w -= 8 x = 21 lives = ram_state[64] - 1 for i in range(6): if lives > 0: objects[174+i] = Life() objects[174+i].xy = x + 8*i, 187 else: objects[174+i] = None lives -= 1 def _detect_objects_alien_raw(info, ram_state): """ returns unprocessed list with ball_x, ball_y, enemy_y, player_y """ info["objects_list"] = ram_state[32:36] # def _detect_objects_alien_revised_old(info, ram_state, hud=False): # """ # For all 3 objects: # (x, y, w, h, r, g, b) # """ # objects = {} # objects["player"] = ram_state[32]+5, ram_state[34]+38, 14, 46, 214, 214, 214 # objects["enemy"] = ram_state[33]+4, ram_state[35]+38, 14, 46, 0, 0, 0 # if hud: # objects["enemy_score"] = 111, 5, 6, 7, 0, 0, 0 # if ram_state[19] < 10: # objects["enemy_score2"] = 0, 0, 0, 0, 0, 0, 0 # else: # objects["enemy_score2"] = 103, 5, 6, 7, 0, 0, 0 # objects["player_score"] = 47, 5, 6, 7, 214, 214, 214 # if ram_state[18] < 10: # objects["player_score2"] = 0, 0, 0, 0, 0, 0, 0 # else: # objects["player_score2"] = 39, 5, 6, 7, 214, 214, 214 # objects["logo"] = 62, 189, 32, 7, 20, 60, 0 # objects["time1"] = 63, 17, 6, 7, 20, 60, 0 # objects["time2"] = 73, 18, 2, 5, 20, 60, 0 # objects["time3"] = 79, 17, 6, 7, 20, 60, 0 # objects["time4"] = 87, 17, 6, 7, 20, 60, 0 # info["objects"] = objects