Lingara Lingara Belge Rêbername API Pirtûkxane Sepan Avakirin Bicihkirin Sepana webê
Ziman: Kurdî

Diyaloga NPC

Ev rûpel ji Îngilîzî hatiye wergerandin. Heke her du ji hev cuda bin, rûpela Îngilîzî rast e. Rûpela Îngilîzî bixwîne

Karakterek di lîstika te de dikare bi lîstikvan re bi wî zimanî biaxive ku ew hîn dibe, li gorî asta wî. Her rêzika ku lîstikvan dibêje dorek e: kîta lîstikvan wê dişîne, û bersiva karakterî bi perçeyan vedigere.

Dorek çi hildigire

Her dor hemû tiştên ku karakter hewce dike dişîne, ji ber ku Lingara di navbera doran de tu axaftinê nagire:

  • npc: kî diaxive. name-a wê ji 1 heta 32 tîpan e, û persona-ya wê ya vebijarkî rêzikeke ravekirinê ye, ji 1 heta 120 tîpan, wek “firoşkarekî dumplingan”.
  • scene: vebijarkî, cihê ku axaftin lê diqewime, ji 1 heta 160 tîpan.
  • source_lang û target_lang: zimanê lîstikvan bi xwe û yê ku ew hîn dibe. Divê ew ji hev cuda bin, û karakter tenê bi target_lang diaxive.
  • level: asta lîstikvan, ji 1 heta 9. Rêbera Lingara “Ast tê çi wateyê” pîvanê rave dike.
  • line: tiştê ku lîstikvan nû got, ji 1 heta 500 tîpan.
  • history: axaftina heta niha, ya herî kevn pêşî, herî zêde 12 rêzik. Her rêzik xwedî speaker e, an player an npc, û text-a xwe, ji 1 heta 500 tîpan.

Her nivîs tenê rêzikek e. Lîstika te axaftinê digire: kîta lîstikvan ji bo her diyaloga ku tu vedikî pencereyê digire, her dora temamkirî lê zêde dike, her bersivê heta 500 tîpên wê yên pêşîn kurt dike, û rêzikên herî kevn ên ji 12 zêdetir davêje.

Lingara persona û dîmenê wek nivîsa ne-pêbawer a ji lîstika te dibîne. Ew şêwaza axaftina karakterî diyar dikin, qet ne tiştê ku destûr heye ew bike.

Bersiv çawa digihîje

Bersiv wek perçeyên nivîsê bi perçeyan tê, ku lîstika te wan dema digihîjin li dû hev zêde dike. Di navbera wan de dibe ku agahdariyek were, wek yek ku dibêje bersiv hate qutkirin. Dor bi done diqede dema ku bersiv temam be, an bi error dema ku têk çûbe. Dorek nayê domandin: heke girêdan biqete, lîstikvan rêzikê dîsa dibêje.

Ji her karakterî re di carekê de rêzikek bêje. Rêzika ku dema karakter hîn bersiv dide tê gotin tê redkirin, ne ku têxe rêzê, ji ber ku her dor tê hesabkirin.

Kî didê

Tenê lîstikvanên klientekî li ser plana pîvandî dikarin axaftinê bikin, û her dor li ser wî klientî tê hesabkirin. Tokena lîstikvanekî embed:play hewce dike.

Zimanê mînaka kodê

Bevy

fn spawn_seller(mut commands: Commands) {
    let mei = NpcDialogue::new("Mei", "zh", 2)
        .and_then(|npc| npc.with_persona("a dumpling seller"))
        .and_then(|npc| npc.with_scene("the night market"))
        .expect("within Lingara's bounds");
    commands.spawn(mei);
    commands.spawn(Player);
}

/// One turn at a time: a line said while the NPC is replying is a `Busy` error.
fn talk(keys: Res<ButtonInput<KeyCode>>, npcs: Query<Entity, With<NpcDialogue>>, mut say: MessageWriter<NpcSay>) {
    if keys.just_pressed(KeyCode::Digit1) {
        for entity in &npcs {
            say.write(NpcSay { entity, line: "饺子多少钱?".into() });
        }
    }
}

/// `streaming` grows as the reply arrives; `turns` holds the finished ones.
fn show_reply(transcripts: Query<&NpcTranscript, Changed<NpcTranscript>>) {
    for transcript in &transcripts {
        if let Some(partial) = &transcript.streaming {
            info!("…{partial}");
        }
    }
}

Unity

public DialogueId OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level });

// The reply streams back as NpcTurn events: append each Fragment's text to your label.
public RequestId Say(DialogueId dialogue, string line) => Client.DialogueSay(dialogue, line);

Godot C#

public long OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level }).Value;

// The reply streams back as NpcTurnFragment signals, then one NpcTurnFinished.
public long Say(long dialogue, string line) => Client.DialogueSay(new DialogueId(dialogue), line).Value;

GDScript

# A LingaraNpc child per character: npc_name, target_lang and level in the
# inspector. say() returns false while a turn is in flight (turns are never
# queued, because each one is billed).
func talk_to_mei(line: String) -> void:
	if mei.say(line):
		bubble.text = "…"


func _on_mei_replied(text: String) -> void:
	bubble.text = text

Unreal C++

void ALingaraEmbedSnippetActor::Say(const FString& Line)
{
	ELingaraCallResult Result;
	FLingaraEmbedError Error;
	if (Dialogue == 0)
	{
		FLingaraDialogueConfig Config;
		Config.Npc.Name = TEXT("Mei");
		Config.Npc.Persona = TEXT("a tea seller at the night market");
		Config.SourceLang = TEXT("en");
		Config.TargetLang = TEXT("zh");
		Config.Level = 2;
		Dialogue = Lingara()->DialogueOpen(Config, Result, Error);
	}
	Reply.Reset();
	Lingara()->DialogueSay(Dialogue, Line, Result, Error);
}

// The reply streams back as npc_turn events: append each fragment.
void ALingaraEmbedSnippetActor::HandleNpcTurn(const FLingaraNpcTurn& Turn)
{
	if (Turn.Dialogue == Dialogue && Turn.Update.Type == ELingaraNpcTurnUpdateType::Fragment)
	{
		Reply += Turn.Update.Text;
	}
}

Kotlin

fun talkToMei(line: String) {
    val dialogue = npc ?: lingara.dialogueOpen(DialogueConfig(Npc("Mei", "a tea seller"), "the tea house", "en", "zh", 2, emptyList()))
    npc = dialogue
    lingara.dialogueSay(dialogue, line)
}

private fun onNpcTurn(update: NpcTurnUpdate) {
    when (update) {
        is NpcTurnUpdate.Opened -> bubble = ""
        is NpcTurnUpdate.Fragment -> bubble += update.text
        is NpcTurnUpdate.Finished -> bubble = update.text
        else -> Unit
    }
}

Java

void talkToMei(String line) {
  if (npc < 0) {
    Npc mei = new Npc("Mei", "a tea seller");
    npc =
        lingara.dialogueOpen(new DialogueConfig(mei, "the tea house", "en", "zh", 2, List.of()));
  }
  lingara.dialogueSay(npc, line);
}

void onNpcTurn(EmbedEvent.NpcTurn turn) {
  if (turn.getUpdate() instanceof NpcTurnUpdate.Fragment fragment) {
    bubble.append(fragment.getText());
  } else if (turn.getUpdate() instanceof NpcTurnUpdate.Finished finished) {
    bubble.setLength(0);
    bubble.append(finished.getText());
  }
}

Herwiha binêre