eval(readFile("Worlds_Compiled")) indent = 0 print = function(x) { for (var idx = 0; idx < indent; idx = idx + 1) x = ' ' + x console.log(x) } nothing = {name: 'nothing'} outside = {name: 'outside'} airlock = {name: 'airlock', closed: true} door = {name: 'door', closed: true} hole = {name: 'hole'} rocket = {name: 'rocket', entrance: airlock} building = {name: 'building', entrance: door} cave = {name: 'cave', entrance: hole} human = {name: 'human', loc: rocket} robot = {name: 'robot', loc: rocket, holding: nothing} fuel = {name: 'fuel', loc: building, liftable: true} key = {name: 'key', loc: cave, liftable: true} gold = {name: 'gold', loc: cave, liftable: true} fetch = function(object, place) { print("fetching " + object.name + " to " + place.name) indent = indent + 1 if (object.loc !== place) { pickup(object) moveto(place) drop() } indent = indent - 1 } pickup = function(object) { print("picking up " + object.name) indent = indent + 1 if (!object.liftable) abort moveto(object.loc) if (robot.holding !== nothing) drop() robot.holding = object indent = indent - 1 } drop = function() { if (robot.holding === nothing) abort print("dropping the " + robot.holding.name + " at " + robot.holding.loc.name) robot.holding = nothing } moveto = function(place) { print("moving to " + place.name) indent = indent + 1 if (robot.loc === place) ; else { if (robot.loc !== outside) leave() enter(place) } indent = indent - 1 } leave = function() { print("leaving " + robot.loc.name) indent = indent + 1 if (robot.loc.entrance.closed) open(robot.loc.entrance) robot.loc = outside if (robot.holding !== nothing) robot.holding.loc = outside indent = indent - 1 } enter = function(place) { print("entering " + place.name) indent = indent + 1 if (place.entrance.closed) open(place.entrance) robot.loc = place if (robot.holding !== nothing) robot.holding.loc = place indent = indent - 1 } open = function(x) { print("opening " + x.name) indent = indent + 1 if (x === door) { if (robot.holding !== key) { var oldPlace = robot.loc pickup(key) moveto(oldPlace) } door.closed = false } else if (x === airlock) airlock.closed = false else abort indent = indent - 1 } fetch(gold, rocket) fetch(fuel, rocket) fetch(gold, building) human.loc.name robot.loc.name fuel.loc.name gold.loc.name key.loc.name airlock.closed door.closed