РЕДАКТИРОВАТЬ: Если вы не можете потрудиться, чтобы прочитать этот мамонтовый вопрос, я поставил сводку внизу.
В настоящее время я работаю над своего рода "фреймворком" для текстового приключения, которое я собираюсь сделать на С#, как упражнение для кодирования. В этом контексте возможные действия определяются классом "Взаимодействие".
Потенциальными "действующими" объектами являются Предметы инвентаря (палка, пистолет, меч), предметы окружающей среды (стена, дверь, окно) и персонажи (люди, животные). Каждое из них имеет свойство, которое является списком взаимодействий. В настоящий момент взаимодействие является в основном парой значений имени "действие/ответ". Когда вы вводите "разбитое окно", он просматривает все возможные элементы действия, доступные игроку, и соответствует теме (в данном случае "Окно" ). Затем выясняется, что действие "Smash" и поиск в списке взаимодействий в окне (элемент окружающей среды), чтобы получить ответ для действия Smash и затем записать его на консоль.
Это все сделано, но вот точка, в которой я застрял:
Действие имеет любое количество потенциальных последствий, которое отличается каждым потенциальным взаимодействием. Это:
- возвращает ответ, описывающий результат действия, просматривая его при взаимодействии, возможно, со вторым субъектом
ЯВНО - Предмет действия (элемент инвентаря, элемент окружающей среды или символ) изменяет его описание НАПРИМЕР. "Стена пунша" может изменить описание стены, чтобы описать вмятину в стене ИЛИ - субъект действия заменяется другим пунктом НАПРИМЕР. "Разбитая бутылка" приводит к тому, что "бутылка" меняется на "сломанную бутылку" или "убивает Джона", приводит к замене персонажа Джоном на предмет окружающей среды "Джон труп".
- возвращает ответ, описывающий предыдущее изменение НАПРИМЕР. "Сломанные кусочки бутылки разбросаны по полу".
- Изменено описание области. НАПРИМЕР. "smash lightbulb" приводит к тому, что описание комнаты меняется, чтобы описать черный черный номер.
- Элементы добавляются/удаляются из инвентаря или среды НАПРИМЕР. "забрать бутылку". Теперь у вас есть бутылка в инвентаре, и бутылка удаляется из окружающей среды.
- Указаны направления движения и области, которые они приводят к изменению НАПРИМЕР. "открыть дверь с ключом" позволяет перемещать Восток в другую комнату.
- Игрок перемещается в новую область НАПРИМЕР. "идите на север" приведет вас в другую область.
Мне нужно каким-то образом определить в общих чертах, какой из этих последствий должен вызвать конкретное взаимодействие, и вызывать их. Действие может потенциально использовать ряд этих последствий или только один.
Например, если элемент является "Бутылкой":
" заполнить бутылку водой" сначала вернет ответ, описывающий, что вы наполнили бутылку водой. Затем он заменил бы "бутылочный" предмет "бутылкой воды". Это два следствия, возвращающие ответ и заменяющий элемент.
Скажите, что вы должны были сделать " бросить бутылку воды в окно". Это сложнее. Сначала он вернет ответ, описывающий события, которые произойдут, бутылка и окно будут как разбить, так и вода будет везде. Бутылка будет удалена из инвентаря Игрока. Затем " бутылка воды" будет заменена "сломанной бутылкой", а "окно" будет заменено словом "Сломанное окно". Описание области также изменится, чтобы отразить это. Это пять последствий, возврат ответа, удаление элемента из инвентаря, замена двух элементов и обновление описания текущей области.
Как вы можете видеть, мне нужен общий способ определения на основе "взаимодействия", каковы будут последствия этого действия и какие другие объекты, такие как Item, Player (для инвентаря) и Area соответственно.
Прошу прощения, если это неясно, и я сделаю все возможное, чтобы выяснить, есть ли у кого-либо вопросы.
РЕДАКТИРОВАТЬ: Есть ли способ определить метод во взаимодействии, чтобы я мог передать несколько методов для вызова (и их параметров)? Первоначальный ответ, возвращаемый, будет значением по умолчанию, обязательным последствием, и тогда могут быть дополнительные, если они указаны.
Например, в приведенных выше примерах, для первого взаимодействия, "заполнить водой", я бы сказал ему вернуть ответ ( "Вы наполнили бутылку водой" ), а также вызвать метод ReplaceItem, который замените "бутылочную" тему "бутылкой воды".
Для второго взаимодействия я бы сказал, чтобы вернуть ответ ( "Бутылка проносится по воздуху в..." ), вызовите RemoveFromInventory на предмет действия, вызовите UpdateStatus на бутылке ( "бутылка разбита" ) и окно ( "окно разбито" ) и вызовите UpdateAreaDescription, чтобы изменить текущее описание области ( "Вы стоите в комнате с одним окном, стекло разбивается на куски" ).
Звучит ли это так? Я стараюсь держать это как можно более общим, ради всех возможных возможных взаимодействий.
РЕДАКТИРОВАТЬ 2: Чтобы прояснить далее и попытаться обобщить проблему:
В моей игре есть Actionable объекты (бутылка, стена, Джон). Каждый объект Actionable имеет список Объекты взаимодействия, которые описывают, как игрок может взаимодействовать с ними. В настоящий момент взаимодействие имеет Свойство "Имя" ( "throw", "hit", "break" ) и возвращает Response ( "Вы бросаете" ).
Проблема, которую я пытаюсь решить, заключается в том, что взаимодействие также должно выполнять ряд других вещей, варьируя по каждому конкретному взаимодействию. Возьмем пример стеклянной бутылки.
"бросать стеклянную бутылку"
- Ответ возвращается ( "Ты бросил стеклянную бутылку" )
- "Бутылка" удаляется из инвентаря Игрока.
- Он заменяется новым, чтобы отразить изменение. ( "Бутылка" заменена "Сломанной бутылкой" ).
- Второй ответ возвращается ( "Кусочки стеклянной бутылки разбросаны по полу" ).
"бросать стеклянную бутылку в окно"
- Ответ возвращается ( "Ты бросил стеклянную бутылку в окно" )
- Объект "Бутылка" удаляется из инвентаря Игрока.
- Объект заменяется новым объектом, отражающим изменение. ( "Бутылка" заменена "Сломанной бутылкой" ).
- Второй, необязательный объект заменяется новым, чтобы отразить изменение. ( "Окно" заменено словом "Сломанное окно" ).
- Обновлено свойство "Описание" текущей области. ( "Ты стоишь в комнате с одним разбитым окном" ).
Когда я создаю взаимодействия, как я могу изменить дополнительные действия, которые они выполняют, например, изменения статуса для субъекта или изменения текущего описания области?
Если вам нужно больше примеров действий, как указано выше, дайте мне знать, и я сделаю еще несколько.