finished adding content from CLIVAN; not tested yet
[k8-i-v-a-n.git] / src / game / items / item_holymango.cpp
blob3d0271c7cceade4a08cea9ad585d9b77d359440f
1 #ifdef HEADER_PHASE
2 ITEM(holymango, item)
4 public:
5 virtual truth HitEffect (character *, character *, v2, int, int, truth);
6 //virtual truth Zap (character *, v2, int);
7 //virtual void Be () {}
8 virtual int GetSpecialFlags () const;
9 virtual void AddInventoryEntry (ccharacter *, festring &, int, truth) const;
10 virtual truth ReceiveDamage (character *, int, int, int);
11 virtual truth IsMango () const { return true; }
15 #else
18 int holymango::GetSpecialFlags () const { return ST_FLAME_1; }
21 truth holymango::HitEffect (character *Enemy, character *Hitter, v2 HitPos, int BodyPartIndex, int Direction, truth BlockedByArmour) {
22 truth BaseSuccess = 1;//mango::HitEffect(Enemy, Hitter, HitPos, BodyPartIndex, Direction, BlockedByArmour);
24 if (Enemy->IsEnabled() && RAND() & 1) {
25 if (Enemy->IsPlayer() || Hitter->IsPlayer() || Enemy->CanBeSeenByPlayer() || Hitter->CanBeSeenByPlayer()) {
26 ADD_MESSAGE("%s mango burns %s.", Hitter->CHAR_POSSESSIVE_PRONOUN, Enemy->CHAR_DESCRIPTION(DEFINITE));
28 return Enemy->ReceiveBodyPartDamage(Hitter, 2 + (RAND() & 3), FIRE, BodyPartIndex, Direction) || BaseSuccess;
30 return BaseSuccess;
35 truth holymango::Zap (character *Zapper, v2, int Direction) {
36 if (Charges > TimesUsed) {
37 ADD_MESSAGE("BANG! You zap %s!", CHAR_NAME(DEFINITE));
38 Zapper->EditExperience(PERCEPTION, 150, 1 << 10);
39 beamdata Beam(
40 Zapper,
41 CONST_S("killed by ") + GetName(INDEFINITE),
42 Zapper->GetPos(),
43 YELLOW,
44 BEAM_FIRE_BALL,
45 Direction,
46 50,
49 (GetLevel()->*level::GetBeam(PARTICLE_BEAM))(Beam);
50 ++TimesUsed;
51 } else {
52 ADD_MESSAGE("Click!");
54 return true;
59 // never piled
60 void holymango::AddInventoryEntry (ccharacter *Viewer, festring& Entry, int, truth ShowSpecialInfo) const {
61 AddName(Entry, INDEFINITE);
62 if (ShowSpecialInfo) {
63 Entry << " [" << GetWeight() << "g, DAM " << GetBaseMinDamage() << '-' << GetBaseMaxDamage();
64 Entry << ", " << GetBaseToHitValueDescription();
65 if (!IsBroken()) Entry << ", " << GetStrengthValueDescription();
66 int CWeaponSkillLevel = Viewer->GetCWeaponSkillLevel(this);
67 int SWeaponSkillLevel = Viewer->GetSWeaponSkillLevel(this);
68 if (CWeaponSkillLevel || SWeaponSkillLevel) Entry << ", skill " << CWeaponSkillLevel << '/' << SWeaponSkillLevel;
69 Entry << ']';
74 truth holymango::ReceiveDamage (character *Damager, int Damage, int Type, int) {
75 if (Type & (PHYSICAL_DAMAGE|FIRE|ENERGY) && Damage && (Damage > 50 || !(RAND()%(100/Damage)))) {
76 lsquare *Square = GetLSquareUnder();
77 festring DeathMsg = CONST_S("killed by an explosion of ");
79 AddName(DeathMsg, INDEFINITE);
80 if (Damager) DeathMsg << " caused @bk";
81 if (GetSquareUnder()->CanBeSeenByPlayer(true)) ADD_MESSAGE("%s explodes!", GetExtendedDescription().CStr());
82 RemoveFromSlot();
83 SendToHell();
84 Square->GetLevel()->Explosion(Damager, DeathMsg, Square->GetPos(), 6*50);
85 return true;
87 return false;
91 #endif