Please login or register.

Login with username, password and session length
Advanced search  

News:

This forum provides RSS feed. To query recent posts use this url. More...


Author Topic: Rozhovory  (Read 4104 times)

0 Members and 1 Guest are viewing this topic.

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Rozhovory
« on: September 30, 2006, 02:33:07 PM »

Tak prubnu ještě napsat o jednom problému. Snad mi ještě po tom posledním faux-paux někdo poradí  ;D Budu se to snažit popsat co nejlíp, i když to bude možná problém. Můj problém se týká rozhovrů. Docela sem se na tom zasek, tak snad se najde někdo, kdo už to vyřešil.

Tak tedy. Když hráč přijde k nějaké osobě ve scéně, tak s ní založí rozhovor. Má nějaký seznam témat, o kterých chce s danou osobou mluvit. Všechny témata se zobrazí pouze jednou, jakmile se prohovoří, tak zmizí z kecboxu, krom posledního. To poslední je vždycky něco jako "nashledanou" a může se jím kdykoliv ukončit rozhovor. A já potřebuju, aby se "nashledanou" objevovalo pouze po dobu, kdy ještě bude v kecboxu nějaké téma. Jakmile už nebude žádné téma k rozhovoru, tak se skončí normálně pomocí "nashledanou" a při dalším pokusu o rozhovor s toutéž osobou by se mělo zobrazit něco jako "nemam si s ním co říct". V průběhu následující hry se ale vlivem nějaké události může stát, že přibyde k rozhovoru se zmi
Logged

hanser

  • Regular poster
  • ***
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 216
  • Life is yet simple - over and over...
    • View Profile
    • First Reality developers studio
Re: Rozhovory
« Reply #1 on: September 30, 2006, 03:22:25 PM »

Myslím, že jsi to popsal dobře, ale problém bude, že poradit tady nebude snadné. Všechno tohle musíš vyřešit nějakým systémem podmínek.

Když chceš, aby se ti zobrazila nějaká otázka jen jednou, tak to uděláš příkazem:

Game.AddResponseOnce - zobrazí otázku pouze jednou, při každem zobrazení ResponseBoxu
Game.AddResponseOnceGame - zobrazí otázku pouze jednou za celou hru

..tohle je poměrně dobře vidět na wme demu - s menšími úpravami by to bylo stejné:
Code: [Select]
if (MameSiCoRict == true)   // jsou nejake otazky?
{
  if (UzSmeSpoluMluvili == true)   // pokud otazky jsou, bavili sme se uz spolu?
  {
    actor.Talk("Tak jsem tu zase!");
  }
  else
  {
    actor.Talk("Zdravim. My se jeste nezname.");   // ne, vidime se poprve
    UzSmeSpoluMluvili = true;   //ale ted uz se zname
  }
  SpustDialog();   //spustime nejaky dialog, treba pomoci funkce
}
else
{
  actor.Talk("Nemame se o cem bavit.");   //uz jsme se videli a neni o cem mluvit
}

Zbytek je už nutné ošetřit dalšími podmínkami v samotné funkci dialogu. Vždy když pak budeš chtít "zakázat" rozhovor s postavou, tak jednoduše změníš proměnnou MameSiCoRict na false.

Dodoručuju ti si pořídně prohlédnout WME demo a prosdudovat dokumentaci/wiki/celé fórum - jsem si jist, že toho o téhle problematice najdeš hafo ;)
Logged
Dobri umelci kopiruji, ti nejlepsi kradou.
- mj. Steve Jobs & Bill Gates

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5679
    • View Profile
    • Dead:Code Site
Re: Rozhovory
« Reply #2 on: September 30, 2006, 03:39:59 PM »

Ja myslim, ze pokud tu univerzalni odpoved tam budes mit vzdycky, staci ti testovat, jestli Game.GetNumResponses() je mensi nebo rovno jedne. To znamena, ze po vytrideni vybranych odpovedi zustala jedna (tj. jen to rozlouceni).

Code: [Select]
// ... naplneni odpovedi pomoci AddResponse*()

if(Game.GetNumResponses() <= 1) actor.Talk("Nemam si s nim co rict.");
else
{
  Res = Game.GetResponse();
  // ... zpracovani odpovedi
}

Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Re: Rozhovory
« Reply #3 on: October 01, 2006, 10:38:51 AM »

Díky za rady. Demo už sem projížděl, bez toho bych sem ani nelez  ;), ale tam rozhovory tímhle způsobem řešený nejsou. Pomocí GetNumResponses(), viz následující:
Code: [Select]
function DialogInit()
{
var Selected;

var QuitDialog=false;

while( !QuitDialog )
{
Game.AddResponseOnce( 0, "Kdy to poleví?" );
Game.AddResponseOnce( 1, "Musí to nějak jít!?" );
Game.AddResponseOnce( 2, "Musím se zeptat někoho místního." );

if (Chapter03.TryKey)
{
        Game.AddResponseOnce( 4, "Nemáte nějaký odmrazovací prostředek?" );
                          }
if (Game.GetNumResponses()>0)
{
                        Game.AddResponse( 3, "Nashledanou." );
}
else
{
Game.AddResponseOnce( 3, "Nashledanou 1." );
Message("Nemam si s nim co rict");

break;
}
.
.
.

Pokusim se popsat, co to ve výsledku dělá. Takže napřed to vloží daná témata do kecboxu. Následuje podmínka, která přidává téma do rozhovoru na základě splnění určitého úkolu v dalším průběhu hry. A pak testuju počet témat. Pokud jsou témata, vkládá se nahledanou. V tom zbytku to mam proto, aby se mi ještě před úplným ukončením zobrazilo naposledy nashledanou. To co napsal Mnemonic bude vypadat tak, že jakmile nebude žádný téma k rozhovoru, tak mi to rovnou vypíše "nemam si s nim co říct". Já to ale potřebuju tak, že se mi ještě zobrazí "nashledanou", abych se s nim rozloučil a AŽ při dalším pokusu o rozhovor se zobrazilo "nemam si s nim co říct".
Když se vrátím zpět k tomu kódu výše, tak popíšu výsledek. Jakmile neni co probírat, tak poslední věta rozhovoru je "Nemam si s nim co rict" (což by správně být nemělo) a rozhovor se ukončí. Pak když chci založím nový rozhovor, tak mi to vypíše to "nashledanou" 2x. Proto tam mam to "Nashledanou 1.", abych si je nějak rozlišil. Vypíše to v tomhle pořadí:
Nashledanou 1.
Nashledanou.
Když se v tuhle chvíli rozhovor ukončí a pokusim se založit novej, tak už je vše v pořádku a zobrazuje to jen to "nemam...". Napadá vás, kde by mohl být zakopanej pes? Díky.
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5679
    • View Profile
    • Dead:Code Site
Re: Rozhovory
« Reply #4 on: October 01, 2006, 11:29:32 AM »

Pokud mi neco zasadniho neunika, tak by melo fungovat tohle:

Code: [Select]
Game.AddResponseOnce( 0, "Kdy to poleví?" );
Game.AddResponseOnce( 1, "Musí to nějak jít!?" );
Game.AddResponseOnce( 2, "Musím se zeptat někoho místního." );

if (Chapter03.TryKey)
{
  Game.AddResponseOnce( 4, "Nemáte nějaký odmrazovací prostředek?" );
}
Game.AddResponse( 3, "Nashledanou." );

// pokud je v tuhle chvili jen jedna odpoved,
// zustalo nam jen "nashledanou" a koncime
if(Game.GetNumResponses()<=1)
{
  Message("Nemam si s nim co rict");
  break;
}
...
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Re: Rozhovory
« Reply #5 on: October 01, 2006, 07:01:09 PM »

Bohužel. Je to prakticky to stejny, co mam já. Výsledek je taktéž identický. Průběh je následující:
1. Založím rozhovor s danou osobou.
2. Projedu všechny možnosti a jakmile tam zůstane už poslední možnost spolu s "nashledanou" a já tu poslední možnost vyberu, tak jakmile se prohovoří a mělo by se tam zobrazit už jen "nashledanou", tak program to vyhodnotí tak, že už je jen jedna možnost (nashledanou) a "nemam si s nim co říct" se stane jakoby součástí rozhovoru. Prostě se zobrazí jako poslední věta rozhovoru.
3. Rozhovor je tedy ukončen.
4. Založim nový rozhovor.
5. Teď se mi ukáže "nashledanou" 2x
6. Vyberu jedno z nich, čímž se rozhovor ukončí.
7. Založím další rozhovor a odteď už to funguje normálně.

Možná by bylo nejlepší, kdybych poslal danej skript, ať si to vyzkoušíš sám, ať to vidíš na vlastní oči.
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5679
    • View Profile
    • Dead:Code Site
Re: Rozhovory
« Reply #6 on: October 02, 2006, 12:24:25 PM »

Jo aha, uz rozumim. Tak co treba takhle:
Ta funkce cela bezi v cyklu. Dokud hrac vybira odpovedi, tak se vzdycky ten cyklus zavola znovu, a predhodi dalsi odpovedi. Pokud bysme si interne pocitali, kolikrat ten cyklus uz probehnul, tak bysme vedeli, jestli se odpovedi nabizeji poprve (novy dialog), nebo po nekolikate. A podle toho se pak rozhodneme, jestli nabidneme tu odpoved "nashledanou", nebo proste jen suse oznamime, ze si s manikem nemame co rict. Dava to smysl?

Code: [Select]
function DialogInit()
{
  var Selected;

  var QuitDialog=false;
  var PocetPrubehu = 0;

  while( !QuitDialog )
  {
    PocetPrubehu = PocetPrubehu + 1;
   
    Game.AddResponseOnce( 0, "Kdy to poleví?" );
    Game.AddResponseOnce( 1, "Musí to nějak jít!?" );
    Game.AddResponseOnce( 2, "Musím se zeptat někoho místního." );
   
    if (Chapter03.TryKey)
    {
      Game.AddResponseOnce( 4, "Nemáte nějaký odmrazovací prostředek?" );
    }
    Game.AddResponse( 3, "Nashledanou." );
   
    // pokud je v tuhle chvili jen jedna odpoved,
    // zustalo nam jen "nashledanou" a koncime
    if(PocetPrubehu==1 && Game.GetNumResponses()<=1)
    {
      Message("Nemam si s nim co rict");
      break;
    }
   
    ...
   
  }
}
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Re: Rozhovory
« Reply #7 on: October 02, 2006, 05:52:28 PM »

Diky, diky!!! Tak prvni cast uz vali bez problemu  :D Bohuzel jakmile vycerpam moznosti rozhovoru (prvni tri vety) a pak behem hry je TryKey true, cimz pribyde do rozhovoru dalsi nove tema, a ja zacnu novy rozhovor, tak mam opet:
Nashledanou.
Nemáte nějaký odmrazovací prostředek?
Nashledanou.
Mozna sem uplne tupej, ale nejak mi porad neni jasny, z jakyho duvodu se tam to nashledanou zobrzuje a zobrazovalo vice nez jednou. Tim ze je to v cyklu to tak uplne presne neni, ne? To by se tam prece zobrazily vickrat i ty ostatni moznosti.

DIKY za trpelivost.
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5679
    • View Profile
    • Dead:Code Site
Re: Rozhovory
« Reply #8 on: October 02, 2006, 06:01:47 PM »

Aha, jasne. Potiz je v tom, ze jak se ten dialog ukonci predcasne (nezavola se vubec GetResponse()), tak tam ta jedna odpoved zustane viset. Chtelo by to na zacatku cyklu zavolat neco jako Game.ClearResponses(), kterazto funkce ale ve WME momentalne neni. Nu coz, tak ja ji pridam.
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Re: Rozhovory
« Reply #9 on: October 02, 2006, 11:58:48 PM »

No tak za tohle bych Te mel pozvat minimalne nekam na pivo  ::beer  To bys teda byl az neuveritelne hodnej  :)
A omlouvam se za ty preklepy v minulym prispevku. Asi sem to psal nejak ve spechu, ze sem si to po sobe ani nezkontroloval.
Logged

Mnemonic

  • WME developer
  • Administrator
  • Addicted to WME forum
  • *
  • Karma: 41
  • Offline Offline
  • Gender: Male
  • Posts: 5679
    • View Profile
    • Dead:Code Site
Re: Rozhovory
« Reply #10 on: October 03, 2006, 06:53:45 AM »

TADY je posledni build wme.exe, ktery uz umi metodu Game.ClearResponses(). Exe je na urovni WME 1.7 beta 1, takze bych doporucoval nejdrive upgradovat na tuto verzi a pak prehrat tohle nove wme.exe.
Logged
Yes, I do have a twitter account
Please don't send me technical questions in private messages, use the forum. ::wave

Hudlaiz

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Posts: 22
    • View Profile
Re: Rozhovory
« Reply #11 on: October 05, 2006, 08:42:25 AM »

Tak jeste jednou diky. Implementovano, odzkouseno, funguje! DIKY.
Logged
 

Page created in 0.157 seconds with 24 queries.