1 /*
2  *
3  *  Iter Vehemens ad Necem (IVAN)
4  *  Copyright (C) Timo Kiviluoto
5  *  Released under the GNU General
6  *  Public License
7  *
8  *  See LICENSING which should be included
9  *  along with this file for more details
10  *
11  */
12 
13 #ifndef __LSQUARE_H__
14 #define __LSQUARE_H__
15 
16 #include "level.h"
17 #include "dungeon.h"
18 #include "lterra.h"
19 
20 #ifndef LIGHT_BORDER
21 #define LIGHT_BORDER 80
22 #endif
23 
24 class stack;
25 class glterrain;
26 class olterrain;
27 class fluid;
28 class material;
29 class item;
30 class smoke;
31 class hiteffect;
32 class gas;
33 class bodypart;
34 class liquid;
35 class rain;
36 class trap;
37 struct sortdata;
38 struct hiteffectSetup;
39 
40 typedef std::vector<item*> itemvector;
41 typedef truth (item::*sorter)(ccharacter*) const;
42 
43 struct emitter
44 {
emitteremitter45   emitter(ulong ID, col24 Emitation) : ID(ID), Emitation(Emitation) { }
46   explicit emitter() = default;
47   ulong ID;
48   col24 Emitation;
49 };
50 
MakeEmitterID(v2 Pos)51 inline ulong MakeEmitterID(v2 Pos)
52 {
53   return Pos.X + (Pos.Y << 8);
54 }
55 
ExtractPosFromEmitterID(ulong ID)56 inline v2 ExtractPosFromEmitterID(ulong ID)
57 {
58   return v2(ID & 0xFF, (ID >> 8) & 0xFF);
59 }
60 
61 typedef std::vector<emitter> emittervector;
62 
63 outputfile& operator<<(outputfile&, const emitter&);
64 inputfile& operator>>(inputfile&, emitter&);
65 
66 struct eyecontroller
67 {
68   static truth Handler(int, int);
69   static lsquare*** Map;
70 };
71 
72 struct pathcontroller
73 {
74   static truth Handler(int, int);
75   static lsquare*** Map;
76   static ccharacter* Character;
77 };
78 
79 struct stackcontroller
80 {
81   static lsquare*** Map;
82   static lsquare** Stack;
83   static long StackIndex;
84   static int LevelXSize, LevelYSize;
85   static v2 Center;
86 };
87 
88 struct tickcontroller
89 {
90   static void PrepareShiftedTick();
91   static ulong Tick;
92   static ulong ShiftedTick[4];
93   static ulong ShiftedQuadriTick[4];
94 };
95 
96 class lsquare : public square
97 {
98  public:
99   friend class level;
100   friend struct loscontroller;
101   friend struct sunbeamcontroller;
102   friend struct areacontroller;
103   friend struct emitationcontroller;
104   friend struct noxifycontroller;
105   lsquare(level*, v2);
106   virtual ~lsquare();
107   virtual void AddCharacter(character*);
108   virtual void RemoveCharacter();
GetStack()109   stack* GetStack() const { return Stack; }
110   void AlterLuminance(ulong, col24);
Emitate()111   void Emitate() { Emitate(Emitation); }
112   void Emitate(col24, ulong = 0);
113   void Clean();
114   truth Open(character*);
115   truth Close(character*);
116   virtual void Save(outputfile&) const;
117   virtual void Load(inputfile&);
118   void SignalEmitationIncrease(col24);
119   void SignalEmitationDecrease(col24);
GetEmitation()120   col24 GetEmitation() const { return Emitation; }
Noxify()121   void Noxify() { Noxify(Emitation); }
122   void Noxify(col24, ulong = 0);
123   truth NoxifyEmitter(ulong);
GetEngraved()124   cchar* GetEngraved() const { return Engraved; }
125   truth Engrave(cfestring&);
126   void UpdateMemorizedDescription(truth = false);
127   truth BeKicked(character*, item*, bodypart*, double, double, int, int, truth, truth);
128   int GetDivineMaster() const;
129   void DrawHitEffect();
130   void Draw(blitdata&) const;
131   void UpdateMemorized();
132   truth CanBeDug() const;
GetGTerrain()133   virtual gterrain* GetGTerrain() const { return GLTerrain; }
GetOTerrain()134   virtual oterrain* GetOTerrain() const { return OLTerrain; }
GetGLTerrain()135   glterrain* GetGLTerrain() const { return GLTerrain; }
GetOLTerrain()136   olterrain* GetOLTerrain() const { return OLTerrain; }
137   void ChangeLTerrain(glterrain*, olterrain*);
GetLevel()138   level* GetLevel() const { return static_cast<level*>(AreaUnder); }
SetLevelUnder(level * What)139   void SetLevelUnder(level* What) { AreaUnder = What; }
140   void ChangeGLTerrain(glterrain*);
141   void ChangeOLTerrain(olterrain*);
142   void SetLTerrain(glterrain*, olterrain*);
143   void ApplyScript(const squarescript*, room*);
144   virtual truth CanBeSeenByPlayer(truth = false) const;
145   virtual truth CanBeSeenFrom(v2, long, truth = false) const ;
146   void StepOn(character*, lsquare**);
GetRoomIndex()147   uint GetRoomIndex() const { return RoomIndex; }
SetRoomIndex(uint What)148   void SetRoomIndex(uint What) { RoomIndex = What; }
149   void ReceiveVomit(character*, liquid*);
GetRoom()150   room* GetRoom() const { return RoomIndex ? GetLevel()->GetRoom(RoomIndex) : 0; }
151   void SetTemporaryEmitation(col24);
GetTemporaryEmitation()152   col24 GetTemporaryEmitation() const { return TemporaryEmitation; }
153   void ChangeOLTerrainAndUpdateLights(olterrain*);
154   void DrawParticles(long, truth = true);
155   v2 DrawLightning(v2, long, int, truth = true);
156   truth DipInto(item*, character*);
157   truth TryKey(item*, character*);
158   void SignalSeen(ulong);
159   void CalculateLuminance();
160   void DrawStaticContents(blitdata&) const;
161   void DrawMemorized(blitdata&) const;
162   void DrawMemorizedCharacter(blitdata&) const;
163   void SendMemorizedUpdateRequest();
164   lsquare* GetNeighbourLSquare(int) const;
GetNearLSquare(v2 Pos)165   lsquare* GetNearLSquare(v2 Pos) const { return static_cast<lsquare*>(AreaUnder->GetSquare(Pos)); }
166   truth IsDangerous(ccharacter*) const;
167   truth IsScary(ccharacter*) const;
168   stack* GetStackOfAdjacentSquare(int) const;
169   void KickAnyoneStandingHereAway();
170   truth IsDark() const;
171   void AddItem(item*);
172   static truth (lsquare::*GetBeamEffect(int))(const beamdata&);
173   truth Polymorph(const beamdata&);
174   truth Strike(const beamdata&);
175   truth FireBall(const beamdata&);
176   truth Teleport(const beamdata&);
177   truth Haste(const beamdata&);
178   truth Slow(const beamdata&);
179   truth Resurrect(const beamdata&);
180   truth Invisibility(const beamdata&);
181   truth Duplicate(const beamdata&);
182   truth Lightning(const beamdata&);
183   truth DoorCreation(const beamdata&);
184   truth WallCreation(const beamdata&);
185   truth AcidRain(const beamdata&);
186   truth Necromancy(const beamdata&);
187   truth Webbing(const beamdata&);
188   truth Alchemize(const beamdata&);
189   truth SoftenMaterial(const beamdata&);
190   truth LiquidRain(const beamdata&, int);
GetLevelIndex()191   int GetLevelIndex() const { return static_cast<level*>(AreaUnder)->GetIndex(); }
GetDungeonIndex()192   int GetDungeonIndex() const { return static_cast<level*>(AreaUnder)->GetDungeon()->GetIndex(); }
GetDungeon()193   dungeon* GetDungeon() const { return static_cast<level*>(AreaUnder)->GetDungeon(); }
194   truth CheckKick(ccharacter*) const;
195   void GetHitByExplosion(const explosion*);
196   int GetSpoiledItems() const;
197   void SortAllItems(const sortdata&);
198   truth LowerEnchantment(const beamdata&);
199   void RemoveSmoke(smoke*);
200   void AddSmoke(gas*);
IsFlyable()201   truth IsFlyable() const { return !OLTerrain || (OLTerrain->GetWalkability() & FLY); }
IsTransparent()202   truth IsTransparent() const { return Flags & IS_TRANSPARENT; }
IsMaterialDetected()203   truth IsMaterialDetected() const { return bMaterialDetected; }
204   hiteffect* AddHitEffect(hiteffectSetup);
205   void RemoveHitEffect(hiteffect* ToBeRemoved);
206   void SignalSmokeAlphaChange(int);
207   void ShowSmokeMessage() const;
208   void DisplaySmokeInfo(festring&) const;
209   truth IsDipDestination() const;
210   void ReceiveEarthQuakeDamage();
211   truth CanBeFeltByPlayer() const;
212   void PreProcessForBone();
213   void PostProcessForBone(double&, int&);
214   void DisplayEngravedInfo(festring&) const;
215   truth EngravingsCanBeReadByPlayer();
HasEngravings()216   truth HasEngravings() const { return truth(Engraved); }
217   void FinalProcessForBone();
IsFreezed()218   truth IsFreezed() const { return Flags & FREEZED; }
219   truth IsDangerousToBreathe(ccharacter*) const;
220   truth IsScaryToBreathe(ccharacter*) const;
221   int GetWalkability() const;
GetTheoreticalWalkability()222   int GetTheoreticalWalkability() const { return OLTerrain ? OLTerrain->GetTheoreticalWalkability() & GLTerrain->GetTheoreticalWalkability() : GLTerrain->GetTheoreticalWalkability(); }
GetSquareWalkability()223   virtual int GetSquareWalkability() const { return GetWalkability(); }
224   void CalculateGroundBorderPartners();
225   void RequestForGroundBorderPartnerUpdates();
226   void CalculateOverBorderPartners();
227   void RequestForOverBorderPartnerUpdates();
228   void SpillFluid(character*, liquid*, truth = false, truth = true);
229   void DisplayFluidInfo(festring&) const;
230   void RemoveFluid(fluid*);
231   fluid* AddFluid(liquid*);
232   void DrawStacks(blitdata&) const;
FluidIsVisible()233   truth FluidIsVisible() const { return SmokeAlphaSum < 175; }
234   void RemoveRain(rain*);
235   void AddRain(liquid*, v2, int, truth);
IsInside()236   truth IsInside() const { return Flags & INSIDE; }
237   void RemoveSunLight();
238   void CheckIfIsSecondarySunLightEmitter();
239   void CalculateNeighbourLSquares();
GetEmitter()240   const emittervector& GetEmitter() const { return Emitter; }
241   void EnableGlobalRain();
242   void DisableGlobalRain();
Freeze()243   void Freeze() { Flags |= FREEZED; }
UnFreeze()244   void UnFreeze() { Flags &= ~FREEZED; }
245   void InitLastSeen();
246   void GetSideItemDescription(festring&, truth = false) const;
247   void AddSunLightEmitter(ulong);
248   void SendSunLightSignals();
GetSunEmitter()249   const sunemittervector& GetSunEmitter() const { return SunEmitter; }
250   void ZeroReSunEmitatedFlags();
HasBeenSeen()251   virtual truth HasBeenSeen() const { return truth(Memorized); }
252   truth CalculateIsTransparent();
253   void CalculateSunLightLuminance(ulong);
254   void CreateMemorized();
255   truth DetectMaterial(cmaterial*) const;
256   void Reveal(ulong, truth = false);
257   void DestroyMemorized();
258   void SwapMemorized(lsquare*);
259   truth HasNoBorderPartners() const;
260   lsquare* GetRandomAdjacentSquare() const;
261   void SignalPossibleTransparencyChange();
262   truth AddTrap(trap*);
263   void RemoveTrap(trap*);
264   void DisplayTrapInfo(festring&) const;
265   void FillTrapVector(std::vector<trap*>&) const;
266   void ReceiveTrapDamage(character*, int, int, int = YOURSELF);
267   truth HasDangerousTraps(ccharacter*) const;
268   truth HasDangerousFluids(ccharacter*) const;
269   void AddLocationDescription(festring&) const;
270   truth VomitingIsDangerous(ccharacter*) const;
271   bool TeleportAllSmokeAway();
272   bool TeleportAllFluidsAway();
273   bool TeleportAllTrapsAway();
274   void AddSpecialCursors();
275  protected:
276   void ChangeLuminance(col24&, col24);
277   void RemoveLuminance(col24&);
278   void CalculateEmitation();
279   void UpdateStaticContentCache(col24) const;
280   mutable struct staticcontentcache
281   {
staticcontentcachestaticcontentcache282     staticcontentcache() : Bitmap(0), Luminance(0) { }
283     bitmap* Bitmap;
284     col24 Luminance;
285   } StaticContentCache;
286   fluid* Fluid;
287   smoke* Smoke;
288   hiteffect* HitEffect;
289   truth bMaterialDetected; //temporary
290   rain* Rain;
291   trap* Trap;
292   emittervector Emitter;
293   sunemittervector SunEmitter;
294   glterrain* GLTerrain;
295   olterrain* OLTerrain;
296   stack* Stack;
297   bitmap* Memorized;
298   bitmap* FowMemorized;
299   char* Engraved;
300   glterrain** GroundBorderPartnerTerrain;
301   ulong GroundBorderPartnerInfo;
302   olterrain** OverBorderPartnerTerrain;
303   ulong OverBorderPartnerInfo;
304   ulong SquarePartEmitationTick;
305   ulong SquarePartLastSeen;
306   col24 Emitation;
307   int SmokeAlphaSum;
308   lsquare* NeighbourLSquare[8];
309   col24 AmbientLuminance;
310   col24 SunLightLuminance;
311   col24 TemporaryEmitation;
312   col24 SecondarySunLightEmitation;
313   ushort LastExplosionID;
314   uchar RoomIndex;
315 };
316 
IsDark()317 inline truth lsquare::IsDark() const
318 {
319   col24 Light = Luminance;
320 
321   return (!Light
322           || ((Light & 0xFF0000) < (LIGHT_BORDER << 16)
323               && (Light & 0x00FF00) < (LIGHT_BORDER << 8)
324               && (Light & 0x0000FF) < LIGHT_BORDER));
325 }
326 
Handler(int x,int y)327 inline truth eyecontroller::Handler(int x, int y)
328 {
329   return Map[x][y]->IsTransparent();
330 }
331 
GetNeighbourLSquare(int I)332 inline lsquare* lsquare::GetNeighbourLSquare(int I) const
333 {
334   return I < 8 ? NeighbourLSquare[I] : const_cast<lsquare*>(this);
335 }
336 
337 #endif
338