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