# retoor <retoor@molodetz.nl>
from __future__ import annotations
from ..spec import Action, Param
from ._shared import body, confirm, path, query
GAME_ACTIONS: tuple[Action, ...] = (
Action(
name="game_state",
method="GET",
path="/game/state",
summary="Get the current user's Code Farm state",
description=(
"Returns JSON for the signed-in user's Code Farm: coins, level/XP, CI tier, "
"plot grid (each plot's state, crop, remaining build seconds), and the plantable crops."
),
handler="http",
requires_auth=True,
read_only=True,
),
Action(
name="game_leaderboard",
method="GET",
path="/game/leaderboard",
summary="List the top Code Farm players on a given board",
description=(
"Boards: score (default, overall composite score), prestige, harvests "
"(this week), raids (avg coins per successful raid, min 3 raids), "
"time_to_kernel (fastest since last refactor), fair_play (rewards recent "
"activity over hoarding), era (current Era-only leaderboard, empty when no "
"Era is running)."
),
handler="http",
requires_auth=False,
read_only=True,
params=(query("board", "Leaderboard board key, defaults to score."),),
),
Action(
name="game_view_farm",
method="GET",
path="/game/farm/{username}",
summary="View another player's Code Farm",
handler="http",
requires_auth=False,
read_only=True,
params=(path("username", "The farm owner's username."),),
),
Action(
name="game_plant",
method="POST",
path="/game/plant",
summary="Plant a crop in an empty plot on your Code Farm",
handler="http",
requires_auth=True,
params=(
Param(name="slot", location="body", description="Plot slot index.", required=True, type="integer"),
body(
"crop",
"Crop key: shell, python, webapp, api, rust, haskell, kernel, or "
"(with Mastery) distsys, mlpipe, secfort.",
required=True,
),
),
),
Action(
name="game_harvest",
method="POST",
path="/game/harvest",
summary="Harvest a finished build from a plot on your Code Farm",
handler="http",
requires_auth=True,
params=(
Param(name="slot", location="body", description="Plot slot index.", required=True, type="integer"),
),
),
Action(
name="game_buy_plot",
method="POST",
path="/game/buy-plot",
summary="Buy a new plot on your Code Farm",
handler="http",
requires_auth=True,
),
Action(
name="game_upgrade_ci",
method="POST",
path="/game/upgrade",
summary="Upgrade your Code Farm CI tier for faster builds",
handler="http",
requires_auth=True,
),
Action(
name="game_water",
method="POST",
path="/game/farm/{username}/water",
summary="Water a growing build on another player's Code Farm",
handler="http",
requires_auth=True,
params=(
path("username", "The farm owner's username."),
Param(name="slot", location="body", description="Plot slot index.", required=True, type="integer"),
),
),
Action(
name="game_steal",
method="POST",
path="/game/farm/{username}/steal",
summary="Steal a ready build from another player's Code Farm once its protection window has passed (limited to once per hour per neighbour)",
handler="http",
requires_auth=True,
params=(
path("username", "The farm owner's username."),
Param(name="slot", location="body", description="Plot slot index.", required=True, type="integer"),
),
),
Action(
name="game_fertilize",
method="POST",
path="/game/fertilize",
summary="Spend coins to halve a growing build's remaining time on your Code Farm (cost scales with the build's harvest value, so it is a pure time-skip, never a profit)",
handler="http",
requires_auth=True,
params=(
Param(name="slot", location="body", description="Plot slot index.", required=True, type="integer"),
),
),
Action(
name="game_daily",
method="POST",
path="/game/daily",
summary="Claim the daily Code Farm coin bonus (builds a streak)",
handler="http",
requires_auth=True,
),
Action(
name="game_upgrade_perk",
method="POST",
path="/game/perk",
summary="Upgrade a permanent Code Farm perk (yield, growth, discount, xp)",
handler="http",
requires_auth=True,
params=(
body("perk", "Perk key: yield, growth, discount, or xp.", required=True),
),
),
Action(
name="game_claim_quest",
method="POST",
path="/game/quests/claim",
summary="Claim a completed daily or weekly Code Farm quest/contract reward",
handler="http",
requires_auth=True,
params=(
body("quest", "Quest kind: plant, harvest, water, or earn.", required=True),
body(
"scope",
"daily (default) or weekly (requires the Legacy Contracts Mastery upgrade).",
required=False,
),
),
),
Action(
name="game_prestige",
method="POST",
path="/game/prestige",
summary=(
"Refactor (prestige) your Code Farm for a permanent coin bonus and Stars. "
"Requires level 10 AND a coin fee that scales with prestige and wealth "
"(shown as refactor_cost in game_state); the fee funds the community "
"treasury and a fraction of the remaining coins carries over. "
"Irreversible, confirmation required"
),
handler="http",
requires_auth=True,
params=(confirm(),),
),
Action(
name="game_claim_grant",
method="POST",
path="/game/grant",
summary=(
"Claim the weekly Code Farm community grant, paid from the treasury of "
"refactor fees (active low-balance, low-prestige farms only)"
),
handler="http",
requires_auth=True,
),
Action(
name="game_upgrade_legacy",
method="POST",
path="/game/legacy",
summary="Spend Stars on a permanent Legacy upgrade that survives refactor (autoharvest, multiplier, speed, plots, defense, carryover)",
handler="http",
requires_auth=True,
params=(
body(
"key",
"Legacy key: autoharvest, multiplier, speed, plots, defense, or carryover.",
required=True,
),
confirm(),
),
),
Action(
name="game_upgrade_mastery",
method="POST",
path="/game/mastery",
summary="Spend Mastery points on a permanent Mastery upgrade (unlocked at prestige 50+): autoreplant, analytics, or contracts",
handler="http",
requires_auth=True,
params=(
body("key", "Mastery key: autoreplant, analytics, or contracts.", required=True),
confirm(),
),
),
Action(
name="game_buy_infrastructure",
method="POST",
path="/game/infrastructure/buy",
summary="Buy a permanent Infrastructure building (registry, canary, observability); expensive, prestige-gated, big coin sinks",
handler="http",
requires_auth=True,
params=(
body("key", "Infrastructure key: registry, canary, or observability.", required=True),
confirm(),
),
),
Action(
name="game_upgrade_defense",
method="POST",
path="/game/defense/upgrade",
summary=(
"Upgrade your farm's Defense tier: reduces raid losses and adds steal grace, "
"but commits you to an ongoing daily coin upkeep proportional to your wealth. "
"Irreversible spend, confirmation required"
),
handler="http",
requires_auth=True,
params=(confirm(),),
),
Action(
name="game_downgrade_defense",
method="POST",
path="/game/defense/downgrade",
summary=(
"Drop your farm's Defense down one tier to escape its daily upkeep. "
"No refund, confirmation required"
),
handler="http",
requires_auth=True,
params=(confirm(),),
),
Action(
name="game_buy_cosmetic",
method="POST",
path="/game/cosmetics/buy",
summary="Buy a purely cosmetic title or plot skin with coins (no gameplay effect)",
handler="http",
requires_auth=True,
params=(
body("key", "Cosmetic key from the farm's cosmetics list.", required=True),
confirm(),
),
),
Action(
name="game_equip_cosmetic",
method="POST",
path="/game/cosmetics/equip",
summary="Equip an owned cosmetic title so it shows on the leaderboard",
handler="http",
requires_auth=True,
params=(body("key", "An owned title cosmetic key.", required=True),),
),
Action(
name="game_defense_item_purchase",
method="POST",
path="/game/farm/{username}/defense-item",
summary=(
"Purchase a defense item for your Code Farm. "
"Items: mines (1000, 15% fail chance, 100 fine), "
"cameras (1500, 10% catch, 50 fine), "
"guards (3000, 20% auto-catch, 75 fine), "
"insurance (500, recoup 50% of stolen coins on a successful raid). "
"Insurance can only be bought once. Confirmation required."
),
handler="http",
requires_auth=True,
params=(
path("username", "Your username."),
body("farm_uid", "Your farm's uid.", required=True),
body("item_type", "Item type: mines, cameras, guards, insurance.", required=True),
confirm(),
),
),
)