summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/dungeon.cc2
-rw-r--r--crawl-ref/source/ghost.cc40
-rw-r--r--crawl-ref/source/mgen_data.h1
-rw-r--r--crawl-ref/source/mon-place.cc2
-rw-r--r--crawl-ref/source/spl-summoning.cc2
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;