РЕДАКТИРОВАТЬ: Если вам не хочется читать этот гигантский вопрос, я поместите резюме внизу.
I ' m в настоящее время работает над своего рода «фреймворком» для текстового приключения, которое я собираюсь сделать на C # в качестве упражнения по кодированию. В этой структуре возможные действия определяются классом «Взаимодействие».
Потенциальными «активными» объектами являются предметы инвентаря (палка, пистолет, меч), предметы окружающей среды (стена, дверь, окно) и персонажи (люди, животные ). У каждого из них есть свойство, которое представляет собой список взаимодействий. На данный момент взаимодействие - это, по сути, пара значений имени «действие / ответ». Когда вы набираете «разбить окно», он просматривает все возможные действия, которые есть у игрока, и соответствует теме (в данном случае «Окно»). Затем выясняется, что действие - "Smash". и просматривает список взаимодействий в окне (элемент среды), чтобы получить ответ на действие Smash, а затем записывает его в консоль.
Это все сделано, но вот в чем я застрял:
Действие имеет любое количество потенциальных последствий, которые различаются для каждого потенциального взаимодействия. Это:
- возвращает ответ, описывающий результат действия, просматривая его при взаимодействии, возможно, со вторым субъектом
ЛИБО - субъект действия (предмет инвентаря, предмет окружающей среды или персонаж ) меняет описание НАПРИМЕР. "пробить стену" может изменить описание стены, чтобы описать вмятину в стене ИЛИ - объект действия заменяется другим элементом НАПРИМЕР. «разбить бутылку» приводит к изменению «бутылки» на «разбитую бутылку» или «убить Джона» приводит к замене персонажа Джона на предмет окружающей среды «труп Джона».
- возвращает ответ, описывающий предыдущее изменение НАПРИМЕР. «Осколки бутылки разбросаны по полу»
- Описание области изменено. НАПРИМЕР. "разбить лампочку" приводит к тому, что описание комнаты меняется, чтобы описать черную как смоль комнату
- Предметы добавляются / удаляются из инвентаря или окружающей среды НАПРИМЕР. "забрать бутылку". Теперь у вас есть бутылка в вашем инвентаре, и бутылка удалена из окружающей среды.
- Направления, доступные для движения, и области, к которым они ведут, изменены НАПРИМЕР. «открыть дверь ключом» позволяет вам переместиться на восток в другую комнату
- Игрок перемещается в новую область НАПРИМЕР. «иди на север» перенесет вас в другую область.
Мне нужно каким-то образом в общем виде определить, какие из этих последствий должно вызывать конкретное Взаимодействие, и вызвать их. Действие потенциально может иметь несколько из этих последствий или только одно.
Например, если предметом является Бутылка:
« наполнить бутылку водой » сначала вернет ответ, описывающий это вы наполнили бутылку водой. Затем он заменит предмет "бутылка" предметом "бутылка воды". Это два последствия: возврат ответа и замена элемента.
Допустим, вы должны были сделать « бросить бутылку воды в окно ». Это более сложно. Сначала он возвращал ответ, описывающий происходящие события: бутылка и окно разобьются, и вода разнесется повсюду. Бутылка будет удалена из инвентаря игрока. Затем « бутылка с водой » будет заменена «разбитой бутылкой», а «Окно» будет заменено на «Разбитое окно». Описание области также изменится, чтобы отразить это. Это пять последствий: возврат ответа, удаление предмета из инвентаря, замена двух предметов и обновление описания текущей области.
Как вы можете видеть, мне нужен общий способ определения для каждого взаимодействия ", каковы будут последствия этого действия, и соответствующим образом обновить другие объекты, такие как Предмет, Игрок (для инвентаря) и Область.
Извините, если это неясно, и я сделаю все возможное, чтобы уточнить, есть ли кто-нибудь есть какие-либо вопросы.
РЕДАКТИРОВАТЬ: Есть ли способ определить метод для взаимодействия, которому я могу передать ряд методов для вызова (и их параметров)? Первоначальный возвращенный ответ будет обязательным последствием по умолчанию, а затем могут быть дополнительные, если они указаны.
Например, в приведенных выше примерах для первого взаимодействия " Чтобы прояснить ситуацию и попытаться резюмировать проблему:
В моей игре есть объекты, требующие действий (бутылка, стена, Джон). У каждого объекта Actionable есть список Объекты взаимодействия, которые описывают, как игрок может с ними взаимодействовать. На данный момент у Взаимодействия есть Свойство "Name" ("throw", "hit", "break") и возвращает Response ("You throw the").
Проблема, которую я пытаюсь решить, заключается в том, что взаимодействие также должно выполнять число других вещей, различных каждым конкретным взаимодействием. Возьмем пример стеклянной бутылки.
«бросить стеклянную бутылку»
- возвращается ответ («Вы бросили стеклянную бутылку».)
- «Бутылка» удалена из инвентаря игрока.
- Заменяется на новый, чтобы отразить изменение. («Бутылка» заменена на «Разбитая бутылка»).
- Возвращается второй ответ («Осколки стеклянной бутылки рассыпаны по полу»).
«бросить стеклянную бутылку в окно»
- возвращается ответ («Вы бросили стеклянную бутылку в окно».)
- Объект «Бутылка» удален из инвентаря Игрока.
- Объект заменяется новым объектом, чтобы отразить изменение. («Бутылка» заменена на «Разбитая бутылка»).
- Второй необязательный объект заменяется новым, чтобы отразить изменение. («Окно» заменено на «Разбитое окно»).
- Свойство «Описание» текущей области обновлено. («Вы стоите в комнате с единственным разбитым окном».)
Когда я создаю взаимодействия, как я могу изменять дополнительные действия, которые они выполняют, например, изменение статуса? к теме, или изменения в текущем описании Области?
Если вам нужно больше примеров действий, как указано выше, дайте мне знать, и я сделаю еще несколько.