Что делать с контейнерами объекта, который может быть в нескольких экземплярах?
Есть объект "Река", который находится ("протекает") в нескольких локациях (этот пример мы обсуждали с Чеширом на канале #ifrus). Почему есть смысл сделать реку одним объектом? Да чтобы модули ("осмотреть", "посмотреться", "попить", "набрать воды") не дублировать — надо всего лишь один раз прописать взаимодействие с одним объектом "Река". Однако тут есть нюанс — а что, если нужно что-то положить в реку?
Можно реализовать это так — при перемещении каких-нибудь объектов в "Реку" на самом деле размещать их в специально выделенном для этой цели контейнере "ДноРеки", но принадлежащем не объекту "Река", а текущей локации:
GS 'ДобавитьВзаимодействие', 'Пистолет', 'Река', 'Бросить пистолет в реку', $ico['положить'], { Result = IIF(func('Местонахождение', ИГРОК, $ОБЪЕКТ1, '$ЛОКАЦИЯ:ДноРеки'), Пропускать, Использовать) }, 0, { if func('Переместить', ИГРОК, $ОБЪЕКТ1, 0, '$ЛОКАЦИЯ:ДноРеки') = Продолжить: GS 'ТекстНаЭкран', 'п. Вы бросили ((пистолет|$ОБЪЕКТ1)) в ((реку|$ОБЪЕКТ2)).' end }
При попытке взаимодействия "Пистолета" и "Реки" (при условии, что Пистолет уже не находится в контейнере "ДноРеки" текущей локации) "Пистолет" перемещается в контейнер "ДноРеки" текущей локации.
Соответственно, при выполнении осмотра дна "Реки" (что-то типа действия "Пошарить по дну реки") нужно просто дополнительно вывести содержимое контейнера "ДноРеки" текущей локации.
Наверное, стоит пока остановиться на этом обходном манёвре…
Неактивен
Из-за введения понятия "Экземпляр объекта" (Объект + Местонахождение — пока это значит именно это) пришлось переделать большую часть модулей. Однако результатом доволен.
Неактивен
Кстати, раз уж последнее, что я переделывал — это обработчик "ПриОпределенииМестонахождения", то расскажу немного о нём.
Обработчик "ПриОпределенииМестонахождения" относится к системным обработчикам, то есть вызывается фреймворком автоматически при отработке тех или иных ситуаций, связанных с определением местонахождения объекта.
Синтаксис обработчика пока следующий:
GS 'ПриОпределенииМестонахождения', <Инициатор>, <Объект>, <Местонахождение>, <Модуль>
Инициатор — кто определяет местонахождение.
Объект — местонахождение чего определяется.
Местонахождение — где именно определяется местонахождение объекта.
Вызов данного обработчика происходит во всех возможных комбинациях параметров, включая пустые, что позволяет обрабатывать такие ситуации, как, например, определение игроком (Инициатор="ИГРОК") местонахождения чего угодно (Объект=0) в локации "Зал" (Местонахождение="Зал").
Попробую проиллюстрировать как задаётся и используется данный обработчик на примере. Допустим, игрок должен вынести из помещения статуэтку. На выходе стоит сканер, который срабатывает в случае, если обнаруживает что-нибудь у игрока при выходе из помещения. Однако, если у сканера отключить питание, то ничего обнаруживать он не должен. В этом случае как раз и пригодится обработчик "ПриОпределенииМестонахождения":
GS 'ПриОпределенииМестонахождения', 'Сканер', 0, ИГРОК, { if func('Свойство', 0, 'Сканер', 'Питание'): ARGS['Результат']=ДА else ARGS['Результат']=НЕТ end }
Данный обработчик вызывается при определении объектом "Сканер" наличия какого угодно объекта у текущего персонажа. Если свойство "Питание" объекта "Сканер" в этот момент равно 0, то в результате определения местонахождения вернётся НЕТ вне зависимости от наличия искомого объекта у персонажа "Игрок".
Неактивен
Столкнулся с явлением перехода количества в качество: регулярность возникновения некоторых проблем перевела их из категории исключений в категорию "нереализованного общего подхода". Пришлось кое-что переписать, в том числе и модуль контейнеров. И параллельно нашлось, над чем подумать…
В общем, у меня у любого объекта (локация, персонаж, предмет) может быть произвольное число контейнеров. Само-собой, объекты можно размещать в контейнерах (локации нельзя, но это искусственное ограничение). Так вот, если запихнуть игрока в контейнер какого-либо предмета, то что тогда выводить в качестве описания "локации"? Самое простое — ограничить размещение персонажей только контейнерами локаций — в этом случае можно просто выводить соответствующий вариант описания (у варианта описания прописать условие, что оно выводится, только если персонаж находится в таком-то контейнере)…
Неактивен
Хм… Иногда моя работа над Адским Движком™ напоминает мне это:
Неактивен
Olegus t.Gl. написал:
Хм… Иногда моя работа над Адским Движком™ напоминает мне это:
Не, ну ты сам того добился.
Делал бы себе игру и движок молча... Теперь терпи.
Неактивен
fireton написал:
Не, ну ты сам того добился.
Делал бы себе игру и движок молча... Теперь терпи.
Да я как-то не жалуюсь. Даже наоборот.
Неактивен
Хм… Сколько останется, если из "Бесконечности" вычесть "Всё что есть"?
Неактивен
Раз у нас такие лингвистические шутники водятся, то я, пожалуй, переименую константу "ЧЛ" ("ЧисЛо"), обозначающую числовой тип аргумента, в "ЧС".
Неактивен
В правильном ролике "Алфавит по хардкору", глаз зацепился за кадр с буквой Q, из чего родилось настроение логотипа для Адского движка:
Неактивен
А между тем работа, хоть и медленно, но идёт.
Кстати, сегодня ввиду плохого самочувствия и настроения пришла мысль, как сделать синтаксис команд Адского движка ещё кошмарнее:
Например, команда добавления действия с объектом:
GS 'УстановитьДействие', <Объект>, <Название пункта меню>, <Иконка>, <Условие>, <Обработчик>, <Модуль>
Её можно записать так (текущий работающий вариант):
GS 'УстановитьДействие', 'Портсигар', 'Осмотреть/Осмотреть портсигар', 'осмотреть', '', '', { GS 'ОписаниеНаЭкран', 'Портсигар' }
а если порядок аргументов забыли (как я сегодня), то можно ведь сделать и так:
GS 'УстановитьДействие', $ПС + ' Объект: Портсигар ПунктМеню: Осмотреть Действие: Осмотреть портсигар Иконка: осмотреть Модуль: " GS 'ОписаниеНаЭкран', 'Портсигар' " '
$ПС в данном случае — это просто системный префикс, чтобы отловить такой вот изврат.
Что это добавляет кроме монументальности? Хороший вопрос!.. Наверное, в основном возможность произвольного расположения параметров и пропуска ненужных. Кроме того легче добавлять множество различных параметров, которые вроде как особо не нужны, но если их указать, то в некоторых случаях они могут изрядно сократить код.
Для альтернативно одарённых: советовать мне переходить на INSTEAD не надо.
Неактивен
В своё время мою идею маскировать ссылки на объекты в тексте (делая их тем же цветом, что и текст) подвергли критике, хотя были и те, кто эту идею поддержал.
Однако, добавление в описание объектов только для антуража делает текст слишком "пёстрым". Так может для подобных объектов добавить свойство "Не выделять ссылку", при установке которого ссылка на этот объект и будет маскироваться под обычный текст?
P.S. Хотя со временем, идея маскировать ссылки мне кажется всё более привлекательной.
Неактивен
Идея делать ссылки невидимыми имеет интересный эффект. В первых версиях INSTEAD ссылки как раз были не видимыми, но курсор при наведении менял свою форму. Идея была в том, чтобы максимально приблизить игровой процесс к парсеру. Грубо говоря, предотвратить бездумное прохождение по рельсам ( что еще ярче выражено в CYOA играх). Игровой процесс еще больше похож на исследование (что я в основном и ценю в IF-играх).
Лично мне результат очень нравился , но большинство людей выбрали ссылки, это делает игge более казуальной. В итоге я поддался, и кот уже был на видимых ссылках.
Но лично мне нравится идея. Правда при ее реализации желательно увеличить количество ссылок до состояния, когда КАЖДОЕ слово, обозначающее один предмет, можно кликнуть, а не только в определенном предложении. При выполнении такого условия игра становится честнее и менее напрягающей.
Неактивен
Ну так я с этой идеи — максимально маскировать ссылки — и начинал, потому как основная цель была в достижении как раз того эффекта, который ты описываешь. Так что потестирую, пожалуй, ещё. Или выведу маскировку ссылок в настройки — типа как уровень сложности.
Неактивен
Как вариант — делать текст и ссылки одного цвета, но разных тонов. Например, текст серым, а ссылки чёрным. «Пёстрота» текста уменьшается значительно, ссылки при этом остаются различимыми (при должном усердии).
Впрочем, такое автору можно уже и сейчас делать.
Отредактировано Cheshire (04.11.2011 09:28)
Неактивен
WladySpb написал:
Я обычно так и делаю, на мой взгляд самая удобная реализация ссылок. В один цвет нежелательно - начинается пиксельхантинг
Я думал насчёт пиксельхантинга. В принципе сравнение тут не особо корректное — изменение курсора над ссылкой и ограниченный размер текста делают процесс не столь утомительным. Зато потенциально возможна как раз та отдача, о которой упоминал gloomy.
Неактивен
Офигенная тема, хочу обсудить, но сообщение не скрывается :-(
По-моему, идея скрывать ссылки в играх плоха по трём причинам.
Во-первых, её труднее объяснить.
Во-вторых, на планшетах и телефонах такого события, как наведение курсора мыши, вообще не существует.
В-третьих, в чём должен заключаться сам процесс игры? Вот вывалилось на игрока два экрана текста. Либо он внимательно прочитает, пролистает, затем проверит мышкой каждое слово, затем начнёт думать, либо просто внимательно прочитает и начнёт думать. Зачем мешать ему думать над игрой, заставляя проверять каждое слово на двойное дно?
Отредактировано Oreolek (04.11.2011 11:37)
Неактивен
Oreolek написал:
Во-вторых, на планшетах и телефонах такого события, как наведение курсора мыши, вообще не существует.
В-третьих, в чём должен заключаться сам процесс игры? Вот вывалилось на игрока два экрана текста. Либо он внимательно прочитает, пролистает, затем проверит мышкой каждое слово, затем начнёт думать, либо просто внимательно прочитает и начнёт думать. Зачем мешать ему думать над игрой, заставляя проверять каждое слово на двойное дно?
Насчёт планшетов и телефонов — резонно.
А зачем вываливать на игрока два экрана текста в самом игровом процессе (т.е. не во вступлении или текстовых вставках, а именно в описании локаций, объектов и т.п.)? Это пагубная привычка.
Неактивен
Мне очень нравится идея подсветки всех существительных в тексте с последующим интерактивом. Две трудности:
1. Дофига работы над описанием. Но это решаемо.
2. Удобная разметка текста. При достаточной насыщенности текста существительными код игры быстро превратится в нечитаемый треш. Тут простого решения нет. Либо идём путём инстеда и собираем описание из кусочков, либо надо как-то извращаться.
Неактивен
А зачем вываливать на игрока два экрана текста в самом игровом процессе (т.е. не во вступлении или текстовых вставках, а именно в описании локаций, объектов и т.п.)? Это пагубная привычка.
Объекты могут очень красиво выглядеть... или экран может быть маленьким.
Неактивен
Хороший пример реализации - игра "Цветохимия (Ajenta; QSP), в которой предусмотрено два режима сложности. На одном ссылки подсвечены, на другом, соответственно, скрыты.
Ссылка на игру: http://qsp.su/index.php?option=com_sobi … p;Itemid=0
Отредактировано Серый Волк (08.11.2011 16:40)
Неактивен
Что-то совсем забросил тему, хотя работа некоторое время назад возобновилась.
Поскольку текст у меня идёт сплошняком (textflow — модное слово!), добавил автоматический вывод на экран маркера, который помечает с какого места появился новый текст для игрока. Выглядит это примерно так:
Вот та чёткая пунктирная линия — и есть чёткий такой маркер. Само собой, при появлении новой порции текста старый маркер исчезает.
Пока проверяю на себе — очень удобно.
Неактивен
Да, и пришлось обломаться с порционным выводом текста. То есть была задумка добавить в функцию вывода текста:
…ТекстНаЭкран, 'Привет мир!'
тег "<-далее->", чтобы команда:
…ТекстНаЭкран, 'Привет мир!<-далее->Я всех ненавижу!'
выводила сначала "Привет мир!", а потом (после нажатия на пробел или маленькую ссылочку "продолжить") — "Я всех ненавижу!". Это позволило бы нагнетать атмосферу и выводить неожиданные обороты. Драматическая пауза на заданное время — это выход, но я не люблю решения с фиксированными паузами (и недолюбливаю людей, которые этим приёмом злоупотребляют). Поэтому отложил это до лучших времён.
P.S. Почему не получилось? Потому что в QSP-Classic невозможно остановить выполнение кода в отдельной точке (если это не input или msg, конечно же), подождать действия игрока, а потом продолжить далее.
Неактивен