Temporary effects system — curses are just shitty buffs
"All effects are buffs. Some are just shitty."
A Sim gets caffeinated. A tavern gets haunted. A lantern burns down. Silver, as a material, harms anyone who wields it. Bob is smitten with Alice, whatever Alice thinks. In Fluxx, the rules get a new one.
Same fields, same clock, any host — character, room, object, prototype, relationship, ruleset.
radiates: { to: occupants } reaches past the host, so a poisoned room hurts whoever is in itexpires: — a timer keyed to the host's death never fireshosts: on a buff restricts it where it only makes sense somewhere; buff_policy.allowed_hosts on a world narrows a whole game. Default is any.Rooms and objects can also just be characters. Anything can delegate to character — a forge that wants tending, remembers who banked the fire, takes turns and narrates is a character who is a place. Rooms already ADVERTISE into the same auction.
Host rules in full: SKILL.md § Hosts
| K-Line | Why Related |
|--------|-------------|
| simulation/ | Buffs live in simulation state |
| time/ | Duration measured in simulation turns |
| needs/ | Buffs affect need decay |
| character/ | Buffs stored in character state |
| cat/ | Cats can grant charm buffs |
| dog/ | Dogs grant loyalty buffs |
| persona/ | Personas grant buffs |
| yaml-jazz/ | Semantic buffs (LLM interprets) |
| adventure/ | The compiler that turns English guards into _js/_py snippets, and the engine that runs them |
| room/ | Rooms host buffs, and can delegate to character to be animate |
| examples/adventure-4/ | Grue-repellent in action |
Full Spec: SKILL.md
Temporary effects system. Buffs modify stats, abilities, or behavior. Curses are just negative buffs — no separate system needed.
buff:
name: "Caffeinated"
source: "Espresso"
effect: { energy: +2, focus: +1 }
duration: 5 # simulation turns
| Concept | Description |
|---------|-------------|
| Numeric | { energy: +2 } |
| Semantic | "feeling lucky" (LLM interprets) |
| Mixed | Both stat mods and vibes |
| Duration | Turns, natural language, or conditional |
| Stacking | Same source refreshes, different sources add |
| Compiled | English guard/tick/expires compile to _js and _py snippets the engine runs directly — a JIT for buffs, with deopt back to the prose (BUFF-IN-TIME-COMPILER.md) |
| Synergies | Some buffs combine into stronger effects |
Buffs have three lifecycle hooks, written as natural language prompts and compiled to JS:
| Hook | Compiles To | When It Runs |
|------|-------------|--------------|
| start | start_js | Buff activates on character |
| simulate | simulate_js | Each simulation tick |
| is_finished | is_finished_js | Returns true → buff ends |
buff:
name: "Poison"
start: "Character turns green, loses 1 HP immediately"
simulate: "Lose 1 HP per tick, emit groaning sound"
is_finished: "Character HP below 10 OR 5 ticks have passed"
tags: [curse, damage-over-time]
Closure signature: (world, subject, verb, object) => { ... }
subject = the character with the buffBuffs modify these standard character stats:
| Property | Range | Decay | Description |
|----------|-------|-------|-------------|
| hunger | 0-100 | -1/hr | Need to eat |
| energy | 0-100 | -2/hr | Tiredness, need for sleep |
| social | 0-100 | -1/hr | Need for interaction |
| hygiene | 0-100 | -0.5/hr | Cleanliness |
| bladder | 0-100 | varies | Bathroom urgency |
| fun | 0-100 | -1/hr | Entertainment need |
| comfort | 0-100 | context | Physical comfort |
| Property | Range | Description |
|----------|-------|-------------|
| focus | 0-100 | Concentration, attention span |
| mood | -100 to +100 | Emotional state (negative=sad, positive=happy) |
| stress | 0-100 | Anxiety level |
| creativity | 0-100 | Creative thinking capacity |
| confidence | 0-100 | Self-assurance |
| patience | 0-100 | Tolerance for delays/frustration |
| curiosity | 0-100 | Drive to explore/learn |
| Property | Range | Description |
|----------|-------|-------------|
| hp | 0-max | Health points |
| damage | numeric | Attack power |
| armor | numeric | Damage reduction |
| speed | numeric | Movement/action rate |
| luck | -100 to +100 | Chance modifier |
A room holds these itself, and buffs modify them like any other stats:
| Property | Affects | Example |
|-----------------|---------|---------|
| production_speed | Work rate in room | Well-lit forge +20% = faster crafting |
| error_rate | Mistake probability | Haunted +30% = more accidents |
| comfort_bonus | Comfort granted to visitors | Cozy +15 comfort |
| mood_influence | Mood effect on occupants | Creepy -10 mood |
| discovery_chance | Finding hidden things | Mysterious +25% secrets |
| danger_level | Hazard intensity | Cursed = traps more deadly |
# A library that is also someone — it delegates to `character`, so it wants
# things, takes turns, and narrates its own buff ticks.
room:
id: old-library
name: "The Old Library"
delegates_to: [room, character]
production_speed: 100 # Books found per search
error_rate: 5 # % chance of disturbing something
mood_influence: -5 # Slightly creepy
discovery_chance: 20 # Good for finding secrets
wants: { be_read_in: 7, be_dusted: 4 }
buffs:
- id: poltergeist-activity
effect: { error_rate: +15, mood_influence: -20 }
simulate: "Occasionally knock books off shelves"
radiates: { to: occupants, effect: { unease: +2 }, while: present }
expires: { when: "the salt line is renewed" }
A room does not have to be animate — an ordinary room holds buffs and ticks
silently. Delegating to character is what buys wanting, acting, and narrating.
| Source | Example | |--------|---------| | Interactions | Petting cat → joy | | Consumables | Coffee → energy | | Locations | Pub → comfort | | Items | Lamp → grue immunity | | Personas | Theme-specific buffs |
Pre-made buffs ready to use! See buffs/INDEX.yml:
# Reference from any character
character:
buffs:
- ref: skills/buff/buffs/INDEX.yml#fire-resistance
- ref: skills/buff/buffs/INDEX.yml#haste
- ref: skills/buff/buffs/INDEX.yml#grue-repellent
Categories in library:
file_read — Read buff definitionsfile_write — Update buff state| Layer | Purpose | |-------|---------| | Buff | Game mechanics — stats, durations, stacking, chains | | Mount | Skill overlays — personality modification, room zones |
Buffs are for numeric/semantic effects (energy +2, "feeling lucky"). Mounts are for skill attachment (NO-AI-JOKING™ on Pee-wee).
They can work together: a mounted skill might grant buffs, or a buff might reference a skill.
See: mount/ for skill mounting, NO-AI Brand for mounting philosophy.
See SKILL.md for complete specification. See buffs/INDEX.yml for the buff library.
npx skills add SimHacker/buff下载完整 Skill 目录,包含 SKILL.md 及所有相关文件