moved almost all hardcoded constants to "define.dat"
[k8-i-v-a-n.git] / src / game / items / banana_holybanana.cpp
blobc6c93f8964c79ccb8ba0441422ef34a580b77549
1 #ifdef HEADER_PHASE
2 ITEM(holybanana, banana)
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);
14 #else
18 int holybanana::GetSpecialFlags() const { return ST_FLAME_1; }
22 truth holybanana::HitEffect(character* Enemy, character* Hitter, v2 HitPos, int BodyPartIndex, int Direction, truth BlockedByArmour)
24 truth BaseSuccess = banana::HitEffect(Enemy, Hitter, HitPos, BodyPartIndex, Direction, BlockedByArmour);
26 if(Enemy->IsEnabled() && RAND() & 1)
28 if(Enemy->IsPlayer() || Hitter->IsPlayer() || Enemy->CanBeSeenByPlayer() || Hitter->CanBeSeenByPlayer())
29 ADD_MESSAGE("%s banana burns %s.", Hitter->CHAR_POSSESSIVE_PRONOUN, Enemy->CHAR_DESCRIPTION(DEFINITE));
31 return Enemy->ReceiveBodyPartDamage(Hitter, 2 + (RAND() & 3), FIRE, BodyPartIndex, Direction) || BaseSuccess;
33 else
34 return BaseSuccess;
39 truth holybanana::Zap(character* Zapper, v2, int Direction)
41 if(Charges > TimesUsed)
43 ADD_MESSAGE("BANG! You zap %s!", CHAR_NAME(DEFINITE));
44 Zapper->EditExperience(PERCEPTION, 150, 1 << 10);
46 beamdata Beam
48 Zapper,
49 CONST_S("killed by ") + GetName(INDEFINITE),
50 Zapper->GetPos(),
51 YELLOW,
52 BEAM_FIRE_BALL,
53 Direction,
54 50,
58 (GetLevel()->*level::GetBeam(PARTICLE_BEAM))(Beam);
59 ++TimesUsed;
61 else
62 ADD_MESSAGE("Click!");
64 return true;
69 void holybanana::AddInventoryEntry(ccharacter* Viewer, festring& Entry, int, truth ShowSpecialInfo) const // never piled
71 AddName(Entry, INDEFINITE);
73 if(ShowSpecialInfo)
75 Entry << " [\1C" << GetWeight() << "g\2, DAM \1Y" << GetBaseMinDamage() << "\2-\1Y" << GetBaseMaxDamage() << "\2";
76 Entry << ", " << GetBaseToHitValueDescription();
78 if(!IsBroken())
79 Entry << ", " << GetStrengthValueDescription();
81 int CWeaponSkillLevel = Viewer->GetCWeaponSkillLevel(this);
82 int SWeaponSkillLevel = Viewer->GetSWeaponSkillLevel(this);
84 if(CWeaponSkillLevel || SWeaponSkillLevel)
85 Entry << ", skill \1C" << CWeaponSkillLevel << '/' << SWeaponSkillLevel << "\2";
87 if(TimesUsed == 1)
88 Entry << ", used \1C1\2 time";
89 else if(TimesUsed)
90 Entry << ", used \1C" << TimesUsed << "\2 times";
92 Entry << ']';
98 truth holybanana::ReceiveDamage(character* Damager, int Damage, int Type, int)
100 if(TimesUsed != 6 && Type & (PHYSICAL_DAMAGE|FIRE|ENERGY) && Damage && (Damage > 50 || !(RAND() % (100 / Damage))))
102 festring DeathMsg = CONST_S("killed by an explosion of ");
103 AddName(DeathMsg, INDEFINITE);
105 if(Damager)
106 DeathMsg << " caused @bk";
108 if(GetSquareUnder()->CanBeSeenByPlayer(true))
109 ADD_MESSAGE("%s explodes!", GetExtendedDescription().CStr());
111 lsquare* Square = GetLSquareUnder();
112 RemoveFromSlot();
113 SendToHell();
114 Square->GetLevel()->Explosion(Damager, DeathMsg, Square->GetPos(), (6 - TimesUsed) * 50);
115 return true;
118 return false;
120 #endif