Как организовать подсчет итоговых параметров персонажа из экипировки в RPG?
Возможно ли создать метод, автоматически ищущий поле класса по имени этого поля. Делаю RPG. Пример: персонаж одевает вещь, она дает прибавку урона и здоровья(тут все просто), но у другой вещи другой набор параметров, скажем урон и защита, прошлый метод уже не подходит. В итоге писать кучу методов под все случаи жизни?! Код абсолютно не гибкий(
Ответы (1 шт):
Вы как-то не с той стороны заходите. В общем случае, вам может быть проще и удобнее другой подход.
- Делаете список параметров (можно enum)
- Делаете базовый класс (или рекорд) для вещи
- Для персонажа, делаете массив или список надетых вещей
- Для персонажа, делаете набор параметров (урон, здоровье, защита и т.п.)
- Теперь итерируетесь по вещам, чтобы каждая сказала какое у нее значение параметра
- Записываете результирующие значения персонажа
Пример, есть 3 параметра и 2 вещи.
TPersParameter = (ppDamage, ppHealth, ppDefense);
TEquipmentType = (etHelmet, etArmor, etBoots, etWeapon1Hand, etShield, ...);
TEquipment = class
ParamValues: array [TPersParameter] of Single;
TPerson = class
Equipment: array [TEquipmentType] of TEquipment;
function GetTotalParamValue(aParam: TPersParameter): Single;
function GetTotalParamValue(aParam: TPersParameter): Single;
var
I: TEquipmentType;
begin
Result := 0;
for I := Low(TEquipmentType) to High(TEquipmentType) do
if Equipment[I] <> nil then
Result := Result + Equipment[I].ParamValues[aParam];
Соответственно, при развитии системы, как принято в классических RPG, вы можете поменяете ppDamage на 2 разных параметра - ppDamageMin и ppDamageMax, чтобы собирать их по отдельности. А также, сделать разделение на простые значения, и проценты. Например ppHealthBase и ppHealthPercent, и будете считать итог как:
Result := GetTotalParamValue(ppHealthBase) * (1 + GetTotalParamValue(ppHealthPercent));