1 /*
2 This file is part of "Avanor, the Land of Mystery" roguelike game
3 Home page: http://www.avanor.com/
4 Copyright (C) 2000-2003 Vadim Gaidukevich
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "modifers.h"
22 #include "xarchive.h"
23 #include "modifer.h"
24
XBasicModifer(MODIFER_TYPE mt,int _val,XCreature * _cr)25 XBasicModifer::XBasicModifer(MODIFER_TYPE mt, int _val, XCreature * _cr)
26 {
27 mdt = mt;
28 val = _val;
29 setter = _cr;
30 im = IM_OTHER;
31 }
32
Invalidate()33 void XBasicModifer::Invalidate()
34 {
35 setter = NULL;
36 XObject::Invalidate();
37 }
38
Store(XFile * f)39 void XBasicModifer::Store(XFile * f)
40 {
41 XObject::Store(f);
42 f->Write(&val, sizeof(int));
43 f->Write(&mdt, sizeof(MODIFER_TYPE));
44 setter.Store(f);
45 }
46
Restore(XFile * f)47 void XBasicModifer::Restore(XFile * f)
48 {
49 XObject::Restore(f);
50 f->Read(&val, sizeof(int));
51 f->Read(&mdt, sizeof(MODIFER_TYPE));
52 setter.Restore(f);
53 }
54
55 REGISTER_CLASS(XModWound);
56
Run(XCreature * owner)57 MODIFER_RESULT XModWound::Run(XCreature * owner)
58 {
59 val -= (owner->GetStats(S_TOU) / 10 + owner->sk->GetLevel(SKT_FIRST_AID));
60 owner->sk->UseSkill(SKT_FIRST_AID);
61 if (val > 0)
62 {
63 owner->_HP -= val;
64 if (owner->isHero())
65 msgwin.Add(ApplyMsg());
66 }
67 return XBasicModifer::Run(owner);
68 }
69
70 REGISTER_CLASS(XModPoison);
Run(XCreature * owner)71 MODIFER_RESULT XModPoison::Run(XCreature * owner)
72 {
73 if (vRand() % 3 == 0)
74 {
75 int rnd = vRand() % 4;
76 owner->_HP -= rnd;
77 if (owner->isHero())
78 msgwin.Add(ApplyMsg());
79 }
80 val -= owner->sk->GetLevel(SKT_FIRST_AID);
81 return XBasicModifer::Run(owner);
82 }
83
84 REGISTER_CLASS(XModConfuse);
Run(XCreature * owner)85 MODIFER_RESULT XModConfuse::Run(XCreature * owner)
86 {
87 owner->nx = owner->x + vRand() % 3 - 1;
88 owner->ny = owner->y + vRand() % 3 - 1;
89 if (owner->isHero())
90 msgwin.Add(ApplyMsg());
91 return XBasicModifer::Run(owner);
92 }
93
94 REGISTER_CLASS(XModStun);
onSet(XCreature * owner)95 int XModStun::onSet(XCreature * owner)
96 {
97 owner->added_DV -= 5;
98 owner->added_HIT -= 10;
99 return 1;
100 }
101
onRemove(XCreature * owner)102 int XModStun::onRemove(XCreature * owner)
103 {
104 owner->added_DV += 5;
105 owner->added_HIT += 10;
106 return 1;
107 }
108
109 REGISTER_CLASS(XModHeroism);
onSet(XCreature * owner)110 int XModHeroism::onSet(XCreature * owner)
111 {
112 owner->added_DV += 5;
113 owner->added_HIT += 10;
114 return 1;
115 }
116
onRemove(XCreature * owner)117 int XModHeroism::onRemove(XCreature * owner)
118 {
119 owner->added_DV -= 5;
120 owner->added_HIT -= 10;
121 return 1;
122 }
123
124 REGISTER_CLASS(XModDisease);
onSet(XCreature * owner)125 int XModDisease::onSet(XCreature * owner)
126 {
127 owner->added_DV -= 5;
128 owner->added_HIT -= 5;
129 owner->added_stats.Modify(S_STR, -3);
130 owner->added_stats.Modify(S_DEX, -4);
131 owner->added_stats.Modify(S_TOU, -3);
132 return 1;
133 }
134
onRemove(XCreature * owner)135 int XModDisease::onRemove(XCreature * owner)
136 {
137 owner->added_DV += 5;
138 owner->added_HIT += 5;
139 owner->added_stats.Modify(S_STR, +3);
140 owner->added_stats.Modify(S_DEX, +4);
141 owner->added_stats.Modify(S_TOU, +3);
142 return 1;
143 }
144
Run(XCreature * owner)145 MODIFER_RESULT XModDisease::Run(XCreature * owner)
146 {
147 switch (vRand(300))
148 {
149 case 0: owner->GainAttr(S_STR, -1); break;
150 case 1: owner->GainAttr(S_DEX, -1); break;
151 case 2: owner->GainAttr(S_TOU, -1); break;
152 }
153 return XBasicModifer::Run(owner);
154 }
155
156 REGISTER_CLASS(XModWeak);
onSet(XCreature * owner)157 int XModWeak::onSet(XCreature * owner)
158 {
159 owner->added_stats.Modify(S_STR, -5);
160 return 1;
161 }
162
onRemove(XCreature * owner)163 int XModWeak::onRemove(XCreature * owner)
164 {
165 owner->added_stats.Modify(S_STR, +5);
166 return 1;
167 }
168
Run(XCreature * owner)169 MODIFER_RESULT XModWeak::Run(XCreature * owner)
170 {
171 switch (vRand(100))
172 {
173 case 0: owner->GainAttr(S_STR, -1); break;
174 }
175 return XBasicModifer::Run(owner);
176 }
177
178 REGISTER_CLASS(XModParalyse);
Run(XCreature * owner)179 MODIFER_RESULT XModParalyse::Run(XCreature * owner)
180 {
181 owner->nx = owner->x;
182 owner->ny = owner->y;
183 return XBasicModifer::Run(owner);
184 }
185
186
187 REGISTER_CLASS(XModDelayed);
Run(XCreature * owner)188 MODIFER_RESULT XModDelayed::Run(XCreature * owner)
189 {
190 MODIFER_RESULT mr = XBasicModifer::Run(owner);
191 if (mr == MR_REMOVE)
192 {
193 owner->md->Add(set_mt, set_val, owner);
194 }
195 return mr;
196 }
197
Store(XFile * f)198 void XModDelayed::Store(XFile * f)
199 {
200 XBasicModifer::Store(f);
201 f->Write(&set_mt, sizeof(MODIFER_TYPE));
202 f->Write(&set_val, sizeof(int));
203 }
204
Restore(XFile * f)205 void XModDelayed::Restore(XFile * f)
206 {
207 XBasicModifer::Restore(f);
208 f->Read(&set_mt, sizeof(MODIFER_TYPE));
209 f->Read(&set_val, sizeof(int));
210 }
211
212
213 REGISTER_CLASS(XModSeeInvisible);
onSet(XCreature * owner)214 int XModSeeInvisible::onSet(XCreature * owner)
215 {
216 owner->added_resists.ChangeResistance(R_SEEINVISIBLE, 10);
217 return 1;
218 }
219
onRemove(XCreature * owner)220 int XModSeeInvisible::onRemove(XCreature * owner)
221 {
222 owner->added_resists.ChangeResistance(R_SEEINVISIBLE, -10);
223 return 1;
224 }
225
226
227 REGISTER_CLASS(XModBoostSpeed);
onSet(XCreature * owner)228 int XModBoostSpeed::onSet(XCreature * owner)
229 {
230 owner->ttmb -= 300;
231 return 1;
232 }
233
onRemove(XCreature * owner)234 int XModBoostSpeed::onRemove(XCreature * owner)
235 {
236 owner->ttmb += 300;
237 return 1;
238 }
239
240
241 REGISTER_CLASS(XModSlowness);
onSet(XCreature * owner)242 int XModSlowness::onSet(XCreature * owner)
243 {
244 owner->ttmb += 300;
245 return 1;
246 }
247
onRemove(XCreature * owner)248 int XModSlowness::onRemove(XCreature * owner)
249 {
250 owner->ttmb -= 300;
251 return 1;
252 }
253
254
255 REGISTER_CLASS(XModAcidResistance);
onSet(XCreature * owner)256 int XModAcidResistance::onSet(XCreature * owner)
257 {
258 owner->added_resists.ChangeResistance(R_ACID, 40);
259 return 1;
260 }
261
onRemove(XCreature * owner)262 int XModAcidResistance::onRemove(XCreature * owner)
263 {
264 owner->added_resists.ChangeResistance(R_ACID, -40);
265 return 1;
266 }
267
268
269 REGISTER_CLASS(XModFireResistance);
onSet(XCreature * owner)270 int XModFireResistance::onSet(XCreature * owner)
271 {
272 owner->added_resists.ChangeResistance(R_FIRE, 40);
273 return 1;
274 }
275
onRemove(XCreature * owner)276 int XModFireResistance::onRemove(XCreature * owner)
277 {
278 owner->added_resists.ChangeResistance(R_FIRE, -40);
279 return 1;
280 }
281
282
283 REGISTER_CLASS(XModColdResistance);
onSet(XCreature * owner)284 int XModColdResistance::onSet(XCreature * owner)
285 {
286 owner->added_resists.ChangeResistance(R_COLD, 40);
287 return 1;
288 }
289
onRemove(XCreature * owner)290 int XModColdResistance::onRemove(XCreature * owner)
291 {
292 owner->added_resists.ChangeResistance(R_COLD, -40);
293 return 1;
294 }
295
296
297 REGISTER_CLASS(XModPoisonResistance);
onSet(XCreature * owner)298 int XModPoisonResistance::onSet(XCreature * owner)
299 {
300 owner->added_resists.ChangeResistance(R_POISON, 40);
301 return 1;
302 }
303
onRemove(XCreature * owner)304 int XModPoisonResistance::onRemove(XCreature * owner)
305 {
306 owner->added_resists.ChangeResistance(R_POISON, -40);
307 return 1;
308 }
309