Внедрение системы CVAR

Я хотел бы реализовать то, что я знаю как систему CVAR, я не совсем уверен в ее официальном названии (если есть

По сути, это система, используемая в некоторых программах и видеоиграх, где пользователь может развернуть консоль и ввести команду, например «переменная 500», чтобы установить эту переменную на 500. Примеры этого можно найти в любая игра Half-Life, Doom и Quake и многое другое. Общая идея, похоже, состоит в том, чтобы скрыть базовую архитектуру, но все же разрешить защищенный доступ, например, можно просмотреть значение, скажем, силы тяжести, но не изменить его. Некоторые из этих значений также могут быть функциями, например, пользователь может иметь возможность ввести «создать», чтобы создать тип врага в своем местоположении или в другом указанном месте.

Просмотр Half Life 2 SDK и из что я помню о GoldSrc SDK, похоже, что они, по крайней мере, реализовали своего рода «пометку», когда определенные команды будут работать только при определенных условиях, например, если было установлено другое значение или если у пользователя есть некоторый уровень разрешений.

Моя первоначальная мысль заключалась в том, чтобы создать словарь или объект, подобный этому, и использовать его для привязки строковых значений к делегатам функций, а также для поддержания определенного уровня «защиты», чтобы ограничить использование определенных команд. Однако, это кажется довольно громоздким, так как я считаю, что мне придется вручную добавить новую запись для каждого значения или функции, которые я хотел реализовать. Я также не знаю, даст ли это мне тот уровень контроля, который я ищу.

Я считаю, что в идеале мне нужен был бы системный класс CVAR, а также функция Register, которая может принять это, скажем, делегат переменной / функции, строка для доступа к ней и любой уровень защиты, который мне нужен. Таким образом, я могу добавить то, что мне нужно, как я их вижу, так что все по-прежнему находится в связанных классах и файлах.

Я действительно просто ищу здесь несколько идей, поэтому мои вопросы:

  • Кто-нибудь когда-либо делал что-то подобное раньше, и если да, то как?
  • Сработает ли моя реализация? (Теоретически, если нет, Можете ли вы придумать лучший способ?)
  • Если кто-то более осведомлен о том, как это работает в одном из ранее упомянутых заголовков, не могли бы вы немного подробнее рассказать об этом? Кажется, трудно найти документацию по ним.

На самом деле я ищу не конкретный код, а скорее структурирование дизайна. И это не обязательно должно быть «коммерческим» или работать как другое, мне просто нужно что-то, чтобы заставить меня двигаться.

8
задан shmeeps 3 March 2011 в 22:31
поделиться