cc_retire
Retire a creature to Millhaven once its bond reaches 70. It is not lost—use recall to bring it back when you return.
Instructions
Send a creature home to Millhaven to rest. Only available once their bond reaches 70. They are not lost — use cc_recall when you return to Millhaven to bring them back.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| nickname | Yes | The nickname (or species name) of the creature to send home. |
Implementation Reference
- src/games/crittercatch/index.ts:426-473 (handler)The 'cc_retire' tool handler: sends a creature home to Millhaven to rest. Requires bond level >= 70. Removes creature from party, pushes to retired array, and checks for pending catches via maybeAcceptPending().
server.tool( 'cc_retire', 'Send a creature home to Millhaven to rest. Only available once their bond reaches 70. ' + 'They are not lost — use cc_recall when you return to Millhaven to bring them back.', { nickname: z.string().describe("The nickname (or species name) of the creature to send home.") }, async ({ nickname }) => { const s = requireGame(); const turnBlock = checkTurn(s); if (turnBlock) return turnBlock; const idx = s.party.findIndex(m => m.nickname.toLowerCase() === nickname.toLowerCase()); if (idx === -1) { const names = s.party.map(m => m.nickname).join(', ') || 'none'; return err(`No creature named "${nickname}" in your party.\n\nParty: ${names}`); } const member = s.party[idx]; const species = SPECIES[member.speciesId]; if (member.bondLevel < 70) { return err( `${member.nickname}'s bond is ${member.bondLevel}/100. ` + `They need to reach 70 before they trust the road home on their own.`, ); } s.party.splice(idx, 1); s.retired.push(member); addToLog(s, `${member.nickname} sent home to Millhaven.`); const lines = [ `${species.bondQuotes.high.charAt(0).toUpperCase() + species.bondQuotes.high.slice(1)}.`, '', `You stay with ${member.nickname} a moment longer than you mean to.`, '', `Then they go — not in a hurry, not looking back. Down the valley road toward Millhaven.`, '', 'Old Maren will be waiting. She always knows. There will be something warm on the stove, ' + 'a soft place near the fire, and she will tell them about the valley the way she tells it ' + 'to things that actually listen. They will be well looked after until you return.', ]; // If a creature was waiting in pendingCatch (party-full), the slot we // just opened lets them join automatically — same as cc_release. maybeAcceptPending(s, lines); lines.push('', renderParty(s)); return ok(lines.join('\n')); }, - src/index.ts:20-20 (registration)Registration call: registerCritterCatchTools(server) is called in the main server setup file, which registers 'cc_retire' as a tool on the MCP server.
registerCritterCatchTools(server); - Input schema for cc_retire: requires a 'nickname' string describing the creature's name to retire.
{ nickname: z.string().describe("The nickname (or species name) of the creature to send home.") }, - Helper function maybeAcceptPending() is called by cc_retire when a slot opens: checks if a pending catch exists and slots it into the party.
function maybeAcceptPending(s: PlayerState, lines: string[]): void { if (!s.pendingCatch) return; const incoming = s.pendingCatch; const incomingSpecies = SPECIES[incoming.speciesId]; s.party.push(incoming); s.pendingCatch = null; addToLog(s, `${incoming.nickname} joined the party.`); lines.push( '', `${incoming.nickname} steps forward to take their place.`, '', incomingSpecies.description, `"${incomingSpecies.personalityNote}"`, ); if (incomingSpecies.secretTrait) { lines.push('', `✦ ${incomingSpecies.secretTrait}`); }