Ninafikiri juu ya kufanya multiplayer RPG jukwaa la wavuti tangu siku zangu kama maendeleo ya Flash. Kuna chaguzi nyingi za TTRPG mtandaoni huko nje (mara nyingi nzuri!) lakini hakuna kati yao ilihisi sahihi kabisa kwa jinsi ningependa kucheza.
Umewahi kuonaVideo yaambapo Deborah Ann Woll inaonyesha Jon Bernthal jinsi ya kucheza D & D? (una maoni ya 2M!)
Hiyo ilikuwa ya kuvutia sana. nini kama ningeweza kufanya kitu ambacho kinahisi kama hicho?
Wazo la
Mfumo wa multiplayer online rpg unaoongozwa na hadithi, mwanga juu ya sheria lakini juu ya kushirikiana na hadithi, na matokeo yanategemea roll ya D20.
Nimekuwa daima upendoModuli ya D & DMaonyesho ya kuvutia. mikutano ya kina na mipango ya hadithi ya kigaidi kwa wachezaji kufichua kama wahusika wao hufanya njia yao kwa ajili ya mwisho wa hali ya hewa.
Nini kama ningeweza kuunda njia kwa watu kufanya modules zao wenyewe adventure, kwa genre yoyote ya RPG, kisha kuruhusu wachezaji kuendesha wahusika wao kupitia adventures hizo?
Nani angeweza kuendesha michezo? masters ya mchezo ni vigumu kupata. Nini kama ningeweza kufundisha AI kuwa mtaalamu wa mchezo? Kwa kweli kuendesha mpango mzuri wa adventure (iliyoundwa na mwanadamu!) ambayo ingekuwa furaha kwa wachezaji na sio tu kundi laMwisho wa Slop?
Kuanza kwa
Nimekuwa na furaha ya kujenga mambo mengi na AI (tazamaMpango wangu wa kuanzaMimi itakuwa kutumia kiungo changu favorite kufanyaMaelezo ya D20Adventures.com, Next.js programu ya wavuti na Tailwind kwa UI (unahitaji hata kusema?) kuendeshwa naya SDKkwa kutumia Gemini na aDatabase ya ConvexKuondoka kwa Vercel.
Na nimeamua kujenga kwa wazi, kuchapisha msimbokwa ajili ya GitHub.
ya prototype
Kwa ajili ya prototype, ninaanza kwa maneno kutoka kwa hali iliyoelezwa kwenye podcast, mlinzi anayeenda katika misitu usiku anasikia upungufu katika umbali, ambayo inaonekana kuwa nyoka.
Lengo langu ni kujenga adventure fupi ya moja na kuona kama ninaweza kufundisha DM ya AI kwa kweli kuendesha mfululizo mdogo wa kurudi na kukutana kwa adventure hii.
Maombi ya siri kutoka kwa rafiki wa zamani wa Druid huvutia ranger wa kujitolea katika jangwa la Valkarr.
The Midnight SummonsMaombi ya siri kutoka kwa rafiki wa zamani wa Druid huvutia mlinzi wa kujitolea katika jangwa la Valkarr.
Baada ya majaribio mengi na makosa, hatimaye niliweza kufanya mchezo kamili na kuchapisha kwenye YouTube:
Jinsi ya kufanya kazi
Landing Page
Ukurasa wa kuelekea ni picha kubwa ya shujaa (iliyoundwa kwenye Midjourney na mwongozo wa "Uwezeshaji wa D20"). Niliongeza fade rahisi katika animation kwa kutumia sheria mpya ya CSS @starting-style:
.fade-in {
@apply opacity-100 transition-opacity duration-1000 ease-in-out;
@starting-style {
opacity: 0;
}
}
Authentication
Ili kucheza kuanza haraka, ninahitaji akaunti ya mtumiaji. Hii ni ili kuepuka kuwa na malipo mengi kwa sababu ya watu wasiojulikana au bots kutumia API zangu.Maafisa wainafanya kuwa rahisi sana kuongeza usimamizi wa watumiaji, na ninatumia kwenye miradi yangu yote.
Zaidi ya hayo, nina ufuatiliaji wa matumizi ya token ambapo nitapunguza matumizi na mfumo wa token, ambapo unaweza kuanza na tokens nyingi kufanya moja kucheza kupitia demo, kisha unaweza kununua zaidi kama wewe kwenda.
The First Turn
Wakati mtumiaji anakuja kwenye ukurasa wa adventure kwa kuanza haraka, jambo la kwanza ambalo linatokea ni kupakia data kwa adventure ya demo, ambayo ni faili rahisi ya JSON (Kama hii yaModuli ya adventure au mpango katika mfumo wangu unajumuisha mfululizo wa mahojiano, ambayo yanahusiana na maelekezo kwa ajili ya 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
Kwa kuwa sisi ni katika mode demo, hakuna adventure halisi iliyoundwa bado katika backend. Hii hutokea wakati mchezaji anatoa jibu la kwanza.formatNarrativeAction
kazi ambayo inatumia AI kutathmini jibu ili kuhakikisha kwamba ni sahihi kielelezo, katika mtu wa tatu na kuongeza mazungumzo au prose nyingine ili kufanya kazi vizuri katika mtindo wa hadithi ya kitabu.
Baada ya kutumika muundo, majibu inatumwa kwa hatua ya seva. Kwa sababu hii ni demo, sisi ni kuunda adventure katika database wakati majibu hii ya kwanza ni kupokea. Baada ya hii imekamilika, itakuwa kufuata mtiririko wa kawaida kwa usindikaji wa majibu ya mchezaji.
Processing Player Responses
yaprocessTurnReply
kazi inachukua mzunguko wa sasa kutoka Convex, data ya adventure kutoka S3, na inatambua mkutano maalum na tabia inayofanya hatua.
Kwa mtazamo huu, kisha hutumia AI ili kuamua kama hatua ni ya kuaminika (mwana wangu wakati wa mtihani wa kucheza alikuwa na ranger kushusha nuke kwenye owlbear) na, ikiwa ni hivyo, kama dice roll inahitajika kimwili (kwa mfano, "Attack Roll" au "Stealth Check"), ikiwa ni pamoja na aina ya roll na ugumu wake.
Tunaweza kufanya hivyo kwa wito wa kazi, ambapo tunaweza kufafanua AI kwamba tunataka data iliyoundwa kurudi, katika kesi hii arollRequirementSchema
:
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>;
Kisha tuna kazi ambayo inatuma mwongozo wa kina na mpango wagenerateObject
:
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;
}
}
Baada ya kuunganisha majibu ya mchezaji kwenye hadithi ya turn, ikiwa roll ya dogo inahitajika, tunakaribisha hali ya tabia katika data ya turn ya Convex ili kuonyesha kwamba walijibu lakini turn yao haina kamili. update hii husababisha update ya wakati halisi kwenye UI kuonyesha maelezo ya roll na kumpa mchezaji kifungo cha roll D20.
Mara baada ya mtumiaji rolls, tunaresolvePlayerRollResult
server hatua ambayo update hadithi na kuonyesha visual ya matokeo na kuandika prosa kuelezea matokeo. Tuna pia simu nyingine kazi ya AI update afya na hali ya wahusika wote katika mzunguko.
NPC Actions
Wakati ni NPCs kurudi kujibu, sisi kufuata mfano sawa kama mchezaji, isipokuwa katika kesi hii AI itakuwa kuandika majibu. Kila mkutano ni pamoja na habari kuhusu motisha ya NPCs na wakati pamoja na mazingira ya hadithi ya adventure hadi sasa, matumaini ya AI inaweza kuzalisha majibu mazuri, kisha kuzalisha risasi yake mwenyewe roll na matokeo update.
Training AI to Run RPGs
Ikiwa umewahi kujaribu kufanya kikao cha mchezo na AI katika mazungumzo, unajua jinsi ya haraka inaweza kutoweka.
Ni matumaini kwamba kwa kutoa mazingira sahihi, maelekezo maalum ya haraka na wito wa kazi ya data iliyoundwa, tunaweza kupata uzoefu unaofurahia.
Kuna hakika mengi ya majaribio na makosa, kumbukumbu ya console na tweaking ya haraka. Kwa mfano, wakati wa kuuliza kwa nini AI haikufuata maelekezo ya kukutana katika moja ya majaribio yangu, hii ni nini mazungumzo ya Cursor yalikuwa na kusema kwangu:
Kwa muhtasari, LLM hakufuata maelekezo yake ya wazi ya mpito wakati tabia haina uchunguzi wa ufahamu, licha ya kuwa na ushahidi wazi wa kushindwa na sheria ya mpito kwa hali hiyo maalum.
Kwa muhtasari, LLM hakufuata maelekezo yake ya wazi ya mpito wakati tabia haina uchunguzi wa ufahamu, licha ya kuwa na ushahidi wazi wa kushindwa na sheria ya mpito kwa hali hiyo maalum.
Nadhani randomness ya AI si kufanya hasa kile kinachotarajiwa inaweza kuwa sehemu ya burudani.
Hapa ni mfano waMoja ya mikutano ya mchezo.
Unaweza kuona msimbo kamili wa mradi huu kwenyeGithub.com / mke wa kike / d20adventures.com