diff options
author | Bardur Arantsson <bardur@scientician.net> | 2012-05-12 12:32:36 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2012-05-12 12:32:36 +0200 |
commit | 0f3e84929038eeff1135bd7462347be64ac9fc71 (patch) | |
tree | 575905489b3e96c4483e2cd664ed8370a2dcbd76 /src | |
parent | 226d3565889f551c00d4fccf184c98edb12c07c7 (diff) |
Lua: Move "Udun" spell functions to C
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd2.c | 4 | ||||
-rw-r--r-- | src/externs.h | 16 | ||||
-rw-r--r-- | src/spells.pkg | 14 | ||||
-rw-r--r-- | src/spells3.c | 152 |
4 files changed, 185 insertions, 1 deletions
@@ -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; +} + |