diff options
Diffstat (limited to 'src/spells3.c')
-rw-r--r-- | src/spells3.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/spells3.c b/src/spells3.c index e1cb08b3..0b5d5443 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -1,2 +1,164 @@ #include "angband.h" +s32b NOXIOUSCLOUD = -1; /* Identifier */ +s32b AIRWINGS = -1; /* Identifier */ +s32b INVISIBILITY; +s32b POISONBLOOD; +s32b THUNDERSTORM; +s32b STERILIZE; + +/* FIXME: Hackish workaround while we're still tied to Lua. This lets + us return Lua's "nil" and a non-nil value (which is all the s_aux.lua + cares about). */ +bool_ *NO_CAST = NULL; +bool_ CAST_VAL = 0xca; /* Any value will do */ +bool_ *CAST = &CAST_VAL; + +static s32b get_level_s(int sp, int max) +{ + return get_level(sp, max, 1); +} + +bool_ *air_noxious_cloud() +{ + int dir, type; + + if (!get_aim_dir(&dir)) + { + return NO_CAST; + } + + if (get_level_s(NOXIOUSCLOUD, 50) >= 30) + { + type = GF_UNBREATH; + } + else + { + type = GF_POIS; + } + + fire_cloud(type, dir, 7 + get_level_s(NOXIOUSCLOUD, 150), 3, 5 + get_level_s(NOXIOUSCLOUD, 40)); + return CAST; +} + +char *air_noxious_cloud_info() +{ + static char buf[128]; + sprintf(buf, + "dam %d rad 3 dur %d", + (7 + get_level_s(NOXIOUSCLOUD, 150)), + (5 + get_level_s(NOXIOUSCLOUD, 40))); + return buf; +} + +bool_ *air_wings_of_winds() +{ + if (get_level_s(AIRWINGS, 50) >= 16) + { + if (p_ptr->tim_fly == 0) + { + set_tim_fly(randint(10) + 5 + get_level_s(AIRWINGS, 25)); + return CAST; + } + else if (p_ptr->tim_ffall == 0) + { + set_tim_ffall(randint(10) + 5 + get_level_s(AIRWINGS, 25)); + return CAST; + } + } + + return NO_CAST; +} + +char *air_wings_of_winds_info() +{ + static char buf[128]; + sprintf(buf, "dur %d+d10", (5 + get_level_s(AIRWINGS, 25))); + return buf; +} + +bool_ *air_invisibility() +{ + if (p_ptr->tim_invisible == 0) + { + set_invis(randint(20) + 15 + get_level_s(INVISIBILITY, 50), 20 + get_level_s(INVISIBILITY, 50)); + return CAST; + } + + return NO_CAST; +} + +char *air_invisibility_info() +{ + static char buf[128]; + sprintf(buf, "dur %d+d20 power %d", + (15 + get_level_s(INVISIBILITY, 50)), + (20 + get_level_s(INVISIBILITY, 50))); + return buf; +} + +bool_ *air_poison_blood() +{ + bool_ *cast = NO_CAST; + + if (p_ptr->oppose_pois == 0) + { + set_oppose_pois(randint(30) + 25 + get_level_s(POISONBLOOD, 25)); + cast = CAST; + } + + if ((p_ptr->tim_poison == 0) && + (get_level_s(POISONBLOOD, 50) >= 15)) + { + set_poison(randint(30) + 25 + get_level_s(POISONBLOOD, 25)); + cast = CAST; + } + + return cast; +} + +char *air_poison_blood_info() +{ + static char buf[128]; + sprintf(buf, + "dur %d+d30", + (25 + get_level_s(POISONBLOOD, 25))); + return buf; +} + +bool_ *air_thunderstorm() +{ + if (p_ptr->tim_thunder == 0) + { + set_tim_thunder(randint(10) + 10 + get_level_s(THUNDERSTORM, 25), 5 + get_level_s(THUNDERSTORM, 10), 10 + get_level_s(THUNDERSTORM, 25)); + return CAST; + } + + return NO_CAST; +} + +char *air_thunderstorm_info() +{ + static char buf[128]; + sprintf(buf, + "dam %dd%d dur %d+d10", + (5 + get_level_s(THUNDERSTORM, 10)), + (10 + get_level_s(THUNDERSTORM, 25)), + (10 + get_level_s(THUNDERSTORM, 25))); + return buf; +} + +bool_ *air_sterilize() +{ + set_no_breeders((30) + 20 + get_level_s(STERILIZE, 70)); + return CAST; +} + +char *air_sterilize_info() +{ + static char buf[128]; + sprintf(buf, + "dur %d+d30", + (20 + get_level_s(STERILIZE, 70))); + return buf; +} |