Introduce additional monster missile types to better preserve the AP cost of the original monster abilities
This commit is contained in:
@@ -2427,7 +2427,7 @@ void do_monster_turn() {
|
|||||||
pick_abil,cur_monst->cur_loc,&univ.get_target(target));
|
pick_abil,cur_monst->cur_loc,&univ.get_target(target));
|
||||||
if(pick_abil.first == eMonstAbil::MISSILE) {
|
if(pick_abil.first == eMonstAbil::MISSILE) {
|
||||||
if(pick_abil.second.missile.type == eMonstMissile::ARROW || pick_abil.second.missile.type == eMonstMissile::BOLT
|
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);
|
take_m_ap(3,cur_monst);
|
||||||
else take_m_ap(2,cur_monst);
|
else take_m_ap(2,cur_monst);
|
||||||
} else if(pick_abil.first == eMonstAbil::RAY_HEAT)
|
} else if(pick_abil.first == eMonstAbil::RAY_HEAT)
|
||||||
@@ -2931,6 +2931,7 @@ void monst_fire_missile(short m_num,short bless,std::pair<eMonstAbil,uAbility> a
|
|||||||
switch(abil.second.missile.type) {
|
switch(abil.second.missile.type) {
|
||||||
case eMonstMissile::ARROW:
|
case eMonstMissile::ARROW:
|
||||||
case eMonstMissile::BOLT:
|
case eMonstMissile::BOLT:
|
||||||
|
case eMonstMissile::RAPID_ARROW:
|
||||||
snd = 12;
|
snd = 12;
|
||||||
if(pc_target != nullptr)
|
if(pc_target != nullptr)
|
||||||
add_string_to_buf(" Shoots at " + pc_target->name + '.');
|
add_string_to_buf(" Shoots at " + pc_target->name + '.');
|
||||||
@@ -2962,6 +2963,7 @@ void monst_fire_missile(short m_num,short bless,std::pair<eMonstAbil,uAbility> a
|
|||||||
m_target->spell_note(53);
|
m_target->spell_note(53);
|
||||||
break;
|
break;
|
||||||
case eMonstMissile::ROCK:
|
case eMonstMissile::ROCK:
|
||||||
|
case eMonstMissile::BOULDER:
|
||||||
if(pc_target != nullptr)
|
if(pc_target != nullptr)
|
||||||
add_string_to_buf(" Throws rock at " + pc_target->name + '.');
|
add_string_to_buf(" Throws rock at " + pc_target->name + '.');
|
||||||
else if(m_target != nullptr)
|
else if(m_target != nullptr)
|
||||||
@@ -2974,7 +2976,7 @@ void monst_fire_missile(short m_num,short bless,std::pair<eMonstAbil,uAbility> a
|
|||||||
m_target->spell_note(54);
|
m_target->spell_note(54);
|
||||||
break;
|
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;
|
snd = 12;
|
||||||
if(abil.second.missile.pic < 0) play_sound(snd);
|
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);
|
else run_a_missile(source, targ_space, abil.second.missile.pic, 1, snd, 0, 0, 100);
|
||||||
|
@@ -150,13 +150,13 @@ std::map<eMonstAbil,uAbility>::iterator cMonster::addAbil(eMonstAbilTemplate wha
|
|||||||
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::SPEAR, 5, 3, 7, 6, 8, 625};
|
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::SPEAR, 5, 3, 7, 6, 8, 625};
|
||||||
return abil.find(eMonstAbil::MISSILE);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::THROWS_ROCKS1:
|
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);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::THROWS_ROCKS2:
|
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);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::THROWS_ROCKS3:
|
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);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::THROWS_RAZORDISKS:
|
case eMonstAbilTemplate::THROWS_RAZORDISKS:
|
||||||
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::RAZORDISK, 7, 7, 7, 14, 8, 625};
|
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::RAZORDISK, 7, 7, 7, 14, 8, 625};
|
||||||
@@ -165,7 +165,7 @@ std::map<eMonstAbil,uAbility>::iterator cMonster::addAbil(eMonstAbilTemplate wha
|
|||||||
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::KNIFE, 10, 2, 7, 2, 6, 500};
|
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::KNIFE, 10, 2, 7, 2, 6, 500};
|
||||||
return abil.find(eMonstAbil::MISSILE);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::GOOD_ARCHER:
|
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);
|
return abil.find(eMonstAbil::MISSILE);
|
||||||
case eMonstAbilTemplate::SHOOTS_SPINES:
|
case eMonstAbilTemplate::SHOOTS_SPINES:
|
||||||
abil[eMonstAbil::MISSILE].missile = {true, eMonstMissile::SPINE, 5, 6, 7, 12, 9, 625};
|
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;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Turn all of these into symbolic enumerators!
|
||||||
std::ostream& operator << (std::ostream& out, eFieldType e) {
|
std::ostream& operator << (std::ostream& out, eFieldType e) {
|
||||||
return out << (int)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) {
|
std::istream& operator >> (std::istream& in, eMonstMissile& e) {
|
||||||
int i;
|
int i;
|
||||||
in >> i;
|
in >> i;
|
||||||
if(i >= 0 && i <= int(eMonstMissile::BOLT))
|
if(i >= 0 && i <= int(eMonstMissile::RAPID_ARROW))
|
||||||
e = (eMonstMissile)i;
|
e = (eMonstMissile)i;
|
||||||
else e = eMonstMissile::ARROW;
|
else e = eMonstMissile::ARROW;
|
||||||
return in;
|
return in;
|
||||||
@@ -732,6 +733,9 @@ std::string uAbility::to_string(eMonstAbil key) const {
|
|||||||
case eMonstMissile::ARROW:
|
case eMonstMissile::ARROW:
|
||||||
sout << "Shoots arrows (" << missile.dice << 'd' << missile.sides << ')';
|
sout << "Shoots arrows (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
break;
|
break;
|
||||||
|
case eMonstMissile::RAPID_ARROW:
|
||||||
|
sout << "Good archer (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
|
break;
|
||||||
case eMonstMissile::BOLT:
|
case eMonstMissile::BOLT:
|
||||||
sout << "Shoots bolts (" << missile.dice << 'd' << missile.sides << ')';
|
sout << "Shoots bolts (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
break;
|
break;
|
||||||
@@ -739,6 +743,9 @@ std::string uAbility::to_string(eMonstAbil key) const {
|
|||||||
sout << "Throws spears (" << missile.dice << 'd' << missile.sides << ')';
|
sout << "Throws spears (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
break;
|
break;
|
||||||
case eMonstMissile::ROCK:
|
case eMonstMissile::ROCK:
|
||||||
|
sout << "Throws stones (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
|
break;
|
||||||
|
case eMonstMissile::BOULDER:
|
||||||
sout << "Throws rocks (" << missile.dice << 'd' << missile.sides << ')';
|
sout << "Throws rocks (" << missile.dice << 'd' << missile.sides << ')';
|
||||||
break;
|
break;
|
||||||
case eMonstMissile::RAZORDISK:
|
case eMonstMissile::RAZORDISK:
|
||||||
|
@@ -50,7 +50,7 @@ enum class eMonstAbilTemplate {
|
|||||||
|
|
||||||
enum class eMonstMelee {SWING, CLAW, BITE, SLIME, PUNCH, STING, CLUB, BURN, HARM, STAB};
|
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};
|
enum class eMonstGen {RAY, TOUCH, GAZE, BREATH, SPIT};
|
||||||
|
|
||||||
|
@@ -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)));
|
me["type"].setText(get_str("monster-abilities", 79 + int(abil)));
|
||||||
// Action points
|
// Action points
|
||||||
if(cat == eMonstAbilCat::MISSILE) {
|
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);
|
me["ap"].setTextToNum(3);
|
||||||
else me["ap"].setTextToNum(2);
|
else me["ap"].setTextToNum(2);
|
||||||
} else if(cat == eMonstAbilCat::GENERAL) {
|
} else if(cat == eMonstAbilCat::GENERAL) {
|
||||||
|
Reference in New Issue
Block a user