Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Учимся прокачивать персонажа и его дом. А также создадим инвентарь, добавим магазин для покупки шмоток и научимся этими шмотками усиливать персонажа.

ПРОКАЧКА ПЕРСОНАЖА

После лечения по первоначальной задумке было решено добавить библиотеку, где герой продвигался бы дальше по сюжету. Но это будет потом. А пока я просто добавил возможность прокачки ГГ в библиотеке.

Добавляем 2 новых пассажа library и library_event

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Блок library:

[[Почитать книги|library_event]] <<if $story == 20>> [[Поискать информацию про подземелья|library_event]] <</if>> <<if $story == 27>> [[Поискать информацию гоблинов-магов|library_event]] <</if>> [[НА УЛИЦУ|street]]

<<if $story == 27>> это уже для поздних этапов игры, не обращаем внимания.

Блок library_event:

<<if $hero_intelligence >=80>> Ты достиг человеческого максимума. Тут ты интеллект выше 80 не поднимешь. <<else>> <<if $story == 19>><<set $story = 21>> Ты решил прокачать свой интеллект и нашел пару полезных книг. <span style="color: Salmon;">Интеллект +1</span><<set $hero_intelligence +=1>> <<elseif $story == 20>><<set $story = 21>> Вместо того, чтобы бездумно браться за книги, ты решил спросить у библиотекаря и читателей. Весь день ты провел доставая каждое живое существо в проделах досягаемости, но ничего не нашел. Похоже, тебе придется перерыть всю библиотеку. <<elseif $story == 21>>Ты решил прокачать свой интеллект и нашел пару полезных книг. На глаза тебе попалось несколько заметок про необычные подземелья, но никакой стоящей информации там не было. /* Закрывающее IF для сюжетных событий */ <<elseif $story == 27>> ЧТО-ТО ИЗ ПОЗДНИХ ЭТАПОВ ИГРЫ <</if>> /* Закрывающее IF для проверки на 80 интеллекта */<span style="color: Salmon;">Интеллект +1</span><<set $hero_intelligence +=1>><</if>> [[БИБЛИОТЕКА|library]]

Как видно, выше 80 интеллекта я не даю подняться (не хочу, что бы мой персонаж был умнее меня). Это будет реализовано значительно позже с помощью артефактов.

НОВЫЙ ДОМ И ОПЛАТА ЗА НЕГО

Следом по сюжету идет покупка нового дома. Для этого:
1. Добавил переменные $house_type, $days_to_rent
2. Через <<elseif $story 22>> добавил у ведьмы необходимость снять жилье и помыться.
3. Добавил пассажи rent_pay, wash, home_purchase

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Сами пассажи набил следующим текстом:

home_purchase (ссылку на него добавил на улице)

За любое жилье, кроме начального надо платить раз в 7 дней. <<if $story >= 22>><<if $money >= 1000>><<if $story == 22>>[[Снять квартиру за 1000|home][$story = 23, $house_type = 2, $days_to_rent = 7]]<<else>>[[Снять квартиру за 1000|home][$house_type = 2]]<</if>><<else>>Накопи минимум <span style="color: Gold;">1000 монет.</span>, чтобы снять жилье.<</if>><</if>> [[НА УЛИЦУ|street]]

Пассаж home дополнил:

<<if $house_type == 1>> <p style="text-align: center;">СТАРЫЕ РАЗВАЛИНЫ</p> <img src="https://sun9-37.userapi.com/impg/_1klxFBpyVNDitugyxQb9dBVWXvmFNj3A-S0WA/QpA5Rlojd0U.jpg?size=1280x720&quality=95&sign=8d64a84177af3102e0f99d7963a6b4e9&type=album" style="display:block; margin:auto; max-width:800px;" alt="КАРТИНКА РАЗВАЛИН"> Развалины старого дома. Тут минимум комфортных условий, но зато не нужно за него платить. Не самое лучшее место для сна, но лучше, чем спать на голой земле. <<elseif $house_type == 2>> <p style="text-align: center;">ОБШАРПАННАЯ КВАРТИРА</p> <img src="https://sun9-28.userapi.com/impg/DlOeYoyC7M9V-cBP_rL7p-DAO01eClp8mh4AFA/q9Vxa2u016g.jpg?size=900x370&quality=95&sign=12e8a9c6eed8bcfc3829e6a955bdf89f&type=album" style="display:block; margin:auto; max-width:800px;" alt="КАРТИНКА ОБШАРПАНОЙ КВАРТИРЫ"> Маленькая обшарпанная квартира в пятиэтажке. Потрепанные обои, старая мебель, но есть основные удобства и неплохой вид из окна. <</if>> /* КНОПКИ В КОМНАТЕ */ <<if $days_to_rent <= 0>> [[ОПЛАТИТЬ ЖИЛЬШЕ|rent_pay]] <<else>> <<if $house_type >= 2>>[[Помыться|wash]]<</if>> [[Зеркало (статистика)|statistic]] <<if $house_type ==1>> [[СПАТЬ|home][$day += 1, $dungeon_hunt = 0]] <<else>> [[СПАТЬ|home][$day += 1, $dungeon_hunt = 0, $days_to_rent -= 1]] <</if>> [[НА УЛИЦУ|street]] <<if $story >= 17>> <<if $dungeon_hunt <= 99>> [[ПОДЗЕМЕЛЬЕ|room_choice][$room_number = 1]] <</if>> <<if $dungeon_hunt >= 100>> ТЫ СЛИШКОМ УСТАЛ ДЛЯ ПОДЗЕМЕЛЬЯ <</if>> <</if>> /* Закрывающий IF для оплаты дома */<</if>>

Пассаж rent_pay:

<<set $days_to_rent = 7>> <<if $house_type == 2>> <<if $money >= 1000>> Ты заплатил хозяину на месяц вперед.<<set $money -= 1000>> <</if>> <<elseif $house_type == 3>> <<elseif $house_type == 4>> <<elseif $house_type == 5>> <<elseif $house_type == 6>> <</if>> <<if $house_type == 2>> <<if $money < 1000>> Тебя выгнали за неуплату. Придется вернуться в СТАРЫЕ РАЗВАЛИНЫ<<set $house_type = 1>> <</if>> <<elseif $house_type == 3>> <<elseif $house_type == 4>> <<elseif $house_type == 5>> <<elseif $house_type == 6>> <</if>> [[ДОМОЙ|home]]​

Пассаж wash:

<<if $story == 23>> Первый нормальный душ спервые за долгие месяца. Как же давно у тебя его не было! Наслаждаясь моментом ты провел там не меньше часа, и пофиг, сколько тебе выстявят счет за воду! Сейчас у тебя есть на это деньги. <span style="color: Gold;">Осталось показаться ведьме.</span> <<else>> Ты принял душ и освежился. <</if>> <img src="https://sun9-9.userapi.com/impg/Qi9YCtvxhyaJlQBr9XcgOkDC6s9nIERES0yTTg/N_PE-8LWdDo.jpg?size=1920x800&quality=95&sign=9d2b7c4894190eee08c24d7359813f94&type=album" style="display:block; margin:auto; max-width:800px;" alt="КАРТИНКА РАЗВАЛИН"> [[НАЗАД В КВАРТИРУ|home]]​

ИНВЕНТАРЬ и ЭКИПИРОВКА

Вот и настала ЕГО очередь. Инвентарь! По такому случаю я заготовил сразу 2 мема:

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Могу лишь сказать, что задача оказалась невероятно сложной именно в творческом плане. Интернет наполнен разнообразными формумами, как именно его лучше сделать, и TWINE SUGARCUBE тут не исключение. Однако стоит понимать, что ты, либо либо обладаешь знаниями, намного превосходящими мои (особенно в Jawa Script), либо выкручиваешься, как и я.

Эксперты, настало Ваше время неистово доминировать доминировать надо мной в комментариях.

По итогу, посмотрев на другие игры на этом же движке и покопавшись в форумах, решил отказаться от части задумок (например от реакции на цвет одежды(технически такая возможность осталась, но придется каждую шмотку прописывать отдельно)). В конечном итоге пришел к следующей схеме:

1. Каждая вещь будет задана своей переменной

2. Этой переменной будет присваиваться определенное значение, и в зависимости от значения предмет будет, либо активным, либо экипированным, либо просто лежать в инвентаре.

Итак после того, как прописали ведьме квест по переодеванию ГГ, идем в промпты:

StoryInit дополняем шмотками:

/*Для инвентаря 0-не используется или не было в игре до этого), 1 - в инвентаре, 2 - надето, 3 - выброшено*/ /*ГОЛОВНЫЕ УБОРЫ*/ <<set $cap_0 to 2>> /*Старая шапка*/ <<set $cap_1 to 0>> /*Тактическая шапка*/ /*ЗАЩИТА ТЕЛА*/ <<set $top_0 to 2>> /*Старая куртка*/ <<set $top_1 to 0>> /*Потрепаная куртка искателя*/ /*ПОНОЖИ*/ <<set $legs_0 to 2>> /*Старые штаны*/ <<set $legs_1 to 0>> /*Потрепаные штаны искателя*/ /*ОБУВЬ*/ <<set $boots_0 to 2>> /*Старая обувь*/ <<set $boots_1 to 0>> /*Потрепаные поножи искателя*/ /*ОРУЖИЕ*/ /*ДРУГОЕ*/

Так же промпт StoryCaption дополняем таблицей и шмотками:

<table class="storycaption"> <tbody> <tr> /*шапка*/<td class="storycaption"><<if $cap_0 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><<elseif $cap_1 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><</if>></td> /*аксессуары*/<td class="storycaption"></td> </tr> <tr> /*куртка*/<td class="storycaption"><<if $top_0 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><<elseif $top_1 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><</if>></td> /*другое*/<td class="storycaption"></td> </tr> <tr> /*штаны*/<td class="storycaption"><<if $legs_0 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><<elseif $legs_1 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><</if>></td> /*обувь*/<td class="storycaption"><<if $boots_0 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><<elseif $boots_1 == 2>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:100px;"><</if>></td> </tr> </tbody> </table>

Не забываем сюда

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

добавить текст

table.storycaption { border-spacing: 1000px; border: 4px #333; border-spacing: 7px 11px; } td.storycaption { padding: 2px; }

Как видите, ничего лучше, чем проверить на условие равна ли переменная предмета двум, я не придумал, и при большом количестве вещей, этот код становится действительно монструозным. Думаю, когда в игре будет не 8 шмоток, а за 50, моя реакция будет такой:

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Надеюсь, к тому времени я придумаю что-то по лучше...

МАГАЗИН

Так же добавил магазин (пассажи shop и shop_1):

Пассаж shop:

[[Комнатный герой|shop_1]] [[НА УЛИЦУ|street]]

Пассаж shop_1:

<table><tr><td style="font-size: 20px;">ГОЛОВНЫЕ УБОРЫ</td></tr></table> <table> <tr> <td><img src="ССЫЛКА" style="display:block; margin:auto; max-width:200px;" alt="ТАКТИЧЕСКАЯ ШАПКА">Тактическая шапка <<if $cap_1 == 0 and $money >= 500>>[[Купить (500)|shop_1][$cap_1 = 1, $money -= 500]]<<elseif $cap_1 == 0 and $money < 500>>Купить (500)<<elseif $cap_1 == 1 or 2>>Уже есть<</if>></td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> <tr> <td>Предмет появится позже</td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> </table> <table><tr><td style="font-size: 20px;">ЗАЩИТА ТЕЛА</td></tr></table> <table> <tr> <td><img src="ССЫЛКА" style="display:block; margin:auto; max-width:200px;" alt="Потрепаная куртка искателя">Потрепаная куртка искателя <<if $top_1 == 0 and $money >= 800>>[[Купить (800)|shop_1][$top_1 = 1, $money -= 800]]<<elseif $top_1 == 0 and $money < 800>>Купить (800)<<elseif $top_1 == 1 or 2>>Уже есть<</if>></td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> <tr> <td>Предмет появится позже</td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> </table> <table><tr><td style="font-size: 20px;">ПОНОЖИ</td></tr></table> <table> <tr> <td><img src="ССЫЛКА" style="display:block; margin:auto; max-width:200px;" alt="Потрепаные штаны искателя">Потрепаные штаны искателя <<if $legs_1 == 0 and $money >= 700>>[[Купить (700)|shop_1][$legs_1 = 1, $money -= 700]]<<elseif $legs_1 == 0 and $money < 700>>Купить (700)<<elseif $legs_1 == 1 or 2>>Уже есть<</if>></td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> <tr> <td>Предмет появится позже</td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> </table> <table><tr><td style="font-size: 20px;">ОБУВЬ</td></tr></table> <table> <tr> <td><img src="ССЫЛКА" style="display:block; margin:auto; max-width:200px;" alt="Потрепаные поножи искателя">Потрепаные поножи искателя <<if $boots_1 == 0 and $money >= 700>>[[Купить (700)|shop_1][$boots_1 = 1, $money -= 700]]<<elseif $boots_1 == 0 and $money < 700>>Купить (700)<<elseif $boots_1 == 1 or 2>>Уже есть<</if>></td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> <tr> <td>Предмет появится позже</td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> </table> <table><tr><td style="font-size: 20px;">ОРУЖИЕ</td></tr></table> <table><tr><td style="font-size: 20px;">ДРУГОЕ</td></tr></table> <span style="color: Gold;">Ты же не будешь переодеваться в магазине. Не забудь зайти домой и переодеться.</span> [[ТОРГОВЫЙ ЦЕНТР|shop]] [[В гардероб (домой)|wardrobe]]

Постарался предусмотреть все: наличие или отсутствие денег, а так же проверка если у персонажа уже этот предмет: К счастью, браузеры умеют автоматически масштабировать изображения, и надо всего лишь указать style="display:block; max-width:200px; в ссылке на изображение, чтобы получить изображение шириной в 200 пикселей.

Далее добавил пассажи для гардероба и смены одежды:

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Чуть ниже будет виден код и чтобы не усложнять его многоуровневыми <<if>> конструкциями, пришлось сделать смену каждой шмотки отдельно. Они целиком однотипные, поэтому покажу на примере только одного блока, но перед этим опишу, что находится в пассаже wardrobe:

Голова:<<if $cap_0 == 2>>Старая шапка<<elseif $cap_1 == 2>>Тактическая шапка<</if>> Тело: <<if $top_0 == 2>>Старая куртка<<elseif $top_1 == 2>>Потрепаная куртка искателя<</if>> Ноги: <<if $legs_0 == 2>>Старые штаны<<elseif $legs_1 == 2>>Потрепаные штаны искателя<</if>> Обувь: <<if $boots_0 == 2>>Старые ботинки<<elseif $boots_1 == 2>>Потрепаные поножи искателя<</if>> [[Снять или заменить головной убор|change_cap]] [[Снять или заменить куртку|change_top]] [[Снять или заменить штаны|change_legs]] [[Снять или заменить обувь|change_boots]] [[ДОМОЙ|home]]​

Пассаж change_cap:

<<set $cap_0 to 1>> /*Старая шапка*/ <<if $cap_1 == 2>><<set $cap_1 to 1>><</if>> /*Тактическая шапка*/ <table><tr><td style="font-size: 20px;">ГОЛОВНЫЕ УБОРЫ</td></tr></table> <table> <tr> <td><<if $cap_1 != 0>><img src="ССЫЛКА" style="display:block; margin:auto; max-width:200px;" alt="ТАКТИЧЕСКАЯ ШАПКА">Тактическач шапка <<if $cap_1 == 1>>[[Надеть|wardrobe][$cap_1 = 2]]<<elseif $cap_1 == 2>> Надето<</if>><</if>></td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> <tr> <td>Предмет появится позже</td> <td>Предмет появится позже</td> <td>Предмет появится позже</td> </tr> </table> <<back "Я передумал (вернуть старые вещи)">> [[ОБРАТНО В ГАРДЕРОБ|wardrobe]] /*0-не используется или не было в игре до этого), 1 - в инвентаре, 2 - надето, 3 – выброшено*/

Так же в пассаже wardrobe я реализовал увеличение множителей урона от шмоток:

/*Обнуление бонусов от вещей*/<<set $mul_item to 0>> /*Подсчет бонусов от вещей головы*/<<if $cap_1 == 2>><<set $mul_item += 0.05>><</if>> /*Подсчет бонусов от вещей тела*/<<if $top_1 == 2>><<set $mul_item += 0.05>><</if>> /*Подсчет бонусов от вещей штанов*/<<if $legs_1 == 2>><<set $mul_item += 0.05>><</if>> /*Подсчет бонусов от вещей обуви*/<<if $boots_1 == 2>><<set $mul_item += 0.05>><</if>>

Обнуление было добавлено с целью избежать вечного накопления усилений ГГ.

Кнопки «НАЗАД» и «ВЕРНУТЬСЯ»

В очередной раз мучая Chat-GPT тупыми вопросами, я узнал про новые возможности движка

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

А именно про кнопку <<back>>.
Но я же человек не глупый (Хорошо! Не настолько глупый!). И сразу нырнул в бездну документации, а когда вынырнул, стал обладателем уникальных знаний про <<back>>. и <<return>>.

Подробнее тут и тут.

Если вкратце, то кнопка <<return>> просто возвращает Вас в предыдущий пассаж (из вообще любого места), а кнопка <<back>> не только возвращает Вас в предыдущий пассаж, но и возвращает предыдущие значения переменных.

Именно вторая кнопка мне очень помогла в надеванием шмоток. Создателем этих кнопок я хочу сказать только одно:

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

П.С. если будете задавать чат ботам много вопросов, то можно запросто их сломать. А еще они ломаются сами по себе, так что насколько бы я не был туп, и не был умен чат-бот, свои знания в голове все же надо держать.

от меня потом 2 дня игнорил ))
от меня потом 2 дня игнорил ))

КНОПКА ИНВЕНТАРЯ И СТАТИСТИКИ:

Благодаря вышеописанным кнопкам я, наконец, смог сделать кнопки инвентаря и статистики.

Через пассаж StoryCaption добавляем 2 новых пассажа:

[[Статистика|statistic]] [[Инвентарь|inventory]]

Для наглядности я вынес их отдельно от остальных блоков:

Игра на Twine Sugarcube или 1000 и 1 страдание (инструкция для начинающих) Часть 5.

Пассаж statistic:

оплата через: $days_to_rent дней story $story battles $battles номер комнаты подземелья $room_number <<return "Назад">>

Как видно, написано тут мало и больше для себя, но в принципе можно будет писать сюда что угодно. Главное, не создавать внутри statistic и inventory новые переходы, иначе не получится вернуться в простые комнаты (или придется делать дополнительные ссылки, типо кнопки «Я застрял», которая перенесет героя домой)

Пассаж statistic практически полностью повторяет пассаж wardrobe, но это временно. Его я буду расписывать значительно позже:

Голова:<<if $cap_0 == 2>>Старая шапка<<elseif $cap_1 == 2>>Тактическая шапка<</if>> Тело: <<if $top_0 == 2>>Старая куртка<<elseif $top_1 == 2>>Потрепаная куртка искателя<</if>> Ноги: <<if $legs_0 == 2>>Старые штаны<<elseif $legs_1 == 2>>Потрепаные штаны искателя<</if>> Обувь: <<if $boots_0 == 2>>Старые ботинки<<elseif $boots_1 == 2>>Потрепаные поножи искателя<</if>> <<return "Назад">>

В следующей части я буду завершить разработку игры. Прокачаем все характеристики персонажа, создадим квест победы над боссом и добавим пару мелочей.

Напоминаю про бота. Не обязательно пользоваться именно этим, но в принципе на использование ботов я Вас сильно агитирую.

55
1 комментарий

Эх, вот бы был готовый движок, притом опенсорсный, да ещё и отечественный, в котором инвентарь шёл бы из коробки.