Можно разговаривать с NPC! (ура)

А ещё я исправил баг с эффектами.
This commit is contained in:
Alexander Yakovlev 2016-12-10 22:31:49 +07:00
parent 80f30194d7
commit e572061fb2
12 changed files with 159 additions and 39 deletions

View File

@ -102,6 +102,7 @@ gulp.task('serve', ['build'], () ->
gulp.watch(['./sass/*.scss'], ['sass']) gulp.watch(['./sass/*.scss'], ['sass'])
gulp.watch(['./img/*.png', './img/*.jpeg', './img/*.jpg'], ['img']) gulp.watch(['./img/*.png', './img/*.jpeg', './img/*.jpg'], ['img'])
gulp.watch(['./game/*.coffee'], ['coffee']); gulp.watch(['./game/*.coffee'], ['coffee']);
gulp.watch(['./game/procgen/*/*.cson'], ['concatCoffee']);
gulp.watch(['./build/css/main.css'], sassListener) gulp.watch(['./build/css/main.css'], sassListener)
gulp.watch( gulp.watch(

View File

@ -22,6 +22,10 @@ $.getJSON('game/procgen/'+i18n.lang+'.json', (data) ->
$.holdReady( false ) $.holdReady( false )
) )
salet.init = () ->
salet.character.lastBeat = () ->
return salet.progress.sequence.length - salet.character.beat
$(document).ready(() -> $(document).ready(() ->
window.addEventListener('popstate', (event) -> window.addEventListener('popstate', (event) ->
salet.goBack() salet.goBack()
@ -65,3 +69,27 @@ actlink = (content, ref) ->
class ImprovModel class ImprovModel
constructor: () -> constructor: () ->
@tags = [] @tags = []
getTag: (tagName) ->
for tag in @tags
if tag[0] == tagName
return tag[1]
return undefined
hasTag: (tagName) ->
for tag in @tags
if tag[0] == tagName
return true
return false
setTag: (tagName, value) ->
for tag, index in @tags
if tag[0] == tagName
@tags[index][1] = value
return true
@tags.push([tagName, value])
return true
setTagIfNotPresent: (tagName, value) ->
if @getTag(tagName) == undefined
@tags.push([tagName, value])
state = new ImprovModel
procgen = (tag) ->
return Improv.gen(tag, state)

View File

@ -3,26 +3,74 @@ module.exports =
erase_message: "Это навсегда удалит вашего персонажа и немедленно вернёт вас на старт игры. Вы уверены?" erase_message: "Это навсегда удалит вашего персонажа и немедленно вернёт вас на старт игры. Вы уверены?"
back: "Обратно" back: "Обратно"
intro: """ intro: """
-- Только что звонили из клуба. <..> # Не забыть назвать игру
Наконец-то. Наконец-то эти однообразные концерты закончились, и ваша группа
поехала на гастроли. По Сибири. Играть очень народный фолк.
Именно проклиная всё, что было с вами по ту сторону Урала, вы едете по трассе
прямо на восток, пока не приедете в Самое Холодное Место.
А оттуда уже можно будет город за городом прыгать домой.
""" """
dsc: (Improv) -> """ dsc: (Improv, state) -> """
### В машине ##### В машине
Рядом с вами сидит [Лёша](alexey) и #{Improv.gen("alexey")} Рядом с вами сидит [Лёша](alexey). #{Improv.gen("alexey", state)}
На переднем сидении [Марго](margo) #{Improv.gen("margo")} Передним пассажиром едет [Марго](margo). #{Improv.gen("margo", state)}
Вы сидите на заднем сидении, за спиной водителя. [Катя](katie) #{Improv.gen("katie")} Вы сидите на заднем сидении, за спиной водителя [Кати](katie). #{Improv.gen("katie", state)}
Вы положили в карман дверцы [мобильный телефон.](phone) Вы положили в карман дверцы [мобильный телефон.](phone)
За [окном машины](./_writer_window) проносится трасса. За [окном машины](./_writer_window) проносится трасса.
#{Improv.gen("you")} #{Improv.gen("you", state)}
"""
story_call: """
У Лёши звонит телефон.
"""
alexey_dsc: (Improv, state) -> """
Лучший клавишник России по мнению Маргариты (что не мешает ему сидеть на перкуссии),
золотой самородок Нижнего Новгорода и просто -- ОН.
#{Improv.gen("alexey", state)}
"""
margo_dsc: (Improv, state) -> """
#{Improv.gen("margo", state)}
"""
katie_dsc: (Improv, state) -> """
#{Improv.gen("katie", state)}
"""
katie_bye: """
-- Ладно, не буду отвлекать.
Катя многозначительно молчит в ответ.
"""
margo_bye: """
-- Ну ладно, у меня тут в окне важные дела.
-- Всё интересное мы уже проехали.
-- А я не хочу ничего пропустить!
"""
alexey_bye: """
Я замолкаю. Разговор быстро затухает, как будто мы и не говорили вовсе.
"""
alexey_mood: "Как настроение, Лёш?"
alexey_mood_answ: "Паршивое. Но это нормально, оно всегда паршивое."
alexey_speed: "Как думаешь, скоро приедем?"
alexey_speed_answ: """
-- Как думаешь, скоро приедем?
-- Приедем, как приедем. В прошлом городе приехали вовремя, а зрителей не было.
А до этого опоздали, и был полный зал. Хочешь, порепетируем?
-- Не надо.
""" """
phone_dsc: "Вы открываете список контактов. Кому бы позвонить…" phone_dsc: "Вы открываете список контактов. Кому бы позвонить…"
director_prompt: "Директор музыкального клуба" director_prompt: "Директор музыкального клуба"
director_dsc: """ director_dsc: """
Алло? Анна Борисовна? Алло? Анна Борисовна?
""" """
bye: "Попрощаться" bye: "Закончить разговор"
cyalater: """ cyalater: """
Спасибо. Созвонимся. Спасибо. Созвонимся.
""" """

View File

@ -1,5 +1,7 @@
phrases: [ phrases: [
"обнимает гитару." "Он обнимает футляр с гитарой Марго."
"насвистывает свою партию в песне про солнце." "Он насвистывает свою партию в песне про солнце."
"задумчиво смотрит в одну точку." "Он задумчиво смотрит в одну точку."
"Он выудил откуда-то томик Стивена Кинга и взахлёб читает."
"Он развалился, уткнув ноги в спинку переднего сиденья."
] ]

View File

@ -1,3 +1,3 @@
phrases: [ phrases: [
"выжимает из машины всё, что дозволено правилами." "Она выжимает из машины всё, что дозволено правилами."
] ]

View File

@ -1,3 +1,3 @@
phrases: [ phrases: [
"напевает про себя весёлый мотивчик." "Она напевает про себя весёлый мотивчик."
] ]

View File

@ -8,6 +8,7 @@ groups: [
['weather', 'warm'] ['weather', 'warm']
] ]
phrases: [ phrases: [
'В машине душно, а за окном солнышко.'
] ]
, ,
tags: [ tags: [

View File

@ -1,3 +1,15 @@
phrases: [ groups: [
"Вы сжимаете родную флейту. Только бы не опоздать." tags: [
['mood', 'calm'] # спокойное настроение
]
phrases: [
"Вам хорошо и спокойно."
]
,
tags: [
['mood', 'shaky'] # нервное состояние
]
phrases: [
"Вы сжимаете родную флейту. Только бы не опоздать."
]
] ]

View File

@ -1,30 +1,69 @@
## REAL ROOM
room "start", room "start",
clear: false
before: (from) -> before: (from) ->
if (!from) if (!from)
salet.character.beat = 0
state.setTag("weather", "warm")
state.setTag("mood", "calm")
return "intro".l() return "intro".l()
dsc: () -> "dsc".l(Improv) dsc: () -> "dsc".l(Improv, state)
beforeChoices: () ->
if salet.character.lastBeat() > 3 and salet.character.heard_call == false
salet.character.heard_call = true
salet.character.beat = salet.progress.sequence.length
salet.view.write "<b>#{"story_call".l()}</b>"
writers: writers:
window: () -> window: () ->
# re-enter the room, reroll the description # re-enter the room, reroll the description
salet.view.clearContent() salet.view.clearContent()
salet.here().entering("start") salet.here().entering("start")
return "<em>"+Improv.gen("window")+"</em>" return "<em>"+procgen("window")+"</em>"
room "phone", ## ACTUALLY DIALOGUES
choices: "#call",
dsc: "phone_dsc".l() dlg = (name) ->
return room(name, {
choices: "##{name}",
dsc: () ->
"#{name}_dsc".l(Improv, state)
})
dlg_bye = (name) ->
return room("#{name}_bye", {
clear: false
tags: [name]
optionText: "bye".l()
dsc: "#{name}_bye".l()
after: () ->
return salet.goTo("start")
})
dlg("alexey")
dlg("margo")
dlg("katie")
dlg("phone")
dialogue "alexey_mood".l(), "alexey", "alexey", "alexey_mood_answ".l()
dialogue "alexey_speed".l(), "alexey", "alexey", "alexey_speed_answ".l()
dlg_bye("alexey")
dlg_bye("margo")
dlg_bye("katie")
room "director", room "director",
tags: ["call"], tags: ["phone"],
choices: "#director" choices: "#director"
optionText: "director_prompt".l() optionText: "director_prompt".l()
dsc: "director_dsc".l() dsc: "director_dsc".l()
dialogue "bye".l(), "director", "call", "cyalater".l() # особый диалог прощания, потому что у него особый текст на возврате
dialogue "bye".l(), "director", "phone", "cyalater".l()
# Virtual room to go around limitations # Virtual room to go around limitations
room "vstart", room "vstart",
tags: ["call"] tags: ["phone"]
optionText: (from) -> optionText: (from) ->
switch from switch from
when "phone" then "end_phone".l() when "phone" then "end_phone".l()

View File

@ -12,8 +12,8 @@
<div class="fixed container"> <div class="fixed container">
<div id="tools_wrapper" class="row"> <div id="tools_wrapper" class="row">
<div class="buttons"> <div class="buttons">
<button id="night" class="btn btn-outline-primary">Night mode</button>
<button id="erase" class="btn btn-outline-danger">Restart</button> <button id="erase" class="btn btn-outline-danger">Restart</button>
<button id="night" class="btn btn-outline-primary">Night mode</button>
</div> </div>
</div> <!-- End of div.tools_wrapper --> </div> <!-- End of div.tools_wrapper -->
</div> </div>

View File

@ -12,22 +12,12 @@
<div class="fixed container"> <div class="fixed container">
<div id="tools_wrapper" class="row"> <div id="tools_wrapper" class="row">
<div class="buttons"> <div class="buttons">
<button id="night" class="btn btn-outline-primary">Night mode</button> <button id="erase" class="btn btn-outline-danger">Заново</button>
<button id="erase" class="btn btn-outline-danger">Restart</button> <button id="night" class="btn btn-outline-primary">Ночной режим</button>
</div> </div>
</div> <!-- End of div.tools_wrapper --> </div> <!-- End of div.tools_wrapper -->
</div> </div>
<div class="container"> <div class="container">
<div class="row">
<div id="title" class="title">
<div class="label">
<h1>Не забыть назвать игру</h1>
<noscript>
<p class="noscript_message">This game requires Javascript.</p>
</noscript>
</div>
</div>
</div>
<div id="content_wrapper" class="row"> <div id="content_wrapper" class="row">
<div id="content" class="content"> <div id="content" class="content">
<noscript>You need to turn on Javascript to play this game.</noscript> <noscript>You need to turn on Javascript to play this game.</noscript>

View File

@ -72,9 +72,7 @@ body {
#tools_wrapper { #tools_wrapper {
background: $body-bg; background: $body-bg;
.buttons { .buttons {
@include make-col(6); text-align: left;
@include make-col-offset(6);
text-align: right;
} }
button { button {
display: inline-block; display: inline-block;
@ -82,6 +80,7 @@ body {
} }
#content_wrapper { #content_wrapper {
background: $text_background; background: $text_background;
padding-top: 2em;
border-radius: 5px; border-radius: 5px;
} }
.content { .content {