lychees's picture
Upload 569 files
87b3b3a
ROT.Display.create = function(game, opts) {
opts.fontFamily = '"droid sans mono", Courier, "Courier New", monospace';
var display = new ROT.Display(opts);
display.game = game;
return display;
};
ROT.Display.prototype.errors = [];
ROT.Display.prototype.setupEventHandlers = function() {
var display = this;
var game = this.game;
// directions for moving entities
var keys = {
37: 'left', // left arrow
38: 'up', // up arrow
39: 'right', // right arrow
40: 'down', // down arrow
65: 'left', // A
68: 'right', // D
72: 'left', // H
74: 'down', // J
75: 'up', // K
76: 'right', // L
81: 'funcPhone', // Q
82: 'rest', // R
83: 'down', // S
87: 'up', // W
98: 'down', // 2
100: 'left', // 4
101: 'rest', // 5
102: 'right', // 6
104: 'up' // 8
};
// contentEditable is required for canvas elements to detect keyboard events
$(this.getContainer()).attr("contentEditable", "true");
this.getContainer().addEventListener("keydown", function(e) {
if (display._intro == true) {
game._start();
display._intro = false;
} else if (keys[e.keyCode] && game.map.getPlayer()) {
game.map.getPlayer().move(keys[e.keyCode], true);
}
e.preventDefault();
});
this.getContainer().addEventListener("click", function(e) {
$(this).addClass('focus');
$('.CodeMirror').removeClass('focus');
$('#helpPane').hide();
$('#menuPane').hide();
});
};
// drawObject takes care of looking up an object's symbol and color
// according to name (NOT according to the actual object literal!)
ROT.Display.prototype.drawObject = function (map, x, y, object) {
var type = object.type;
var definition = map._getObjectDefinition(type) || this.savedDefinitions[type];
var symbol = definition.symbol;
var color = object.color || definition.color || "#fff";
var bgColor = object.bgColor || "#000";
this.draw(x, y, symbol, color, bgColor);
};
ROT.Display.prototype.drawAll = function(map) {
if (!this.offset) {this.offset = 0;}
var game = this.game;
// _initialize grid
var grid = new Array(game._dimensions.width);
for (var x = 0; x < game._dimensions.width; x++) {
grid[x] = new Array(game._dimensions.height);
for (var y = 0; y < game._dimensions.height; y++) {
grid[x][y] = {
type: 'empty',
bgColor: 'black'
};
}
}
// place static objects
for (var x = 0; x < game._dimensions.width; x++) {
for (var y = 0; y < game._dimensions.height; y++) {
grid[x][y] = {
type: map._getGrid()[x][y].type,
bgColor: map._getGrid()[x][y].bgColor
};
}
}
// place dynamic objects
var dynamicObjects = map.getDynamicObjects();
for (var i = 0; i < dynamicObjects.length; i++) {
var obj = dynamicObjects[i];
grid[obj.getX()][obj.getY()] = {
type: obj.getType(),
bgColor: map._getGrid()[obj.getX()][obj.getY()].bgColor
};
}
// place player
if (map.getPlayer()) {
var player = map.getPlayer();
grid[player.getX()][player.getY()] = {
type: 'player',
color: player.getColor(),
bgColor: map._getGrid()[player.getX()][player.getY()].bgColor
}
}
// draw grid
for (var x = 0; x < game._dimensions.width; x++) {
for (var y = Math.max(0, this.offset - map.getHeight()); y < game._dimensions.height; y++) {
this.drawObject(map, x, y + this.offset, grid[x][y]);
}
}
// write error messages, if any
if (this.errors && this.errors.length > 0) {
for (var i = 0; i < this.errors.length; i++) {
var y = this.game._dimensions.height - this.errors.length + i;
this.drawText(0, y, this.errors[i]);
}
}
// store for potential later use
this.grid = grid;
};
ROT.Display.prototype.drawPreviousLevel = function(map, offset) {
if (!offset) {offset = 0;}
var game = this.game;
var grid = this.savedGrid;
if (grid) {
for (var x = 0; x < game._dimensions.width; x++) {
for (var y = 0; y < game._dimensions.height; y++) {
this.drawObject(map, x, y + offset, grid[x][y]);
}
}
}
};
ROT.Display.prototype.saveGrid = function (map) {
this.savedGrid = this.grid;
this.savedDefinitions = map._getObjectDefinitions();
}
ROT.Display.prototype.playIntro = function (map, i) {
display = this;
playIntro(display, map, i)
};
ROT.Display.prototype.fadeIn = function (map, speed, callback, i) {
var display = this;
var game = this.game;
if (game._currentLevel == "bonus") {
var levelName = game._currentBonusLevel;
} else {
var levelName = game._levelFileNames[game._currentLevel - 1];
}
var command = "%c{#0f0}> run " + levelName;
if (i < -3) {
if (callback) { callback(); }
} else {
if (typeof i === 'undefined') { i = map.getHeight(); }
this.clear();
this.errors = [];
this.drawPreviousLevel(map, i - map.getHeight());
this.offset = i + 3;
this.drawAll(map);
this.drawText(0, i + 1, command);
setTimeout(function () {
display.fadeIn(map, speed, callback, i - 1);
}, speed);
}
};
ROT.Display.prototype.writeStatus = function(text) {
var map = this.game.map;
var strings = [text];
if (text.length > map.getWidth()) {
// split into two lines
var minCutoff = map.getWidth() - 10;
var cutoff = minCutoff + text.slice(minCutoff).indexOf(" ");
strings = [text.slice(0, cutoff), text.slice(cutoff + 1)];
}
for (var i = 0; i < strings.length; i++) {
var str = strings[i];
var x = Math.floor((map.getWidth() - str.length) / 2);
var y = map.getHeight() + i - strings.length - 1;
this.drawText(x, y, str);
}
};
ROT.Display.prototype.appendError = function(errorText, command) {
var game = this.game;
if (game._currentLevel == "bonus") {
var levelName = game._currentBonusLevel;
} else {
var levelName = game._levelFileNames[game._currentLevel - 1];
}
if (!command) {
command = "%c{#0f0}> run " + levelName;
}
this.offset -= 3;
this.errors = this.errors.concat([command, errorText, ""]);
this.clear();
this.drawAll(game.map);
};
ROT.Display.prototype.focus = function() {
$('#screen').show();
$(this.getContainer()).attr('tabindex', '0').click().focus();
};
ROT.Display.prototype.renderDom = function(html, css) {
// using ideas from http://robert.ocallahan.org/2011/11/drawing-dom-content-to-canvas.html
/*var canvas = $('#drawingCanvas')[0];
var ctx = canvas.getContext("2d");
canvas.width = canvas.width; //resets background of canvas
var data = "data:image/svg+xml," +
"<svg xmlns='http://www.w3.org/2000/svg' width='" + canvas.width + "' height='" + canvas.height + "'>" +
"<foreignObject width='100%' height='100%'>" +
"<style type='text/css'>" + css + "</style>" +
"<div xmlns='http://www.w3.org/1999/xhtml'>" +
html +
"</div>" +
"</foreignObject>" +
"</svg>";
//console.log(data);
var img = new Image();
img.src = data;
//console.log(img);
img.onload = function() {
ctx.drawImage(img, 0, 0);
}*/
// drawing DOM to canvas doesn't work in many browsers, so
// we fall back to basic DOM rendering
$(dummyDom).html(html); // DOM CSS now resides in game.css with everything else
}