РЕДАКТИРОВАТЬ: Если вы не можете прочитать этот гигантский вопрос, я поместил резюме внизу.
В настоящее время я работаю над своего рода "структурой" для текстового приключения, которое я собираюсь сделать в C #, в качестве упражнения по кодированию. В этой структуре возможные действия определяются классом «Взаимодействие».
Потенциальными «Действующими» объектами являются Инвентарные предметы (палка, пистолет, меч), Предметы окружающей среды (стена, дверь, окно) и Персонажи (люди, животные). У каждого из них есть свойство, представляющее собой список взаимодействий. На данный момент Interaction - это, по сути, пара имя-значение «действие / ответ». Когда вы набираете «разбить окно», он просматривает все возможные элементы, которые могут быть активны, которые есть у игрока, и соответствует теме (в данном случае «Окно»). Затем выясняется, что это действие «Smash», и ищет в списке взаимодействий в окне (элемент среды) ответ на действие «Smash», а затем записывает его в консоль.
Это все сделано, но вот что я застрял:
Действие имеет любое количество потенциальных последствий, которые отличаются в зависимости от каждого потенциального взаимодействия. Это:
- Возвращает ответ, описывающий результат действия, путем поиска его во взаимодействии, возможно со вторым субъектом
ЯВНО
- субъект действия (предмет инвентаря, предмет окружающей среды или персонаж) меняет свое описание
НАПРИМЕР. «пробивая стена» может изменить описание стены, чтобы описать вмятину в стене
OR
- Предмет действия заменяется другим предметом
НАПРИМЕР. «разбить бутылку» приводит к замене «бутылки» на «разбитую бутылку» или «убить Джона», в результате чего персонажа Джона заменяет предмет окружающей среды «Труп Джона».
- возвращает ответ, описывающий предыдущее изменение
НАПРИМЕР. «Разбитые кусочки бутылки разбросаны по полу.»
- Описание области изменено.
НАПРИМЕР. "разбить лампочку" приводит к изменению описания комнаты, чтобы описать черную комнату
- Предметы добавляются / удаляются из инвентаря или окружающей среды
НАПРИМЕР. "забрать бутылку". Теперь у вас есть бутылка в вашем инвентаре, и бутылка удалена из окружающей среды.
- Изменены доступные для движения направления и области, к которым они ведут
НАПРИМЕР. «открыть дверь ключом» позволяет перейти на восток в другую комнату
- игрок перемещен в новую область
НАПРИМЕР. «идти на север» перенесет вас в другой район.
Мне нужно как-то в общем определить, какое из этих последствий должно вызывать конкретное взаимодействие, и вызывать их. Действие может потенциально использовать несколько из этих последствий или только одно.
Например, если предметом является Бутылка:
« заполнить бутылку водой » сначала выдаст ответ, описывающий, что вы наполнили бутылку водой. Затем он заменяет элемент «бутылка» на элемент «бутылка воды».
Это два последствия: возвращение ответа и замена элемента.
Скажем, вы тогда должны были сделать " бросить бутылку воды в окно ". Это сложнее. Сначала будет возвращен ответ, описывающий происходящие события, бутылка и окно будут и разбиты, и вода пойдет повсюду. Бутылка будет удалена из инвентаря Игрока.
Затем «1059 * бутылка воды » будет заменена «разбитой бутылкой», а «Окно» будет заменено «Разбитым окном». Описание области также изменится, чтобы отразить это.
Это пять последствий: возврат ответа, удаление предмета из инвентаря, замена двух предметов и обновление описания текущей области.
Как вы можете видеть, мне нужен общий способ, позволяющий определить для каждого «взаимодействия», каковы будут последствия этого действия, и соответствующим образом обновить другие объекты, такие как Предмет, Игрок (для инвентаря) и Область..
Извините, если это неясно, и я сделаю все возможное, чтобы уточнить, есть ли у кого-либо вопросы.
РЕДАКТИРОВАТЬ: Есть ли способ для меняопределить метод взаимодействия, в который я могу передать несколько методов (и их параметры) для вызова?Первоначальный возвращенный ответ будет обязательным последствием по умолчанию, а затем могут быть дополнительные, если он указан.
Например, в приведенных выше примерах для первого взаимодействия «заполнить водой», я бы сказал,чтобы вернуть ответ («Вы наполнили бутылку водой»), а также вызвать метод ReplaceItem, который заменит субъект «бутылки» на «бутылку воды».
Для второго взаимодействия ясказал бы ему вернуть ответ («Бутылка летит по воздуху в ...»), вызвать RemoveFromInventory на предмет действия, вызвать UpdateStatus для бутылки («бутылка разбита») и окно («theокно разбито ») и вызовите UpdateAreaDescription, чтобы изменить описание текущей области (« Вы стоите в комнате с одним окном, стекло разбито на куски »).
Это звучит выполнимо?Я стараюсь сделать это как можно более универсальным, ради всевозможных взаимодействий.
РЕДАКТИРОВАТЬ 2: Чтобы прояснить дальше и попытаться суммировать проблему:
В моей игре есть объекты Actionable (бутылка, стена, Джон).Каждый объект Actionable имеет список объектов Interaction, которые описывают, как игрок может взаимодействовать с ними.На данный момент Interaction имеет свойство «Имя» («throw», «hit», «break») и возвращает ответ («You throw the»).
Проблема, которую я пытаюсь решитьРешимость заключается в том, что Взаимодействию также необходимо выполнять ряд других действий, которые зависят от конкретного Взаимодействия.Давайте возьмем пример стеклянной бутылки.
«бросить стеклянную бутылку»
- Ответ получен («Вы бросили стеклянную бутылку».)
- The »Бутылка ", удаляется из инвентаря Игрока.
- Заменяется новым, чтобы отразить изменение.(«Бутылка» заменена на «Разбитая бутылка»).
- возвращается второй ответ («Кусочки стеклянной бутылки разбросаны по полу»).
«бросить стеклянную бутылку в окно»
- ответ получен («Вы бросили стеклянную бутылку в окно»)убирается из инвентаря игрока.
- Объект заменяется новым объектом для отражения изменений.(«Бутылка» заменена на «Разбитая бутылка»).
- Второй необязательный объект заменяется новым, чтобы отразить изменение.(«Окно» заменено на «Разбитое окно»).
- Свойство «Описание» текущей области обновлено.(«Вы стоите в комнате с одним разбитым окном»).
Когда я создаю взаимодействия, как я могу варьировать дополнительные действия, которые они выполняют, такие как изменение статуса субъекта или изменения в описании текущей области?
Если вам нужно больше примерово действиях, как указано выше, дайте мне знать, и я сделаю еще несколько.