Можно разговаривать с 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(['./img/*.png', './img/*.jpeg', './img/*.jpg'], ['img'])
gulp.watch(['./game/*.coffee'], ['coffee']);
gulp.watch(['./game/procgen/*/*.cson'], ['concatCoffee']);
gulp.watch(['./build/css/main.css'], sassListener)
gulp.watch(

View File

@ -22,6 +22,10 @@ $.getJSON('game/procgen/'+i18n.lang+'.json', (data) ->
$.holdReady( false )
)
salet.init = () ->
salet.character.lastBeat = () ->
return salet.progress.sequence.length - salet.character.beat
$(document).ready(() ->
window.addEventListener('popstate', (event) ->
salet.goBack()
@ -65,3 +69,27 @@ actlink = (content, ref) ->
class ImprovModel
constructor: () ->
@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: "Это навсегда удалит вашего персонажа и немедленно вернёт вас на старт игры. Вы уверены?"
back: "Обратно"
intro: """
-- Только что звонили из клуба. <..>
"""
dsc: (Improv) -> """
### В машине
# Не забыть назвать игру
Рядом с вами сидит [Лёша](alexey) и #{Improv.gen("alexey")}
На переднем сидении [Марго](margo) #{Improv.gen("margo")}
Вы сидите на заднем сидении, за спиной водителя. [Катя](katie) #{Improv.gen("katie")}
Наконец-то. Наконец-то эти однообразные концерты закончились, и ваша группа
поехала на гастроли. По Сибири. Играть очень народный фолк.
Именно проклиная всё, что было с вами по ту сторону Урала, вы едете по трассе
прямо на восток, пока не приедете в Самое Холодное Место.
А оттуда уже можно будет город за городом прыгать домой.
"""
dsc: (Improv, state) -> """
##### В машине
Рядом с вами сидит [Лёша](alexey). #{Improv.gen("alexey", state)}
Передним пассажиром едет [Марго](margo). #{Improv.gen("margo", state)}
Вы сидите на заднем сидении, за спиной водителя [Кати](katie). #{Improv.gen("katie", state)}
Вы положили в карман дверцы [мобильный телефон.](phone)
За [окном машины](./_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: "Вы открываете список контактов. Кому бы позвонить…"
director_prompt: "Директор музыкального клуба"
director_dsc: """
Алло? Анна Борисовна?
"""
bye: "Попрощаться"
bye: "Закончить разговор"
cyalater: """
Спасибо. Созвонимся.
"""

View File

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

View File

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

View File

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

View File

@ -8,6 +8,7 @@ groups: [
['weather', 'warm']
]
phrases: [
'В машине душно, а за окном солнышко.'
]
,
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",
clear: false
before: (from) ->
if (!from)
salet.character.beat = 0
state.setTag("weather", "warm")
state.setTag("mood", "calm")
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:
window: () ->
# re-enter the room, reroll the description
salet.view.clearContent()
salet.here().entering("start")
return "<em>"+Improv.gen("window")+"</em>"
return "<em>"+procgen("window")+"</em>"
room "phone",
choices: "#call",
dsc: "phone_dsc".l()
## ACTUALLY DIALOGUES
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",
tags: ["call"],
tags: ["phone"],
choices: "#director"
optionText: "director_prompt".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
room "vstart",
tags: ["call"]
tags: ["phone"]
optionText: (from) ->
switch from
when "phone" then "end_phone".l()

View File

@ -12,8 +12,8 @@
<div class="fixed container">
<div id="tools_wrapper" class="row">
<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="night" class="btn btn-outline-primary">Night mode</button>
</div>
</div> <!-- End of div.tools_wrapper -->
</div>

View File

@ -12,22 +12,12 @@
<div class="fixed container">
<div id="tools_wrapper" class="row">
<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">Заново</button>
<button id="night" class="btn btn-outline-primary">Ночной режим</button>
</div>
</div> <!-- End of div.tools_wrapper -->
</div>
<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" class="content">
<noscript>You need to turn on Javascript to play this game.</noscript>

View File

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