266 čitanja

Može li AI pokrenuti vašu sljedeću D&D igru? Ovaj projekt ima za cilj da sazna

by John Polacek10m2025/06/05
Read on Terminal Reader

Predugo; Citati

Ako ste ikada pokušali da radite igru sa AI-om u razgovoru, znate koliko brzo može izaći s pruga.Nadamo se da pružanjem odgovarajućeg konteksta, specifičnih uputa i strukturiranih poziva funkcija podataka možemo dobiti iskustvo koje je ugodno.
featured image - Može li AI pokrenuti vašu sljedeću D&D igru? Ovaj projekt ima za cilj da sazna
John Polacek HackerNoon profile picture

Razmišljao sam o stvaranju multiplayer RPG web platforme od mojih dana kao Flash developer.

Jeste li videliOvaj videogde Deborah Ann Woll pokazuje Jon Bernthal kako igrati D&D? (ima 2M pogleda!)

To je bilo tako cool.Šta ako bih mogao napraviti nešto što se tako osjeća?

Ideja

Narativno orijentirana, multiplayer online rpg platforma, lagana na pravilima, ali visoka na zajedničkom pričanju priče, sa rezultatima određenim rolom D20.

Uvek sam volioD&D moduliDetaljni susreti i epske priče planiraju da igrači otkriju kako njihovi likovi kreću putem do klimatskog finala.

Što ako bih mogao stvoriti način za ljude da naprave svoje avanture module, za bilo koji RPG žanr, a zatim dozvoliti igračima da voze svoje likove kroz te avanture?

Landing Page for D20Adventures.com


Ko bi pokrenuo igre, međutim? Igra majstori su teško naći. Šta ako bih mogao obučiti AI da bude majstor igre? da zapravo pokrenu dobro strukturiran plan avanture (dizajniran od strane čoveka!) koji bi bio zabavan za igrače, a ne samo gomilaUslovi?

Početak

Ja sam uživao u izgradnji puno stvari s AI (vidiMoj projekt započinjeJa ću koristiti svoj omiljeni stack za izraduD20Adventures.com sajtovi, web aplikacija Next.js sa Tailwind za UI (treba li čak i reći?)Za SDKkorišćenje Gemini i aConvex baza podatakaPrebacivanje u Vercel.

I odlučio sam da ga izgradim u otvorenom, objavljujući kodUpoznajte GitHub.

Proizvodnja prototipa

Za prototip, ja sam doslovno počevši od scenarija postavljenog na podcastu, ranger hoda kroz šumu noću čuje pukotinu u daljini, što se ispostavlja da je medvjed.

Moj cilj je da izgradim kratku avanturu na jedan udarac i vidim da li mogu obučiti AI DM da zapravo pokrenem malu seriju okretaja i susreta za ovu avanturu.

Misteriozni pozivi starog druidskog prijatelja privlače zatvorenog rangera u divljinu šume Valkarr.

The Midnight SummonsTajanstven poziv starog druidskog prijatelja privlači zatvorenog rangera u divljinu Valkarrskog šuma.

Nakon mnogo pokušaja i pogrešaka, konačno sam mogao napraviti punu igru i objaviti je na YouTube-u:

Kako funkcioniše

Landing Page

Slijedeća stranica je slika velikog junaka (generirana na Midjourney-u s pozivom na "The Power of the D20"). dodala sam neke jednostavne bljeskove u animaciji koristeći novo CSS @starting-style pravilo:

.fade-in {
  @apply opacity-100 transition-opacity duration-1000 ease-in-out;
  @starting-style {
    opacity: 0;
  }
}

Authentication

Da biste igrali Quick Start, potreban mi je korisnički nalog.To je da se izbegne naplaćivanje puno novca zbog anonimnih ljudi ili robota koji koriste moje API-je.Klerikčini vrlo jednostavnim dodavanje upravljanja korisnicima, a ja ih koristim na svim svojim projektima.

Osim toga, imam praćenje upotrebe žetona gde ću ograničiti upotrebu sa sistemom žetona, gde ćete početi s dovoljno žetona da napravite jednu igru kroz demo, a zatim možete kupiti više dok idete.

The First Turn

Kada korisnik sleti na stranicu avanture za brz početak, prva stvar koja se dogodi je da učitamo podatke za demo avanturu, što je samo jednostavna JSON datoteka (Ovako ovoModul ili plan avanture u mom sistemu sastoji se od niza susreta, koji su međusobno povezani uputama za LLM:

"encounters": [
  {
    "id": "broken-silence",
    "title": "Broken Silence",
    "intro": "Thalbern, a solitary ranger of the Valkarr woods, has always trusted the silence of the wilds more than the promises of men. Orphaned by border raiders and raised by the elves of the Valkrarr Forest, he has spent years living on the edge of Kordavos, guiding travelers, hunting for his own survival, and keeping his distance from the tangled politics of the city.\n\nYet on this night, a message delivered by a red squirrel bearing the unmistakable script of Wollandora, a trusted elven friend and druid, has drawn him from his hidden home. The note was simple and urgent: Meet me at the Old Standing Stones at midnight. The balance of the forest could depend on it.\n\nNow, as midnight approaches, Thalbern moves quietly through the dense undergrowth, guided by memory and instinct. It is dark with almost no moonlight coming through the forest canopy.\n\nSuddenly, the hush of the night is broken by a sharp crack. Something large has just stepped on a branch somewhere off in the distance.",
    "instructions": "A perception check is appropriate if Thalbern investigates (low difficulty with a plus 3 modifier). If successful, he will determine it is a large creature that is approaching quickly. With a high roll (18+), he will determine it is an Owlbear. If combat ensues and Thalbern is below 25% health, Wollandora will intervene. If Thalbern avoids or defeats the Owlbear, or if Wollandora saves him, he proceeds to the Old Standing Stones.",
    "image": "images/settings/realm-of-myr/the-midnight-summons/broken-silence-2.png",
    "transitions": [
      {
        "condition": "If Thalbern successfully uses stealth to evade and proceeds cautiously towards the Standing Stones, go to meeting-at-stones.",
        "encounter": "meeting-at-stones"
      },
      {
        "condition": "If Thalbern fails a perception check, advance to owlbear-confrontation.",
        "encounter": "owlbear-confrontation"
      },
      {
        "condition": "If Thalbern fails any dice roll (including stealth, perception, or any other check), advance to owlbear-confrontation.",
        "encounter": "owlbear-confrontation"
      },
      {
        "condition": "If Thalbern does NOT successfully use stealth to evade, go to owlbear-confrontation.",
        "encounter": "owlbear-confrontation"
      },
      {
        "condition": "If Thalbern does nothing or takes no action, go to owlbear-confrontation.",
        "encounter": "owlbear-confrontation"
      },
      {
        "condition": "If Thalbern has a healthPercent of less than 50%, go to wollandora-intervention.",
        "encounter": "wollandora-intervention"
      }
    ]
  },
  {
    "id": "owlbear-confrontation",
    "title": "Owlbear Confrontation",
    "intro": "From the direction of the sound, a little bit of eye shine glints in the shadows of the tree line. A hulking fifteen foot tall monster with the body of a giant bear and the head of an owl. As it crashes out from the undergrowth, it lets out a guttural squawk, clearly agitated and territorial.",
    "instructions": "The Owlbear will attack. If Thalbern attempts an animal handling check (high difficulty) and succeeds, he can move past the Owlbear. If Thalbern wins initiative and attempts to hide, he can move past the Owlbear if he passes a medium difficulty stealth check. If Thalbern's health drops to a critical level, Wollandora appears and drives off the Owlbear, transitioning to 'wollandora-intervention'. If Thalbern defeats the Owlbear, describe his victory and transition to 'meeting-at-stones'.",
    "image": "images/settings/realm-of-myr/the-midnight-summons/owlbear-confrontation.png",
    "npc": [
      {
        "id": "owlbear",
        "behavior": "Aggressively attacks any perceived threat. Will fight until heavily wounded or driven off.",
        "initialInitiative": 1
      }
    ],
    "transitions": [
      {
        "condition": "Thalbern defeats the Owlbear, manages to evade it, successfully uses Animal Handling to pacify and move past it, or successfully rolls any other way to move past it.",
        "encounter": "meeting-at-stones"
      },
      {
        "condition": "Thalbern is reduced to critical health by the Owlbear.",
        "encounter": "timely-rescue"
      }
    ]
  },
  ...
]

The First Reply

Budući da smo u demo režimu, ne postoji stvarna avantura stvorena još na pozadini. To se događa kada igrač daje prvi odgovor.formatNarrativeActionfunkcija koja koristi AI za evaluaciju odgovora kako bi se osiguralo da je gramatički ispravan, u trećem licu i dodaje dijalog ili drugu prozu kako bi dobro funkcionisao u književnom narativnom stilu.

Nakon što je formatiranje primijenjeno, odgovor se šalje na akciju servera. Budući da je ovo demo, mi stvaramo avanturu u bazi podataka kada je ovaj prvi odgovor primljen.

Processing Player Responses

NašiprocessTurnReplyfunkcija unosi trenutni krug iz konvexa, podatke o avanturi iz S3, i identificira specifičan susret i lik koji obavlja akciju.

S ovim kontekstom, onda koristi AI da utvrdi da li je akcija je vjerodostojna (moj sin kada igra testiranje je imao ranger lansiranje nuklearne na ovn medvjed) i, ako je tako, da li je kockica roll je mehanički potreban (npr, "Attack Roll" ili "Stealth Check"), uključujući vrstu valjka i njegovu težinu.

To možemo učiniti pozivanjem funkcije, gde možemo odrediti AI-u da želimo da se strukturirani podaci vrate, u ovom slučajurollRequirementSchema:

import { z } from "zod";

export const rollRequirementSchema = z.union([
  z.object({
    rollType: z.string().describe("The type of roll required, e.g. 'Stealth Check'"),
    difficulty: z.number().describe("The difficulty class (DC) for the roll"),
    modifier: z.number().optional().describe("Bonus or penalty to the roll, e.g. +2 or -1"),
  }),
  z.null()
]);

export type RollRequirement = z.infer<typeof rollRequirementSchema>;

Zatim imamo funkciju koja šalje detaljan poziv i shemu nagenerateObject:

export async function getRollRequirementForAction(action: string) {
  const prompt = `
Given the following player or NPC action, determine if a dice roll is required for the character to attempt the action. If a roll is required, return a JSON object with "rollType" (choose the most appropriate from the list below) and "difficulty" (a number between 5 and 25). If no roll is required, return the JSON value null (not a string).

Possible roll types:
- Perception Check
- Investigation Check
- Insight Check
- Stealth Check
...

Examples:
Action: "Try to sneak past the guards."
Result: { "rollType": "Stealth Check", "difficulty": 15 }

Action: "Attack the goblin."
Result: { "rollType": "Attack Roll", "difficulty": 12 }

Action: "Try to determine what the sound is."
Result: { "rollType": "Perception Check", "difficulty": 10 }

Action: "Say hello."
Result: null

Now, given the following action, determine the roll requirement.

Action: "${action}"
`;
  try {
    const result = await generateObject({
      schema: rollRequirementSchema,
      prompt,
    });
    if (
      result.object &&
      typeof result.object === "object" &&
      "rollType" in result.object &&
      (result.object.rollType === "null" || result.object.rollType === "none" || result.object.rollType === "")
    ) {
      return null;
    }
    return result.object ?? null;
  } catch (error) {
    throw error;
  }
}

Nakon pričvršćivanja odgovora igrača na priču o krugu, ako je potreban krug kockica, ažuriramo stanje likova u konveksnim podacima kruga kako bismo odrazili da su odgovorili, ali njihov krug nije završen.

Dice Roll needed for Thalbern the Ranger’s Perception Check. Roll a D20

Jednom kada korisnik rolls, imamoresolvePlayerRollResultserver akcija koja ažurira pripovijed sa vizualnim prikazom rezultata i piše prozu opisujući ishod.Takođe imamo još jedan poziv funkcije AI za ažuriranje zdravlja i statusa za sve znakove u krugu.

Owlbear Confrontation Turn. The Owlbear rolled a 14 for a successful attack on Thalbern the Ranger

NPC Actions

Kada se NPC-ovi okreću da odgovore, slijedimo sličan uzorak kao igrač, osim u ovom slučaju AI će napisati odgovor.Svaki susret uključuje informacije o motivaciji NPC-ova i kada se kombinira sa kontekstom priče o avanturi do sada, nadam se da AI može generisati dobar odgovor, a zatim generisati vlastite kockice roll i ishod ažuriranja.

Training AI to Run RPGs

Ako ste ikada pokušali da radite igru sa AI-om u razgovoru, znate koliko brzo može otići s pruga.

Nadam se da će pružanjem odgovarajućeg konteksta, specifičnih uputa i strukturiranih poziva na funkcije podataka, dobiti iskustvo koje je ugodno.

Na primer, kada sam pitao zašto AI nije slijedio upute za susret u jednom od mojih testova, ovo je ono što mi je Cursor chat morao reći:

Ukratko, LLM nije slijedio svoje eksplicitne upute za tranziciju kada lik ne prođe kontrolu percepcije, uprkos tome što je pružao jasne dokaze o takvom neuspehu i pravilo tranzicije za taj specifičan scenarij.

Ukratko, LLM nije slijedio svoje eksplicitne upute za tranziciju kada lik ne prođe kontrolu percepcije, uprkos tome što je pružao jasne dokaze o takvom neuspehu i pravilo tranzicije za taj specifičan scenarij.

Pretpostavljam da slučajnost AI-a koji ne radi točno ono što se očekuje može biti deo zabave.

Evo jednog primera oJedna od igrališnih sesija.

Cijeli izvorni kod ovog projekta možete pogledati nagithub.com/d20adventures.com Uslovi korišćenja

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks