Something went wrong. Try again.
a tiny pet with a GPT-2 brain, living in your browser
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758import type { PetState, Stat, Stats } from "../types.ts";import { HOUR, MIN, clamp } from "./utils.ts";
export function rates(asleep: boolean): Stats { return asleep ? { tummy: -2, fun: 0, energy: +22, clean: -0.5 } : { tummy: -8, fun: -6, energy: -5, clean: -3 };}export function simulateBody(state: PetState, from: number, to: number, quiet: boolean) { let t = from; const evs = []; while (t < to) { const dt = Math.min(to - t, quiet ? 10 * MIN : to - t); const r = rates(state.asleep), h = dt / HOUR; for (const k of Object.keys(r) as Stat[]) state.stats[k] = clamp(state.stats[k] + r[k] * h * (state.sick && k === "fun" ? 2 : 1)); t += dt; if (!state.pet) continue; if (!state.asleep && t >= state.nextPoop) { if (state.poop < 4) { state.poop++; state.stats.clean = clamp(state.stats.clean - 15); evs.push("pooped"); } state.nextPoop = t + (2.5 + Math.random() * 2.5) * HOUR; } const grimy = state.poop >= 3 || state.stats.tummy < 5 || state.stats.clean < 5; if (!grimy) state.grimeSince = 0; else if (state.asleep) { if (state.grimeSince) state.grimeSince += dt; } else if (!state.grimeSince) state.grimeSince = t; if (!state.asleep && !state.sick && state.grimeSince && t - state.grimeSince > HOUR) { state.sick = true; evs.push("sick"); } // Choosing to nap is the brain's call ([sleep]); collapsing is the body's, // but not within 5 minutes of being woken up. if (!state.asleep && state.stats.energy < 6 && t - (state.wokeAt || 0) > 5 * MIN) { state.asleep = true; evs.push("fell asleep"); } const hr = new Date(t).getHours(); if ( state.asleep && (state.stats.energy >= 99 || (state.stats.energy > 70 && hr >= 7 && hr < 11 && !state.lightsOff)) ) { state.asleep = false; state.lightsOff = false; evs.push("woke"); } if (state.stats.tummy < 15) evs.push("hungry"); if (state.stats.clean < 20) evs.push("stinky"); } return evs;}