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'); | |
| }, | |
| } | |
| }; | |
| }; | |