Замена текста в SugarCube 2 позволяет динамически изменять содержимое элементов на странице. Это полезно для создания интерактивных историй, где текст может меняться в зависимости от действий игрока или других событий в игре.
Вот как работает замена текста в SugarCube 2:
Макрос <<replace>>:
Макрос <<replace>> используется для замены содержимого элемента на странице.
Синтаксис: <<replace "селектор">>текст замены<</replace>>
"селектор" - это идентификатор или класс элемента, который нужно заменить.
Текст замены - это новое содержимое элемента.
Выбор элемента для замены:
Чтобы заменить текст, нужно выбрать элемент на странице.
Это можно сделать с помощью идентификатора (начинается с "#") или класса (начинается с ".").
Например, #текст будет заменять элемент с идентификатором "текст", а .абзац - все элементы с классом "абзац".
Использование переменных:
В тексте замены можно использовать переменные SugarCube.
Переменные заключаются в двойные фигурные скобки: {{переменная}}.
Например, <<replace "#текст">>Текущее значение переменной: {{$value}}.<</replace>>
Замена части текста:
Можно заменить только часть текста элемента, используя методы строк JavaScript.
Например, <<replace "#текст">>{{$text.replace("старый", "новый")}}<</replace>>
Замена нескольких элементов:
Можно заменить сразу несколько элементов, используя один макрос <<replace>>.
Просто перечислите селекторы через запятую: <<replace "#текст1, #текст2, .абзац">>новый текст<</replace>>
Замена в других пассажах:
Замена текста работает не только в текущем пассаже, но и в других пассажах.
Просто используйте правильные селекторы для элементов в других пассажах.
Вот пример использования замены текста в SugarCube 2:
html
<<set $value = 42>>
<<set $text = "Это старый текст.">
 
<<replace "#текст">>
  Текущее значение переменной: {{$value}}.
<</replace>>
 
<<replace "#абзац">>
  {{$text.replace("старый", "новый")}}
<</replace>>
 
В этом примере мы заменяем текст элемента с идентификатором "текст" на "Текущее значение переменной: 42." и заменяем слово "старый" на "новый" в тексте элемента с идентификатором "абзац".
Надеюсь, это поможет вам понять, как работает замена текста в SugarCube 2. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

 Начисто сегодня:

StoryInit

/*инвентарь, сумки, сундуки, шкафы, склады*/

<<set $sumka = []>> /*объявляю "пустое" множество предметов в сумке*/

<<set $totalWeightSumka = 0>> /*вес предметов в сумке*/

<<set $item = {}>> /* Инициализация переменной $item как объект *

===========================================================

Пассаж, где "генерируются" предметы и подбираются

<<if $totalWeightSumka >= 5000>>

    У вас больше нет места в сумке

<<else>>

    <<set $kosteritem = random(1, 5)>> /*условия для появления предмета*/

 

    <<if $kosteritem == 1>>

        <<set $apple = {

            name: "яблоко",

            color: "красное",

            taste: "сладкое",

            weight: random(80, 300),

            price: 0, /*Инициализация цены перед расчетом*/

            satisfyHunger: 0,

            satisfyThirst: 0,

            burningTime: 0

        }>>

        <<set $apple.price = $apple.weight / 10>> /*Рассчет цены пропорционально весу*/

        <<set $apple.satisfyHunger = $apple.weight * 5>>

        <<set $apple.satisfyThirst = $apple.weight * 5>>

 

        <<link "Положить яблоко <<print $apple.color>> <<print $apple.taste>> весом <<print $apple.weight>> ценой <<print $apple.price>> пищевая ценность: <<print $apple.satisfyHunger>> утоление жажды: <<print $apple.satisfyThirst>> время горения: <<print $apple.burningTime>>">>

            <<set $sumka.push($apple)>>

            <<set $itemSumka = $apple>><<goto "костерок">>

                   <</link>>

    <<elseif $kosteritem == 2>>

        <<set $pear = {

            name: "груша",

            color: "зеленая",

            taste: "сладкая",

            weight: random(100, 200),

            price: 0,

            satisfyHunger: 0,

            satisfyThirst: 0,

            burningTime: 0

        }>>

        <<set $pear.price = $pear.weight / 8>>

        <<set $pear.satisfyHunger = $pear.weight * 5>>

        <<set $pear.satisfyThirst = $pear.weight * 5>>

 

        <<link "Положить грушу <<print $pear.color>> <<print $pear.taste>> весом <<print $pear.weight>> ценой <<print $pear.price>> пищевая ценность: <<print $pear.satisfyHunger>> утоление жажды: <<print $pear.satisfyThirst>> время горения: <<print $pear.burningTime>>">>

            <<set $sumka.push($pear)>>

            <<set $itemSumka = $pear>><<goto "костерок">>

         <</link>>

    <<else>>

        Здесь нечего взять

    <</if>>

<</if>>

============================================================
Пассаж сумки
 
/*Отображение добавленных предметов в виде ссылок в пассаже "Инвентарь":
javascript*/
 
<<set $totalWeightSumka = 0>> /*подсчет общего веса предметов в сумке*/
 
<<if $totalWeightSumka >= 5000>>
    У вас больше нет места в сумке
<</if>>
 
   
<<if $sumka.length > 0>>
    <h2>Предметы в вашем инвентаре:</h2>
 
    <<for $itemSumka range $sumka>>
        <<set $totalWeightSumka += $itemSumka.weight>>
 
        <<link "Посмотреть <<print $itemSumka.name>> - Цвет: <<print $itemSumka.color>>, Вкус: <<print $itemSumka.taste>>, Вес: <<print $itemSumka.weight>>, Цена: <<print $itemSumka.price>>, Утоление голода: <<print $itemSumka.satisfyHunger>>, Утоление жажды: <<print $itemSumka.satisfyThirst>>, Время горения: <<print $itemSumka.burningTime>>">>
            <<print $itemSumka.name>>
        <</link>>
 
        <br>
    <</for>>
 
    <p>Общий вес предметов в сумке: <<print $totalWeightSumka>> грамм</p>
<<else>>
    <p>Ваша сумка пуста.</p>
<</if>>

Всё это работает как задумано.

===============================

Задание на завтра:

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

Для этого можно добавить дополнительные ссылки рядом с информацией о каждом предмете в сумке:

html

<<set $totalWeightSumka = 0>> /*подсчет общего веса предметов в сумке*/

 

<<if $sumka.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

 

    <<for $itemSumka range $sumka>>

        <<set $totalWeightSumka += $itemSumka.weight>>

 

        <<link "Посмотреть <<print $itemSumka.name>> - Цвет: <<print $itemSumka.color>>, Вкус: <<print $itemSumka.taste>>, Вес: <<print $itemSumka.weight>>, Цена: <<print $itemSumka.price>>, Утоление голода: <<print $itemSumka.satisfyHunger>>, Утоление жажды: <<print $itemSumka.satisfyThirst>>, Время горения: <<print $itemSumka.burningTime>>">>

            <<print $itemSumka.name>>

        <</link>>

 

        <<link "Съесть <<print $itemSumka.name>>">>

            <<set $hunger += $itemSumka.satisfyHunger>>

            <<remove $sumka $itemSumka>>

            <<set $totalWeightSumka -= $itemSumka.weight>>

        <</link>>

 

        <<link "Выбросить <<print $itemSumka.name>>">>

            <<remove $sumka $itemSumka>>

            <<set $totalWeightSumka -= $itemSumka.weight>>

        <</link>>

 

        <br>

    <</for>>

 

    <p>Общий вес предметов в инвентаре: <<print $totalWeightSumka>> грамм</p>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

<<if $totalWeightSumka >= 5000>>

    У вас больше нет места в сумке

<</if>>

 

В этом обновленном коде:

Мы добавили два новых <<link>> блока для каждого предмета в сумке:

"Съесть <<print $itemSumka.name>>"

"Выбросить <<print $itemSumka.name>>"

При клике на ссылку "Съесть":

Значение переменной $hunger увеличивается на $itemSumka.satisfyHunger

Предмет удаляется из массива $sumka

Общий вес в сумке уменьшается на вес съеденного предмета

При клике на ссылку "Выбросить":

Предмет удаляется из массива $sumka

Общий вес в сумке уменьшается на вес выброшенного предмета

Таким образом, пользователь теперь может не только просматривать содержимое сумки, но и съедать или выбрасывать предметы из нее.

Обратите внимание, что вам также нужно будет добавить переменную $hunger и обновить ее значение при съедании предметов.

Дайте мне знать, если у вас возникнут дополнительные вопросы!

=============================

Молодец! Вот только я ему забыл сказать, что переменные уже объявлены и даже изменяются во времени. Лан завтра в это буду вникать.

 




Если скобки будут квадратными в контексте инициализации переменной, это будет означать создание пустого массива
Формат JSON (JavaScript Object Notation) - это легкий формат обмена данными, основанный на синтаксисе JavaScript. JSON используется для передачи структурированных данных между компьютерами и является популярным форматом для работы с данными веб-приложений. Он представляет собой текстовый формат, который легко читается как человеком, так и машиной.
JSON представляет данные в виде пар "ключ: значение", где ключи и значения могут быть строками, числами, объектами, массивами, логическими значениями или null. Пример JSON-объекта:
json
{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "hobbies": ["reading", "traveling"],
  "address": {
    "street": "123 Main St",
    "city": "Anytown"
  }
}

А, если скобки сделдать квадратными?

То это уже будет массив, а не объект. Вот как будет выглядеть инициализация переменной с пустым массивом:

javascript
<<set $items = []>> /* Инициализация переменной $items как пустого массива */
 

Разница между фигурными скобками {} (для объектов) и квадратными скобками [] (для массивов) в формате JSON или в JavaScript заключается в следующем:
Фигурные скобки {} для объектов: Используются для создания объектов, где данные хранятся в формате "ключ: значение". Пример: { "name": "John", "age": 30 }.
Квадратные скобки [] для массивов: Используются для создания массивов, где данные хранятся в виде упорядоченного списка. Пример: ``.

Таким образом, при использовании квадратных скобок [] вы создаете пустой массив, который может содержать элементы, а при использовании фигурных скобок {} вы создаете пустой объект, который может содержать пары "ключ: значение". Каждая структура имеет свои особенности и применение в зависимости от необходимости хранения и организации данных.
==============================================

в массиве в JavaScript можно хранить не только примитивные значения, но и объекты или другие массивы. Это позволяет создавать структурированные данные и хранить их в удобной форме. Вы можете объявить объекты или массивы в других частях кода и добавить их в основной массив. Вот пример:

javascript

// Объявление объектов

<<set $apple = { name: "яблоко", color: "красное" }>>

<<set $banana = { name: "банан", color: "желтый" }>>

 

// Объявление массива и добавление объектов

<<set $fruits = [$apple, $banana]>>

 

В этом примере $apple и $banana - это объекты, которые затем добавляются в массив $fruits. Таким образом, в массиве $fruits будут храниться объекты $apple и $banana. При необходимости вы можете добавлять в массив и другие объекты или массивы, создавая структурированные данные для вашего приложения.
================================
 

Да, в JavaScript можно добавить массив в качестве свойства объекта. Это позволяет структурировать данные и хранить массивы внутри объектов. Вот пример того, как можно добавить массив в объект:

javascript

// Создание объекта с массивом в качестве свойства

const myObject = {

    name: "John",

    age: 30,

    hobbies: ["reading", "painting", "gardening"]

};

 

В этом примере hobbies - это свойство объекта myObject, которое содержит массив с хобби. Таким образом, вы можете легко хранить массивы внутри объектов, что удобно для организации и доступа к данным в вашем коде.

Вон оно чо, Хоттабыч... поди сразу улови эту разницу... А зато сколько всякого разного такого можно навертеть... Так.... А в чо это только в массивы добавлены в качестве значений? А в качестве ключей можно добавлять массивы в объекты? Ась? Ну, и пирожоновых...

==================================

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

javascript

// Некорректное использование массива в качестве ключа

const myObject = {

    [1, 2, 3]: 'value' // Некорректное использование массива в качестве ключа

};

 

В данном примере использование массива `` в качестве ключа объекта myObject является некорректным и приведет к ошибке. Ключи объекта должны быть строками или символами для корректной работы.

Облом, ну, ладно, перетопчемся... А не в JS? Можна?

--------------------------------

Да, существуют языки программирования, в которых можно использовать массивы в качестве ключей в объектах. Например, в языке PHP такая возможность есть. В PHP можно использовать массивы в качестве ключей в ассоциативных массивах. Вот пример использования массива в качестве ключа в PHP:

php

// Использование массива в качестве ключа в PHP

$myArray = array('key1' => 'value1', array('nestedKey1' => 'nestedValue1') => 'value2');

 

В данном примере, массив array('nestedKey1' => 'nestedValue1') используется в качестве ключа в ассоциативном массиве $myArray

------------------------

ну, вот, а жизнь то налаживается....

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

 


 ну, он конечно молодец, создал объект трусы не знаю еще правильно или не правильно... но возникает вопрос, что с этими трусами делать то? как их в тексте отобразить и все такое. Еще упростим задачу, пока просто предметы без свойств.

Для создания множества объектов в инвентаре и отображения их в виде ссылок в пассаже "Инвентарь" можно использовать массив, в котором будут храниться добавленные предметы. Вот пример кода, который демонстрирует этот подход с яблоком, грибочком и кубиком:
Создание массива для хранения предметов в инвентаре:
javascript
:: StoryInit
<<set $inventory = []>>
 
 
Добавление предметов (яблоко, грибочек, кубик) в инвентарь:
javascript
<<set $inventory.push("яблоко")>>
<<set $inventory.push("грибочек")>>
<<set $inventory.push("кубик")>>
 
Отображение добавленных предметов в виде ссылок в пассаже "Инвентарь":
javascript
<<if $inventory.length > 0>>
    <h2>Предметы в вашем инвентаре:</h2>
    <<for _item range $inventory>>
        <<link "Посмотреть $_item">>
            $_item
        <</link>>
        <br>
    <</for>>
<<else>>
    <p>Ваш инвентарь пуст.</p>
<</if>>
 
Этот код создает массив $inventory, добавляет в него предметы (яблоко, грибочек, кубик) и отображает их в виде ссылок в пассаже "Инвентарь". При клике на ссылку можно просмотреть каждый добавленный предмет... Хотя....

 

 

логично добавлять предметы в инвентарь внутри ссылки, чтобы игрок мог добавить предмет по своему выбору. Вот пример ссылки для добавления яблока в инвентарь:

javascript

<<link "Положить яблоко в инвентарь">>

    <<set $inventory.push("яблоко")>>

    Яблоко добавлено в ваш инвентарь.

<</link>>

 

Этот код создает ссылку "Положить яблоко в инвентарь", при клике на которую в инвентарь будет добавлено яблоко, а игрок увидит сообщение "Яблоко добавлено в ваш инвентарь". Подобным образом можно создать ссылки для добавления других предметов в инвентарь.
=====================================================================
Не знаю почему эти ИИ называют ГПТ, перплексити, Бинг и другими красивыми словами. Натуральные же Хоттабычи. Неожиданно... этот код почти работает...

 

почти работает, только вот у меня в инвентарь с каждым кликом по ссылке добавляется не ссылка на объект яблоко, ссылка:  "Посмотреть $_item". При клике на которую ничего не происходит

Answer

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

Добавление предметов в инвентарь с использованием объектов:

javascript

<<set $inventory = []>>

 

<<set $apple = {

    name: "яблоко"

}>>

<<set $mushroom = {

    name: "грибочек"

}>>

<<set $cube = {

    name: "кубик"

}>>

 

<<set $inventory.push($apple)>>

<<set $inventory.push($mushroom)>>

<<set $inventory.push($cube)>>

 

Отображение предметов в виде ссылок в пассаже "Инвентарь":

javascript

<<if $inventory.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

    <<for _item range $inventory>>

        <<link "Посмотреть $_item.name">>

            $_item.name

        <</link>>

        <br>

    <</for>>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

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

 Это я каждый раз должен новую переменную на каждый объект прописывать: грыбочек, яблочко... хм... над как-то это классифицировать и упорядочить...

Ок, еще не всё понятно мне поэтому зададим еще один провокационный вопрос:

а, если объект с именем яблоко будет еще и красным и сладким? Как будет выглядеть код?

Для добавления дополнительных свойств, таких как цвет и вкус, к объекту "яблоко" и отображения их в ссылках в инвентаре, вам нужно расширить структуру объекта и использовать эти свойства при отображении предметов. Вот как это может быть реализовано:

Обновление объекта "яблоко" с дополнительными свойствами (цвет, вкус):

javascript

<<set $apple = {

    name: "яблоко",

    color: "красное",

    taste: "сладкое"

}>>

 

Добавление объекта "яблоко" в инвентарь с обновленными свойствами:

javascript

<<set $inventory.push($apple)>>

 

Отображение предметов в виде ссылок с учетом новых свойств в пассаже "Инвентарь":

javascript

<<if $inventory.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

    <<for _item range $inventory>>

        <<link "Посмотреть $_item.name - Цвет: $_item.color, Вкус: $_item.taste">>

            $_item.name

        <</link>>

        <br>

    <</for>>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

Теперь при клике на ссылку "Посмотреть яблоко - Цвет: красное, Вкус: сладкое", игрок сможет просмотреть яблоко с указанными свойствами из инвентаря.


 

Вон оно чо Петрович.... тут такие горизонты открываются...


================================================================

 Это тебе так кажется, Хоттабыч, что может на самом деле он выдает ссылку такого вида: 

$_item.name - Цвет: $_item.color, Вкус: $_item.taste

 

Ну, не первый день замужем, поэтому тактично напоминаем, а ты не забыл ли где-то print прописать?

***

О! Волька! Да, для вывода значений свойств объекта в ссылках в инвентаре необходимо использовать <<print>> для корректного отображения. Вот исправленный код с добавлением <<print>>:

javascript

<<if $inventory.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

    <<for _item range $inventory>>

        <<link "Посмотреть <<print _item.name>> - Цвет: <<print _item.color>>, Вкус: <<print _item.taste>>">>

            <<print _item.name>>

        <</link>>

        <br>

    <</for>>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

Теперь при клике на ссылку в инвентаре, будут корректно отображаться значения свойств объекта (цвет, вкус) вместо их кодовых названий.

========

Теперь работает как заказано, ссылка отображается виде: Посмотреть яблоко - Цвет: красное, Вкус: сладкое

 

 

но... принтов-то принтов навертел, что твой Д. Гордон мерчей...

Трем лампу и прашиваем: Одним принтом никак нельзя было обойтись?

Конечно, О. Волька!:

<<if $inventory.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

    <<for _item range $inventory>>

        <<link "Посмотреть $_item.name - Цвет: $_item.color, Вкус: $_item.taste">>

            $_item.name

        <</link>>

        <br>

    <</for>>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

на выходе получаем: Посмотреть яблоко - Цвет: <<красное>>, Вкус: <<сладкое>>

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

============================================

И тут Хоттабыч психанул и выдал прекрасное и лаконичное и ваще и в борще без принта. И ссылочку выдающее прекрасную вида:

 

"Посмотреть яблоко - Цвет: красное, Вкус: сладкое".

 

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

 

 

<<if $inventory.length > 0>>

    <h2>Предметы в вашем инвентаре:</h2>

    <<for _item range $inventory>>

        <<link "Посмотреть <<= _item.name >> - Цвет: <<= _item.color >>, Вкус: <<= _item.taste >>">>

            <<= _item.name >>

        <</link>>

        <br>

    <</for>>

<<else>>

    <p>Ваш инвентарь пуст.</p>

<</if>>

 

Да, можно использовать другой способ для вывода значений свойств объекта внутри ссылки без повторения <<print>>. Один из вариантов - использовать <<=>> для вывода переменных внутри текста. Вот как это может выглядеть:

Этот вариант позволяет выводить значения переменных внутри текста без использования дополнительных <<print>>, сохраняя при этом хорошую читаемость и выделение изменяемых переменных.

 

<<=>> - это макрос в формате SugarCube, который используется для вывода значений переменных внутри текста без необходимости использования дополнительных <<print>>. Он позволяет вставлять переменные прямо в тексте, обрамляя их двумя <<=>>.

Пример использования <<=>>:

javascript

<<set $name = "Alice">>

Привет, <<= $name >>! Как дела?

Макрос <<=>> является специфичным для формата SugarCube, который используется в инструменте Twine для создания интерактивных текстовых игр и историй. Он не является стандартным макросом в других языках программирования, таких как Rust, C++, или ассемблер.

Таким образом, макрос <<=>> применяется исключительно в контексте использования Twine и SugarCube для удобного вывода переменных внутри текста без необходимости использования дополнительных макросов или тегов.

В данном примере, значение переменной $name будет выведено прямо в тексте без использования дополнительных макросов или тегов, что делает код более читаемым и компактным.

Просто, красиво, лаконично... Просто прекрасно для ИИ и чайника, кому не нравиЦЦо, просьба не оскорбляться созерцанием сего. На этом этапе сделаем паузу и попробуем её осмыслить.

 

В принципе я имею три работающих кода для отображение ссылки в инвентаре, с которыми можно дальше работать. <<=>> интересный макрос в СугарКубе, но какой-то неявный поэтому использую я первый вариант кода.

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

Если я в чем ошибся то не взыщите.

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

Короче, по утрам надев трусы, не забудьте про часы...


 Для создания объекта "трусы" с характеристиками, которые могут изменяться со временем, в языке SugarCube 2 и использования переменных для свойств, можно воспользоваться следующим примером:
javascript
<<set $underwear = {
    condition: "новые, чистые",
    price: 2
}>>
 
// Позже изменение свойств объекта "трусы"
<<set $underwear.condition = "поношенные, грязные">>
<<set $underwear.price = 0>>
 
// Вывод информации о трусах
<<print "Состояние трусов: " + $underwear.condition + ", Цена: " + $underwear.price + " долларов">>
 
В этом примере мы создаем объект "трусы" с начальными характеристиками "новые, чистые" и ценой "2 доллара". Позже мы изменяем состояние трусов на "поношенные, грязные" и устанавливаем цену в 0 долларов. После этого выводим информацию о состоянии трусов с помощью макроса <<print>>.

Наверняка ведь наврал с кодом? Но вот уже скоро я это все проверю. 

А для инвентаря можно выделить целый пассаж. Вот такая кнопка может быть расположена прямо в StoryCaption. Очень удобно.

<<button [[Сумка|Сумка]]>><</button>>

 <<set $month to 2>>
<<set $year to 2024>>
<<if $month is 2>>
  <<if (($year % 4 is 0) and ($year % 100 is not 0)) or ($year % 400 is 0)>>
    <<set $daysInMonth to 29>>
  <<else>>
    <<set $daysInMonth to 28>>
  <</if>>
<<else>>
  <<set $daysInMonth to [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][$month - 1]>>
<</if>>
В феврале $year года $daysInMonth дней.


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

как то так наверное: 

<<if $month === 1>>

  <<if (($year % 4 is 0) and ($year % 100 is not 0)) or ($year % 400 is 0)>>

    <<set $daysInMonth to 29>>

  <<else>>

    <<set $daysInMonth to 28>>

  <</if>>
но проверять и радоваться буду уже завтра

 


 попробуем более просто пример чем с годами и месяцами.

Вот пример кода на языке Twine/SugarCube 2, который пересчитывает $hours в дни недели и отображает название дней недели:
twine
<<set $hours = 168>> <!-- Установка количества часов -->
<<set $daysOfWeek = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"]>> <!-- Массив дней недели -->
<<set $dayOfWeek = $daysOfWeek[$hours / 24 % 7]>> <!-- Вычисление дня недели -->
Текущий день недели: <<$dayOfWeek>> <!-- Отображение дня недели -->
 
В этом коде мы используем массив $daysOfWeek, который содержит названия дней недели. Мы также устанавливаем количество часов в переменной $hours. Затем мы вычисляем день недели, используя формулу $hours / 24 % 7, которая вычисляет количество дней, прошедших с начала недели, и использует остаток от деления на 7 для определения дня недели. Наконец, мы отображаем название дня недели с помощью переменной $dayOfWeek. Если вам нужно отобразить день недели в другом формате, вы можете изменить массив $daysOfWeek соответствующим образом.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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

 

Вот измененный код на языке Twine SugarCube 2, который увеличивает индекс элемента массива $namedayweek на 1 каждые 24 часа:

<<if $hours >= 24>>

    <<set $days += Math.floor($hours / 24)>>

    <<set $gdays += Math.floor($hours / 24)>>

    <<set $hours %= 24>>

    <<set $namedayweekIndex = $namedayweekIndex + Math.floor($hours / 24)>>

    <<if $namedayweekIndex >= $namedayweek.length>>

        <<set $namedayweekIndex = $namedayweekIndex - $namedayweek.length>>

    <</if>>

<</if>>

 

<<set $namedayweek = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "ВС"]>>

<<set $namedayweekToday = $namedayweek[$namedayweekIndex]>>

 

В этом коде мы добавили переменную $namedayweekIndex, которая хранит текущий индекс элемента массива $namedayweek. Каждые 24 часа мы увеличиваем $namedayweekIndex на 1, и если $namedayweekIndex становится больше или равным длине массива $namedayweek, мы вычитаем длину массива, чтобы вернуться к началу массива. Затем мы устанавливаем $namedayweekToday равным элементу массива $namedayweek с индексом $namedayweekIndex.

============================================

лан сегодня спать, завтра главное проснуться и быть в состоянии видеть буквы и думать)) Может я таки рожу что-то


пример куска кода из qsp... тоже может пригодится:

 if hour >= 24:
     jump 'loop'
     end
end
 
if month = 1 or month = 3 or month = 5 or month = 7 or month = 8 or month = 10 or month = 12:
!31
if day > 31:day -= 31 & month += 1
elseif month = 2:
!28
if day > 28:day -= 28 & month += 1
elseif month = 0:
month = 1
if day > 31:day -= 31 & month += 1
elseif month = 13:
month = 1
if day > 31:day -= 31 & month += 1
else
!30
if day > 30:day -= 30 & month += 1
end
if day = 0:day = 1
 
 
if week > 7:
:loopweek
set week = week - 7
     if week > 7:
     jump 'loopweek'
     end
 
end
 
if week = 1:Set $week = 'Понедельник'
if week = 2:Set $week = 'Вторник'
if week = 3:Set $week = 'Среда'
if week = 4:Set $week = 'Четверг'
if week = 5:Set $week = 'Пятница'
if week = 6:Set $week = 'Суббота'
if week = 7:Set $week = 'Воскресенье'
 
if month = 0:Set month = 1
if month = 13:Set month = 1&year+=1
If month = 1:set $month = 'Январь'
If month = 2:set $month = 'Февраль'
If month = 3:set $month = 'Март'
If month = 4:set $month = 'Апрель'
If month = 5:set $month = 'Май'
If month = 6:set $month = 'Июнь'
If month = 7:set $month = 'Июль'
If month = 8:set $month = 'Август'
If month = 9:set $month = 'Сентябрь'
If month = 10:set $month = 'Октябрь'
If month = 11:set $month = 'Ноябрь'
If month = 12:set $month = 'Декабрь'
 


 

 время сна
 
для сравнения времени засыпания и пробуждения достаточно использовать часы засыпания пробуждения
если время засыпания < времени пробуждения, то Тпробуждения - Tзасыпания   /*это время сна*/ 
если больше то (24 часа - Т засыпания) + Т пробуждения по будильнику
 
Tсна в секундах*3 = восстановленные силы
 
Если необходимая для полного восстановления бодрость (бодрость макс - энергия при засыпании) > восстановленных сил
то бодрость = энергия при засыпании + восстановленные силы
 
Если меньше, то (макс бодрость - оставшая бодрость)/3 = время сна в секундах необходимое для восстановления
время сна = время засыпания + время необходимое для восстановления (пробуждение до звонка будильника.
 
для расчетов перевести время сна в секунд.. еще раз обдумать уточнить спать хочу, идею потерять нет




Если вы это случайно прочли, то я не волшебник и даже не учусь. У меня есть хобби оно как вязание и оно очень навязчивое. Перед сном я люблю повязать на доступном мне уровне.
Смысл сего я никому объяснять не имею желания и морочить себе голову сложными терминами тоже... поэтому просьба не морочить мне голову...
 
 Макрос `<<silently>>` в Twine 2 SugarCube 2 используется для скрытия вывода других макросов в пассаже. Он полезен, когда вы хотите выполнить некоторые операции, такие как установка переменных или проверка условий, без отображения их на экране. Он требует соответствующего макроса `<<endsilently>>`, чтобы указать конец скрытого блока кода. Например:
 
```twine
<<silently>>
<<set $name to "Иван">>
<<if $age >= 18>>
    <<set $adult to true>>
<</if>>
<</silently>>
Здравствуйте, <<print $name>>. Вы <<if $adult>>взрослый<</if>><<if not $adult>>ребенок<</if>>.
```
 
Этот код не будет показывать ничего, кроме последней строки, которая будет зависеть от значения переменной `$age`. Все макросы внутри `<<silently>>` и `<<endsilently>>` будут выполнены, но не будут видны игроку.
 
Я нашел некоторые полезные ресурсы по Twine 2 SugarCube 2, которые объясняют, как использовать макрос `<<silently>>` и другие макросы:
 
- [Документация SugarCube v2](^1^)
- [SugarCube - Twine Cookbook](^2^)
- [Need help with formatting on display, i.e. removing newline in Twine 2. ...](^3^)
 
Надеюсь, это было полезно для вас. 😊
 
Source: Conversation with Bing, 8/29/2023
(1) SugarCube v2 Documentation - Motoslave.net. https://www.motoslave.net/sugarcube/2/docs/.
(2) silently - Twine Cookbook. http://www.twinery.org/cookbook/twine1/macros/silently.html.
(3) Need help with formatting on display, i.e. removing newline in Twine 2. .... https://twinery.org/questions/42582/help-formatting-display-removing-newline-twine-sugarcube.
https://www.youtube.com/watch?v=hYdEXDx1z58 урок 1. - Урок по Twine и Sugarcube [Ep 1] - Ссылки, введение в HTML.

https://www.youtube.com/watch?v=CHPtjRn6sbQ урок 2. - Урок по Twine и Sugarcube [Ep 2] - Боковая панель, специальные имена, макросы.


Date

Jul. 26th, 2023 03:47 am
 Объект Date в JavaScript позволяет работать с датами и временем, используя различные методы и свойства1. Он может быть полезен для создания игр в Twine 2 Sugarcube 2, которые зависят от реального времени пользователя, например, для отображения текущей даты и времени, для создания таймеров или счетчиков, для проверки условий, связанных с датой или временем, или для генерации случайных событий на основе даты или времени2.
 В Twine 2 Sugarcube 2 макросы widget и connection отличаются тем, что widget позволяет создавать пользовательские макросы, используя TwineScript, а connection позволяет создавать связи между пассажами, используя HTML-атрибуты1. Widget-макросы обычно используются для создания повторяющихся элементов интерфейса, таких как диалоговые окна, кнопки или индикаторы2. Connection-макросы обычно используются для создания нелинейных сюжетов, таких как ветвление, циклы или альтернативные концовки3. Например, вы можете использовать widget для создания макроса <<say>>, который выводит текст в диалоговом окне с изображением персонажа. Вы можете использовать connection для создания макроса <<link>>, который выводит ссылку на другой пассаж с определенным эффектом или действием.
 В Twine с использованием формата SugarCube 2 вы можете использовать макрос `<<back>>` или `<<return>>` для возврата к предыдущему пассажу.
 
Макрос `<<back>>` позволяет игроку вернуться к предыдущему пассажу, отменяя последнее действие. Это означает, что все изменения переменных, сделанные в текущем пассаже, будут отменены.
 
Вот пример использования макроса `<<back>>`:
 
```html
<<back "Назад">>
```
 
Этот код создает ссылку с текстом `"Назад"`, которая позволяет игроку вернуться к предыдущему пассажу, отменяя последнее действие.
 
Макрос `<<return>>` позволяет игроку вернуться к предыдущему пассажу, не отменяя последнее действие. Это означает, что все изменения переменных, сделанные в текущем пассаже, останутся.
 
Вот пример использования макроса `<<return>>`:
 
```html
<<return "Назад">>
```
 
Этот код создает ссылку с текстом `"Назад"`, которая позволяет игроку вернуться к предыдущему пассажу, не отменяя последнее действие.
 
Вы можете выбрать макрос `<<back>>` или `<<return>>` в зависимости от того, хотите ли вы отменить последнее действие при возврате к предыдущему пассажу.
 
Source: Conversation with Bing, 7/3/2023
(1) How to make a player go back to their last visited passage without .... https://bing.com/search?q=Twine+SugarCube+return+to+previous+passage.
(2) [Twine 2.1.3] [Sugarcube 2.18] Returning to previous ... - Twine Forum. https://twinery.org/forum/discussion/8919/twine-2-1-3-sugarcube-2-18-returning-to-previous-passages-without-using-return.
(3) "go to Previous Passage" code? - Twine Forum. https://twinery.org/forum/discussion/2937/go-to-previous-passage-code.
(4) Best Practice for Smart "Return" in SugarCube 2 - Twine Forum. https://twinery.org/forum/discussion/5375/best-practice-for-smart-return-in-sugarcube-2.
(5) Back to previous passage link - Twine Forum. https://twinery.org/forum/discussion/5199/back-to-previous-passage-link.
(6) SugarCube - Twine Cookbook. http://ww.twinery.org/cookbook/passagetransitions/sugarcube/sugarcube_passagetransitions.html.

Да, вы можете использовать квадратные скобки для создания ссылок с макросами `<<back>>` и `<<return>>`. Вот примеры использования квадратных скобок для создания ссылок:
 
```html
[Назад]<<back>>
 
[Назад]<<return>>
```
 
В первом примере мы используем квадратные скобки для создания ссылки с текстом `"Назад"`, которая позволяет игроку вернуться к предыдущему пассажу, отменяя последнее действие. Во втором примере мы используем квадратные скобки для создания ссылки с текстом `"Назад"`, которая позволяет игроку вернуться к предыдущему пассажу, не отменяя последнее действие.
 
Обратите внимание, что макросы `<<back>>` и `<<return>>` должны быть помещены сразу после закрывающей квадратной скобки, без пробелов между ними. Также обратите внимание, что при использовании квадратных скобок текст ссылки не может содержать символы `]` или `[
1.Приложение №1: Использование ключа в вашей игре - https://blocknote.dreamwidth.org/20346.html
Приложение №2: Проверка имени игрока - https://blocknote.dreamwidth.org/20346.html

3. Сделайте вашу игру потрясающей с помощью CSS - https://blocknote.dreamwidth.org/23069.html
3. Сделайте вашу игру потрясающей с помощью CSS


https://www.youtube.com/watch?v=6ZawcwLOLWU

В этом руководстве объясняется, как использовать CSS для изменения внешнего вида вашей игры Twine. Все эти инструкции основаны на формате истории SugarCube. Прежде чем начать, убедитесь, что ваша игра Twine настроена на формат SugarCube. Для этого нажмите на название своей истории в ее основном представлении «карта истории». Выберите «Изменить формат истории» и установите флажок рядом с «SugarCube». (примечание: в последней версии Twine 2 инетрфейс претерпел сильные изменения).
Примечание: это руководство было разработано для моих студентов и предполагает некоторое знакомство с HTML и CSS.
 
Загрузить PDF-версию: Как сделать свою игру на шпагат потрясающей.

Вспоминание основ

Мне нравится в Twine, что он публикуется в стандартных веб-форматах. Он использует HTML для контента,
CSS для презентаций и JavaScript для всего, что связано с программированием. Поскольку он использует эти стандартные форматы, в вашу игру можно играть практически на любом компьютере, телефоне, планшете и т. д.
По умолчанию игры Twine в SugarCube выглядят довольно ужасно. Это побуждает поставить свой собственный визуальный стиль для вашей игры. Хорошие новости: поскольку вы уже немного знаете CSS, это довольно просто.
Чтобы отредактировать CSS истории Twine, нажмите на название своей истории на ее главном экране «карты истории», затем нажмите на «Редактировать таблицу стилей истории». - "Edit Story Stylesheet." Это загрузит экран, который является просто старым (пустым) файлом CSS.
 
Изменение настроек по умолчанию
Поскольку игры Twine представляют собой обычные HTML-файлы, неудивительно, что внешний вид большинства вещей в вашей игре по умолчанию изменяется стилизацией элемента body (элемент самого высокого уровня в HTML «дерево документов».)
Добавление следующего кода, например, изменит цвет фона на белый, сделает значением по умолчанию
цвет темно-серый, изменит шрифт по умолчанию на Futura и сделает размер шрифта по умолчанию немного больше:
body {
 background-color: white;
 color: darkgrey;
 font-family: Futura,Impact,Helvetica,sans-serif;
 font-size: 125%;

Опять же неудивительно, что изменение цвета и поведения ссылок достигается за счет стилизации элемента, HTML-элемента для ссылок:

a {
 color: red;
}
a:hover {
 color: crimson;
 text-decoration: underline;


Изменение внешнего вида отдельных passages

Итак, это меняет настройки по умолчанию для всей игры. Но что, если вы хотите, чтобы конкретный пассаж
имел свой собственный цвет фона или свой особый шрифт?
Опять же, Twine лучший, и он делает это довольно легко. Первое, что вам нужно сделать, это открыть passage, с которым вы хотите сделать что-то особенное. Прямо под названием отрывка есть опция с надписью +tag. Нажмите на нее, чтобы добавить тег по вашему выбору. Например, предположим, что мы хотим добавить тег под названием ""hooray" для определенного счастливого прохождния. Напишите слово ура и нажмите на галочку.
Теперь нам нужно создать набор инструкций для вашего веб-браузера, которым он будет следовать при отображении этого отрывка.
Для этого мы вернемся на страницу "Edit Story Stylesheet" и создадим класс CSS с именем, соответствующим «тегу», который мы вставили выше. В этом случае мы создаем класс с именем hooray (помните, что в CSS перед именами классов должна стоять точка)
.hooray {
 background-color: pink;
 color: cornflowerblue;
 font-size: 200%;
}

Теперь, когда ваш игрок доберется до этого прохода, его встретит розовый фон и большой синий текст.

 Скрытие боковой панели
Если вам не нужна боковая панель, которая есть по умолчанию в играх SugarCube, вы можете легко скрыть ее. Просто введите следующий код в файл CSS вашей истории.
 
#ui-bar { display: none; }

(SugarCube помещает боковую панель в HTML-элемент div с идентификатором ui-bar. Эта инструкция CSS просто говорит вашему браузеру не отображать этот элемент div.)
Поскольку по умолчанию ваша история освобождает место для боковой панели, вы также можете добавить следующий код для стилизации основного элемента вашей истории:

body {
 margin-left: 3.5em;
}


Добавление собственного HTML и его стилизация с помощью CSS

Как видите, Twine сам добавляет основную HTML разметку. Вам не нужно вводить собственный HTML-код для абзацев, например: он вставляет <p> для вас. Но если вам недостаточно такого способа вставки HTML в вашей игре, вы можете ввести свой собственный HTML-код прямо в проход (оно же passage).
Например, можно захотеть создать жуткий эффект, при котором текст исчезает, если пользователь наводит на него указатель мыши. Это можно сделать, вставив свой собственный HTML-элемент div в отрывок Twine и стилизовав его с помощью CSS.
Например, у вас может быть отрывок, в котором говорится следующее:

В небе жуткий НЛО.
<div class="aliens">Когда вы смотрите на него, он исчезает.</div>
Но вы уверены, что он есть.

Затем вы можете добавить несколько строк в файл CSS вашей истории, в котором вы стилизуете класс aliens этого div, чтобы сделать его исчезающим при наведении курсора мыши на элемент.
 
https://www.motoslave.net/sugarcube/2/docs/#macros -ШугарКуб 2

Tweego - Зачем использовать Tweego? Tweego позволяет вам писать проекты Twine, используя ваш любимый текстовый редактор, а не программу Twine . Вы пишете отрывки в виде простых текстовых файлов, используя нотацию Twee , в любом количестве файлов по вашему выбору, что может сделать работу и совместную работу над проектами Twine быстрее и проще. Когда вы будете готовы к публикации или тестированию, вы просто скомпилируете все файлы своего проекта в .htmlфайл с помощью Tweego.
https://www.motoslave.net/tweego/ - скачать

https://www.motoslave.net/tweego/docs/ - как пользоваться Tweego

https://twinery.org/cookbook/introduction/story_formats.html - Twinery cookbook


https://www.youtube.com/watch?v=KAQJQ7VjIk4 пример, плащ судьбы
https://www.adamhammond.com/twineguide/ - пошаговые инструкции. Первые шаги в Twine.

https://github.com/hogart/sugar-cube-utils - куча каких-то макросов для Twine

http://www.motoslave.net/tweego/docs/#twee-notation


Profile

blocknote

September 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324 252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Powered by Dreamwidth Studios