# SCRYPT card pool — terminal-flavored creatures. # Costs: {type: free} | {type: mem, amount: N} | {type: dumps, amount: N} # Sigils must exist in engine/cards.py KNOWN_SIGILS. # art: up to 3 lines, 9 columns; drawn inside the card frame. cards: - id: bit name: Bit power: 0 health: 1 cost: {type: free} flavor: "A humble bit. It costs nothing, and it is worth exactly that." art: |2 ┌─┐ │1│ └─┘ - id: orphan-thread name: Orphan Thread power: 0 health: 2 cost: {type: free} flavor: "Nobody joined it. It waits anyway. It will wait for you too." art: |2 ╷ ├──x ╵ - id: daemon name: Daemon power: 1 health: 2 cost: {type: mem, amount: 1} flavor: "It runs quietly in the background. It has always been running." art: |2 ^ ^ (o,o) )"( - id: firewall name: Firewall power: 1 health: 2 cost: {type: mem, amount: 1} sigils: [packet_filter] flavor: "Nothing gets over it. Not even the things that fly." art: |2 ▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒ - id: packet name: Packet power: 1 health: 1 cost: {type: mem, amount: 1} sigils: [tunneling] flavor: "It rides the wire, far above your defenses." art: |2 ┌┄┄┄┐ ┆ 01┆» └┄┄┄┘ - id: oom-killer name: OOM Killer power: 3 health: 2 cost: {type: mem, amount: 2} flavor: "When memory runs short, it decides what deserves to live." art: |2 │ ──╳── │ - id: fork-bomb name: Fork Bomb power: 1 health: 1 cost: {type: mem, amount: 1} sigils: [self_replicating] flavor: ":(){ :|:& };: — it brings a friend. The friend brings a friend." art: |2 :(){ :|:& };: - id: segfault name: Segfault power: 1 health: 1 cost: {type: mem, amount: 2} sigils: [null_pointer] flavor: "One touch of the wrong address, and everything comes down." art: |2 ▚▘ ▗▞ ▐0x0▌ ▞▗ ▘▚ - id: tarpit name: Tarpit power: 0 health: 3 cost: {type: mem, amount: 1} sigils: [honeypot] flavor: "Connect, and wait. And wait. And wait." art: |2 ≈≈≈≈≈ ≈(_)≈ ≈≈≈≈≈ - id: zombie-process name: Zombie Process power: 2 health: 3 cost: {type: dumps, amount: 4} flavor: "Killed long ago. Never reaped. It holds a grudge about that." art: |2 [z] ╱│╲ z Z - id: garbage-collector name: Garbage Collector power: 0 health: 3 cost: {type: mem, amount: 1} sigils: [scavenger_loop] flavor: "It sweeps up the dead and keeps what it finds." art: |2 ─┬─ │░░░│ └───┘ - id: sudo-token name: Sudo Token power: 0 health: 1 cost: {type: mem, amount: 1} sigils: [privileged] flavor: "Spend it, and for one shining moment you may do anything." art: |2 ┌──┐ │##│═o └──┘ - id: watchdog name: Watchdog power: 0 health: 1 cost: {type: mem, amount: 1} sigils: [auto_restart] flavor: "Kill it. Go on. It will be back before you finish typing." art: |2 /\─/\ (•ᴥ•) ┘ └ - id: kernel-panic name: Kernel Panic power: 4 health: 6 cost: {type: mem, amount: 3} flavor: "The system's final scream, given claws." art: |2 ▄▄█▄▄ ██!██ ▀█▀█▀ - id: root name: Root power: 7 health: 7 cost: {type: mem, amount: 4} flavor: "It can do anything. It owes you nothing." art: |2 # ╱ │ ╲ ╱╱ │ ╲╲ # Foe-side creatures (the Warden's processes). Not draftable by players. - id: reaper name: Reaper power: 1 health: 1 cost: {type: free} draftable: false flavor: "It collects exit codes. Yours is pending." art: |2 ▄▄▄▄ ▀ ▀▖ ▐ - id: audit-daemon name: Audit Daemon power: 1 health: 3 cost: {type: free} flavor: "It saw what you did. It wrote it down." draftable: false art: |2 ╭───╮ │ ● │ ╰───╯ - id: kill-signal name: Kill Signal power: 2 health: 1 cost: {type: free} sigils: [tunneling] flavor: "SIGKILL cannot be caught, blocked, or ignored." draftable: false art: |2 ╱ ──╱── ╱ -9 - id: cron-golem name: Cron Golem power: 3 health: 5 cost: {type: free} flavor: "At the appointed minute it rises. Check the schedule. Despair." draftable: false art: |2 ╭─╮ │┼│ ▐███▌ - id: multiplexer name: Multiplexer power: 2 health: 3 cost: {type: free} sigils: [forked] flavor: "One window, many panes. It hits everything beside you." draftable: false art: |2 ┌─┬─┐ │ │ │ └─┴─┘ - id: init name: init power: 4 health: 8 cost: {type: free} flavor: "PID 1. The parent of everything. Orphans answer to it now." draftable: false art: |2 ▄▄▄ █ 1 █ ▀▀▀ # Full starting decks (the side pile of bits is separate and always there). # Every deck carries free fodder so sacrifices never starve. starter_decks: vanilla: name: "init" description: "Where every process begins. Flexible, honest, doomed." cards: [daemon, firewall, oom-killer, orphan-thread, orphan-thread, packet, tarpit, sudo-token] forkstorm: name: "fork()" description: "Multiply, sacrifice, repeat. The board is a petri dish." cards: [fork-bomb, fork-bomb, sudo-token, orphan-thread, orphan-thread, packet, segfault, daemon] graveyard: name: "core dump" description: "Your processes die and come back owing you favors." cards: [garbage-collector, zombie-process, watchdog, orphan-thread, daemon, tarpit, oom-killer, sudo-token] encounters: # script[turn] -> plays entering the foe queue after that turn's attack. # Turn 0 and 1 resolve during setup (queue + first front row). first_blood: name: "PID 2" script: - [] # turn 0: an empty board, a breath - [{lane: 1, card: reaper}] - [{lane: 2, card: reaper}] - [{lane: 0, card: audit-daemon}] - [{lane: 3, card: kill-signal}] - [] - [{lane: 2, card: audit-daemon}] audit_sweep: name: "The Audit" script: - [{lane: 0, card: audit-daemon}] - [{lane: 2, card: reaper}] - [{lane: 1, card: kill-signal}] - [{lane: 3, card: audit-daemon}] - [{lane: 0, card: reaper}] - [{lane: 2, card: cron-golem}] - [{lane: 1, card: reaper}] - [{lane: 3, card: kill-signal}] swap_storm: name: "The Swap" script: - [{lane: 1, card: multiplexer}] - [{lane: 2, card: reaper}] - [{lane: 0, card: kill-signal}] - [{lane: 3, card: multiplexer}] - [{lane: 2, card: audit-daemon}] - [{lane: 1, card: kill-signal}] - [{lane: 0, card: cron-golem}] - [{lane: 2, card: kill-signal}] scheduled_doom: name: "Crontab" script: - [{lane: 1, card: reaper}, {lane: 2, card: audit-daemon}] - [{lane: 0, card: kill-signal}] - [{lane: 3, card: cron-golem}] - [{lane: 1, card: audit-daemon}] - [{lane: 2, card: kill-signal}] - [{lane: 0, card: audit-daemon}] - [{lane: 1, card: cron-golem}] - [{lane: 2, card: kill-signal}] init_zero: name: "PID 1" script: - [{lane: 1, card: audit-daemon}, {lane: 2, card: reaper}] - [{lane: 0, card: multiplexer}] - [{lane: 3, card: kill-signal}] - [{lane: 2, card: cron-golem}] - [{lane: 1, card: kill-signal}] - [{lane: 0, card: init}] - [{lane: 3, card: multiplexer}] - [{lane: 2, card: kill-signal}] # Forks: the path splits and the Warden holds both doors open. # bounty applies only if the player WINS the chosen fight. # {kind: cycles, amount: N} -> extra cycles banked # {kind: draft} -> an extra card draft right after the fight forks: crossroads_audit: prompt: "Two doors. Behind one, the auditor you expected. Behind the other, something hungrier." options: - encounter: audit_sweep label: "the audit" blurb: "the fight you were promised. fair, as fairness goes here." - encounter: swap_storm label: "the swap" blurb: "panes within panes. survivors loot the wreckage." bounty: {kind: draft} crossroads_final: prompt: "The last stretch. Choose your executioner." options: - encounter: scheduled_doom label: "the crontab" blurb: "death on a schedule you have already read." - encounter: init_zero label: "PID 1" blurb: "the parent of everything. bring everything." bounty: {kind: cycles, amount: 10}