mirror of
https://github.com/RussellChamp/armsman.git
synced 2026-10-27 22:42:30 +00:00
First release of ArmsMan
This commit is contained in:
1 parent
0e2fec6634
commit
4eb96d99de
7 files changed
+1932
-1
No files matched your search
@@ -1,4 +1,28 @@
|
||||
armsman
|
||||
=======
|
||||
|
||||
An interactive DPS calculator for the Pathfinder system written in C++ and QT
|
||||
An interactive DPS calculator for the Pathfinder system written in C++ and QT Creator 2.6.2
|
||||
Written by Russell Champoux in February 2013
|
||||
|
||||
Purpose:
|
||||
* I initially wrote this to be able to figure out whether Vital Strike or Deadly Stroke was able to output a higher damage per second under several situations
|
||||
* Things evolved from there to support a whole lot more
|
||||
|
||||
To run:
|
||||
* Compile this yourself using QT Creator
|
||||
* Ok, I may upload some compiled binaries later
|
||||
* I haven't yet figured out how to staticly link libraries in QT so it'll look kinda ugly... and large
|
||||
|
||||
Current Functionality:
|
||||
* Calculate the expected damage of 1H/2H melee attacks or ranged attacks based on weapon and attack type
|
||||
* Supports many feats that increase damage, hit bonus, crit range, and crit confirm bonus
|
||||
* Finally answers "Which is better for me: vital strike or deadly stroke?"
|
||||
|
||||
To do:
|
||||
* Finish support for Manyshot and Rapidshot
|
||||
* Add Paladin specific feats/abilities
|
||||
* Add Rogue specific feats/abilities
|
||||
* Add Monk specific feats/abilities
|
||||
* Add Ranger specific feats/abilities
|
||||
* Add Two Weapon Fighting
|
||||
* Improve "warning" panel
|
||||
@@ -0,0 +1,16 @@
|
||||
#include "mainwindow.h"
|
||||
#include <QApplication>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
|
||||
/*
|
||||
* Known issues:
|
||||
* - attack bonuses show a '+' even when the bonus is a '-'
|
||||
*/
|
||||
+560
@@ -0,0 +1,560 @@
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
#include "qmath.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
MainWindow::calculate_stuff();
|
||||
ui->warnings->setText("Armsman has been preloaded with an example character. Change the weapon, feats, and stats then select an attack below and click 'Calculate Damage.' Please send any comments or bug reports to RussellChamp@gmail.com");
|
||||
|
||||
//Start several elements off invisible
|
||||
ui->attack_great_cleave_targets_label->setVisible(false);
|
||||
ui->attack_great_cleave_targets->setVisible(false);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
int get_hitchance(int hit_bonus, int target_ac)
|
||||
{
|
||||
//(20 + 1 + hit_bonus - target_ac) * 100 / 20
|
||||
//+1 since ties HIT
|
||||
//min 5% (crit hit), max 95% (crit miss)
|
||||
int hit_percent = qBound(5, (21 + hit_bonus - target_ac)*5, 95);
|
||||
|
||||
return hit_percent;
|
||||
}
|
||||
|
||||
int get_critchance(int hit_bonus, int crit_confirm_bonus,int crit_min, int target_ac, bool total_chance = false)
|
||||
{
|
||||
//when total_chance is set, it will return the average crit chance for *any* attack and not just successful attacks
|
||||
//successful hit rolls = the number of sides on a d20 that would result in a successful hit
|
||||
//successful hit rolls = 21 + hit_bonus - target_ac (max 19 (crit miss), min 1 (crit hit))
|
||||
int successful_hits = qBound(1, 21 + hit_bonus - target_ac, 19);
|
||||
//out of those, (21 - crit_min) will be crits (max successful hits, min should be 1)
|
||||
int crits = qBound(1, 21 - crit_min, successful_hits);
|
||||
//so the chance will be
|
||||
int crit_chance = crits * 100 / successful_hits; //of all successful hits
|
||||
|
||||
//eg. hit chance: (21 + 10 hit bonus - 21 ac) = 10 successful hits
|
||||
//eg. crit chance 19-20/x2 : 21 ac - 19 crit min = 2 crit hits
|
||||
//2 crit hits out of 10 successful hits = 20% of all successful hits are crits
|
||||
|
||||
// crit confirm: get_hitchance(hit_bonus+crit_confirm_bonus, target_ac) to confirm crit
|
||||
//eg. (21 + 10 hit bonus + 4 crit confirm bonus - 21 ac) * 100 / 20 = 70% crit confirm
|
||||
//crit_chance * crit_confirm
|
||||
//20% * 70% = 14% of all successful hits are confirmed crits
|
||||
|
||||
if(total_chance)
|
||||
return crit_chance * get_hitchance(hit_bonus + crit_confirm_bonus, target_ac) * get_hitchance(hit_bonus, target_ac) / 10000;
|
||||
else
|
||||
return crit_chance * get_hitchance(hit_bonus + crit_confirm_bonus, target_ac) / 100;
|
||||
}
|
||||
|
||||
float MainWindow::get_damage(bool crit = false)
|
||||
{
|
||||
float damage = 0;
|
||||
|
||||
//Damage multiplied by critical hits
|
||||
if(ui->feat_arcanestrike->checkState())
|
||||
damage += ui->feat_arcanestrike_bonus->value();
|
||||
if(ui->feat_weaponspecialization->checkState())
|
||||
damage += 2;
|
||||
if(ui->feat_greaterweaponspecialization->checkState())
|
||||
damage += 2;
|
||||
if(ui->feat_weapontraining->checkState())
|
||||
damage += ui->feat_weapontraining_bonus->value();
|
||||
if(ui->weapon_melee->isChecked())
|
||||
{
|
||||
if(ui->weapon_melee_twohanded->checkState())
|
||||
damage += qFloor(1.5 * ui->stat_str_mod->value());
|
||||
else
|
||||
damage += ui->stat_str_mod->value();
|
||||
if(ui->attack_type->currentText() == "Power Attack")
|
||||
{
|
||||
if(ui->weapon_melee_twohanded->checkState())
|
||||
damage += qFloor((4 + ui->attack_1_bonus->value())/4)*3;
|
||||
else
|
||||
damage += qFloor((4 + ui->attack_1_bonus->value())/4)*2;
|
||||
}
|
||||
}
|
||||
else if(ui->weapon_ranged->isChecked() && ui->weapon_ranged_composite->isChecked())
|
||||
damage += qMin(ui->weapon_ranged_composite_bonus->value(), ui->stat_str_mod->value());
|
||||
|
||||
damage += ui->weapon_bonus->value();
|
||||
damage += ui->misc_bonus_damage_crit->value();
|
||||
|
||||
//average damage for the weapon's die roll will be the number of dies rolled
|
||||
//times the average damage per die, which can be simplified to the number of
|
||||
//die sides + 1 then divided by 2
|
||||
damage += ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1)/2.0;
|
||||
|
||||
if(crit)
|
||||
{
|
||||
//multiply for crit damage
|
||||
damage *= ui->crit_multiplier->value();
|
||||
|
||||
//special damage only during crits
|
||||
if(ui->weapon_flamingburst->checkState())
|
||||
damage += qBound(1, ui->crit_multiplier->value() - 1, 3) * 5.5; //(crit multiplier - 1)d10
|
||||
if(ui->weapon_thundering->checkState())
|
||||
damage += qBound(1, ui->crit_multiplier->value() - 1, 3) * 4.5; //(crit multiplier - 1)d8
|
||||
}
|
||||
|
||||
//Damage that is NOT multiplied during a crit hit.
|
||||
if(ui->weapon_flaming->checkState())
|
||||
damage += 3.5; //1d6
|
||||
if(ui->weapon_holy->checkState())
|
||||
damage += 7; //2d6
|
||||
if(ui->weapon_vicious->checkState())
|
||||
damage += 7; //2d6
|
||||
if(ui->weapon_anarchic->checkState())
|
||||
damage += 7; //2d6
|
||||
if(ui->weapon_wounding->checkState())
|
||||
damage += 1; //1 point bleed
|
||||
damage += ui->misc_bonus_damage_noncrit->value();
|
||||
|
||||
return damage;
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_calculate_clicked()
|
||||
{
|
||||
calculate_stuff();
|
||||
}
|
||||
|
||||
void MainWindow::calculate_stuff()
|
||||
{
|
||||
get_warnings();
|
||||
|
||||
QString results = "";
|
||||
QString attack_type = ui->attack_type->currentText();
|
||||
QString weapon = "";
|
||||
QString weapon_damage = "";
|
||||
QString attacks = ""; //bonuses on each attack
|
||||
QString hit_chance = ""; //the chance each attack will hit
|
||||
QString crit_chance = ""; //the chance that a successful hit will be a crit
|
||||
QString crit_chance_all = ""; //the chance that *any* attack will be a crit
|
||||
int enemy_ac = 0;
|
||||
int attacks_num = 0; //not really used. will probably phase out
|
||||
int hit_bonus = 0; //the total to-hit bonus applied to all attacks
|
||||
|
||||
if(ui->weapon_masterwork->checkState())
|
||||
weapon.append("Masterwork ");
|
||||
if(ui->weapon_bonus->value() > 0)
|
||||
weapon.append("+" + QString::number(ui->weapon_bonus->value()) + " ");
|
||||
weapon.append(ui->weapon_name->text());
|
||||
|
||||
weapon_damage.append(" (");
|
||||
weapon_damage.append(QString::number(ui->weapon_die_count->value()) + "d" + ui->weapon_die_value->currentText() + " ");
|
||||
|
||||
int weapon_damage_bonus = 0;
|
||||
if(ui->weapon_melee->isChecked())
|
||||
{
|
||||
if(ui->weapon_melee_twohanded->checkState())
|
||||
weapon_damage_bonus += qFloor(1.5 * ui->stat_str_mod->value());
|
||||
else
|
||||
weapon_damage_bonus += ui->stat_str_mod->value();
|
||||
if(ui->attack_type->currentText() == "Power Attack")
|
||||
{
|
||||
if(ui->weapon_melee_twohanded->checkState())
|
||||
weapon_damage_bonus += qFloor((4 + ui->attack_1_bonus->value())/4)*3;
|
||||
else
|
||||
weapon_damage_bonus += qFloor((4 + ui->attack_1_bonus->value())/4)*2;
|
||||
hit_bonus -= qFloor((4 + ui->attack_1_bonus->value())/4);
|
||||
}
|
||||
}
|
||||
else if(ui->weapon_ranged->isChecked() && ui->weapon_ranged_composite->isChecked())
|
||||
{
|
||||
if(ui->stat_str_mod->value() < ui->weapon_ranged_composite_bonus->value())
|
||||
hit_bonus -= 2;
|
||||
weapon_damage_bonus += qMin(ui->weapon_ranged_composite_bonus->value(), ui->stat_str_mod->value());
|
||||
}
|
||||
|
||||
weapon_damage_bonus += ui->weapon_bonus->value();
|
||||
if(ui->feat_weaponspecialization->checkState())
|
||||
weapon_damage_bonus += 2;
|
||||
if(ui->feat_greaterweaponspecialization->checkState())
|
||||
weapon_damage_bonus += 2;
|
||||
if(ui->feat_weapontraining->checkState())
|
||||
{
|
||||
weapon_damage_bonus += ui->feat_weapontraining_bonus->value();
|
||||
hit_bonus += ui->feat_weapontraining_bonus->value();
|
||||
}
|
||||
if(ui->feat_arcanestrike->checkState())
|
||||
weapon_damage_bonus += ui->feat_arcanestrike_bonus->value();
|
||||
|
||||
weapon_damage_bonus += ui->misc_bonus_damage_crit->value() + ui->misc_bonus_damage_noncrit->value();
|
||||
weapon_damage.append("+ " + QString::number(weapon_damage_bonus));
|
||||
|
||||
if(ui->weapon_flaming->checkState())
|
||||
weapon_damage.append(" + 1d6 (Flaming)");
|
||||
if(ui->weapon_flamingburst->checkState())
|
||||
weapon_damage.append(" + " + QString::number(qBound(1, ui->crit_multiplier->value() - 1, 3)) + "d10 on crit (Burst)");
|
||||
if(ui->weapon_thundering->checkState())
|
||||
weapon_damage.append(" + " + QString::number(qBound(1, ui->crit_multiplier->value() - 1, 3)) + "d8 on crit (Thundering)");
|
||||
if(ui->weapon_holy->checkState())
|
||||
weapon_damage.append(" + 2d6 (Un/Holy)");
|
||||
if(ui->weapon_anarchic->checkState())
|
||||
weapon_damage.append(" + 2d6 (Anarchic/Axiomatic)");
|
||||
if(ui->weapon_vicious->checkState())
|
||||
weapon_damage.append(" + 2d6 (Vicious)");
|
||||
if(ui->weapon_wounding->checkState())
|
||||
weapon_damage.append(" +1 bleed (Wounding)");
|
||||
|
||||
weapon_damage.append(")");
|
||||
|
||||
enemy_ac = ui->enemy_ac->value();
|
||||
|
||||
hit_bonus += ui->misc_bonus_attack->value() + ui->weapon_bonus->value();
|
||||
if(ui->weapon_masterwork->checkState() && ui->weapon_bonus->value() == 0)
|
||||
hit_bonus++;
|
||||
if(ui->feat_weaponfocus->checkState())
|
||||
hit_bonus++;
|
||||
if(ui->feat_greaterweaponfocus->checkState())
|
||||
hit_bonus++;
|
||||
if(ui->weapon_melee->isChecked())
|
||||
{
|
||||
if(ui->feat_weaponfinesse->checkState() && ui->stat_dex_mod->value() > ui->stat_str_mod->value())
|
||||
hit_bonus += ui->stat_dex_mod->value();
|
||||
else
|
||||
hit_bonus += ui->stat_str_mod->value();
|
||||
}
|
||||
else if(ui->weapon_ranged->isChecked())
|
||||
hit_bonus += ui->stat_dex_mod->value();
|
||||
|
||||
int crit_min_bound = ui->crit_range_min->value();
|
||||
if(ui->feat_improvedcritical->checkState() || ui->weapon_keen->checkState())
|
||||
crit_min_bound = qMax(1, crit_min_bound * 2 - 21); //21 - (21 - crit_min_bound) * 2
|
||||
int crit_confirm_bonus = 0;
|
||||
if(ui->feat_criticalfocus->checkState())
|
||||
crit_confirm_bonus += 4;
|
||||
|
||||
int guidance_bonus = 0;
|
||||
if(ui->buff_guidance->isChecked()) //only works on first attack
|
||||
guidance_bonus = 1;
|
||||
|
||||
attacks.append("+" + QString::number(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus));
|
||||
hit_chance.append(QString::number(get_hitchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, enemy_ac)) + "%");
|
||||
crit_chance.append(QString::number(get_critchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
|
||||
crit_chance_all.append(QString::number(get_critchance(ui->attack_1_bonus->value() + hit_bonus + guidance_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac, true)) + "%");
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
if(attack_type == "Full Attack" && (ui->weapon_speed->isChecked() || ui->buff_haste->isChecked()))
|
||||
{
|
||||
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++;
|
||||
}
|
||||
|
||||
attacks.append("/+" + QString::number(ui->attack_2_bonus->value() + hit_bonus));
|
||||
attacks_num++;
|
||||
hit_chance.append("/" + QString::number(get_hitchance(ui->attack_2_bonus->value() + hit_bonus, enemy_ac)) + "%");
|
||||
crit_chance.append("/" + QString::number(get_critchance(ui->attack_2_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
|
||||
crit_chance_all.append("/" + QString::number(get_critchance(ui->attack_2_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac, true)) + "%");
|
||||
|
||||
if(ui->attack_3_bonus->value() > 0)
|
||||
{
|
||||
attacks.append("/+" + QString::number(ui->attack_3_bonus->value() + hit_bonus));
|
||||
attacks_num++;
|
||||
hit_chance.append("/" + QString::number(get_hitchance(ui->attack_3_bonus->value() + hit_bonus, enemy_ac)) + "%");
|
||||
crit_chance.append("/" + QString::number(get_critchance(ui->attack_3_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
|
||||
crit_chance_all.append("/" + QString::number(get_critchance(ui->attack_3_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac, true)) + "%");
|
||||
|
||||
if(ui->attack_4_bonus->value() > 0)
|
||||
{
|
||||
attacks.append("/+" + QString::number(ui->attack_4_bonus->value() + hit_bonus));
|
||||
attacks_num++;
|
||||
hit_chance.append("/" + QString::number(get_hitchance(ui->attack_4_bonus->value() + hit_bonus, enemy_ac)) + "%");
|
||||
crit_chance.append("/" + QString::number(get_critchance(ui->attack_4_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)) + "%");
|
||||
crit_chance_all.append("/" + QString::number(get_critchance(ui->attack_4_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac, true)) + "%");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
results.append("Weapon: " + weapon + weapon_damage + "\nAttack(s): " + attacks +
|
||||
"\nHit Chance: " + hit_chance + " of attacks" +
|
||||
"\nCrit Chance " + crit_chance + " of successful hits" +
|
||||
"\n " + crit_chance_all + " of all attacks" +
|
||||
"\n----- " + ui->attack_type->currentText() + " -----" +
|
||||
"\n");
|
||||
|
||||
float damage_noncrit = get_damage();
|
||||
float damage_crit = get_damage(true);
|
||||
if(attack_type == "Vital Strike")
|
||||
{
|
||||
//roll the damage dice again for the vital strike
|
||||
//TODO: figure out which (if ANY) bonuses should be multiplied for vital strike (eg the weapon damage bonus)
|
||||
//for now, I am assuming that NO bonuses are multiplied
|
||||
damage_noncrit += ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1)/2.0;
|
||||
damage_crit += ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1)/2.0;
|
||||
}
|
||||
else if(attack_type == "Improved Vital Strike")
|
||||
{
|
||||
//roll the damage dice twice more for improved vital strike
|
||||
damage_noncrit += ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1);
|
||||
damage_crit += ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1);
|
||||
}
|
||||
else if(attack_type == "Greater Vital Strike")
|
||||
{
|
||||
//roll the damage dice thrice more for greater vital strike
|
||||
damage_noncrit += 1.5 * ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1);
|
||||
damage_crit += 1.5 * ui->weapon_die_count->value() * (ui->weapon_die_value->currentText().toInt() + 1);
|
||||
}
|
||||
else if(attack_type == "Deadly Stroke")
|
||||
{
|
||||
if(!ui->feat_greaterweaponfocus->checkState())
|
||||
ui->warnings->setText("Warning: Greater Weapon Focus is required to perform Deadly Stroke");
|
||||
//deal double the normal damage. additional damage is not multiplied on a crit
|
||||
damage_crit += damage_noncrit;
|
||||
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;
|
||||
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")
|
||||
{
|
||||
if(attack_type == "Full Attack" && (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(ui->attack_2_bonus->value() > 0)
|
||||
{
|
||||
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_2_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_2_bonus->value() + hit_bonus, enemy_ac)/100.0;
|
||||
results.append("/" + QString::number(damage_expected, 'g', 4));
|
||||
damage_total += damage_expected;
|
||||
}
|
||||
if(ui->attack_3_bonus->value() > 0)
|
||||
{
|
||||
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_3_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_3_bonus->value() + hit_bonus, enemy_ac)/100.0;
|
||||
results.append("/" + QString::number(damage_expected, 'g', 4));
|
||||
damage_total += damage_expected;
|
||||
}
|
||||
if(ui->attack_4_bonus->value() > 0)
|
||||
{
|
||||
damage_expected = (damage_noncrit + (damage_crit - damage_noncrit) * get_critchance(ui->attack_4_bonus->value() + hit_bonus, crit_confirm_bonus, crit_min_bound, enemy_ac)/100.0) * get_hitchance(ui->attack_4_bonus->value() + hit_bonus, enemy_ac)/100.0;
|
||||
results.append("/" + QString::number(damage_expected, 'g', 4));
|
||||
damage_total += damage_expected;
|
||||
}
|
||||
results.append(" = " + QString::number(damage_total, 'g', 4) + " per turn\n");
|
||||
}
|
||||
else if (attack_type == "Cleave")
|
||||
{
|
||||
//cleave damage can only be attempted when the first target is hit
|
||||
float damage_cleave_expected = damage_expected * get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)/100.0;
|
||||
damage_total += damage_cleave_expected;
|
||||
results.append("/" + QString::number(damage_cleave_expected, 'g', 4) + " = " + QString::number(damage_total, 'g', 4) + " per turn\n");
|
||||
}
|
||||
else if (attack_type == "Great Cleave")
|
||||
{
|
||||
//theoretical maximum targets should be 8 (completely surrounding the player)
|
||||
//the rest of the maths should be like normal "Cleave"
|
||||
|
||||
float hitchance = get_hitchance(ui->attack_1_bonus->value() + hit_bonus, enemy_ac)/100.0;
|
||||
float damage_cleave_expected = damage_expected;
|
||||
|
||||
for(int targets_left = ui->attack_great_cleave_targets->value() - 1; targets_left > 0; --targets_left)
|
||||
{
|
||||
damage_cleave_expected *= hitchance;
|
||||
damage_total += damage_cleave_expected;
|
||||
results.append("/" + QString::number(damage_cleave_expected, 'g', 4)); //3rd target
|
||||
}
|
||||
|
||||
results.append(" = " + QString::number(damage_total, 'g', 4) + " per turn (" + QString::number(ui->attack_great_cleave_targets->value()) + " targets)\n");
|
||||
}
|
||||
else if(attack_type == "Deadly Stroke")
|
||||
{
|
||||
results.append(" + 1 Con bleed per turn");
|
||||
}
|
||||
ui->result_text->setPlainText(results);
|
||||
}
|
||||
|
||||
void MainWindow::get_warnings()
|
||||
{
|
||||
QString warning = "";
|
||||
int BAB = ui->attack_1_bonus->value();
|
||||
|
||||
if(ui->weapon_bonus->value() > 5)
|
||||
warning.append(" Weapon bonus must be <= 5");
|
||||
|
||||
if(ui->feat_weaponfocus->checkState() && BAB < 1)
|
||||
warning.append(" Weapon Focus requires BAB >= 1");
|
||||
|
||||
if(ui->feat_weaponspecialization->checkState() && BAB < 4)
|
||||
warning.append(" Weapon Specialization requires Fighter level 4");
|
||||
|
||||
if(ui->feat_weaponfocus->checkState() && BAB < 8)
|
||||
warning.append(" Weapon Focus requires Fighter level 8");
|
||||
|
||||
if(ui->feat_improvedcritical->checkState() && BAB < 8)
|
||||
warning.append(" Improved Critical requires BAB >= 8");
|
||||
|
||||
if(ui->feat_criticalfocus->checkState() && BAB < 9)
|
||||
warning.append(" Critical Focus requires BAB >= 9");
|
||||
|
||||
if(ui->feat_greaterweaponspecialization->checkState() && BAB < 12)
|
||||
warning.append(" Greater Weapon Specialization requires Fighter level 12");
|
||||
|
||||
if(! warning.isEmpty())
|
||||
{
|
||||
ui->warnings->setText("Warning: " + warning);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_arcanestrike_bonus_valueChanged(int bonus)
|
||||
{
|
||||
if(bonus == 0 && ui->feat_arcanestrike->checkState())
|
||||
{
|
||||
ui->feat_arcanestrike->click();
|
||||
}
|
||||
else if(! ui->feat_arcanestrike->checkState())
|
||||
{
|
||||
ui->feat_arcanestrike->click();
|
||||
}
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_weapontraining_bonus_valueChanged(int bonus)
|
||||
{
|
||||
if(bonus == 0 && ui->feat_weapontraining->checkState())
|
||||
{
|
||||
ui->feat_weapontraining->click();
|
||||
}
|
||||
else if(! ui->feat_weapontraining->checkState())
|
||||
{
|
||||
ui->feat_weapontraining->click();
|
||||
}
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_weaponfocus_clicked(bool checked)
|
||||
{
|
||||
if(checked == false)
|
||||
{
|
||||
if(ui->feat_greaterweaponfocus->checkState())
|
||||
ui->feat_greaterweaponfocus->click();
|
||||
if(ui->feat_weaponspecialization->checkState())
|
||||
ui->feat_weaponspecialization->click();
|
||||
if(ui->feat_greaterweaponspecialization->checkState())
|
||||
ui->feat_greaterweaponspecialization->click();
|
||||
}
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_greaterweaponfocus_clicked(bool checked)
|
||||
{
|
||||
if(checked == true && ! ui->feat_weaponfocus->checkState())
|
||||
ui->feat_weaponfocus->click();
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_weaponspecialization_clicked(bool checked)
|
||||
{
|
||||
if(checked == true &&! ui->feat_weaponfocus->checkState())
|
||||
ui->feat_weaponfocus->click();
|
||||
if(checked == false && ui->feat_greaterweaponspecialization->checkState())
|
||||
ui->feat_greaterweaponspecialization->click();
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_feat_greaterweaponspecialization_clicked(bool checked)
|
||||
{
|
||||
if(checked == true)
|
||||
{
|
||||
if(! ui->feat_weaponspecialization->checkState())
|
||||
ui->feat_weaponspecialization->click();
|
||||
if(! ui->feat_weaponfocus->checkState())
|
||||
ui->feat_weaponfocus->click();
|
||||
}
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_stat_str_mod_valueChanged()
|
||||
{
|
||||
this->get_warnings();
|
||||
}
|
||||
|
||||
void MainWindow::on_weapon_flaming_clicked(bool checked)
|
||||
{
|
||||
if(! checked && ui->weapon_flamingburst->checkState())
|
||||
ui->weapon_flamingburst->click();
|
||||
}
|
||||
|
||||
void MainWindow::on_weapon_flamingburst_clicked(bool checked)
|
||||
{
|
||||
if(checked && ! ui->weapon_flaming->checkState())
|
||||
ui->weapon_flaming->click();
|
||||
}
|
||||
|
||||
void MainWindow::on_weapon_ranged_clicked(bool checked)
|
||||
{
|
||||
if(checked)
|
||||
{
|
||||
ui->weapon_melee_modifiers->setProperty("visible", false);
|
||||
ui->weapon_keen->setChecked(false); ui->weapon_keen->setEnabled(false);
|
||||
ui->weapon_vicious->setChecked(false); ui->weapon_vicious->setEnabled(false);
|
||||
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->setCurrentIndex(1);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_weapon_melee_clicked(bool checked)
|
||||
{
|
||||
if(checked)
|
||||
{
|
||||
ui->weapon_keen->setEnabled(true);
|
||||
ui->weapon_vicious->setEnabled(true);
|
||||
ui->weapon_wounding->setEnabled(true);
|
||||
|
||||
ui->attack_type->clear();
|
||||
ui->attack_type->insertItems(0, QStringList() << "Basic Attack" << "Full Attack" << "Power Attack" << "Cleave" << "Great Cleave" <<
|
||||
"Vital Strike" << "Improved Vital Strike" << "Greater Vital Strike" << "Deadly Stroke");
|
||||
ui->attack_type->setCurrentIndex(1);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_attack_type_activated(const QString &attack_type)
|
||||
{
|
||||
if(attack_type == "Great Cleave")
|
||||
{
|
||||
ui->attack_great_cleave_targets_label->setVisible(true);
|
||||
ui->attack_great_cleave_targets->setVisible(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->attack_great_cleave_targets_label->setVisible(false);
|
||||
ui->attack_great_cleave_targets->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_about_clicked()
|
||||
{
|
||||
ui->warnings->setText("Armsman was written by Russell Champoux in February 2013 and is distributed freely\nSend comments, suggestions, bug reports/fixes, or Paypal donations to RussellChamp@gmail.com");
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
private slots:
|
||||
void on_pushButton_calculate_clicked();
|
||||
|
||||
void on_feat_arcanestrike_bonus_valueChanged(int arg1);
|
||||
|
||||
void on_feat_weaponfocus_clicked(bool checked);
|
||||
|
||||
void on_feat_greaterweaponfocus_clicked(bool checked);
|
||||
|
||||
void on_feat_weaponspecialization_clicked(bool checked);
|
||||
|
||||
void on_feat_greaterweaponspecialization_clicked(bool checked);
|
||||
|
||||
void on_feat_weapontraining_bonus_valueChanged(int arg1);
|
||||
|
||||
void on_stat_str_mod_valueChanged();
|
||||
|
||||
void on_weapon_flaming_clicked(bool checked);
|
||||
|
||||
void on_weapon_flamingburst_clicked(bool checked);
|
||||
|
||||
void on_weapon_ranged_clicked(bool checked);
|
||||
|
||||
void on_attack_type_activated(const QString &arg1);
|
||||
|
||||
void on_weapon_melee_clicked(bool checked);
|
||||
|
||||
void on_about_clicked();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
void get_warnings();
|
||||
float get_damage(bool crit);
|
||||
void calculate_stuff();
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
+1016
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,22 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2013-02-07T13:54:43
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = pathfinder_qt
|
||||
TEMPLATE = app
|
||||
|
||||
|
||||
SOURCES += main.cpp\
|
||||
mainwindow.cpp
|
||||
|
||||
HEADERS += mainwindow.h
|
||||
|
||||
FORMS += mainwindow.ui
|
||||
|
||||
CONFIG += static
|
||||
@@ -0,0 +1,239 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by Qt Creator 2.6.2, 2013-02-16T15:09:20. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||
<value type="int">0</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||
<value type="QString" key="language">Cpp</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QString" key="CurrentPreferences">CppGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||
<value type="QString" key="language">QmlJS</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||
<valuemap type="QVariantMap"/>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.0.1 MSVC2010 32bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.0.1 MSVC2010 32bit</value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">qt.501.win32_msvc2010.essentials_kit</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">D:/code/pathfinder_qt-build-Desktop_Qt_5_0_1_MSVC2010_32bit-Debug</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">D:/code/pathfinder_qt-build-Desktop_Qt_5_0_1_MSVC2010_32bit-Release</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||
<value type="bool" key="Analyzer.Project.UseGlobal">true</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||
<value type="int">0</value>
|
||||
<value type="int">1</value>
|
||||
<value type="int">2</value>
|
||||
<value type="int">3</value>
|
||||
<value type="int">4</value>
|
||||
<value type="int">5</value>
|
||||
<value type="int">6</value>
|
||||
<value type="int">7</value>
|
||||
<value type="int">8</value>
|
||||
<value type="int">9</value>
|
||||
<value type="int">10</value>
|
||||
<value type="int">11</value>
|
||||
<value type="int">12</value>
|
||||
<value type="int">13</value>
|
||||
<value type="int">14</value>
|
||||
</valuelist>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">pathfinder_qt</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QByteArray" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/code/pathfinder_qt/pathfinder_qt.pro</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase">2</value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">pathfinder_qt.pro</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">false</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
|
||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||
<value type="int">1</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
|
||||
<value type="QString">{76aec380-7396-4583-b1b8-0d3d822cf163}</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||
<value type="int">12</value>
|
||||
</data>
|
||||
</qtcreator>
|
||||
Reference in new issue
Block a user