Algorytm obliczania obrażeń w Fallout 2.


Skróty użyte w algorytmie:

losuj(min,max) - funkcja losuje wartość bazową obrażeń broni z zakresu min - max damage.

dmg_w - wylosowana bazowa wartość obrażeń broni

mod_1, mod_2, DR_ammo - modyfikatory amunicji

DT_armor, DR_armor - modyfikatory pancerza przeciwnika, którego raniliśmy

damage_wynik(dmg_w,mod_1,mod_2,DR_ammo,DT_armor,DR_armor) - funkcja obliczająca ostateczną wartość obrażeń po uwzględnieniu wylosowanej bazowej wartości obrażeń broni (dmg_w), modyfikatorów użytej amunicji (mod_1,mod_2,DR_ammo), modyfikatorów pancerza przeciwnika którego raniliśmy (DT_armor,DR_armor).

W przypadku używania broni melee i unarmed (czyli nie używającej amunicji) w algorytmie używane są zastępcze wartości modyfikatorów amunicji:
mod_1=1
mod_2=1
DR_ammo=0 %

trunc - funkcja zaokrąglająca do liczby całkowitej w dół, czyli:
trunc(7,2)=7
trunc(7,5)=7
trunc(7,9)=7 itd.):



Algorytm (w Turbo Pascalu)

Tutaj przedstawiam funkcje obliczające zadany damage przeciwnikowi z uwzględnieniem chrakterystyk pancerza i modyfikatorów amunicji:


function losuj(min,max:Integer):Integer;
begin
   losuj:=Random(1+max-min)+min;
end;


dmg_w:=losuj(hero_weapon_min_dmg,hero_weapon_max_dmg);


function damage_wynik(dmg_w,mod_1,mod_2,DR_ammo,DT_armor,DR_armor:Integer):Integer;
var a:Integer;
      b:Real;
begin
   a:=Trunc((dmg_w*mod_1/mod_2)-DT_armor);
   if a < 0 then a:="0;"
   b:=0.01*(DR_ammo+DR_armor);
   if b<0 then b:="0;"
   if b>1 then b:=1;
   damage_wynik:=a-Trunc(a*b);
end;



Przykład 1 (dla broni białej, nie używającej amunicji):

Weapon (np. combat knife):
weapon_min_dmg:=3
weapon_min_dmg:=10

(modyfikatory amunicji domyślne dla broni nie używającej amunicji, czyli unarmed i melee):
mod_1:=1
mod_2:=1
DR_ammo:=0 %

Armor przeciwnika:
DT:=2
DR:=25 %

Wyliczenia:
dmg_w:=losuj(3,10)=6 {przykładowo taka liczba została wylosowana z tego zakresu)

zadane_obrażenia:=damage_wynik(dmg_w,mod_1,mod_2,DR_ammo,DT_armor,DR_armor)=damage_wynik(6,1,1,0,2,25)
zadane_obrażenia:=3

Otrzymujemy wynik zadane_obrażenia = 3


Przykład 2 (dla broni palnej, z użyciem amunicji):

Weapon (np. 10mm Pistol):
weapon_min_dmg:=5
weapon_min_dmg:=12

(modyfikatory amunicji dla 10mm JHP, czyli rozrywającej):
mod_1:=2
mod_2:=1
DR_ammo:=25 %

Armor przeciwnika:
DT:=2
DR:=25 %

Wyliczenia:
dmg_w:=losuj(5,12)=8 {przykładowo taka liczba została wylosowana z tego zakresu)

zadane_obrażenia:=damage_wynik(dmg_w,mod_1,mod_2,DR_ammo,DT_armor,DR_armor)
zadane_obrażenia:=damage_wynik(8,2,1,25,2,25)=7

Otrzymujemy wynik zadane_obrażenia = 7


(modyfikatory amunicji dla 10mm AP, czyli przeciwpancernej):
mod_1:=1
mod_2:=2
DR_ammo:=-25 %

Armor przeciwnika:
DT:=2
DR:=25 %

Wyliczenia:
dmg_w:=losuj(5,12)=8 {przykładowo taka liczba została wylosowana z tego zakresu)

zadane_obrażenia:=damage_wynik(dmg_w,mod_1,mod_2,DR_ammo,DT_armor,DR_armor)
zadane_obrażenia:=damage_wynik(8,1,2,-25,2,25)=2

Otrzymujemy wynik zadane_obrażenia = 2




Po analizie wyników wnioski nasuwają się same...