Вы как-то не с той стороны заходите. В общем случае, вам может быть проще и удобнее другой подход.
- Делаете список параметров (можно 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));