fixed some bugs in new 'g'o system
[k8-i-v-a-n.git] / src / game / items / itemtrap_materialcontainer_mine.cpp
bloba194cb67f52873dcf6cecdac9a80f4db1f5ad51b
1 #ifdef HEADER_PHASE
2 ITEM(mine, itemtrap<materialcontainer>)
4 public:
5 virtual void StepOnEffect(character*);
6 virtual truth ReceiveDamage(character*, int, int, int);
7 virtual truth Apply(character* User);
8 virtual truth IsDangerous(ccharacter* Stepper) const { return WillExplode(Stepper); }
9 virtual truth WillExplode(ccharacter*) const;
10 virtual truth CheckPickUpEffect(character*);
11 protected:
12 virtual truth AddAdjective(festring&, truth) const;
16 #else
20 truth mine::AddAdjective(festring& String, truth Articled) const { return IsActive() && AddActiveAdjective(String, Articled); }
24 truth mine::ReceiveDamage(character* Damager, int Damage, int Type, int)
26 if((Type & (FIRE|ENERGY) && Damage && (Damage > 50 || !(RAND() % (100 / Damage)))) || (Type & (PHYSICAL_DAMAGE|SOUND) && WillExplode(0)))
28 festring DeathMsg = CONST_S("killed by an explosion of ");
29 AddName(DeathMsg, INDEFINITE);
31 if(Damager)
32 DeathMsg << " caused @bk";
34 if(GetSquareUnder()->CanBeSeenByPlayer(true))
35 ADD_MESSAGE("%s explodes!", GetExtendedDescription().CStr());
37 lsquare* Square = GetLSquareUnder();
38 RemoveFromSlot();
39 SendToHell();
40 Square->GetLevel()->Explosion(Damager, DeathMsg, Square->GetPos(), GetSecondaryMaterial()->GetTotalExplosivePower());
41 return true;
44 return false;
49 void mine::StepOnEffect(character* Stepper)
51 if(!WillExplode(Stepper))
52 return;
54 if(Stepper->IsPlayer())
56 cchar* SenseVerb = Stepper->CanHear() ? "hear" : "sense";
58 if(GetLSquareUnder()->IsDark())
59 ADD_MESSAGE("You %s a faint thump. You try to look down, but it is too dark to see anything.", SenseVerb);
60 else
61 ADD_MESSAGE("You %s a faint thump. You look down. You see %s.", SenseVerb, CHAR_NAME(INDEFINITE));
63 else if(Stepper->CanBeSeenByPlayer())
64 ADD_MESSAGE("%s steps on %s.", Stepper->CHAR_NAME(DEFINITE), CHAR_NAME(INDEFINITE));
65 else if(GetSquareUnder()->CanBeSeenByPlayer(true))
66 ADD_MESSAGE("Something explodes!");
68 SetIsActive(false);
69 SendNewDrawAndMemorizedUpdateRequest();
71 if (Stepper->IsPlayer()) game::AskForEscPress(CONST_S("Trap activated!"));
73 lsquare* Square = GetLSquareUnder();
74 RemoveFromSlot();
75 SendToHell();
76 Square->GetLevel()->Explosion(0, "killed by a land mine", Square->GetPos(), GetSecondaryMaterial()->GetTotalExplosivePower());
81 truth mine::Apply(character* User)
83 if(User->IsPlayer() && !game::TruthQuestion(CONST_S("Are you sure you want to plant ") + GetName(DEFINITE) + "? [y/N]"))
84 return false;
86 room* Room = GetRoom();
88 if(Room)
89 Room->HostileAction(User);
91 if(User->IsPlayer())
92 ADD_MESSAGE("%s is now %sactive.", CHAR_NAME(DEFINITE), IsActive() ? "in" : "");
94 SetIsActive(!IsActive());
95 User->DexterityAction(10);
97 if(IsActive())
99 Team = User->GetTeam()->GetID();
100 RemoveFromSlot();
101 User->GetStackUnder()->AddItem(this);
104 return true;
109 truth mine::WillExplode(ccharacter* Stepper) const
111 return IsActive() && GetSecondaryMaterial() && GetSecondaryMaterial()->IsExplosive() && (!Stepper || Stepper->GetWeight() > 5000);
116 truth mine::CheckPickUpEffect(character*)
118 if(WillExplode(0))
120 lsquare* Square = GetLSquareUnder();
122 if(Square->CanBeSeenByPlayer(true))
123 ADD_MESSAGE("%s explodes!", GetExtendedDescription().CStr());
125 RemoveFromSlot();
126 SendToHell();
127 Square->GetLevel()->Explosion(0, "killed by a land mine", Square->GetPos(), GetSecondaryMaterial()->GetTotalExplosivePower());
128 return false;
131 return true;
133 #endif