{
  "needs": [
    {
      "id": "housing",
      "tag": "preoccupied",
      "onMind": "I've been turning over where I live lately. Feels like it might be time for a change — I just don't know where to start looking around here.",
      "helpedLine": "That actually helps. Thank you — I feel a little less stuck.",
      "hint": "You're not sure how to help with that yet.",
      "resolve": {
        "type": "item",
        "itemId": "gather_magazine"
      },
      "offerLabel": "Offer them the Gather magazine",
      "emoji": "📰"
    },
    {
      "id": "pain",
      "tag": "moving carefully",
      "onMind": "Something's been bothering me physically — hard to ignore when you're walking around town. I keep hoping it'll settle on its own.",
      "helpedLine": "Wow… that eases up. I can breathe easier already.",
      "hint": "You listen, but you don't have a way to help yet.",
      "resolve": {
        "type": "skill",
        "skillId": "acupuncture"
      },
      "offerLabel": "Offer acupuncture"
    },
    {
      "id": "share_idea",
      "tag": "restless",
      "onMind": "I've got this idea I can't stop chewing on. I want the right people to see it — not just shout into the void.",
      "helpedLine": "That's exactly the kind of door I needed. Thank you.",
      "hint": "You don't have a good suggestion for that yet.",
      "resolve": {
        "type": "flag",
        "flagId": "listed_on_buildcities"
      },
      "offerLabel": "Point them to BuildCities",
      "emoji": "🏙️"
    },
    {
      "id": "tired",
      "tag": "a bit worn",
      "onMind": "I'm running on fumes today. Could use something warm — the kind of thing that wakes you back up.",
      "helpedLine": "That's better. I feel human again.",
      "hint": "You don't have anything on you that would help right now.",
      "resolve": {
        "type": "item",
        "itemId": "coffee"
      },
      "offerLabel": "Offer them coffee",
      "emoji": "☕"
    },
    {
      "id": "creative_outlet",
      "tag": "a bit empty",
      "onMind": "Lately I feel like I don't have many outlets for creative expression. Days blur together — I miss making something with my hands.",
      "helpedLine": "That opened something up. I already want to try making a little thing tonight — thank you.",
      "hint": "You listen, but you don't know how to help them create yet.",
      "resolve": {
        "type": "skill",
        "skillId": "creative_arts"
      },
      "offerLabel": "Share arts & crafts"
    },
    {
      "id": "new_music",
      "tag": "bored of the playlist",
      "onMind": "Everything on my headphones sounds the same lately. I'm craving something heavier — a new kind of music that actually wakes me up.",
      "helpedLine": "Okay… that hit different. I'm putting that on repeat — thank you.",
      "hint": "You listen, but you don't have a good recommendation yet.",
      "resolve": {
        "type": "skill",
        "skillId": "heavy_metal"
      },
      "offerLabel": "Share some heavy metal"
    },
    {
      "id": "social",
      "tag": "wanting a night out",
      "onMind": "I've been cooped up. I want to go to a party — be around people, laugh a little, not just scroll alone tonight.",
      "helpedLine": "Wait, Sean's throwing one? I'm in. That fixed the lonely itch — thank you.",
      "hint": "You listen, but you don't know a good party to send them to yet.",
      "resolve": {
        "type": "skill",
        "skillId": "party_invite"
      },
      "offerLabel": "Invite them to Sean's party"
    },
    {
      "id": "concert_buddy",
      "tag": "looking for a plus-one",
      "onMind": "There is a concert I really want to go to, but going alone feels weird. I wish I had one solid person to go with.",
      "helpedLine": "Wait — you found someone? That is exactly what I needed. Concert energy unlocked.",
      "hint": "You listen, but you do not know how to help them find a concert buddy yet.",
      "resolve": {
        "type": "skill",
        "skillId": "concert_buddy"
      },
      "offerLabel": "Help them find a concert buddy"
    },
    {
      "id": "climbing",
      "tag": "craving a climb",
      "onMind": "I keep thinking about getting on a wall. Looking for people who actually want to climb — belay, beta, the whole thing.",
      "helpedLine": "Yes — that is the climbing crew energy I needed. See you on the wall.",
      "hint": "You listen, but you do not know climbing people yet.",
      "resolve": {
        "type": "skill",
        "skillId": "climbing"
      },
      "offerLabel": "Connect them with climbing"
    },
    {
      "id": "business_chat",
      "tag": "thinking about business",
      "onMind": "I have been chewing on business ideas — margins, customers, how to actually ship. I want to talk with someone who gets that.",
      "helpedLine": "That conversation helped. I feel sharper about the next step.",
      "hint": "You listen, but you are not sure how to help with the business side yet.",
      "resolve": {
        "type": "skill",
        "skillId": "business_marketing"
      },
      "offerLabel": "Talk business with them"
    },
    {
      "id": "watercolor",
      "tag": "wanting to paint",
      "onMind": "I have been craving watercolor — soft washes, paper, a little event vibe. Looking for people into that.",
      "helpedLine": "That opened the watercolor itch. Thank you.",
      "hint": "You listen, but you do not know watercolor yet.",
      "resolve": {
        "type": "skill",
        "skillId": "creative_arts"
      },
      "offerLabel": "Share watercolor with them"
    },
    {
      "id": "video_games",
      "tag": "thinking about games",
      "onMind": "I keep wanting to make a video game — or at least hang with people who do. Prototypes, pixels, late-night builds.",
      "helpedLine": "Okay — that is the game-making spark I needed. Thank you.",
      "hint": "You listen, but you do not know game-making people yet.",
      "resolve": {
        "type": "skill",
        "skillId": "game_development"
      },
      "offerLabel": "Talk game-making with them"
    },
    {
      "id": "lego",
      "tag": "wanting to build",
      "onMind": "I miss building things with LEGO — bricks, sets, free builds. Looking for people who still get that joy.",
      "helpedLine": "Brick energy restored. Thanks for connecting me.",
      "hint": "You listen, but you do not know LEGO people yet.",
      "resolve": {
        "type": "skill",
        "skillId": "lego_building"
      },
      "offerLabel": "Share LEGO building with them"
    },
    {
      "id": "failfest",
      "tag": "curious about FailFest",
      "onMind": "I keep hearing about FailFest — celebrating the tries that did not work. I want to find people into that.",
      "helpedLine": "FailFest crew found. Failure never felt so useful.",
      "hint": "You listen, but you do not know FailFest yet.",
      "resolve": {
        "type": "skill",
        "skillId": "failfest"
      },
      "offerLabel": "Talk FailFest with them"
    }
  ],
  "items": {
    "gather_magazine": {
      "name": "Gather magazine",
      "blurb": "Local housing and community listings. Give it when someone needs a place to live."
    },
    "coffee": {
      "name": "Roasted coffee",
      "use": "self_stamina",
      "staminaRestore": 0.45,
      "blurb": "Roasted brand — Michael’s downtown roast. Small hunger relief plus a stamina kick, or gift it when someone looks worn out.",
      "price": 3
    },
    "peptide_stamina": {
      "name": "Stamina peptide",
      "use": "stamina_max",
      "blurb": "Temporary max-stamina bump for about 10 minutes. Playful buff — not medical advice."
    },
    "peptide_semax": {
      "name": "Semax",
      "use": "quest_cap",
      "blurb": "Temporarily raises how many quest slots you can hold. Playful buff — not medical advice."
    },
    "oh_baby_burrito": {
      "name": "Oh Baby burrito",
      "use": "self_hunger",
      "price": 11,
      "blurb": "Tex-Mex BBQ burrito from the Oh Baby truck in the alley west of Art Spirit. Real meal — cuts hunger hard."
    },
    "las_brasas_burrito": {
      "name": "Las Brasas burrito",
      "use": "self_hunger",
      "price": 11,
      "blurb": "Las Brasas burrito from CDA Coffee Co. Real meal when the roast alone won't cut it."
    },
    "local_pastries": {
      "name": "Local pastries",
      "use": "self_hunger",
      "price": 4,
      "blurb": "Fresh local pastries from CDA Coffee Co — a sweet snack that eases hunger a bit."
    },
    "bbq_chicken": {
      "name": "BBQ chicken",
      "use": "self_hunger",
      "price": 13,
      "blurb": "Hawaiian BBQ chicken from Hula Pot on 4th. Solid hunger relief."
    },
    "hawaiian_breakfast_plate": {
      "name": "Hawaiian breakfast plate",
      "use": "self_hunger",
      "price": 14,
      "blurb": "Hawaiian breakfast plate from Hula Pot — morning fuel that carries you downtown."
    },
    "chocolate_milkshake": {
      "name": "Chocolate milkshake",
      "use": "self_hunger",
      "price": 5,
      "blurb": "Thick chocolate milkshake from Burger Dock — cool treat, light hunger relief."
    },
    "old_tin_can": {
      "name": "Old Tin Can",
      "use": "self_hunger",
      "price": 12,
      "blurb": "The Old Tin Can burger from Burger Dock on Lakeside at 4th. Real meal — cuts hunger hard."
    },
    "bike": {
      "name": "Bicycle",
      "use": "world_bike",
      "price": 45,
      "blurb": "Craig’s city bike. Cruise at run speed with no stamina cost; Shift to pedal hard (burns stamina fast). Parks wherever you hop off — remember the spot."
    }
  },
  "skills": {
    "acupuncture": {
      "name": "Acupuncture",
      "hint": "Helps when someone is aching or in pain — after they share what is on their mind.",
      "challengeId": "challenge_pain",
      "essential": true,
      "emoji": "🪡"
    },
    "coffee": {
      "name": "Coffee roasting",
      "hint": "You know your way around a roast. Coffee gifts hit different when someone is tired.",
      "challengeId": "challenge_tired",
      "essential": true,
      "emoji": "☕"
    },
    "business_marketing": {
      "name": "Business & marketing",
      "emoji": "💼",
      "hint": "Helps with clear offers, customer stories, pitches, and practical business conversations.",
      "challengeId": "challenge_business_chat"
    },
    "creative_arts": {
      "name": "Creative arts",
      "emoji": "🎨",
      "hint": "Helps people find a creative outlet through crafts, painting, and watercolor.",
      "challengeId": "challenge_creative",
      "essential": true,
      "essentialTeacherId": "diana"
    },
    "dogwalking": {
      "name": "Dog walking",
      "hint": "Keep Scarlett (skinny poodle) on a leash and walk the gold Den-block path — the trail fills as she goes. Full loop pays + mastery; Glyn notices.",
      "challengeId": "challenge_dogwalk",
      "emoji": "🐕"
    },
    "heavy_metal": {
      "name": "Heavy metal taste",
      "hint": "Helps when someone is craving a new kind of music — after they share what is on their mind.",
      "challengeId": "challenge_music",
      "essential": true,
      "emoji": "🤘"
    },
    "party_invite": {
      "name": "Party invites",
      "hint": "Helps when someone wants to go to a party or be more social — invite them to Sean’s.",
      "challengeId": "challenge_party",
      "emoji": "🎉"
    },
    "concert_buddy": {
      "name": "Concert buddy",
      "hint": "Helps when someone needs one person to go to a concert with.",
      "challengeId": "challenge_concert",
      "emoji": "🎵"
    },
    "climbing": {
      "name": "Climbing",
      "hint": "Helps when someone wants to climb or find climbing people.",
      "challengeId": "challenge_climbing",
      "essential": true,
      "emoji": "🧗"
    },
    "game_development": {
      "name": "Game development",
      "emoji": "🎮",
      "hint": "Combines game design and coding to help people turn game ideas into playable builds.",
      "challengeId": "challenge_game_design"
    },
    "lego_building": {
      "name": "LEGO building",
      "hint": "Helps when someone wants to build with LEGO.",
      "challengeId": "challenge_lego",
      "essential": true,
      "emoji": "🧱"
    },
    "ecommerce": {
      "name": "Ecommerce",
      "hint": "Business contact + shop online sales. Master by founding any shop — does not clear sidewalk business needs (that's Pat).",
      "challengeId": "challenge_ecommerce",
      "emoji": "🛒"
    },
    "failfest": {
      "name": "FailFest",
      "hint": "Helps when someone is curious about FailFest. Dan K can cash in your secret failed-help tries for positivity.",
      "challengeId": "challenge_failfest",
      "emoji": "🎭"
    }
  },
  "peptides": {
    "peptide_stamina": {
      "durationSec": 600,
      "staminaMaxBonus": 0.5,
      "price": 15
    },
    "peptide_semax": {
      "durationSec": 600,
      "questCapBonus": 2,
      "price": 20
    }
  },
  "economy": {
    "startingMoney": 50,
    "helpPoints": 10,
    "helpMoney": 0,
    "helpPositivity": 12,
    "coffeeHelpPositivityMult": 2.5,
    "hungerPerDollar": 4,
    "pitchPoints": 15,
    "pitchMoney": 25,
    "pitchPositivity": 5,
    "teachTalkCooldownSec": 60,
    "baseQuestCap": 3,
    "positivityDecayPerSec": 0.15,
    "hungerRisePerSec": 0.12,
    "hungerRiseLowStaminaPerSec": 0.18,
    "staminaLowHungerThreshold": 0.28,
    "startingHunger": 20,
    "stressRisePerQuestPerSec": 0.06,
    "startingStress": 0,
    "challengePoints": 15,
    "challengePositivity": 8,
    "challengeMoney": 0,
    "dogwalkLapMoney": 12,
    "dogwalkLapPositivity": 4,
    "businessSaleMoney": 20,
    "businessPartnerSaleMult": 0.5,
    "businessPartnerIncomePerSec": 0.04,
    "artMaxDrawings": 8,
    "artCommissionMin": 8,
    "artCommissionMax": 28,
    "artCommissionChancePerSec": 0.012,
    "mollyConcertPositivity": 50,
    "mollyConcertDecayPauseSec": 1800,
    "businessThirdContactIncomeMult": 2,
    "businessEcommerceIncomePerSec": 0.04,
    "emilyInvitePerSec": 0.0135,
    "emilyArtCommissionMult": 2,
    "failfestPositivityPerFailure": 5
  },
  "businesses": {
    "acupuncture": {
      "name": "Lakeside acupuncture studio",
      "needId": "pain",
      "saleLabel": "Sell an acupuncture session",
      "blurb": "Earn cash by treating people who are aching — kindness help becomes a paid session."
    },
    "coffee": {
      "name": "Small-batch roast cart",
      "needId": "tired",
      "saleLabel": "Sell them a cup",
      "blurb": "Earn cash when you sell coffee to someone running on fumes."
    },
    "creative_arts": {
      "name": "Creative arts pop-up",
      "needIds": [
        "creative_outlet",
        "watercolor"
      ],
      "saleLabel": "Sell a creative arts session",
      "blurb": "Earn cash by helping people make, paint, and find a creative outlet."
    },
    "dogwalking": {
      "name": "Neighborhood dog walks",
      "needId": null,
      "blurb": "Partner with Glyn for a tip trickle — street sales for dog walks aren't wired yet."
    },
    "heavy_metal": {
      "name": "Metal tip jar sessions",
      "needId": "new_music",
      "saleLabel": "Sell them a heavier playlist",
      "blurb": "Earn cash by putting people onto metal when their headphones feel stale."
    },
    "party_invite": {
      "name": "Sean's party crew",
      "needId": "social",
      "saleLabel": "Sell them a party invite",
      "blurb": "Earn cash by getting social folks onto Sean’s guest list."
    },
    "concert_buddy": {
      "name": "Concert buddy matching",
      "needId": "concert_buddy",
      "saleLabel": "Sell them a concert-buddy match",
      "blurb": "Earn cash by pairing people with a concert plus-one."
    },
    "climbing": {
      "name": "Climbing crew connect",
      "needId": "climbing",
      "saleLabel": "Sell them a climbing intro",
      "blurb": "Earn cash by connecting people who want to climb."
    },
    "business_marketing": {
      "name": "Business & marketing studio",
      "needId": "business_chat",
      "saleLabel": "Sell a business strategy session",
      "blurb": "Earn cash by helping people sharpen their offer, story, and next business step."
    },
    "game_development": {
      "name": "Indie game development studio",
      "needId": "video_games",
      "saleLabel": "Sell a game development jam seat",
      "blurb": "Earn cash by helping people design and build playable game ideas."
    },
    "lego_building": {
      "name": "LEGO build nights",
      "needId": "lego",
      "saleLabel": "Sell a LEGO build night",
      "blurb": "Earn cash by connecting people who want to build with bricks."
    },
    "ecommerce": {
      "name": "Ecommerce setup desk",
      "saleLabel": "Run your online shop desk",
      "blurb": "Found for online sales / passive income — not a sidewalk need solver."
    },
    "failfest": {
      "name": "FailFest storytelling",
      "needId": "failfest",
      "saleLabel": "Sell a FailFest story slot",
      "blurb": "Earn cash by connecting people curious about FailFest."
    }
  },
  "characterQualities": {
    "dan": {
      "summary": "A playful biohacker merchant who sells temporary stamina and quest-cap buffs.",
      "qualities": [
        "Experimental",
        "Upbeat",
        "Resourceful"
      ]
    },
    "roman": {
      "summary": "A clear-spoken marketing teacher and one of the downtown business contacts.",
      "qualities": [
        "Strategic",
        "Direct",
        "Persuasive"
      ]
    },
    "michael": {
      "summary": "A patient coffee roaster who teaches the craft and keeps Roasted coffee available.",
      "qualities": [
        "Patient",
        "Craft-focused",
        "Generous"
      ]
    },
    "mark": {
      "summary": "A community-minded local who shares Gather magazine for housing connections.",
      "qualities": [
        "Connected",
        "Observant",
        "Helpful"
      ]
    },
    "conner": {
      "summary": "A careful listener who teaches acupuncture through repeated conversations.",
      "qualities": [
        "Attentive",
        "Precise",
        "Calm"
      ]
    },
    "nick": {
      "summary": "A project connector who helps people list ideas on BuildCities and counts as a business contact.",
      "qualities": [
        "Collaborative",
        "Practical",
        "Vision-oriented"
      ]
    },
    "diana": {
      "summary": "A creativity teacher who encourages imperfect making and unlocks arts-and-crafts practice.",
      "qualities": [
        "Creative",
        "Encouraging",
        "Hands-on"
      ]
    },
    "glyn": {
      "summary": "Scarlett's steady person, teaching calm dog walking and sponsoring her route challenge.",
      "qualities": [
        "Steady",
        "Caring",
        "Responsible"
      ]
    },
    "sean": {
      "summary": "A social organizer who teaches thoughtful invitations and needs help filling his guest list.",
      "qualities": [
        "Welcoming",
        "Social",
        "Energetic"
      ]
    },
    "craig": {
      "summary": "A practical bike merchant who gets the player moving around downtown faster.",
      "qualities": [
        "Practical",
        "Independent",
        "Outdoorsy"
      ]
    },
    "raven": {
      "summary": "A heavy-metal guide who helps stale playlists find more energy.",
      "qualities": [
        "Bold",
        "Expressive",
        "Discerning"
      ]
    },
    "molly": {
      "summary": "A concert fan searching for exactly one good plus-one, with a major positivity reward for success.",
      "qualities": [
        "Enthusiastic",
        "Intentional",
        "Music-loving"
      ]
    },
    "anna": {
      "summary": "A climbing connector looking for people who want walls, belays, and shared trust.",
      "qualities": [
        "Adventurous",
        "Supportive",
        "Community-minded"
      ]
    },
    "pat": {
      "summary": "A business-savvy teacher whose clear framing can help unlock and optimize a downtown shop.",
      "qualities": [
        "Analytical",
        "Focused",
        "Entrepreneurial"
      ]
    },
    "emily": {
      "summary": "A watercolor artist and Den event host who passively helps Sean invite guests.",
      "qualities": [
        "Artistic",
        "Patient",
        "Community-building"
      ]
    },
    "scott": {
      "summary": "A game designer focused on player feeling, useful verbs, and the Guild.",
      "qualities": [
        "Imaginative",
        "Systems-minded",
        "Collaborative"
      ]
    },
    "jeff_s": {
      "summary": "A game coder who values small shippable builds and co-leads the Guild with Scott.",
      "qualities": [
        "Technical",
        "Iterative",
        "Builder-minded"
      ]
    },
    "jeff_r": {
      "summary": "A LEGO enthusiast who treats brick building as serious, social play.",
      "qualities": [
        "Playful",
        "Constructive",
        "Curious"
      ]
    },
    "dan_d": {
      "summary": "An ecommerce optimizer and business contact who can put solo or partnered shops online.",
      "qualities": [
        "Efficient",
        "Commercial",
        "Optimization-minded"
      ]
    },
    "dan_k": {
      "summary": "A FailFest champion who turns honest failed help attempts into positivity.",
      "qualities": [
        "Resilient",
        "Reflective",
        "Celebratory"
      ]
    }
  },
  "npcs": [
    {
      "id": "dan",
      "name": "Dan",
      "role": "merchant",
      "shirt": "#5a7d4a",
      "pants": "#2a3228",
      "hair": "#3a3028",
      "greeting": "Hey — I've got a couple peptides if you want a temporary edge. Playful stuff, not medical advice.",
      "shop": [
        "peptide_stamina",
        "peptide_semax"
      ],
      "skin": "#c68642",
      "iris": "#4a6a4a"
    },
    {
      "id": "roman",
      "name": "Roman",
      "role": "teacher",
      "shirt": "#8b4513",
      "pants": "#1f2430",
      "hair": "#1a1410",
      "greeting": "Marketing is just clear stories for the right people.",
      "teach": {
        "skillId": "business_marketing",
        "talksRequired": 1,
        "progressLines": [
          "Here's the advice: name the problem, name the person it hurts, then name your offer. That's marketing."
        ],
        "unlockLine": "You learned business and marketing. Use it to shape clear offers, help people talk shop, and prepare your big idea."
      },
      "skin": "#b8733a",
      "iris": "#3a4a6a"
    },
    {
      "id": "michael",
      "name": "Michael",
      "role": "teacher",
      "shirt": "#6b3a2a",
      "pants": "#3a2a22",
      "hair": "#4a3020",
      "greeting": "Smell that? Fresh Roasted brand — my beans, my roast. Cups for sale if you want one.",
      "teach": {
        "skillId": "coffee",
        "talksRequired": 1,
        "giveItem": "coffee",
        "giveCount": 2,
        "progressLines": [
          "Roasting is patience — listen for the first crack, then pull before you burn the sweetness. Take some Roasted coffee with you."
        ],
        "unlockLine": "You're a coffee person now. Share a cup when it feels right."
      },
      "skin": "#a0673a",
      "iris": "#5a4a2a",
      "shop": [
        "coffee"
      ]
    },
    {
      "id": "mark",
      "name": "Mark",
      "role": "giver",
      "shirt": "#2f5f7a",
      "pants": "#243040",
      "hair": "#c8b090",
      "greeting": "I always carry an extra Gather. Local stories, community, that sort of thing.",
      "give": {
        "itemId": "gather_magazine",
        "once": true,
        "line": "Here — take a copy of Gather. Pass it along if it seems useful to someone."
      },
      "skin": "#d4a574",
      "iris": "#4a6a8a"
    },
    {
      "id": "conner",
      "name": "Conner",
      "role": "teacher",
      "shirt": "#3d5a4c",
      "pants": "#2a2a28",
      "hair": "#2a2018",
      "greeting": "Chinese medicine starts with listening — where does it hurt, and what else is going on?",
      "teach": {
        "skillId": "acupuncture",
        "talksRequired": 5,
        "progressLines": [
          "Talk one: Qi and blood — when flow stalls, pain shows up.",
          "Talk two: Distal points can quiet a loud channel.",
          "Talk three: Sciatica often needs the back and the leg treated as one story.",
          "Talk four: Less force, more precision — the needle is a conversation.",
          "Talk five: You've listened enough — you can offer acupuncture when someone's hurting."
        ],
        "unlockLine": "You learned acupuncture. Use it gently when you see someone hurting."
      },
      "skin": "#c68642",
      "iris": "#3a5a3a"
    },
    {
      "id": "nick",
      "name": "Nick",
      "role": "buildcities",
      "shirt": "#4a6fa5",
      "pants": "#2a3040",
      "hair": "#1c1814",
      "greeting": "Got a project? Put it on BuildCities — that's how ideas find builders.",
      "buildcities": {
        "url": "https://buildcities.com",
        "prompt": "Open BuildCities and list a project, then come back and tell me you did.",
        "confirmLine": "Nice — you're on BuildCities. Now you can point others there too."
      },
      "skin": "#8d5524",
      "iris": "#2a3a2a"
    },
    {
      "id": "oh_baby",
      "name": "Oh Baby",
      "role": "merchant",
      "storefront": true,
      "greeting": "Oh Baby! Tex-Mex BBQ out of the truck — burritos when you need a real meal.",
      "shop": [
        "oh_baby_burrito"
      ]
    },
    {
      "id": "hula_cook",
      "name": "Hula Pot",
      "role": "merchant",
      "storefront": true,
      "greeting": "Aloha — Hula Pot Hawaiian BBQ. BBQ chicken or a Hawaiian breakfast plate if you are running on empty.",
      "shop": [
        "bbq_chicken",
        "hawaiian_breakfast_plate"
      ]
    },
    {
      "id": "burger_dock",
      "name": "Burger Dock",
      "role": "merchant",
      "storefront": true,
      "greeting": "Welcome to Burger Dock — Old Tin Can burger or a chocolate milkshake if you need a real meal.",
      "shop": [
        "chocolate_milkshake",
        "old_tin_can"
      ]
    },
    {
      "id": "cda_coffee",
      "name": "CDA Coffee Co",
      "role": "merchant",
      "storefront": true,
      "greeting": "Welcome to CDA Coffee Co — drip cups, Las Brasas burritos, and local pastries.",
      "shop": [
        "coffee",
        "las_brasas_burrito",
        "local_pastries"
      ]
    },
    {
      "id": "diana",
      "name": "Diana",
      "role": "teacher",
      "body": "female",
      "hairStyle": "medium",
      "heightScale": 0.92,
      "shirt": "#a86b4a",
      "pants": "#3a4555",
      "hair": "#5c4033",
      "skin": "#c9a07a",
      "iris": "#4a3020",
      "greeting": "Hey — creativity is a habit, not a talent. Want to learn some arts and crafts?",
      "teach": {
        "skillId": "creative_arts",
        "talksRequired": 2,
        "progressLines": [
          "Start small: paper, scrap fabric, a pencil — anything you can finish in an evening. Permission to make imperfect things is half the craft.",
          "Now you have it — when someone feels creatively stuck, invite them to make something with their hands."
        ],
        "unlockLine": "You learned creative arts. Share crafts or painting when someone needs a creative outlet."
      }
    },
    {
      "id": "glyn",
      "name": "Glyn",
      "role": "teacher",
      "shirt": "#6a5a4a",
      "pants": "#2e342e",
      "hair": "#c4b090",
      "skin": "#c9a07a",
      "iris": "#4a5a3a",
      "greeting": "Hey — Scarlett needs a steady walker. Want to learn dog walking the right way?",
      "teach": {
        "skillId": "dogwalking",
        "talksRequired": 1,
        "progressLines": [
          "Short leash, calm pace, stay on the sidewalk — Scarlett follows your lead when you stay steady."
        ],
        "unlockLine": "You've got the feel for it. Chat with me again when you're ready to walk Scarlett around the block."
      },
      "stationary": true,
      "spawn": {
        "x": 68.2,
        "z": 3.8,
        "yaw": 3.141592653589793
      }
    },
    {
      "id": "sean",
      "name": "Sean",
      "role": "teacher",
      "shirt": "#c45a2a",
      "pants": "#2a2430",
      "hair": "#3a2818",
      "skin": "#c68642",
      "iris": "#4a6a8a",
      "greeting": "Yo — I'm throwing a party. Want to learn how to invite people the right way?",
      "teach": {
        "skillId": "party_invite",
        "talksRequired": 2,
        "progressLines": [
          "A good invite is personal — name the vibe, not just the address. People say yes when it feels like they belong there.",
          "You've got it. When someone’s craving a night out, send them to my party — that fixes the social itch."
        ],
        "unlockLine": "You learned party invites. Bring people to my party when they’re wanting to be social."
      },
      "spawn": {
        "x": 38.6,
        "z": 4,
        "yaw": 3.141592653589793
      }
    },
    {
      "id": "craig",
      "name": "Craig",
      "role": "merchant",
      "shirt": "#3a6a8a",
      "pants": "#2a3038",
      "hair": "#4a3a28",
      "skin": "#c68642",
      "iris": "#3a5a6a",
      "greeting": "Hey — I've got a solid city bike if you want to cover downtown without burning your legs out. Cash only, no lessons… for now.",
      "shop": [
        "bike"
      ],
      "spawn": {
        "x": 12.4,
        "z": 4.2,
        "yaw": 1.5707963267948966
      }
    },
    {
      "id": "raven",
      "name": "Raven",
      "role": "teacher",
      "body": "female",
      "hairStyle": "medium",
      "heightScale": 0.94,
      "shirt": "#1a1a1e",
      "pants": "#2a2430",
      "hair": "#121018",
      "skin": "#b08060",
      "iris": "#5a6a8a",
      "greeting": "Hey — if your playlist's gone soft, I can fix that. Want to learn how to actually hear heavy metal?",
      "teach": {
        "skillId": "heavy_metal",
        "talksRequired": 2,
        "progressLines": [
          "Start with riffs that move — not just noise. Dynamics, groove, then the wall of sound. Taste is knowing when to turn it up.",
          "Now you've got ears for it. When someone's bored of the same three songs, put something heavier in their hands."
        ],
        "unlockLine": "You learned heavy metal taste. Share it when someone is craving a new kind of music."
      },
      "spawn": {
        "x": 48.5,
        "z": 4.1,
        "yaw": 3.141592653589793
      }
    },
    {
      "id": "molly",
      "name": "Molly",
      "role": "teacher",
      "body": "female",
      "hairStyle": "medium",
      "heightScale": 0.93,
      "shirt": "#c45a7a",
      "pants": "#2a2430",
      "hair": "#3a2818",
      "skin": "#c9a07a",
      "iris": "#5a3a4a",
      "greeting": "Hey — there is a concert I refuse to miss. Want to learn how to find the right plus-one?",
      "teach": {
        "skillId": "concert_buddy",
        "talksRequired": 2,
        "progressLines": [
          "A good concert buddy is not just free that night — they want the music. Ask around with intention.",
          "You have got it. When someone needs a plus-one, help them find one real person — not a crowd."
        ],
        "unlockLine": "You learned concert buddy. Help people find one person to go with — starting with me, when you Accept my challenge."
      }
    },
    {
      "id": "anna",
      "name": "Anna",
      "role": "teacher",
      "body": "female",
      "hairStyle": "medium",
      "heightScale": 0.95,
      "shirt": "#3a8a6a",
      "pants": "#2a3030",
      "hair": "#2a2018",
      "skin": "#b08060",
      "iris": "#3a6a5a",
      "greeting": "Hey — I am always hunting for climbing people. Want to learn the climbing-connect habit?",
      "teach": {
        "skillId": "climbing",
        "talksRequired": 2,
        "progressLines": [
          "Climbing is trust plus curiosity. Listen for who wants the wall, then make the intro.",
          "Now you can spot climbers. When someone is craving a climb, connect them."
        ],
        "unlockLine": "You learned climbing. Connect people who want to get on the wall."
      }
    },
    {
      "id": "pat",
      "name": "Pat",
      "role": "teacher",
      "shirt": "#4a5a8a",
      "pants": "#1f2430",
      "hair": "#c4b090",
      "skin": "#c68642",
      "iris": "#3a4a6a",
      "greeting": "Business is just clear offers and follow-through. Want to get sharper at talking shop?",
      "teach": {
        "skillId": "business_marketing",
        "talksRequired": 2,
        "progressLines": [
          "Name the customer, the pain, and the next action. That is a business conversation.",
          "You have got the frame. When someone is chewing on business, talk it through with them."
        ],
        "unlockLine": "You learned another business and marketing perspective. You count Pat as a downtown business contact."
      }
    },
    {
      "id": "emily",
      "name": "Emily",
      "role": "teacher",
      "body": "female",
      "hairStyle": "medium",
      "heightScale": 0.92,
      "shirt": "#8a6aaa",
      "pants": "#3a3040",
      "hair": "#5c4033",
      "skin": "#d4a574",
      "iris": "#4a5a6a",
      "greeting": "Hey — I do watercolor and host soft events at the Den. Want to learn the wash?",
      "teach": {
        "skillId": "creative_arts",
        "talksRequired": 2,
        "progressLines": [
          "Watercolor rewards patience — wet into wet, then leave space for light.",
          "You have got it. Share watercolor when someone wants to paint — and I can quietly help Sean fill a guest list while you are out walking."
        ],
        "unlockLine": "You learned Emily's creative arts perspective. While Sean's party challenge is active, she can help invite people in the background."
      }
    },
    {
      "id": "scott",
      "name": "Scott",
      "role": "teacher",
      "shirt": "#2a6a8a",
      "pants": "#1a2430",
      "hair": "#1c1814",
      "skin": "#a0673a",
      "iris": "#4a6a8a",
      "greeting": "Want to make games? Design first — loops, players, why it is fun.",
      "teach": {
        "skillId": "game_development",
        "talksRequired": 2,
        "progressLines": [
          "A game is a toy with a goal. Start with the feeling, then the verbs.",
          "You can talk design now. Find people who want to make games and spark that chat."
        ],
        "unlockLine": "You learned game development. Master it to join the Guild with Scott and Jeff S."
      }
    },
    {
      "id": "jeff_s",
      "name": "Jeff S",
      "role": "teacher",
      "shirt": "#3a7a5a",
      "pants": "#2a3028",
      "hair": "#3a3028",
      "skin": "#c68642",
      "iris": "#3a5a4a",
      "greeting": "Games need code that actually runs. Want to learn the builder side?",
      "teach": {
        "skillId": "game_development",
        "talksRequired": 2,
        "progressLines": [
          "Ship small — a loop, a bug fix, a build you can show someone downtown.",
          "You have got the coding chat. Help people who want to make games."
        ],
        "unlockLine": "You learned another game development perspective. Master the skill to join the Guild."
      }
    },
    {
      "id": "jeff_r",
      "name": "Jeff R",
      "role": "teacher",
      "shirt": "#c45a2a",
      "pants": "#2a2430",
      "hair": "#4a3a28",
      "skin": "#b8733a",
      "iris": "#5a4a2a",
      "greeting": "LEGO is serious play. Want to learn how to find people who still build?",
      "teach": {
        "skillId": "lego_building",
        "talksRequired": 2,
        "progressLines": [
          "Free builds beat instructions sometimes — listen for who misses the click of bricks.",
          "You can spot builders now. Connect people who want LEGO time."
        ],
        "unlockLine": "You learned LEGO building. Share it when someone wants to build."
      }
    },
    {
      "id": "dan_d",
      "name": "Dan D",
      "role": "teacher",
      "shirt": "#5a6a9a",
      "pants": "#2a3040",
      "hair": "#2a2018",
      "skin": "#8d5524",
      "iris": "#3a4a6a",
      "greeting": "Got a shop? Get it online. Want to learn ecommerce so it sells while you walk?",
      "teach": {
        "skillId": "ecommerce",
        "talksRequired": 2,
        "progressLines": [
          "Online sales are just clear offers with a checkout — listings, photos, ship or pickup.",
          "You have got ecommerce. Accept the challenge, then found any shop — that masters online sales. Sidewalk business chats still need Pat."
        ],
        "unlockLine": "You learned ecommerce. You count as a business contact. Accept “Get a shop online”, then found any business to master solo online sales — this skill does not clear sidewalk business needs."
      }
    },
    {
      "id": "dan_k",
      "name": "Dan K",
      "role": "teacher",
      "shirt": "#8a5a3a",
      "pants": "#2a2820",
      "hair": "#1a1410",
      "skin": "#c68642",
      "iris": "#5a4a3a",
      "greeting": "FailFest is about useful failures. Want to learn how to celebrate the tries that did not work?",
      "teach": {
        "skillId": "failfest",
        "talksRequired": 2,
        "progressLines": [
          "Every honest miss is data. FailFest is the room where that gets clapped for.",
          "You can talk FailFest now. And if you keep trying to help people without the right skill — I can cash those secret misses in for positivity."
        ],
        "unlockLine": "You learned FailFest. Talk to me anytime to cash in failed help attempts for positivity."
      }
    }
  ],
  "challenges": {
    "challenge_pain": {
      "label": "Ease someone's pain",
      "detail": "Notice someone moving carefully downtown, ask what they need, then offer acupuncture.",
      "needId": "pain",
      "requires": {
        "type": "skill",
        "skillId": "acupuncture"
      }
    },
    "challenge_creative": {
      "label": "Spark a creative outlet",
      "detail": "Find someone who needs a creative outlet and share creative arts.",
      "needId": "creative_outlet",
      "requires": {
        "type": "skill",
        "skillId": "creative_arts"
      }
    },
    "challenge_tired": {
      "label": "Share a warm cup",
      "detail": "Keep coffee in your bag and offer it when someone looks worn out.",
      "needId": "tired",
      "requires": {
        "type": "skill",
        "skillId": "coffee"
      }
    },
    "challenge_housing": {
      "label": "Help someone find a place",
      "detail": "Pass along a Gather magazine when someone is preoccupied about housing.",
      "needId": "housing",
      "requires": {
        "type": "item",
        "itemId": "gather_magazine"
      }
    },
    "challenge_idea": {
      "label": "Open a door for an idea",
      "detail": "Point someone with a restless big idea toward BuildCities.",
      "needId": "share_idea",
      "requires": {
        "type": "flag",
        "flagId": "listed_on_buildcities"
      }
    },
    "challenge_dogwalk": {
      "label": "Walk Scarlett",
      "detail": "Leash Scarlett and follow the gold path around The Den — the trail fills in as she walks it. A full loop pays cash and ticks mastery.",
      "mode": "dogwalk",
      "dogName": "Scarlett",
      "masteryTicks": 5,
      "pathRadius": 7,
      "requires": {
        "type": "skill",
        "skillId": "dogwalking"
      },
      "route": [
        {
          "x": 72.2,
          "z": 1.4
        },
        {
          "x": 72.2,
          "z": 35.8
        },
        {
          "x": 22.8,
          "z": 35.8
        },
        {
          "x": 22.8,
          "z": 1.4
        }
      ]
    },
    "challenge_music": {
      "label": "Wake up a playlist",
      "detail": "Find someone bored of their headphones and share some heavy metal taste.",
      "needId": "new_music",
      "requires": {
        "type": "skill",
        "skillId": "heavy_metal"
      }
    },
    "challenge_party": {
      "label": "Fill Sean's guest list",
      "detail": "Accept once, then invite several people who want a party / to be social — each invite ticks mastery and positivity.",
      "needId": "social",
      "masteryTicks": 5,
      "requires": {
        "type": "skill",
        "skillId": "party_invite"
      }
    },
    "challenge_concert": {
      "label": "Find Molly a concert buddy",
      "detail": "Accept once — Molly picks one random person downtown. Find that person, ask what they need, and help them become her concert plus-one.",
      "needId": "concert_buddy",
      "mode": "concert_target",
      "requires": {
        "type": "skill",
        "skillId": "concert_buddy"
      }
    },
    "challenge_climbing": {
      "label": "Find a climber",
      "detail": "Find someone craving a climb and connect them with climbing.",
      "needId": "climbing",
      "requires": {
        "type": "skill",
        "skillId": "climbing"
      }
    },
    "challenge_business_chat": {
      "label": "Talk shop with someone",
      "detail": "Find someone thinking about business and talk shop with them.",
      "needId": "business_chat",
      "requires": {
        "type": "skill",
        "skillId": "business_marketing"
      }
    },
    "challenge_game_design": {
      "label": "Spark a game development chat",
      "detail": "Find someone thinking about games and talk game development with them.",
      "needId": "video_games",
      "requires": {
        "type": "skill",
        "skillId": "game_development"
      }
    },
    "challenge_lego": {
      "label": "Share a LEGO build",
      "detail": "Find someone wanting to build and share LEGO building with them.",
      "needId": "lego",
      "requires": {
        "type": "skill",
        "skillId": "lego_building"
      }
    },
    "challenge_ecommerce": {
      "label": "Get a shop online",
      "detail": "Found any business (Bag → Businesses or with a teacher). Completing this masters ecommerce for solo online sales — it does not help sidewalk business chats.",
      "mode": "found_business",
      "requires": {
        "type": "skill",
        "skillId": "ecommerce"
      }
    },
    "challenge_failfest": {
      "label": "Share FailFest",
      "detail": "Find someone curious about FailFest and talk it through with them.",
      "needId": "failfest",
      "requires": {
        "type": "skill",
        "skillId": "failfest"
      }
    }
  }
}
