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
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);
22 packcol16 Color
= Gas
->GetColor();
23 bitmap
Temp(TILE_V2
, TRANSPARENT_COLOR
);
24 Temp
.ActivateFastFlag();
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;
37 Frame
[c
] = RAND() & 3;
38 Flags
[c
] = RAND() & 7;
41 for(int i
= 0; i
< c
; ++i
)
42 if(Frame
[c
] == Frame
[i
] && Flags
[c
] == Flags
[i
])
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
);
58 for(uInt c
= 0; c
< Picture
.size(); ++c
)
68 LSquareUnder
->SendNewDrawRequest();
69 LSquareUnder
->SignalSmokeAlphaChange(-1);
73 LSquareUnder
->RemoveSmoke(this);
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
);
113 inputfile
& operator>>(inputfile
& SaveFile
, smoke
*& Smoke
)
116 Smoke
->Load(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
);
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
);