Как организовать подсчет итоговых параметров персонажа из экипировки в RPG?

Рейтинг: 3Ответов: 1Опубликовано: 11.02.2023

Возможно ли создать метод, автоматически ищущий поле класса по имени этого поля. Делаю RPG. Пример: персонаж одевает вещь, она дает прибавку урона и здоровья(тут все просто), но у другой вещи другой набор параметров, скажем урон и защита, прошлый метод уже не подходит. В итоге писать кучу методов под все случаи жизни?! Код абсолютно не гибкий(

Ответы

▲ 3

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

  1. Делаете список параметров (можно enum)
  2. Делаете базовый класс (или рекорд) для вещи
  3. Для персонажа, делаете массив или список надетых вещей
  4. Для персонажа, делаете набор параметров (урон, здоровье, защита и т.п.)
  5. Теперь итерируетесь по вещам, чтобы каждая сказала какое у нее значение параметра
  6. Записываете результирующие значения персонажа

Пример, есть 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));