export type EventEffect = Partial<{
  andakt: number;
  hemlighet: number;
  kaos: number;
  dread: number;
  troende: number;
  ritual: number;
}>;

export interface EventChoice {
  text: string;
  effect: EventEffect;
  resultText: string;
  flag?: string;
}

export interface GameEvent {
  id: string;
  text: string;
  effect: EventEffect;
  weight: number;
  requires?: Partial<{
    minTroende: number;
    minDread: number;
    minRitual: number;
    unlockedArea: Area;
    flag: string;
    completedEventId: string;
  }>;
  choices?: EventChoice[];
}

export type Area = 'rosengard' | 'varnhem' | 'torso';

// ── Standard events ──────────────────────────────────────────────────────────

export const STANDARD_EVENTS: GameEvent[] = [
  // Early / low dread
  {
    id: 'dreams_lindqvist',
    text: 'Broder Lindqvist drömmer om havet varje natt. Han säger att fisken talar till honom. Vi lyssnar.',
    effect: { andakt: 5, kaos: 2 },
    weight: 10,
  },
  {
    id: 'systembolaget',
    text: 'En berusad man utanför Systembolaget på Davidshallsgatan erbjöd sig att "hälsa på gubben i havet." Vi är osäkra på om han menar Den Sovande eller sin morfar. Kanske båda.',
    effect: { kaos: 8, dread: 3 },
    weight: 8,
  },
  {
    id: 'skatteverket',
    text: 'Skatteverket har skickat ett brev. De undrar om vår religiösa verksamhet är momsbefriad. Syster Hassan svarar dem med ett 47 sidor långt svar. De hör inte av sig igen.',
    effect: { hemlighet: -5, andakt: 10 },
    weight: 7,
  },
  {
    id: 'ducks_torso',
    text: 'Det finns en anledning till att alla änder vid Ribersborg vänder sig mot Turning Torso i ett nästan tillbedjande tillstånd. De anar mer än oss.',
    effect: { dread: 8, kaos: 3 },
    weight: 9,
  },
  {
    id: 'ikea_table',
    text: 'Ett IKEA-bord av modell LACK har börjat blöda svart vätska. Vi har lagt en matta över det. Det hjälper inte men det ser snyggare ut.',
    effect: { dread: 6, kaos: 5 },
    weight: 8,
  },
  {
    id: 'discord_goran',
    text: 'En Malmöbo vid namn Göran har av misstag blivit med i vår Discord-server och tror att vi diskuterar ett brädspel om havet. Hans feedback är konstruktiv.',
    effect: { kaos: 12, hemlighet: -8 },
    weight: 6,
  },
  {
    id: 'neighbor_smell',
    text: 'Grannarna har klagat på lukten från källaren. Vi förklarar att det är kimchi. Det är inte kimchi.',
    effect: { hemlighet: -6, andakt: 4 },
    weight: 9,
  },
  {
    id: 'lighthouse_keeper',
    text: 'Fyrvaktaren vid Malmöhus har slutat dyka upp. Hans ersättare rapporterar att vattnet sjunger nu på nätterna. Hon har också slutat dyka upp.',
    effect: { dread: 10, kaos: 6 },
    weight: 7,
  },
  {
    id: 'oresund_hum',
    text: 'Øresundsbron vibrerar med en frekvens som inte finns i naturen. Danskarna på andra sidan ringer och klagar. Vi svarar inte.',
    effect: { dread: 12, hemlighet: -4 },
    weight: 7,
    requires: { minDread: 20 },
  },
  {
    id: 'turning_torso_spin',
    text: 'Turning Torso har börjat rotera igen. Det har inte gjort det på tre år. Arkitektkontoret säger att det är omöjligt. Arkitektkontoret ringer inte mer.',
    effect: { dread: 20, kaos: 10 },
    weight: 6,
    requires: { minDread: 30 },
  },
  {
    id: 'varnhem_pigeons',
    text: 'Duvorna på Värnhemstorget har upphört att äta. De sitter bara. De tittar. En av dem har för många ögon.',
    effect: { dread: 15, kaos: 8 },
    weight: 7,
    requires: { unlockedArea: 'varnhem' },
  },
  {
    id: 'varnhem_fountain',
    text: 'Fontänen på Värnhemstorget rinner baklänges sedan tisdag. Kommunen har satt upp ett staket. Folk tar selfies.',
    effect: { dread: 12, hemlighet: -10, kaos: 5 },
    weight: 6,
    requires: { unlockedArea: 'varnhem' },
  },
  {
    id: 'bus_driver',
    text: 'Bussföraren på linje 5 körde förbi Värnhemstorget tre gånger utan att stanna. Passagerarna märkte det inte. Bussföraren ser nöjd ut.',
    effect: { dread: 8, kaos: 6 },
    weight: 8,
    requires: { unlockedArea: 'varnhem' },
  },
  {
    id: 'investigator_sighting',
    text: 'En man i grå kostym har stått utanför lokalen i sex timmar. Han tar anteckningar. Broder Persson hälsade vänligt. Mannen vände sig om och gick. Hans skugga gick inte med.',
    effect: { hemlighet: -15, kaos: 10 },
    weight: 5,
    requires: { minDread: 40 },
  },
  {
    id: 'manuscript_dream',
    text: 'Skriften har börjat skriva sig själv på nätterna. De nya raderna är inte på något känt språk. De är inte på något okänt språk heller egentligen.',
    effect: { dread: 18, ritual: 3, kaos: 8 },
    weight: 5,
    requires: { minRitual: 10 },
  },
  {
    id: 'torso_shadow',
    text: 'Turning Torsos skugga pekar nu mot havet oavsett var solen står. En student från Malmö Universitet skriver en uppsats om detta. Hon sover inte längre.',
    effect: { dread: 22, kaos: 12 },
    weight: 5,
    requires: { unlockedArea: 'torso' },
  },
  {
    id: 'torso_windows',
    text: 'Fönstren i Turning Torso lyser nu i ett mönster. Mönstret är ett namn. Vi kan inte läsa det. Inte än.',
    effect: { dread: 30, ritual: 5, kaos: 15 },
    weight: 4,
    requires: { unlockedArea: 'torso', minRitual: 30 },
  },
  {
    id: 'sea_level',
    text: 'Vattennivån i Öresund har sjunkit 4 centimeter sedan måndag. SMHI rapporterar ett "tekniskt fel i mätinstrumenten." Det är inte ett tekniskt fel.',
    effect: { dread: 25, kaos: 10 },
    weight: 4,
    requires: { minDread: 60 },
  },
  {
    id: 'police_curious',
    text: 'Polisen i Malmö har börjat fråga om "den religiösa föreningen vid vattnet." Vi skickar dem en broschyr om mindfulness. De tackar och ber om en till.',
    effect: { hemlighet: -12, andakt: 8 },
    weight: 5,
    requires: { minDread: 50 },
  },
  {
    id: 'final_dream',
    text: 'I natt drömde alla troende samma sak. Det finns inga ord för vad vi såg. Det finns dock ett ljud. Vi har börjat göra det.',
    effect: { dread: 40, ritual: 8, troende: 2, kaos: 20 },
    weight: 3,
    requires: { minRitual: 60 },
  },

  // ── Anders Fager-register: vardagssvenska möter det ofattbara ──
  {
    id: 'ica_maxi',
    text: 'Kassörskan på ICA Maxi vid Fosie har inte blinkat på tre veckor. Kunden bakom i kön räknade. Ingen anmälde det. Det är Malmö.',
    effect: { dread: 7, kaos: 4 },
    weight: 9,
  },
  {
    id: 'sj_train',
    text: 'SJ-tåget mot Köpenhamn stannade i tolv minuter i en tunnel som inte finns på kartan. Passagerarna anlände i tid. Ingen av dem kan minnas att de steg på tåget.',
    effect: { dread: 14, kaos: 8 },
    weight: 7,
    requires: { minDread: 15 },
  },
  {
    id: 'pressbyraan',
    text: 'Pressbyrån på centralstationen säljer sedan fredag en tidning utan namn. Texten byter innehåll beroende på vem som läser. Bengt-Åke från Husie köper ett ex om dagen och verkar nöjd.',
    effect: { dread: 10, kaos: 6, andakt: 5 },
    weight: 8,
  },
  {
    id: 'child_sees',
    text: 'Syster Halléns dotter, 7 år, har börjat rita samma bild varje dag. En stad under vatten. Byggnaderna är rätt. Malmö kan inte ha legat under vatten. Inte på den här sidan av verkligheten.',
    effect: { dread: 18, ritual: 2 },
    weight: 7,
    requires: { minDread: 10 },
  },
  {
    id: 'rolf_disappears',
    text: 'Rolf från Limhamn var med oss i tre veckor. Han slutade komma. Vi hittade hans skor utanför lokalen ordentligt placerade med tårna mot havet. Rökarens tobak låg bredvid. Rolf rökte inte.',
    effect: { hemlighet: -8, dread: 12, kaos: 5 },
    weight: 7,
  },
  {
    id: 'mirror_problem',
    text: 'Spegeln i förrummet återspeglar lokalen som den såg ut för ett okänt antal år sedan. Möblerna är annorlunda. Det sitter folk i dem. De ser glada ut.',
    effect: { dread: 16, kaos: 9 },
    weight: 6,
    requires: { minDread: 20 },
  },
  {
    id: 'kult_lictor',
    text: 'En tjänsteman från stadsbyggnadskontoret kom för att kontrollera ventilationen. Han hittade inga brister. Han stannade i fyra timmar. Han antecknade ingenting men han tittade på allt. Dörren han gick ut genom finns inte längre.',
    effect: { hemlighet: -20, dread: 15 },
    weight: 5,
    requires: { minDread: 30 },
  },
  {
    id: 'anneli_dream',
    text: 'Systern Anneli-Karin har börjat tala i sömnen på ett språk vi inte känner igen. Vi spelade in det och spelade upp det baklänges. Det var också obegripligt. Fast annorlunda obegripligt.',
    effect: { dread: 12, ritual: 3, andakt: 8 },
    weight: 7,
    requires: { minDread: 25 },
  },
  {
    id: 'hospital_report',
    text: 'UMAS rapporterar en ökning av patienter med "orientationssvårigheter." De vet vem de är. De vet var de är. De vet bara inte när de är. Siffran stämmer inte med någon känd tidpunkt.',
    effect: { dread: 20, kaos: 12 },
    weight: 5,
    requires: { minDread: 40 },
  },

  // ── Kult-register: verkligheten är ett fängelse och murarna spricker ──
  {
    id: 'kult_space_between',
    text: 'Det finns ett rum i källaren som inte är med i ritningarna. Vi har mätt tre gånger. Arkitektkontoret mätte en gång. De mäter inte mer.',
    effect: { dread: 22, kaos: 10 },
    weight: 6,
    requires: { minDread: 35 },
  },
  {
    id: 'kult_flesh',
    text: 'Väggarna i Värnhemslokalens källare har börjat kännas varma. Vi kontrollerade rören. Det är inte rören. Vi kontrollerade inte mer.',
    effect: { dread: 28, ritual: 4 },
    weight: 4,
    requires: { unlockedArea: 'varnhem', minDread: 50 },
  },
  {
    id: 'kult_death_servant',
    text: 'Broder Mattsson dog i hjärtattack under onsdagsmötet. Han reste sig upp igen och färdigförklarade sin tolkning av det tredje kapitlet. Vi applåderade. Det var den bästa föreläsningen hittills.',
    effect: { dread: 35, ritual: 6, kaos: 18 },
    weight: 3,
    requires: { minDread: 60 },
  },
  {
    id: 'kult_awakening',
    text: 'Syster Thordis minns plötsligt något. Inte från ett tidigare liv — det är fel metafor. Snarare minns hon något som aldrig upphört. Hon gråter. Hon är glad. Skillnaden är svår att se.',
    effect: { dread: 25, ritual: 8, andakt: 15 },
    weight: 4,
    requires: { minRitual: 20 },
  },

  // ── CoC-register: utredare, förlorat förstånd, Mythos med Malmö-accent ──
  {
    id: 'coc_deep_ones',
    text: 'Fiskarna vid Ribersborg uppför sig konstigt. De simmar i cirklar. Cirkeln är exakt 13 meter i diameter. Varje dag krymper den med en halv meter. Vi vet vad det betyder. Vi skriver inte ner det här.',
    effect: { dread: 18, ritual: 2, kaos: 7 },
    weight: 6,
    requires: { minDread: 20 },
  },
  {
    id: 'coc_investigator_dream',
    text: 'Kommissarie Annika Fors från grova brott drömmer om oss. Vi vet det för att hon har börjat dröm-närvara på mötena. Vi har satt ut en stol åt henne. Hon sitter i den utan att veta om det.',
    effect: { hemlighet: -10, kaos: 15, dread: 12 },
    weight: 5,
    requires: { minDread: 35 },
  },
  {
    id: 'coc_old_book',
    text: 'En antikvariat vid Lilla Torg fick in ett parti böcker från ett dödsbo i Hyllie. En av dem börjar om du öppnar den. Antikvariaten har läst sista sidan. Hon behöver inte läsa fler böcker.',
    effect: { dread: 20, ritual: 5, kaos: 8 },
    weight: 5,
    requires: { minDread: 25 },
  },
  {
    id: 'coc_sanity',
    text: 'Broder Erik fick ett panikattackliknande tillstånd efter gårdagens session. Inte för att det var läskigt. För att det inte var det längre. "Jag tänkte det borde vara det," sa han. "Och det var det inte."',
    effect: { dread: 15, kaos: 10, andakt: 10 },
    weight: 7,
    requires: { minDread: 30 },
  },
  {
    id: 'coc_stars_right',
    text: 'Astronomerna vid Lund Observatory har lagt ut en pressrelease om "ovanlig stjärnkonfiguration." De drog tillbaka den inom en timme. Konfigurationen kvarstår. Stjärnorna vet.',
    effect: { dread: 30, ritual: 7, kaos: 12 },
    weight: 4,
    requires: { minRitual: 30, minDread: 50 },
  },

  // ── Fler troende, fler problem ──
  {
    id: 'troende_schism',
    text: 'Nio troende är fler än vi någonsin haft. Två av dem har börjat diskutera huruvida Den Sovande ska tilltalas i bestämd eller obestämd form. Diskussionen tar tid från ritualen.',
    effect: { kaos: 10, andakt: -8 },
    weight: 7,
    requires: { minTroende: 9 },
  },
  {
    id: 'troende_potluck',
    text: 'Med så många i lokalen har vi infört fikaschema. Broder Lindqvists kanelbullar innehåller något som inte står på innehållsförteckningen. Ingen har klagat. Ingen kommer att klaga.',
    effect: { andakt: 20, kaos: 6 },
    weight: 7,
    requires: { minTroende: 6 },
  },
  {
    id: 'troende_census',
    text: 'Skatteverket vill räkna medlemmarna i vår förening. Tolv namn står på listan. Vi är elva. Ingen minns vem den tolfte är. Alla minns att hen alltid suttit på den varma stolen.',
    effect: { hemlighet: -10, dread: 14 },
    weight: 6,
    requires: { minTroende: 11 },
  },

  // ── Nya platser, nya konsekvenser ──
  {
    id: 'malmo_c_departures',
    text: 'Avgångstavlan på Malmö C visar ett tåg mot en station som heter samma sak baklänges. Det avgår om exakt 13 minuter, varje dag, för evigt. Ingen har åkt med det än. Någon kommer att göra det snart.',
    effect: { dread: 16, kaos: 7 },
    weight: 7,
    requires: { minDread: 15 },
  },
  {
    id: 'kockums_crane',
    text: 'Kockumskranen, som revs för länge sedan, syns nu i horisonten igen på klara kvällar. Stadsmuseet har inga förklaringar. De har slutat leta efter dem.',
    effect: { dread: 20, kaos: 9 },
    weight: 6,
    requires: { minDread: 25 },
  },
  {
    id: 'folkets_park_carousel',
    text: 'Karusellen i Folkets Park har börjat gå av sig själv efter stängning. Vaktmästaren säger att den går fortare för varje varv. Han har slutat räkna varven.',
    effect: { dread: 13, kaos: 8 },
    weight: 8,
  },
  {
    id: 'moderna_museet',
    text: 'Moderna Museet Malmö har ställt ut ett verk ingen konstnär signerat. Besöksstatistiken visar att alla som tittar på det stannar exakt 13 minuter. Ingen kommer ihåg vad de såg. Alla ler på väg ut.',
    effect: { dread: 11, andakt: 6, kaos: 5 },
    weight: 8,
  },
  {
    id: 'hyllie_construction',
    text: 'Bygget vid Hyllie har stoppats efter att grävmaskinisten hittade "något organiskt, men fel format" två meter ner. Kommunen har täckt över hålet. Hålet är fortfarande varmt.',
    effect: { dread: 24, kaos: 10 },
    weight: 5,
    requires: { minDread: 30 },
  },

  // ── Hemlighet-fokuserade händelser ──
  {
    id: 'low_secrecy_press',
    text: 'Ett anonymt tips har nått Sydsvenskan om "aktivitet i en källarlokal." Reportern ringer tre gånger. Vi svarar inte. Hon skriver artikeln ändå, baserad på "källor med insyn."',
    effect: { hemlighet: -18, kaos: 10 },
    weight: 6,
    requires: { minDread: 20 },
  },
  {
    id: 'secrecy_recovered',
    text: 'Syster Hassan har övertygat grannskapsföreningen om att våra sammankomster är en läsecirkel för nordisk kriminallitteratur. De ber om att få vara med. Vi säger nej vänligt.',
    effect: { hemlighet: 12, andakt: 5 },
    weight: 8,
  },

  // ── Ritual-komplikationer ──
  {
    id: 'ritual_wrong_verse',
    text: 'Broder Persson läste rad 217 istället för 218 under gårdagens ceremoni. Skillnaden är en bokstav. Effekten är inte en bokstavs skillnad. Vi har lagt till bokmärken.',
    effect: { ritual: -3, kaos: 14, dread: 8 },
    weight: 6,
    requires: { minRitual: 15 },
  },
  {
    id: 'ritual_translation',
    text: 'En doktorand i lingvistik vid Lunds universitet har oavsiktligt löst tre rader av Skriften medan hon försökte identifiera "ett ovanligt baltiskt dialektdrag." Hon vet inte vad hon hittade. Vi vet.',
    effect: { ritual: 6, dread: 15, hemlighet: -6 },
    weight: 5,
    requires: { minRitual: 20 },
  },

  // ── Inflytandets pris ──
  {
    id: 'influence_favor_owed',
    text: 'Tjänstemannen vi charmade förra veckan ber om en gentjänst. Han vill bara "titta på lokalen." Vi visar honom källaren, inte källaren under källaren. Han ler för mycket för att ha märkt skillnaden.',
    effect: { hemlighet: -6, kaos: 8, andakt: 6 },
    weight: 7,
    requires: { minDread: 15 },
  },
  {
    id: 'influence_debt_network',
    text: 'Broder Perssons kontaktnät sträcker sig längre än vi trodde. En rådman, en fastighetsmäklare, en person på Länsstyrelsen. Ingen av dem minns exakt varför de hjälper oss. De bara gör det.',
    effect: { hemlighet: 10, andakt: 12 },
    weight: 7,
    requires: { minTroende: 4 },
  },
  {
    id: 'influence_backfires',
    text: 'Journalisten vi "lugnade ner" förra månaden har börjat drömma om oss istället. Hon ringer mitt i natten och frågar om vi "har hört sången än." Vi har inte sagt något om en sång.',
    effect: { hemlighet: -12, dread: 16, kaos: 10 },
    weight: 6,
    requires: { minDread: 25 },
  },
  {
    id: 'influence_favor_bank',
    text: 'En av våra "vänner i systemet" har bett om en tjänst tillbaka: att få komma till nästa sammankomst. Vi säger ja. Han sitter längst bak. Han antecknar ingenting. Han ler hela tiden.',
    effect: { troende: 1, hemlighet: -8, kaos: 6 },
    weight: 6,
    requires: { minTroende: 5 },
  },

  // ── Fler vardagsmalmö-händelser ──
  {
    id: 'moving_boxes',
    text: 'Vi har flyttat verksamheten till en större lokal "för läsecirkeln." Flyttfirman noterade att en av lådorna vägde för lite för sin storlek och en annan för mycket. De sa ingenting. De tog dubbel betalt.',
    effect: { andakt: 15, kaos: 5 },
    weight: 8,
  },
  {
    id: 'ribersborg_kallbadhus',
    text: 'Bastuvakten vid Ribersborgs kallbadhus har slutat elda bastun. Den är ändå varm. Han säger att den värmer sig själv nu, "underifrån." Han har bytt lås på dörren till det egna huset.',
    effect: { dread: 14, kaos: 6 },
    weight: 8,
  },
  {
    id: 'augustenborg_greenroof',
    text: 'Ett av de gröna taken i Augustenborg har börjat växa en växt ingen botaniker känner igen. Kommunens ekolog tog ett prov. Provet är fortfarande i tillväxt i sitt provrör, i ett låst skåp.',
    effect: { dread: 12, andakt: 5 },
    weight: 8,
  },
  {
    id: 'triangeln_mall',
    text: 'Rulltrappan på Triangeln köpcentrum stannade i tre minuter med alla passagerare kvar på den, orörliga, leende. Sedan startade den igen. Ingen av dem minns resan. Alla köpte samma sak efteråt.',
    effect: { dread: 15, kaos: 9 },
    weight: 7,
    requires: { minDread: 20 },
  },
  {
    id: 'davidshall_church',
    text: 'Klockorna i S:t Johannes kyrka slog tretton slag klockan tolv på natten. Kyrkoherden säger att klockorna är mekaniskt oförmögna till det. Han har inte sovit sedan dess. Han ler ändå på söndagarna.',
    effect: { dread: 18, hemlighet: -5 },
    weight: 6,
    requires: { minDread: 20 },
  },
  {
    id: 'limhamn_quarry',
    text: 'Kalkbrottet i Limhamn har fyllts med vatten i hundra år. Dykarklubben rapporterar en ny tunnel på botten som inte fanns förra veckan. De har slutat dyka där. De pratar inte om varför.',
    effect: { dread: 20, ritual: 2 },
    weight: 6,
    requires: { minDread: 30 },
  },

  // ── Choice events ───────────────────────────────────────────────────────────
  {
    id: 'choice_lindqvist_dream',
    text: 'Broder Lindqvist vaknar mitt i mötet och säger att fisken har gett honom en instruktion. Han vägrar upprepa den högt. Han vill viska den till en av er, en och en.',
    effect: {},
    weight: 9,
    choices: [
      {
        text: 'Lyssna på viskningen',
        effect: { dread: 12, hemlighet: -4, andakt: 6 },
        resultText: 'Ni lyssnar. Det ni hör går inte att glömma. Ni vet nu var Den Sovande vänder blicken härnäst.',
        flag: 'lindqvist_listened',
      },
      {
        text: 'Be honom tiga',
        effect: { kaos: 6 },
        resultText: 'Ni tystar honom. Han ler ändå, som om han redan sagt det som behövdes.',
        flag: 'lindqvist_silenced',
      },
    ],
  },
  {
    id: 'lindqvist_chain_2a',
    text: 'Broder Lindqvist har inte sovit på fyra dagar. Han säger att han inte längre behöver det. Han ritar samma karta om och om igen, alltid samma vinkel mot Öresund.',
    effect: { dread: 10, andakt: 5 },
    weight: 9,
    requires: { flag: 'lindqvist_listened', completedEventId: 'choice_lindqvist_dream', minDread: 25 },
  },
  {
    id: 'lindqvist_chain_2b',
    text: 'Broder Lindqvist har blivit tystlåten sedan ni bad honom tiga. Han deltar fortfarande, men han skriver nu ner sina drömmar istället för att dela dem. Ingen har läst anteckningsboken. Ingen vågar fråga.',
    effect: { hemlighet: -6, kaos: 4 },
    weight: 9,
    requires: { flag: 'lindqvist_silenced', completedEventId: 'choice_lindqvist_dream', minDread: 25 },
  },
  {
    id: 'lindqvist_chain_3',
    text: 'Lindqvist ber att få gå ner till Öresund ensam, på natten, "för att svara ordentligt denna gång." Han har redan sina kläder på sig. Han väntar bara på ert tillstånd.',
    effect: {},
    weight: 8,
    requires: { minDread: 45, completedEventId: 'choice_lindqvist_dream' },
    choices: [
      {
        text: 'Låt honom gå',
        effect: { dread: 20, ritual: 4, hemlighet: -8 },
        resultText: 'Han går ner mot vattnet och försvinner in i dimman. Han kommer tillbaka i gryningen, torr, leende, och pratar inte längre om drömmar. Han pratar inte om något alls.',
      },
      {
        text: 'Håll fast honom',
        effect: { kaos: 15, andakt: 10 },
        resultText: 'Ni håller kvar honom till gryningen. Han skriker att ni har gjort ett misstag. Han slutar skrika när solen går upp. Han säger aldrig varför.',
      },
    ],
  },
  {
    id: 'choice_skatteverket_audit',
    text: 'Skatteverket har utökat sin utredning. En handläggare vid namn Persson vill besöka källaren personligen "för att förstå verksamhetens karaktär."',
    effect: {},
    weight: 8,
    choices: [
      {
        text: 'Bjud in honom',
        effect: { hemlighet: -15, andakt: 25 },
        resultText: 'Persson dricker teet ni bjuder på. Han går därifrån med ett leende och ett obegripligt formulär ifyllt till er fördel. Han minns inte riktigt vägen hem.',
      },
      {
        text: 'Avböj artigt',
        effect: { hemlighet: 5, andakt: -5 },
        resultText: 'Ni skickar ett artigt nej. Persson accepterar det, men skriver något i sina anteckningar som ni inte får se.',
      },
    ],
  },
  {
    id: 'hassan_ambition',
    text: 'Syster Hassan har börjat föreslå ändringar i ritualens ordning. Hon säger att hon sett en bättre väg i en dröm. Hon säger det med en säkerhet ni inte kommer ihåg att hon haft förut.',
    effect: {},
    weight: 8,
    requires: { minDread: 15 },
    choices: [
      {
        text: 'Ge henne ansvar',
        effect: { andakt: 12, dread: 6 },
        resultText: 'Ni låter henne leda nästa moment. Cirkeln följer henne lättare än den någonsin följt er. Det känns bra. Det känns också som en förlust ni inte kan namnge.',
        flag: 'hassan_empowered',
      },
      {
        text: 'Behåll ordningen',
        effect: { kaos: 5 },
        resultText: 'Ni tackar för förslaget och fortsätter som förut. Hassan nickar och säger inget mer. Hon skriver fortfarande i sin anteckningsbok efteråt.',
        flag: 'hassan_sidelined',
      },
    ],
  },
  {
    id: 'hassan_chain_2a',
    text: 'Syster Hassan leder nu halva mötena. Hon har egna ord för Den Sovande, ord ingen av er lärt henne. Troende lyssnar på henne som de en gång lyssnade på er.',
    effect: { andakt: 15, kaos: 5 },
    weight: 8,
    requires: { flag: 'hassan_empowered', completedEventId: 'hassan_ambition', minDread: 35 },
  },
  {
    id: 'hassan_chain_2b',
    text: 'Syster Hassans anteckningsbok är full nu. Hon slutar be om lov att tala. Det märks inte i mötena — hon sitter tyst och rak — men ni ser henne titta på dörren mot Värnhemstorget på ett nytt sätt.',
    effect: { hemlighet: -5, dread: 8 },
    weight: 8,
    requires: { flag: 'hassan_sidelined', completedEventId: 'hassan_ambition', minDread: 35 },
  },
  {
    id: 'hassan_chain_3',
    text: 'Syster Hassan ber om att få genomföra en egen ritual, separat från er, på Turning Torso. Hon säger att Den Sovande bett om henne specifikt. Hon säger det utan att blinka.',
    effect: {},
    weight: 7,
    requires: { minDread: 55, completedEventId: 'hassan_ambition', unlockedArea: 'torso' },
    choices: [
      {
        text: 'Låt henne göra det',
        effect: { dread: 22, ritual: 6, troende: -1 },
        resultText: 'Hon går upp ensam i mörkret. Ni ser ljus i fönstren på våningar som inte har fönster. Hon kommer tillbaka annorlunda — mer er, mindre henne, i en riktning ingen kan sätta ord på.',
      },
      {
        text: 'Neka henne',
        effect: { kaos: 18, hemlighet: -4 },
        resultText: 'Ni säger nej. Hon accepterar det med ett leende som inte når hennes ögon och går tillbaka till sin plats i cirkeln. Ni undrar länge efteråt om ni gjorde rätt val, eller bara det säkra.',
      },
    ],
  },
  {
    id: 'choice_new_recruit',
    text: 'En ung kvinna har suttit utanför källaren tre kvällar i rad. Hon säger att hon hörde sången genom väggarna och att hon inte kan sluta tänka på den.',
    effect: {},
    weight: 9,
    choices: [
      {
        text: 'Släpp in henne',
        effect: { troende: 1, kaos: 8, hemlighet: -3 },
        resultText: 'Hon kliver in och sätter sig utan att bli tillsagd var. Cirkeln känns mindre ensam. Den känns också mer sedd.',
      },
      {
        text: 'Skicka bort henne',
        effect: { hemlighet: 3, dread: 4 },
        resultText: 'Ni ber henne gå. Hon nickar och försvinner in i mörkret. Ni hör sången fortsätta, en röst kort.',
      },
    ],
  },
  {
    id: 'choice_ikea_table_ritual',
    text: 'Det blödande LACK-bordet har slutat blöda. Istället vibrerar det svagt när någon lägger sin hand på det, som om det väntar på en fråga.',
    effect: {},
    weight: 7,
    requires: { minDread: 15 },
    choices: [
      {
        text: 'Ställ en fråga',
        effect: { dread: 14, ritual: 3, hemlighet: -2 },
        resultText: 'Bordet svarar. Ingen av er pratar om svaret efteråt, men ni ritar alla samma symbol på varsitt papper, oberoende av varandra.',
      },
      {
        text: 'Kasta ut det',
        effect: { kaos: 10, andakt: 8 },
        resultText: 'Ni bär ut bordet till återvinningen. Det står kvar på återvinningsgården i tre dagar innan någon vågar ta det. Ni vill inte veta vem.',
      },
    ],
  },

  // ── High dread / late game ──────────────────────────────────────────────────
  {
    id: 'late_torso_lean',
    text: 'Turning Torso lutar nu tre grader mer än vad byggnadskonstruktören godkänt. Ingenjörerna har mätt om det fem gånger. Alla fem mätningarna skiljer sig åt. Alla fem pekar mot samma punkt i Öresund.',
    effect: { dread: 25, ritual: 4 },
    weight: 5,
    requires: { minDread: 90 },
  },
  {
    id: 'late_streetlights',
    text: 'Gatlyktorna längs hela Amiralsgatan slocknar samtidigt varje natt klockan 03.13, i exakt tolv sekunder. Kommunen hittar inget fel. Ingen i Malmö sover mellan 03.00 och 03.15 längre, men ingen pratar om det.',
    effect: { dread: 30, hemlighet: -6 },
    weight: 5,
    requires: { minDread: 120 },
  },
  {
    id: 'late_choir_beneath',
    text: 'En kör hörs nu under staden, tydligast vid tunnelbanans arbetsschakt vid Triangeln. Arbetarna har slutat gräva djupare. De säger att marken "svarar för nära" om de fortsätter.',
    effect: { dread: 35, ritual: 6 },
    weight: 4,
    requires: { minDread: 160 },
  },
  {
    id: 'late_sun_wrong',
    text: 'Solen gick upp i väster i morse. Den korrigerade sig själv inom en minut. SMHI kallar det en "atmosfärisk synvilla." Ingen som såg det tror på den förklaringen, inklusive de som skrev den.',
    effect: { dread: 40, kaos: 15 },
    weight: 4,
    requires: { minDread: 200 },
  },
  {
    id: 'late_children_hum',
    text: 'Barnen på förskolan vid Bellevuegården har börjat nynna samma melodi, oberoende av varandra, utan att någon lärt dem den. Personalen har slutat fråga varifrån den kommer. De nynnar den nu också.',
    effect: { dread: 45, hemlighet: -10, troende: 1 },
    weight: 4,
    requires: { minDread: 250 },
  },
  {
    id: 'late_sky_seam',
    text: 'Himlen över Malmö har fått en söm. Den syns bara i skymningen, ett tunt rakt streck rakt över Turning Torso, som om något stort suttit ihop fel. Ingen har fotograferat den framgångsrikt än. Kamerorna vägrar.',
    effect: { dread: 55, ritual: 8 },
    weight: 3,
    requires: { minDread: 320 },
  },
  {
    id: 'late_final_stillness',
    text: 'Hela Malmö är alldeles tyst i tre sekunder klockan fyra på morgonen. Trafiken stannar. Fåglarna tystnar. Ingen märker det utom ni. Ni vet alla exakt vad det betydde. Ingen säger det högt.',
    effect: { dread: 60, ritual: 10, hemlighet: -8 },
    weight: 3,
    requires: { minDread: 400 },
  },
  {
    id: 'choice_final_congregation',
    text: 'En troende ni inte känner igen står plötsligt mitt i cirkeln under ett möte. Hon säger att hon "alltid varit här" och att ni bara "inte sett henne förrän nu." Ingen minns att hon klev in.',
    effect: {},
    weight: 4,
    requires: { minDread: 150 },
    choices: [
      {
        text: 'Ge henne en plats i cirkeln',
        effect: { troende: 1, dread: 20, ritual: 5 },
        resultText: 'Ni flyttar ihop för att göra plats. Det behövdes ingen extra stol. Det fanns redan en.',
      },
      {
        text: 'Fråga vem hon är',
        effect: { hemlighet: -5, kaos: 10 },
        resultText: 'Hon svarar. Ingen av er minns svaret efteråt, men alla nickar som om det var uppenbart.',
      },
    ],
  },
  {
    id: 'library_card',
    text: 'Stadsbiblioteket har skickat en påminnelse om en bok ingen av er lånat. Titeln går inte att läsa högt utan att stamma. Förfallodatumet var för tre år sedan.',
    effect: { dread: 6, kaos: 4 },
    weight: 7,
  },
  {
    id: 'malmo_taxi',
    text: 'En taxichaufför känner igen er utan att ni sagt vart ni ska och kör direkt till källaren. Han tar ingen betalning. Han ber om något annat istället, artigt, som om det vore normalt.',
    effect: { dread: 10, andakt: 10 },
    weight: 6,
    requires: { minTroende: 3 },
  },
  {
    id: 'weather_wrong',
    text: 'SMHI:s prognos för Malmö visar regn. Solen skiner. Appen uppdateras inte, oavsett hur många gånger ni drar ner den.',
    effect: { kaos: 10 },
    weight: 8,
  },
  {
    id: 'apartment_silence',
    text: 'Grannarna ovanför källaren har inte hörts på en vecka. Posten samlas i brevlådan. Ingen av er går och knackar.',
    effect: { dread: 8, hemlighet: -4 },
    weight: 6,
    requires: { minDread: 20 },
  },
  {
    id: 'choice_lost_child',
    text: 'Ett barn kommer in i källaren genom en dörr ingen av er lämnat olåst och frågar efter sin mamma. Barnet verkar inte rädd. Det verkar snarare besviken över att träffa er istället.',
    effect: {},
    weight: 5,
    requires: { minDread: 60 },
    choices: [
      {
        text: 'Följ barnet ut och leta efter mamman',
        effect: { hemlighet: 5, kaos: -10 },
        resultText: 'Ni går ut tillsammans. Gatan är tom. Barnet släpper er hand utan ett ord och går åt ett håll ni inte följer.',
      },
      {
        text: 'Fråga vad hon heter',
        effect: { dread: 12, ritual: 3 },
        resultText: 'Barnet säger ett namn ingen av er känner igen, men alla skriver ner exakt likadant utan att jämföra.',
      },
    ],
  },
  {
    id: 'malmo_arena_concert',
    text: 'En utsåld konsert på Malmö Arena tystnar mitt i en låt, i exakt tolv sekunder, samtidigt som ert möte. Ingen i publiken verkar märka det. Klippet på nätet visar tystnaden. Ljudet finns kvar i videon om man sänker volymen till max.',
    effect: { kaos: 12, dread: 8 },
    weight: 5,
    requires: { minTroende: 4 },
  },
];

// ── Kaos events (Henderson-tier) ─────────────────────────────────────────────

export const KAOS_EVENTS: GameEvent[] = [
  {
    id: 'k_goran_dog',
    text: 'Göran (från Discord-incidenten) har tagit med sig sin hund "Bamse" till ritualen. Bamse verkar inte störd av chantandet. Tvärtom. Bamse leder nu det andra kvartalets böner.',
    effect: { kaos: -40, andakt: 20, troende: 1 },
    weight: 10,
    requires: { completedEventId: 'discord_goran' },
  },
  {
    id: 'k_influencer',
    text: 'En influencer har börjat live-streama utanför vår lokal med titeln "mysig sektkänsla i Malmö 🌊✨". Kommentarerna är överväldigande positiva. Dread ökar snabbare nu.',
    effect: { kaos: -30, dread: 40, hemlighet: -20 },
    weight: 9,
  },
  {
    id: 'k_zlatan',
    text: 'Zlatan Ibrahimović har postat en bild på Instagram från Stortorget klockan 3 på natten med texten "jag vet." Vi vet inte vad han vet. Han vet.',
    effect: { kaos: -50, dread: 35, hemlighet: -5 },
    weight: 8,
  },
  {
    id: 'k_bygglov',
    text: 'Kommunen har beviljat bygglov för "andlig rekreationsanläggning" vid Västra Hamnen. Ceremonin är nu stadsplanegodkänd. Det finns en toalett.',
    effect: { kaos: -35, hemlighet: 15, andakt: 25 },
    weight: 8,
  },
  {
    id: 'k_journalist',
    text: 'En journalist från Sydsvenskan skriver ett positivt reportage om "Malmös växande alternativa andlighet." Artikeln vinner pris. Juryn kan inte minnas vad de tyckte om den.',
    effect: { kaos: -40, troende: 3, hemlighet: -15 },
    weight: 7,
  },
  {
    id: 'k_rival_cult',
    text: 'En rivaliserande sekt med bas i Hässleholm försöker mana fram en annan entitet. De manar fel. De manar fram IKEA:s kundtjänst. Det är värre.',
    effect: { kaos: -45, dread: 50, hemlighet: 10 },
    weight: 7,
  },
  {
    id: 'k_duck_army',
    text: 'Änderna vid Ribersborg marscherar nu i formation mot Turning Torso. Turisterna filmar det. En orkester spelar av oklar anledning. Det låter rätt.',
    effect: { kaos: -60, dread: 60, ritual: 5 },
    weight: 5,
    requires: { minDread: 30 },
  },
  {
    id: 'k_old_man',
    text: 'En pensionerad sjöman med oidentifierbara tatueringar har låst in sig i tornet vid Turning Torso och börjat sjunga. Räddningstjänsten kan inte ta sig in. Sången hjälper faktiskt ritualen.',
    effect: { kaos: -50, ritual: 10, hemlighet: -10 },
    weight: 5,
    requires: { unlockedArea: 'torso' },
  },
  {
    id: 'k_varnhem_kebab',
    text: 'Kebabkiosken på Värnhemstorget serverar sedan onsdag ett alternativt menyalternativ som inte finns på tavlan. Kunderna som beställer det återkommer. De ser annorlunda ut.',
    effect: { kaos: -40, troende: 4, dread: 30 },
    weight: 6,
    requires: { unlockedArea: 'varnhem' },
  },
  {
    id: 'k_denmark',
    text: 'Danmark har officiellt begärt förklaring om vad som händer i Malmö. Sverige skickar en arbetsgrupp. Arbetsgruppen reser över Øresundsbron och hör inte av sig.',
    effect: { kaos: -55, dread: 45, hemlighet: -8 },
    weight: 5,
    requires: { minDread: 50 },
  },
  {
    id: 'k_goran_promoted',
    text: 'Göran har frågat om han kan "ta lite mer ansvar" i föreningen. Vi har utnämnt honom till Väktare av det Tredje Sigillet. Han tolkar det som kassör. Det är ungefär rätt.',
    effect: { kaos: -30, andakt: 30, hemlighet: 5 },
    weight: 8,
    requires: { completedEventId: 'discord_goran' },
  },
  {
    id: 'k_no_survivors',
    text: 'Det hände något på Värnhemstorget i natt. Bevakningskamerorna fungerar men visar statiska bilder från 1987. Alla inblandade är okej. Ingen vet vad "okej" betyder längre.',
    effect: { kaos: -70, dread: 80, ritual: 8 },
    weight: 3,
    requires: { minDread: 60, unlockedArea: 'varnhem' },
  },
  {
    id: 'k_bengt_ake',
    text: 'Bengt-Åke (tidningsmannen från Husie) visade sig vara med i en helt annan sekt sedan 1987. Hans sekt visade sig vara med i en ännu äldre sekt sedan 1840-talet. Vi håller ett samordningsmöte. Det är produktivt.',
    effect: { kaos: -45, andakt: 35, troende: 2 },
    weight: 7,
    requires: { completedEventId: 'pressbyraan' },
  },
  {
    id: 'k_skinwalker_bus',
    text: 'Något som ser ut som en bussförare har kört linje 2 sedan tisdags morse. Tidtabellen är perfekt. Kunderna är nöjda. Skånetrafiken vet inte vem det är. Det spelar ingen roll, säger de. Det kör ju.',
    effect: { kaos: -50, dread: 45 },
    weight: 6,
    requires: { minDread: 40 },
  },
  {
    id: 'k_fager_library',
    text: 'Stadsbiblioteket på Kung Oscars väg har ett rum i källaren som bara öppnas under kaos. Vi var sist dit. Samlingen är imponerande. Returdatumet är omöjligt.',
    effect: { kaos: -55, ritual: 12, dread: 20 },
    weight: 5,
    requires: { minDread: 30 },
  },
  {
    id: 'k_reporter_vanishes',
    text: 'Journalisten från Sydsvenskan som skrev det prisbelönta reportaget har rest till Malmö för en uppföljningsartikel. Han hittade mer än han letade efter. Artikeln publiceras aldrig. Vi sparar hans anteckningar.',
    effect: { kaos: -40, hemlighet: 20, ritual: 5 },
    weight: 6,
    requires: { minDread: 45, completedEventId: 'k_journalist' },
  },
  {
    id: 'k_kult_archon',
    text: 'Något som påminner om en bank-direktör besökte ritualen utan att vi bjöd in det. Det tittade på oss med ett intresse vi inte kan beskriva. Det lämnade ett visitkort. Det finns inget namn på det. Bara en adress. Vi har inte åkt dit än.',
    effect: { kaos: -60, dread: 60, hemlighet: -25 },
    weight: 4,
    requires: { minDread: 55 },
  },
  {
    id: 'k_oresund_rises',
    text: 'Vattnet i Öresund sjunker alltjämt. På botten syns nu en stad. Det är inte en gammal stad. Byggnaderna är moderna. En av dem har belysning.',
    effect: { kaos: -80, dread: 90, ritual: 15 },
    weight: 2,
    requires: { minDread: 75, minRitual: 50 },
  },
  {
    id: 'k_malmofestivalen',
    text: 'Malmöfestivalen har av misstag bokat oss för en scen vid Gustav Adolfs Torg. Chantandet tolkas som experimentell körmusik. Vi vinner publikens pris. Ingen av juryn minns att de röstade.',
    effect: { kaos: -35, andakt: 40, troende: 2, hemlighet: -12 },
    weight: 7,
  },
  {
    id: 'k_mmx_conspiracy',
    text: 'Ett konspirationsforum har utsett oss till "årets mest underskattade hot mot verkligheten." Medlemmarna anländer i busslass för att "kolla läget." Tre av dem stannar för gott.',
    effect: { kaos: -45, troende: 3, dread: 35, hemlighet: -15 },
    weight: 6,
    requires: { minTroende: 6 },
  },
  {
    id: 'k_folkets_park_ferris',
    text: 'Pariserhjulet i Folkets Park har fastnat med alla vagnar exakt vända mot Turning Torso. Nöjesfältet stänger "för underhåll." Underhållet kommer aldrig att bli klart.',
    effect: { kaos: -55, dread: 55, ritual: 6 },
    weight: 5,
    requires: { unlockedArea: 'torso', minDread: 40 },
  },
  {
    id: 'k_researcher_joins',
    text: 'Doktoranden som råkade översätta tre rader av Skriften har sökt medlemskap. Hon säger att hon "bara vill se hur det slutar." Vi tror henne inte. Vi släpper in henne ändå.',
    effect: { kaos: -40, troende: 1, ritual: 8, hemlighet: -10 },
    weight: 6,
    requires: { minRitual: 20 },
  },
  {
    id: 'k_favor_called_in',
    text: 'Alla våra kontakter i systemet ringer samtidigt och ber om samma gentjänst: en plats vid nästa ceremoni. Vi kan inte säga nej till alla. Lokalen är plötsligt fullsatt av folk i kostym som ler för mycket.',
    effect: { kaos: -50, troende: 3, hemlighet: -20, andakt: 20 },
    weight: 6,
    requires: { minTroende: 5 },
  },
  {
    id: 'k_influence_network_wakes',
    text: 'Nätverket av "vänner i systemet" visar sig vara äldre och djupare än vi trodde. En av dem säger sig ha "tjänat samma sak sedan 1962, i en annan form." Han menar det inte som en gåta.',
    effect: { kaos: -60, ritual: 10, hemlighet: -15, dread: 40 },
    weight: 5,
    requires: { minDread: 40 },
  },
  {
    id: 'k_ica_hoarding',
    text: 'Alla ICA-butiker i Malmö har fått slut på konservburkar med fisk samtidigt. Kunderna köper allt de kan bära utan att kunna förklara varför. En kassörska säger att hyllorna "kändes hungrigare än vanligt."',
    effect: { kaos: -30, andakt: 15, troende: 1 },
    weight: 8,
  },
  {
    id: 'k_pigeon_choir',
    text: 'Duvorna över hela innerstaden har synkroniserat sitt kuttrande till en enda rytm. Ornitologer vid universitetet kallar det "statistiskt osannolikt." Ingen av dem vågar kalla det något annat.',
    effect: { kaos: -35, dread: 20 },
    weight: 7,
  },
  {
    id: 'k_bridge_toll_glitch',
    text: 'Betalstationen vid Öresundsbron har börjat ta betalt i en valuta ingen känner igen. Systemet accepterar den ändå. Bokföringen går ihop perfekt. Ingen vill fråga hur.',
    effect: { kaos: -45, andakt: 30, dread: 25 },
    weight: 6,
    requires: { minDread: 60 },
  },
  {
    id: 'k_missing_hour',
    text: 'Klockan blev plötsligt två timmar senare än den borde för alla i Malmö samtidigt, utan att någon märkte tidshoppet medan det hände. Ingen saknar den förlorade timmen. Det är det som oroar mest.',
    effect: { kaos: -70, dread: 65, ritual: 7 },
    weight: 3,
    requires: { minDread: 100 },
  },
  {
    id: 'k_second_torso',
    text: 'En andra Turning Torso syns i horisonten i tio minuter varje kväll, en spegelbild som inte har någon vattenyta att spegla sig i. Turistbyrån har börjat sälja vykort på den. De säljer bra.',
    effect: { kaos: -75, dread: 70, ritual: 10 },
    weight: 2,
    requires: { minDread: 180 },
  },
  {
    id: 'k_everyone_dreams_same',
    text: 'Hela Malmö drömde samma dröm i natt. Ingen minns innehållet, bara att den var er. Sömnforskare vid Lund har ingen förklaring. De har slutat publicera sina fynd om natten.',
    effect: { kaos: -65, troende: 2, ritual: 12, hemlighet: -12 },
    weight: 3,
    requires: { minDread: 220 },
  },
  {
    id: 'k_mall_muzak',
    text: 'Bakgrundsmusiken i Triangeln har bytts ut mot en enda ackordföljd som upprepas i sex timmar utan paus. Vaktbolaget säger att de inte kan hitta strömbrytaren. Kunderna handlar mer än vanligt.',
    effect: { kaos: -40, andakt: 25 },
    weight: 8,
  },
  {
    id: 'k_ferry_returns',
    text: 'En färja som togs ur trafik 2019 lade till vid hamnen i natt, i tid och enligt en tidtabell som inte längre existerar. Ingen gick av. Den lade ut igen innan personalen hann kontrollera den.',
    effect: { kaos: -55, dread: 40 },
    weight: 5,
    requires: { minDread: 50 },
  },
  {
    id: 'k_choir_practice',
    text: 'Malmö Kammarkör har börjat repetera ett stycke ingen av dem minns att de fått noter till. Dirigenten säger att det "kändes rätt att göra." Konserten är redan fullbokad.',
    effect: { kaos: -35, ritual: 4, andakt: 15 },
    weight: 7,
    requires: { minRitual: 10 },
  },
  {
    id: 'k_construction_halt',
    text: 'Ett byggprojekt vid Västra Hamnen har stannat av utan förklaring. Arbetarna säger att marken "kändes fel" på ett sätt ingen av dem kunde beskriva för facket. Platsen står orörd sedan dess.',
    effect: { kaos: -40, dread: 30, hemlighet: 10 },
    weight: 6,
    requires: { minDread: 35 },
  },
];
