Leben(+Panzerung) -> Schadenberechnung



  • Christoph schrieb:

    Das lässt sich so allgemein schwer beantworten, weil das halt von den Regeln deines Spiels abhängt. Eine einfache Methode ist z.B. Schadenspunkte auszurechnen, die immer zuerst auf die Panzerung gehen. Erst wenn die Panzerung 0 ist, geht der Schaden auf die Gesundheitspunkte. Wenn du also "Gesundheit: 100, Panzerung: 50" hast und 90 Schadenspunkte erhältst, hast du danach "Gesundheit: 60, Panzerung: 0".

    So macht das aber wenig Sinn, da wären ja Panzerung und Gesunheit das gleiche. Wenn dann muss die Panzerung erhalten bleiben, damit auch beim nächsten Angriff wieder abgezogen wird.

    Eine mögliche Formel wäre also z.B.:
    Gesundheit(neu) = Gesundheit(alt) + Panzerung - Angriffsstärke

    Ein Beispiel:
    Du hast 100 Gesundheit und 10 Panzerung und wirst von jemandem mit 20 Angriffsstärke angegriffen.
    Gesundheit(neu) = 100 + 10 - 20 = 90
    Ohne Panzerung hättest du nur noch 80 Gesundheit.



  • MeineMeiung schrieb:

    Eine mögliche Formel wäre also z.B.:
    Gesundheit(neu) = Gesundheit(alt) + Panzerung - Angriffsstärke

    Aha, und wenn der Gegner weniger Angriffskraft hat als man Panzerung besitzt, dann wird man geheilt. 😃



  • Jester schrieb:

    Aha, und wenn der Gegner weniger Angriffskraft hat als man Panzerung besitzt, dann wird man geheilt. 😃

    zu diesem behufe führen die meisten recken ein wenig ungeziefer im schambereich mit.



  • Jester schrieb:

    MeineMeiung schrieb:

    Eine mögliche Formel wäre also z.B.:
    Gesundheit(neu) = Gesundheit(alt) + Panzerung - Angriffsstärke

    Aha, und wenn der Gegner weniger Angriffskraft hat als man Panzerung besitzt, dann wird man geheilt. 😃

    Daran hab ich jetzt gar nicht gedacht. Den Fall Angriffsstärke <= Panzerung muss man natürlich vorher abfangen, damit kein Schaden gemacht wird oder vielleicht nicht einmal angegriffen werden kann.



  • Eine Rüstung macht einen doch nicht gesünder. 🙄 Sie schützt vor angriffen.

    volkard schrieb:

    zu diesem behufe führen die meisten recken ein wenig ungeziefer im schambereich mit.

    Das macht die Berechnung schwieriger.



  • MeineMeiung schrieb:

    Christoph schrieb:

    Das lässt sich so allgemein schwer beantworten, weil das halt von den Regeln deines Spiels abhängt. Eine einfache Methode ist z.B. Schadenspunkte auszurechnen, die immer zuerst auf die Panzerung gehen. Erst wenn die Panzerung 0 ist, geht der Schaden auf die Gesundheitspunkte. Wenn du also "Gesundheit: 100, Panzerung: 50" hast und 90 Schadenspunkte erhältst, hast du danach "Gesundheit: 60, Panzerung: 0".

    So macht das aber wenig Sinn, da wären ja Panzerung und Gesunheit das gleiche.

    Nicht zwingend. Ein Unterschied koennte darin bestehen, dass man das eine heilen kann, das andere nicht (siehe z.B. die Protoss-Schilde in Starcraft)



  • Es könnte ja auch so gehen:

    int gs = (pz_full <= 0 ? hp_full - wolf_atk : pz_full - wolf_atk, hp_full - wolf_atk);
    

    oder so:

    int gs =(pz_full <= 0 ? hp_full - orc_atk : pz_full - orc_atk && hp_full - orc_atk);
    

    Aber worin liegt da der Unterschied? ^^
    Sollte doch eh das gleiche sein, oder etwa nicht 😕



  • && und , berechnen was anderes.
    außerdem wird , erst nach ?: ausgewertet.
    und warum so kompliziert und nicht einfach mit if und in einer funktion berechnet?



  • [quote="volkard"]&& und , berechnen was anderes.
    quote]

    Stimmen beide nicht?
    Wenn nicht, welches von beiden stimmt?

    volkard schrieb:

    und warum so kompliziert und nicht einfach mit if und in einer funktion berechnet?

    das ist ja sowas wie ne if, komplizierter aber kürzer 😃
    Außerdem ist es in ner Funktion,hab ich nur rausgenommen^^



  • In Quake kannst du je nach höhe der Rüstung Schaden abwehren:

    damage = attack - ( (2/3 / max_armor) * armor * attack )
    hp_new = hp_old - damage
    armor_new = armor_old - (damage * 1/3)
    

    MfG SideWinder



  • :Daniel: schrieb:

    das ist ja sowas wie ne if, komplizierter aber kürzer 😃
    Außerdem ist es in ner Funktion,hab ich nur rausgenommen^^

    viel spaß beim gamecoden.

    keine ahnung, was dein code machen soll.
    vielleicht sowas?

    int berechneSchaden(int ruestung,int panzerung,int angriff){
       int schaden=angriff-ruestung;
       if(schaden<=0)
          schaden=0;
       return schaden;
    }
    


  • ich finds eigentlich bloed, wenn man durch entsprechende panzerung manche mobs total unschaedlich machen kann (direkter abzug von deren angriffsstaerke). besser find ichs, wenn sich die panzerung auf trefferwk oder von mir aus auch auf aua nur reduzierend auswirken kann. so dass man bei unendlich panzerung sicher waere quasi. so etwa aua = angriffstaerke * exp(-panzerung) oder so. natuerlich noch alles schoen mit geeigneten koeffizienten spicken.

    volkard: die tiefsinnigkeit deines ungezieferkommentars hat mich sehr zum lachen gebracht, jedoch ist zu bedenken, dass sich dies meist UNTER der panzerung befindet, und somit nicht die von dir gewuenschte wirkung zeigen wird. hoechstens bei zauberern die sich durch selbstverzauberung panzern. 😉



  • PeterTheMaster schrieb:

    ich finds eigentlich bloed, wenn man durch entsprechende panzerung manche mobs total unschaedlich machen kann (direkter abzug von deren angriffsstaerke). besser find ichs, wenn sich die panzerung auf trefferwk oder von mir aus auch auf aua nur reduzierend auswirken kann. so dass man bei unendlich panzerung sicher waere quasi. so etwa aua = angriffstaerke * exp(-panzerung) oder so. natuerlich noch alles schoen mit geeigneten koeffizienten spicken.

    jup. da haste recht.
    exp(-panzerung) ist aber auch ein starkes stück (selbst mit guten koeffizienten).

    vielleicht
    int panzerfaktor=panzerung/angriff+1;
    int wirkung=angriff/panzerfaktor;

    das ergäbe dann

    panzerung	1	2	3	4	5	10	20	30	40	50	100	200	300	400	500	1000
    1	0	2	3	4	5	10	20	30	40	50	100	200	300	400	500	1000
    2	0	1	3	4	5	10	20	30	40	50	100	200	300	400	500	1000
    3	0	1	1	4	5	10	20	30	40	50	100	200	300	400	500	1000
    4	0	0	1	2	5	10	20	30	40	50	100	200	300	400	500	1000
    5	0	0	1	2	2	10	20	30	40	50	100	200	300	400	500	1000
    10	0	0	0	1	1	5	20	30	40	50	100	200	300	400	500	1000
    20	0	0	0	0	1	3	10	30	40	50	100	200	300	400	500	1000
    30	0	0	0	0	0	2	10	15	40	50	100	200	300	400	500	1000
    40	0	0	0	0	0	2	6	15	20	50	100	200	300	400	500	1000
    50	0	0	0	0	0	1	6	15	20	25	100	200	300	400	500	1000
    100	0	0	0	0	0	0	3	7	13	16	50	200	300	400	500	1000
    200	0	0	0	0	0	0	1	4	6	10	33	100	300	400	500	1000
    300	0	0	0	0	0	0	1	2	5	7	25	100	150	400	500	1000
    400	0	0	0	0	0	0	0	2	3	5	20	66	150	200	500	1000
    500	0	0	0	0	0	0	0	1	3	4	16	66	150	200	250	1000
    1000	0	0	0	0	0	0	0	0	1	2	9	33	75	133	166	500
    

    von oben nach unten: panzerung
    von links nach rechts: angriff

    wenn panzerung==angriff, ist die wirkung halbiert.
    die wirkung ist erst ==0, wenn panzerung>=angriff*angriff

    für exp() hab ich aber nen feinen ort.
    einkaufspreis(ding)>=exp(ding.panzerung)



  • PeterTheMaster schrieb:

    jedoch ist zu bedenken, dass sich dies meist UNTER der panzerung befindet, und somit nicht die von dir gewuenschte wirkung zeigen wird. hoechstens bei zauberern die sich durch selbstverzauberung panzern. 😉

    ich kenne nur engines, die dahingehend vereinfachen und nur unterscheiden, ob der angriff magisch oder nichtmagisch ist, und bei nichtmagischen angriffen die rüstung miteinberechnen. genanntes ungeziefer ist nichtmagisch. der u-trick ist also eindeutig cheaten im sinne von "ausnutzen von bugs".

    bitte keinen tiefgang vermuten, das posting existiert nur wegen des wortspiels.



  • und ich dachte das ungeziefer soll wegen seines geringen angriffswerts staendig die gesundheit auftanken...

    durch die runderei gibts haessliche spruenge und angriff^2/panzerung erscheint mir auch nicht intuitiv sinnvoll. da schalt ich lieber noch ein ln 😉 oder sonstwas beliebig langsam aber streng monoton wachsendes vor die panzerung in meiner formel und bestehe weiter auf koeffizienten. aber ueber glaubensfragen soll man nicht streiten.

    edit: das mit dem preis ist wirklich gut.



  • Und was hat das jetzt alles mit Mathematik zu tun...? 😃



  • imho wird das in wc3 so gehandhabt:
    Eine Einheit hat eine bestimmte Rüstungsstärke. Sagen wir mal 1-20.
    Dann steht dran, dass die Rüstung eine bestimmte Schadensreduzierung (bei 1 z.b. 4%, bei 10 z.b. 50%). Wenn wir bei 20 100% reduzierung machen, haben wir ein problem, weshalb wc3 bei 100% schadensreduzierung (auch wenn das dransteht) IMHO in wirklichkeit intern 100% leben hinzuzählt, dieses "neue Leben" sieht der spieler nicht, aber dein Programm kann damit easy den zugeführten schaden abziehen und das dann auf das "eigentliche Leben" anteilmäßig übertragen. Dann gibts es noch verschiedene Rüstungs/Angriffsklassen etc, wo bestimmte Angriffe auf bestimmte Rüstungen nicht 100% schaden machen sondern 150%, 200% oder auch nur 50%.



  • von diesem text verstehe ich fast nichts. und eine absolute obergrenze fuer den ruestwert ist nicht gut fuer den langzeitspass. dann gibts irgendwann einfach keine besseren items mehr zu finden und aus is.



  • @abcxdedfdg:
    WC3 macht es so:

    Damage Reduction or Increases for Armor
    For positive Armor, damage reduction =((armor)*0.06)/(1+0.06*(armor))
    For negative Armor, it is damage increase = 2-0.94^(-armor) since you take more damage for negative armor scores.

    [...]A Positive Armor of 1 reduces damage by about 5.7%. A negative armor of 10 increases damage by 46.1%. Although the formula for armor may look intimidating, it actually works out to mean that one point of armor means +6% HP. So a unit with 20 armor basically has 120% extra hitpoints -- 100 would become effectively 220.

    Man muss aber auch bedenken, in welchen Bereichen sich die HP und Rüstungswerte üblicherweise bewegen. HP sind meistens mehrere hundern, Rüstungswerte spielen sich aber meistens in dem Bereich 0 - 10 ab, selten darüber, manchmal auch negativ.



  • eventuell würde ich sagn,das man bei 100 Rüstung(max),100 prozent dmg auf die rüstung gehn lässt,das dann linear verläuft,so das bei 1 rüstung 10% da drauf gehn und mit 0 rüstung halt alles auf die hp... 🙂


Anmelden zum Antworten