3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
8 * See LICENSING which should be included
9 * along with this file for more details
15 #include "ivancommon.h"
32 class glterrainprototype
;
33 class olterrainprototype
;
34 template <class type
> class databasecreator
;
37 typedef glterrain
* (*glterrainspawner
)(int, int);
38 typedef olterrain
* (*olterrainspawner
)(int, int);
40 struct lterraindatabase
: public databasebase
42 void PostProcess() { }
44 truth UsesLongArticle
;
46 truth UsesLongAdjectiveArticle
;
47 festring NameSingular
;
51 fearray
<sLong
> MainMaterialConfig
;
52 fearray
<sLong
> SecondaryMaterialConfig
;
53 fearray
<sLong
> MaterialConfigChances
;
54 sLong MaterialConfigChanceSum
;
64 truth HasSecondaryMaterial
;
66 int BorderTilePriority
;
69 class lterrain
: public object
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; }
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;
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
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
; }
150 const glterrainprototype
* Base
;
151 glterraindatabase
** ConfigData
;
152 glterraindatabase
** ConfigTable
[CONFIG_TABLE_SIZE
];
154 glterrainspawner Spawner
;
158 EventHandlerMap mOnEvents
;
161 class glterrain
: public lterrain
, public gterrain
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;
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
;
220 festring RestMessage
;
225 fearray
<contentscript
<item
> > LeftOverItems
;
226 truth CreateDivineConfigurations
;
227 truth CanBeDestroyed
;
229 truth CreateLockConfigurations
;
230 truth IsAlwaysTransparent
;
231 truth ShowThingsUnder
;
233 truth CreateWindowConfigurations
;
234 truth IsSafeToCreateDoor
;
237 class olterrainprototype
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
; }
256 const olterrainprototype
* Base
;
257 olterraindatabase
** ConfigData
;
258 olterraindatabase
** ConfigTable
[CONFIG_TABLE_SIZE
];
260 olterrainspawner Spawner
;
264 EventHandlerMap mOnEvents
;
267 class olterrain
: public lterrain
, public oterrain
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; }
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
;
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),\
381 #define LTERRAIN_PROTO(name, base, protobase)
384 #define LTERRAIN(name, base, protobase)\
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)