Maze code
This commit is contained in:
parent
19588cd17b
commit
c94a7a2958
|
@ -46,7 +46,7 @@ html = (target, debug) ->
|
||||||
'node_modules/improv/dist/template.js'
|
'node_modules/improv/dist/template.js'
|
||||||
])
|
])
|
||||||
.pipe(gulp.dest(target+"/game/improv"))
|
.pipe(gulp.dest(target+"/game/improv"))
|
||||||
gulp.src(['/www/games/salet-module/lib/index.min.js'])
|
gulp.src(['node_modules/salet/lib/index.min.js'])
|
||||||
.pipe(rename('salet.min.js'))
|
.pipe(rename('salet.min.js'))
|
||||||
.pipe(gulp.dest(target+"/game"))
|
.pipe(gulp.dest(target+"/game"))
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
Работает только в новых браузерах с поддержкой ES6.
|
Работает только в новых браузерах с поддержкой ES6.
|
||||||
Если хотите, чтобы работало во всех браузерах, надо компилировать Improv вместе
|
Если хотите, чтобы работало во всех браузерах, надо компилировать Improv вместе
|
||||||
с полифиллом для babel.
|
с полифиллом для babel.
|
||||||
|
Для других игр я пробовал переписывать Improv на CoffeeScript, но хочется всё-таки иметь
|
||||||
|
возможность обновляться.
|
||||||
Сам код игры и Salet такой строгой зависимости не имеет.
|
Сам код игры и Salet такой строгой зависимости не имеет.
|
||||||
|
|
||||||
Код демо собран из обрезков разных игр и черновиков. Есть баги.
|
Код демо собран из обрезков разных игр и черновиков. Есть баги.
|
||||||
|
|
|
@ -51,6 +51,7 @@ setup_keys = () ->
|
||||||
)
|
)
|
||||||
|
|
||||||
$(document).ready(() ->
|
$(document).ready(() ->
|
||||||
|
$(".tab_wrapper").hide()
|
||||||
window.addEventListener('popstate', (event) ->
|
window.addEventListener('popstate', (event) ->
|
||||||
salet.goBack()
|
salet.goBack()
|
||||||
)
|
)
|
||||||
|
@ -108,6 +109,12 @@ $(document).ready(() ->
|
||||||
salet.beginGame()
|
salet.beginGame()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
$(document).on('room_ru_exit', () ->
|
||||||
|
$(".tab_wrapper").show()
|
||||||
|
)
|
||||||
|
$(document).on('room_en_exit', () ->
|
||||||
|
$(".tab_wrapper").show()
|
||||||
|
)
|
||||||
$(document).on('init', () ->
|
$(document).on('init', () ->
|
||||||
salet.character.improv = new Improv(window.improvdata, {
|
salet.character.improv = new Improv(window.improvdata, {
|
||||||
filters: [
|
filters: [
|
||||||
|
|
|
@ -69,73 +69,6 @@ sysroom "inventory",
|
||||||
for thing in salet.character.inventory
|
for thing in salet.character.inventory
|
||||||
text += "* #{salet.character.listinv(thing.name)}\n"
|
text += "* #{salet.character.listinv(thing.name)}\n"
|
||||||
|
|
||||||
sysroom "map",
|
|
||||||
text: () ->
|
|
||||||
return "<div id='map'></div>"
|
|
||||||
after: () ->
|
|
||||||
data = {
|
|
||||||
edges: []
|
|
||||||
nodes: []
|
|
||||||
}
|
|
||||||
edges = []
|
|
||||||
rooms = []
|
|
||||||
globx = 1
|
|
||||||
globy = 1
|
|
||||||
deltas = [
|
|
||||||
# [1, 0], # looks bad on our map
|
|
||||||
[0, 1],
|
|
||||||
[-1, 0],
|
|
||||||
[0, -1],
|
|
||||||
]
|
|
||||||
for name, room of salet.rooms
|
|
||||||
if room.canSave == false or name == "start"
|
|
||||||
continue
|
|
||||||
if rooms.indexOf(name) == -1
|
|
||||||
data.nodes.push({
|
|
||||||
"id": name
|
|
||||||
"label": room.title()
|
|
||||||
"size": 5
|
|
||||||
"color": "#000"
|
|
||||||
"x": globx
|
|
||||||
"y": globy
|
|
||||||
})
|
|
||||||
rooms.push(name)
|
|
||||||
if room.ways? and room.ways.length > 0
|
|
||||||
delta = 0
|
|
||||||
for way in room.ways
|
|
||||||
id = "edge_"+name+"_"+way
|
|
||||||
# we don't want to display a two-way link twice
|
|
||||||
if edges.indexOf("edge_"+way+"_"+name) == -1
|
|
||||||
edges.push(id)
|
|
||||||
data.edges.push({
|
|
||||||
"id": id
|
|
||||||
"source": room.name
|
|
||||||
"target": way
|
|
||||||
"size": 1
|
|
||||||
"color": "#ccc"
|
|
||||||
})
|
|
||||||
if rooms.indexOf(way) == -1
|
|
||||||
data.nodes.push({
|
|
||||||
"id": way
|
|
||||||
"label": salet.rooms[way].title()
|
|
||||||
"size": 5
|
|
||||||
"color": "#000"
|
|
||||||
"x": globx + deltas[delta][0]
|
|
||||||
"y": globy + deltas[delta][1]
|
|
||||||
})
|
|
||||||
rooms.push(way)
|
|
||||||
delta++
|
|
||||||
globy = globy - 2
|
|
||||||
s = new sigma({
|
|
||||||
graph: data,
|
|
||||||
container: 'map'
|
|
||||||
})
|
|
||||||
s.bind('clickNode', (e) ->
|
|
||||||
switchTab("storytab")
|
|
||||||
salet.goTo(e.data.node.id)
|
|
||||||
)
|
|
||||||
return ""
|
|
||||||
|
|
||||||
$(document).on("room_language_after_choices", () ->
|
$(document).on("room_language_after_choices", () ->
|
||||||
$(".options").addClass("narrowchoice")
|
$(".options").addClass("narrowchoice")
|
||||||
)
|
)
|
||||||
|
@ -160,10 +93,6 @@ sysroom "en",
|
||||||
i18n.lang = "en"
|
i18n.lang = "en"
|
||||||
salet.goTo('maze')
|
salet.goTo('maze')
|
||||||
|
|
||||||
sysroom "menu",
|
|
||||||
dsc: ""
|
|
||||||
choices: "#menu"
|
|
||||||
|
|
||||||
sysroom "settings",
|
sysroom "settings",
|
||||||
tags: ["menu"]
|
tags: ["menu"]
|
||||||
title: () -> "settings_title".l()
|
title: () -> "settings_title".l()
|
||||||
|
@ -190,9 +119,21 @@ sysroom "inventory",
|
||||||
text += "* #{salet.character.listinv(thing.name)}\n"
|
text += "* #{salet.character.listinv(thing.name)}\n"
|
||||||
|
|
||||||
sysroom "map",
|
sysroom "map",
|
||||||
text: () -> """
|
text: () ->
|
||||||
Здесь будет карта
|
out = "<table class='map'>"
|
||||||
"""
|
for y in [0..(salet.character.maze.height-1)]
|
||||||
|
out += "<tr>"
|
||||||
|
for x in [0..(salet.character.maze.width-1)]
|
||||||
|
cell = salet.character.maze.at(x,y)
|
||||||
|
className = cell.getTag("type")
|
||||||
|
if x == salet.character.x and y == salet.character.y
|
||||||
|
className += " current"
|
||||||
|
out += "<td class='"+className+"'>"
|
||||||
|
out += cell.log()
|
||||||
|
out += "</td>"
|
||||||
|
out += "</tr>\n"
|
||||||
|
out += "</table>"
|
||||||
|
return out
|
||||||
|
|
||||||
Array.prototype.remove = (args...) ->
|
Array.prototype.remove = (args...) ->
|
||||||
output = []
|
output = []
|
||||||
|
@ -309,7 +250,6 @@ tagMismatchFilter = (group, model) ->
|
||||||
return null
|
return null
|
||||||
return score
|
return score
|
||||||
|
|
||||||
|
|
||||||
setAdjacent = (model) ->
|
setAdjacent = (model) ->
|
||||||
cells = {}
|
cells = {}
|
||||||
cells["north"] = salet.character.maze.getNorth(salet.character.x, salet.character.y)
|
cells["north"] = salet.character.maze.getNorth(salet.character.x, salet.character.y)
|
||||||
|
@ -331,3 +271,9 @@ setAdjacent = (model) ->
|
||||||
model["#{type}_direction_adverb"] = "#{direction}_adverb".l()
|
model["#{type}_direction_adverb"] = "#{direction}_adverb".l()
|
||||||
model.tags.push(["adjacent", adjacent])
|
model.tags.push(["adjacent", adjacent])
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
class ImprovModel
|
||||||
|
constructor: () ->
|
||||||
|
@tags = []
|
||||||
|
# склонение существительных в родительный падеж
|
||||||
|
genitive: (word) ->
|
||||||
|
|
|
@ -16,6 +16,59 @@ plotscene = (title, options) ->
|
||||||
return ""
|
return ""
|
||||||
return room(title, options)
|
return room(title, options)
|
||||||
|
|
||||||
|
room "maze",
|
||||||
|
clear: false
|
||||||
|
priority: -10
|
||||||
|
showTransition: true
|
||||||
|
before: (from) ->
|
||||||
|
if @showTransition == false
|
||||||
|
@showTransition = true
|
||||||
|
return ""
|
||||||
|
|
||||||
|
salet.character.update_inventory()
|
||||||
|
currentCell = salet.character.getCell()
|
||||||
|
if currentCell.hasTag('special')
|
||||||
|
salet.character.past_x = salet.character.x
|
||||||
|
salet.character.past_y = salet.character.y
|
||||||
|
salet.saveGame()
|
||||||
|
return salet.specials[currentCell.getTag('special')]()
|
||||||
|
|
||||||
|
model = new ImprovModel
|
||||||
|
if salet.character.past_x?
|
||||||
|
pastCell = salet.character.getCell(salet.character.past_x, salet.character.past_y)
|
||||||
|
model.tags.push(['from', pastCell.getTag('type')])
|
||||||
|
else
|
||||||
|
model.tags.push(['from', 'outside'])
|
||||||
|
model.tags.push(['to', currentCell.getTag('type')])
|
||||||
|
# Piwik analytics: terrain type
|
||||||
|
_paq.push(['setCustomDimension', 1, currentCell.getTag('type')])
|
||||||
|
model = setAdjacent(model)
|
||||||
|
|
||||||
|
salet.character.past_x = salet.character.x
|
||||||
|
salet.character.past_y = salet.character.y
|
||||||
|
return salet.character.improv.gen('transition', model)
|
||||||
|
dsc: () ->
|
||||||
|
update_paths(salet.character)
|
||||||
|
salet.character.describe()
|
||||||
|
canExit: (to) ->
|
||||||
|
model = []
|
||||||
|
model["x"] = salet.character.x
|
||||||
|
model["y"] = salet.character.y
|
||||||
|
model[to.varname] = model[to.varname] + to.add
|
||||||
|
|
||||||
|
# Определяем, может ли персонаж зайти на клетку.
|
||||||
|
# Некоторые типы клеток требуют особого навыка.
|
||||||
|
cell = salet.character.maze.at(model["x"], model["y"])
|
||||||
|
if cell.getTag("type") == "lake"
|
||||||
|
salet.view.append("*#{"lake_inaccessible".l()}*")
|
||||||
|
@showTransition = false
|
||||||
|
return false
|
||||||
|
if cell.getTag("type") == "rock"
|
||||||
|
salet.view.append("*#{"rock_inaccessible".l()}")
|
||||||
|
@showTransition = false
|
||||||
|
return false
|
||||||
|
return true
|
||||||
|
|
||||||
## Встреча 1
|
## Встреча 1
|
||||||
plotscene "meet1",
|
plotscene "meet1",
|
||||||
enter: () ->
|
enter: () ->
|
||||||
|
|
5
package-lock.json
generated
5
package-lock.json
generated
|
@ -5661,6 +5661,11 @@
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"salet": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/salet/-/salet-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-Xj4W2+AOB/8LeGo9kmWvT2gXmLeC4GnPy2uhorHF8W/YVPMd+GtZ92MJ3ue2ZfuLAX9EixVtYjBBsU3XKI2t2g=="
|
||||||
|
},
|
||||||
"sass-graph": {
|
"sass-graph": {
|
||||||
"version": "2.2.4",
|
"version": "2.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"browserify": "^16.2.2",
|
"browserify": "^16.2.2",
|
||||||
"cson": "^5.1.0",
|
"cson": "^5.1.0",
|
||||||
"improv": "^1.0.0",
|
"improv": "^1.0.0",
|
||||||
|
"salet": "^2.0.1",
|
||||||
"vinyl-source-stream": "^2.0.0",
|
"vinyl-source-stream": "^2.0.0",
|
||||||
"watchify": "^3.11.0"
|
"watchify": "^3.11.0"
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue