Ruestungschutzberechnung verbessert.
Um Rundungsverluste zu reduzieren (bei allen kleinen
Ruestungen sehr relevant), wird P_AC anfangs mit 10000
skaliert. Beim runterskalieren wird aufgerundet, damit
der Maximalwert auch erreicht werden kann, was bisher
nicht so war.
Change-Id: I3a43276e4cd2cc68c2fe28e4c008696db9749213
diff --git a/std/armour/combat.c b/std/armour/combat.c
index b3456bc..1c68021 100644
--- a/std/armour/combat.c
+++ b/std/armour/combat.c
@@ -55,9 +55,12 @@
&& sizeof(filter(dam_type,PHYSICAL_DAMAGE_TYPES)))
{
// Schutz bestimmen, Minimum 1, aber nur wenn P_AC > 0
- int pac = QueryProp(P_AC);
+ // Um Rundungsverluste zu reduzieren, wird P_AC anfangs mit 10000
+ // skaliert. Beim runterskalieren wird aufgerundet (Addition von
+ // 5000 vor Division).
+ int pac = QueryProp(P_AC) * 10000;
if (pac > 0)
- prot = (pac/4 + random(pac*3/4 + 1)) || 1 ;
+ prot = ((pac/4 + random(pac*3/4 + 1) + 5000)/10000) || 1;
object stat = find_object("/d/erzmagier/zesstra/pacstat");
if (stat)
({string})stat->acstat(QueryProp(P_ARMOUR_TYPE),prot,
diff --git a/std/living/combat.c b/std/living/combat.c
index 053691a..2b05d85 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -1289,9 +1289,12 @@
object stat = find_object("/d/erzmagier/zesstra/pacstat"); // TODO: remove
if ( spell[SP_PHYSICAL_ATTACK] )
{
- // Minimum ist auch hier 1.
+ // Schutz bestimmen, Minimum 1, aber nur wenn P_BODY > 0
+ // Um Rundungsverluste zu reduzieren, wird P_BODY anfangs mit 10000
+ // skaliert. Beim runterskalieren wird aufgerundet (Addition von
+ // 5000 vor Division).
int body = QueryProp(P_BODY)+QueryAttribute(A_DEX);
- res2 = (body/4 + random(body*3/4 + 1)) || 1;
+ res2 = ((body/4 + random(body*3/4 + 1) + 5000)/10000) || 1;
if (stat)
stat->bodystat(body, res2, random(body)+1);