### This file is built on top of Raconteur. Raconteur is copyright (c) 2015 Bruno Dias This file is copyright (c) 2016 Alexander Yakovlev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ### undum = require('./undum.js') markdown = require('./markdown.coffee') ### The prototype RaconteurSituation is the basic spec for situations created with Raconteur. It should be able to handle any use case for Undum. This prototype is fairly complex; see the API documentation. ### RaconteurSituation = (spec) -> if RaconteurSituation.arguments.length == 0 return undum.Situation.call(this, spec) for key, value of spec this[key] ?= value @visited = 0 return this RaconteurSituation.inherits(undum.Situation) ### Situation.prototype.act() is called by Undum whenever an action link (Ie, a link that doesn't point at another situation or an external URL) is clicked. Raconteur's version of act() is set up to implement commonly used functionality: "writer" links, "replacer" links, "inserter" links, and generic "action" links that call functions which access the underlying Undum API. ### RaconteurSituation.prototype.act = (character, system, action) -> actionClass = action.match(/^_(\w+)_(.+)$/) that = this responses = { writer: (ref) -> content = that.writers[ref].fcall(that, character, system, action) output = markdown(content) system.writeInto(output, '#current-situation') replacer: (ref) -> content = that.writers[ref].fcall(that, character, system, action) output = ""+content+"" #

tags are usually bad for replacers system.replaceWith(output, '#'+ref) inserter: (ref) -> content = that.writers[ref].fcall(that, character, system, action) output = markdown(content) system.writeInto(output, '#'+ref) } if (actionClass) # Matched a special action class [responder, ref] = [actionClass[1], actionClass[2]] if(!@writers.hasOwnProperty(actionClass[2])) throw new Error("Tried to call undefined writer: #{action}"); responses[responder](ref); else if (@actions.hasOwnProperty(action)) @actions[action].call(this, character, system, action); else throw new Error("Tried to call undefined action: #{action}"); RaconteurSituation.prototype.register = () -> if not @name? console.error("Situation has no name") return this undum.game.situations[@name] = this return this module.exports = RaconteurSituation