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...
|