summaryrefslogtreecommitdiff
path: root/src/spells3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/spells3.c')
-rw-r--r--src/spells3.c162
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;
+}