"code script" system completely rewritten
[k8-i-v-a-n.git] / src / game / lterra.h
blob013b195b991a0ffa9b7adf348b321a269d3016bd
1 /*
3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
6 * Public License
8 * See LICENSING which should be included
9 * along with this file for more details
12 #ifndef __LTERRA_H__
13 #define __LTERRA_H__
15 #include "ivancommon.h"
17 #include "object.h"
18 #include "terra.h"
19 #include "script.h"
20 #include "festring.h"
23 class glterrain;
24 class olterrain;
25 class item;
26 class level;
27 class lsquare;
28 class stack;
29 class room;
30 class liquid;
31 class materialscript;
32 class glterrainprototype;
33 class olterrainprototype;
34 template <class type> class databasecreator;
35 struct blitdata;
37 typedef glterrain* (*glterrainspawner)(int, int);
38 typedef olterrain* (*olterrainspawner)(int, int);
40 struct lterraindatabase : public databasebase
42 void PostProcess() { }
43 v2 BitmapPos;
44 truth UsesLongArticle;
45 festring Adjective;
46 truth UsesLongAdjectiveArticle;
47 festring NameSingular;
48 festring NamePlural;
49 festring PostFix;
50 int ArticleMode;
51 fearray<sLong> MainMaterialConfig;
52 fearray<sLong> SecondaryMaterialConfig;
53 fearray<sLong> MaterialConfigChances;
54 sLong MaterialConfigChanceSum;
55 int OKVisualEffects;
56 col16 MaterialColorB;
57 col16 MaterialColorC;
58 col16 MaterialColorD;
59 festring SitMessage;
60 int AttachedGod;
61 int Walkability;
62 truth IsAbstract;
63 truth ShowMaterial;
64 truth HasSecondaryMaterial;
65 truth UseBorderTiles;
66 int BorderTilePriority;
69 class lterrain : public object
71 public:
72 lterrain() : LSquareUnder(0) { }
73 virtual ~lterrain () {}
75 virtual void Load(inputfile&);
76 virtual truth Open(character*) { return false; }
77 virtual truth Close(character*) { return false; }
78 v2 GetPos() const;
79 virtual truth CanBeOpened() const { return false; }
80 virtual truth CanBeClosed() const { return false; }
81 virtual truth AcceptsOffers() const { return false; }
82 virtual truth ReceiveVomit(character*, liquid*) { return false; }
83 virtual truth CanBeOpenedByAI() { return false; }
84 virtual truth Polymorph(character*) { return false; }
85 virtual truth DipInto(item*, character*) { return false; }
86 virtual truth IsDipDestination() const { return false; }
87 virtual truth TryKey(item*, character*) { return false; }
88 truth CanBeSeenByPlayer() const;
89 truth CanBeSeenBy(character*) const;
90 virtual cfestring& GetSitMessage() const = 0;
91 virtual truth SitOn(character*);
92 virtual square* GetSquareUnderEntity(int = 0) const;
93 void SetLSquareUnder(lsquare* What) { LSquareUnder = What; }
94 lsquare* GetLSquareUnder() const { return LSquareUnder; }
95 level* GetLevel() const;
96 lsquare* GetNearLSquare(v2) const;
97 lsquare* GetNearLSquare(int, int) const;
98 virtual void CalculateAll() { CalculateEmitation(); }
99 virtual void SignalEmitationIncrease(col24);
100 virtual void SignalEmitationDecrease(col24);
101 virtual truth HasKeyHole() const { return CanBeOpened(); }
102 virtual truth IsOnGround() const { return true; }
103 room* GetRoom() const;
104 virtual void SignalRustLevelChange();
105 virtual void TryToRust(sLong);
106 virtual void ReceiveAcid(material*, sLong) { }
107 void InitMaterials(material*, truth = true);
108 void SetMainMaterial(material*, int = 0);
109 void ChangeMainMaterial(material*, int = 0);
110 virtual void GenerateMaterials();
111 virtual void InitMaterials(const materialscript*, const materialscript*, truth);
112 virtual const fearray<sLong>& GetMainMaterialConfig() const = 0;
113 virtual void SurviveEffect(character*) { }
114 virtual void RestoreHP() { }
115 virtual void AddLocationDescription(festring&) const;
116 protected:
117 void Initialize(int, int);
118 virtual void PostConstruct() { }
119 virtual void InstallDataBase(int) = 0;
120 lsquare* LSquareUnder;
123 struct glterraindatabase : public lterraindatabase
125 typedef glterrainprototype prototype;
126 void InitDefaults (const glterrainprototype *NewProtoType, int NewConfig, cfestring &acfgstrname);
127 truth AllowRandomInstantiation() const { return true; }
128 const prototype* ProtoType;
131 class glterrainprototype
133 public:
134 friend class databasecreator<glterrain>;
136 glterrainprototype(const glterrainprototype*, glterrainspawner, cchar*);
137 virtual ~glterrainprototype () {}
139 glterrain* Spawn(int Config = 0, int SpecialFlags = 0) const { return Spawner(Config, SpecialFlags); }
140 glterrain* SpawnAndLoad(inputfile&) const;
141 cchar* GetClassID() const { return ClassID; }
142 int GetIndex() const { return Index; }
143 const glterrainprototype* GetBase() const { return Base; }
144 int CreateSpecialConfigurations(glterraindatabase**, int Configs, int) { return Configs; }
145 const glterraindatabase* ChooseBaseForConfig(glterraindatabase** TempConfig, int, int) { return *TempConfig; }
146 const glterraindatabase*const* GetConfigData() const { return ConfigData; }
147 int GetConfigSize() const { return ConfigSize; }
148 private:
149 int Index;
150 const glterrainprototype* Base;
151 glterraindatabase** ConfigData;
152 glterraindatabase** ConfigTable[CONFIG_TABLE_SIZE];
153 int ConfigSize;
154 glterrainspawner Spawner;
155 cchar* ClassID;
157 public:
158 EventHandlerMap mOnEvents;
161 class glterrain : public lterrain, public gterrain
163 public:
164 friend class databasecreator<glterrain>;
165 typedef glterrainprototype prototype;
166 typedef glterraindatabase database;
168 virtual ~glterrain () {}
170 virtual void Save(outputfile&) const;
171 virtual void Load(inputfile&);
172 virtual int GetEntryDifficulty() const { return 1; }
173 int GetType() const { return GetProtoType()->GetIndex(); }
174 const database* GetDataBase() const { return DataBase; }
175 DATA_BASE_VALUE(const prototype*, ProtoType);
176 DATA_BASE_VALUE(int, Config);
177 DATA_BASE_TRUTH(UsesLongArticle);
178 DATA_BASE_VALUE(cfestring&, Adjective);
179 DATA_BASE_TRUTH(UsesLongAdjectiveArticle);
180 DATA_BASE_VALUE(cfestring&, NameSingular);
181 DATA_BASE_VALUE(cfestring&, NamePlural);
182 DATA_BASE_VALUE(cfestring&, PostFix);
183 DATA_BASE_VALUE(int, ArticleMode);
184 virtual DATA_BASE_VALUE(const fearray<sLong>&, MainMaterialConfig);
185 DATA_BASE_VALUE(const fearray<sLong>&, SecondaryMaterialConfig);
186 virtual DATA_BASE_VALUE(const fearray<sLong>&, MaterialConfigChances);
187 virtual DATA_BASE_VALUE(sLong, MaterialConfigChanceSum);
188 DATA_BASE_VALUE(int, OKVisualEffects);
189 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorB, int);
190 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorC, int);
191 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorD, int);
192 virtual DATA_BASE_VALUE(cfestring&, SitMessage);
193 DATA_BASE_TRUTH(ShowMaterial);
194 DATA_BASE_VALUE(int, Walkability);
195 DATA_BASE_TRUTH(UseBorderTiles);
196 DATA_BASE_VALUE(int, BorderTilePriority);
197 virtual int GetAttachedGod() const;
198 virtual int GetTheoreticalWalkability() const { return DataBase->Walkability; }
199 void Draw(blitdata&) const;
200 virtual truth IsAnimated() const;
201 protected:
202 virtual void InstallDataBase(int);
203 virtual int GetGraphicsContainerIndex() const;
204 virtual const prototype* FindProtoType() const { return &ProtoType; }
205 virtual v2 GetBitmapPos(int) const;
206 v2 GetBorderBitmapPos(v2, int) const;
207 virtual void ModifyAnimationFrames(int&) const;
208 static const prototype ProtoType;
209 const database* DataBase;
212 struct olterraindatabase : public lterraindatabase
214 typedef olterrainprototype prototype;
215 void InitDefaults (const olterrainprototype *NewProtoType, int NewConfig, cfestring &acfgstrname);
216 truth AllowRandomInstantiation() const;
217 const prototype* ProtoType;
218 festring DigMessage;
219 int RestModifier;
220 festring RestMessage;
221 sLong StorageVolume;
222 int HPModifier;
223 v2 OpenBitmapPos;
224 v2 WindowBitmapPos;
225 fearray<contentscript<item> > LeftOverItems;
226 truth CreateDivineConfigurations;
227 truth CanBeDestroyed;
228 truth IsUpLink;
229 truth CreateLockConfigurations;
230 truth IsAlwaysTransparent;
231 truth ShowThingsUnder;
232 truth IsWall;
233 truth CreateWindowConfigurations;
234 truth IsSafeToCreateDoor;
237 class olterrainprototype
239 public:
240 friend class databasecreator<olterrain>;
242 olterrainprototype(const olterrainprototype*, olterrainspawner, cchar*);
243 virtual ~olterrainprototype () {}
245 olterrain* Spawn(int Config = 0, int SpecialFlags = 0) const { return Spawner(Config, SpecialFlags); }
246 olterrain* SpawnAndLoad(inputfile&) const;
247 cchar* GetClassID() const { return ClassID; }
248 int GetIndex() const { return Index; }
249 const olterrainprototype* GetBase() const { return Base; }
250 int CreateSpecialConfigurations(olterraindatabase**, int, int);
251 const olterraindatabase* ChooseBaseForConfig(olterraindatabase** TempConfig, int, int) { return *TempConfig; }
252 const olterraindatabase*const* GetConfigData() const { return ConfigData; }
253 int GetConfigSize() const { return ConfigSize; }
254 private:
255 int Index;
256 const olterrainprototype* Base;
257 olterraindatabase** ConfigData;
258 olterraindatabase** ConfigTable[CONFIG_TABLE_SIZE];
259 int ConfigSize;
260 olterrainspawner Spawner;
261 cchar* ClassID;
263 public:
264 EventHandlerMap mOnEvents;
267 class olterrain : public lterrain, public oterrain
269 public:
270 friend class databasecreator<olterrain>;
271 typedef olterrainprototype prototype;
272 typedef olterraindatabase database;
274 virtual ~olterrain () {}
276 virtual void Save(outputfile&) const;
277 virtual void Load(inputfile&);
278 virtual truth Enter(truth) const;
279 virtual void BeKicked(character*, int, int);
280 virtual truth IsDoor() const { return false; }
281 virtual truth HasEatEffect() const { return false; }
282 virtual truth HasDrinkEffect() const { return false; }
283 virtual truth Eat(character*) { return false; }
284 virtual truth Drink(character*) { return false; }
285 virtual void Lock() { }
286 virtual truth IsLocked() const { return false; }
287 virtual void CreateBoobyTrap() { }
288 virtual void HasBeenHitByItem(character*, item*, int) { }
289 virtual void Break();
290 int GetHP() const { return HP; }
291 void EditHP(int What) { HP += What; }
292 virtual void ReceiveDamage(character*, int, int);
293 int GetType() const { return GetProtoType()->GetIndex(); }
294 const database* GetDataBase() const { return DataBase; }
295 void ShowRestMessage(character*) const;
296 DATA_BASE_VALUE(const prototype*, ProtoType);
297 DATA_BASE_VALUE(int, Config);
298 DATA_BASE_TRUTH(UsesLongArticle);
299 DATA_BASE_VALUE(cfestring&, Adjective);
300 DATA_BASE_TRUTH(UsesLongAdjectiveArticle);
301 DATA_BASE_VALUE(cfestring&, NameSingular);
302 DATA_BASE_VALUE(cfestring&, NamePlural);
303 DATA_BASE_VALUE(cfestring&, PostFix);
304 DATA_BASE_VALUE(int, ArticleMode);
305 virtual DATA_BASE_VALUE(const fearray<sLong>&, MainMaterialConfig);
306 DATA_BASE_VALUE(const fearray<sLong>&, SecondaryMaterialConfig);
307 virtual DATA_BASE_VALUE(const fearray<sLong>&, MaterialConfigChances);
308 virtual DATA_BASE_VALUE(sLong, MaterialConfigChanceSum);
309 DATA_BASE_VALUE(int, OKVisualEffects);
310 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorB, int);
311 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorC, int);
312 virtual DATA_BASE_VALUE_WITH_PARAMETER(col16, MaterialColorD, int);
313 virtual DATA_BASE_VALUE(cfestring&, SitMessage);
314 DATA_BASE_TRUTH(ShowMaterial);
315 DATA_BASE_VALUE(cfestring&, DigMessage);
316 truth CanBeDestroyed() const;
317 DATA_BASE_VALUE(int, RestModifier);
318 DATA_BASE_VALUE(cfestring&, RestMessage);
319 DATA_BASE_TRUTH(IsUpLink);
320 DATA_BASE_VALUE(sLong, StorageVolume);
321 DATA_BASE_VALUE(int, HPModifier);
322 DATA_BASE_TRUTH(IsSafeToCreateDoor);
323 DATA_BASE_VALUE_WITH_PARAMETER(v2, OpenBitmapPos, int);
324 DATA_BASE_TRUTH(UseBorderTiles);
325 DATA_BASE_VALUE(int, BorderTilePriority);
326 virtual DATA_BASE_VALUE(int, Walkability);
327 DATA_BASE_TRUTH(IsAlwaysTransparent);
328 DATA_BASE_TRUTH(CreateWindowConfigurations);
329 DATA_BASE_VALUE(v2, WindowBitmapPos);
330 DATA_BASE_VALUE(const fearray<contentscript<item> >&, LeftOverItems);
331 DATA_BASE_TRUTH(IsWall);
332 virtual void SetAttachedArea(int) { }
333 virtual void SetAttachedEntry(int) { }
334 virtual int GetAttachedArea () const { return 0; }
335 virtual int GetAttachedEntry () const { return 0; }
336 virtual void SetText(cfestring&) { }
337 virtual festring GetText() const;
338 virtual void SetItemsInside(const fearray<contentscript<item> >&, int) { }
339 int GetStrengthValue() const;
340 virtual void SignalVolumeAndWeightChange() { HP = CalculateMaxHP(); }
341 int CalculateMaxHP();
342 virtual int GetAttachedGod() const;
343 void SetConfig(int, int = 0);
344 god* GetMasterGod() const;
345 virtual truth IsTransparent() const;
346 virtual void Draw(blitdata&) const;
347 virtual int GetTheoreticalWalkability() const { return DataBase->Walkability; }
348 virtual void BeDestroyed() { Break(); }
349 virtual void ReceiveAcid(material*, sLong);
350 virtual void SignalRustLevelChange();
351 virtual truth IsFountainWithWater() const { return false; }
352 truth ShowThingsUnder() const;
353 truth WillBeDestroyedBy(ccharacter*) const;
354 virtual void PreProcessForBone() { }
355 virtual void PostProcessForBone() { }
356 virtual void FinalProcessForBone() { }
357 virtual void RestoreHP() { HP = CalculateMaxHP(); }
358 virtual truth IsAnimated() const;
359 virtual truth VomitingIsDangerous(ccharacter*) const { return false; }
360 virtual void AddSpecialCursors() { }
361 virtual truth IsWard() const { return false; }
362 protected:
363 virtual v2 GetBitmapPos(int) const;
364 v2 GetBorderBitmapPos(v2, int) const;
365 virtual void ModifyAnimationFrames(int&) const;
366 virtual void InstallDataBase(int);
367 virtual int GetGraphicsContainerIndex() const;
368 virtual const prototype* FindProtoType() const { return &ProtoType; }
369 static const prototype ProtoType;
370 const database* DataBase;
371 int HP;
374 #ifdef __FILE_OF_STATIC_LTERRAIN_PROTOTYPE_DEFINITIONS__
375 #define LTERRAIN_PROTO(name, base, protobase)\
376 template<> const protobase##prototype\
377 name##sysbase::ProtoType(&base::ProtoType,\
378 (protobase##spawner)(&name##sysbase::Spawn),\
379 #name);
380 #else
381 #define LTERRAIN_PROTO(name, base, protobase)
382 #endif
384 #define LTERRAIN(name, base, protobase)\
385 class name;\
386 typedef sysbase<name, base, protobase##prototype> name##sysbase;\
387 LTERRAIN_PROTO(name, base, protobase)\
388 class name : public name##sysbase
390 #define GLTERRAIN(name, base) LTERRAIN(name, base, glterrain)
391 #define OLTERRAIN(name, base) LTERRAIN(name, base, olterrain)
394 #endif