mirror of
https://github.com/MathiasLui/CSGO-Projects.git
synced 2025-05-07 06:11:17 +00:00
Add ability to set armor value before damage is taken
* Now uses scaleArmorDamage for shooting as well * Removed some duplicate code * Added comments to
This commit is contained in:
parent
d40ee5ac7d
commit
ace07505c6
2 changed files with 103 additions and 15 deletions
|
@ -4,6 +4,7 @@
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:local="clr-namespace:Damage_Calculator"
|
xmlns:local="clr-namespace:Damage_Calculator"
|
||||||
|
xmlns:extended="http://schemas.xceed.com/wpf/xaml/toolkit"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="CS:GO Damage Calculator" Height="566" Width="1030" MinHeight="845" MinWidth="1000"
|
Title="CS:GO Damage Calculator" Height="566" Width="1030" MinHeight="845" MinWidth="1000"
|
||||||
Style="{DynamicResource CustomWindowStyle}"
|
Style="{DynamicResource CustomWindowStyle}"
|
||||||
|
@ -70,6 +71,10 @@
|
||||||
<CheckBox x:Name="chkKevlar" Content="Body armor" Checked="settings_Updated" Unchecked="settings_Updated" />
|
<CheckBox x:Name="chkKevlar" Content="Body armor" Checked="settings_Updated" Unchecked="settings_Updated" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox x:Name="chkArmorAny" Visibility="Collapsed" Content="Yes" Checked="settings_Updated" Unchecked="settings_Updated" />
|
<CheckBox x:Name="chkArmorAny" Visibility="Collapsed" Content="Yes" Checked="settings_Updated" Unchecked="settings_Updated" />
|
||||||
|
<StackPanel x:Name="stackArmorAmount" Visibility="Collapsed" Margin="15,0,0,0" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="Armor left:" />
|
||||||
|
<TextBox x:Name="txtArmorAmount" Margin="5,0,0,0" TextChanged="settings_Updated" Width="50" Text="100"/>
|
||||||
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel x:Name="stackAreaHit" Margin="0,20,0,0">
|
<StackPanel x:Name="stackAreaHit" Margin="0,20,0,0">
|
||||||
<TextBlock Text="Area hit:" FontSize="14" FontWeight="Bold" />
|
<TextBlock Text="Area hit:" FontSize="14" FontWeight="Bold" />
|
||||||
|
|
|
@ -100,6 +100,17 @@ namespace Damage_Calculator
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private double unitsDistanceMax = -1;
|
private double unitsDistanceMax = -1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The amount of armor that the target has left for bomb or shooting damage calculation.
|
||||||
|
/// </summary>
|
||||||
|
private int armorLeft = 100;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the player has kevlar.
|
||||||
|
/// If yes, <see cref="armorLeft"/> will be the target's armor left.
|
||||||
|
/// </summary>
|
||||||
|
private bool hasKevlar = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the currently loaded map.
|
/// Gets or sets the currently loaded map.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1209,9 +1220,6 @@ namespace Damage_Calculator
|
||||||
if (chkHelmet.IsChecked == true)
|
if (chkHelmet.IsChecked == true)
|
||||||
{
|
{
|
||||||
// Has helmet
|
// Has helmet
|
||||||
double previousDamage = damage;
|
|
||||||
damage *= this.selectedWeapon.ArmorPenetration / 100f;
|
|
||||||
absorbedDamageByArmor = previousDamage - damage;
|
|
||||||
wasArmorHit = true;
|
wasArmorHit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1221,9 +1229,6 @@ namespace Damage_Calculator
|
||||||
if (chkKevlar.IsChecked == true)
|
if (chkKevlar.IsChecked == true)
|
||||||
{
|
{
|
||||||
// Has kevlar
|
// Has kevlar
|
||||||
double previousDamage = damage;
|
|
||||||
damage *= this.selectedWeapon.ArmorPenetration / 100f;
|
|
||||||
absorbedDamageByArmor = previousDamage - damage;
|
|
||||||
wasArmorHit = true;
|
wasArmorHit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1235,9 +1240,6 @@ namespace Damage_Calculator
|
||||||
if (chkKevlar.IsChecked == true)
|
if (chkKevlar.IsChecked == true)
|
||||||
{
|
{
|
||||||
// Has kevlar
|
// Has kevlar
|
||||||
double previousDamage = damage;
|
|
||||||
damage *= this.selectedWeapon.ArmorPenetration / 100f;
|
|
||||||
absorbedDamageByArmor = previousDamage - damage;
|
|
||||||
wasArmorHit = true;
|
wasArmorHit = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1249,6 +1251,14 @@ namespace Damage_Calculator
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wasArmorHit)
|
||||||
|
{
|
||||||
|
// Has helmet or kevlar
|
||||||
|
double previousDamage = damage;
|
||||||
|
damage = this.scaleDamageArmor(damage, this.armorLeft, armorPenetrationMultiplier: this.selectedWeapon.ArmorPenetration / 100f);
|
||||||
|
absorbedDamageByArmor = previousDamage - damage;
|
||||||
|
}
|
||||||
|
|
||||||
txtResult.Text = ((int)damage).ToString();
|
txtResult.Text = ((int)damage).ToString();
|
||||||
|
|
||||||
txtResultArmor.Text = (wasArmorHit ? Math.Ceiling(absorbedDamageByArmor / 2f) : 0).ToString();
|
txtResultArmor.Text = (wasArmorHit ? Math.Ceiling(absorbedDamageByArmor / 2f) : 0).ToString();
|
||||||
|
@ -1261,10 +1271,10 @@ namespace Damage_Calculator
|
||||||
// Now we can calculate the damage...
|
// Now we can calculate the damage...
|
||||||
double minDamage;
|
double minDamage;
|
||||||
double minDamageArmor;
|
double minDamageArmor;
|
||||||
this.getBombDamage(this.unitsDistanceMax, armorValue: 100, out minDamage, out minDamageArmor);
|
this.getBombDamage(this.unitsDistanceMax, armorValue: this.armorLeft, out minDamage, out minDamageArmor);
|
||||||
double maxDamage;
|
double maxDamage;
|
||||||
double maxDamageArmor;
|
double maxDamageArmor;
|
||||||
this.getBombDamage(this.unitsDistanceMin, armorValue: 100, out maxDamage, out maxDamageArmor);
|
this.getBombDamage(this.unitsDistanceMin, armorValue: this.armorLeft, out maxDamage, out maxDamageArmor);
|
||||||
|
|
||||||
txtResultBombMin.Text = ((int)minDamage).ToString();
|
txtResultBombMin.Text = ((int)minDamage).ToString();
|
||||||
txtResultBombMax.Text = ((int)maxDamage).ToString();
|
txtResultBombMax.Text = ((int)maxDamage).ToString();
|
||||||
|
@ -1275,6 +1285,13 @@ namespace Damage_Calculator
|
||||||
txtResultArmorBombMedian.Text = ((maxDamageArmor + minDamageArmor) / 2f).ToString();
|
txtResultArmorBombMedian.Text = ((maxDamageArmor + minDamageArmor) / 2f).ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates bomb damage based on given factors.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="distance">The distance in units between bomb and player.</param>
|
||||||
|
/// <param name="armorValue">The armor the player has. Doesn't matter if <see cref="hasKevlar"/> is false.</param>
|
||||||
|
/// <param name="hpDamage">returns the amount of damage the player gets.</param>
|
||||||
|
/// <param name="armorDamage">returns the amount of armor damage the player gets.</param>
|
||||||
private void getBombDamage(double distance, int armorValue, out double hpDamage, out double armorDamage)
|
private void getBombDamage(double distance, int armorValue, out double hpDamage, out double armorDamage)
|
||||||
{
|
{
|
||||||
// out params
|
// out params
|
||||||
|
@ -1324,7 +1341,7 @@ namespace Damage_Calculator
|
||||||
|
|
||||||
double flAdjustedDamageBeforeArmor = flAdjustedDamage;
|
double flAdjustedDamageBeforeArmor = flAdjustedDamage;
|
||||||
|
|
||||||
if (chkArmorAny.IsChecked == true)
|
if (this.hasKevlar)
|
||||||
{
|
{
|
||||||
flAdjustedDamage = scaleDamageArmor(flAdjustedDamage, armorValue);
|
flAdjustedDamage = scaleDamageArmor(flAdjustedDamage, armorValue);
|
||||||
armorDamage = flAdjustedDamage >= 1 ? Math.Ceiling((flAdjustedDamageBeforeArmor - flAdjustedDamage) / 2f) : 0;
|
armorDamage = flAdjustedDamage >= 1 ? Math.Ceiling((flAdjustedDamageBeforeArmor - flAdjustedDamage) / 2f) : 0;
|
||||||
|
@ -1338,22 +1355,39 @@ namespace Damage_Calculator
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="flDamage">The damage that was dealt to the player by the bomb.</param>
|
/// <param name="flDamage">The damage that was dealt to the player by the bomb.</param>
|
||||||
/// <param name="armor_value">The amount of armor that the player had.</param>
|
/// <param name="armor_value">The amount of armor that the player had.</param>
|
||||||
|
/// <param name="armorPenetrationMultiplier">
|
||||||
|
/// The armor penetration multiplier between 0 and 1.
|
||||||
|
/// Default is 0.5 and can be used for bomb damage.
|
||||||
|
/// </param>
|
||||||
/// <returns>the amount of damage that is actually dealt.</returns>
|
/// <returns>the amount of damage that is actually dealt.</returns>
|
||||||
double scaleDamageArmor(double flDamage, int armor_value)
|
double scaleDamageArmor(double flDamage, int armor_value, double armorPenetrationMultiplier = 0.5)
|
||||||
{
|
{
|
||||||
double flArmorRatio = 0.5d;
|
// Damage reduction ratio when wearing armor (armor penetration multiplier)
|
||||||
|
double flArmorRatio = armorPenetrationMultiplier;
|
||||||
|
|
||||||
|
// Armor will be reduced by half of what it absorbes. This is that factor and shouldn't be modified
|
||||||
double flArmorBonus = 0.5d;
|
double flArmorBonus = 0.5d;
|
||||||
|
|
||||||
|
// If player has armor do the calculation
|
||||||
if (armor_value > 0)
|
if (armor_value > 0)
|
||||||
{
|
{
|
||||||
|
// Calculate new damage dealt to player (e.g. half of original with bomb)
|
||||||
double flNew = flDamage * flArmorRatio;
|
double flNew = flDamage * flArmorRatio;
|
||||||
|
|
||||||
|
// Calculate amount of amor that should get subtracted (e.g. When it's 50% i.e. we use bomb damage, then it's the same as "flNew * 0.25")
|
||||||
double flArmor = (flDamage - flNew) * flArmorBonus;
|
double flArmor = (flDamage - flNew) * flArmorBonus;
|
||||||
|
|
||||||
|
// Check if the armor that subtracts is actually more than what the player has
|
||||||
if (flArmor > (double)armor_value)
|
if (flArmor > (double)armor_value)
|
||||||
{
|
{
|
||||||
|
// Calculate the amount of damage that the armor actually absorbs (The armor that the player had left times two)
|
||||||
flArmor = (double)armor_value * (1d / flArmorBonus);
|
flArmor = (double)armor_value * (1d / flArmorBonus);
|
||||||
|
|
||||||
|
// Subtract the absorbed damage from the original damage to get the new one
|
||||||
flNew = flDamage - flArmor;
|
flNew = flDamage - flArmor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Just update the damage at the very end
|
||||||
flDamage = flNew;
|
flDamage = flNew;
|
||||||
}
|
}
|
||||||
return flDamage;
|
return flDamage;
|
||||||
|
@ -2039,6 +2073,8 @@ namespace Damage_Calculator
|
||||||
this.stackArmorSeparated.Visibility = this.stackAreaHit.Visibility = this.stackWeaponUsed.Visibility = this.stackDamageFirearm.Visibility = Visibility.Visible;
|
this.stackArmorSeparated.Visibility = this.stackAreaHit.Visibility = this.stackWeaponUsed.Visibility = this.stackDamageFirearm.Visibility = Visibility.Visible;
|
||||||
this.stackPlayerStance.Visibility = this.lblPlayerStance.Visibility = this.chkArmorAny.Visibility = this.stackDamageBomb.Visibility = Visibility.Collapsed;
|
this.stackPlayerStance.Visibility = this.lblPlayerStance.Visibility = this.chkArmorAny.Visibility = this.stackDamageBomb.Visibility = Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.settings_Updated(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioModeBomb_Checked(object sender, RoutedEventArgs e)
|
private void radioModeBomb_Checked(object sender, RoutedEventArgs e)
|
||||||
|
@ -2050,6 +2086,8 @@ namespace Damage_Calculator
|
||||||
this.stackArmorSeparated.Visibility = this.stackAreaHit.Visibility = this.stackWeaponUsed.Visibility = this.stackDamageFirearm.Visibility = Visibility.Collapsed;
|
this.stackArmorSeparated.Visibility = this.stackAreaHit.Visibility = this.stackWeaponUsed.Visibility = this.stackDamageFirearm.Visibility = Visibility.Collapsed;
|
||||||
this.stackPlayerStance.Visibility = this.lblPlayerStance.Visibility = this.chkArmorAny.Visibility = this.stackDamageBomb.Visibility = Visibility.Visible;
|
this.stackPlayerStance.Visibility = this.lblPlayerStance.Visibility = this.chkArmorAny.Visibility = this.stackDamageBomb.Visibility = Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.settings_Updated(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mapImage_LayoutUpdated(object sender, EventArgs e)
|
private void mapImage_LayoutUpdated(object sender, EventArgs e)
|
||||||
|
@ -2087,6 +2125,51 @@ namespace Damage_Calculator
|
||||||
|
|
||||||
private void settings_Updated(object sender, EventArgs e)
|
private void settings_Updated(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
// If we have a helmet, we definitely have body kevlar too
|
||||||
|
if (this.chkHelmet?.IsChecked == true && this.chkKevlar != null)
|
||||||
|
{
|
||||||
|
this.chkKevlar.IsChecked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the armor left stack's visibility
|
||||||
|
if (this.chkKevlar?.IsChecked == true && this.DrawMode == eDrawMode.Shooting
|
||||||
|
|| this.chkArmorAny?.IsChecked == true && this.DrawMode == eDrawMode.Bomb)
|
||||||
|
{
|
||||||
|
if (this.stackArmorAmount != null)
|
||||||
|
this.stackArmorAmount.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
this.hasKevlar = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (this.stackArmorAmount != null)
|
||||||
|
this.stackArmorAmount.Visibility = Visibility.Collapsed;
|
||||||
|
|
||||||
|
this.hasKevlar = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate kevlar value
|
||||||
|
if (this.hasKevlar)
|
||||||
|
{
|
||||||
|
if (int.TryParse(this.txtArmorAmount.Text, out int armorLeft)
|
||||||
|
&& armorLeft is >= 0 and <= 100)
|
||||||
|
{
|
||||||
|
// Is valid armor value
|
||||||
|
this.armorLeft = armorLeft;
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrWhiteSpace(this.txtArmorAmount.Text))
|
||||||
|
{
|
||||||
|
if (armorLeft < 0)
|
||||||
|
this.txtArmorAmount.Text = "0";
|
||||||
|
else if (armorLeft > 100)
|
||||||
|
this.txtArmorAmount.Text = "100";
|
||||||
|
|
||||||
|
MessageBox.Show("The armor left should be between 0 and 100 points.", "Check armor points", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Short circuit if we don't need to calculate anything yet
|
||||||
if ((this.DrawMode == eDrawMode.Shooting && this.selectedWeapon == null) || !this.lineDrawn)
|
if ((this.DrawMode == eDrawMode.Shooting && this.selectedWeapon == null) || !this.lineDrawn)
|
||||||
{
|
{
|
||||||
if(txtResult != null && txtResultArmor != null)
|
if(txtResult != null && txtResultArmor != null)
|
||||||
|
@ -2098,7 +2181,7 @@ namespace Damage_Calculator
|
||||||
if (this.DrawMode == eDrawMode.Shooting)
|
if (this.DrawMode == eDrawMode.Shooting)
|
||||||
this.calculateAndUpdateShootingDamage();
|
this.calculateAndUpdateShootingDamage();
|
||||||
else if (this.DrawMode == eDrawMode.Bomb)
|
else if (this.DrawMode == eDrawMode.Bomb)
|
||||||
calculateAndUpdateBombDamage();
|
this.calculateAndUpdateBombDamage();
|
||||||
|
|
||||||
this.calculateDistanceDuration();
|
this.calculateDistanceDuration();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue