cRPG

cRPG => Beginner's Help and Guides => Topic started by: Tydeus on October 19, 2011, 08:35:47 am

Title: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Tydeus on October 19, 2011, 08:35:47 am
I actually made this a few months ago when I was trying to figure out what archery damage actually looked like, I updated it a bit since then but not much has really changed. As far as any game mechanics code goes, it's all done by cmp. The only thing I did was plug this into a python script, allow the user to input settings and allow you to see relevant information. This was also the first time I had ever even touched python so, don't be blame me too much for how bad it is.

Anyway, here's the code. Just copy and paste this into notepad and give it a name with ".py" at the end. This was made with python version 2.7.2 which you need to run this script, which you can get here: http://www.python.org/download/

Code: [Select]
#Tydeus' Complete Damage Calculator v0.1
#Made possible by several posts from cmp at:
#http://forums.taleworlds.com/index.php/topic,168722.msg4090940.html#msg4090940
#Special thanks to Xol, Espu and Urist

import os, time, math, sys

#==============================================================================================
       
armor_soak_factor_against_cut = 0.65
armor_soak_factor_against_pierce = 0.5
armor_soak_factor_against_blunt = 0.4

armor_reduction_factor_against_cut = 1.6
armor_reduction_factor_against_pierce = 1.1
armor_reduction_factor_against_blunt = 1.3

armor_soak_factor_for_damage_type = 0
armor_reduction_factor_for_damage_type = 0

armor_extra_penetration_soak_factor = 1.2
armor_extra_penetration_reduction_factor = 0.6

missile_damage_speed_power = 1.9
melee_damage_speed_power = 2

i = 0

while i == 0:
    inputDict = {}
    inputDict['armor'] = float(raw_input('Enter the opponents armor value: '))
    inputDict['weapon_damage'] = float(raw_input('Enter your weapon damage: '))
    inputDict['strength'] = float(raw_input('Enter your strength: '))
    inputDict['power_strike'] = float(raw_input('Enter your power strike/draw/throw: '))
    inputDict['proficiency'] = float(raw_input('Enter your effective weapon proficiency: '))
    inputDict['speed_bonus'] = float(raw_input('Enter your speed bonus percentage in decimal format: '))
    inputDict['hold_time'] = float(raw_input('Enter your hold time in seconds rounded to the nearest tenth: '))
    inputDict['damage_type'] = float(raw_input('Enter your damage type "("Cut=1, Pierce=2, Blunt=3")": '))
    inputDict['weapon_type'] = float(raw_input('Enter your type of weapon "("XBow=0, Bow=1, Throwing=2, 1H=3, 2H=4, 1/2H=5, Polearm=6")": '))
    if inputDict['weapon_type'] == 1:
        inputDict['difficulty'] = float(raw_input('Enter the bow difficulty: '))
    inputDict['mounted'] = float(raw_input('Is there a mounted penalty? "("No=0, Yes=1")": '))
    if inputDict['mounted']:
        if inputDict['weapon_type'] == 1:
            inputDict['horse_archery'] = float(raw_input('Enter your horse archery skill: '))
    inputDict['raining'] = float(raw_input('Is there a raining penalty? "("No=0, Yes=1")": '))
    inputDict['shield_penalty'] = float(raw_input('Is there a shield penalty? "("No=0, Yes=1")": '))

    def dmg_calc(n,inDict,c):
        armor = inDict['armor']
        weapon_damage = inDict['weapon_damage']
        strength = inDict['strength']
        power_strike = inDict['power_strike']
        proficiency = inDict['proficiency']
        speed_bonus = inDict['speed_bonus']
        hold_time = inDict['hold_time']
        damage_type = inDict['damage_type']
        weapon_type = inDict['weapon_type']
        mounted = inDict['mounted']
        if weapon_type == 1:
            difficulty = inDict['difficulty']
            if mounted == 1:
                    horse_archery = inDict['horse_archery']
        raining = inDict['raining']
        shield_penalty = inDict['shield_penalty']
       
        if hold_time >= 1.1:
            hold_bonus = 1.2
        elif hold_time >= 0.6:
            hold_bonus = (1.1 - hold_time) * 0.6 + 1.2
        elif hold_time >= 0.5:
            hold_bonus = 1.5
        else:
            hold_bonus = hold_time + 1.0

        raw_damage = weapon_damage * (max(1.0, min(hold_bonus, 2.0)) * 0.5 + 0.5)

        if weapon_type >= 3:
            raw_damage *= math.pow(melee_damage_speed_power, speed_bonus)
        elif weapon_type < 3:
            raw_damage *= math.pow(missile_damage_speed_power, speed_bonus)

        if weapon_type == 0 and raining:
            raw_damage *= 0.75
        else:
            raw_damage *= proficiency * 0.01 * 0.15 + 0.85

            if weapon_type == 1:
                    raw_damage *= min(power_strike, difficulty + 4) * 0.14 + 1

                    if mounted:
                        raw_damage *= horse_archery * 0.019 + 0.8
                   
                    if raining:
                        raw_damage *= 0.9
            elif weapon_type == 2:
                    raw_damage *= power_strike * 0.1 + 1.0

                    if mounted:
                        raw_damage *= horse_archery * 0.019 + 0.8
            elif weapon_type >= 3:
                    raw_damage *= power_strike * 0.08 + 1.0

                    raw_damage += strength / 5.0

            if (weapon_type >= 3) and (shield_penalty or mounted):
                    raw_damage *= 0.85

                    if weapon_type == 6:
                        raw_damage *= 0.85

                    #if weapon_flags & itp_two_handed:
                    #    raw_damage *= 0.9

        raw_damage = max(0, min(raw_damage, 500))

        if c == 0:
            print "Raw Damage: "
            print raw_damage

           
        if damage_type == 1:
                armor_soak_factor_for_damage_type = armor_soak_factor_against_cut
                armor_reduction_factor_for_damage_type = armor_reduction_factor_against_cut
        elif damage_type == 2:
                armor_soak_factor_for_damage_type = armor_soak_factor_against_pierce
                armor_reduction_factor_for_damage_type = armor_reduction_factor_against_pierce
        elif damage_type == 3:
                armor_soak_factor_for_damage_type = armor_soak_factor_against_blunt
                armor_reduction_factor_for_damage_type = armor_reduction_factor_against_blunt
               
        #I don't think this applies to crpg.
        #if hit_shield_on_back:
        #   armor += shield_resistance + 10

        soak_factor = armor * armor_soak_factor_for_damage_type
        reduction_factor = armor * armor_reduction_factor_for_damage_type

        if weapon_type < 3:
            soak_factor *= armor_extra_penetration_soak_factor
            reduction_factor *= armor_extra_penetration_reduction_factor

        randomized_soak = (n * 0.55 + 0.45) * soak_factor
        randomized_damage = (n * 0.1 + 0.9) * raw_damage
        soaked_damage = randomized_damage - randomized_soak

        if (soaked_damage < 0.0):
            soaked_damage = 0.0

        randomized_reduction = math.exp((n * 0.55 + 0.45) * reduction_factor * 0.014)
        reduced_damage = (1.0 - 1.0 / randomized_reduction) * soaked_damage
                     
        if (reduction_factor < 0.00001):
            reduced_damage  = 0.0

        damage_difference = round(reduced_damage + randomized_soak)
        effective_damage = randomized_damage - damage_difference

        #I'll throw this in there eventually, current input is shit though.
        #For headshots just multiply your min/max damage by 1.2 if melee otherwise, 1.75.
        #Calf/thigh is always 90% damage regardless of weapon type; foot shots suffer no penalty.
        #if hit_bone == head:
        #    if weapon_type != 0:
        #            effective_damage *= 1.75
        #    else
        #            effective_damage *= 1.2
        #elif hit_bone == calf or hit_bone == thigh:
        #    effective_damage *= 0.9

        effective_damage = max(0, min(effective_damage, 500))
        return effective_damage

    min_d = dmg_calc(1,inputDict,0)
    print "Minimum Damage: "
    print min_d
    max_d = dmg_calc(0,inputDict,1)
    print "Maximum Damage: "
    print max_d
    print "Average Damage: "
    print ((min_d + max_d) / 2)
    status_key = raw_input("Type quit to close or enter to try new numbers ")
    if status_key == "quit":
        i = 1



It's not as pretty as Vargas' Toolkit, which is a great tool for calculating builds and whatnot, but it's a bit more complete and customizable in that you can see realistic numbers.

How to use:
Once you get python installed and you've copied over the code and saved it as a python script, double click the icon to launch the script. Inputs are all done numerically, don't try to input anything aside from numbers you'll just get errors that way.

Known issues:

If anyone has any suggestions or questions feel free to post, thanks.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Digglez on October 19, 2011, 09:02:58 am
 do it in php, javascript or some other web based format
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Tydeus on October 19, 2011, 09:06:14 am
do it in php, javascript or some other web based format
I should have just updated Vargas' Toolkit then. That would have ended up being more of a pain in the end. I made this simply because of how easy it was to do.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Digglez on October 19, 2011, 09:07:14 am
I should have just updated Vargas' Toolkit then. That would have ended up being more of a pain in the end. I made this simply because of how easy it was to do.

and only a handful of people are going to go thru the trouble of using it, so its about useless.  excel spreadsheet is more friendly
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Tydeus on October 19, 2011, 09:44:35 am
and only a handful of people are going to go thru the trouble of using it
Pretty much expected this from the beginning, yeah.

At a minimum, I think anyone interested in game mechanics should take a look at the code. Its got some stuff in there that's contrary to popular belief or would otherwise be rather counter intuitive.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Kafein on October 19, 2011, 10:27:40 am
Hell man, this is python, not cobol, think OO :cry:

Cool though x)
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Balton on October 19, 2011, 10:31:37 am
Very cool +1
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Paul on October 19, 2011, 11:41:39 am
Average damage is not (min+max)/2.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Espu on October 20, 2011, 01:24:40 pm
I'll copy this to my calculator and won't add credits.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Jacko on October 20, 2011, 01:29:46 pm
It' needs to be pretty.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Vibe on October 20, 2011, 01:33:33 pm
I'll copy this to my calculator and won't add credits.

Do it, schneller!
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Tears of Destiny on October 20, 2011, 10:08:46 pm
Average damage is not (min+max)/2.

Pfft, as if you know anything about this game, Mr. Claiming that AGI does not effect swing speed  :mrgreen: (just ignore your findings in 0.808)
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: marco1391 on October 20, 2011, 10:24:07 pm
it says with a 6 difficulty bow with 35 pierce(longbow+1 and bodkin+3), 1% speed bonus,7 pd, no rain penality, 150 wpf and 60 enemy's armor I should do from a minimum of 70 to a maximum of 100 effective damage, seems something is wrong
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: MrShine on October 20, 2011, 10:43:38 pm
cool I'll have to give this a shot when I get a chance.

Thanks for posting!

it says with a 6 difficulty bow with 35 pierce(longbow+1 and bodkin+3), 1% speed bonus,7 pd, no rain penality, 150 wpf and 60 enemy's armor I should do from a minimum of 70 to a maximum of 100 effective damage, seems something is wrong
Working as intended!  :twisted:
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: Tydeus on October 21, 2011, 12:45:58 pm
it says with a 6 difficulty bow with 35 pierce(longbow+1 and bodkin+3), 1% speed bonus,7 pd, no rain penality, 150 wpf and 60 enemy's armor I should do from a minimum of 70 to a maximum of 100 effective damage, seems something is wrong
Yeah, that's cause you used "1" as your speed bonus. Like I said, for ranged the speed bonus part isn't very intuitive. Arrows start out at max damage and only decrease over time.
Title: Re: Tydeus' Complete Damage Calculator- Made Possible by cmp.
Post by: marco1391 on October 21, 2011, 01:29:59 pm
Yeah, that's cause you used "1" as your speed bonus. Like I said, for ranged the speed bonus part isn't very intuitive. Arrows start out at max damage and only decrease over time.
is it know the overall malus of speed bonus on point blank or 10 meters of distance?becouse as it is it's impossible to get some numbers on ranged damage since we can't get the speed malus in native considerating that it's shown only for melee attacks

however very good work, it could seem like I'm only criticizing but I really appreciate every kind of calculator for game stats