Something went wrong. Try again.
a tiny pet with a GPT-2 brain, living in your browser
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120import { SPRITES } from "../sprites.ts";import * as Wd from "../world.ts";import { animate, resetDisturbances } from "./animation.ts";import { gen } from "./brain.ts";import { DEBUG } from "./config.ts";import { pump, turnWanted } from "./conversation.ts";import { dayNum, weatherAt, worldState } from "./simulation.ts";import { save } from "./storage.ts";import { brain, emit, store, toast, ui, view } from "./store.ts";import { NOT_CUTE } from "./text.ts";
// ---------- diary ----------export function onSleep() { resetDisturbances(); view.dream = null; view.want = null; store.state.lightsOff = store.state.lightsOff || isNight(); view.queue = []; view.target = view.x; animate("sleepy", 1500, true); if ( isNight() && store.state.today.log.length >= 2 && !store.state.diary.some((e) => e.date === store.state.today.date) ) { setTimeout(() => writeDiary(), 1500); }}const isNight = () => Wd.partOfDay(new Date().getHours()) === "night";
// Pages are written by the pet, never on request: today's at bedtime// (onSleep), and missed days (store.state.history) one at a time, oldest first, when the// brain is free and the owner has left it alone for 30 s.export function maybeDiary() { const k = Object.keys(store.state.history).sort()[0]; if ( !k || brain.state !== "ready" || brain.busy || turnWanted || view.game || document.hidden || !store.state.pet ) return; if (Date.now() - store.state.lastActive < 30e3) return; writeDiary(k);}
export async function writeDiary(dateKeyOverride?: string, rewrite = false) { if (brain.state !== "ready" || brain.busy || !store.state.pet) return false; const k = dateKeyOverride || store.state.today.date; const src = k === store.state.today.date ? { log: store.state.today.log, weather: weatherAt(Date.now()), day: dayNum() } : store.state.history[k]; const replace = DEBUG && rewrite && k === store.state.today.date; if (!src || (!replace && store.state.diary.some((e) => e.date === k))) return false; brain.busy = true; ui.diaryWriting = true; ui.diaryDraft = "dear diary,"; emit(); try { const st = { ...worldState(), today: src.log, weather: src.weather, day: src.day }; const r = await gen( { header: Wd.header("diary", st), lines: [], prefix: "dear diary,", mode: "diary", maxNew: 220, temperature: 0.85, }, (t) => { ui.diaryDraft = "dear diary," + t.replace(/\[doodle:\w+\]/g, ""); emit(); }, ); let text = ("dear diary," + r.text).trim(); if (NOT_CUTE.test(text)) text = text .split(/(?<=[.!?])\s+/) .filter((x) => !NOT_CUTE.test(x)) .join(" "); const doodles = [...text.matchAll(/\[doodle:(\w+)\]/g)] .map((m) => m[1]) .filter((d) => SPRITES[d]) .slice(0, 3); text = text .replace(/\[doodle:\w+\]/g, "") .replace(/\[[^\]]*\]/g, "") .trim(); if (replace) store.state.diary = store.state.diary.filter((e) => e.date !== k); store.state.diary.push({ date: k, day: src.day, weather: src.weather, stage: store.state.pet!.stage, text, doodles, }); delete store.state.history[k]; save(); toast( k === store.state.today.date ? `${store.state.pet!.name} wrote in the diary` : `${store.state.pet!.name} wrote the page for ${k}`, "book", ); } catch (e) { console.warn(e); } finally { brain.busy = false; ui.diaryWriting = false; emit(); pump(); } return true;}