From f41f4cb56e95d2e36fa21b9504282d9e34eddc75 Mon Sep 17 00:00:00 2001 From: zelgadis Date: Sat, 13 Dec 2008 10:06:40 +0000 Subject: First draft of the spell noisyness system: spells cast by the player and by wizard/priest monsters now make noise, with the loudness depending upon level and spell disciplines: conjuration spells have a loudness equal to their level, spells containing only air and/or poison equal to 50% of their level (rounded up), and everything else to 75% of the level (rounded up). This undoudedtly needs rebalancing, and a better level+disciplines -> loudness formula. Also, each spell can have it's loudness tweaked from the default via the noise_mod field of the spell_desc field in spl-data.h, for those spells whose desired loudness don't quite fit into whatever formula is used. The messages used to announce a spell have been moved out to source/dat/database/monspell.txt, which uses the same format and conventions as monspeak.txt. So far this has just been used to make invisible wizard/priest monsters give a message to the player if the player can hear them cast, and also to make curse skulls and Murray not "gesture wildly". However, it could be used to give a greater variety of spell announcement messages based upon the spell used or the monster's type/species/genus, and/or to give multi-part messages. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7820 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/spl-util.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'crawl-ref/source/spl-util.cc') diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index d2fde2f04a..592da11f61 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -40,6 +40,31 @@ #include #endif +struct spell_desc +{ + int id; + const char *title; + unsigned int disciplines; // bitfield + unsigned int flags; // bitfield + unsigned int level; + int power_cap; + + // At power 0, you get min_range. At power power_cap, you get max_range. + int min_range; + int max_range; + + // How much louder or quieter the spell is than the default. + int noise_mod; + + const char *target_prompt; + + // If a monster is casting this, does it need a tracer? + bool ms_needs_tracer; + + // The spell can be used no matter what the monster's foe is. + bool ms_utility; +}; + static struct spell_desc spelldata[] = { #include "spl-data.h" }; @@ -922,3 +947,22 @@ int spell_range(spell_type spell, int pow, bool real_cast) // Round appropriately. return ((pow*(maxrange - minrange) + powercap/2) / powercap + minrange); } + +int spell_noise(spell_type spell) +{ + const spell_desc *desc = _seekspell(spell); + + return desc->noise_mod + spell_noise(desc->disciplines, desc->level); +} + +int spell_noise(unsigned int disciplines, int level) +{ + if (disciplines == SPTYP_NONE) + return (0); + else if (disciplines & SPTYP_CONJURATION) + return (level); + else if (disciplines && !(disciplines & (SPTYP_POISON | SPTYP_AIR))) + return div_round_up(level * 3, 4); + else + return div_round_up(level, 2); +} -- cgit v1.2.3-54-g00ecf