Mercurial > web-gnusto
view trivial-zui.js @ 37:9e7a743ccac5
Added very, very buggy support for the top window.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Thu, 15 May 2008 00:03:40 -0700 |
parents | afa332a44721 |
children | f346d0d99f78 |
line wrap: on
line source
var BACKSPACE_KEYCODE = 8; var RETURN_KEYCODE = 13; function TrivialZui() { var contentLeft = $("#content").get(0).offsetLeft + "px"; $("#top-window").get(0).style.left = contentLeft; this._size = [70, 255]; this._console = null; 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 false; } 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>' ); } }, _eraseBottomWindow: function() { $("#content").html(""); }, getSize: function() { return self._size; }, 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) { // From the Z-Spec, section 8.7.2. if (window == 1) self._console.moveTo(0, 0); self._activeWindow = window; }, onEraseWindow: function(window) { if (window == -2) { self._console.clear(); self._eraseBottomWindow(); } else if (window == -1) { // From the Z-Spec, section 8.7.3.3. self.onSplitWindow(0); // TODO: Depending on the Z-Machine version, we want // to move the cursor to the bottom-left or top-left. self._eraseBottomWindow(); } else if (window == 0) { self._eraseBottomWindow(); } else if (window == 1) { self._console.clear(); } }, onSetCursor: function(x, y) { self._console.moveTo(x - 1, y - 1); }, onSplitWindow: function(numlines) { if (numlines == 0) { self._console.close(); self._console = null; } else self._console = new Console(self._size[0], numlines, $("#top-window").get(0)); }, onPrint: function(output) { if (self._activeWindow == 0) { output = output.replace('\n', '<br/>', 'g'); $("#content").append(output); window.scroll(0, document.body.scrollHeight); } else { self._console.write(output); } } }; $(window).keypress(self._windowKeypress); // We want to make sure that all key events don't bubble up, so // that anything listening in--such as Firefox's "Search for text // when I start typing" feature--doesn't think that we're not // doing anything with the keypresses. If we don't do this, such // listeners may think that they can intervene and capture // keystrokes before they get to us in the future. var suppressionFunc = function(evt) { return false; }; $(window).keyup(suppressionFunc); $(window).keydown(suppressionFunc); self._eraseBottomWindow(); } $(document).ready( function() { var logfunc = undefined; if (window.console) { logfunc = function(msg) { console.log(msg); }; } var engine = new GnustoEngine(); var zui = new TrivialZui(); var runner = new EngineRunner(engine, zui, logfunc); engine.loadStory(troll_z5); runner.run(); });