From c454d153459f509a30039d0ec55d3b821866200f Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Mon, 3 Feb 2025 21:46:05 +0000 Subject: [PATCH 1/9] Create main.py --- pets/hridyas_catgame/main.py | 207 +++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 pets/hridyas_catgame/main.py diff --git a/pets/hridyas_catgame/main.py b/pets/hridyas_catgame/main.py new file mode 100644 index 00000000..7420cb5e --- /dev/null +++ b/pets/hridyas_catgame/main.py @@ -0,0 +1,207 @@ +import displayio +from blinka_displayio_pygamedisplay import PyGameDisplay +import pygame +import time + +class PetGame: + def __init__(self): + self.display = PyGameDisplay(width=128, height=128) + pygame.display.set_caption("Virtual Pet") + + self.main_group = displayio.Group() + self.display.show(self.main_group) + + self.background_group = displayio.Group() + self.pet_group = displayio.Group() + self.ui_group = displayio.Group() + self.main_group.append(self.background_group) + self.main_group.append(self.pet_group) + self.main_group.append(self.ui_group) + + self._create_background() + self._load_pet_sprites() + self._create_ui() + + self.stats = { + "hunger": 100, + "health": 100, + "happiness": 100, + "energy": 100 + } + self.state = "idle" + self.is_sleeping = False + self.last_update = time.monotonic() + + pygame.font.init() + self.font = pygame.font.Font(None, 12) + self.screen = pygame.display.get_surface() + self.overlay = pygame.Surface((128, 128), pygame.SRCALPHA) + self.pre_render_stats() + + def _create_background(self): + bg_bitmap = displayio.Bitmap(128, 128, 1) + bg_palette = displayio.Palette(1) + bg_palette[0] = 0xADAFE5 + background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette) + self.background_group.append(background) + floor_bitmap = displayio.Bitmap(128, 38, 1) + floor_palette = displayio.Palette(1) + floor_palette[0] = 0x6B4226 + floor = displayio.TileGrid(floor_bitmap, pixel_shader=floor_palette, y=90) + self.background_group.append(floor) + + def _load_pet_sprites(self): + try: + self.pet_states = { + "idle": displayio.OnDiskBitmap("cathappy.bmp"), + "happy": displayio.OnDiskBitmap("cathappy.bmp"), + "hungry": displayio.OnDiskBitmap("cathungry.bmp"), + "sick": displayio.OnDiskBitmap("catsick.bmp"), + "sleeping": displayio.OnDiskBitmap("cathappy.bmp"), + "dead": displayio.OnDiskBitmap("catdead.bmp") + } + self.pet_sprite = displayio.TileGrid( + self.pet_states["idle"], + pixel_shader=self.pet_states["idle"].pixel_shader, + x=48, + y=48 + ) + self.pet_group.append(self.pet_sprite) + except Exception as e: + print(f"Error loading pet sprites: {e}") + raise + + def _create_ui(self): + try: + self.ui_icons = { + "FOOD": displayio.OnDiskBitmap("food_icon.bmp"), + "MED": displayio.OnDiskBitmap("medicine_icon.bmp"), + "SLEEP": displayio.OnDiskBitmap("sleep_icon.bmp"), + "PLAY": displayio.OnDiskBitmap("play_icon.bmp") + } + + self.buttons = {} + positions = [(100, 10), (100, 36), (100, 62), (100, 88)] + + for pos, (label, icon) in zip(positions, self.ui_icons.items()): + button = displayio.TileGrid( + icon, + pixel_shader=icon.pixel_shader, + x=pos[0], + y=pos[1] + ) + self.ui_group.append(button) + self.buttons[label] = pygame.Rect(pos[0], pos[1], 16, 16) + + except Exception as e: + print(f"Error creating UI: {e}") + raise + + def pre_render_stats(self): + self.overlay.fill((0, 0, 0, 0)) + + pygame.draw.rect(self.overlay, (0, 0, 0, 150), (0, 0, 80, 65)) + + stats_y = 5 + for stat, value in self.stats.items(): + text_surface = self.font.render(f"{stat[:4]}: {int(value)}", True, (255, 255, 255)) + self.overlay.blit(text_surface, (5, stats_y)) + stats_y += 15 + + label_positions = [(100, 10), (100, 36), (100, 62), (100, 88)] + for pos, label in zip(label_positions, ["FOOD", "MED", "SLEEP", "PLAY"]): + pygame.draw.rect(self.overlay, (0, 0, 0, 150), (pos[0], pos[1], 30, 15)) + text_surface = self.font.render(label, True, (255, 255, 255)) + self.overlay.blit(text_surface, (pos[0] + 2, pos[1] + 2)) + + def update_stats(self): + current_time = time.monotonic() + if current_time - self.last_update > 1: + if not self.is_sleeping: + self.stats["hunger"] = max(0, self.stats["hunger"] - 1) + self.stats["happiness"] = max(0, self.stats["happiness"] - 0.5) + self.stats["energy"] = max(0, self.stats["energy"] - 1) + + if self.stats["hunger"] < 30: + self.stats["health"] = max(0, self.stats["health"] - 1) + + if self.stats["energy"] < 20: + self.stats["health"] = max(0, self.stats["health"] - 0.5) + else: + self.stats["energy"] = min(100, self.stats["energy"] + 2) + if self.stats["energy"] >= 100: + self.is_sleeping = False + + self.last_update = current_time + self.pre_render_stats() + + def update_state(self): + if self.stats["health"] <= 0: + return "dead" + elif self.is_sleeping: + return "sleeping" + elif self.stats["hunger"] < 30: + return "hungry" + elif self.stats["health"] < 50: + return "sick" + elif self.stats["happiness"] < 30: + return "hungry" + elif self.stats["happiness"] > 80: + return "happy" + return "idle" + + def handle_input(self, pos): + if self.state == "dead": + return + + x, y = pos + for label, rect in self.buttons.items(): + if rect.collidepoint(x, y): + if label == "FOOD" and not self.is_sleeping: + self.stats["hunger"] = min(100, self.stats["hunger"] + 30) + elif label == "MED" and not self.is_sleeping: + self.stats["health"] = min(100, self.stats["health"] + 20) + elif label == "PLAY" and not self.is_sleeping: + self.stats["happiness"] = min(100, self.stats["happiness"] + 25) + self.stats["energy"] = max(0, self.stats["energy"] - 10) + elif label == "SLEEP": + self.is_sleeping = not self.is_sleeping + self.pre_render_stats() + + def run(self): + clock = pygame.time.Clock() + running = True + + while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.MOUSEBUTTONDOWN: + self.handle_input(event.pos) + + self.update_stats() + new_state = self.update_state() + + if new_state != self.state: + self.state = new_state + self.pet_group.pop() + new_pet = displayio.TileGrid( + self.pet_states[self.state], + pixel_shader=self.pet_states[self.state].pixel_shader, + x=48, + y=48 + ) + self.pet_group.append(new_pet) + + self.display.refresh() + + self.screen.blit(self.overlay, (0, 0)) + + pygame.display.flip() + time.sleep(0.1) + + pygame.quit() + +if __name__ == "__main__": + game = PetGame() + game.run() From 7e7a48aceda395a540047125d1ec8f5d626dd00e Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Mon, 3 Feb 2025 21:47:17 +0000 Subject: [PATCH 2/9] Add files via upload --- pets/hridyas_catgame/catdead.bmp | Bin 0 -> 3126 bytes pets/hridyas_catgame/cathappy.bmp | Bin 0 -> 3126 bytes pets/hridyas_catgame/cathungry.bmp | Bin 0 -> 3126 bytes pets/hridyas_catgame/catsick.bmp | Bin 0 -> 3126 bytes pets/hridyas_catgame/food_icon.bmp | Bin 0 -> 822 bytes pets/hridyas_catgame/medicine_icon.bmp | Bin 0 -> 822 bytes pets/hridyas_catgame/play_icon.bmp | Bin 0 -> 1094 bytes pets/hridyas_catgame/sleep_icon.bmp | Bin 0 -> 822 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pets/hridyas_catgame/catdead.bmp create mode 100644 pets/hridyas_catgame/cathappy.bmp create mode 100644 pets/hridyas_catgame/cathungry.bmp create mode 100644 pets/hridyas_catgame/catsick.bmp create mode 100644 pets/hridyas_catgame/food_icon.bmp create mode 100644 pets/hridyas_catgame/medicine_icon.bmp create mode 100644 pets/hridyas_catgame/play_icon.bmp create mode 100644 pets/hridyas_catgame/sleep_icon.bmp diff --git a/pets/hridyas_catgame/catdead.bmp b/pets/hridyas_catgame/catdead.bmp new file mode 100644 index 0000000000000000000000000000000000000000..695628ecd7e2b60b5a53789926f9b4ada9c21b9e GIT binary patch literal 3126 zcmeH_v26n}5Cq?`6*+R~P!*^E<*vg8I8rUD!LiGe23ljW;E_)oFrYwxcoKWdy}f(> zAKwqV4fWo z>HIE7DQw`QbuemCePAl-k8VIaDJ5pFedt9f0~-P$dCX)Z`wKYLc)4?wVG~G= z1TbmfQ(H;w5(Aes0Ed5>zp+)?j5pQf@QJ(cj@w`T(Py{?TINra1 z|C{peeS8}JV&r^dzh3vl@B$*pKR;@V7>3Ih|L+C#@%6hC=Sw7?I5jPd{_wF^m4U8# zew~iG3bfn`o)SDM(MoI*AfD5J!osS)*5)n$?Bz-NEo7dCiEG1}LEmXn`_~S$%-#KG zC+rJm=kJ#<$+lX+7v(UDNYz z6R0(^B5VThc}yBOizcy43|vwGs%GbxN$13*u+=q3TB2#SSW>%CgUsP}FstXMkaDbQ hlNO)7&?u5DFoMK8_5#}r`~cVM$g=i&@1O#dm5Gb~#bKn(SNISAa)w?6d@5ZUXxAUz03MBoaQkP%AYk`!cw@@S zEh@ETTLWY=1VA#)WDsQWm#tU%BP+uu@Dc+|8h95?Vz(H$r2x7X&o7gi_1Cizlt&uT z^dd%j2Q|n%90yabMJ4>A#;@6$sJ-Pgi(QQ*3r4^(SO@tc8!20Jb@liW&sDSDzzyEO E7u4Oq!TNS}dJ&Q1m*BDK(3 ly@`Sn91-IMBcnCR;WvQ@$QTUjfo=f0ghJI~l9}FnJh_Y!)&bCJ&-P;;=A87AJ-c(+f5L O8V?{bVlhnLNT&hE;8*Sd literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/sleep_icon.bmp b/pets/hridyas_catgame/sleep_icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4eec0fdc6622f27a82c758d832962f6d5685ea8a GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;3voj*M1X+BAW&m1Tv7dBa7o<6Qc#$I%3r0v2LVE0RXQO!V>@h literal 0 HcmV?d00001 From 70dafb088bb88fd21dec98bffadf51ba420a4aac Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Tue, 4 Feb 2025 20:22:56 +0000 Subject: [PATCH 3/9] just get rid of the text, adds more suspense to the game since you dont know if you are taking enough care or not --- pets/hridyas_catgame/main.py | 60 ++++++++++++------------------------ 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/pets/hridyas_catgame/main.py b/pets/hridyas_catgame/main.py index 7420cb5e..4932c8f3 100644 --- a/pets/hridyas_catgame/main.py +++ b/pets/hridyas_catgame/main.py @@ -5,9 +5,12 @@ class PetGame: def __init__(self): + pygame.init() self.display = PyGameDisplay(width=128, height=128) pygame.display.set_caption("Virtual Pet") + self.screen = pygame.display.get_surface() + self.main_group = displayio.Group() self.display.show(self.main_group) @@ -30,13 +33,8 @@ def __init__(self): } self.state = "idle" self.is_sleeping = False - self.last_update = time.monotonic() - - pygame.font.init() - self.font = pygame.font.Font(None, 12) - self.screen = pygame.display.get_surface() - self.overlay = pygame.Surface((128, 128), pygame.SRCALPHA) - self.pre_render_stats() + self.last_stats_update = time.monotonic() + self.stats_update_interval = 5.0 def _create_background(self): bg_bitmap = displayio.Bitmap(128, 128, 1) @@ -97,43 +95,25 @@ def _create_ui(self): print(f"Error creating UI: {e}") raise - def pre_render_stats(self): - self.overlay.fill((0, 0, 0, 0)) - - pygame.draw.rect(self.overlay, (0, 0, 0, 150), (0, 0, 80, 65)) - - stats_y = 5 - for stat, value in self.stats.items(): - text_surface = self.font.render(f"{stat[:4]}: {int(value)}", True, (255, 255, 255)) - self.overlay.blit(text_surface, (5, stats_y)) - stats_y += 15 - - label_positions = [(100, 10), (100, 36), (100, 62), (100, 88)] - for pos, label in zip(label_positions, ["FOOD", "MED", "SLEEP", "PLAY"]): - pygame.draw.rect(self.overlay, (0, 0, 0, 150), (pos[0], pos[1], 30, 15)) - text_surface = self.font.render(label, True, (255, 255, 255)) - self.overlay.blit(text_surface, (pos[0] + 2, pos[1] + 2)) - def update_stats(self): current_time = time.monotonic() - if current_time - self.last_update > 1: + if current_time - self.last_stats_update > self.stats_update_interval: if not self.is_sleeping: - self.stats["hunger"] = max(0, self.stats["hunger"] - 1) - self.stats["happiness"] = max(0, self.stats["happiness"] - 0.5) - self.stats["energy"] = max(0, self.stats["energy"] - 1) + self.stats["hunger"] = max(0, self.stats["hunger"] - 2) + self.stats["happiness"] = max(0, self.stats["happiness"] - 1) + self.stats["energy"] = max(0, self.stats["energy"] - 2) if self.stats["hunger"] < 30: - self.stats["health"] = max(0, self.stats["health"] - 1) + self.stats["health"] = max(0, self.stats["health"] - 2) if self.stats["energy"] < 20: - self.stats["health"] = max(0, self.stats["health"] - 0.5) + self.stats["health"] = max(0, self.stats["health"] - 1) else: - self.stats["energy"] = min(100, self.stats["energy"] + 2) + self.stats["energy"] = min(100, self.stats["energy"] + 4) if self.stats["energy"] >= 100: self.is_sleeping = False - self.last_update = current_time - self.pre_render_stats() + self.last_stats_update = current_time def update_state(self): if self.stats["health"] <= 0: @@ -166,13 +146,16 @@ def handle_input(self, pos): self.stats["energy"] = max(0, self.stats["energy"] - 10) elif label == "SLEEP": self.is_sleeping = not self.is_sleeping - self.pre_render_stats() def run(self): clock = pygame.time.Clock() running = True + self.display.refresh() + pygame.display.flip() while running: + time.sleep(0.1) + for event in pygame.event.get(): if event.type == pygame.QUIT: running = False @@ -192,13 +175,8 @@ def run(self): y=48 ) self.pet_group.append(new_pet) - - self.display.refresh() - - self.screen.blit(self.overlay, (0, 0)) - - pygame.display.flip() - time.sleep(0.1) + self.display.refresh() + pygame.display.flip() pygame.quit() From b912e83a376831865a4169bf420bfd11f4230a94 Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Tue, 4 Feb 2025 21:14:33 +0000 Subject: [PATCH 4/9] Create port.py --- pets/hridyas_catgame/port.py | 194 +++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 pets/hridyas_catgame/port.py diff --git a/pets/hridyas_catgame/port.py b/pets/hridyas_catgame/port.py new file mode 100644 index 00000000..73518f7c --- /dev/null +++ b/pets/hridyas_catgame/port.py @@ -0,0 +1,194 @@ +import time +import board +import displayio +import digitalio +from adafruit_display_text import label +import terminalio + +display = board.DISPLAY + +main_group = displayio.Group() +display.show(main_group) + +class Buttons: + def __init__(self): + self.btn_a = digitalio.DigitalInOut(board.BUTTON_A) + self.btn_a.switch_to_input(pull=digitalio.Pull.DOWN) + self.btn_b = digitalio.DigitalInOut(board.BUTTON_B) + self.btn_b.switch_to_input(pull=digitalio.Pull.DOWN) + self.btn_c = digitalio.DigitalInOut(board.BUTTON_C) + self.btn_c.switch_to_input(pull=digitalio.Pull.DOWN) + + self.last_press = time.monotonic() + self.debounce = 0.3 + + def check_press(self, button): + if time.monotonic() - self.last_press > self.debounce: + if button.value: + self.last_press = time.monotonic() + return True + return False + +buttons = Buttons() + +class VirtualPet: + def __init__(self): + self.background_group = displayio.Group() + self.pet_group = displayio.Group() + self.ui_group = displayio.Group() + + main_group.append(self.background_group) + main_group.append(self.pet_group) + main_group.append(self.ui_group) + + self._create_background() + self._load_pet_sprites() + self._create_status_bar() + + self.stats = { + "hunger": 100, + "health": 100, + "happiness": 100, + "energy": 100 + } + self.state = "idle" + self.is_sleeping = False + self.last_stats_update = time.monotonic() + self.stats_update_interval = 5.0 + + self.c_pressed = False + self.c_press_start = 0 + self.long_press_duration = 1.0 + + def _create_background(self): + color_bitmap = displayio.Bitmap(display.width, display.height, 1) + color_palette = displayio.Palette(1) + color_palette[0] = 0xADAFE5 + bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette) + self.background_group.append(bg_sprite) + floor_bitmap = displayio.Bitmap(display.width, 30, 1) + floor_palette = displayio.Palette(1) + floor_palette[0] = 0x6B4226 + floor = displayio.TileGrid(floor_bitmap, pixel_shader=floor_palette, y=display.height-30) + self.background_group.append(floor) + + def _load_pet_sprites(self): + self.pet_states = { + "idle": "cathappy.bmp", + "happy": "cathappy.bmp", + "hungry": "cathungry.bmp", + "sick": "catsick.bmp", + "sleeping": "cathungry.bmp", + "dead": "catdead.bmp" + } + self.current_pet = displayio.OnDiskBitmap(self.pet_states["idle"]) + self.pet_sprite = displayio.TileGrid( + self.current_pet, + pixel_shader=self.current_pet.pixel_shader, + x=display.width//2 - 16, + y=display.height//2 - 16 + ) + self.pet_group.append(self.pet_sprite) + + def _create_status_bar(self): + self.status_label = label.Label( + font=terminalio.FONT, + text="H:100 Hl:100 Ha:100 E:100", + color=0xFFFFFF, + x=4, + y=display.height - 8 + ) + self.ui_group.append(self.status_label) + + def update_pet_sprite(self, state): + self.pet_group.remove(self.pet_sprite) + self.current_pet = displayio.OnDiskBitmap(self.pet_states[state]) + self.pet_sprite = displayio.TileGrid( + self.current_pet, + pixel_shader=self.current_pet.pixel_shader, + x=display.width//2 - 16, + y=display.height//2 - 16 + ) + self.pet_group.append(self.pet_sprite) + + def update_stats(self): + current_time = time.monotonic() + if current_time - self.last_stats_update > self.stats_update_interval: + if not self.is_sleeping: + self.stats["hunger"] = max(0, self.stats["hunger"] - 2) + self.stats["happiness"] = max(0, self.stats["happiness"] - 1) + self.stats["energy"] = max(0, self.stats["energy"] - 2) + + if self.stats["hunger"] < 30: + self.stats["health"] = max(0, self.stats["health"] - 2) + + if self.stats["energy"] < 20: + self.stats["health"] = max(0, self.stats["health"] - 1) + else: + self.stats["energy"] = min(100, self.stats["energy"] + 4) + if self.stats["energy"] >= 100: + self.is_sleeping = False + + self.last_stats_update = current_time + self._update_status() + + def _update_status(self): + self.status_label.text = ( + f"H:{self.stats['hunger']} Hl:{self.stats['health']} " + f"Ha:{self.stats['happiness']} E:{self.stats['energy']}" + ) + + def check_state(self): + if self.stats["health"] <= 0: + return "dead" + if self.is_sleeping: + return "sleeping" + if self.stats["hunger"] < 30: + return "hungry" + if self.stats["health"] < 50: + return "sick" + if self.stats["happiness"] < 30: + return "hungry" + if self.stats["happiness"] > 80: + return "happy" + return "idle" + + def handle_input(self): + if buttons.check_press(buttons.btn_a) and not self.is_sleeping: + self.stats["hunger"] = min(100, self.stats["hunger"] + 30) + + if buttons.check_press(buttons.btn_b) and not self.is_sleeping: + self.stats["health"] = min(100, self.stats["health"] + 20) + + if buttons.btn_c.value: + if not self.c_pressed: + self.c_pressed = True + self.c_press_start = time.monotonic() + else: + if (time.monotonic() - self.c_press_start >= + self.long_press_duration): + self.is_sleeping = not self.is_sleeping + self.c_pressed = False + else: + if self.c_pressed: + if (time.monotonic() - self.c_press_start < + self.long_press_duration): + if not self.is_sleeping: + self.stats["happiness"] = min(100, self.stats["happiness"] + 25) + self.stats["energy"] = max(0, self.stats["energy"] - 10) + self.c_pressed = False + + def run(self): + while True: + self.handle_input() + self.update_stats() + + new_state = self.check_state() + if new_state != self.state: + self.state = new_state + self.update_pet_sprite(self.state) + + time.sleep(0.1) + +pet_game = VirtualPet() +pet_game.run() From b0bce02d40262793543267fecc411df1bb76f420 Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Tue, 4 Feb 2025 21:17:30 +0000 Subject: [PATCH 5/9] Create README.md --- pets/hridyas_catgame/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 pets/hridyas_catgame/README.md diff --git a/pets/hridyas_catgame/README.md b/pets/hridyas_catgame/README.md new file mode 100644 index 00000000..3da7ff5a --- /dev/null +++ b/pets/hridyas_catgame/README.md @@ -0,0 +1,4 @@ +Pet game where you take care of your cat. +You send it to sleep / play with it / feed it / cure it from sickness. +Since theres 3 buttons, the 3rd button has to be long pressed for the sleep activation. +Hope you like it :D From b3d46542ada0ba3b13dc94fa102dfb62d2822cbc Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Thu, 6 Feb 2025 18:24:15 +0000 Subject: [PATCH 6/9] Update README.md --- pets/hridyas_catgame/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pets/hridyas_catgame/README.md b/pets/hridyas_catgame/README.md index 3da7ff5a..bad9a86e 100644 --- a/pets/hridyas_catgame/README.md +++ b/pets/hridyas_catgame/README.md @@ -1,4 +1,13 @@ +# Hridya's cat game + Pet game where you take care of your cat. + You send it to sleep / play with it / feed it / cure it from sickness. -Since theres 3 buttons, the 3rd button has to be long pressed for the sleep activation. + +Controls: +- Button 1: Feed +- Button 2: Cure +- Button 3: Play, long press for sleep + Hope you like it :D + From e7a0b2d262995905d9d552b80baca11be138a662 Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Thu, 6 Feb 2025 21:50:38 +0000 Subject: [PATCH 7/9] Update main.py --- pets/hridyas_catgame/main.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/pets/hridyas_catgame/main.py b/pets/hridyas_catgame/main.py index 4932c8f3..9820850d 100644 --- a/pets/hridyas_catgame/main.py +++ b/pets/hridyas_catgame/main.py @@ -137,15 +137,20 @@ def handle_input(self, pos): x, y = pos for label, rect in self.buttons.items(): if rect.collidepoint(x, y): - if label == "FOOD" and not self.is_sleeping: - self.stats["hunger"] = min(100, self.stats["hunger"] + 30) - elif label == "MED" and not self.is_sleeping: - self.stats["health"] = min(100, self.stats["health"] + 20) - elif label == "PLAY" and not self.is_sleeping: - self.stats["happiness"] = min(100, self.stats["happiness"] + 25) - self.stats["energy"] = max(0, self.stats["energy"] - 10) - elif label == "SLEEP": - self.is_sleeping = not self.is_sleeping + self.activate_button(label) + + def activate_button(self, label): + if self.state == "dead": + return + if label == "FOOD" and not self.is_sleeping: + self.stats["hunger"] = min(100, self.stats["hunger"] + 30) + elif label == "MED" and not self.is_sleeping: + self.stats["health"] = min(100, self.stats["health"] + 20) + elif label == "PLAY" and not self.is_sleeping: + self.stats["happiness"] = min(100, self.stats["happiness"] + 25) + self.stats["energy"] = max(0, self.stats["energy"] - 10) + elif label == "SLEEP": + self.is_sleeping = not self.is_sleeping def run(self): clock = pygame.time.Clock() @@ -161,6 +166,15 @@ def run(self): running = False elif event.type == pygame.MOUSEBUTTONDOWN: self.handle_input(event.pos) + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_1: + self.activate_button("FOOD") + elif event.key == pygame.K_2: + self.activate_button("MED") + elif event.key == pygame.K_3: + self.activate_button("SLEEP") + elif event.key == pygame.K_4: + self.activate_button("PLAY") self.update_stats() new_state = self.update_state() From 83cc2af82aca4e7d29ace3f89e93f269977212e6 Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Thu, 6 Feb 2025 21:51:10 +0000 Subject: [PATCH 8/9] Update README.md --- pets/hridyas_catgame/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pets/hridyas_catgame/README.md b/pets/hridyas_catgame/README.md index bad9a86e..fff7fbba 100644 --- a/pets/hridyas_catgame/README.md +++ b/pets/hridyas_catgame/README.md @@ -4,10 +4,16 @@ Pet game where you take care of your cat. You send it to sleep / play with it / feed it / cure it from sickness. -Controls: +Controls for port.py: - Button 1: Feed - Button 2: Cure - Button 3: Play, long press for sleep +On main.py: +- 1: Feed +- 2: Cure +- 3: Play +- 4: Sleep + Hope you like it :D From 1d1363f2c8c7cc5d800ecc184714a964e0c53c73 Mon Sep 17 00:00:00 2001 From: Hridya Agrawal Date: Sun, 9 Feb 2025 16:07:18 +0000 Subject: [PATCH 9/9] Add files via upload --- pets/hridyas_catgame/candy.png | Bin 0 -> 401 bytes pets/hridyas_catgame/catdead.png | Bin 0 -> 1337 bytes pets/hridyas_catgame/cathappy.png | Bin 0 -> 1318 bytes pets/hridyas_catgame/cathungry.png | Bin 0 -> 1382 bytes pets/hridyas_catgame/catsick.png | Bin 0 -> 1375 bytes pets/hridyas_catgame/food_icon.png | Bin 0 -> 274 bytes pets/hridyas_catgame/game.py | 290 +++++++++++++++++++++++++ pets/hridyas_catgame/medicine_icon.png | Bin 0 -> 177 bytes pets/hridyas_catgame/play_icon.png | Bin 0 -> 247 bytes pets/hridyas_catgame/sleep_icon.png | Bin 0 -> 136 bytes 10 files changed, 290 insertions(+) create mode 100644 pets/hridyas_catgame/candy.png create mode 100644 pets/hridyas_catgame/catdead.png create mode 100644 pets/hridyas_catgame/cathappy.png create mode 100644 pets/hridyas_catgame/cathungry.png create mode 100644 pets/hridyas_catgame/catsick.png create mode 100644 pets/hridyas_catgame/food_icon.png create mode 100644 pets/hridyas_catgame/game.py create mode 100644 pets/hridyas_catgame/medicine_icon.png create mode 100644 pets/hridyas_catgame/play_icon.png create mode 100644 pets/hridyas_catgame/sleep_icon.png diff --git a/pets/hridyas_catgame/candy.png b/pets/hridyas_catgame/candy.png new file mode 100644 index 0000000000000000000000000000000000000000..81758df566ebcf06bfb5b01a29f58202924b40e8 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D%zy**tVLo9le zQxup(UhMvR|Kk(M=G-Nl^&)5OpKJB;|AxRz^~{NL|EFZ``&9A$|LfDw|CseKBdfVpB<%SK| z+59RQp8qX3BqmK?-0&({OTm) z)TKFI|8eira+)>sqN)6CyY_<*S%nYV$|p{_kd~ZUYY5a4T9Ny&?A4L~-|h7TQjNQ~ zwZ7c_ryq6m`~i#C3Wq1ppD(#%&C|~9lF#k~75v%1ug1=%Q%E!c=sF*e6Vr{;4EIFT z&wJ?mJ#mW5p#ujBdM7aUoRB=EZQJnh=Vx)rM~{+bTU*_lCwS@1fddB^{7;FBh6d@! s@B5URkdQFLzW$s~l8Lc_fdKFVdQ&MBb@0QdE?7XSbN literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/catdead.png b/pets/hridyas_catgame/catdead.png new file mode 100644 index 0000000000000000000000000000000000000000..d24978946450c6c064eff5fe51b241c8314c5f20 GIT binary patch literal 1337 zcmV-91;+Y`P)Px(^GQTOR9HvtmR)ZXM-+zNncdm7H;EI(ZT~=9AySGENl__HZ+cZq0xE6z~&H~)6F|~ z5Qd@IVmLblB|{UtIRJO)^0i5L?Hx!alV~&=2>b}C&UW)zsR*ucVA%|$6mo~24=`0M zn!T#kDvpeduBUAy0JHT>d5*Ppq%g4mGhCS|Vtgczsd5E%zkw~CUC0g|#I@;Z9L@}) zbhCoo!G4fbt<5NGnl6>#c^+gCBAdwoQPe^Kk)X-zB{0i|B4%iRn3+b0*M?9@__aFR zgoDE1Aa4A48%zht_J58>B=05|+s_!QHZ99!g2u7=&9)ZAEQ?cVZVoz< z$Y-*xQ^18srOGV)FoNYK5JnQVZJWSSN@GOEm~k_ag2f0AAO3;uJKi@E&)=QL?%liL zx-N3DIaOl~!V+}!_*ZbbjqlE%TlZfR6AGFrmXK^qA=C98%-y<$^gw@H0qcHgVnRV@zWEm0 zyLZO2nX)b9hjFb`f+CGCN5?REeFiHlE9mO#0waQ=C#rCcCPyEcm`}Qp3Sw0U@}Bz;B?W~TZ5lsy3S`;n>D_}!5rpev zb#)b~&Q2&P4TvKIgyVn|z$}iS;e!|;EC+GhjPtK#2u^^oEm)*q9N_5b)6m4QcVC|= z$GY!hX=w>>zxxihZrO?;3e5?nR@>~D^V+fS;J%T+x3|}nqs8s@l8j9kU-9osDRX*Z*=CNo z!oq`vd0e@09?)yu@9EWa77$Sz<4*PXnXl2i=L3YH1USQ^M~~3m-EEAwkfS#TnEG{m>6*hM5+J)bLTg0Vv=bmj!PZ6{n$CBt%n>#-pJ9!e9FMJOxnZ(%G z7$&Y>1(f=CItl?qK44j<`xVP&1=;$EP)Px(;7LS5R9HvtmrIWw#TCbY_3FNlnK9%GWS0#BC)kN>AhsZQ54M51_V~u*A(k=1 zkVtsJhXCU!EP!FaGoBf2ghM_+@Sw;_!XwH<-jYR>trO4Ox&5j-sLCW3ntQ=Ylz8Lb zbhoOj&#(UHoPTvIZu6mTbA0Xq+)?0;0%H{r5tZfbP*=s+XOz(*KKxfIj-9NHlZAzM zIC}Ib5~{7w**Lzy?2$h3pF@nNx4En=uhM(+Nub{PoU*cV@glv0PXNs=s9?R)T8VfN zum5F$qbI6N&MhrrvmB!xPaQbGP0I@D`oaevP?bYk%5d<&{%?S=&HI-wnX0N%+}=zN zsc)z{hTO@;_kYF4U_h(YL0Lo9)VM68EK8hol+_R=kc;PVZQE;|8egHcCN~CM7R>afX{5ME zDRp%ufX-!cX^Bp!Ls?fG>P%PHyt&@`du__1Tm z&%eop)*O0jKTW7Ep*Riv4KToWlv00)K*OPYdt%$vUyq;oNdo`H&(9)Fsg+VPQh~+Q zciAi&6gt&Gp67{NDTTEbv}UlmjuC;X;>6Q)_)w?CD;?`g5D7^!7bm5GT$V4a;_HSZ zhkHn@I z!y#Fg(eE9G(13Nkv+x$qJAF`*#sEQ&Zd6EDNlOtFH+m&~3H2etn%*tCb+?;L}+fM{Kot z@3g`D*f|y@fl!r5XqcNh1ai~3MgZh;{JB#+{G&$^6#uxsL1&^HC8PMV4xBTzvvyJ^ z9#QUV*RGLw+Nnm$s$$#J6obKl5E@#U!OT4OGb-Qk;I7>?5^jLhH7ZD2b!_*Tj#z*Z zB6l{;OTj<-h}T~|vqk=~dx3~#N@wM>Kl>>UJorPZs!0Jp`Rr4^xBY%>OoP^`BLt5Z zNeZm3t+9LeZmwLpLY7;0eg6mi?zdNX?d4Y>jM!1fZ$?BJozkv~1^L?9v$%Gf+1Xj% zcw-*%K5ixuP0l%J3NR*4;@rv#{eBHOUnr6A!edH;qk`2YSZ-NKj5{}$*D cz-?FH3*CuEKg)vcY5)KL07*qoM6N<$g3F1VegFUf literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/cathungry.png b/pets/hridyas_catgame/cathungry.png new file mode 100644 index 0000000000000000000000000000000000000000..af3c4b64e58094654aca6c8e819c8f25e211c0e4 GIT binary patch literal 1382 zcmV-s1)2JZP)Px)AW1|)R9HvtmR)ZYRT#(r&pGq5GhH<#UdabA>J3Q+!kb89LyU>iS8cm(S*g2e&_!@|L0l4Q(p9xO0UPgeAsPZWL7u-Ym(knVnZhK_vH;}pr7Ks^(fTgK81YB| z5*k7X7zQ|fuzzI$>6!DT5;?99-w*J9>#q9ui2ybLGbU$dkZNUb^>nlW#;l^ISeTxf z$t$Hm4D|K%X7AelE59UMp8W1A<|`FQ>B4awq-hGz^N=Koy^f8j{;C5 zrIH&20V-06B==T*<;W}otT&6G#p<{)f?rtDS8UP5FOP4Mqic<*bV6eA<(-$rv=LJYo1sFo2 zW9;3%8(*LO1~242^tA6nl<4nsM2Dj&nh$~?`}iUe{rvza$nnt75F8RXdEx}1bprs$ z=dp>4fa4=I49$Ra9H=;kkP=b|5D}6jMn0EA5>-&_D}a-v9!tn99RL`KQE;=(_P)dA zsVNw((BIv&N(#u~^7J%VxVU?N0b#xgeo&WAr5a(*M-)XMVuYTL`+wcVo!fWN+}v!N z!mV4kuyNx?xW0#;jth3mRD|50tx zx+Cy&7}(VY~l+pb9`m6%sxGt2^5RSB`&7{p>qG|;`NqfqH?rw}uPQYZ=bzKa!wc%8$gr*=s z990qKJQUhn!D%8W`@qs#4nRJCy#D}F64<qr6iBWUFhsFf#Mv`v>hfmY zjtIhWZ5=>LJ1NH}Ceh#Dhcs3gEtjynZaa^NmRjY*)1u)BWoAJnQxXCyO};b+dwjTDgpR08|nnS1fXVs?XHmTWr>fq0yCY?=ffdgi&5_+E3YT|r<9r3E)AgvK5rEG oktul8i%;tL6II}Gpq>Hz1KSu=KN58!5C8xG07*qoM6N<$f|RX@D*ylh literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/catsick.png b/pets/hridyas_catgame/catsick.png new file mode 100644 index 0000000000000000000000000000000000000000..d51be727713c9c284263640754b70bf67c23c0b3 GIT binary patch literal 1375 zcmV-l1)%zgP)Px)8A(JzR9HvtmtBks9e$W5?KmX?)#ZA7{P5wT&0B$L8OM%rDuv#d6_cehPit;n5*!|%! zkfYO+jP2S5xw~7a7fqw!8AWA8@24td|{Ahd}tu?J|IB-e@}4#<_@og>zkFfBPfzkrQAld~tQEdZ^+n~tzStb&RJ%p4X?>=pAf(|GN; z{f^t%^1%J%BAh$-7WdqHKj@Irp#d_tbhvo{^#5KziMKH=58GdHmoZ`tP|9@4*C7$9$PDuu;fz^D;fXHHx%}#$aqj z+IHBgBN9WaXdx7xy{`O{HF6>yU_>w;MurE$eV7|7bU`5F2OekJwr^pAn08)5pvdwR z6)NJyaC!LxeQSGYry1fkQIwDto-A*Ytbt~Bi8Z}7>TwVGl7ZY(wlWTkKT3P~!|J=V zVI)sH^;5C}HgDaE7=tLGa4ozp@T8bn5M7WL4dTdB1xyt8QuvfoEphvo){!=^P>

~AXxphQR$9T=i!0t~5&?=F~4*i6scFuRc`#sVu z!%N9qZ=Pr4raQ@9gF>Zz`D=I3%9jb0=i-I;S-<`({OjEdc&8C3gf^kd$)c504`Tju z<_y1n{#W=cTU`MWQ6}v3WBd2hzwLo4e>?H}+TYF+gu*vA-;Ii)=^7{_*vhCFJciO) zjOxLfIxeqfPEHak&c5;|UO0TXiq7QYNx9-Is34RL{rHoI*s}GT6zv>~;*HnOaredz zm`LF)IB}R#BRGO6;FU9frvJWg^VhTIiGzgx%^P{`+{^s(xu3m?qkpBC?mCV|L@R6D z_+tlo{^v&sqlA5YP)Px#%t=H+R5(v#WS|f*QmCI{h#Bzb|Nqs@3=GkXjEuivUMJcMzyAMEUcP*}M_goN z6eAoHYWe@e+h@GY z96$Lv7zO|T`z8D5&tLVgKYuIzWn&j*;Ns(MS+Fh;uNNBP{8KpoexJ?p{}02TA3qpa z*jO307*qoM6N<$f(ATvX#fBK literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/game.py b/pets/hridyas_catgame/game.py new file mode 100644 index 00000000..e018e936 --- /dev/null +++ b/pets/hridyas_catgame/game.py @@ -0,0 +1,290 @@ +import displayio +from blinka_displayio_pygamedisplay import PyGameDisplay +import pygame +import time +import random + +class PetGame: + def __init__(self): + pygame.init() + self.display = PyGameDisplay(width=128, height=128) + pygame.display.set_caption("Virtual Pet") + + self.screen = pygame.display.get_surface() + + self.main_group = displayio.Group() + self.display.show(self.main_group) + + self.background_group = displayio.Group() + self.pet_group = displayio.Group() + self.candy_group = displayio.Group() + self.ui_group = displayio.Group() + self.status_bars_group = displayio.Group() + + self.main_group.append(self.background_group) + self.main_group.append(self.pet_group) + self.main_group.append(self.candy_group) + self.main_group.append(self.status_bars_group) + self.main_group.append(self.ui_group) + + self.stats = { + "hunger": 100, + "health": 100, + "happiness": 100, + "energy": 100 + } + self.candy_count = 5 + self.state = "idle" + self.is_sleeping = False + self.last_stats_update = time.monotonic() + self.stats_update_interval = 5.0 + self.candy_display_time = 2.0 + self.candies_visible = False + self.candy_timestamp = 0 + + self._create_background() + self._load_pet_sprites() + self._load_candy_sprites() + self._create_ui() + self._create_status_bars() + + def _create_background(self): + bg_bitmap = displayio.Bitmap(128, 128, 1) + bg_palette = displayio.Palette(1) + bg_palette[0] = 0xADAFE5 + background = displayio.TileGrid(bg_bitmap, pixel_shader=bg_palette) + self.background_group.append(background) + floor_bitmap = displayio.Bitmap(128, 38, 1) + floor_palette = displayio.Palette(1) + floor_palette[0] = 0x6B4226 + floor = displayio.TileGrid(floor_bitmap, pixel_shader=floor_palette, y=90) + self.background_group.append(floor) + + def _load_pet_sprites(self): + try: + self.pet_states = { + "idle": displayio.OnDiskBitmap("cathappy.png"), + "happy": displayio.OnDiskBitmap("cathappy.png"), + "hungry": displayio.OnDiskBitmap("cathungry.png"), + "sick": displayio.OnDiskBitmap("catsick.png"), + "sleeping": displayio.OnDiskBitmap("cathappy.png"), + "dead": displayio.OnDiskBitmap("catdead.png") + } + self.pet_sprite = displayio.TileGrid( + self.pet_states["idle"], + pixel_shader=self.pet_states["idle"].pixel_shader, + x=48, + y=48 + ) + self.pet_group.append(self.pet_sprite) + except Exception as e: + print(f"Error loading pet sprites: {e}") + raise + + def _load_candy_sprites(self): + try: + self.candy_bitmap = displayio.OnDiskBitmap("candy.png") + except Exception as e: + print(f"Error loading candy sprites: {e}") + raise + + def _create_status_bars(self): + hunger_bg = displayio.Bitmap(50, 10, 1) + hunger_bg_palette = displayio.Palette(1) + hunger_bg_palette[0] = 0x666666 + self.hunger_bg = displayio.TileGrid(hunger_bg, pixel_shader=hunger_bg_palette, x=5, y=5) + + self.hunger_bar_bitmap = displayio.Bitmap(48, 8, 1) + hunger_palette = displayio.Palette(1) + hunger_palette[0] = 0x00FF00 + self.hunger_bar = displayio.TileGrid(self.hunger_bar_bitmap, + pixel_shader=hunger_palette, + x=6, y=6) + + self.status_bars_group.append(self.hunger_bg) + self.status_bars_group.append(self.hunger_bar) + + self.update_status_bars() + + def _create_ui(self): + try: + self.ui_icons = { + "FOOD": displayio.OnDiskBitmap("food_icon.png"), + "MED": displayio.OnDiskBitmap("medicine_icon.png"), + "SLEEP": displayio.OnDiskBitmap("sleep_icon.png"), + "PLAY": displayio.OnDiskBitmap("play_icon.png") + } + + self.buttons = {} + positions = [(100, 10), (100, 36), (100, 62), (100, 88)] + + for pos, (label, icon) in zip(positions, self.ui_icons.items()): + button = displayio.TileGrid( + icon, + pixel_shader=icon.pixel_shader, + x=pos[0], + y=pos[1] + ) + self.ui_group.append(button) + self.buttons[label] = pygame.Rect(pos[0], pos[1], 16, 16) + + except Exception as e: + print(f"Error creating UI: {e}") + raise + + def update_status_bars(self): + bar_width = int((48 * self.stats["hunger"]) / 100) + for x in range(48): + for y in range(8): + if x < bar_width: + self.hunger_bar_bitmap[x, y] = 0 + else: + self.hunger_bar_bitmap[x, y] = 1 + + def show_candies(self): + if not self.candies_visible and self.candy_count > 0: + while len(self.candy_group) > 0: + self.candy_group.pop() + + candy_positions = [ + (60, 40), + (36, 62), + (84, 62), + (60, 84) + ] + + for base_pos in candy_positions: + offset_x = random.randint(-5, 5) + offset_y = random.randint(-5, 5) + candy = displayio.TileGrid( + self.candy_bitmap, + pixel_shader=self.candy_bitmap.pixel_shader, + x=base_pos[0] + offset_x, + y=base_pos[1] + offset_y + ) + self.candy_group.append(candy) + + self.candies_visible = True + self.candy_timestamp = time.monotonic() + self.candy_count -= 1 + self.update_status_bars() + + def hide_candies(self): + while len(self.candy_group) > 0: + self.candy_group.pop() + self.candies_visible = False + + def update_stats(self): + current_time = time.monotonic() + stats_updated = False + + if current_time - self.last_stats_update > self.stats_update_interval: + if not self.is_sleeping: + self.stats["hunger"] = max(0, self.stats["hunger"] - 2) + self.stats["happiness"] = max(0, self.stats["happiness"] - 1) + self.stats["energy"] = max(0, self.stats["energy"] - 2) + + if self.stats["hunger"] < 30: + self.stats["health"] = max(0, self.stats["health"] - 2) + + if self.stats["energy"] < 20: + self.stats["health"] = max(0, self.stats["health"] - 1) + else: + self.stats["energy"] = min(100, self.stats["energy"] + 4) + if self.stats["energy"] >= 100: + self.is_sleeping = False + + self.last_stats_update = current_time + stats_updated = True + + if self.candies_visible and current_time - self.candy_timestamp > self.candy_display_time: + self.hide_candies() + + if stats_updated: + self.update_status_bars() + + def update_state(self): + if self.stats["health"] <= 0: + return "dead" + elif self.is_sleeping: + return "sleeping" + elif self.stats["hunger"] < 30: + return "hungry" + elif self.stats["health"] < 50: + return "sick" + elif self.stats["happiness"] < 30: + return "hungry" + elif self.stats["happiness"] > 80: + return "happy" + return "idle" + + def handle_input(self, pos): + if self.state == "dead": + return + + x, y = pos + for label, rect in self.buttons.items(): + if rect.collidepoint(x, y): + self.activate_button(label) + + def activate_button(self, label): + if self.state == "dead": + return + if label == "FOOD" and not self.is_sleeping and self.candy_count > 0: + self.stats["hunger"] = min(100, self.stats["hunger"] + 30) + self.show_candies() + self.update_status_bars() + elif label == "MED" and not self.is_sleeping: + self.stats["health"] = min(100, self.stats["health"] + 20) + elif label == "PLAY" and not self.is_sleeping: + self.stats["happiness"] = min(100, self.stats["happiness"] + 25) + self.stats["energy"] = max(0, self.stats["energy"] - 10) + elif label == "SLEEP": + self.is_sleeping = not self.is_sleeping + + def run(self): + clock = pygame.time.Clock() + running = True + self.display.refresh() + pygame.display.flip() + + while running: + time.sleep(0.1) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.MOUSEBUTTONDOWN: + self.handle_input(event.pos) + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_1: + self.activate_button("FOOD") + elif event.key == pygame.K_2: + self.activate_button("MED") + elif event.key == pygame.K_3: + self.activate_button("SLEEP") + elif event.key == pygame.K_4: + self.activate_button("PLAY") + + self.update_stats() + new_state = self.update_state() + + if new_state != self.state: + self.state = new_state + self.pet_group.pop() + new_pet = displayio.TileGrid( + self.pet_states[self.state], + pixel_shader=self.pet_states[self.state].pixel_shader, + x=48, + y=62 + ) + self.pet_group.append(new_pet) + + self.display.refresh() + pygame.display.flip() + + pygame.quit() + +if __name__ == "__main__": + game = PetGame() + game.run() \ No newline at end of file diff --git a/pets/hridyas_catgame/medicine_icon.png b/pets/hridyas_catgame/medicine_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcffb84a38b4c6a056c17e58c24e2e431c1fa7b GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|vOQfKLo9le z6C~~>^iI6^-_*_R|HqYy2bV{NUlll%mheNq=$(wRS*g#IU6YcSH&}HyHa0qX9%MQC z{=3|qgR8{SB_e*UO?_}-YH|V){3!e>czCbpr--Y(H4+b4FIMvZcYkhsWHz50BQrC@ Y!5fmrF)S0RfYvg2y85}Sb4q9e0MQIW@Bjb+ literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/play_icon.png b/pets/hridyas_catgame/play_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3aaeb3f5c10096a159cb100537525000870233 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|HhQ`^hFJ6_ zCrGgN7_?1lI$0lNa<96eO)#$k$oU_doi-t*IKqSN@Lu+GiJ1kNeB37woN8+XiW_KX z&iIplXesB-fRt}vJ|ELyJILFRc`Qwu=gjXZhbClJOl#a;ZMBTiAo@eAtI&NJw&b^d zZReNHEHD&fV`FQp{{GHTLsRph>HXd1{Hqzgyu5hQ*H2r#qVc$sd$?pwqHCmh81sdz ocR+5*wrV(P*v8!vV9dhEz@Fw_cu?qe2hi~hp00i_>zopr0MG_p0ssI2 literal 0 HcmV?d00001 diff --git a/pets/hridyas_catgame/sleep_icon.png b/pets/hridyas_catgame/sleep_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3b32c68b9d5f3aea9b61ea7f3cf6735be439613b GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|oIG6|Lo9le z6C_xf`6WJjYH7~+<1W7Y`vaah+X_ZAX30X&MYoqMN%%BB