1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
-- handle the melkor school
-- Not included in the spell code directly because I need to call it from somewhere else too
function do_melkor_curse(who)
local m_ptr = monster(who)
if get_level(MELKOR_CURSE) >= 35 then
local r_ptr = race_info_idx(m_ptr.r_idx, m_ptr.ego)
m_ptr.maxhp = m_ptr.maxhp - r_ptr.hside;
if m_ptr.maxhp < 1 then m_ptr.maxhp = 1 end
if m_ptr.hp > m_ptr.maxhp then m_ptr.hp = m_ptr.maxhp end
player.redraw = bor(player.redraw, PR_HEALTH)
end
if get_level(MELKOR_CURSE) >= 25 then
m_ptr.speed = m_ptr.speed - get_level(MELKOR_CURSE, 7)
m_ptr.mspeed = m_ptr.mspeed - get_level(MELKOR_CURSE, 7)
if m_ptr.speed < 70 then m_ptr.speed = 70 end
if m_ptr.mspeed < 70 then m_ptr.mspeed = 70 end
end
if get_level(MELKOR_CURSE) >= 15 then
m_ptr.ac = m_ptr.ac - get_level(MELKOR_CURSE, 50)
if m_ptr.ac < -70 then m_ptr.ac = -70 end
end
local i, pow
i = 1
pow = get_level(MELKOR_CURSE, 2)
while (i <= 4) do
if m_ptr.blow[i].d_dice > 0 then
if m_ptr.blow[i].d_dice < pow then
pow = m_ptr.blow[i].d_dice
end
if m_ptr.blow[i].d_side < pow then
pow = m_ptr.blow[i].d_side
end
m_ptr.blow[i].d_dice = m_ptr.blow[i].d_dice - pow
end
i = i + 1
end
local m_name = monster_desc(m_ptr, 0).." looks weaker."
msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
-- wake it
m_ptr.csleep = 0;
end
MELKOR_CURSE = add_spell
{
["name"] = "Curse",
["school"] = {SCHOOL_MELKOR},
["level"] = 1,
["mana"] = 50,
["mana_max"] = 300,
["fail"] = 20,
-- Uses piety to cast
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
["spell"] = function()
local ret, dir = get_aim_dir()
if ret == FALSE then return end
if target_who == -1 then
msg_print("You must target a monster.")
else
do_melkor_curse(target_who)
end
return TRUE
end,
["info"] = function()
return ""
end,
["desc"] = {
"It curses a monster, reducing its melee power",
"At level 5 it can be auto-casted (with no piety cost) while fighting",
"At level 15 it also reduces armor",
"At level 25 it also reduces speed",
"At level 35 it also reduces max life (but it is never fatal)",
}
}
MELKOR_CORPSE_EXPLOSION = add_spell
{
["name"] = "Corpse Explosion",
["school"] = {SCHOOL_MELKOR},
["level"] = 10,
["mana"] = 100,
["mana_max"] = 500,
["fail"] = 45,
-- Uses piety to cast
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
["spell"] = function()
return fire_ball(GF_CORPSE_EXPL, 0, 20 + get_level(MELKOR_CORPSE_EXPLOSION, 70), 2 + get_level(MELKOR_CORPSE_EXPLOSION, 5))
end,
["info"] = function()
return "dam "..(20 + get_level(MELKOR_CORPSE_EXPLOSION, 70)).."%"
end,
["desc"] = {
"It makes corpses in an area around you explode for a percent of their",
"hit points as damage",
}
}
MELKOR_MIND_STEAL = add_spell
{
["name"] = "Mind Steal",
["school"] = {SCHOOL_MELKOR},
["level"] = 20,
["mana"] = 1000,
["mana_max"] = 3000,
["fail"] = 90,
-- Uses piety to cast
["piety"] = TRUE,
["stat"] = A_WIS,
["random"] = SKILL_SPIRITUALITY,
["spell"] = function()
local ret, dir = get_aim_dir()
if ret == FALSE then return end
if target_who == -1 then
msg_print("You must target a monster.")
else
local chance, m_ptr, r_ptr
m_ptr = monster(target_who)
r_ptr = race_info_idx(m_ptr.r_idx, m_ptr.ego)
chance = get_level(MELKOR_MIND_STEAL)
if (randint(m_ptr.level) < chance) and (band(r_ptr.flags1, RF1_UNIQUE) == 0) then
player.control = target_who
m_ptr.mflag = bor(m_ptr.mflag, MFLAG_CONTROL)
local m_name = monster_desc(m_ptr, 0).." falls under your control."
msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
else
local m_name = monster_desc(m_ptr, 0).." resists."
msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
end
return TRUE
end
end,
["info"] = function()
return "chance 1d(mlvl)<"..(get_level(MELKOR_MIND_STEAL))
end,
["desc"] = {
"It allows your spirit to temporarily leave your own body, which will",
"be vulnerable, to control one of your enemies body."
}
}
|