Generi c Конфигурируемая проверка состояния во время выполнения - PullRequest
0 голосов
/ 19 января 2020

Я пишу систему достижений "generi c" для моего проекта MMORPG, она должна быть дружественной и эффективной для моих игровых дизайнеров (без необходимости писать какой-либо код для добавления новых достижений).

Для этого я подумал о решении, которое является базовым c файлом конфигурации, который связан с перечислением «eventType» и предоставляет список необязательных аргументов (основанный на свойствах Event ) Вот пример

name: ACHIEVEMENT_NAME
event_type: ITEM_USAGE # enum as a string, there is a list of event types
count: 30 # 30 item usage
args: # every args are optional
  item_vnum: 1127 # vnum - optional
  map_id: 1 # on map id 1 only - optional
public enum AchievementEventType
{
    ITEM_USED,
    MONSTER_KILLED,
}

public interface IAchievementArgument
{
    AchievementEventType EventType { get;}
}

public class MonsterKilledAchievementArgument : IAchievementArgument
{
    public AchievementEventType EventType => AchievementEventType.MONSTER_KILLED;

    public long MonsterVnum { get; set; }
    public short? MapId { get; set; }
}

public class AchievementConfiguration
{
    public string Name { get; set; }
    public string EventType { get; set; }
    public long Count { get; set; }
    public Dictionary<string, object>? Args { get; set; }
}

public delegate bool AchievementFilter(IAchievementArgument achievementArgument);

Я думал о генерации дерева выражений для построения делегата (AchievementFilter) для моего «инкрементного условия достижения» (в основном, функция, которая проверяет, является ли c счетчик достижений игрока может быть увеличен или нет)

Я подумал, что есть два решения, оба имеют свои плюсы / минусы, но я ищу внешнюю точку зрения, что вы об этом думаете , (или, может быть, другое решение, которое вы могли бы мне представить)

1 дерево выражений на достижение

Я генерирую 1 дерево выражений на достижение, которое сравнивает IAchievementArgument, заданный в качестве параметра, с конфигурация достижения.

  • Плюсы:
    • быстрее во время выполнения (каждое условие достижения имеет своего делегата)
  • Минусы:
    • Объем памяти

1 дерево выражений для каждого типа аргументов

Я генерирую 1 дерево выражений для каждого типа IAchievementArgument, которое будет извлекать и сравнивать конфигурацию достижения одно на один

  • Минусы:
    • Больше времени выполнения (необходимо проверить все равенство ключ / значение в каждой конфигурации достижений)
  • Плюсы:
    • Уменьшенный объем памяти

Заранее спасибо: small_smile:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...