-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjsdungeon.min.js
More file actions
7 lines (7 loc) · 16.7 KB
/
Copy pathjsdungeon.min.js
File metadata and controls
7 lines (7 loc) · 16.7 KB
1
2
3
4
5
6
7
/**
* jsdungeon - JSdungeon is a text-based adventure game engine. You can create your own dungeons by configuring them in JSON. Examples are in the repository, and you're free to take a modify them for your own use.
* @version v1.1.0
* @link https://github.com/jaaimino/jsdungeon#readme
* @license ISC
*/
jsdungeon={},jsdungeon.trigger_types=["state_change","flavor_text","lose_game","win_game","add_item","remove_item"];var game_over=!1,currentDungeon=null;jsdungeon.game_over=!1,jsdungeon.currentDungeon=null,jsdungeon.startGame=function(e){return jsdungeon.game_over=!1,jsdungeon.currentDungeon=e,jsdungeon.getCurrentDungeon().currentRoom?(jsdungeon.clearOutput(),jsdungeon.outputRoom()):(jsdungeon.getCurrentDungeon().currentRoom=jsdungeon.getCurrentDungeon().rooms[jsdungeon.getCurrentDungeon().start_room],jsdungeon.getCurrentDungeon().player?(jsdungeon.getCurrentDungeon().currentPlayer=jsdungeon.getCurrentDungeon().player,jsdungeon.getCurrentDungeon().currentPlayer.inventory||(jsdungeon.getCurrentDungeon().currentPlayer.inventory=[]),jsdungeon.getCurrentDungeon().currentPlayer.description||(jsdungeon.getCurrentDungeon().currentPlayer.description="A person.")):jsdungeon.getCurrentDungeon().currentPlayer={name:"Jim",description:"A person",inventory:[]},jsdungeon.clearOutput(),jsdungeon.examine_self(),jsdungeon.outputRoom()),jsdungeon.outputString},jsdungeon.gameloop=function(e){jsdungeon.parseInput(e)},jsdungeon.look=function(){jsdungeon.outputRoom()},jsdungeon.outputRoom=function(){var e="";jsdungeon.getCurrentRoom().name&&jsdungeon.output("<span class='room-name'>{0}</span>".format(jsdungeon.getCurrentRoom().name)),jsdungeon.output(jsdungeon.getCurrentRoom().description+" ");for(var n in jsdungeon.getCurrentRoom().objects)if(jsdungeon.getCurrentRoom().objects.hasOwnProperty(n)){var t=jsdungeon.getCurrentRoom().objects[n].current_state;jsdungeon.getCurrentRoom().objects[n].states[t].description&&(e+=jsdungeon.getCurrentRoom().objects[n].states[t].description+" ")}if(jsdungeon.getCurrentRoom().items)for(var o=0;o<jsdungeon.getCurrentRoom().items.length;o++){var u=jsdungeon.getCurrentRoom().items[o],r=jsdungeon.getCurrentDungeon().items[u].current_state;jsdungeon.getCurrentDungeon().items[u].states[r].description&&(e+=jsdungeon.getCurrentDungeon().items[u].states[r].description+" ")}for(var n in jsdungeon.getCurrentRoom().exits)if(jsdungeon.getCurrentRoom().exits.hasOwnProperty(n)){var s=jsdungeon.getCurrentRoom().exits[n].current_state;jsdungeon.getCurrentRoom().exits[n].states[s].description&&(e+=jsdungeon.getCurrentRoom().exits[n].states[s].description+" ")}jsdungeon.output(e)},jsdungeon.move=function(e){if(jsdungeon.getCurrentRoom().exits&&jsdungeon.check_exist(jsdungeon.getCurrentRoom().exits[e],"destination")){var n=jsdungeon.getCurrentState(e,"exits",jsdungeon.getCurrentRoom()),t=jsdungeon.getCurrentRoom().exits[e].states[n];t.open?"true"===t.open?jsdungeon.leave_room(t,e):(console.log("Uh oh"),t.examination&&jsdungeon.output(t.examination+" ")):jsdungeon.leave_room(t,e)}else jsdungeon.output("You can't go {0}!".format(e))},jsdungeon.leave_room=function(e,n){jsdungeon.output_break(),e.on_enter&&(e.on_enter.description&&jsdungeon.output(e.on_enter.description),e.on_enter.triggers&&jsdungeon.looptriggers(e.on_enter.triggers)),jsdungeon.getCurrentDungeon().currentRoom=jsdungeon.getCurrentDungeon().rooms[jsdungeon.getCurrentRoom().exits[n].destination],jsdungeon.outputRoom()},jsdungeon.inventory=function(){if(jsdungeon.currentDungeon.currentPlayer.inventory.length>0){for(var e="",n=0;n<jsdungeon.currentDungeon.currentPlayer.inventory.length-1;n++)e+="<i>"+jsdungeon.currentDungeon.currentPlayer.inventory[n]+"</i>, ";e+="<i>"+jsdungeon.currentDungeon.currentPlayer.inventory[jsdungeon.currentDungeon.currentPlayer.inventory.length-1]+"</i>",jsdungeon.output("inventory: {0}".format(e))}else jsdungeon.output("Your inventory is empty!")},jsdungeon.use=function(e,n){if(n)jsdungeon.use_x_on_y(e,n);else if(jsdungeon.check_exist(jsdungeon.getCurrentDungeon().items,e))if(-1!=jsdungeon.currentDungeon.currentPlayer.inventory.indexOf(e)){var t=jsdungeon.getCurrentState(e,"items",jsdungeon.getCurrentDungeon());jsdungeon.use_X(e,t,"items",jsdungeon.getCurrentDungeon())}else jsdungeon.output("You don't have {0}!".format(e));else if(jsdungeon.check_exist(jsdungeon.getCurrentRoom().objects,e)){var t=jsdungeon.getCurrentState(e,"objects",jsdungeon.getCurrentRoom());jsdungeon.use_X(e,t,"objects",jsdungeon.getCurrentRoom())}else jsdungeon.output("You don't have {0}!".format(e))},jsdungeon.use_x_on_y=function(e,n){jsdungeon.check_exist(jsdungeon.getCurrentDungeon().items,n)?-1!=jsdungeon.currentDungeon.currentPlayer.inventory.indexOf(n)?jsdungeon.use_type("items",e,n,jsdungeon.getCurrentDungeon()):jsdungeon.output("You don't have {0} in your inventory.".format(n)):jsdungeon.check_exist(jsdungeon.getCurrentRoom().exits,n)?jsdungeon.use_type("exits",e,n,jsdungeon.getCurrentRoom()):jsdungeon.check_exist(jsdungeon.getCurrentRoom().objects,n)?jsdungeon.use_type("objects",e,n,jsdungeon.getCurrentRoom()):jsdungeon.output("You do nothing with {0} or {1} as {1} doesn't exist.".format(e,n))},jsdungeon.use_type=function(e,n,t,o){if(-1!=jsdungeon.currentDungeon.currentPlayer.inventory.indexOf(n)){var u=jsdungeon.getCurrentState(t,e,o);if(jsdungeon.useable(t,u,e,o)){var r=o[e][t].states[u].on_use.triggers,s=jsdungeon.getCurrentState(n,"items",jsdungeon.getCurrentDungeon());jsdungeon.trigger_action(n,t,r,s)}else jsdungeon.output("You can't do anything to {0} with {1}.".format(t,n))}else jsdungeon.output("You don't have {0} in your inventory.".format(n))},jsdungeon.use_X=function(e,n,t,o){if(jsdungeon.useable(e,n,t,o))for(var u=o[t][e].states[n].on_use.triggers,r=0;r<u.length;r++)u[r].requires||(jsdungeon.process_trigger(u[r]),u[r].single_trigger&&"true"===u[r].single_trigger&&(u.splice(r,1),r-=1));else jsdungeon.output("Nothing interesting happened.")},jsdungeon.take=function(e){if(jsdungeon.getCurrentRoom().items&&-1!=jsdungeon.getCurrentRoom().items.indexOf(e))return jsdungeon.currentDungeon.currentPlayer.inventory.push(e),jsdungeon.getCurrentRoom().items.splice(jsdungeon.getCurrentRoom().items.indexOf(e),1),void jsdungeon.output("You picked up <i>{0}</i>.".format(e));if(jsdungeon.check_exist(jsdungeon.getCurrentRoom().objects,e)){var n=jsdungeon.getCurrentState(e,"objects",jsdungeon.getCurrentRoom()),t=jsdungeon.getCurrentRoom().objects[e].states[n];if(t.fail_pickup)return void jsdungeon.output(t.fail_pickup);jsdungeon.output("You can't carry the {0}!".format(e))}else jsdungeon.output("You fumbled around but only found air.")},jsdungeon.examine_self=function(){jsdungeon.output("Your name is "+jsdungeon.currentDungeon.currentPlayer.name+". "+jsdungeon.currentDungeon.currentPlayer.description),jsdungeon.output(jsdungeon.getCurrentDungeon().intro_text)},jsdungeon.examine=function(e){if("self"===e)jsdungeon.examine_self();else if(jsdungeon.check_exist(jsdungeon.getCurrentRoom().objects,e)){var n=jsdungeon.getCurrentState(e,"objects",jsdungeon.getCurrentRoom()),t=jsdungeon.getCurrentRoom().objects[e].states[n];jsdungeon.lookatthing(e,t)}else if(-1!=jsdungeon.currentDungeon.currentPlayer.inventory.indexOf(e)||jsdungeon.getCurrentRoom().items&&-1!=jsdungeon.getCurrentRoom().items.indexOf(e)){var n=jsdungeon.getCurrentState(e,"items",jsdungeon.getCurrentDungeon()),o=jsdungeon.getCurrentDungeon().items[e].states[n];jsdungeon.lookatthing(e,o)}else if(jsdungeon.check_exist(jsdungeon.getCurrentRoom().exits,e)){var n=jsdungeon.getCurrentState(e,"exits",jsdungeon.getCurrentRoom()),u=jsdungeon.getCurrentRoom().exits[e].states[n];jsdungeon.lookatthing(e,u)}else jsdungeon.output("There's nothing in this room like that!")},jsdungeon.lookatthing=function(e,n){if(n.on_examine){var t=!0;n.on_examine.description&&(jsdungeon.output(n.on_examine.description),t=!1),n.on_examine.triggers&&(jsdungeon.looptriggers(n.on_examine.triggers),t=!1),t&&jsdungeon.output("There doesn't seem to be anything interesting about {0}...".format(e))}else n.examination?jsdungeon.output(n.examination):jsdungeon.output("There doesn't seem to be anything interesting about {0}...".format(e))},jsdungeon.talk=function(e){if(jsdungeon.check_exist(jsdungeon.getCurrentRoom().objects,e)){var n=jsdungeon.getCurrentState(e,"objects",jsdungeon.getCurrentRoom()),t=jsdungeon.getCurrentRoom().objects[e].states[n],o=!0;jsdungeon.check_exist(t.on_talk,"description")&&(jsdungeon.output(t.on_talk.description),o=!1),jsdungeon.check_exist(t.on_talk,"triggers")&&(o=!1,jsdungeon.looptriggers(t.on_talk.triggers)),o&&jsdungeon.output("There was nothing much to say.")}else jsdungeon.output("You couldn't figure out how to talk to that.")},jsdungeon.help=function(){jsdungeon.output("Your available actions are as follows: <br><i>look</i> - describes the room <br><i>go</i> (direction) - attempts to leave the room in that direction <br><i>examine</i> (item, object, direction) - examines an object <br><i>search</i> (item, object, direction) - searches an object <br><i>open</i> (item, object, direction) - opens an object <br><i>take</i> (item) - attempts to take an object <br><i>use</i> (object, direction, item) - use something <br><i>use</i> (item) <i>on</i> (object, direction, item) - use something on something <br><i>give</i> (item) <i>to</i> (object, direction, item) - give something to something <br><i>talk (to)</i> (object, direciton, item) - talks to something <br><i>inventory</i> - checks your current items <br><i>help</i> - displays this message! <br>")},jsdungeon.error=function(e){jsdungeon.output("{0} doesn't exist here!".format(e))},jsdungeon.getObjects=function(e){return e?jsdungeon.getCurrentDungeon().rooms[e].objects:jsdungeon.getCurrentRoom().objects},jsdungeon.getItems=function(){return jsdungeon.getCurrentDungeon().items},jsdungeon.getRoomItems=function(e){return e?jsdungeon.getCurrentDungeon().rooms[e].items:jsdungeon.getCurrentRoom().items},jsdungeon.getExits=function(e){return e?jsdungeon.getCurrentDungeon().rooms[e].exits:jsdungeon.getCurrentRoom().exits},jsdungeon.getCurrentPlayer=function(){return jsdungeon.getCurrentDungeon().currentPlayer},jsdungeon.getCurrentDungeon=function(){return jsdungeon.currentDungeon},jsdungeon.getCurrentRoom=function(){return jsdungeon.getCurrentDungeon().currentRoom},jsdungeon.isGameOver=function(){return jsdungeon.game_over},jsdungeon.endGame=function(){jsdungeon.game_over=!0},jsdungeon.getCurrentState=function(e,n,t){return"items"===n?t.items[e].current_state:"objects"===n?t.objects[e].current_state:"exits"===n?t.exits[e].current_state:void 0},jsdungeon.useable=function(e,n,t,o){return"items"===t?o.items[e].states[n].on_use&&o.items[e].states[n].on_use.triggers:"objects"===t?o.objects[e].states[n].on_use&&o.objects[e].states[n].on_use.triggers:"exits"===t?o.exits[e].states[n].on_use&&o.exits[e].states[n].on_use.triggers:void 0},jsdungeon.trigger_action=function(e,n,t,o){for(var u=!0,r=0;r<t.length;r++)t[r].requires&&t[r].requires===e&&t[r].requires_state===o&&(jsdungeon.process_trigger(t[r]),u=!1,t[r].single_trigger&&"true"===t[r].single_trigger&&(t.splice(r,1),r-=1));u&&jsdungeon.output("You used {0} on {1} to no effect.".format(e,n))},jsdungeon.looptriggers=function(e){for(var n=0;n<e.length;n++){var t=!1;if(jsdungeon.process_trigger(e[n]),e[n].trigger_blocking&&"true"===e[n].trigger_blocking&&(t=!0),e[n].single_trigger&&"true"===e[n].single_trigger&&(e.splice(n,1),n-=1),t)return}},jsdungeon.check_exist=function(e,n){return!(!e||!e[n])},jsdungeon.check_context=function(e,n){var t=function(){n?jsdungeon.use(n,e):jsdungeon.use(e)};jsdungeon.getItems()[e]?t():jsdungeon.getCurrentRoom().objects[e]?t():jsdungeon.getCurrentRoom().exits[e]?jsdungeon.move(e):jsdungeon.error(e)},jsdungeon.outputString="",jsdungeon.interact=function(e){jsdungeon.outputString="";try{if(jsdungeon.isGameOver())return jsdungeon.output("Game is over. Please start a new one."),jsdungeon.outputString;if(null===jsdungeon.getCurrentDungeon())return jsdungeon.output("Please start a dungeon."),jsdungeon.outputString;jsdungeon.gameloop(e)}catch(n){return console.log(n),jsdungeon.output("Uh oh! There was an error!"),jsdungeon.outputString}return jsdungeon.outputString},jsdungeon.output=function(e){jsdungeon.outputString+="<p class='entry'>"+e+"</p>"},jsdungeon.output_break=function(e){jsdungeon.outputString+="<p class='break'/>"},jsdungeon.clearOutput=function(){jsdungeon.outputString=""},jsdungeon.loadJSON=function(e,n){var t=new XMLHttpRequest;t.overrideMimeType("application/json"),t.open("GET",e+"?nocache="+(new Date).getTime(),!0),t.onreadystatechange=function(){4==t.readyState&&"200"==t.status&&n(t.responseText)},t.send(null)},String.prototype.format||(String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,function(n,t){return"undefined"!=typeof e[t]?e[t]:n})}),Array.prototype.remove=function(e){var n=this.indexOf(e);n>-1&&this.splice(n,1)},Array.prototype.removeAll=function(e){for(var n=this.indexOf(e);n>-1;){this.splice(n,1);var n=this.indexOf(e)}},jsdungeon.setBackgroungImage=function(e){var n="url("+e+")";document.body.style.backgroundImage=n},jsdungeon.reg={move:/(?:move|enter|go|skedaddle|sally forth|proceed|exit(?: through)?) +(.*)/i,talk:/(?:talk|chat)(?: to)? +(.*)/i,examine:/(?:examine|check|scrutinize|look|inspect) +(.*)/i,take:/(?:take|grab|snatch|get|pick up) +(.*)/i,use:/(?:search|use|combine|try|give) +(.+?)(?: +(?:on|with|and|for|to|a) +(.+?))?$/i,context:/(?:open) +(.+?)(?: +(?:with|and|for|to|a) +(.+?))?$/i,look:/(?:look|review|survey)/i,inventory:/inventory/i,help:/help/i,whitespace:/\S/},jsdungeon.parseInput=function(e){if(jsdungeon.reg.move.test(e)){var n=jsdungeon.reg.move.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.move(n[1])}if(jsdungeon.reg.talk.test(e)){var n=jsdungeon.reg.talk.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.talk(n[1])}if(jsdungeon.reg.examine.test(e)){var n=jsdungeon.reg.examine.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.examine(n[1])}if(jsdungeon.reg.take.test(e)){var n=jsdungeon.reg.take.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.take(n[1])}if(jsdungeon.reg.use.test(e)){var n=jsdungeon.reg.use.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.use(n[1],n[2])}if(jsdungeon.reg.context.test(e)){var n=jsdungeon.reg.context.exec(e);return n=jsdungeon.castLower(n),void jsdungeon.check_context(n[1],n[2])}return jsdungeon.reg.look.test(e)?void jsdungeon.look():jsdungeon.reg.inventory.test(e)?void jsdungeon.inventory():jsdungeon.reg.help.test(e)?void jsdungeon.help():void(jsdungeon.reg.whitespace.test(e)&&jsdungeon.output("I'm not sure how to {0}! (Type help to see commands)".format(e)))},jsdungeon.castLower=function(e){for(var n=0;n<e.length;n++)void 0!==e[n]&&(e[n]=e[n].toLowerCase());return e},jsdungeon.saveGame=function(e,n){n.currentPlayer=jsdungeon.getCurrentPlayer(),jsdungeon.localStorage.setItem(e,JSON.stringify(n))},jsdungeon.loadGame=function(e){try{var n=JSON.parse(jsdungeon.localStorage.getItem(e));return n}catch(t){return console.log(t),null}return null},jsdungeon.process_trigger=function(e){"state_change"===e.trigger_type?jsdungeon.trigger_change_state(e):"flavor_text"===e.trigger_type?jsdungeon.trigger_flavor_text(e):"lose_game"===e.trigger_type?jsdungeon.trigger_lose_game(e):"win_game"===e.trigger_type?jsdungeon.trigger_win_game(e):"add_item"===e.trigger_type?jsdungeon.trigger_add_item(e):"remove_item"===e.trigger_type?jsdungeon.trigger_remove_item(e):console.log("malformed trigger")},jsdungeon.getTargetGroup=function(e){return"objects"===e.target_type?e.target_room?jsdungeon.getObjects(e.target_room):jsdungeon.getObjects():"items"===e.target_type?jsdungeon.getItems():"exits"===e.target_type?e.target_room?jsdungeon.getExits(e.target_room):jsdungeon.getExits():void 0},jsdungeon.trigger_flavor_text=function(e){e.text?jsdungeon.output(e.text):e.description&&jsdungeon.output(e.description)},jsdungeon.trigger_change_state=function(e){var n=jsdungeon.getTargetGroup(e);e.target_state?e.target_state===n[e.target].current_state&&jsdungeon.changestate(e):jsdungeon.changestate(e)},jsdungeon.changestate=function(e){var n=jsdungeon.getTargetGroup(e);n[e.target].current_state=e.new_state,e.description&&jsdungeon.output(e.description)},jsdungeon.trigger_add_item=function(e){var n=e.target_item;jsdungeon.getCurrentDungeon().player.inventory.push(n),e.description&&jsdungeon.output(e.description)},jsdungeon.trigger_remove_item=function(e){var n=e.target_item;jsdungeon.getCurrentDungeon().player.inventory.remove(n),e.description&&jsdungeon.output(e.description)},jsdungeon.trigger_lose_game=function(e){e.description?jsdungeon.output("{0} Choose a dungeon and start a new game below.".format(e.description)):jsdungeon.output("You have died. Choose a dungeon and start a new game below."),jsdungeon.endGame()},jsdungeon.trigger_win_game=function(e){e.description?jsdungeon.output("{0} Choose a dungeon and start a new game below.".format(e.description)):jsdungeon.output("Congratulations! You've completed the dungeon. Start a new game below."),jsdungeon.endGame()};