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