Initial commit — Djupet

Idle cult management game set in Malmö, Sweden. Manage Troende,
Andakt, Dread, Hemlighet and Kaos while completing the Grand Ritual
before investigators shut you down. Lovecraftian flavour, Henderson-
tier chaos events, OSM/Leaflet map with dread spread markers across
Rosengård, Värnhemstorget, Turning Torso and Øresundsbron.

Vanilla TypeScript + Vite, no framework.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Fredrik Johansson
2026-07-07 23:05:22 +02:00
commit 68a378bdd4
13 changed files with 2274 additions and 0 deletions

238
src/events.ts Normal file
View File

@@ -0,0 +1,238 @@
export type EventEffect = Partial<{
andakt: number;
hemlighet: number;
kaos: number;
dread: number;
troende: number;
ritual: number;
}>;
export interface GameEvent {
id: string;
text: string;
effect: EventEffect;
weight: number;
requires?: Partial<{ minTroende: number; minDread: number; minRitual: number; unlockedArea: Area }>;
}
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 },
},
];
// ── 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 chantingen. Tvärtom. Bamse leder nu det andra kvartalets böner.',
effect: { kaos: -40, andakt: 20, troende: 1 },
weight: 10,
},
{
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 summera en annan entitet. De summerar fel. De summerar 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,
},
{
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' },
},
];