summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-04-20 05:13:20 +0200
committerBardur Arantsson <bardur@scientician.net>2012-04-20 06:18:29 +0200
commitc242c2266a98b95e044834128052bad187186ef0 (patch)
tree7163a841e4577bbff7fa0a122f6082deed7f9e3d /src
parent58c866837fda7ba06e465f45fbf68eafe921db86 (diff)
Lua: Move "Melkor" spell functions to C
Diffstat (limited to 'src')
-rw-r--r--src/cmd1.c2
-rw-r--r--src/externs.h13
-rw-r--r--src/spells.pkg11
-rw-r--r--src/spells3.c103
4 files changed, 128 insertions, 1 deletions
diff --git a/src/cmd1.c b/src/cmd1.c
index 1184df0c..ffeb6d2e 100644
--- a/src/cmd1.c
+++ b/src/cmd1.c
@@ -2475,7 +2475,7 @@ void py_attack(int y, int x, int max_blow)
if (chance < 1) chance = 1;
if ((p_ptr->grace > 5000) && magik(chance))
{
- exec_lua(format("do_melkor_curse(%d)", c_ptr->m_idx));
+ do_melkor_curse(c_ptr->m_idx);
}
}
}
diff --git a/src/externs.h b/src/externs.h
index e46e864f..ac2aef20 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1592,6 +1592,19 @@ char *manwe_blessing_info();
bool_ *manwe_call();
char *manwe_call_info();
+extern s32b MELKOR_CURSE;
+extern s32b MELKOR_CORPSE_EXPLOSION;
+extern s32b MELKOR_MIND_STEAL;
+
+void do_melkor_curse(int m_idx);
+
+bool_ *melkor_curse();
+char *melkor_curse_info();
+bool_ *melkor_corpse_explosion();
+char *melkor_corpse_explosion_info();
+bool_ *melkor_mind_steal();
+char *melkor_mind_steal_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 0d9d5613..5df1ef10 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2636,3 +2636,14 @@ bool_ *manwe_blessing();
char *manwe_blessing_info();
bool_ *manwe_call();
char *manwe_call_info();
+
+extern s32b MELKOR_CURSE;
+extern s32b MELKOR_CORPSE_EXPLOSION;
+extern s32b MELKOR_MIND_STEAL;
+
+bool_ *melkor_curse();
+char *melkor_curse_info();
+bool_ *melkor_corpse_explosion();
+char *melkor_corpse_explosion_info();
+bool_ *melkor_mind_steal();
+char *melkor_mind_steal_info();
diff --git a/src/spells3.c b/src/spells3.c
index db183ee0..5fa198fb 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -69,6 +69,10 @@ s32b MANWE_AVATAR;
s32b MANWE_BLESS;
s32b MANWE_CALL;
+s32b MELKOR_CURSE;
+s32b MELKOR_CORPSE_EXPLOSION;
+s32b MELKOR_MIND_STEAL;
+
/* 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). */
@@ -1961,3 +1965,102 @@ char *manwe_call_info()
get_level_s(MANWE_CALL, 70) + 20);
return buf;
}
+
+void do_melkor_curse(int m_idx)
+{
+ exec_lua(format("do_melkor_curse(%d)", m_idx));
+}
+
+bool_ *melkor_curse()
+{
+ int dir = 0;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ if (target_who < 0)
+ {
+ msg_print("You must target a monster.");
+ return NO_CAST;
+ }
+ else
+ {
+ do_melkor_curse(target_who);
+ return CAST;
+ }
+}
+
+char *melkor_curse_info()
+{
+ return "";
+}
+
+bool_ *melkor_corpse_explosion()
+{
+ fire_ball(GF_CORPSE_EXPL,
+ 0,
+ 20 + get_level_s(MELKOR_CORPSE_EXPLOSION, 70),
+ 2 + get_level_s(MELKOR_CORPSE_EXPLOSION, 5));
+ return CAST;
+}
+
+char *melkor_corpse_explosion_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "dam %d%%",
+ 20 + get_level_s(MELKOR_CORPSE_EXPLOSION, 70));
+ return buf;
+}
+
+bool_ *melkor_mind_steal()
+{
+ int dir = 0;
+
+ if (!get_aim_dir(&dir))
+ {
+ return FALSE;
+ }
+
+ if (target_who < 0)
+ {
+ msg_print("You must target a monster.");
+ return NO_CAST;
+ }
+ else
+ {
+ monster_type *m_ptr = &m_list[target_who];
+ int chance = get_level_s(MELKOR_MIND_STEAL, 50);
+ monster_race *r_ptr = race_info_idx(m_ptr->r_idx, m_ptr->ego);
+ char buf[128];
+
+ monster_desc(buf, m_ptr, 0);
+ buf[0] = toupper(buf[0]);
+
+ if ((randint(m_ptr->level) < chance) &&
+ ((r_ptr->flags1 & RF1_UNIQUE) == 0))
+ {
+ p_ptr->control = target_who;
+ m_ptr->mflag |= MFLAG_CONTROL;
+ strcat(buf, " falls under your control.");
+ }
+ else
+ {
+ strcat(buf, " resists.");
+ }
+
+ msg_print(buf);
+ return CAST;
+ }
+}
+
+char *melkor_mind_steal_info()
+{
+ static char buf[128];
+ sprintf(buf,
+ "chance 1d(mlvl)<%d",
+ get_level_s(MELKOR_MIND_STEAL, 50));
+ return buf;
+}