diff options
-rw-r--r-- | crawl-ref/source/dungeon.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/ghost.cc | 40 | ||||
-rw-r--r-- | crawl-ref/source/mgen_data.h | 1 | ||||
-rw-r--r-- | crawl-ref/source/mon-place.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/spl-summoning.cc | 2 |
5 files changed, 38 insertions, 9 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc index 5b78c50519..fe32b88e40 100644 --- a/crawl-ref/source/dungeon.cc +++ b/crawl-ref/source/dungeon.cc @@ -4891,7 +4891,7 @@ monster* dgn_place_monster(mons_spec &mspec, coord_def where, if (mons->type == MONS_DANCING_WEAPON) mons->ghost->init_dancing_weapon(*wpn, 100); else if (mons->type == MONS_SPECTRAL_WEAPON) - mons->ghost->init_spectral_weapon(*wpn, 100, 27); + mons->ghost->init_spectral_weapon(*wpn, 100, 270); mons->ghost_demon_init(); } diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc index 1c428f776c..c6718b67ed 100644 --- a/crawl-ref/source/ghost.cc +++ b/crawl-ref/source/ghost.cc @@ -717,22 +717,50 @@ void ghost_demon::init_spectral_weapon(const item_def& weapon, if (power > 100) power = 100; - if (wpn_skill > 27) - wpn_skill = 27; + // skill is on a 10 scale + if (wpn_skill > 270) + wpn_skill = 270; colour = weapon.colour; fly = FL_LEVITATE; - // Offense scales with weapon skill. - // Defenses scale with spell power. + // Hit dice (to hit) scales with weapon skill alone. + // Damage scales with weapon skill, but how well depends on spell power. + // Defenses scale with spell power alone. // Appropriate investment is rewarded with a stronger spectral weapon. - xl = wpn_skill; + xl = wpn_skill / 10; + + // At 0 power, weapon skill is 1/3 as effective as on the player + // At max power, weapon skill is as effective as on the player. + // Power has a linear effect between those endpoints. + // It's possible this ends up too strong, + // but 100 power on Hexes/Charms will take significant investment + // most players wouldn't otherwise get. + // + // Damage multiplier table: + // | weapon skill + // pow | 3 9 15 21 27 + // --- | ----- ---- ---- ---- ---- + // 0 | 1.04 1.12 1.20 1.28 1.36 + // 10 | 1.05 1.14 1.24 1.34 1.43 + // 20 | 1.06 1.17 1.28 1.39 1.50 + // 30 | 1.06 1.19 1.32 1.45 1.58 + // 40 | 1.07 1.22 1.36 1.50 1.65 + // 50 | 1.08 1.24 1.40 1.56 1.72 + // 60 | 1.09 1.26 1.44 1.62 1.79 + // 70 | 1.10 1.29 1.48 1.67 1.87 + // 80 | 1.10 1.31 1.52 1.73 1.94 + // 90 | 1.11 1.34 1.56 1.79 2.01 + // 100 | 1.12 1.36 1.60 1.84 2.08 + damage = damg; + int scale = 250 * 150 / (50 + power); + damage *= scale + wpn_skill; + damage /= scale; speed = 30; ev = 2 + div_rand_round(power,12); ac = 2 + div_rand_round(power,12); - damage = damg; max_hp = 10 + div_rand_round(power,3); } diff --git a/crawl-ref/source/mgen_data.h b/crawl-ref/source/mgen_data.h index 2f8c32674a..72c9f6caeb 100644 --- a/crawl-ref/source/mgen_data.h +++ b/crawl-ref/source/mgen_data.h @@ -9,6 +9,7 @@ #define TUKIMA_WEAPON "tukima-weapon" #define TUKIMA_POWER "tukima-power" // Technically only used for spectral weapon, not dancing weapons +// Equal to weapon skill with a scale of 10 #define TUKIMA_SKILL "tukima-skill" // A structure with all the data needed to whip up a new monster. diff --git a/crawl-ref/source/mon-place.cc b/crawl-ref/source/mon-place.cc index f24925d3e6..2685a25824 100644 --- a/crawl-ref/source/mon-place.cc +++ b/crawl-ref/source/mon-place.cc @@ -1727,7 +1727,7 @@ static monster* _place_monster_aux(const mgen_data &mg, const monster *leader, mg.props.exists(TUKIMA_POWER) ? mg.props[TUKIMA_POWER].get_int() : 100, mg.props.exists(TUKIMA_SKILL) ? - mg.props[TUKIMA_SKILL].get_int() : 27); + mg.props[TUKIMA_SKILL].get_int() : 270); } mon->set_ghost(ghost); mon->ghost_demon_init(); diff --git a/crawl-ref/source/spl-summoning.cc b/crawl-ref/source/spl-summoning.cc index b28c41dbab..97735db9b8 100644 --- a/crawl-ref/source/spl-summoning.cc +++ b/crawl-ref/source/spl-summoning.cc @@ -2973,7 +2973,7 @@ spret_type cast_spectral_weapon(actor *agent, int pow, god_type god, bool fail) agent->mindex(), 0, god); - int skill_with_weapon = agent->skill(weapon_skill(*wpn), 1, false); + int skill_with_weapon = agent->skill(weapon_skill(*wpn), 10, false); mg.props[TUKIMA_WEAPON] = cp; mg.props[TUKIMA_POWER] = pow; |