moved almost all hardcoded constants to "define.dat"
[k8-i-v-a-n.git] / src / game / smoke.cpp
blob587da5f12a1444d692845b0b5cff23dd9c1a8e96
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
13 /* Compiled through materset.cpp */
15 smoke::smoke() : entity(HAS_BE), Next(0) { }
16 square* smoke::GetSquareUnderEntity(int) const { return LSquareUnder; }
18 smoke::smoke(gas* Gas, lsquare* LSquareUnder) : entity(HAS_BE), Next(0), Gas(Gas), LSquareUnder(LSquareUnder), Alpha(Gas->GetAlpha())
20 Gas->SetMotherEntity(this);
21 Picture.resize(16);
22 packcol16 Color = Gas->GetColor();
23 bitmap Temp(TILE_V2, TRANSPARENT_COLOR);
24 Temp.ActivateFastFlag();
25 int Frame[16];
26 int Flags[16];
28 for(int c = 0; c < 16; ++c)
30 Picture[c] = new bitmap(TILE_V2, TRANSPARENT_COLOR);
31 Picture[c]->ActivateFastFlag();
32 Picture[c]->CreateAlphaMap(Alpha);
33 truth Correct = false;
35 while(!Correct)
37 Frame[c] = RAND() & 3;
38 Flags[c] = RAND() & 7;
39 Correct = true;
41 for(int i = 0; i < c; ++i)
42 if(Frame[c] == Frame[i] && Flags[c] == Flags[i])
44 Correct = false;
45 break;
49 igraph::GetRawGraphic(GR_EFFECT)->MaskedBlit(&Temp, v2(Frame[c] << 4, 32), ZERO_V2, TILE_V2, &Color);
50 Temp.NormalBlit(Picture[c], Flags[c]);
53 LSquareUnder->SignalSmokeAlphaChange(Alpha);
56 smoke::~smoke()
58 for(uInt c = 0; c < Picture.size(); ++c)
59 delete Picture[c];
61 delete Gas;
64 void smoke::Be()
66 if(!(RAND() & 7))
68 LSquareUnder->SendNewDrawRequest();
69 LSquareUnder->SignalSmokeAlphaChange(-1);
71 if(!--Alpha)
73 LSquareUnder->RemoveSmoke(this);
74 SendToHell();
75 return;
78 for(int c = 0; c < 16; ++c)
79 Picture[c]->FillAlpha(Alpha);
81 Gas->SetVolume(Gas->GetVolume() - Gas->GetVolume() / 50);
84 character* Char = LSquareUnder->GetCharacter();
86 if(Char && !Char->StateIsActivated(GAS_IMMUNITY))
87 Gas->BreatheEffect(Char);
90 void smoke::Draw(blitdata& BlitData) const
92 Picture[(GET_TICK() >> 1) & 3]->AlphaLuminanceBlit(BlitData);
95 void smoke::Save(outputfile& SaveFile) const
97 SaveFile << Picture << Gas << Alpha;
100 void smoke::Load(inputfile& SaveFile)
102 LSquareUnder = static_cast<lsquare*>(game::GetSquareInLoad());
103 SaveFile >> Picture >> Gas >> Alpha;
104 Gas->SetMotherEntity(this);
107 outputfile& operator<<(outputfile& SaveFile, const smoke* Smoke)
109 Smoke->Save(SaveFile);
110 return SaveFile;
113 inputfile& operator>>(inputfile& SaveFile, smoke*& Smoke)
115 Smoke = new smoke;
116 Smoke->Load(SaveFile);
117 return SaveFile;
120 void smoke::AddBreatheMessage() const
122 if(Gas->GetBreatheMessage().GetSize())
123 ADD_MESSAGE("%s", Gas->GetBreatheMessage().CStr());
126 void smoke::Merge(gas* OtherGas)
128 Gas->EditVolume(OtherGas->GetVolume());
129 LSquareUnder->SignalSmokeAlphaChange(OtherGas->GetAlpha() - Alpha);
130 Alpha = OtherGas->GetAlpha();
132 for(int c = 0; c < 16; ++c)
133 Picture[c]->FillAlpha(Alpha);
135 delete OtherGas;
138 truth smoke::IsDangerousToBreathe(ccharacter* Who) const
140 return (!Who->StateIsActivated(GAS_IMMUNITY)
141 && Who->GetAttribute(WISDOM) >= Gas->GetStepInWisdomLimit());
144 truth smoke::IsScaryToBreathe(ccharacter* Who) const
146 return (!Who->StateIsActivated(GAS_IMMUNITY)
147 && Gas->GetCategoryFlags() & IS_SCARY);