vpet/vpet.py
2026-03-17 14:39:13 -07:00

134 lines
3.6 KiB
Python

import time
import os
import threading
import json
from pathlib import Path
class Pet:
def __init__(self, name, species):
self.name = name
self.species = species
self.hunger = 50
self.happiness = 80
self.energy = 100
self.hygiene = 100
self.is_alive = True
self.birthday = time.time()
self.last_decay = time.time()
self.decay_delay = 10
self.status = "Happy"
def rename(self):
print("Name your pet: ", end="")
name = input()[0:10]
self.name = name
def feed(self):
self.hunger = max(0, self.hunger - 25)
def play(self):
self.happiness = min(100, self.happiness + 5)
def clean(self):
self.hygiene = min(100, self.hygiene + 13)
def decay(self):
self.last_decay = time.time()
self.happiness = max(0, self.happiness - 5)
self.energy = max(0, self.energy - 3)
self.hunger = min(100, self.hunger + 2)
self.hygiene = max(0, self.hygiene - 4)
def sleep(self):
self.energy = 100
self.status = "asleep"
def get_age(self):
print(time.time() - self.birthday)
def make_bar(self, percent):
bar = "[" + "X" * (percent//10) + "-" * (10-percent//10) + "]"
return bar
def stat_format(self, stat):
if stat == "Energy":
bar = self.make_bar(self.energy)
per = self.energy
elif stat == "Happiness":
bar = self.make_bar(self.happiness)
per = self.happiness
elif stat == "Hunger":
bar = self.make_bar(self.hunger)
per = self.hunger
elif stat == "Hygiene":
bar = self.make_bar(self.hygiene)
per = self.hygiene
else:
return "You requested a stat that doesn't exist: {stat}"
line = "{:<10}".format(f"{stat}:") + bar + "{:>5}".format(f"{per}%")
return line
def print_stats(self):
os.system("clear")
full_line = "----------------------------"
print(full_line)
print(f" o)__ Name:" + "{:>10}".format(f"{self.name}"))
print(f" (_ _`\\ Status:" + "{:>8}".format(f"{self.status}"))
print(f" z/z\\__) Age:" + "{:>11}".format("555 days"))
print(full_line)
print(self.stat_format("Energy"))
print(self.stat_format("Hunger"))
print(self.stat_format("Happiness"))
print(self.stat_format("Hygiene"))
print(full_line)
def save(self):
print("Saving and quitting...")
fp = Path("~/.vpet.sav").expanduser()
with open(fp, "w") as f:
json.dump(self.__dict__,f)
def load(self):
print("Loading game...")
fp = Path("~/.vpet.sav").expanduser()
if not Path.exists(fp):
print("No save found.")
return 0
with open(fp, "r") as f:
data = json.load(f)
self.__dict__.update(data)
return 1
def run(p):
time.sleep(p.decay_delay)
p.running = True
while p.running:
if time.time() - p.last_decay >= p.decay_delay:
p.decay()
p.print_stats()
time.sleep(1)
print("Done")
p = Pet("sally", "frog")
if not p.load():
p.rename()
p.running = True
run_t = threading.Thread(target=run, args=[p])
run_t.start()
while 1:
p.print_stats()
x = input()
if x == 'p':
p.play()
elif x == 'q':
p.save()
p.running = False
exit()
elif x == 'f':
p.feed()
elif x == 's':
p.sleep()
elif x == 'c':
p.clean()
else:
print("Unknown Command")