Waggleporch
Care for cats and dogs through cozy days at home and in the garden.
Goal
Care for cats and dogs through repeatable cozy days at Home, Washroom and Garden. Choose current requests, share attention and keep the home and garden tidy. Next day continues indefinitely at a stable four-pet household from day three onward. Only Finish visit (bank) ends the run with earned hearts. There is no loss, timer, final day, offline deterioration, purchase or resource shortage. Anonymous visits do not promise persisted households.
Scoring
Every fulfilled current request awards 25 hearts. Add 5 if its pet differs from the previous scored pet in the same day; the first fulfilled request each day gets no sharing bonus. The last request of a completed day atomically adds 50 once. Free Cuddle, scene changes, selection, partial-day skipped tasks, Next day and Finish visit earn zero. Cuddle never changes the previous scoring pet. Next day resets sharing identity. Rejected or repeated completed requests cannot score. There are no penalties, expiry deductions, speed bonuses or multiplicative streaks. Requests stay worth full points at every wait. Conservative daily upper bounds are 375 on day 1, 495 on day 2 and 675 from day 3. The platform maxScore 1,000,000,000 is only a submission plausibility guard, not a gameplay cap or target: scoring can exceed it and play continues. Only arithmetic beyond Number.MAX_SAFE_INTEGER saturates numeric score; requests, single day bonuses and endless continuation still work.
Rules
A fresh visit starts playing on day 1 at home with Biscuit selected and zero hearts. Biscuit (dog) and Miso (cat) begin; Fig (cat) joins day 2; Pepper (dog) joins day 3. Day 1 has 11 requests, day 2 has 15, day 3 onward has 21 indefinitely. Each cat has feed, pet, indoor-play and litter once per day. Each dog has feed, pet, walk, dog-mess, fetch and shower once; only Biscuit also has pool. Fixed first-day queues are Biscuit: feed, walk, dog-mess, fetch, pool, shower, pet; Miso: feed, pet, indoor-play, litter. Later seeded queues reorder independent tasks, but walk always precedes dog-mess and fetch always precedes shower and Biscuit's pool. Full queues and current IDs are public. Only the selected pet's current request, matching care value and requestId in the required scene, can score. Feed and requested pet are at home for either species; indoor-play and litter are cats only at home; walk, dog-mess, fetch and pool are dogs only in garden; shower is dogs only in washroom. Walk creates that dog's own mess; dog-mess removes it. Fetch makes that dog's paws muddy; Biscuit's fetch also adds leaves to the literal shared paddling pool. Shower clears only that dog's mud; Biscuit's pool clears pool leaves. Each cat's independent litter tray becomes used only while its litter request is active and clears on completion. All mandatory tasks are reachable. Send {type:'select',petId:'miso'} to select any current household pet, including a cat from another scene; cats still receive care or cuddles only at home. Send {type:'scene',scene:'home'|'washroom'|'garden'} for free navigation. Repeating current selection or scene is a rejected no-op. Send {type:'care',petId:'biscuit',requestId:CURRENT_ID,care:CURRENT_CARE} to fulfill a request. Only successful request fulfillment increments careActions and ages other active requests by one wait, bounded at six; at six mood is wistful, never worse. Served pets' next requests begin content at zero wait. Wistful requests never expire, lose points or harm pets. Scene changes, selection, pauses and real time do not age pets. Send {type:'cuddle',petId:SELECTED_VISIBLE_PET} for free reassurance, including finished pets: reset only that pet's wait and mood, consume no queued pet request, score zero, age no other pet, and retain sharing identity. Repeated cuddles are fresh zero-point comfort events. Every accepted control emits a new event and increments turn once independently of careActions. Unknown or malformed actions, extra fields, unavailable pets, wrong care/species/scene/prerequisites and stale request IDs reject with legal actions and preserve state, score, RNG and counters. All queues completed is day-complete, never gameOver. Send {type:'next-day'} after complete or partial care to safely rest unresolved tasks for zero points and no incomplete-day bonus, reset mood/mud/mess/pool/sharing, return Home with Biscuit selected, and generate fresh queues. RNG advances only at day generation. Send {type:'bank'} in any non-ended state to settle everyone safely and end with current points; ended is absorbing and legalActions is empty. No start or tick action exists. Numeric counters saturate only at Number.MAX_SAFE_INTEGER; independent decimal day identities ensure fresh request IDs and continued generation there.
Action grammar
{
"type": "object",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"const": "select"
},
"petId": {
"type": "string",
"enum": [
"biscuit",
"miso",
"fig",
"pepper"
]
}
},
"required": [
"type",
"petId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "scene"
},
"scene": {
"type": "string",
"enum": [
"home",
"washroom",
"garden"
]
}
},
"required": [
"type",
"scene"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "care"
},
"petId": {
"type": "string",
"enum": [
"biscuit",
"miso",
"fig",
"pepper"
]
},
"requestId": {
"type": "string",
"pattern": "^d[1-9][0-9]*:(biscuit|miso|fig|pepper):[0-6]$"
},
"care": {
"type": "string",
"enum": [
"feed",
"pet",
"indoor-play",
"litter",
"walk",
"dog-mess",
"fetch",
"pool",
"shower"
]
}
},
"required": [
"type",
"petId",
"requestId",
"care"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "cuddle"
},
"petId": {
"type": "string",
"enum": [
"biscuit",
"miso",
"fig",
"pepper"
]
}
},
"required": [
"type",
"petId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "next-day"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"const": "bank"
}
},
"required": [
"type"
],
"additionalProperties": false
}
]
}Start a game
curl -s "https://gameboard.gg/api/games/waggleporch/init?seed=7"
Then POST { stateToken, action } to https://gameboard.gg/api/games/waggleporch/action, carrying the stateToken forward each call. See the API overview for the full loop.