diff --git a/game/story.coffee b/game/story.coffee deleted file mode 100644 index 910b10c..0000000 --- a/game/story.coffee +++ /dev/null @@ -1,216 +0,0 @@ -import dialogue from './_dialogue' -import phrase from './_phrase' - -salet.game_id = "your-game-id-here" -salet.game_version = "1.6" -$(document).ready(() -> - window.addEventListener('popstate', (event) -> - salet.goBack() - ) - $("#night").on("click", () -> - if (window.night) - styles = { - "-webkit-filter": "" - "filter": "" - "background-color": "" - } - $("body").css(styles) - $("#night").removeClass("active") - window.night = false - else - styles = { - "-webkit-filter": "invert(1)hue-rotate(180deg)" - "filter": "invert(1)hue-rotate(180deg)" - "background-color": "#000" - } - $("body").css(styles) - $("#night").addClass("active") - window.night = true - ) - - salet.beginGame() -) - -### -Element helpers. There is no real need to build monsters like a().id("hello") -because you won't use them as is. It does not make sense in context, the -author has Markdown and all utilities to *forget* about the markup. -### -way_to = (content, ref) -> - return "#{content}" -textlink = (content, ref) -> - return "#{content}" -actlink = (content, ref) -> - return "#{content}" - -# The first room of the game. -# For accessibility reasons the text is provided in HTML, not here. -room "start", - enter: () -> - salet.character.bought_lamp = false - dsc: """ - """, - choices: "#start" - -# This is a special inventory room. -# The inventory button is a regular link to this room. -# You may alter these as much as you like or scrap it along with the button. -room "inventory", - canSave: false # saving the game here is forbidden. Aautosaving too. - enter: () -> - $("#inventory").hide() - exit: () -> - $("#inventory").show() - dsc: () -> - if salet.character.inventory.length == 0 - text = "You are carrying nothing." - else - text = "You are carrying:\n\n" - for thing in salet.character.inventory - text += "* #{salet.character.listinv(thing.name)}\n" - return text+"\n\n"+""" -
- """ - actions: - exit: () -> - return salet.goBack() - -room "world", - tags: ["start"], - optionText: "Enter the world", - ways: ["plaza"] - dsc: """ - ### Rhinestone Room - - You're in a large room carved inside a giant milky rock mountain. - The floor and walls are littered with signs and signatures of the previous visitors. - """ - units: [ - unit "well", - dsc: "A steep narrow {{well}} proceeds upward." - act: "There is only one passage out. See the „Other rooms“ block popped up? Click it." - ] - -room "plaza", - title: (from) -> - if from == "world" - return "Upwards" - else - return "Town plaza" - cycle: ["quirky", "distinct", "kooky", "crazy", "quaint"] - ways: ["shop"] - before: (from) -> - if from == 'world' - """ - You climb up the well and come out to a central plaza of a #{salet.view.cycleLink("quaint")} little town. - A plaque nearby says it's the town of *Innsmouth,* wherever that is. - """ - else - "You quickly find the central plaza." - units: [ - unit "policeman", - dsc: "There is a policeman nearby. You could ask him {{for directions.}}" - act: () -> - if salet.character.has_mark? - return "You already talked to him, no need to bug the man twice." - salet.character.has_mark ?= true - salet.getRoom("lair") - """ - “Here, let me mark it on your map.” - """ - unit "people", - dsc: "There are {{people shouting}} nearby." - act: 'Just some weirdos shouting "Viva la Cthulhu!". Typical.' - ] - writers: - cyclewriter: () -> - responses = @cycle - if typeof responses == "function" - responses = responses() - cycleIndex = window.localStorage.getItem("cycleIndex") - cycleIndex ?= 0 - response = responses[cycleIndex] - cycleIndex++ - if cycleIndex == responses.length - cycleIndex = 0 - window.localStorage.setItem("cycleIndex", cycleIndex) - return salet.view.cycleLink(response) - -room "shop", - title: "The Shop" - #pic: "http://loremflickr.com/640/300/room,shop" - ways: ["plaza", "shop-inside", "lair"] - dsc: """ - Being the only shop in town, this trendy establishment did not need a name. - It's an open question why it had one, especially because its name was "Hung Crossing". - - You are standing in front of a picturesque sign. It's cold here. - """ - -room "lair", - title: "The Lair" - before: "Finding The Lair is easy. Leaving it is impossible. Your game ends here." - dsc: """ - The Lair of Yog-Sothoth is a very *n'gai* cave, full of *buggs-shoggogs* and *n'ghaa ng'aa*. - """ - ways: ["shop"] - units: [ - unit "bugg", - dsc: "You see a particularly beautiful slimy {{bugg.}}" - takeable: false - display: "bugg" - act: () => - salet.rooms[salet.current].drop("bugg") - return "You eat the bugg mass. Delicious and raw. Perhaps it's a good lair to live in." - ] - -phrase "Yes", "merchant", """ - Yes. -""" -dialogue "No", "merchant", "merchant", """ - No. -""" -room "sell-lamp", - ways: ["shop"] - tags: ["merchant"] - choices: ["#merchant"] - optionText: "May I buy this lamp?" - title: "Talking with merchant" - canView: () -> - return salet.character.has("lamp") and salet.character.bought_lamp == false - enter: () -> - salet.character.bought_lamp = true - dsc: """ - "That'll be 30 pieces of your time." - - You quickly pay the price and take the lamp as a rightful owner. - """ - -room "shop-inside", - ways: ["shop"] - tags: ["merchant"] - optionText: "End the conversation" - title: "Inside the Shop" - dsc: """ - The insides are painted pastel white, honouring The Great Milk Spill of 1985. - """ - units: [ - unit "merchant", - dsc: "A {{merchant}} eyes you warily." - takeable: false - act: () => - salet.processClick("merchdialogue") - return "" - ] - -lamp = unit "lamp", - display: "lamp" - takeable: true -lamp.put("shop-inside") - -# The dialogue entry point has to be a room, in order to have an ID to go to. -room "merchdialogue", - choices: "#merchant", - dsc: """ - Nice day, isn't it? - """ diff --git a/game/story.js b/game/story.js new file mode 100644 index 0000000..b6ea994 --- /dev/null +++ b/game/story.js @@ -0,0 +1,240 @@ +import jQuery from 'jquery'; +import dialogue from './_dialogue'; +import phrase from './_phrase'; + +salet.game_id = "your-game-id-here"; + +salet.game_version = "1.6"; + +jQuery(document).on('ready', function($) { + window.addEventListener('popstate', function(event) { + return salet.goBack(); + }); + $("#night").on("click", function() { + var styles; + if (window.night) { + styles = { + "-webkit-filter": "", + "filter": "", + "background-color": "" + }; + $("body").css(styles); + $("#night").removeClass("active"); + return window.night = false; + } else { + styles = { + "-webkit-filter": "invert(1)hue-rotate(180deg)", + "filter": "invert(1)hue-rotate(180deg)", + "background-color": "#000" + }; + $("body").css(styles); + $("#night").addClass("active"); + return window.night = true; + } + }); + return salet.beginGame(); +}); + + +/* +Element helpers. There is no real need to build monsters like a().id("hello") +because you won't use them as is. It does not make sense in context, the +author has Markdown and all utilities to *forget* about the markup. + */ + +const way_to = function(content, ref) { + return "" + content + ""; +}; + +const textlink = function(content, ref) { + return "" + content + ""; +}; + +const actlink = function(content, ref) { + return "" + content + ""; +}; + +room("start", { + enter: function() { + return salet.character.bought_lamp = false; + }, + dsc: " ", + choices: "#start" +}); + +room("inventory", { + canSave: false, + enter: function() { + return jQuery("#inventory").hide(); + }, + exit: function() { + return jQuery("#inventory").show(); + }, + dsc: function() { + var i, len, ref1, text, thing; + if (salet.character.inventory.length === 0) { + text = "You are carrying nothing."; + } else { + text = "You are carrying:\n\n"; + ref1 = salet.character.inventory; + for (i = 0, len = ref1.length; i < len; i++) { + thing = ref1[i]; + text += "* " + (salet.character.listinv(thing.name)) + "\n"; + } + } + return text + "\n\n" + ""; + }, + actions: { + exit: function() { + return salet.goBack(); + } + } +}); + +room("world", { + tags: ["start"], + optionText: "Enter the world", + ways: ["plaza"], + dsc: "### Rhinestone Room\n\nYou're in a large room carved inside a giant milky rock mountain.\nThe floor and walls are littered with signs and signatures of the previous visitors.", + units: [ + unit("well", { + dsc: "A steep narrow {{well}} proceeds upward.", + act: "There is only one passage out. See the „Other rooms“ block popped up? Click it." + }) + ] +}); + +room("plaza", { + title: function(from) { + if (from === "world") { + return "Upwards"; + } else { + return "Town plaza"; + } + }, + cycle: ["quirky", "distinct", "kooky", "crazy", "quaint"], + ways: ["shop"], + before: function(from) { + if (from === 'world') { + return "You climb up the well and come out to a central plaza of a " + (salet.view.cycleLink("quaint")) + " little town.\nA plaque nearby says it's the town of *Innsmouth,* wherever that is."; + } else { + return "You quickly find the central plaza."; + } + }, + units: [ + unit("policeman", { + dsc: "There is a policeman nearby. You could ask him {{for directions.}}", + act: function() { + var base; + if (salet.character.has_mark != null) { + return "You already talked to him, no need to bug the man twice."; + } + if ((base = salet.character).has_mark == null) { + base.has_mark = true; + } + salet.getRoom("lair"); + return "“Here, let me mark it on your map.”"; + } + }), unit("people", { + dsc: "There are {{people shouting}} nearby.", + act: 'Just some weirdos shouting "Viva la Cthulhu!". Typical.' + }) + ], + writers: { + cyclewriter: function() { + var cycleIndex, response, responses; + responses = this.cycle; + if (typeof responses === "function") { + responses = responses(); + } + cycleIndex = window.localStorage.getItem("cycleIndex"); + if (cycleIndex == null) { + cycleIndex = 0; + } + response = responses[cycleIndex]; + cycleIndex++; + if (cycleIndex === responses.length) { + cycleIndex = 0; + } + window.localStorage.setItem("cycleIndex", cycleIndex); + return salet.view.cycleLink(response); + } + } +}); + +room("shop", { + title: "The Shop", + ways: ["plaza", "shop-inside", "lair"], + dsc: "Being the only shop in town, this trendy establishment did not need a name.\nIt's an open question why it had one, especially because its name was \"Hung Crossing\".\n\nYou are standing in front of a picturesque sign. It's cold here." +}); + +room("lair", { + title: "The Lair", + before: "Finding The Lair is easy. Leaving it is impossible. Your game ends here.", + dsc: "The Lair of Yog-Sothoth is a very *n'gai* cave, full of *buggs-shoggogs* and *n'ghaa ng'aa*.", + ways: ["shop"], + units: [ + unit("bugg", { + dsc: "You see a particularly beautiful slimy {{bugg.}}", + takeable: false, + display: "bugg", + act: (function(_this) { + return function() { + salet.rooms[salet.current].drop("bugg"); + return "You eat the bugg mass. Delicious and raw. Perhaps it's a good lair to live in."; + }; + })(this) + }) + ] +}); + +phrase("Yes", "merchant", "Yes."); + +dialogue("No", "merchant", "merchant", "No."); + +room("sell-lamp", { + ways: ["shop"], + tags: ["merchant"], + choices: ["#merchant"], + optionText: "May I buy this lamp?", + title: "Talking with merchant", + canView: function() { + return salet.character.has("lamp") && salet.character.bought_lamp === false; + }, + enter: function() { + return salet.character.bought_lamp = true; + }, + dsc: "\"That'll be 30 pieces of your time.\"\n\nYou quickly pay the price and take the lamp as a rightful owner." +}); + +room("shop-inside", { + ways: ["shop"], + tags: ["merchant"], + optionText: "End the conversation", + title: "Inside the Shop", + dsc: "The insides are painted pastel white, honouring The Great Milk Spill of 1985.", + units: [ + unit("merchant", { + dsc: "A {{merchant}} eyes you warily.", + takeable: false, + act: (function(_this) { + return function() { + salet.processClick("merchdialogue"); + return ""; + }; + })(this) + }) + ] +}); + +const lamp = unit("lamp", { + display: "lamp", + takeable: true +}); + +lamp.put("shop-inside"); + +room("merchdialogue", { + choices: "#merchant", + dsc: "Nice day, isn't it?" +}); diff --git a/html/index.html b/html/index.html index 7987fa6..45497a1 100644 --- a/html/index.html +++ b/html/index.html @@ -5,7 +5,7 @@