Skip to content

Instantly share code, notes, and snippets.

@ryesalvador
Last active January 22, 2024 10:35
Show Gist options
  • Star 40 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save ryesalvador/e88cb2b4bbe0694d175ef2d7338abd07 to your computer and use it in GitHub Desktop.
Save ryesalvador/e88cb2b4bbe0694d175ef2d7338abd07 to your computer and use it in GitHub Desktop.
Tamagotchi Emulator in PyGame
# Tamagotchi - A port of the Tamagotchi Emulator by aerospark: https://goo.gl/gaZ1fA
# Copyright (C) 2017 Ryan Salvador
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import pygame, random, sys, os, platform
from pygame.locals import *
if platform.system() == 'Windows':
os.environ['SDL_VIDEODRIVER'] = 'windib'
#Animations
IDLE_EGG = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7e000,0x87000,0x103800,0x300c00,0x700400,0x418200,0x418200,0x400200,0x700600,0x3c0c00,0x1e0800,0x3ffc00,0x0),(0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7e000,0x87000,0x103800,0x300c00,0x700400,0x400200,0x418200,0x418200,0x700600,0x3c0c00,0xffff00,0x0))
IDLE_BABY = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x78000,0xb4000,0x1fe000), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x78000,0xcc000,0x84000,0xb4000,0x84000,0x78000,0x0))
IDLE_MATURE = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfc00,0x10200,0x24900,0x20100,0x23100,0x20100,0x20100,0x10200,0xfc00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfc00,0x10200,0x28500,0x23100,0x23100,0x20100,0x10200,0xfc00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
SLEEP_BABY = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x78000,0xfc000,0x1fe000), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1fe000,0x3ff000))
SLEEP_MATURE = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3fc00,0x40200,0x80100), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f800,0x20400,0x40200,0x40200))
OVERLAY_ZZZ = ((0x0,0x0,0x0,0x0,0xf800000,0x4000000,0x2000000,0x1000000,0xf800000,0x0,0x0,0x3c00000,0x1000000,0x800000,0x3c00000,0x0,0x700000,0x200000,0x700000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0xf800000,0x4000000,0x2000000,0x1000000,0xf800000,0x0,0x0,0x3c00000,0x1000000,0x800000,0x3c00000,0x0,0x700000,0x200000,0x700000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
OVERLAY_EAT = ((0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x7700000,0xff00000,0xfd00000,0xff00000,0x7f00000,0x7e00000,0x3c00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x7700000,0xfe00000,0xfc00000,0xfe00000,0x7f00000,0x7e00000,0x3c00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x7400000,0xf800000,0xf800000,0xf800000,0x7c00000,0x7e00000,0x3c00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x7000000,0xf000000,0xe000000,0xe000000,0x7000000,0x7800000,0x3c00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
OVERLAY_STINK = ((0x0,0x0,0x0,0x0,0x10000000,0x8000008,0x10000004,0xa000028,0x11000044,0xa000028,0x1000044,0x12000020,0x21000040,0x10000000,0x20000000,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x10000000,0x8000008,0x10000004,0xa000028,0x11000044,0xa000028,0x1000044,0x12000020,0x21000040,0x10000000,0x20000000,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
OVERLAY_DEAD = ((0x0,0x0,0xfc00000,0x1fe00000,0x1b600000,0x1fe00000,0xfc00000,0xfc00000,0x5400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x7e00000,0xff00000,0xdb00000,0xff00000,0x7e00000,0x7e00000,0x2a00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
OVERLAY_EXCLAIM = ((0x0,0x20,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x20,0x0,0x20,0x70,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0), (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0))
OVERLAY_CLEAN = ((0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2),)
#Components
SELECTOR = (0x7800000f,0x60000003,0x40000001,0x40000001,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000001,0x40000001,0x60000003,0x7800000f)
FEED = (0x0,0x0,0x0,0x0,0x0,0x7805a0,0x7c05a0,0x7c05a0,0x7c05a0,0x7c05a0,0x7c05a0,0x7c05a0,0x7c07e0,0x7c07e0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x7803c0,0x300180,0x0,0x0,0x0)
FLUSH = (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x5000000,0x5000000,0x4800000,0x4800000,0x4400000,0x4400000,0x4400000,0x2200000,0x2200000,0x1200000,0xffff00,0x1200280,0x11ffd00,0x1000080,0x1000080,0x1000080,0x1000080,0x1000080,0x1000080,0x1000040,0xffff80,0x0,0x0,0x0)
HEALTH = (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3ffffc0,0xc000030,0x10912488,0x10912488,0x10492908,0x8000010,0x8000010,0x8000410,0x4000820,0x4001020,0x4002020,0x201c040,0x201c040,0x1ffff80,0x0,0x0,0x0)
ZZZ = (0x0,0x0,0x0,0x0,0xf800000,0x4000000,0x2000000,0x1000000,0xf800000,0x0,0x0,0x3c00000,0x1000000,0x800000,0x3c00000,0x0,0x700000,0x200000,0x700000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
DISPLAY_HUNGER = (0x0,0x0,0x3bcc94a4,0x4852b4a4,0x39c2d4bc,0x485a94a4,0x4bdc9324,0x0,0x0,0x0,0x0,0x1ffffff8,0x20000004,0x20000004,0x20000004,0x20000004,0x20000004,0x1ffffff8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
DISPLAY_ENERGY = (0x0,0x0,0x498ef4bc,0x4a521584,0x704e368c,0x43521484,0x3b92f4bc,0x0,0x0,0x0,0x0,0x1ffffff8,0x20000004,0x20000004,0x20000004,0x20000004,0x20000004,0x1ffffff8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
DISPLAY_WASTE = (0x0,0x0,0x7df38e44,0x4405144,0x1c439f44,0x4441154,0x7c439128,0x0,0x0,0x0,0x0,0x1ffffff8,0x20000004,0x20000004,0x20000004,0x20000004,0x20000004,0x1ffffff8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
DISPLAY_AGE = (0x0,0x0,0x7ce38,0x5144,0x1c17c,0x5944,0x7de44,0x0,0x0,0x0,0x0,0x1ffffff8,0x20000004,0x20000004,0x20000004,0x20000004,0x20000004,0x1ffffff8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
DISPLAY_BACK = (0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x498c710,0x2a52918,0x185e77c,0x2a52918,0x4992710,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0)
AGE_HATCH = 128
AGE_MATURE = 796
AGE_DEATHFROMNATURALCAUSES = 8192
HUNGER_CANEAT = 32
HUNGER_NEEDSTOEAT = 128
HUNGER_SICKFROMNOTEATING = 256
HUNGER_DEADFROMNOTEATING = 512
ENERGY_CANSLEEP = 150
ENERGY_TIRED = 64
ENERGY_PASSOUT = 8
WASTE_EXPUNGE = 256
BG_COLOR = (160, 178, 129)
PIXEL_COLOR = (10, 12, 6)
NONPIXEL_COLOR = (156, 170, 125)
TRANSPARENT_COLOR = (0, 0, 0, 0)
BTN_BORDER_COLOR = (128, 12, 24)
BTN_CENTER_COLOR = (200, 33, 44)
FPS = 30
SECOND = 1000
SCREEN_WIDTH = 500
SCREEN_HEIGHT = 520
def bitor(current_frame, overlay_frame):
l = []
for i in range(32):
b = current_frame[i] | overlay_frame[i]
l.append(b)
return tuple(l)
def get_bits(number, num_bits):
"""Solution from http://stackoverflow.com/questions/16659944/iterate-between-bits-in-a-binary-number"""
return [(number >> bit) & 1 for bit in range(num_bits - 1, -1, -1)]
def render_display(image_data, fg_color, bg_color, off=0, percv=0):
for y in range(32):
bits = get_bits(image_data[y], 32+off)
bits.reverse()
for x in range(off, 32+off):
color = bg_color
if x in range(len(bits)):
if bits[x] or percv > 0 and y > 11 and x > 2 and y < 17 and x < 3 + percv:
color = fg_color
pygame.draw.rect(screen, color, ((x-off)*10+32, y*10+64, 8, 8))
def render_component(surface, image_data, fg_color, bg_color=(255, 255, 255)):
pixels = pygame.PixelArray(surface)
for y in range(surface.get_height()):
bits = get_bits(image_data[y], surface.get_width())
for x, bit in enumerate(bits):
if (bit):
pixels[x][y] = fg_color
else:
pixels[x][y] = bg_color
del pixels
def do_random_event(pet):
num = random.randint(0, 31)
if num == 12:
pet['hunger'] += 1
elif num == 16:
pet['energy'] -= 1
elif num == 18:
pet['energy'] += 1
elif num == 20:
pet['waste'] += 1
elif num == 7:
pet['happiness'] += 1
elif num == 4:
pet['happiness'] -= 1
def do_cycle(pet):
do_random_event(pet)
pet['hunger'] += 1
pet['waste'] += 1
pet['energy'] -= 1
pet['age'] += 2
if pet['waste'] >= WASTE_EXPUNGE:
pet['happiness'] -= 1
def get_offset():
return random.randint(-3, 2)
def get_next_frame(animation_frames, current_frame):
return (current_frame + 1) % len(animation_frames)
def trigger_death(stage):
if stage == 1:
current_anim = SLEEP_BABY
elif stage == 2:
current_anim = SLEEP_MATURE
overlay_anim = OVERLAY_DEAD
return current_anim, overlay_anim, True, True
def trigger_sleep(stage):
if stage == 1:
current_anim = SLEEP_BABY
elif stage == 2:
current_anim = SLEEP_MATURE
overlay_anim = OVERLAY_ZZZ
return current_anim, overlay_anim, True, True
def update_page(spid):
if spid == 0:
stats_page = DISPLAY_HUNGER
elif spid == 1:
stats_page = DISPLAY_AGE
elif spid == 2:
stats_page = DISPLAY_WASTE
elif spid == 3:
stats_page = DISPLAY_ENERGY
elif spid == 4:
stats_page = DISPLAY_BACK
return stats_page
def get_button_at_pixel(x, y):
if y > 420 and y < 484:
button = 0
for i in range(0, 288, 96):
if x > 64 + i and x < 128 + i:
return button
else:
button += 1
return None
def render_buttons(left, top):
for i in range(0, 288, 96):
pygame.draw.ellipse(screen, BTN_BORDER_COLOR, (left + i, top, 64, 64))
pygame.draw.ellipse(screen, BTN_CENTER_COLOR, (left + i + 4, top + 4, 56, 56))
pygame.draw.ellipse(screen, PIXEL_COLOR, (left + i, top, 64, 64), 1)
def main():
global screen, clock
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
pygame.display.set_caption('Tamagotchi')
font = pygame.font.SysFont('Arial', 14)
selector_img = pygame.Surface((32, 32)).convert_alpha()
render_component(selector_img, SELECTOR, PIXEL_COLOR, TRANSPARENT_COLOR)
pygame.time.set_timer(USEREVENT + 1, SECOND)
# Tamagotchi
pet = {'hunger':0, 'energy':256, 'waste':0, 'age':0, 'happiness':0}
# Counters
off = 0
selid = 0
spid = 0
stage = 0
frame = 0
ol_frame = 0
# Flags
stats = False
has_overlay = False
cleaning = False
eating = False
stats = False
sleeping = False
dead = False
update_game = False
current_anim = IDLE_EGG
overlay_anim = OVERLAY_ZZZ
stats_page = DISPLAY_HUNGER
# Game loop
while True:
screen.fill(BG_COLOR)
mousex = 0
mousey = 0
# Event handler
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONUP:
mousex, mousey = event.pos
elif event.type == USEREVENT + 1:
if cleaning:
pygame.time.set_timer(USEREVENT + 1, int(SECOND / 10))
update_game = True
# Buttons logic
button = get_button_at_pixel(mousex, mousey)
if button == 0:
if stats:
spid -= 1
if spid <= -1:
spid = 4
stats_page = update_page(spid)
else:
selid -= 1
if selid <= -1:
selid = 3
elif button == 1:
if stage > 0 or selid == 2:
if selid == 0:
eating = True
overlay_anim = OVERLAY_EAT
ol_frame = 0
has_overlay = True
elif selid == 1:
cleaning = True
overlay_anim = OVERLAY_CLEAN
ol_frame = 0
has_overlay = True
elif selid == 2:
stats = not stats
elif selid == 3:
if pet['energy'] <= ENERGY_CANSLEEP:
current_anim, overlay_anim, sleeping, has_overlay = trigger_sleep(stage)
elif button == 2:
if stats:
spid += 1
spid %= 5
stats_page = update_page(spid)
else:
selid += 1
selid %= 4
# Game logic
if update_game:
if stage == 0 and pet['age'] > AGE_HATCH:
stage += 1
current_anim = IDLE_BABY
has_overlay = False
if stage == 1 and pet['age'] > AGE_MATURE:
stage += 1
current_anim = IDLE_MATURE
if eating and ol_frame == len(overlay_anim) - 1:
eating = False
has_overlay = False
ol_frame = 0
pet['hunger'] = 0
if sleeping:
pet['energy'] += 8
if pet['energy'] >= 256:
sleeping = False
has_overlay = False
if stage == 0:
current_anim = IDLE_EGG
elif stage == 1:
current_anim = IDLE_BABY
elif stage == 2:
current_anim = IDLE_MATURE
if cleaning:
off -= 1
if off == -33:
off = 0
cleanincr = 0
cleaning = False
has_overlay = False
pet['waste'] = 0
pygame.time.set_timer(USEREVENT + 1, SECOND)
else:
if not dead:
frame = get_next_frame(current_anim, frame)
off = get_offset()
if not sleeping and not dead:
do_cycle(pet)
if pet['energy'] < ENERGY_PASSOUT:
if stage > 0:
pet['happiness'] -= 64
current_anim, overlay_anim, sleeping, has_overlay = trigger_sleep(stage)
if not sleeping and not cleaning and not eating and not dead:
if pet['waste'] >= WASTE_EXPUNGE:
overlay_anim = OVERLAY_STINK
has_overlay = True
elif pet['energy'] <= ENERGY_TIRED or pet['hunger'] >= HUNGER_NEEDSTOEAT \
or pet['waste'] >= WASTE_EXPUNGE - WASTE_EXPUNGE / 3:
overlay_anim = OVERLAY_EXCLAIM
has_overlay = True
if not dead:
if pet['hunger'] >= HUNGER_DEADFROMNOTEATING or pet['age'] >= AGE_DEATHFROMNATURALCAUSES:
off = 3
current_anim, overlay_anim, dead, has_overlay = trigger_death(stage)
if has_overlay:
ol_frame = get_next_frame(overlay_anim, ol_frame)
update_game = False
# Render components
zipped = zip([FEED, FLUSH, HEALTH, ZZZ], [i for i in range(64, 320, 64)])
z = list(zipped)
for i in range(len(z)):
img = pygame.Surface((32, 32))
render_component(img, z[i][0], PIXEL_COLOR, NONPIXEL_COLOR)
screen.blit(pygame.transform.flip(img, True, False), (z[i][1], 16))
# Render selector
screen.blit(pygame.transform.flip(selector_img, True, False), (64+(selid*64), 16))
# Render display
if stats:
if spid == 0:
percv = pet['hunger'] * 27 / HUNGER_NEEDSTOEAT
elif spid == 1:
percv = pet['age'] * 27 / AGE_DEATHFROMNATURALCAUSES
elif spid == 2:
percv = (pet['waste'] % WASTE_EXPUNGE) * 27 / WASTE_EXPUNGE
elif spid == 3:
percv = pet['energy'] * 27 / 256
elif spid == 4:
percv = 0
if percv > 27:
percv = 27
render_display(stats_page, PIXEL_COLOR, NONPIXEL_COLOR, 0, percv)
else:
if has_overlay:
animation = bitor(current_anim[frame], overlay_anim[ol_frame])
else:
animation = current_anim[frame]
render_display(animation, PIXEL_COLOR, NONPIXEL_COLOR, off)
# Render debug
surf = font.render('DEBUG --', True, PIXEL_COLOR)
screen.blit(surf, (360, 60))
debug = (('AGE: %s', 'HUNGER: %s', 'ENERGY: %s', 'WASTE: %d', 'HAPPINESS: %s'), \
('age', 'hunger', 'energy', 'waste', 'happiness'))
for pos, y in enumerate(i for i in range(70, 120, 10)):
surf = font.render(debug[0][pos] % pet[debug[1][pos]], True, PIXEL_COLOR)
screen.blit(surf, (360, y))
# Render buttons
render_buttons(64, 420)
pygame.display.update()
clock.tick(FPS)
if __name__ == '__main__':
main()
@House-Kitty-Mew
Copy link

crashs on line 425
no len() on z

@ryesalvador
Copy link
Author

ryesalvador commented Jun 6, 2017

@House-Kitty-Mew Thank you for your support. Originally it was designed to run on Python 2; now it runs on Python 3 as well. This bug has now been fixed.

@davidclose
Copy link

line 301 looks like it should be 'cleaning'
love the emulator!

@Xarick28
Copy link

Xarick28 commented Feb 5, 2019

line 301 looks like it should be 'cleaning'
love the emulator!

Line 301 is unused ;)
Yes, this emulator is great!

@SleepyBoi2852
Copy link

SleepyBoi2852 commented Sep 30, 2019

I Click the Right most button, then the middle button, and it crashes with this error

Traceback (most recent call last):
File "TG.py", line 385, in
main()
File "TG.py", line 234, in main
pygame.time.set_timer(USEREVENT + 1, SECOND / 10)
TypeError: integer argument expected, got float

Yes I did rename it. and added a couple of lines

@ryesalvador
Copy link
Author

@Realsans22123 I could not replicate the crash. Can you tell me more about your setup and environment?

@Espionnite
Copy link

Hello Rye,
Just got the same issue (as @Realsans22123):

  • Launched it
  • Waited for it to born
  • Feeded him
  • Tried to clean

and crashed with the same:

Traceback (most recent call last):
  File "tamagotchi.py", line 382, in <module>
    main()
  File "tamagotchi.py", line 231, in main
    pygame.time.set_timer(USEREVENT + 1, SECOND / 10)
TypeError: integer argument expected, got float

Trying to understand the issue, hope you can help !

Thanks anyway !

@ryesalvador
Copy link
Author

ryesalvador commented Nov 2, 2019

Hello @Espionnite,

Thanks for reporting this bug. I have changed line 231 to cast the error-causing float into an integer type. I hope this has fixed the issue. If you find any more bugs, please don't hesitate to let me know.

@SleepyBoi2852
Copy link

@dariadiblasi
Copy link

Hi, I also got this error message. Hope it can be fixed!

line 382, in
main()
File "/Users/dariadiblasi/Desktop/python_work/tamagotchi.py", line 189, in main
pygame.time.set_timer(USEREVENT + 1, SECOND)
NameError: name 'USEREVENT' is not defined
[Finished in 5.3s with exit code 1]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment