Προγραμματίζοντας τους διαλόγους

Οι διακλαδώσεις των διαλόγων μπορούν να προγραμματιστούν με τη χρήση λίγων μεθόδων. Στην αρχή πρέπει να ορίσετε τις πιθανές επιλογές διαλόγων με τη μέθοδοGame.AddResponse() που δέχεται ως παραμέτρους τον αριθμό της επιλογής και το κείμενο. Επιπλέον, αν προτιμάτε τους διαλόγους με εικονίδια, μπορείτε να ορίσετε τρία sprites σε κάθε πρόταση για απλό εικονίδιο, για όταν ο κέρσορας του ποντικιού είναι πάνω από το εικονίδιο και για όταν ο παίκτης επιλέγει την απάντηση.

₯ταν έχετε τελειώσει με αυτό το στάδιο πρέπει να καλέσετε την μέθοδο Game.GetResponse(). Αυτή θα εμφανίσει το πλαίσιο διαλόγου στην οθόνη με όλες τις πιθανές επιλογές για να διαλέξει ο παίκτης. Το script περιμένει εώς ότου κάνετε μία επιλογή και εν συνεχεία επιστρέφεται στη μηχανή ο αριθμός της επιλογής.

Ένα πολύ απλός κώδικας για διάλογο θα μοιάζει κάπως έτσι:

Game.AddResponse(0, "Γεια!.");
Game.AddResponse(1, "Πως είσαι;");
Game.AddResponse(2, "Πρέπει να φύγω. Τα λέμε.");

var Res = Game.GetResponse();

Ο κώδικας αυτός όμως είναι ουσιαστικά αχρείαστος καθώς στις περισσότερες περιπτώσεις θα θέλετε να ελέγξετε τον αριθμό της επιλογής και να προβείτε σε κάποιες ενέργειες. Επιπλέον θα θέλετε ο διάλογος να εμφανίζεται εώς ότου κάνετε κάποια επιλογή για έξοδο. Ο βελτιωμένος κώδικας θα μοιάζει κάπως έτσι:

function MyTestDialogue()
{
 var EndBranch = false;

 while(!EndBranch) // βρόχος μέχρι ο παίκτης να τερματίσει τον διάλογο
 {
 // ορίζονται οι απαντήσεις του διαλόγου
 Game.AddResponse(0, "Γεια!");
 Game.AddResponse(1, "Πως είσαι;");
 Game.AddResponse(2, "Πρέπει να φύγω. Τα λέμε.");

 // αφήνουμε τον παίκτη να επιλέξει ένα διάλογο
 var Res = Game.GetResponse();
 
 // ο χαρακτήρας λέει την επιλεγμένη πρόταση
 Game.GetResponseOnce
 actor.Talk(Game.LastResponse);

 // ο χειρισμός της επιλογής
 switch(Res)
 {
 case 0:
 // κώδικας που ελέγχει την απάντηση #0
 SomeGuy.Talk("Γεια!");
 break;

 case 1:
 // κώδικας που ελέγχει την απάντηση #1
 SomeGuy.Talk("Μια χαρά, ευχαριστώ!");
 break;

 case 2:
 SomeGuy.Talk("Γεια.");
 EndBranch = true; // η απάντηση #2 τερματίζει το διάλογο
 break;
 }
 }
}

Τώρα είναι λίγο πιο πολύπλοκο. Προσέξτε ότι ολόκληρος ο διάλογος είναι κλεισμένος σε μία συνάρτηση. Είναι μια καλή ιδέα να δημιουργήσετε μία συνάρτηση για κάθε παρακλάδι του διαλόγου ώστε να μπορείτε να καλείτε όποιο θέλετε από όποιο τμήμα και να είστε. Επιπλέον ο κώδικας θα διαβάζεται πιο εύκολα.

Στη συνέχεια προσθέσαμε μία γραμμή που οδηγεί τον χαρακτήρα να πει το επιλεγμένο κείμενο που αποθηκεύεται πάντα στην ιδιότητα Game.LastResponse.

Επιπλέον, τοποθετήσαμε τον κώδικα επιλογής διαλόγου σε ένα βρόχο while που επαναλαμβάνεται εώς ότου ο παίκτης επιλέξει τον τρίτο διάλογο.

Τέλος, προσθέσαμε τον κώδικα που χειρίζεται τις επιλογές του παίκτη. Η εντολή switch είναι μάλλον ο πιο βολικός και εύκολος τρόπος για να επιτευχθεί αυτό. Μπορείτε να χρησιμοποιήσετε τον παραπάνω κώδικα ως πρότυπο για να σχεδιάσετε τις δικές σας συναρτήσεις με διαλόγους.

Σε προσθήκη της απλής μεθόδου Game.AddResponse() η WME περιλαμβάνει επίσης και τις ειδικές παραλλαγές αυτής Game.AddResponseOnce() και Game.AddResponseOnceGame().

Η μέθοδος Game.AddResponseOnce() προσθέτει μία επιλογή διαλόγου που εξαφανίζεται από τη λίστα όταν επιλεγεί από τον παίκτη.

Η μέθοδος Game.AddResponseOnceGame() προσθέτει μία επιλογή διαλόγου που εξαφανίζεται από τη λίστα όταν επιλεγεί από τον παίκτη και δεν ξαναεμφανίζεται στο παιχνίδι.

Χρησιμοποιώντας αυτές τις δύο μεθόδους δεν χρειάζεται να γράψετε κώδικα που να ελέγχει αν ένας συγκεκριμένος διάλογος θα πρέπει να εμφανίζεται μόνο μία φορά. Η μηχανή θα θυμάται αυτόματα ποιες επιλογές έχει κάνει ο παίκτης και δεν θα τις εμφανίζει ή όχι.

Αν χρειαστεί να ξαναεμφανίσετε έναν κρυμμένο διάλογο χρησιμοποιήστε την μέθοδο Game.ResetResponse().

Ως επιπλέον λειτουργία, η μέθοδος Game.GetResponse() μπορεί προαιρετικά να δεχτεί μία λογική παράμετρο (αληθές - true ή ψευδές - false) που ορίζει τι θα γίνει αν έχει μείνει μόνο μία επιλογή διαλόγου στη λίστα. Αν δώσετε την παράμετρο true η μηχανή σε περίπτωση που έχει μείνει μόνο μία επιλογή θα την επιλέξει αυτόματα.

₯μως υπάρχει μία μικρή περιπλοκότητα. Για να να δουλέψει σωστά η μέθοδος Game.ΑddResponseOnce() πρέπει να ορίσετε ακριβώς που αρχίζει και που τελειώνει το παρακλάδι του διαλόγου, ώστε η μηχανή να μπορεί να εντοπίσει σε ποιο διάλογο ανήκει η κάθε επιλογή. Ο ορισμός της αρχής και του τέλους του διαλόγου γίνεται με τις μεθόδους Game.StartDlgBranch() και Game.EndDlgBranch() αντίστοιχα.

Ας δούμε τώρα έναν ολοκληρωμένο διάλογο:

function MyTestDialogue()
{
 Game.StartDlgBranch("MyTestDialogue"); // Αρχή καινούριου διαλόγου

 Game.ResetResponse()
 var EndBranch = false;

 while(!EndBranch) // βρόχος μέχρι ο παίκτης να τερματίσει τον διάλογο
 {
 Game.AddResponseOnce(0, "Μπορείτε να επιλέξετε αυτή την απάντηση μόνο μία φορά σε αυτό το διάλογο.");
 Game.AddResponseOnceGame(1, "Μπορείτε να επιλέξετε αυτή την απάντηση μόνο μία φορά στο παιχνίδι.");
 Game.AddResponse(2, "Πρέπει να φύγω τώρα.");
 
 var Res = Game.GetResponse(true); // επιλέγει αυτόματα την τελευταία απάντηση
 
 actor.Talk(Game.LastResponse);
 
 // χειρισμός των επιλογών
 switch(Res)
 {
 case 0:
 // κώδικας που ελέγχει την απάντηση #0
 break;

 case 1:
 // κώδικας που ελέγχει την απάντηση #1
 break;

 case 2:
 EndBranch = true; // η απάντηση #2 τερματίζει το διάλογο
 break;
 }
 }
 
 Game.EndDlgBranch(); // Τέλος του διαλόγου