summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-05-12 12:32:36 +0200
committerBardur Arantsson <bardur@scientician.net>2012-05-12 12:32:36 +0200
commit0f3e84929038eeff1135bd7462347be64ac9fc71 (patch)
tree575905489b3e96c4483e2cd664ed8370a2dcbd76 /src
parent226d3565889f551c00d4fccf184c98edb12c07c7 (diff)
Lua: Move "Udun" spell functions to C
Diffstat (limited to 'src')
-rw-r--r--src/cmd2.c4
-rw-r--r--src/externs.h16
-rw-r--r--src/spells.pkg14
-rw-r--r--src/spells3.c152
4 files changed, 185 insertions, 1 deletions
diff --git a/src/cmd2.c b/src/cmd2.c
index 8c602db3..828cbc35 100644
--- a/src/cmd2.c
+++ b/src/cmd2.c
@@ -4565,8 +4565,10 @@ static bool_ item_tester_hook_sacrifiable(object_type *o_ptr)
return (TRUE);
/* Books without any udun spells */
- if ((o_ptr->tval == TV_BOOK) && (exec_lua(format("return udun_in_book(%d, %d)", o_ptr->sval, o_ptr->pval)) == 0))
+ if ((o_ptr->tval == TV_BOOK) && udun_in_book(o_ptr->sval, o_ptr->pval) <= 0)
+ {
return TRUE;
+ }
}
/* Assume not */
diff --git a/src/externs.h b/src/externs.h
index dd83e876..4395848e 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1666,6 +1666,22 @@ char *tulkas_wave_of_power_info();
bool_ *tulkas_whirlwind();
char *tulkas_whirlwind_info();
+extern s32b DRAIN;
+extern s32b GENOCIDE;
+extern s32b WRAITHFORM;
+extern s32b FLAMEOFUDUN;
+
+int udun_in_book(s32b sval, s32b pval);
+
+bool_ *udun_drain();
+char *udun_drain_info();
+bool_ *udun_genocide();
+char *udun_genocide_info();
+bool_ *udun_wraithform();
+char *udun_wraithform_info();
+bool_ *udun_flame_of_udun();
+char *udun_flame_of_udun_info();
+
/* randart.c */
extern int get_activation_power(void);
extern void build_prob(cptr learn);
diff --git a/src/spells.pkg b/src/spells.pkg
index 3b7ce060..034f2cd4 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2671,3 +2671,17 @@ bool_ *tulkas_wave_of_power();
char *tulkas_wave_of_power_info();
bool_ *tulkas_whirlwind();
char *tulkas_whirlwind_info();
+
+extern s32b DRAIN;
+extern s32b GENOCIDE;
+extern s32b WRAITHFORM;
+extern s32b FLAMEOFUDUN;
+
+bool_ *udun_drain();
+char *udun_drain_info();
+bool_ *udun_genocide();
+char *udun_genocide_info();
+bool_ *udun_wraithform();
+char *udun_wraithform_info();
+bool_ *udun_flame_of_udun();
+char *udun_flame_of_udun_info();
diff --git a/src/spells3.c b/src/spells3.c
index 6220cd25..39517b5e 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -94,6 +94,11 @@ s32b TULKAS_AIM;
s32b TULKAS_WAVE;
s32b TULKAS_SPIN;
+s32b DRAIN;
+s32b GENOCIDE;
+s32b WRAITHFORM;
+s32b FLAMEOFUDUN;
+
/* 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
@@ -2835,3 +2840,150 @@ char *tulkas_whirlwind_info()
{
return "";
}
+
+/* Return the number of Udun/Melkor spells in a given book */
+int udun_in_book(s32b sval, s32b pval)
+{
+ char buf[128];
+ sprintf(buf, "return udun_in_book(" FMTs32b "," FMTs32b ")",
+ sval, pval);
+ return exec_lua(buf);
+}
+
+static bool_ udun_object_is_drainable(object_type *o_ptr)
+{
+ return ((o_ptr->tval == TV_WAND) ||
+ (o_ptr->tval == TV_ROD_MAIN) ||
+ (o_ptr->tval == TV_STAFF));
+}
+
+bool_ *udun_drain()
+{
+ int item;
+ object_type *o_ptr = NULL;
+
+ /* Ask for an item */
+ item_tester_hook = udun_object_is_drainable;
+ if (!get_item(&item,
+ "What item to drain?",
+ "You have nothing you can drain",
+ USE_INVEN))
+ {
+ return NO_CAST;
+ }
+
+ /* Drain */
+
+ /* get the item */
+ o_ptr = get_object(item);
+
+ switch (o_ptr->tval)
+ {
+ case TV_STAFF:
+ case TV_WAND:
+ {
+ object_kind *k_ptr = &k_info[o_ptr->k_idx];
+
+ /* Generate mana */
+ increase_mana(o_ptr->pval * k_ptr->level * o_ptr->number);
+
+ /* Destroy it */
+ inc_stack_size(item, -99);
+
+ break;
+ }
+
+ case TV_ROD_MAIN:
+ {
+ /* Generate mana */
+ increase_mana(o_ptr->timeout);
+
+ /* Drain it */
+ o_ptr->timeout = 0;
+
+ /* Combine / Reorder the pack (later) */
+ p_ptr->notice |= PN_COMBINE | PN_REORDER;
+ p_ptr->window |= PW_INVEN | PW_EQUIP | PW_PLAYER;
+ break;
+ }
+
+ default:
+ assert(FALSE);
+ }
+
+ return CAST;
+}
+
+char *udun_drain_info()
+{
+ return "";
+}
+
+bool_ *udun_genocide()
+{
+ if (get_level_s(GENOCIDE, 50) < 10)
+ {
+ genocide(TRUE);
+ }
+ else
+ {
+ if (get_check("Genocide all monsters near you? "))
+ {
+ mass_genocide(TRUE);
+ }
+ else
+ {
+ genocide(TRUE);
+ }
+ }
+
+ return CAST;
+}
+
+char *udun_genocide_info()
+{
+ return "";
+}
+
+static int udun_wraithform_base_duration()
+{
+ return 20 + get_level_s(WRAITHFORM, 40);
+}
+
+bool_ *udun_wraithform()
+{
+ set_shadow(randint(30) + udun_wraithform_base_duration());
+ return CAST;
+}
+
+char *udun_wraithform_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d30",
+ udun_wraithform_base_duration());
+ return buf;
+}
+
+static int udun_flame_of_udun_base_duration()
+{
+ return 5 + get_level_s(FLAMEOFUDUN, 30);
+}
+
+bool_ *udun_flame_of_udun()
+{
+ set_mimic(randint(15) + udun_flame_of_udun_base_duration(),
+ resolve_mimic_name("Balrog"),
+ get_level_s(FLAMEOFUDUN, 50));
+ return CAST;
+}
+
+char *udun_flame_of_udun_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dur %d+d15",
+ udun_flame_of_udun_base_duration());
+ return buf;
+}
+