Spaces:
Running
Running
/* | |
Objects can have the following parameters: | |
color: '#fff' by default | |
impassable: true if it blocks the player from movement (false by default) | |
onCollision: function (player) called when player moves over the object | |
onPickUp: function (player) called when player picks up the item | |
symbol: Unicode character representing the object | |
type: 'item' or null | |
*/ | |
// used by bonus levels 01 through 04 | |
function moveToward(obj, type) { | |
var target = obj.findNearest(type); | |
var leftDist = obj.getX() - target.x; | |
var upDist = obj.getY() - target.y; | |
var direction; | |
if (upDist == 0 && leftDist == 0) { | |
return; | |
} | |
if (upDist > 0 && upDist >= leftDist) { | |
direction = 'up'; | |
} else if (upDist < 0 && upDist < leftDist) { | |
direction = 'down'; | |
} else if (leftDist > 0 && leftDist >= upDist) { | |
direction = 'left'; | |
} else { | |
direction = 'right'; | |
} | |
if (obj.canMove(direction)) { | |
obj.move(direction); | |
} | |
} | |
// used by bonus levels 01 through 04 | |
function followAndKeepDistance(obj, type) { | |
var target = obj.findNearest(type); | |
var leftDist = obj.getX() - target.x; | |
var upDist = obj.getY() - target.y; | |
if (Math.abs(upDist) < 2 && Math.abs(leftDist) < 4 | |
|| Math.abs(leftDist) < 2 && Math.abs(upDist) < 4) { | |
return; | |
} | |
var direction; | |
if (upDist > 0 && upDist >= leftDist) { | |
direction = 'up'; | |
} else if (upDist < 0 && upDist < leftDist) { | |
direction = 'down'; | |
} else if (leftDist > 0 && leftDist >= upDist) { | |
direction = 'left'; | |
} else { | |
direction = 'right'; | |
} | |
if (obj.canMove(direction)) { | |
obj.move(direction); | |
} | |
} | |
// used by bonus levels 01 through 04 | |
function killPlayerIfTooFar(obj, map) { | |
var target = obj.findNearest('player'); | |
var leftDist = obj.getX() - target.x; | |
var upDist = obj.getY() - target.y; | |
if (Math.abs(upDist) > 8 || Math.abs(leftDist) > 8) { | |
map.getPlayer().killedBy('"suspicious circumstances"'); | |
} | |
} | |
Game.prototype.getListOfObjects = function () { | |
var game = this; | |
return { | |
// special | |
'empty' : { | |
'symbol': ' ', | |
'impassableFor': ['raft'] | |
}, | |
'player' : { | |
'symbol': '@', | |
'color': '#0f0' | |
}, | |
'exit' : { | |
'symbol' : String.fromCharCode(0x2395), // β | |
'color': '#0ff', | |
'onCollision': function (player) { | |
if (!game.map.finalLevel) { | |
game._callUnexposedMethod(function () { | |
game._moveToNextLevel(); | |
}); | |
} | |
} | |
}, | |
// obstacles | |
'block': { | |
'symbol': '#', | |
'color': '#999', | |
'impassable': true | |
}, | |
'tree': { | |
'symbol': 'β£', | |
'color': '#080', | |
'impassable': true | |
}, | |
'mine': { | |
'symbol': ' ', | |
'onCollision': function (player) { | |
player.killedBy('a hidden mine'); | |
} | |
}, | |
'trap': { | |
'type': 'dynamic', | |
'symbol': '*', | |
'color': '#f00', | |
'onCollision': function (player, me) { | |
player.killedBy('a trap'); | |
}, | |
'behavior': null | |
}, | |
'teleporter': { | |
'type': 'dynamic', | |
'symbol' : String.fromCharCode(0x2395), // β | |
'color': '#f0f', | |
'onCollision': function (player, me) { | |
if (!player._hasTeleported) { | |
if (me.target) { | |
game._callUnexposedMethod(function () { | |
player._moveTo(me.target); | |
}); | |
} else { | |
throw 'TeleporterError: Missing target for teleporter' | |
} | |
} | |
player._hasTeleported = true; | |
}, | |
'behavior': null | |
}, | |
// items | |
'computer': { | |
'type': 'item', | |
'symbol': String.fromCharCode(0x2318), // β | |
'color': '#ccc', | |
'onPickUp': function (player) { | |
$('#editorPane, #savedLevelMsg').fadeIn(); | |
game.editor.refresh(); | |
game.map.writeStatus('You have picked up the computer!'); | |
}, | |
'onDrop': function () { | |
$('#editorPane, #savedLevelMsg').hide(); | |
} | |
}, | |
'phone': { | |
'type': 'item', | |
'minimumLevel': 7, | |
'symbol': String.fromCharCode(0x260E), // β | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up the function phone!'); | |
$('#phoneButton').show(); | |
}, | |
'onDrop': function () { | |
$('#phoneButton').hide(); | |
} | |
}, | |
'redKey': { | |
'type': 'item', | |
'minimumLevel': 11, | |
'symbol': 'k', | |
'color': 'red', | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up a red key!'); | |
} | |
}, | |
'greenKey': { | |
'type': 'item', | |
'minimumLevel': 12, | |
'symbol': 'k', | |
'color': '#0f0', | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up a green key!'); | |
} | |
}, | |
'blueKey': { | |
'type': 'item', | |
'minimumLevel': 13, | |
'symbol': 'k', | |
'color': '#06f', | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up a blue key!'); | |
} | |
}, | |
'yellowKey': { | |
'type': 'item', | |
'minimumLevel': 14, | |
'symbol': 'k', | |
'color': 'yellow', | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up a yellow key!'); | |
} | |
}, | |
'theAlgorithm': { | |
'minimumLevel': 14, | |
'type': 'item', | |
'symbol': 'A', | |
'color': 'white', | |
'onPickUp': function (player) { | |
game.map.writeStatus('You have picked up the Algorithm!'); | |
}, | |
'onDrop': function () { | |
game.map.writeStatus('You have lost the Algorithm!'); | |
} | |
}, | |
// used by bonus levels 01 through 04 | |
'eye': { | |
'type': 'dynamic', | |
'symbol': 'E', | |
'color': 'red', | |
'behavior': function (me) { | |
followAndKeepDistance(me, 'player'); | |
killPlayerIfTooFar(me, game.map); | |
}, | |
'onCollision': function (player) { | |
player.killedBy('"the eye"'); | |
}, | |
}, | |
// used by bonus levels 01 through 04 | |
'guard': { | |
'type': 'dynamic', | |
'symbol': 'd', | |
'color': 'red', | |
'behavior': function (me) { | |
moveToward(me, 'player'); | |
}, | |
'onCollision': function (player) { | |
player.killedBy('a guard drone'); | |
}, | |
} | |
}; | |
}; | |