diff --git a/game/begin.coffee b/game/begin.coffee
index dfd7b5c..328164c 100644
--- a/game/begin.coffee
+++ b/game/begin.coffee
@@ -3,10 +3,7 @@ room = require("../../lib/room.coffee")
obj = require('../../lib/obj.coffee')
dialogue = require('../../lib/dialogue.coffee')
oneOf = require('../../lib/oneOf.coffee')
-salet = require('../../lib/salet.coffee')
-
-salet.game_id = "your-game-id-here"
-salet.game_version = "1.0"
+require('../../lib/salet.coffee')
###
Element helpers. There is no real need to build monsters like a().id("hello")
@@ -26,29 +23,9 @@ textcycle = (content, ref) ->
cyclelink = (content) ->
return "#{content}"
-# usage: writemd( system, "Text to write")
-writemd = (system, text) ->
- text = markdown(text)
- system.write(text)
-
-get_room = (name) ->
- return undum.game.situations[name]
-
-# Function to return the current room.
-# Works because our `enter()` function sets the `data-situation` attribute.
-here = () ->
- return undum.game.situations[document.getElementById("current-situation").getAttribute("data-situation")]
-
# The first room of the game.
# For accessibility reasons the text is provided in HTML, not here.
room "start",
dsc: """
""",
choices: "#start"
-
-# This function needs to go after the start room.
-is_visited = (situation) ->
- place = undum.game.situations[situation]
- if place
- return Boolean place.visited
- return 0
diff --git a/game/init.coffee b/game/init.coffee
index f7afeab..3cd1dc7 100644
--- a/game/init.coffee
+++ b/game/init.coffee
@@ -1,4 +1,7 @@
# This is where you initialize your game.
-# All code in this file comes last, so the game is almost ready by this point.
-salet.init = (character, system) ->
+$(document).ready(() ->
+ salet.game_id = "your-game-id-here"
+ salet.game_version = "1.0"
+ salet.beginGame()
+)
diff --git a/lib/obj.coffee b/lib/obj.coffee
index 0aa4bd0..4c93150 100644
--- a/lib/obj.coffee
+++ b/lib/obj.coffee
@@ -1,5 +1,5 @@
markdown = require('./markdown.coffee')
-salet = require('./salet.coffee')
+require('./salet.coffee')
objlink = (content, ref) ->
return "#{content}"
diff --git a/lib/room.coffee b/lib/room.coffee
index 5a21665..a679a8c 100644
--- a/lib/room.coffee
+++ b/lib/room.coffee
@@ -5,7 +5,7 @@ markdown = require('./markdown.coffee')
cycle = require('./cycle.coffee')
Random = require('./random.js')
languages = require('./localize.coffee')
-salet = require('./salet.coffee')
+require('./salet.coffee')
# Assertion
assert = console.assert
@@ -21,10 +21,6 @@ addClass = (element, className) ->
else
element.className += ' ' + className
-cls = (system) ->
- system.clearContent()
- system.clearContent("#intro")
-
update_ways = (ways, name) ->
content = ""
distances = []
@@ -118,41 +114,41 @@ class SaletRoom
My version of `enter` splits the location description from the effects.
Also if f == this.name (we're in the same location) the `before` and `after` callbacks are ignored.
###
- entering: (character, system, f) =>
+ entering: (system, f) =>
if @clear and f?
- cls(system)
+ system.view.clearContent()
if f != @name and f?
@visited++
- if salet.rooms[f].exit?
- salet.rooms[f].exit(character, system, @name)
+ if system.rooms[f].exit?
+ system.rooms[f].exit system, @name
if @enter
- @enter character, system, f
+ @enter system, f
- current_situation = ""
+ room_content = ""
if not @extendSection
classes = if @classes then ' ' + @classes.join(' ') else ''
- situation = document.getElementById('current-room')
- if situation?
- situation.removeAttribute('id')
+ room = document.getElementById('current-room')
+ if room?
+ room.removeAttribute('id')
# Javascript DOM manipulation functions like jQuery's append() or document.createElement
# don't work like a typical printLn - they create *DOM nodes*.
# You can't leave an unclosed tag just like that. So we have to buffer the output.
- current_situation = ""
+ room_content = ""
if f != @name and @before?
- current_situation += markdown(@before.fcall(this, character, system, f))
+ room_content += markdown(@before.fcall(this, system, f))
- current_situation += @look character, system, f
+ room_content += @look system, f
if f != @name and @after?
- current_situation += markdown(@after.fcall(this, character, system, f))
+ room_content += markdown(@after.fcall(this, system, f))
if not @extendSection
- current_situation += ""
+ room_content += ""
- system.write(current_situation)
+ system.write(room_content)
if @choices
system.writeChoices(system.getSituationIdChoices(@choices, @minChoices, @maxChoices))
@@ -272,7 +268,13 @@ room = (name, spec) ->
spec ?= {}
spec.name = name
retval = new SaletRoom(spec)
- retval.register()
+ $(document).ready(() ->
+ if salet
+ retval.register()
+ else
+ sleep(1000)
+ retval.register()
+ )
return retval
module.exports = room
diff --git a/lib/salet.coffee b/lib/salet.coffee
index 941a402..04e0d53 100644
--- a/lib/salet.coffee
+++ b/lib/salet.coffee
@@ -1,5 +1,5 @@
markdown = require('./markdown.coffee')
-view = require('./view.coffee')
+SaletView = require('./view.coffee')
Random = require('./random.js')
###
@@ -48,7 +48,7 @@ augmentLinks = (content) ->
# If we're a once-click, remove all matching links.
if (a.hasClass("once") || href.match(/[?&]once[=&]?/))
- view.clearLinks(href)
+ @view.clearLinks(href)
processClick(href)
return false
@@ -92,13 +92,13 @@ class Salet
situation. It is called before the corresponding situation
has its `enter` method called.
###
- entering: (character, oldSituationId, newSituationId) ->
+ enter: (oldSituationId, newSituationId) ->
###
Hook for when the situation has already been carried out
and printed.
###
- afterEnter: (character, oldSituationId, newSituationId) ->
+ afterEnter: (oldSituationId, newSituationId) ->
###
This function is called before carrying out any action in
@@ -110,21 +110,21 @@ class Salet
on to the situation. Note that this is the only one of
these global handlers that can consume the event.
###
- beforeAction: (character, situationId, actionId) ->
+ beforeAction: (situationId, actionId) ->
###
This function is called after carrying out any action in
any situation. It is called after the corresponding
situation has its `act` method called.
###
- afterAction: (character, situationId, actionId) ->
+ afterAction: (situationId, actionId) ->
###
This function is called after leaving any situation. It is
called after the corresponding situation has its `exit`
method called.
###
- exit: (character, oldSituationId, newSituationId) ->
+ exit: (oldSituationId, newSituationId) ->
###
Returns a list of situation ids to choose from, given a set of
@@ -307,7 +307,7 @@ class Salet
@linkStack.push(code)
return
- view.mark_all_links_old
+ @view.mark_all_links_old
# We're processing, so make the stack available.
@linkStack = []
@@ -375,32 +375,30 @@ class Salet
processLink(code)
# Transitions between situations.
- doTransitionTo: (newSituationId) ->
- oldSituationId = current
- oldSituation = @getCurrentRoom()
- newSituation = @rooms[newSituationId]
+ doTransitionTo: (newRoomId) ->
+ oldRoomId = @current
+ oldRoom = @getCurrentRoom()
+ newRoom = @rooms[newRoomId]
- assert(newSituation, "unknown_situation".l({id:newSituationId}))
+ assert(newRoom, "unknown_situation".l({id:newRoomId}))
# We might not have an old situation if this is the start of the game.
- if (oldSituation)
- if (@exit)
- @exit(@character, oldSituationId, newSituationId);
+ if (oldRoom and @exit)
+ @exit(oldRoomId, newRoomId)
+
+ @current = newRoomId
# Remove links and transient sections.
- view.remove_transient(@interactive)
-
- # Move the character.
- current = newSituationId
+ @view.remove_transient(@interactive)
# Notify the incoming situation.
if (@enter)
- @enter(@character, this, oldSituationId, newSituationId)
- newSituation.entering(@character, oldSituationId)
+ @enter(oldRoomId, newRoomId)
+ newRoom.entering(this, oldRoomId)
# additional hook for when the situation text has already been printed
if (@afterEnter)
- @afterEnter(@character, oldSituationId, newSituationId)
+ @afterEnter(oldRoomId, newRoomId)
###
Erases the character in local storage. This is permanent!
@@ -436,9 +434,9 @@ class Salet
localStorage.setItem(getSaveId(), JSON.stringify(@progress))
# Switch the button highlights.
- view.disableSaving()
- view.enableErasing()
- view.enableLoading()
+ @view.disableSaving()
+ @view.enableErasing()
+ @view.enableLoading()
# Loads the game from the given data
loadGame: (characterData) ->
@@ -447,7 +445,7 @@ class Salet
character = new Character()
@rnd = new Random(@progress.seed)
- view.clearContent()
+ @view.clearContent()
# Now play through the actions so far:
if (@init)
@@ -465,17 +463,19 @@ class Salet
now = new Date().getTime() * 0.001
startTime = now - @progress.saveTime
+ view: new SaletView
+
beginGame: () ->
# Handle storage.
storedCharacter = false
- if (view.hasLocalStorage())
+ if (@view.hasLocalStorage())
storedCharacter = localStorage.getItem(@getSaveId())
if (storedCharacter)
try
@loadGame(JSON.parse(storedCharacter))
- view.disableSaving()
- view.enableErasing()
+ @view.disableSaving()
+ @view.enableErasing()
catch err
@erase_save(true)
else
@@ -485,16 +485,15 @@ class Salet
@rnd = new Random(@progress.seed)
@progress.sequence = [{link:@start, when:0}]
- view.clearContent()
+ @view.clearContent()
# Start the game
- startTime = new Date().getTime() * 0.001
- @time = 0
+ @startTime = new Date().getTime() * 0.001
if (@init)
@init(character)
# Do the first state.
- @doTransitionTo(@start);
+ @doTransitionTo(@start)
# Any point that an option list appears, its options are its first links.
$("body").on('click', "ul.options li, #menu li", (event) ->
@@ -502,17 +501,25 @@ class Salet
link = $("a", this)
if (link.length > 0)
$(link.get(0)).click()
- );
+ )
-salet = new Salet
+ getRoom: (name) ->
+ return @rooms[name]
+
+ # Just an alias for getCurrentRoom
+ here: () -> @getCurrentRoom()
+
+ isVisited: (name) ->
+ place = @getRoom(name)
+ if place
+ return Boolean place.visited
+ return 0
# Set up the game when everything is loaded.
$(document).ready(() ->
- if (view.hasLocalStorage())
+ salet = new Salet
+ salet.view.init()
+ if (salet.view.hasLocalStorage())
$("#erase").click(salet.erase_save) # is Salet defined here?
$("#save").click(salet.saveGame)
-
- salet.beginGame()
)
-
-module.exports = salet
diff --git a/lib/view.coffee b/lib/view.coffee
index d616f76..36f453c 100644
--- a/lib/view.coffee
+++ b/lib/view.coffee
@@ -12,12 +12,13 @@ but they could be something else entirely. (That's why IDs are hardcoded.)
class SaletView
init: () ->
- $("#ways").on("click", "a", (event) ->
+ $("#content, #ways").on("click", "a", (event) ->
event.preventDefault()
salet.processClick($(this).attr("href"))
)
$("#inventory").on("click", "a", (event) ->
event.preventDefault()
+ alert("Not done yet")
)
$("#load").on("click", "a", (event) ->
window.location.reload()
@@ -192,9 +193,4 @@ class SaletView
hasStorage = false
return hasStorage
-view = new SaletView
-$(document).ready(() ->
- view.init()
-)
-
-module.exports = view
+module.exports = SaletView