Finished Rapid Shot and Manyshot

This commit is contained in:
RussellChamp committed 2013-02-27 00:18:57 -05:00
1 parent 37c946f299
commit e8d58b8326
2 files changed
+108 -23

No files matched your search

+61 -14
View File
@@ -117,6 +117,8 @@ float MainWindow::get_damage(bool crit = false)
damage += 7; //2d6
if(ui->weapon_wounding->checkState())
damage += 1; //1 point bleed
if(ui->feat_sneakattack->isChecked())
damage += ui->feat_sneak_attack_bonus->value() * 3.5; //sneak bonus d6
damage += ui->misc_bonus_damage_noncrit->value();
return damage;
@@ -203,8 +205,12 @@ void MainWindow::calculate_stuff()
weapon_damage.append(" + 2d6 (Anarchic/Axiomatic)");
if(ui->weapon_vicious->checkState())
weapon_damage.append(" + 2d6 (Vicious)");
if(ui->feat_sneakattack->isChecked())
weapon_damage.append(" + " + QString::number(ui->feat_sneak_attack_bonus->value()) + "d6 (Sneak Attack)");
if(ui->weapon_wounding->checkState())
weapon_damage.append(" +1 bleed (Wounding)");
weapon_damage.append(" +1 bleed (Wounding, stacks)");
if(ui->feat_bleedingattack->isChecked())
weapon_damage.append(" + " + QString::number(ui->feat_sneak_attack_bonus->value()) + " bleed (Bleeding Attack)");
weapon_damage.append(")");
@@ -234,6 +240,12 @@ void MainWindow::calculate_stuff()
if(ui->feat_criticalfocus->checkState())
crit_confirm_bonus += 4;
if(ui->buff_haste->isChecked())
hit_bonus += 1;
if(attack_type == "Rapid Shot")
hit_bonus -= 2;
int guidance_bonus = 0;
if(ui->buff_guidance->isChecked()) //only works on first attack
guidance_bonus = 1;
@@ -247,10 +259,18 @@ void MainWindow::calculate_stuff()
attacks_num++;
if((attack_type == "Full Attack" || attack_type == "Power Attack" || attack_type == "Vital Strike" || attack_type == "Improved Vital Strike"
|| attack_type == "Greater Vital Strike") && ui->attack_2_bonus->value() > 0)
|| attack_type == "Greater Vital Strike" || attack_type == "Rapid Shot" || attack_type == "Manyshot") && ui->attack_2_bonus->value() > 0)
{
if(attack_type == "Full Attack" && (ui->weapon_speed->isChecked() || ui->buff_haste->isChecked()))
{
if((attack_type == "Full Attack" || attack_type == "Manyshot") && (ui->weapon_speed->isChecked() || ui->buff_haste->isChecked()))
{ //perform an extra attack during "Full Attack" or "Manyshot" when you either have a weapon with speed or are haste'd
attacks.append("/+" + QString::number(ui->attack_1_bonus->value() + hit_bonus));
hit_chance.append("/" + QString::number(get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)) + "%");
crit_chance.append("/" + QString::number(get_critchance(ui->attack_1_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
crit_chance_all.append("/" + QString::number(get_critchance(ui->attack_1_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac, true)) + "%");
attacks_num++;
}
if(attack_type == "Rapid Shot")
{ //perform an extra attack when using "Manyshot"
attacks.append("/+" + QString::number(ui->attack_1_bonus->value() + hit_bonus));
hit_chance.append("/" + QString::number(get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)) + "%");
crit_chance.append("/" + QString::number(get_critchance(ui->attack_1_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
@@ -293,6 +313,10 @@ void MainWindow::calculate_stuff()
float damage_noncrit = get_damage();
float damage_crit = get_damage(true);
float manyshot_bonus = 0;
float damage_expected = 0;
float damage_total = 0;
if(attack_type == "Vital Strike")
{
//roll the damage dice again for the vital strike
@@ -322,19 +346,42 @@ void MainWindow::calculate_stuff()
damage_noncrit *= 2;
}
results.append("Average damage (non-crit): " + QString::number(damage_noncrit, 'g', 4) +
"\nAverage damage (crit): " + QString::number(damage_crit, 'g', 4) +
"\n");
//Expected damage per turn = (average non-crit damage + bonus crit damage * chance to crit)* chance to hit
// = (non-crit + (crit - non-crit) * crit chance) * hit chance
float damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, enemy_ac)/100.0;
float damage_total = damage_expected;
if(attack_type == "Manyshot")
{
if(ui->stat_dex_mod->value() < 3)
ui->warnings->setText("Warning: Manyshot requires a dex of at least 17");
manyshot_bonus = damage_noncrit;
if(ui->feat_sneakattack->isChecked())
manyshot_bonus -= 3.5 * ui->feat_sneak_attack_bonus->value(); //sneak is only counted once
results.append("Average damage (non-crit): " + QString::number(damage_noncrit + manyshot_bonus, 'g', 4) + " (first shot) / " + QString::number(damage_noncrit, 'g', 4) + " (other shots)" +
"\nAverage damage (crit): " + QString::number(damage_crit + manyshot_bonus, 'g', 4) + " (first shot) / " + QString::number(damage_crit, 'g', 4) + " (other shots)" +
"\n");
damage_expected = (damage_noncrit + manyshot_bonus + (damage_crit - damage_noncrit) * get_critchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, enemy_ac)/100.0;
}
else
{
results.append("Average damage (non-crit): " + QString::number(damage_noncrit, 'g', 4) +
"\nAverage damage (crit): " + QString::number(damage_crit, 'g', 4) +
"\n");
//Expected damage per turn = (average non-crit damage + bonus crit damage * chance to crit)* chance to hit
// = (non-crit + (crit - non-crit) * crit chance) * hit chance
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, enemy_ac)/100.0;
}
damage_total = damage_expected;
results.append("Expected damage: " + QString::number(damage_expected, 'g', 4));
if(attack_type == "Full Attack" || attack_type == "Power Attack" || attack_type == "Vital Strike" || attack_type == "Improved Vital Strike"
|| attack_type == "Greater Vital Strike")
|| attack_type == "Greater Vital Strike" || attack_type == "Rapid Shot" || attack_type == "Manyshot")
{
if(attack_type == "Full Attack" && (ui->weapon_speed->isChecked() || ui->buff_haste->isChecked()))
if((attack_type == "Full Attack" || attack_type == "Rapid Shot") && (ui->weapon_speed->isChecked() || ui->buff_haste->isChecked()))
{
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_1_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)/100.0;
results.append("/" + QString::number(damage_expected, 'g', 4));
damage_total += damage_expected;
}
if(attack_type == "Rapid Shot")
{
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_1_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)/100.0;
results.append("/" + QString::number(damage_expected, 'g', 4));
@@ -519,7 +566,7 @@ void MainWindow::on_weapon_ranged_clicked(bool checked)
ui->weapon_wounding->setChecked(false); ui->weapon_wounding->setEnabled(false);
ui->attack_type->clear();
ui->attack_type->insertItems(0, QStringList() << "Basic Attack" << "Full Attack" << "Rapid Shot" << "Many Shot");
ui->attack_type->insertItems(0, QStringList() << "Basic Attack" << "Full Attack" << "Rapid Shot" << "Manyshot");
ui->attack_type->setCurrentIndex(1);
}
}
+47 -9
View File
@@ -623,8 +623,8 @@ Shocking Burst</string>
<rect>
<x>20</x>
<y>30</y>
<width>713</width>
<height>131</height>
<width>762</width>
<height>151</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
@@ -645,13 +645,6 @@ Shocking Burst</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="feat_greaterweaponfocus">
<property name="text">
<string>Greater Weapon Focus</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="feat_weaponspecialization">
<property name="text">
@@ -669,6 +662,13 @@ Shocking Burst</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="feat_greaterweaponfocus">
<property name="text">
<string>Greater Weapon Focus</string>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
@@ -751,6 +751,44 @@ Shocking Burst</string>
</property>
</widget>
</item>
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="feat_sneakattack">
<property name="text">
<string>Sneak Attack (+</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="feat_sneak_attack_bonus">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_25">
<property name="text">
<string>d6)</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="feat_bleedingattack">
<property name="text">
<string>Bleeding Attack</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>