aboutsummaryrefslogtreecommitdiff
path: root/src/creature.cc
diff options
context:
space:
mode:
authorYour Name <you@example.com>2021-06-12 15:32:53 -0400
committerYour Name <you@example.com>2021-06-12 15:32:53 -0400
commit01293baa64fa905c5763020bd6c0b4903d41fc78 (patch)
tree4c49a63852fd84ead388a8fd092d64d2df7f9e1b /src/creature.cc
parentb27700a7e0b281ece3dea23060c17e0cae28715d (diff)
downloaddmtool-01293baa64fa905c5763020bd6c0b4903d41fc78.tar.gz
dmtool-01293baa64fa905c5763020bd6c0b4903d41fc78.tar.bz2
dmtool-01293baa64fa905c5763020bd6c0b4903d41fc78.zip
Verified some creature attacks
Diffstat (limited to 'src/creature.cc')
-rw-r--r--src/creature.cc28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/creature.cc b/src/creature.cc
index 5130362..6069285 100644
--- a/src/creature.cc
+++ b/src/creature.cc
@@ -78,6 +78,10 @@ namespace creature {
for(int i = 0; i < data->hit_die_count; i++) {
data->hpMax += dice::roll(data->hit_die_sides);
}
+ // If less than zero (caused by negative con bonus), set to minimum of 1
+ if(data->hpMax <= 0) {
+ data->hpMax = 1;
+ }
data->hp = data->hpMax;
}
}
@@ -227,10 +231,20 @@ namespace creature {
data->hp = data->hpMax;
}
+ int getShieldBonus(const Creature& c) {
+ for(auto a : utils::castPtrs<entry::Item, entry::Armor>(c.getInventory())) {
+ if(a->getArmorType() == "shield") {
+ return a->getACBonus();
+ }
+ }
+ return 0;
+ }
+
const int getAC(const Creature& c) {
auto natArmor = c.getNaturalArmor();
if(! natArmor.name.empty()) {
- return natArmor.bonus;
+ // Shields stack with nat armor (see lizardfolk)
+ return natArmor.bonus + getShieldBonus(c);
}
int dex = c.getBonus(rules::Ability::Dex());
int baseBonus = 10 + dex;
@@ -240,7 +254,7 @@ namespace creature {
continue;
}
auto armorType = a->getArmorType();
- if(armorType== "misc" || armorType == "shield") {
+ if(armorType == "misc" || armorType == "shield") {
miscBonus += a->getACBonus();
} else {
baseBonus = a->getACBonus();
@@ -296,7 +310,11 @@ namespace creature {
std::stringstream text;
text << getGivenName() << " (" << getCreatureName() << "): " << getHP() << "/" << getHPMax() << " hp, " << getAC(*this) << " ac";
if(! getNaturalArmor().name.empty()) {
- text << " (" << getNaturalArmor().name << ")";
+ text << " (" << getNaturalArmor().name;
+ if(getShieldBonus(*this) != 0) {
+ text << ", shield";
+ }
+ text << ")";
} else {
std::string armor = utils::join(mapItems(utils::castPtrs<entry::Item, entry::Armor>(getInventory())), ", ");
if(! armor.empty()) {
@@ -318,9 +336,9 @@ namespace creature {
text << std::endl;
text << "Senses: ";
if(! getSenses().empty()) {
- text << utils::join(getSenses(), ", ") << ". ";
+ text << utils::join(getSenses(), ", ") << ", ";
}
- text << "Passive Perception " << 10 + getSkillBonus(rules::Skill::Perception()) << std::endl;
+ text << "Passive Perception " << 10 + getSkillBonus(rules::Skill::Perception()) + (data->observant? 5 : 0) << std::endl;
if(! getLanguages().empty()) {
text << "Languages: " << getLanguages() << std::endl;
}