Oppure

Loading
21/03 9:21
Thejuster
Buongiorno ragazzi, anche se dal titolo può sembrare una cosa abbastanza banale da risolvere,
ci sto da mesi sopra senza aver trovato ancora una soluzione.

Da solo su 40.000 righe di codice, e probabile confondersi. Magari con l'aiuto di più cervelli riesco a trovare una soluzione.
Vi spiego il problema.

Ho interprete di codice, l'ho chiamato ComCode che sarebbe un semplice interprete lineare.

{comando} [spazio] {variable} [operazione] {spazio} [valore]

il problema non è nell'interprete, ma come gestire uno script.
Per maggiori dettagli questi sono i Token utilizzabili

internal enum TokenType
    {
        Identifier,
        Integer,
        Float,
        Boolean,
        String,
        Equals,
        NotEquals,
        Greater,
        Less,
        INCLUDE,
        SETGLOBAL,
        SET,
        ADD,
        SUBTRACT,
        MULTIPLY,
        DIVIDE,
        TO,
        FROM,
        BY,
        IF,
        THEN,
        ELSE,
        ENDIF,
        WHILE,
        ENDWHILE,
        CALL,
        BLOCK,
        ENDBLOCK,
        YIELD
    }


il problema riguarda lo sviluppo di uno script.
Gli script non possono essere gestiti uno alla volta ma devono essere gestiti tutti assieme,
questo perché nel mio motore Mire Engine al metodo update, vanno ciclati tutti gli NPC che contengono questi script.
Il tutto funziona regolarmente, ma ho problemi quando provo a mostrare un dialogo.


il codice del dialogo è questo in C# per gestire alcuni comandi


void update()
{

  //........

else if (strCommand == "SayNPC")  //Se in un script è presente la riga SayNPC
                  {
                      if (!Other_NPCTALK)  //Se qualche altro NPC sta parlando
                      { 
                          Talking_Message = (String)listParameters[0]; //testo del messaggio ricavato dai parametri
                          talking = true;  //sta parlando

                          Talk((string)listParameters[0]);  //Mostra la grafica con la stringa
                      }

                     
                  }
                  else if (strCommand == "WaitKey") //attendi un tasto
                  {
                      if (Input.Keyboard.GetState().IsKeyDown(Input.Keys.Enter))
                      {
                          talking = false; //sta parlando 
                          scriptContext.GlobalVariables["dialog"] = false; //imposta la variabile nello script dialog su false
                          Other_NPCTALK = false; //altri npc parlano false
                          Thread.Sleep(100); //pausa
                      }
                  }

}




Gli NPC hanno uno script loro, quindi presumiamo che per ogni scena ci siano almeno 10 / 11 npc devono funzionare
tutti contemporaneamente e ed essere interpretati tutti assieme allo stesso momento. in più hanno posso accedere tutti a delle variabili che nello script vengono dichiarate come SETGLOBAL

dunque vi spiego nel dettaglio cosa succede.

1)
Dall'editor creo un evento facendo doppio click in un area

i.ibb.co/qWZqS6z/…




2) Creo un semplice dialogo tipo ciao pierotofy

i.ibb.co/JQ2FY64/…


3) Salvando la mappa di gioco attuale, entra il comcode in azione generando uno script

 //ComCode Basic
            ComCode2.Add("SETGLOBAL Down  TO \"Down\"");
            ComCode2.Add("SETGLOBAL Left  TO \"Left\"");
            ComCode2.Add("SETGLOBAL Right TO \"Right\"");
            ComCode2.Add("SETGLOBAL Up    TO \"Up\"");
            ComCode2.Add("SETGLOBAL dialog TO FALSE");     //variable del Dialogo
            

            ComCode2.Add("SETGLOBAL MoveDown TO \"MoveDown\"");
            ComCode2.Add("SETGLOBAL MoveUp TO \"MoveUp\"");
            ComCode2.Add("SETGLOBAL MoveRight TO \"MoveRight\"");
            ComCode2.Add("SETGLOBAL MoveLeft TO \"MoveLeft\"");


            ComCode2.Add(string.Format("SetNPCPosition {0} {1}", evx, evy));
            ComCode2.Add("WaitKey");

            List<string> temp = ReturnComCode();

            for (int i = 0; i < temp.Count; i++)
            {
                if (temp[i].Contains("\n"))
                    temp[i] = temp[i].Replace("\n", "");

                if (temp[i].Contains("-"))
                {
                    string[] t = temp[i].Split('-');
                    foreach (string s in t)
                    {
                        ComCode2.Add(s);
                    }
                }

                if (temp[i].ToLower().Contains("saynpc"))
                {
                    ComCode2.Add("SET dialog TO TRUE");
                    ComCode2.Add(temp[i]);
                    ComCode2.Add("WHILE dialog = TRUE");
                    ComCode2.Add("WaitKey");
                    ComCode2.Add("YIELD");
                    ComCode2.Add("ENDWHILE");

                }


I Comandi SayNPC e Waitkey li trovate sopra,
in seguito salvo e faccio partire,

Normalmente, il while è settato su FALSE nelle dichiarazioni delle variabili in alto.
Ma se notate, prima della funzione SayNPC c'è il Waitkey che dovrebbe attendere prima la pressione di un tasto,
e poi in seguito continuare andando in while.
Premendo enter esempio, la funzione in C# attiva la variabile dell'npc su True azionando il while.

al fine di ottenere lo script in un qualcosa del genere


SETGLOBAL Down  TO "Down"
SETGLOBAL Left  TO "Left"
SETGLOBAL Right TO "Right"
SETGLOBAL Up    TO "Up"
SETGLOBAL dialog TO FALSE  //variabile del dialogo

SetNPCPosition 224 224

SET dialog TO TRUE
SayNPC "ciao pierotofy"

WHILE dialog = TRUE
WaitKey
YIELD
ENDWHILE



ma cosa succede?

Appena avvio il client di gioco ecco cusa accade

i.ibb.co/QkKFTxH/…
il messaggio appare all'istante ignorando completamente ciò che avevo scritto nel while.
e non sò come risolvere questo problema perché lo script Apparentemente "sembra corretto"
o forse sbaglio qualcosa non saprei.

ma posso assicurare che l'interprete funziona alla perfezione, non ha nessun errore e con altre istruzioni
che non sia il dialogo funziona a meraviglia.

Magari è proprio il metodo del dialogo impostato sbagliato, avete idee o consigli? :d


Ecco il video per vedere cosa succede
mediafire.com/file/g1kupxwzop6udub/bandicam_2021-03-21_10-33-55-572.mp4/…
Ultima modifica effettuata da Thejuster 21/03 9:32
mire.forumfree.it/ - Mire Engine