Tweak Vahnatai PC traits and add Magery item ability

- Vahnatai no longer have a bonus to mage spells (that's now the Magery item ability)
- Vahnatai XP gain bonus changed
- Fix sliths being noted as resistant to poison (they aren't and never have been)
This commit is contained in:
2015-10-03 23:55:52 -04:00
parent 8afd3825b0
commit d908cdff9c
10 changed files with 17 additions and 18 deletions

View File

@@ -155,10 +155,8 @@ otherwise, it's equal to one-half the Ability Strength.</dd>
<dt>Ability 31 - Full Protection</dt>
<dd>This partially blocks weapon and spell damage the wielder takes. It also protects from
poison.</dd>
<dt>Ability 32 - Melee Protection</dt>
<dd>This item behaves as armour even if it isn't. It reduces damage by a die with the
number of sides specified in Ability Strength. If the item is armour, this is on top of
the normal damage reduction of the armour.</dd>
<dt>Ability 32 - Magery</dt>
<dd>This item makes your mage spells stronger.</dd>
<dt>Ability 33 - Evasion</dt>
<dd>This reduces the chance of enemies hitting you with melee attacks and non-magical
missiles. The Ability Strength determines how much less likely they are to hit, as a

View File

@@ -176,13 +176,12 @@ Sliths in Exile. Some of them are friendly and allied with your people, and some
are cruel and barbaric, and fight you whenever they get the chance. Slithzerikai are
trained from birth to use pole weapons, and get a sizable bonus when attacking with them.
Also, when character creation is completed, each Slithzerikai character gains 2 bonus
points of strength and 1 bonus point of intelligence. Finally, Slithzerikai are resistant
to poison.</dd>
<dt>Vahnatai (-5%)</dt>
points of strength and 1 bonus point of intelligence.</dd>
<dt>Vahnatai (18%)</dt>
<dd>The Vahnatai are an ancient race of spindly, grey-skinned humanoids that periodically
enter a dormant state to allow the caves to regenerate. They are strong in magic, but tend
to be weak physically, though there are exceptions. They have a penalty to strength and
can't carry as much as other characters, but gain a bonus when casting mage spells. Also,
can't carry as much as other characters. Also,
when character creation is completed, each Vahnatai character gains 2 bonus points of
intelligence and 2 bonus 4th-level spells, Capture Soul and Simulacrum.
</dl>

View File

@@ -11,7 +11,7 @@
<led name='race1' top='53' left='55' width='90'>Human (0%)</led>
<led name='race2' top='53' left='170' width='90'>Nephilim (12%)</led>
<led name='race3' top='53' left='285' width='90'>Slithzerikai (20%)</led>
<led name='race4' top='53' left='400' width='90'>Vahnatai (-5%)</led>
<led name='race4' top='53' left='400' width='90'>Vahnatai (18%)</led>
</group>
<text size='large' top='74' left='55' width='126' height='16'>Advantages:</text>
<led name='good1' top='95' left='55' width='126'>Toughness (10%)</led>

View File

@@ -29,7 +29,7 @@ Call special when attacking
Protection from damage type
Full protection
Unused
Magery
Evasion
Martyr's shield
Awkward weapon

View File

@@ -1039,7 +1039,7 @@ void do_combat_cast(location target) {
else {
level = 1 + caster.level / 2;
bonus = caster.stat_adj(eSkill::INTELLIGENCE);
if(caster.race == eRace::VAHNATAI && !(*spell_being_cast).is_priest())
if((*spell_being_cast).level <= caster.get_prot_level(eItemAbil::MAGERY))
level++;
if(caster.traits[eTrait::ANAMA] && (*spell_being_cast).is_priest())
level++;
@@ -4785,7 +4785,7 @@ void combat_immed_mage_cast(short current_pc, eSpell spell_num, bool freebie) {
miss_num_t store_m_type = 0;
short bonus = freebie ? 1 : univ.party[current_pc].stat_adj(eSkill::INTELLIGENCE);
short level = freebie ? store_item_spell_level : univ.party[current_pc].level;
if(!freebie && univ.party[current_pc].race == eRace::VAHNATAI)
if(!freebie && (*spell_num).level <= univ.party[current_pc].get_prot_level(eItemAbil::MAGERY))
level++;
cCreature* which_m;
start_missile_anim();

View File

@@ -712,7 +712,7 @@ void do_mage_spell(short pc_num,eSpell spell_num,bool freebie) {
adj = freebie ? 1 : univ.party[pc_num].stat_adj(eSkill::INTELLIGENCE);
short level = freebie ? store_item_spell_level : univ.party[pc_num].level;
if(!freebie && univ.party[pc_num].race == eRace::VAHNATAI)
if(!freebie && (*spell_num).level <= univ.party[pc_num].get_prot_level(eItemAbil::MAGERY))
level++;
switch(spell_num) {
@@ -1340,7 +1340,7 @@ void cast_town_spell(location where) {
ter = univ.town->terrain(where.x,where.y);
short adj = spell_freebie ? 1 : univ.party[who_cast].stat_adj(eSkill::INTELLIGENCE);
short level = spell_freebie ? store_item_spell_level : univ.party[who_cast].level;
if(!spell_freebie && univ.party[who_cast].race == eRace::VAHNATAI && !(*town_spell).is_priest())
if(!spell_freebie && (*town_spell).level <= univ.party[who_cast].get_prot_level(eItemAbil::MAGERY) && !(*town_spell).is_priest())
level++;
if(!spell_freebie && univ.party[who_cast].traits[eTrait::ANAMA] && (*town_spell).is_priest())
level++;

View File

@@ -1171,7 +1171,7 @@ void use_item(short pc,short item) {
case eItemAbil::EXPLODING_WEAPON: case eItemAbil::FREE_ACTION: case eItemAbil::FULL_PROTECTION: case eItemAbil::WILL:
case eItemAbil::GIANT_STRENGTH: case eItemAbil::GRAYMOLD: case eItemAbil::HEALING_WEAPON: case eItemAbil::HEAVIER_OBJECT:
case eItemAbil::HIT_CALL_SPECIAL: case eItemAbil::HOLLY: case eItemAbil::LIFE_SAVING: case eItemAbil::LIGHTER_OBJECT:
case eItemAbil::LOCKPICKS: case eItemAbil::MANDRAKE: case eItemAbil::MARTYRS_SHIELD: case eItemAbil::UNUSED2:
case eItemAbil::LOCKPICKS: case eItemAbil::MANDRAKE: case eItemAbil::MARTYRS_SHIELD: case eItemAbil::MAGERY:
case eItemAbil::NETTLE: case eItemAbil::NONE: case eItemAbil::OCCASIONAL_STATUS: case eItemAbil::POISON_AUGMENT:
case eItemAbil::PROTECT_FROM_PETRIFY: case eItemAbil::PROTECT_FROM_SPECIES: case eItemAbil::RADIANT:
case eItemAbil::REGENERATE: case eItemAbil::RESURRECTION_BALM: case eItemAbil::RETURNING_MISSILE: case eItemAbil::SAPPHIRE:

View File

@@ -965,7 +965,7 @@ std::string cItem::getAbilName() const {
bool party = abil_group();
std::ostringstream sout;
switch(ability) {
case eItemAbil::UNUSED: case eItemAbil::UNUSED2: break; // Invalid
case eItemAbil::UNUSED: break; // Invalid
case eItemAbil::NONE: sout << "No ability"; break;
case eItemAbil::HEALING_WEAPON: sout << "Heals target"; break;
case eItemAbil::RETURNING_MISSILE: sout << "Returning missile"; break;
@@ -986,6 +986,7 @@ std::string cItem::getAbilName() const {
case eItemAbil::BOOST_MAGIC: sout << "Mage's Mantle"; break;
case eItemAbil::ACCURACY: sout << "Accuracy"; break;
case eItemAbil::THIEVING: sout << "Thieving"; break;
case eItemAbil::MAGERY: sout << "Magery"; break;
case eItemAbil::GIANT_STRENGTH: sout << "Giant Strength"; break;
case eItemAbil::LIGHTER_OBJECT: sout << "Lighter Object"; break;
case eItemAbil::HEAVIER_OBJECT: sout << "Heavier Object"; break;

View File

@@ -62,7 +62,7 @@ void cPlayer::append(legacy::pc_record_type old){
short cPlayer::get_tnl(){
short tnl = 100,store_per = 100;
// Omitting a race from this list gives it a value of 0, thanks to the defaulting implementation of operator[]
static std::map<const eRace, const int> rp = {{eRace::NEPHIL,12},{eRace::SLITH,20},{eRace::VAHNATAI,-5}};
static std::map<const eRace, const int> rp = {{eRace::NEPHIL,12},{eRace::SLITH,20},{eRace::VAHNATAI,18}};
static std::map<const eTrait, const short> ap = {
{eTrait::TOUGHNESS,10}, {eTrait::MAGICALLY_APT,20}, {eTrait::AMBIDEXTROUS,8}, {eTrait::NIMBLE,10}, {eTrait::CAVE_LORE,4},
{eTrait::WOODSMAN,6}, {eTrait::GOOD_CONST,10}, {eTrait::HIGHLY_ALERT,7}, {eTrait::STRENGTH,12}, {eTrait::RECUPERATION,15},
@@ -789,6 +789,7 @@ void cPlayer::finish_create() {
items[1] = cItem('helm');
break;
case eRace::VAHNATAI:
// TODO: Should they have a robe instead of a knife?
items[0] = cItem('nife');
items[1] = cItem('rdsk');
break;

View File

@@ -397,7 +397,7 @@ enum class eItemAbil {
// General abilities
DAMAGE_PROTECTION = 30,
FULL_PROTECTION = 31,
UNUSED2 = 32,
MAGERY = 32,
EVASION = 33,
MARTYRS_SHIELD = 34,
ENCUMBERING = 35,