Я играю в RogueLike и хотел бы сделать логику для каждой сущности модульной. Это, вероятно, может относиться к веб-приложениям, где есть роли и контроль доступа.
Идея состоит в том, чтобы иметь что-то вроде этого - у нас есть разные типы сущностей в игре. дверь можно разбить, а каменную стену не разбить. Скажем, логическим модулем может быть класс с именем Bashable
public interface IBashable
{
bool ProcessRequest(CharacterInfo character);
string GetOutput();
virtual int GetOutcome();
}
Таким образом, дверь с интерфейсом IBashable, добавленным к объекту, может быть разбита. ProcessReques () будет использовать некоторые правила, чтобы определить, удастся ли персонажу это сделать (возможно, проверка силы).
Объект без интерфейса IBashable нельзя открыть открытым. Проблема в том, что к двери добавлено несколько логических компонентов. То, что я хотел бы сделать, это отправить запрос, как это.
// Conan is derived from CharacterInfo class
BashDoorRequest request = new BashDoorRequest(conan);
Door d;
BashLogic bash;
PickLockLogic pick;
d.addLogic(bash);
d.addLogic(pick);
// Assuming the signature is processRequest(IRequest, where all request derived from)
d.processRequest(request)
Вопрос - как добавить getmodules для активации? Это BashDoorRequest, а не PickLockRequest, поэтому будет работать только логика bash door.
У меня два размышления - одно - использовать шаблон посетителя, но это означает, что добавлено довольно много классов. Другой - иметь тег или идентификатор для каждого модуля досягаемости и действия. Например, логика bash может иметь тег «bash». Может быть, у меня есть две логики bash - одна позволяет игрокам взламывать дверь, а другая может быть, что уменьшает HP любого, кто бьет дверь, потому что она имеет шипы.
Таким образом, я должен активировать два логических модуля для блокировки, и логика блокировки блокировки не должна работать. Должен ли я иметь хэшамп тегов, и каждая ли логика должна быть сгруппирована в соответствии с has?
Это также относится к местности; скажем, персонажи не могут двигаться сквозь воду. Водный объект имеет только ICannotWalk через добавленную логику, но имеет добавленную ISwimmable логику. Так как же проверить только модуль ICannotWalk, не теряя времени на проверку логики ISwimmable?
Другая проблема, с которой я сталкиваюсь, заключается в том, что объект запроса может принимать более одного параметра, но передача хеш-таблицы для представления параметров кажется мне излишним. Не говоря уже о том, что некоторые логические модули могут принимать разные параметры. (Например, дверь заперта, и для ее открытия требуется специальный ключ. Запрос на это будет включать и инвентарь персонажа, а не информацию о нем. Если я не передам весь инвентарь, характеристики персонажа и все остальное в Запрос.
Будут приветствоваться любые идеи по внедрению этой системы!