From 7918125761091945f603034e7105637def5a82c9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 6 Jun 2015 03:04:46 -0400 Subject: [PATCH] Introduce additional monster missile types to better preserve the AP cost of the original monster abilities --- src/boe.combat.cpp | 6 ++++-- src/classes/monster.cpp | 17 ++++++++++++----- src/classes/monster.h | 2 +- src/scenedit/scen.core.cpp | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/boe.combat.cpp b/src/boe.combat.cpp index 8f691c7e..ab9342bf 100644 --- a/src/boe.combat.cpp +++ b/src/boe.combat.cpp @@ -2427,7 +2427,7 @@ void do_monster_turn() { pick_abil,cur_monst->cur_loc,&univ.get_target(target)); if(pick_abil.first == eMonstAbil::MISSILE) { if(pick_abil.second.missile.type == eMonstMissile::ARROW || pick_abil.second.missile.type == eMonstMissile::BOLT - || pick_abil.second.missile.type == eMonstMissile::SPINE) + || pick_abil.second.missile.type == eMonstMissile::SPINE || pick_abil.second.missile.type == eMonstMissile::BOULDER) take_m_ap(3,cur_monst); else take_m_ap(2,cur_monst); } else if(pick_abil.first == eMonstAbil::RAY_HEAT) @@ -2931,6 +2931,7 @@ void monst_fire_missile(short m_num,short bless,std::pair a switch(abil.second.missile.type) { case eMonstMissile::ARROW: case eMonstMissile::BOLT: + case eMonstMissile::RAPID_ARROW: snd = 12; if(pc_target != nullptr) add_string_to_buf(" Shoots at " + pc_target->name + '.'); @@ -2962,6 +2963,7 @@ void monst_fire_missile(short m_num,short bless,std::pair a m_target->spell_note(53); break; case eMonstMissile::ROCK: + case eMonstMissile::BOULDER: if(pc_target != nullptr) add_string_to_buf(" Throws rock at " + pc_target->name + '.'); else if(m_target != nullptr) @@ -2974,7 +2976,7 @@ void monst_fire_missile(short m_num,short bless,std::pair a m_target->spell_note(54); break; } - if(abil.second.missile.type == eMonstMissile::ARROW || abil.second.missile.type == eMonstMissile::BOLT) + if(abil.second.missile.type == eMonstMissile::ARROW || abil.second.missile.type == eMonstMissile::RAPID_ARROW || abil.second.missile.type == eMonstMissile::BOLT) snd = 12; if(abil.second.missile.pic < 0) play_sound(snd); else run_a_missile(source, targ_space, abil.second.missile.pic, 1, snd, 0, 0, 100); diff --git a/src/classes/monster.cpp b/src/classes/monster.cpp index cf6c3929..06bf04db 100644 --- a/src/classes/monster.cpp +++ b/src/classes/monster.cpp @@ -150,13 +150,13 @@ std::map::iterator cMonster::addAbil(eMonstAbilTemplate wha abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::SPEAR, 5, 3, 7, 6, 8, 625}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::THROWS_ROCKS1: - abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::ROCK, 12, 4, 7, 8, 10, 625}; + abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::BOULDER, 12, 4, 7, 8, 10, 625}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::THROWS_ROCKS2: - abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::ROCK, 12, 6, 7, 12, 10, 500}; + abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::BOULDER, 12, 6, 7, 12, 10, 500}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::THROWS_ROCKS3: - abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::ROCK, 12, 8, 7, 16, 10, 500}; + abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::BOULDER, 12, 8, 7, 16, 10, 500}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::THROWS_RAZORDISKS: abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::RAZORDISK, 7, 7, 7, 14, 8, 625}; @@ -165,7 +165,7 @@ std::map::iterator cMonster::addAbil(eMonstAbilTemplate wha abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::KNIFE, 10, 2, 7, 2, 6, 500}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::GOOD_ARCHER: - abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::ARROW, 3, 8, 7, 16, 10, 875}; + abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::RAPID_ARROW, 3, 8, 7, 16, 10, 875}; return abil.find(eMonstAbil::MISSILE); case eMonstAbilTemplate::SHOOTS_SPINES: abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::SPINE, 5, 6, 7, 12, 9, 625}; @@ -628,6 +628,7 @@ std::istream& operator>>(std::istream& in, eDirection& dir) { return in; } +// TODO: Turn all of these into symbolic enumerators! std::ostream& operator << (std::ostream& out, eFieldType e) { return out << (int)e; } @@ -701,7 +702,7 @@ std::ostream& operator << (std::ostream& out, eMonstMissile e) { std::istream& operator >> (std::istream& in, eMonstMissile& e) { int i; in >> i; - if(i >= 0 && i <= int(eMonstMissile::BOLT)) + if(i >= 0 && i <= int(eMonstMissile::RAPID_ARROW)) e = (eMonstMissile)i; else e = eMonstMissile::ARROW; return in; @@ -732,6 +733,9 @@ std::string uAbility::to_string(eMonstAbil key) const { case eMonstMissile::ARROW: sout << "Shoots arrows (" << missile.dice << 'd' << missile.sides << ')'; break; + case eMonstMissile::RAPID_ARROW: + sout << "Good archer (" << missile.dice << 'd' << missile.sides << ')'; + break; case eMonstMissile::BOLT: sout << "Shoots bolts (" << missile.dice << 'd' << missile.sides << ')'; break; @@ -739,6 +743,9 @@ std::string uAbility::to_string(eMonstAbil key) const { sout << "Throws spears (" << missile.dice << 'd' << missile.sides << ')'; break; case eMonstMissile::ROCK: + sout << "Throws stones (" << missile.dice << 'd' << missile.sides << ')'; + break; + case eMonstMissile::BOULDER: sout << "Throws rocks (" << missile.dice << 'd' << missile.sides << ')'; break; case eMonstMissile::RAZORDISK: diff --git a/src/classes/monster.h b/src/classes/monster.h index a955833b..5b991aaf 100644 --- a/src/classes/monster.h +++ b/src/classes/monster.h @@ -50,7 +50,7 @@ enum class eMonstAbilTemplate { enum class eMonstMelee {SWING, CLAW, BITE, SLIME, PUNCH, STING, CLUB, BURN, HARM, STAB}; -enum class eMonstMissile {DART, ARROW, SPEAR, ROCK, RAZORDISK, SPINE, KNIFE, BOLT}; +enum class eMonstMissile {DART, ARROW, SPEAR, ROCK, RAZORDISK, SPINE, KNIFE, BOLT, BOULDER, RAPID_ARROW}; enum class eMonstGen {RAY, TOUCH, GAZE, BREATH, SPIT}; diff --git a/src/scenedit/scen.core.cpp b/src/scenedit/scen.core.cpp index c7619b9c..2218d8d8 100644 --- a/src/scenedit/scen.core.cpp +++ b/src/scenedit/scen.core.cpp @@ -968,7 +968,7 @@ static void fill_monst_abil_detail(cDialog& me, cMonster& monst, eMonstAbil abil me["type"].setText(get_str("monster-abilities", 79 + int(abil))); // Action points if(cat == eMonstAbilCat::MISSILE) { - if(detail.missile.type == eMonstMissile::ARROW || detail.missile.type == eMonstMissile::BOLT || detail.missile.type == eMonstMissile::SPINE) + if(detail.missile.type == eMonstMissile::ARROW || detail.missile.type == eMonstMissile::BOLT || detail.missile.type == eMonstMissile::SPINE || detail.missile.type == eMonstMissile::RAPID_ARROW) me["ap"].setTextToNum(3); else me["ap"].setTextToNum(2); } else if(cat == eMonstAbilCat::GENERAL) {