система боя

DeletedUser

Guest
Можно где нибудь посмотреть как вообще расчитываются сражения. Я ненашел темы.

Дело в том что мне немного не понятно как при атаке на 10 мечников, 15, 50 и 500ми пращами. атакующий всегда несет потери. Причем при увеличении кол-ва нападающих в в десять раз, потери уменьшаются на 1???? WTF


Имхо, как бы не были пращи слабее меча, но если их в 50 раз больше, они должны без потерь выходить.

С другой стороны. Допустим обороняющиеся "бьют" первыми, и убивают пращника с первого раза. тогда потерь всегда должно быть равно кол-ву обороняющихся мечников. То есть, потери нападающих всегда 10 пращей, независимо от кол-ва.


Надеюсь меня кто нибудь понял... ))
 

Ярри

Игрок
!!!

Поддерживаю автора. Хороший вопрос.
Тоже удивило насчет потерь.
Неплохо бы расписать что и как.
 

DeletedUser

Guest
Никто никого не бьет первым. Грубо: суммируется все оффпоинты атакующих и дефпоинты защищающихся, и по соотношению этих очков и вычисляются потери.

Урон который получают атакующие юниты вычисляется по формуле dmgOff:=Def^ 1.2*Off^-0.2 где Def - суммарный деф, Off - суммарный офф, dmgOff - кол-во единиц погибшего оффа. Чтобы вычислить кол-во погибших юнитов: dmgOff/Off*OffCount - где OffCount количество юнитов которое атаковало.

Аналогично считаются потери дефа, но по вот этой формуле: dmgDef:=Def^ -0.2*Off^1.2

Вам стало легче? :)
 

DeletedUser

Guest
А формулы откуда?
Просто, раз уж всё так чётко определено, то в формулах должна быть Мораль и Удача.
Я так понимаю, что приведенные выше формулы для 100% морали и средней удачи, т.е. ноль.

Мораль напрашивается линейным коеффициентом. Да и удача тоже: 1 +/- 0,XX. Только кому-то в числитель, а кому-то в знаменатель.
 
Последнее редактирование модератором:

DeletedUser

Guest
А формулы откуда?
Формулы вычеслены аналитическим путем после изголений с симулятором. Вам так интересны все все все мелочи? Я могу код моего симулятора на Delphi выложить, будете разбираться.
 

DeletedUser

Guest
Не то, чтобы Паскаль мне не был знаком. Да и в Делфи я когда-то баловался.
Если формула - это две три строки кода, то выложи.
Если нагромождение процедур и функций, то я пас - легче свой код написать, чем в чужом пытаться разобраться.
 

DeletedUser

Guest
Если нагромождение процедур и функций, то я пас - легче свой код написать, чем в чужом пытаться разобраться.
Сухопутная битва - это одна функция с кучей параметров, и кучей формул внутри.
Вот код:

PHP:
procedure TForm1.LandBattle(LandOff, LandDef: TDoubleArr;
                            WallLevel: Double;
                            WDefK: Double;
                            Tower, PhalanxDef, CommandorDef: boolean;
                            PhalanxOff, CommandorOff, Heroic, Desire: boolean;
                            Morale, Luck: Double);
var i: integer;
    OffTotal: Double;
    Off1, Off2, Off3: Double;
    Def1, Def2, Def3: Double;
    defBonusK: Double;
    offBonusK: Double;

    dmgOff1, dmgOff2, dmgOff3: Double;
    dmgDef1, dmgDef2, dmgDef3: Double;
begin
  Off1:=0;
  Off2:=0;
  Off3:=0;
  for i:=0 to Length(LandOff)-1 do
    begin
      case LandUnits[i].OffType of
        atSword: Off1:=Off1+LandOff[i]*LandUnits[i].Off;
        atSpear: Off2:=Off2+LandOff[i]*LandUnits[i].Off;
        atRange: Off3:=Off3+LandOff[i]*LandUnits[i].Off;
      end;
    end;
  offBonusK:=1;
  if PhalanxOff then offBonusK:=offBonusK+0.1;
  if CommandorOff then offBonusK:=offBonusK+0.2;
  if Heroic then offBonusK:=offBonusK+0.1;
  if Desire then offBonusK:=offBonusK-0.1;
  offBonusK:=offBonusK*Morale;
  offBonusK:=offBonusK*(1+Luck);
  Off1:=Off1*offBonusK;
  Off2:=Off2*offBonusK;
  Off3:=Off3*offBonusK;

  OffTotal:=Off1+Off2+Off3;
  if OffTotal<=0 then exit; //нет оффа, выходим

  Def1:=0;
  Def2:=0;
  Def3:=0;
  for i:=0 to Length(LandDef)-1 do
    begin
      Def1:=Def1+LandDef[i]*LandUnits[i].Def1;
      Def2:=Def2+LandDef[i]*LandUnits[i].Def2;
      Def3:=Def3+LandDef[i]*LandUnits[i].Def3;
    end;

  defBonusK:=WDefK;
  if Tower then defBonusK:=defBonusK+0.1;
  if PhalanxDef then defBonusK:=defBonusK+0.1;
  if CommandorDef then defBonusK:=defBonusK+0.2;
  Def1:=Def1 * (Off1/OffTotal); //деф от % оффа
  Def2:=Def2 * (Off2/OffTotal); //деф от % оффа
  Def3:=Def3 * (Off3/OffTotal); //деф от % оффа
  Def1:=Def1*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты
  Def2:=Def2*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты
  Def3:=Def3*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты

  if Off1=0 then dmgOff1:=0 else dmgOff1:=Power(Def1, 1.2)*Power(Off1, -0.2) / Off1; //% убитого оффа
  if Off2=0 then dmgOff2:=0 else dmgOff2:=Power(Def2, 1.2)*Power(Off2, -0.2) / Off2; //% убитого оффа
  if Off3=0 then dmgOff3:=0 else dmgOff3:=Power(Def3, 1.2)*Power(Off3, -0.2) / Off3; //% убитого оффа

  if Def1=0 then dmgDef1:=0 else dmgDef1:=Power(Def1, -0.2)*Power(Off1, 1.2) / Def1 * (Off1/OffTotal); //% урона по каждому из типов дефа
  if Def2=0 then dmgDef2:=0 else dmgDef2:=Power(Def2, -0.2)*Power(Off2, 1.2) / Def2 * (Off2/OffTotal); //% урона по каждому из типов дефа
  if Def3=0 then dmgDef3:=0 else dmgDef3:=Power(Def3, -0.2)*Power(Off3, 1.2) / Def3 * (Off3/OffTotal); //% урона по каждому из типов дефа

  for i:=0 to Length(LandOff)-1 do
    begin
      case LandUnits[i].OffType of
        atSword: LandOff[i]:=LandOff[i] - Min(1, dmgOff1) * LandOff[i];
        atSpear: LandOff[i]:=LandOff[i] - Min(1, dmgOff2) * LandOff[i];
        atRange: LandOff[i]:=LandOff[i] - Min(1, dmgOff3) * LandOff[i];
      end;
      LandDef[i]:=Max(0, LandDef[i] - Min(LandDef[i]*dmgDef1, LandDef[i]*(Off1/OffTotal))
                                    - Min(LandDef[i]*dmgDef2, LandDef[i]*(Off2/OffTotal))
                                    - Min(LandDef[i]*dmgDef3, LandDef[i]*(Off3/OffTotal)));
    end;
end;

Список входных параметров функции описать?
 

DeletedUser

Guest
Список входных параметров функции описать?
Помощь, чтоб разобраться, однозначно понадобится.
Но, чтоб я задал правильные вопросы, надо сначала вникнуть в код.
А напишу в личку, т.к. сама тема на этом себя исчерпала.
Спасибо форуму.
 

Ярри

Игрок
На самом деле вот этого вполне достаточно.
Разработчик тот же что и ВП, и довольно странно что решили здесь изобрести велосипед с этими формулами. В ВП все прекрасно работало смыл был чего то менять?

И что появляются такие вопросы в этом случае не удивительно, ведь многие до этого играли в ВП и пытаются провести аналогии. А их нет ((
Никто никого не бьет первым. Грубо: суммируется все оффпоинты атакующих и дефпоинты защищающихся, и по соотношению этих очков и вычисляются потери.
 

Ярри

Игрок
Да, и если никто никого не бьет первым, как работают катапульты?
 

DeletedUser

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