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

В предыдущей части мы с Вами создали первый проект. Настало время его наполнения.

В предыдущей части мы с Вами создали первый проект. Настало время его наполнения.

Остановились мы тут<br />
Остановились мы тут

Например, пишем «Привет Мир», жмем на «Build», кликаем по «Play» и наслаждаемся Вашим величием.

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

Окей, начало положено. Каждый кто играл, в игры на этом движке (мы то с вами знаем, во что вы все играли), знает про переходы. Окей, сказано, сделано. Переходы осуществляются посредством двойных квадратных скобок, например: [[переход_1]]. Новый пассаж, указанный в двойных квадратных скобках появляется автоматически.

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

Получаем вот такой простой результат:

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

Вообще в документации, написано, что возможностей несколько больше. И мы ими воспользуемся, но потом.

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

А сейчас мы ссылку на второй пассаж заменим текстом. Делается это через вертикальную черту «|». А еще в документе может быть дохрена переходов на один и тот же блок. Например вот так:

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

Все 4 варианта ведут в пассаж «переход_1».

Ну и для окончательного понимания, сделаем несколько переходов. Из одного пассажа, может быть сколько угодно переходов и куда угодно, а также переход может возвращаться сам в себя.

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

Окей, мы с Вами сделали переходы, но они такие.... маленькие. По ним трудно попасть мышкой. Можно было бы сделать просто текст больше (про редактирование и разметку текста, мы с Вами говорили в блоке про HTML).

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

как бы боты не были умны, человеки все еще слишком глупые, чтобы излагать свои мысли и желания понятно. Уточняйте, расписывайте свой вопрос подробнее и тогда вы будете ПРАВИЛЬНО услышаны и вам дадут ПРАВИЛЬНЫЙ ответ

В итоге к css добавились следующие блоки:

table { width: 100%; /* Ширина таблицы по длине рабочего блока игры */ background-color: #565656; /* Закраска внутри таблицы */ margin: auto; /* Выравниваем таблицу по центру окна */ } td a { display: block; /* Для нажатия всей ячейки */ } td, th { text-align: center; /* Для расположения текста по центру */ }

Все это нужно добавить сюда:

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

В конечном варианте я заменил простой перехода на <table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table> в итоге получилось следующее:

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

Еще раз:
[[НАЗАД В ГИЛЬДИЮ|guild]]
и
<table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table>
это функционально один и тот же блок. Просто Теперь при нажатии на серую область, а не только на текст, будет произведен переход на новый пассаж. Но вы можете оставить и просто текст. Большинство авторов так делают и это не является проблемой (style="font-size: 20px увеличивает размер текста в таблице). В примерах кода для простоты я убрал все блочные элементы, поэтому, если вы просто копируете что-то, а у вас нет красоты, то не забудьте, что нужно писать
<table><tr><td style="font-size: 20px;">[[НАЗАД В ГИЛЬДИЮ|guild]]</td></tr></table>
вместо простого
[[НАЗАД В ГИЛЬДИЮ|guild]]

ПЕРЕМЕННЫЕ

Окей, как переходы делать между пассажами мы научились. Но я делаю не просто линейную игру, а легкий РПГ с элементами рогалика. У меня должно быть золото, кристаллы, какие-то вещи – все это надо как-то в игре обозначить.

Для любой переменной в SUGARCUBE используется символ «$». Например:

$золото
$кристалы
$количетсво_обещаний_похудеть_к_лету

Заметьте, что к пробелам этот движок (как и любой другой в мире) очень чувствителен.

При этом, сами переменные могут быть любыми:

$тракторист = 300 (целые числа)
$водка = 0.2 (рациональные числа)
$совесть = "нет" (любой текст)
$заваленная_сессия = $армия (любая другая переменная)

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

<<SET>> И УСТАНОВКА ПЕРЕМЕННОЙ В ССЫЛКЕ

Для того, чтобы назначить и записать переменную в игру используется 2 основных способа:

1. Через команду SET: <<set $золото = 10>>, оно же <<set $золото to 10>> (подробнее тут)

2. Через модификатор ссылки: [[переход_1][$золото = 10]]. (подробнее тут)

ВАЖНО: человеки, знакомые с любым программированием, знают о чем речь, для остальных просвещаю: = и ==, это два принципиально разных по значению символа. «=» используется для присвоения (обозначения), в то время, как «==» обозначается для сравнения (когда проверяется условие, равна ли переменная $золото десяти).

Еще раз:
$золото = 10 мы говорим игре, что теперь количество нашего золота равно 10.
$золото == 10 мы проверяем, равно ли количество золота 10.

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

В чем разница, между <<SET>> и модификатором ссылки?

Напишем 2 простых пассажа:

Тебя ограбили разбойники и оставили у тебя только 10 монет. <<set $money = 10>> У тебя $money [[first]]
Ты нашел сундук с 10 монетами. У тебя $money [[first][$money += 10]]

В обоих случаях пассаж назван first, и ссылка возвращается в него же. Но в первом случае у персонажа в любом случае будет определенное количество монет, а во втором только после НАЖАТИЯ.

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

STORYINIT

В движке есть возможность назначить такой пассаж, как StoryInit. Это уникальный пассаж. Его нигде не будет видно, и нужен он лишь за тем, чтобы заранее определить переменные (через тот самый <<set>>).
Ничто не мешает Вам пойти по пути хардкора и переменные назначать в простых пассажах.

Единственная разница будет лишь в том, что назначенная через StoryInit переменная будет в игре ПОСТОЯННО, в то время, как назначенная через простой пассаж переменная активируется (появится в игре) лишь тогда, когда вы дойдете до своего пассажа. Поверьте, игра (особенно сложная) от этого будет глючить и не раз.

Так, что крутые и уважающие себя дядьки определяют переменные заранее. Например, у меня StoryInit сейчас выглядит так:

/*БАЗА*/ <<set $story to 0>> /* Этап истории */ <<set $money to 0>> /* Деньги (используются вне подземелья */ <<set $crystal to 0>> /* Кристаллы (используются в подземелье) */ <<set $loot_crystal to 100>> /* Кристаллы (бы выведения количества кристаллов с монстров) */ <<set $day to 0>> /* Количество дней (для подсчетов) */ <<set $days_to_rent to 30>> /* Количество дней (для подсчетов) */ <<set $battles to 1>> /* Количество битв (для подсчетов) */ <<set $dungeon_hunt to 0>> /* Проверка был ли в подземелье, если больше 0, то надо отдохнуть */ <<set $easy_work to 0>> /* Для выбора случайной легкой работы */ <<set $house_type to 1>> /* Тип твоего дома 1(старые развалины), 2(Обшарпанная квартира), 3... (ПРИДУМАТЬ ПОТОМ) */ /*Боевые характеристики ГГ*/ <<set $hero_vitality to 10>> /* Живучесть (Tomato)*/ <<set $hero_mana to 10>> /* Мана (SkyBlue)*/ <<set $hero_strength to 10>> /* Сила (Salmon)*/ <<set $hero_intelligence to 10>> /* Интеллект (Salmon)*/ <<set $hero_agility to 10>> /* Ловкость (ForestGreen) */ <<set $hero_stamina to 10>> /* Выносливость (Khaki)*/ <<set $hero_bomb to 0>> /* Бомбы ГГ. Даются только на страте 10 шт. */ /*Остальные характеристики ГГ*/ <<set $hero_charisma to 5>> /* Харизма (Magenta)*/ <<set $hero_will to 1>> /* Воля */ /*Боевые характеристики МОНСТРОВ*/ <<set $monster_vitality to 10>> /* живучесть */ <<set $monster_mana to 10>> /* мана */ <<set $monster_strength to 10>> /* сила */ <<set $monster_agility to 10>> /* ловкость */ <<set $monster_stamina to 10>> /* выносливость */ /*Переменные для комнат*/ <<set $room_number to 1>> /* Номер комнаты в подземелье */ <<set $room_choice to 1>> /* Выбор типа комнаты кроме 1 и 10 (сражение, квест, сокровище, проклятие */ <<set $monster_name_floor_1 to 0>> /* Случайный монстр 1 этажа */ <<set $monster_name_floor_2 to 0>> /* Случайный монстр 2 этажа */ /* И так до 10 этажа */ <<set $random_treasure to 0>> /* Для случайного выбора сокровища */ /*Множители*/ <<set $mul_curse to 0>> /* Проклятия */ <<set $mul_blessing to 0>> /* Благословения */ <<set $mul_item to 0>> /* Вещи, предметы */ /*Переменные для боя*/ <<set $sum_base_hero to 0>> /* Сумма характеристик */ <<set $sum_multiple_hero to 0>> /* Сумма множителей */ <<set $sum_base_monster to 0>> /* Сумма характеристик монстра*/ <<set $sum_multiple_monster to 0>> /* Сумма множителей монстра*/ <<set $sum_hero to 0>> /* Итоговая сила ГГ */ <<set $sum_monster to 0>> /* Итоговая сила монстра*/

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

Итак, школа закончилась, начинаем делать игру:

ТЕКСТ и БЛОК <<IF>>

Сначала я просто наклепал вводный рассказ на несколько частей, но потом решил немного схитрить.

Можно написать просто много пассажей подряд:

Создаем свою версию многоножки<br />
Создаем свою версию многоножки

А можно сделать все одним действием: вписав следующий текст:

В пассаже StoryInit задаем глобальную переменную (ничто Вам не мешает задать ее в простом блоке, но будьте серьезным дядькой): <<set $story = 0>>

Далее в пассаже first вписываем следующий текст

<<if $story == 0>>МНОГАБУКАФ 0<<set $story = 1>> [[first]] <<elseif $story == 1>> МНОГАБУКАФ 1 <<set $story = 2>> [[first]] <<elseif $story == 2>> МНОГАБУКАФ 2 <<set $story = 3>> [[first]] <<elseif $story == 3>> МНОГАБУКАФ 3 <<set $story = 4>> [[first]] <<elseif $story == 4>> МНОГАБУКАФ 4 КОНЕЦ <</if>>

И получаем ровно тот же самый текст, но всего в одном пассаже (надеюсь вы еще помните про разницу между «=» и «==»):

Многоножка готова )<br />
Многоножка готова )

Только что мы с вами познакомились с логическим элементом <<IF>> (подробнее).

Выглядит он следующий образом:
<<if УСЛОВИЕ>><</if>>

Есть еще варианты:

<<if УСЛОВИЕ>><<elseif УСЛОВИЕ>><</if>>
<<if УСЛОВИЕ>><<else>><</if>>
<<if УСЛОВИЕ>><<elseif УСЛОВИЕ>><<else>><</if>>

Во всех случаях должно быть открывающее <<if>> и закрывающее <</if>>. Это важно, иначе вы постоянно будете видеть что-то вроде.

Например тут я удалил закрывающий блок &lt;&lt;/if&gt;&gt;, и вуа-ля СПОЙЛЕРЫ!
Например тут я удалил закрывающий блок <</if>>, и вуа-ля СПОЙЛЕРЫ!

Теперь, если вы каким-то образом пропустили всю информатику в школе, то разберемся с самым базовым логическим элементом. Начнем сразу с примера (не забудьте заранее задать значение переменой):

<<if $турецкие_лиры == 10000>> Браво, ты готов к зимней распродаже в STEAM. <<else>> А знаешь, у тебя и так достаточно игр... <</if>>

В данном примере, мы проверяем равная ли переменная $турецкие_лиры числу 10000. Если равна, то пишем первый текст. Если не равна (даже если больше) пишем второй текст.

По такому же принципу после <<if>>, но до <<else>> пишется <<elseif >>. При чем этого <<elseif >> может быть сколь угодно много, главное не забыть вписать УСЛОВИЕ.

Так же важно пометить, что допускается <<else>> не писать, если Вам нужно вывести кусок текста только при одном единственном условии:

<<if $ПРОИГРАЛ_КАТКУ_В_ДОТЕ == "true">>Я звою мамку знаю!<</if>>.

Если углубиться в документацию, то можно писать и более монструозные конструкции:

Учимся лениться правильно :)
Учимся лениться правильно :)

Настолько большое внимание я заострил на этой теме потому, что:

1.Я нуб в программировании и это мой основной способ задавать условия в моей игре;

2. Они все равно используются часто и в других играх, так, что ошибаться вы будете и часто.

Если говорить в контексте моей игры, то 16 изначальных блоков превратилось в 7:

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

StoryAuthor

Хорошо, вроде понятно, но появилась необходимость следить за переменной $story. Вставлять что-то вроде: "Параметр story равен $story", в конце каждого блока неудобно, да и удалять потом придется, так что для отображения необходимой информации ее проще вывести в блок слева:

Для этого создаем новый пассаж и называем его StoryAuthor

Это еще один уникальный пассаж движка наравне со StoryInit. В самом пассаже пишем значение той переменной за которой нужно следить, например:

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

В результате несложных махинаций получаем вой такой результат:

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

Кстати, только что мы с вами узнали, что если в пассаже написать переменную, то (при условии, что она определена заранее, например через <<set>> в этом же пассаже или в StoryInit) отобразится ее значение. В примере выше я один раз нажал на first и у меня значение $story поменялось на 2.

Может оно и выглядит просто, но на более поздних этапах разработки у меня уже получилось следующее:

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

Для успокоения совести напомню еще раз, что из одного пассажа можно вести несколько путей. Например у меня это реализовано в возможности пропустить обучение (другой момент, что я понял, что у меня вся первая глава – одно большое обучение, но об этом тавтологическом позоре я узнаю от себя позже).

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

Текст пассажей:

[[ПРОЙТИ ОБУЧЕНИЕ|education_1][$story +=0]] [[ПРОПУСТИТЬ ОБУЧЕНИЕ|room_choice][$story +=0]]

(что за $story +=0, вы уже знаете из документации по блоку SET (да-да, учите английский))

В следующей части разработаем механику боя и перемещение по комнатам подземелья.

Еще раз напоминаю про бесплатных ботов:

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

Спасибо за информацию! Случайно набрел на статью и нашел много полезностей для своего проекта)

1