summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-04-13 07:44:18 +0200
committerBardur Arantsson <bardur@scientician.net>2012-04-13 18:12:17 +0200
commit98c69abb1f65c27d586b9af0574a9b8bfb8265a7 (patch)
treec0ceb250f8c98a439cb2c315b93f1c30c474d78e
parent976ca14dbe8d44b0653927a656d352a1c7de4897 (diff)
Lua: Move "Earth" spell functions to C
-rw-r--r--lib/mods/theme/scpt/s_earth.lua81
-rw-r--r--lib/scpt/s_earth.lua81
-rw-r--r--src/externs.h17
-rw-r--r--src/spells.pkg20
-rw-r--r--src/spells3.c158
5 files changed, 215 insertions, 142 deletions
diff --git a/lib/mods/theme/scpt/s_earth.lua b/lib/mods/theme/scpt/s_earth.lua
index 23aa001c..9825fc84 100644
--- a/lib/mods/theme/scpt/s_earth.lua
+++ b/lib/mods/theme/scpt/s_earth.lua
@@ -9,22 +9,8 @@ STONESKIN = add_spell
["mana_max"] = 50,
["fail"] = 10,
["inertia"] = { 2, 50 },
- ["spell"] = function()
- local type
- if get_level(STONESKIN, 50) >= 25 then
- type = SHIELD_COUNTER
- else
- type = 0
- end
- return set_shield(randint(10) + 10 + get_level(STONESKIN, 100), 10 + get_level(STONESKIN, 50), type, 2 + get_level(STONESKIN, 5), 3 + get_level(STONESKIN, 5))
- end,
- ["info"] = function()
- if get_level(STONESKIN, 50) >= 25 then
- return "dam "..(2 + get_level(STONESKIN, 5)).."d"..(3 + get_level(STONESKIN, 5)).." dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
- else
- return "dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
- end
- end,
+ ["spell"] = function() return earth_stone_skin() end,
+ ["info"] = function() return earth_stone_skin_info() end,
["desc"] = {
"Creates a shield of earth around you to protect you",
"At level 25 it starts dealing damage to attackers"
@@ -49,15 +35,8 @@ DIG = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- local ret, dir
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return wall_to_mud(dir)
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return earth_dig() end,
+ ["info"] = function() return earth_dig_info() end,
["desc"] = {
"Digs a hole in a wall much faster than any shovels",
}
@@ -81,20 +60,8 @@ STONEPRISON = add_spell
["max_level"] = { 5, 20 },
},
},
- ["spell"] = function()
- local ret, x, y
- if get_level(STONEPRISON, 50) >= 10 then
- ret, x, y = tgt_pt()
- else
- y = player.py
- x = player.px
- end
- wall_stone(y, x)
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return earth_stone_prison() end,
+ ["info"] = function() return earth_stone_prison_info() end,
["desc"] = {
"Creates a prison of walls around you",
"At level 10 it allows you to target a monster"
@@ -119,23 +86,8 @@ STRIKE = add_spell
["max_level"] = { 10, 50 },
},
},
- ["spell"] = function()
- local ret, dir, rad
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- if get_level(STRIKE, 50) >= 12 then
- return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 1)
- else
- return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 0)
- end
- end,
- ["info"] = function()
- if get_level(STRIKE, 50) >= 12 then
- return "dam "..(50 + get_level(STRIKE, 50)).." rad 1"
- else
- return "dam "..(50 + get_level(STRIKE, 50))
- end
- end,
+ ["spell"] = function() return earth_strike() end,
+ ["info"] = function() return earth_strike_info() end,
["desc"] = {
"Creates a micro-ball of force that will push monsters backwards",
"If the monster is caught near a wall, it'll be crushed against it",
@@ -162,21 +114,8 @@ SHAKE = add_spell
},
},
["inertia"] = { 2, 50 },
- ["spell"] = function()
- local ret, x, y
- if get_level(SHAKE, 50) >= 10 then
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- else
- x = player.px
- y = player.py
- end
- earthquake(y, x, 4 + get_level(SHAKE, 10));
- return TRUE
- end,
- ["info"] = function()
- return "rad "..(4 + get_level(SHAKE, 10))
- end,
+ ["spell"] = function() return earth_shake() end,
+ ["info"] = function() return earth_shake_info() end,
["desc"] = {
"Creates a localised earthquake",
"At level 10 it can be targeted at any location"
diff --git a/lib/scpt/s_earth.lua b/lib/scpt/s_earth.lua
index 23aa001c..9825fc84 100644
--- a/lib/scpt/s_earth.lua
+++ b/lib/scpt/s_earth.lua
@@ -9,22 +9,8 @@ STONESKIN = add_spell
["mana_max"] = 50,
["fail"] = 10,
["inertia"] = { 2, 50 },
- ["spell"] = function()
- local type
- if get_level(STONESKIN, 50) >= 25 then
- type = SHIELD_COUNTER
- else
- type = 0
- end
- return set_shield(randint(10) + 10 + get_level(STONESKIN, 100), 10 + get_level(STONESKIN, 50), type, 2 + get_level(STONESKIN, 5), 3 + get_level(STONESKIN, 5))
- end,
- ["info"] = function()
- if get_level(STONESKIN, 50) >= 25 then
- return "dam "..(2 + get_level(STONESKIN, 5)).."d"..(3 + get_level(STONESKIN, 5)).." dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
- else
- return "dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
- end
- end,
+ ["spell"] = function() return earth_stone_skin() end,
+ ["info"] = function() return earth_stone_skin_info() end,
["desc"] = {
"Creates a shield of earth around you to protect you",
"At level 25 it starts dealing damage to attackers"
@@ -49,15 +35,8 @@ DIG = add_spell
["max_level"] = { 1, 1 },
},
},
- ["spell"] = function()
- local ret, dir
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- return wall_to_mud(dir)
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return earth_dig() end,
+ ["info"] = function() return earth_dig_info() end,
["desc"] = {
"Digs a hole in a wall much faster than any shovels",
}
@@ -81,20 +60,8 @@ STONEPRISON = add_spell
["max_level"] = { 5, 20 },
},
},
- ["spell"] = function()
- local ret, x, y
- if get_level(STONEPRISON, 50) >= 10 then
- ret, x, y = tgt_pt()
- else
- y = player.py
- x = player.px
- end
- wall_stone(y, x)
- return TRUE
- end,
- ["info"] = function()
- return ""
- end,
+ ["spell"] = function() return earth_stone_prison() end,
+ ["info"] = function() return earth_stone_prison_info() end,
["desc"] = {
"Creates a prison of walls around you",
"At level 10 it allows you to target a monster"
@@ -119,23 +86,8 @@ STRIKE = add_spell
["max_level"] = { 10, 50 },
},
},
- ["spell"] = function()
- local ret, dir, rad
- ret, dir = get_aim_dir()
- if ret == FALSE then return end
- if get_level(STRIKE, 50) >= 12 then
- return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 1)
- else
- return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 0)
- end
- end,
- ["info"] = function()
- if get_level(STRIKE, 50) >= 12 then
- return "dam "..(50 + get_level(STRIKE, 50)).." rad 1"
- else
- return "dam "..(50 + get_level(STRIKE, 50))
- end
- end,
+ ["spell"] = function() return earth_strike() end,
+ ["info"] = function() return earth_strike_info() end,
["desc"] = {
"Creates a micro-ball of force that will push monsters backwards",
"If the monster is caught near a wall, it'll be crushed against it",
@@ -162,21 +114,8 @@ SHAKE = add_spell
},
},
["inertia"] = { 2, 50 },
- ["spell"] = function()
- local ret, x, y
- if get_level(SHAKE, 50) >= 10 then
- ret, x, y = tgt_pt()
- if ret == FALSE then return end
- else
- x = player.px
- y = player.py
- end
- earthquake(y, x, 4 + get_level(SHAKE, 10));
- return TRUE
- end,
- ["info"] = function()
- return "rad "..(4 + get_level(SHAKE, 10))
- end,
+ ["spell"] = function() return earth_shake() end,
+ ["info"] = function() return earth_shake_info() end,
["desc"] = {
"Creates a localised earthquake",
"At level 10 it can be targeted at any location"
diff --git a/src/externs.h b/src/externs.h
index 168fd2ab..408a7046 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -1490,6 +1490,23 @@ char *divination_reveal_ways_info();
bool_ *divination_sense_monsters();
char *divination_sense_monsters_info();
+extern s32b STONESKIN;
+extern s32b DIG;
+extern s32b STONEPRISON;
+extern s32b STRIKE;
+extern s32b SHAKE;
+
+bool_ *earth_stone_skin();
+char *earth_stone_skin_info();
+bool_ *earth_dig();
+char *earth_dig_info();
+bool_ *earth_stone_prison();
+char *earth_stone_prison_info();
+bool_ *earth_strike();
+char *earth_strike_info();
+bool_ *earth_shake();
+char *earth_shake_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 5cf18354..e9e7c29d 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2522,3 +2522,23 @@ bool_ *divination_reveal_ways();
char *divination_reveal_ways_info();
bool_ *divination_sense_monsters();
char *divination_sense_monsters_info();
+
+/*
+ * Earth
+ */
+extern s32b STONESKIN;
+extern s32b DIG;
+extern s32b STONEPRISON;
+extern s32b STRIKE;
+extern s32b SHAKE;
+
+bool_ *earth_stone_skin();
+char *earth_stone_skin_info();
+bool_ *earth_dig();
+char *earth_dig_info();
+bool_ *earth_stone_prison();
+char *earth_stone_prison_info();
+bool_ *earth_strike();
+char *earth_strike_info();
+bool_ *earth_shake();
+char *earth_shake_info();
diff --git a/src/spells3.c b/src/spells3.c
index 086c6940..fc29ec00 100644
--- a/src/spells3.c
+++ b/src/spells3.c
@@ -31,6 +31,12 @@ s32b SENSEHIDDEN;
s32b REVEALWAYS;
s32b SENSEMONSTERS;
+s32b STONESKIN;
+s32b DIG;
+s32b STONEPRISON;
+s32b STRIKE;
+s32b SHAKE;
+
/* 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). */
@@ -849,3 +855,155 @@ char *divination_sense_monsters_info()
return buf;
}
+
+bool_ *earth_stone_skin()
+{
+ int type;
+
+ type = 0;
+ if (get_level_s(STONESKIN, 50) >= 25)
+ {
+ type = SHIELD_COUNTER;
+ }
+
+ set_shield(randint(10) + 10 + get_level_s(STONESKIN, 100),
+ 10 + get_level_s(STONESKIN, 50),
+ type,
+ 2 + get_level_s(STONESKIN, 5),
+ 3 + get_level_s(STONESKIN, 5));
+ return CAST;
+}
+
+char *earth_stone_skin_info()
+{
+ static char buf[128];
+
+ if (get_level_s(STONESKIN, 50) >= 25)
+ {
+ sprintf(buf,
+ "dam %dd%d dur %d+d10 AC %d",
+ (2 + get_level_s(STONESKIN, 5)),
+ (3 + get_level_s(STONESKIN, 5)),
+ (10 + get_level_s(STONESKIN, 100)),
+ (10 + get_level_s(STONESKIN, 50)));
+ }
+ else
+ {
+ sprintf(buf,
+ "dur %d+d10 AC %d",
+ (10 + get_level_s(STONESKIN, 100)),
+ (10 + get_level_s(STONESKIN, 50)));
+ }
+
+ return buf;
+}
+
+bool_ *earth_dig()
+{
+ int dir;
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ wall_to_mud(dir);
+ return CAST;
+}
+
+char *earth_dig_info()
+{
+ return "";
+}
+
+bool_ *earth_stone_prison()
+{
+ int x,y;
+
+ if (get_level_s(STONEPRISON, 50) >= 10)
+ {
+ if (!tgt_pt(&x, &y))
+ {
+ return NO_CAST;
+ }
+ }
+ else
+ {
+ y = p_ptr->py;
+ x = p_ptr->px;
+ }
+
+ wall_stone(y, x);
+ return CAST;
+}
+
+char *earth_stone_prison_info()
+{
+ return "";
+}
+
+bool_ *earth_strike()
+{
+ int dir, dmg;
+
+ if (!get_aim_dir(&dir))
+ {
+ return NO_CAST;
+ }
+
+ dmg = 50 + get_level_s(STRIKE, 50);
+ if (get_level_s(STRIKE, 50) >= 12)
+ {
+ fire_ball(GF_FORCE, dir, dmg, 1);
+ }
+ else
+ {
+ fire_ball(GF_FORCE, dir, dmg, 0);
+ }
+
+ return CAST;
+}
+
+char *earth_strike_info()
+{
+ static char buf[128];
+ int dmg = 50 + get_level_s(STRIKE, 50);
+
+ if (get_level_s(STRIKE, 50) >= 12)
+ {
+ sprintf(buf, "dam %d rad 1", dmg);
+ }
+ else
+ {
+ sprintf(buf, "dam %d", dmg);
+ }
+
+ return buf;
+}
+
+bool_ *earth_shake()
+{
+ int x,y;
+
+ if (get_level_s(SHAKE, 50) >= 10)
+ {
+ if (!tgt_pt(&x, &y))
+ {
+ return NO_CAST;
+ }
+ }
+ else
+ {
+ x = p_ptr->px;
+ y = p_ptr->py;
+ }
+ earthquake(y, x, 4 + get_level_s(SHAKE, 10));
+ return CAST;
+}
+
+char *earth_shake_info()
+{
+ static char buf[128];
+ sprintf(buf, "rad %d", (4 + get_level_s(SHAKE, 10)));
+ return buf;
+}
+