init python:
# автоматическое объявление спрайтов
config.automatic_images_minimum_components = 1
config.automatic_images = [" ", "_", "/"]
config.automatic_images_strip = ["images"]
init:
# яркость и масштаб выделенного персонажа
default char_brightness = .15
default char_zoom = 1.025
# время на выделение персонажа
default char_t = .25
# позиция спрайта на экране
transform xpos(x=.5):
anchor(.5, 1.)
pos(x, 1.)
# плавно отключаем выделение персонажа
transform mark_off(t=char_t):
ease_quad t matrixcolor BrightnessMatrix(0) zoom 1
# плавно включаем выделение персонажа
transform mark(t=char_t, z=char_zoom):
parallel:
matrixcolor BrightnessMatrix(0)
# для вспышки
ease_quad t*.25 matrixcolor BrightnessMatrix(char_brightness * 2)
# для постоянного выделения
ease_quad t*.75 matrixcolor BrightnessMatrix(char_brightness)
parallel:
# увеличение - выдвигаемся на передний план
ease_quad t zoom z
init python:
from functools import partial
# найти на экране картинку, которая начинается с заданного тега
# (чтобы выделение не учитывало эмоции и прочие дополнительные теги)
def img_by_tag(tag):
if tag:
imgs = renpy.get_showing_tags()
for i in imgs:
if str(i).startswith(tag):
return str(i)
# если на экране нет говорящего персонажа, то и не показываем его
return None
# последний говоривший
speaking_char = None
# показать того же персонажа, если он уже есть на экране
def char_show(char, at_list=[]):
i = img_by_tag(char)
if i:
renpy.show(i, at_list=at_list)
# снять выделение
def char_off(t=None):
# если нужно ждать, то берем установленную в настройках паузу
if t == True:
t = char_t
# снимаем выделение
char_show(img_by_tag(store.speaking_char), at_list=[mark_off()])
store.speaking_char = None
# пауза, если нужна, чтобы персонаж успел снять выделение
if t:
renpy.pause(t)
# выделяем говорящего
def char_blink(char, event_name, *args, **kwarg):
# если начинает говорить новый персонаж
if event_name == "begin" and char != store.speaking_char:
# то со старого снимаем выделение
char_off()
# запоминаем нового оратора
store.speaking_char = char
# ставим на него выделение
char_show(char, at_list=[mark()])
# сокращаем писанину при объявлении персонажей
# функция с параметрами в качестве одного параметра
def c_b(*args, **kwarg):
return partial(char_blink, *args, **kwarg)
# замена обычного Character на новый, где вторым параметром идёт спрайт
def CH(name=None, sprite=None, *args, **kwarg):
return Character(name, callback=c_b(sprite), *args, **kwarg)
# рассказчик снимает выделение с последнего персонажа из-за sprite=None
narrator = CH()
# вторым параметром указан первый тег спрайта, связанного с персонажем
g = CH(_("Девочка"), "girl", color="#f88")
# остальные параметры могут быть такие же, как в обычном Character
b = CH(_("Мальчик"), "boy")
# если не указывать спрайт, то персонаж будет просто снимать выделение с последнего говорящего
v = CH(_("Внутренний голос"), color="#f88")
label start:
scene bg street
with dissolve
# показываем персонажей
show boy ok at xpos(.33)
show girl ok at xpos(.66)
with dissolve
pause .5
# начинаем тупой диалог
g "Привет."
b "Дароф!"
"*свечение исчезает*"
show boy wat
b "Ты видела? Меня только что йоком тобнуло, аж искры из глаз посыпались. Я светился, как лампочка в холодильнике."
show boy ok
b "А сейчас отпустило, вроде."
g "Не, я ничего не видела. Гонишь, наверное. Признавайся, чем закинулся."
show girl wat
# молча убрать выделение и подождать, пока оно снимется
$ char_off(True)
g "Ой, а меня тоже пропёрло, кажется. Это что, заразно? Отойди от меня, наркоман чёртов!"
v "Что я несу! Вот он урод, из-за него я... Хотя нет, всё нормально: все мужики уроды, а девушки всегда правы."
b "Похоже, нас колбасит каждый раз, когда заговорим. Кто-то с Ренпаем балуется."
show girl ok
g "Долбаные разработчики..."
$ char_off()
scene black
with dissolve
return
Комментарии
Отправить комментарий