Hi there.
thanks to the huge interest in doing Icon based dialogus in WME, I decided to create an universal simple object you can use and extend to suit your own needs.
Here's the example how to quickly implement it:
1. Create file scripts\dialogueObject.script with the following contents:
#include "scripts\base.inc" // Define dimensions of your dialogue icons: var ICON_WIDTH = 57; var ICON_HEIGHT = 57; // the script here is the name where you will handle responses from player's click on the icon method initializeDialogue(script) { this.script = script; this.iconCount = 0; this.window = Game.LoadWindow("windows\dialogueWindow.window"); var tmpwin = this.window; tmpwin.Visible = true; tmpwin.AttachScript(script); } // This will terminate the dialogue and free resources method endDialogue() { var tmpwindow = this.window; tmpwindow.DetachScript(this.script); tmpwindow.Close(); } // This will add icon to your dialogue window method insertIcon(name, sprite, hoversprite) { var tmpwin = this.window; var tmpButton = tmpwin.CreateButton(name); tmpButton.X = this.iconCount * ICON_WIDTH; tmpButton.SetImage(sprite); tmpButton.SetHoverImage(hoversprite); tmpButton.Visible = true; tmpButton.Interactive = true; tmpButton.ParentNotify = true; tmpButton.Disabled = false; tmpButton.PixelPerfect = false; tmpButton.Width = ICON_WIDTH; tmpButton.Height = ICON_HEIGHT; this[this.iconCount] = name; //We store the name for deleting fast reference this.iconCount = this.iconCount + 1; } // this will remove icon (usually after the topic is worn out) method removeIcon(name) { var tmpwin = this.window; var reorder = -1; // safe from nonsensical calls; for (var a = 0; a<this.iconCount; a= a+1) if (this[a] == name) reorder = a; if (reorder == -1) return; tmpwin.DeleteButton(name); for (a = reorder; a<this.iconCount; a = a +1) { this[a] = this[a+1]; var button = tmpwin.GetControl(this[a+1]); button.X = a* ICON_WIDTH; } }
2. create a file called scripts\reactions.script
on "first" { Game.Msg("Do something after the first choice."); } on "second" { Game.Msg("Do something after the second choice."); } on "third" { Game.Msg("Do something after the third choice."); dlgObject.removeIcon("second"); }
3. put into scripts\base inc
global dlgObject;
and into scripts\game.script
dlgObject = new Object("scripts\dialogueObject.script");
Then in your test scene put the following code:
dlgObject.initializeDialogue("scripts\reactions.script"); dlgObject.insertIcon("first","icon.png","icon.png"); // insert some real image file instead of icon.png dlgObject.insertIcon("second","icon.png","icon.png"); // insert some real image file instead of icon.png dlgObject.insertIcon("third","icon.png","icon.png"); // insert some real image file instead of icon.png
And the basic skeleton is set. Then after the dialogue is over, just call
dlgObject.endDialogue(); and probably set Game.Interactive? flag to true (if it was previously false)
Hope that helps, comments welcome!