view trivial-zui.js @ 32:3a85b5915ea6

Added bad implementation of character input. The 'info' command in Troll no longer crashes the Z-Machine, but because we don't currently support multiple windows and the the 'info' command uses the top window as an interface, it still looks like it's hanging.
author Atul Varma <varmaa@toolness.com>
date Mon, 12 May 2008 11:23:47 -0700
parents 5d7bf3684fc3
children 8d34fb3e9108
line wrap: on
line source

var BACKSPACE_KEYCODE = 8;
var RETURN_KEYCODE = 13;

function TrivialZui() {
    this._activeWindow = 0;
    this._inputString = "";
    this._currentCallback = null;
    var self = this;

    this.__proto__ = {
        _windowKeypress: function(event) {
            if ($("#current-input").length == 0) {
                // We're not waiting for a line of input, but we may
                // be waiting for a character of input.

                // Note that we have to return a ZSCII keycode here.
                //
                // For more information, see:
                //
                //   http://www.gnelson.demon.co.uk/zspec/sect03.html
                if (self._currentCallback) {
                    var keyCode = 0;
                    if (event.charCode) {
                        keyCode = event.charCode;
                    } else {
                        // TODO: Deal w/ arrow keys, etc.
                        switch (event.keyCode) {
                        case RETURN_KEYCODE:
                            keyCode = event.keyCode;
                            break;
                        }
                    }
                    if (keyCode != 0) {
                        var callback = self._currentCallback;

                        self._currentCallback = null;
                        callback(keyCode);
                    }
                }
                return;
            }

            var oldInputString = self._inputString;

            if (event.charCode) {
                var newChar = String.fromCharCode(event.charCode);
                var lastChar = self._inputString.charAt(
                    self._inputString.length - 1
                    );
                if (!(newChar == " " && lastChar == " ")) {
                    self._inputString += newChar;
                }
            } else {
                switch (event.keyCode) {
                case BACKSPACE_KEYCODE:
                    if (self._inputString) {
                        self._inputString = self._inputString.slice(0, -1);
                    }
                    break;
                case RETURN_KEYCODE:
                    var finalInputString = self._inputString;
                    var callback = self._currentCallback;

                    self._inputString = "";
                    self._currentCallback = null;
                    // TODO: Escape finalInputString.
                    $("#current-input").replaceWith(
                        ('<span class="finished-input">' + finalInputString +
                         '</span><br/>')
                        );
                    callback(finalInputString);
                }
            }
            if ($("#current-input") &&
                oldInputString != self._inputString) {
                // TODO: Escape self._inputString.
                $("#current-input").html(
                    self._inputString + '<span id="cursor">_</span>'
                );
            }
        },

        onLineInput: function(callback) {
            self._currentCallback = callback;
            $("#content").append(
                '<span id="current-input"><span id="cursor">_</span></span>'
            );
        },

        onCharacterInput: function(callback) {
            self._currentCallback = callback;
        },

        onQuit: function() {
        },

        onSetStyle: function(textStyle, foreground, background) {
        },

        onSetWindow: function(window) {
            self._activeWindow = window;
        },

        onEraseWindow: function(window) {
            if (window == 0) {
                self.onPrint("\n\n\n\n\n\n\n\n\n\n");
            }
        },

        onSetCursor: function(x, y) {
        },

        onSplitWindow: function(window) {
        },

        onPrint: function(output) {
            output = output.replace('\n', '<br/>', 'g');
            if (self._activeWindow == 0) {
                $("#content").append(output);
                window.scroll(0, document.body.scrollHeight);
            }
        }
    };

    $(window).keypress(self._windowKeypress);
}

$(document).ready( function() {
    var engine = new GnustoEngine();
    var zui = new TrivialZui();
    var runner = new EngineRunner(engine, zui);

    engine.loadStory(troll_z5);
    runner.run();
});