бесконечное лето исходный код
Бесконечное лето исходный код
Надергано со стенки
Код ренпи паузы с запретом пропуска:
Если вы хотите, чтобы ваш герой называл героев по-разному, то вот код, который позволяет не переписывать один и тот же текст с разными именами:
$ loli_name = u»Лоли»
$ loli = DynamicCharacter («loli_name», what_color=(255,211,155), who_color=(238,44,44))
После нужного выбора просто меняйте первую переменную.
Имя спрайта, можно несколько слов, как в оригинале
Путь к файлу, всё как обычно
‘), im.matrix.tint(0.94, 0.82, 1.0/0.63, 0.78, 0.82
Как сделать выбор имени игроком.
label инициал_shoosing_name:
call screen инициал_input
if _return:
инициал_check_name(_return, ‘инициал_shoosing_name’)
pname = _return.title()
return
в рандомном месте нужно вписать этот лейбл
screen инициал_input: # инпут имени
modal False
window:
id ‘window’
background None
$ timeofday = persistent.timeofday
if (persistent.font_size == ‘large’):
imagebutton:
action ShowMenu(‘text_history’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/backward_%s.png’)))
xpos 38
ypos 924
add (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/dialogue_box_large.png’))):
xpos 174
ypos 866
imagebutton:
action HideInterface()
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/hide_%s.png’)))
xpos 1508
ypos 883
imagebutton:
action ShowMenu(‘save’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/save_%s.png’)))
xpos 1567
ypos 883
imagebutton:
action ShowMenu(‘game_menu_selector’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/menu_%s.png’)))
xpos 1625
ypos 883
imagebutton:
action ShowMenu(‘load’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/load_%s.png’)))
xpos 1682
ypos 883
imagebutton:
action Skip()
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/forward_%s.png’)))
xpos 1768
ypos 924
input default «»:
xpos 194
line_spacing 1
xmaximum 1541
ypos 914
size 30
color ‘#E2C778’
text «Придумайте имя:»:
xpos 194
line_spacing 1
ypos 877
size 30
color ‘#E2C778’
elif (persistent.font_size == ‘small’):
imagebutton:
action ShowMenu(‘text_history’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/backward_%s.png’)))
xpos 38
ypos 949
add (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/dialogue_box.png’))):
xpos 174
ypos 916
imagebutton:
action HideInterface()
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/hide_%s.png’)))
xpos 1508
ypos 933
imagebutton:
action ShowMenu(‘save’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/save_%s.png’)))
xpos 1567
ypos 933
imagebutton:
action ShowMenu(‘game_menu_selector’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/menu_%s.png’)))
xpos 1625
ypos 933
imagebutton:
action ShowMenu(‘load’)
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/load_%s.png’)))
xpos 1682
ypos 933
imagebutton:
action Skip()
auto (get_image(((‘gui/dialogue_box/’ + timeofday) + ‘/forward_%s.png’)))
xpos 1768
ypos 949
input default «»:
xpos 194
line_spacing 2
xmaximum 1541
ypos 964
size 23
color ‘#E2C778’
text «Придумайте имя:»:
xpos 194
line_spacing 2
ypos 931
size 23
color ‘#E2C778’
так же в рандомное место вписываешь
init python:
def инициал_check_name(name, s):
global инициал_namesake
if name.lower() in [‘павлыч’, ‘павлик’, ‘павлуня’, ‘павлюня’, ‘павлуся’, ‘павлюся’, ‘павлуха’, ‘павлуша’, ‘павля’, ‘павлюка’, ‘павлюкаша’, ‘павша’, ‘пава’, ‘паха’, ‘паша’, ‘пашата’, ‘пашуня’, ‘пашута’, ‘пашуха’, ‘паня’, ‘пана’, ‘панюта’, ‘панюха’, ‘панюша’, ‘паняша’, ‘паля’, ‘палюня’, ‘палуня’]:
инициал_namesake = True
elif name.capitalize() in инициал_women_names:
renpy.say(th,’Это же женское имя.
renpy.jump(s)
elif name.lower() in [‘электроник91’, ‘электроник92’, ‘электроник93’, ‘электроник94’, ‘электроник95’, ‘электроник96’, ‘электроник97’, ‘электроник98’, ‘mr.электроник’, ‘xxxэлектроникxxx’, ‘шурик91’, ‘шурик92’, ‘шурик93’, ‘шурик94’, ‘шурик95’, ‘шурик96’, ‘шурик97’, ‘шурик98’, ‘супершурик’, ‘шурик_бл’]:
renpy.say(инициал_server, ‘Ты ведь сейчас шутишь, да?
renpy.jump(s)
elif ‘электроник’ in name.lower():
инициал_temp_rand = str(renpy.random.randint(91,99))
renpy.say(инициал_server, ‘Простите, данное имя уже занято. Попробуйте следующие имена:\nЭлектроник’+инициал_temp_rand+’, Mr.Электроник, xXxЭлектроникxXx’)
renpy.jump(s)
elif «шурик» in name.lower():
инициал_temp_rand = str(renpy.random.randint(91,99))
renpy.say(инициал_server, ‘Простите, данное имя уже занято. Попробуйте следующие имена:\nШурик’+инициал_temp_rand+’, СуперШурик, Шурик_БЛ’)
renpy.jump(s)
def инициал_cases(): #склонение имён по падежам. не работает с несклоняемыми (он их будет склонять :с)
global pname, bname
pname = pname.capitalize()
consonants = [u’б’, u’в’, u’г’, u’д’, u’ж’, u’з’, u’й’, u’к’, u’л’, u’м’, u’н’, u’п’, u’р’, u’с’, u’т’, u’ф’, u’х’, u’ц’, u’ч’, u’ш’, u’щ’, u’ь’]
last_symb = pname[len(pname)-1]
if last_symb in consonants:
if last_symb == u’й’ or last_symb == u’ь’:
bname = [pname[:len(pname)-1]+u’я’,pname[:len(pname)-1]+u’я’, pname[:len(pname)-1]+u’ю’, pname[:len(pname)-1]+u’ем’, pname[:len(pname)-1]+u’е’]
else:
bname = [pname+u’а’,pname+u’а’, pname+u’у’, pname+u’ом’, pname+u’е’]
elif last_symb == u’а’:
bname = [pname[:len(pname)-1]+u’ы’,pname[:len(pname)-1]+u’у’, pname[:len(pname)-1]+u’е’, pname[:len(pname)-1]+u’ой’, pname[:len(pname)-1]+u’е’]
elif pname[len(pname)-2 == u’ия’:
bname = [pname[:len(pname)-1]+u’и’,pname[:len(pname)-1]+u’ю’, pname[:len(pname)-1]+u’и’, pname[:len(pname)-1]+u’ей’, pname[:len(pname)-1]+u’и’]
elif last_symb == u’иа’ or last_symb == u’я’:
bname = [pname[:len(pname)-1]+u’и’,pname[:len(pname)-1]+u’ю’, pname[:len(pname)-1]+u’е’, pname[:len(pname)-1]+u’ей’, pname[:len(pname)-1]+u’е’]
else:
bname = [pname, pname, pname, pname, pname]
def инициал_meet(who, name):
gl = globals()
global store
store.names[who] = name
gl[who+»_name»] = store.names[who]
вместо инициал пишешь инициалы своего мода
init:
define инициал_server = Character(u»название твоего мода», color = «#2F4F4F», what_color = «#A9A9A9», drop_shadow = [ (2, 2) ], drop_shadow_color = «#000», what_drop_shadow = [ (2, 2) ], what_drop_shadow_color = «#000&
Бесконечное лето исходный код
Может кому-нибудь пригодиться
1) Расположение спрайтов: left, cleft, cright, right, fleft, fright
2)Бег
scene БГ:
. zoom 1.05anchor (48,27)
. ease 0.20pos (0, 0)
. ease 0.20pos (25,25)
. ease 0.20pos (0, 0)
. ease 0.20pos (-25,25)
. repeat
3)Моргание
show blink Закрыть глаза
hide blink
show unblink Открыть глаза
4)Для текста наверху
5)Текст поверх экрана |
window show
nvl clear
6)Помехи
show prologue_dream (показать)
hide prologue_dream (скрыть)
8) Белый шум
scene bg white
«Какой-то текст 1.»
show prologue_dream
«Какой-то текст 2.»
hide prologue_dream
«Какой-то текст 3.»
9)Титры
В блоке инициализации(init:) напишите следующее.
$ my_credits = «Строка титров 1.\n\nСтрока титров 2.»
10)Запрет возврата
Если вы хотите запретить игроку перематывать игру назад, воспользуйтесь функцией ниже.
$ renpy.block_rollback()
Окей, до фига гуру сейчас объяснит, потому что я разобрался, а в этом факе не нашел вообще ничего.
пишется всё вот в таком виде:
scene bg ***:
linear ** xalign ** yalign ** zoom **
Все БГ в виде координатной плоскости выглядят примерно так(пикрил).
Это, вроде, всё.
Возможно кому-то пригодится:
Если кому-то нужно получить файл с папки воркшопа через open()/file() или же удалить его через os.remove(), добавить свои модули или же что либо ещё что требует ПОЛНОГО пути к папке С МОДОМ,, то можно использовать такую штуку в путях, как «..»
Все модификации хранятся в папке workshop, которая размещена в той же папке steamapps, где размещена папка common с игрой, даже если steamapps несколько.
То есть, чтобы получить пути к целевой папке steamapps можно использовать
C:\SteamLibrary\steamapps\common\Everlasting Summer\..\..
Ещё проще)
C:\SteamLibrary\steamapps\common\Everlasting Summer\..\..\workshop\content\331470\
Вот и попали в папку модов для БЛ (относительно моего пути к БЛ).
Если нужно получить папку какого-то конкретного мода, то просто дописываем его ID
Например, получим папку Саманта-мода:
Ну, а поскольку в питоне «\» означает кое-что другое, то меняем все «\» на «/»
Но, как я уже говорил, это мой путь к БЛ.
Поэтому, «спрашиваем» в Ren’Py (движок БЛ) какой же наш путь:
Это и будет наш путь к Саманта-моду.
Потом можно делать с ним всё, что вздумается.
Как задействовать клавиатуру в моде, например, для мини-игр.
Первым делом, нужно выбрать клавишу, которую мы будем использовать. Для начала возьмём пробел.
Чтобы человек мог нажать на клавишу в определённый момент времени, нужно её нарисовать и вставить в код ренпая с помощью самой обычной команды для внедрения своего бг или цг.
Мы загрузили изображение пробела. Теперь приступим к коду.
Возьмём самый простой для задействования всего одного пробела:
(Скриншот)
Если вы успели нажать на кнопку, вас перебрасывает на лейбл, который означает победу.
Если не успели, то после двух секунд функция пробела исчезает и продолжается сюжет, перебросив вас на лейбл, означающий поражение. В нём вы можете дать очко переменной для определённых событий, или же перебросить обратно на начало мини-игры, дав переиграть для достижения победы.
Кстати, вот вам кнопка пробела, делал для своего мода.
Бесконечное лето исходный код
Подожди, писать заклинания еще рано, сначала нужно понять, как правильно расставлять слова для эффекта
Структура файла выглядит примерно так:
Команды в блоке ВСЕГДА имеют отступ в 4 пробела относительно команды говорящей нам о начале блока.
Есть несколько команд начинающих блок, пока стоит лишь запомнить то, что после команды, начинающей блок всегда ставится двоеточие (:)
На данном этапе создания мода нам понадобится лишь одна блоковая команда
Существует 2 варианта перейти от одного блока к другому
В этом варианте сначала выполняется первый блок, а затем второй. При этом используется команда
Вот уже знакомый нам пример:
В этом случае если написать в блоке vasya_mod_d1 что либо после jump’a, то игра просто пропустит это
В отличии от прыжка, при использовании этого варианта после полного выполнения блока на который переходит игра, она вернется в первоначальный и продолжит его выполнение после команды. Команда для этого:
Ну и как же без примера:
Окончание блоков, переход к которым осуществляется именно этим методом имеет некоторые особенности, о которых можно узнать дальше
Если к этому блоку ведут jump’ы, то конец блока можно ничем не выделять, если только это не последний блок в вашем моде (Последний блок 1/x концовки). В ином же случае последней командой блока должна быть команда return. Зачем? В случае если это последний блок, чтобы игра могла закончить обработку мода и вернуться в главное меню. Если же на блок привела команда call, то игре просто необходимо знать, когда вернуться в предыдущий блок.
Получается что наш пример call не будет работать и нам придется привести его к такому виду:
Благодаря движку игры, это было реализовано донельзя просто.
Просто в виде команды пишем следующий текст
Все просто, этот ID говорит нам о том, с кем же сейчас ГГ разговаривает
Для текста от автора ID не нужен
Остальных говорящих вы можете увидеть на прикрепленной картинке да, картинка копипаст
Для примера мы попросим поздороваться каждого из основных говорящих
В игре вы встречались с тем, что некоторые слова во фразах персонажей были как-то выделены или вовсе были в ковычках. Для этого используются специальные теги.
Как мы уже знаем, ковычки ограничивают реплики персонажей, так как же нам использовать их внутри этих реплик?
Чтобы ковычки не учитывались игрой, перед ними нужно поставить \
В самой игре при смене местоположения нашего ГГ меняется и картинка на фоне (bg)
Так как же нам показать где сейчас наш герой?
А делается это при помощи команды scene bg
Так же в архиве приложен текстовый файл из которого сразу можно скопировать нужную строку
Вызываются все спрайты командой show
Имя спрайта обычно состоит из нескольких слов, разделенных пробелами
В оригинальной игре имя персонажа совпадает с ID говорящего из предыдущего раздела этого руководства
Если персонаж уже на экране, то повторное использование show будет менять эмоцию и/или одежду
При простом использовании show он будет появляться просто по центру, это можно исправить добавив в конец at
Всего в игре 7 позиций где может находиться спрайт:
fleft, left, cleft, center, cright, right, fright
На приведенном скриншоте были использованы команды:
Так же можно показать персонажа ближе\дальше. Для этого можно воспользоваться атрибутом close/far
На втором скриншоте как раз были использованны эти атрибуты. Команды:
Для того, чтобы убрать персонажа воспользуйтесь
Если вы хотите вслед за этим сменить декорации, то прописывать hide для каждого персонажа не обязательно, команда scene сама их уберет
Тут принцип как и с bg, только надо использовать scene cg
Примеры думаю не нужны.
Мы можем показать спрайты, bg и cg с некоторым замедлением, плавно
Так же есть еще несколько эффектов, о которых речь пойдет далее, некоторые из эффектов можно применить не только к изображениям, но и даже друг к другу!
Чтобы показать наши картиночки более красиво для человеческого глаза, мы можем использовать специальный атрибут. Это будет выглядеть примерно так:
Так же можно группировать несколько обьектов для одновременного начала эффекта
В приведенном примере мы попадем в ночной автобус и перед нами предстанет улыбающаяся Славя, и все это с задержкой в 2 секунды.
Так же атрибут плавности может применяться к другим эффектам.
Если все вышеприведённые примеры Вас не устраивают, можно добавить свой атрибут плавности. Для этого, пропишите его в блоке init.
После этого мы можем использовать наш переход, так-же, как и все остальные.
Я более чем уверен, что вы видели эффект того, как иногда ГГ моргает или вовсе закрывает глаза. Мы можем реализовать подобную возможность!
Будьте осторожны: blink и unblink это разные эффекты, они не могут отменить друг друга
При назначении позиции координаты pos и align можно комбинировать.
Давайте, для примера выведем спрайт улыбающейся Мику слева экрана.
Очень и очень многое. Допустим, анимации.
Вот стоит у нас слева на экране Мику, объявленная в прошлом блоке, но вдруг появилась Ульяна, и Мику из вежливости решила подвинуться чуть правее. Как мы это сделаем? Можно просто задать координаты положения, и Мику «телепортируется» туда, но разве это красиво? Не. У нас другие методы.
Смена положения.
Для смены положния существует 4 метода: linear, ease, easein, easeout. Для начала нам понадобится только linear. Как он работает? Очень просто. После linear мы пишем время в секундах, а после новые координаты в системе ATL.
Пример. Созданим перемещение к правому краю экрана:
Теперь добавим это в наш код.
И импортируем её в код:
Наверное вы и сами слышали, что в «Совенке» никогда не бывает тихо, где-то играет приятная музыка, иногда мы слышим стуки в двери, три раза в день, звук горна собирает всех обитателей у столовой.
Послушать эту музыку можно прямо в игре, зайдя в раздел Галерея
Для проигрывания прочих звуков нам понадобится все та же команда play, только немного в другом виде
Увы, подобрать нужный звук вам поможет лишь базовое знание Английского языка и «метод научного тыка»
Все что мы узнали раньше позволяет нам писать лишь статичные моды, в которых от игрока ничего не зависит. Теперь же нам пора добавить игроку возможность выбора
Если вы хотите, чтобы игра запоминала каждый выбор игрока, то без переменных нам не обойтись.
Объявление переменных происходит в специальном блоке init. Имена и значения у переменных могут быть любые, но рекомендуется использовать короткие английские слова или цифры (цифры только в значении)
Изменение значения переменных будет выглядеть так:
После выполнения данных команд переменная «choice» будет иметь значение «True», а переменная «Count» увеличит свое значение на единицу.
Если вы хотите дать игроку выбор, то вам необходимо использовать специальный блок menu:
В приведенном примере Ольга Дмитриевна попросит нас взять мешок с сахаром, мы же можем как подчиниться и увеличить переменную «good» на 1, так и отказаться, причем в зависимости от нашего выбора события в игре могут измениться
Будьте осторожны: Варианты ответа тоже открывают блок, и если мы не поставим после каждого двоеточие, мод может не запуститься
Поясню данный отрезок. Если значение переменной «good» больше нуля, то игра продолжится на метке «good», если же нет, то мы переходим на метку «bad»
Теперь же мы постараемся реализовать выборы, в которых в зависимости от прошлых выборов персонажа будут добавляться или убираться различные варианты ответов
Иногда по нуждам сюжета необходимо дать игроку выбор куда ему пойти, использование для этого обычного меню выбора выглядит несколько не эстетично, так давайте же научимся ориентироваться в «Совенке» при помощи карты!
Чтобы дать игре понять. когда развернуть перед игроком карту необходимо всего несколько простых команд.
т.е. чтобы при нажатии на клубы мы прыгали на лейбл mymodlabel2 (название, примера ради) нужно реализовать такую конструкцию:
И в конце, выводим саму карту командой:
Показываю пример полностью. Допустим нам нужны три зоны. Сцена, Муз. клуб и Пляж, и каждая ведёт к совим лейблам label1, label2 и label3, для этого мы делаем всё то, что я уже описал выше:
Вполне возможно, что вашем моде вам понадобится персонаж, которого по какой-то причины разработчики не стали заселять в лагерь, что же делать в этом случае? Правильно создать его!
Далее мы присваиваем переменной свойство Character().
Для примера создадим Вашего покорного слугу:
define vladya = Character(u»Владя»)
(прим.: Символ u используется, для отображения русского текста у людей, у которых он не установлен в системе.)
Теперь мы можем использовать переменную vladya в своём моде. Давайте, я поздороваюсь с Вами:
vladya «Привет»
define vladya = Character(u»Владя», color=»#008000″, what_color=»#f1d076″)
И давайте я вновь поздороваюсь с Вами:
vladya «Привет»
Намного лучше, не правда ли?
Окей, окей. Без проблем.
Допустим наш персонаж пересмотрел Ваномаса и теперь после каждого предложения говорит «ёпты блин» (пардоньте, в Стиме цензура, оригинал не работает), можно конечно прописывать после каждой строчки это замечательное словосочетание, а можно использовать команду what_suffix. Давайте дополним переменную:
define vladya = Character(u»Владя», color=»#008000″, what_color=»#f1d076″, what_suffix=u», ёпты блин.»)
Для начала реализуем перед именем вот такую конструкцию:
И после начала нашего мода прописываем:
show screen scr123
Этой командой мы будем обновлять значение переменной vano, каждую 0.1 секунду.
И что-же будет теперь:
И вот уже весь лагерь, включая нашего подопечного уснул. Несомненно вы видели, как в оригинальной игре о начале нового дня нас оповещали даже. не будящие нашего протагониста лучи солнца, а простой монитор компьютера, показывающий нам сколько времени мы провели в этом дивном месте. Чем же мы хуже, давайте сделаем себе такой же монитор!
Для выведения на экран монитора, необходимо прописать две команды:
Вы 100% видели, как в оригинальной игре да и некоторых модах, при прохождении концовок появляется картинка а-ля «Achivement Complted» И хотели бы в свой мод такую же.
Для этого в нужном вам месте вставьте следующие команды
К слову, в БЛ вывод ачивок реализован именно так, но оригинальная функция нам не подойдёт, ибо она подогнана только под уже заложенные ачивки «Лета», так что нам нужно немного её переделать, под более универсальные нужды.
Для этого, реализуем следующую конструкцию в блоке питона.
Теперь, в месте вывода ачивки, надо прописать лишь обращение к функции, и в скобках прописать картинку с Вашей ачивкой в кавычках.
Старайтесь в своем моде задавать уникальные имена блоков и функций, иначе игра не будет знать куда же ей переходить и что выполнять, что зачастую черевато вылетом
Большинство модов, сценарий которых пишется одним человеком-разработчиком мода, да еще и в процессе написания самого мода, забрасываются на очень ранних этапах. Не советую вам начинать писать мод, не имея сценария, иначе это может ударить по вашей самооценке.
Если вам прямо не терпится создать мод, а сценария нет, загляните на «Книгу Фанфиков [ficbook.net] «, там вы вполне сможете найти себе сюжет по душе, только свяжитесь с автором фанфика и узнайте, согласен ли он на создание мода по его творчеству или нет
Вполне возможно, что во время написания мода вы могли что-то где-то не так сделать и теперь у вас выдает ошибку, давайте разберемся в самых частых ошибках.
Решение: Проверьте свой мод на то что везде у вас отступ не Tab, а 4 пробела
Решение: Обычно при этой ошибке еще и указан номер строки, проверьте, закрыли ли вы ковычки на этой строке
Решение: Проверьте, везде ли отступ по 4 пробела
Решение: Проверьте команду в указанной строке
Решение: Проверьте label и jump/call на наличие опечаток
Пишите возникающие у вас ошибки и решения будут добавлены сюда
Для того чтобы игра увидела ваш мод просто обьявите в init: блоке следующую переменную
Проверьте, что ваш мод начнется с метки с тем же названием, что и Mod ID
Раздел был написан Автором руководства, с использованием контента от Владя, с его личного разрешения.
Данное руководство еще не завершено, на данный момент в нем есть все необходимое для создания небольшого мода. Руководство будет дополняться.
Задавайте в комментариях свои вопросы, в процессе ответов на них, руководство будет дополняться