добавление предметов в инвентарь
Mar. 28th, 2024 01:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Для создания множества объектов в инвентаре и отображения их в виде ссылок в пассаже "Инвентарь" можно использовать массив, в котором будут храниться добавленные предметы. Вот пример кода, который демонстрирует этот подход с яблоком, грибочком и кубиком:
логично добавлять предметы в инвентарь внутри ссылки, чтобы игрок мог добавить предмет по своему выбору. Вот пример ссылки для добавления яблока в инвентарь:
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 будет выведено прямо в тексте без использования дополнительных макросов или тегов, что делает код более читаемым и компактным.
В принципе я имею три работающих кода для отображение ссылки в инвентаре, с которыми можно дальше работать. <<=>> интересный макрос в СугарКубе, но какой-то неявный поэтому использую я первый вариант кода.