Я пишу систему достижений "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: