Kortjakten

Et samlekortspill i Discord med tidsstyrte hendelser, egen nettside for samlinger og en spillmotor med revisjonsspor.

Type
Webapplikasjon
Periode
aug.–okt. 2026
Min rolle
Design og utvikling
Status
Privat samlekortspill for én Discord-server
Teknologi

Kortjakten er et privat samlekortspill i Discord, med en egen nettside for samlinger og administrasjon. Jeg har utviklet boten, webapplikasjonen og systemet som kjører tidsstyrte hendelser.

Prosjektet er også en hendelsesmotor. Spillerhandlinger, belønninger og arrangementer må følge de samme reglene, selv om de starter på forskjellige steder. Det gjør Kortjakten til et arbeid med både grensesnitt, datamodeller og konsistente endringer.

Utfordringen: ett spill med flere innganger

Spillerne bruker Discord når de deltar, men en samling er lettere å undersøke i et eget grensesnitt. Administrasjonen trenger igjen andre verktøy: oversikt over innhold, oppsett av hendelser og håndtering av spillet.

I tillegg skal deler av systemet kjøre uten at noen trykker på en knapp. Arrangementer begynner og slutter, belønninger skal deles ut, og noen hendelser utløses av at spillere er til stede i en stemmekanal.

Utfordringen er å få disse inngangene til å arbeide mot samme tilstand. En spiller må møte de samme opplysningene i samlingen som handlingene i Discord faktisk har skapt. En tidsstyrt jobb må følge reglene selv om den skjer samtidig med at noen spiller.

Løsningen: Kortjakten som samlekortspill og hendelsesmotor

Spill gjennom Discord

Boten, spillverten, er inngangen til selve spillet. Den tar imot handlinger og formidler det som skjer. Spillerne kan delta der de allerede snakker sammen, mens resultatet av handlingene lagres i systemet bak.

Dette skiller mellom samtalen og spilltilstanden. En beskjed i Discord er en presentasjon av et resultat. Eierskap til et kort og endringer i spillerens beholdning må eksistere som data, slik at de kan brukes videre i nettsiden og de andre delene av spillet.

En nettside for samlinger og administrasjon

Webapplikasjonen gjør det mulig å se samlinger og arbeide med administrasjonen uten å legge alle oppgavene i en samtale. Discord-innlogging brukes sammen med en intern tillatelsesliste for tilgang til den private løsningen.

De to grensesnittene har forskjellige oppgaver:

  • Discord: deltakelse, handlinger og beskjeder om det som skjer.
  • Samlingen: oversikt over kort og det spilleren eier.
  • Administrasjonen: håndtering av innhold og funksjoner som styrer spillet.

At disse oppgavene er forskjellige, betyr ikke at de bør ha hver sine varianter av spillereglene. De må bruke den samme forståelsen av eierskap, tilgjengelighet og resultat.

Tidsstyrte arrangementer

En sentral del av spillet er arrangementer som roterer over tre dager. Det finnes også andre tidsstyrte belønninger og hendelser. En egen bakgrunnsprosess håndterer jobbene som ikke er knyttet til en åpen side i nettleseren.

Dette krever en tydelig modell for når et arrangement gjelder, hvilket innhold som inngår og hva som skal skje ved overgangen til det neste. Tid er dermed en del av spillreglene, ikke bare en nedtelling som vises på skjermen.

Prosjektet har også hendelser knyttet til tilstedeværelse i en stemmekanal. Da må en hendelse vurderes ut fra hvem som er til stede og hvilke regler som gjelder for den aktuelle situasjonen.

Endringer som kan følges i etterkant

En spillerhandling kan berøre flere ting samtidig: en ressurs brukes, et kort tildeles og en endring føres i historikken. Jeg har arbeidet med atomiske transaksjoner og revisjonsspor for slike operasjoner.

Atomisk betyr at de sammenhengende endringene behandles som én helhet. Det er viktig når resultatet ellers kunne blitt en halvveis oppdatert beholdning. Revisjonssporet gir samtidig et grunnlag for å undersøke hva som faktisk skjedde.

Under panseret

Systemet er organisert som flere applikasjoner med felles kode i samme kodebase. TypeScript brukes gjennom store deler av løsningen, med Next.js og React i webapplikasjonen, discord.js i boten og Drizzle i databasearbeidet.

Hoveddelene er:

  1. Boten: håndterer samspillet med Discord.
  2. Webapplikasjonen: presenterer samlinger og administrasjon.
  3. Bakgrunnsprosessen: kjører planlagte jobber og hendelser.
  4. Den delte spillmotoren: samler regler og spillogikk.
  5. Felles datatilgang og bildebehandling: støtter delene som trenger de samme opplysningene og ressursene.

Det sentrale arkitekturvalget er å holde spillereglene samlet, samtidig som grensesnittene kan utvikles for hver sin oppgave. Da kan en endring i en regel vurderes som en systemendring, fremfor å måtte oppdages i flere forskjellige skjermer og kommandoer.

Prosjektet omfatter også bildebehandling og regler for hvordan resultater velges. De delene må passe den samme modellen for publisert innhold, tilgjengelige kort og det spilleren allerede eier.

Resultat og prosjektets ramme

Resultatet er et privat spill med Discord som inngang, en egen webapplikasjon og en bakgrunnsprosess for hendelsene. Det er utviklet for én server og beskrives her som et eget systemprosjekt.

Arbeidet har særlig gitt erfaring med sammenhengen mellom tid, samtidige handlinger og dataintegritet. Selv en enkel handling i grensesnittet kan ha flere følger som må behandles samlet. En tydelig historikk er viktig både for å forklare resultatet og for å undersøke feil.

Kortjakten viser også at oppdelingen i flere applikasjoner må begrunnes av oppgavene. Boten, nettsiden og de planlagte jobbene har ulike innganger, men de er avhengige av de samme reglene og dataene. Det er denne sammenhengen som er den viktigste delen av prosjektet.

Relevant for dere hvis …

Dere trenger et system der én handling oppdaterer flere opplysninger, eller der planlagte jobber må samvirke med det brukerne gjør. De samme problemstillingene kan være relevante i en intern oversikt, en portal eller en avgrenset arbeidsflyt med tydelige regler.

Jeg tilbyr webapplikasjoner med avklart omfang og overlevering. Beskriv prosessen dere ønsker å samle, så kan jeg vurdere hvilke data, grensesnitt og regler den første leveransen trenger.