cosmetix
[k8-i-v-a-n.git] / src / game / items / item_horn.cpp
blob1f871c9cc2d362fa927933b938bfa18d60575684
1 #ifdef HEADER_PHASE
2 ITEM(horn, item)
4 public:
5 horn() : LastUsed(0) { }
6 virtual void Load(inputfile&);
7 virtual void Save(outputfile&) const;
8 virtual truth Apply(character*);
9 virtual truth IsAppliable(ccharacter*) const { return true; }
10 virtual void FinalProcessForBone();
11 protected:
12 feuLong LastUsed;
16 #else
20 truth horn::Apply(character* Blower)
22 if(!Blower->HasHead())
24 if(Blower->IsPlayer())
25 ADD_MESSAGE("You need a head to do this.");
27 return false;
30 if(!LastUsed || game::GetTick() - LastUsed >= 2500)
32 LastUsed = game::GetTick();
33 //cchar* SoundDescription = GetConfig() == BRAVERY ? "loud but calming" : "frightening, almost scream-like";
34 cchar* SoundDescription;
36 switch (GetConfig()) {
37 case BRAVERY: SoundDescription = "loud but calming"; break;
38 case FEAR: SoundDescription = "frightening, almost scream-like"; break;
39 case CONFUSION: SoundDescription = "strange and dissonant"; break;
40 default: SoundDescription = "never-before heard"; break;
43 if(Blower->IsPlayer())
45 if(Blower->CanHear())
46 ADD_MESSAGE("You produce a %s sound.", SoundDescription);
47 else
48 ADD_MESSAGE("You blow %s.", CHAR_NAME(DEFINITE));
50 else if(Blower->CanBeSeenByPlayer())
52 if(PLAYER->CanHear())
53 ADD_MESSAGE("%s blows %s and produces a %s sound.", Blower->CHAR_NAME(DEFINITE), CHAR_NAME(DEFINITE), SoundDescription);
54 else
55 ADD_MESSAGE("%s blows %s.", Blower->CHAR_NAME(DEFINITE), CHAR_NAME(DEFINITE));
57 else if(PLAYER->CanHear())
58 ADD_MESSAGE("You hear a %s sound echoing everywhere.", SoundDescription);
60 rect Rect;
61 femath::CalculateEnvironmentRectangle(Rect, GetLevel()->GetBorder(), GetPos(), 10);
63 for(int x = Rect.X1; x <= Rect.X2; ++x)
64 for(int y = Rect.Y1; y <= Rect.Y2; ++y)
66 character* Audience = GetNearSquare(x, y)->GetCharacter();
68 if(Audience)
70 if(GetConfig() == BRAVERY && Audience->CanHear() && Audience->TemporaryStateIsActivated(PANIC)
71 && Blower->IsAlly(Audience))
73 if(Audience->IsPlayer())
74 ADD_MESSAGE("You calm down.");
75 else if(CanBeSeenByPlayer())
76 ADD_MESSAGE("%s calms down.", Audience->CHAR_NAME(DEFINITE));
78 Audience->DeActivateTemporaryState(PANIC);
80 else if(GetConfig() == FEAR && !Audience->TemporaryStateIsActivated(PANIC) &&
81 Blower->GetRelation(Audience) == HOSTILE && Audience->HornOfFearWorks())
82 Audience->BeginTemporaryState(PANIC, 500 + RAND() % 500);
83 else if(GetConfig() == CONFUSION && Blower->GetRelation(Audience) == HOSTILE && Audience->CanHear())
84 Audience->BeginTemporaryState(CONFUSED, 500 + RAND() % 500);
89 else
91 if(Blower->IsPlayer())
93 if(Blower->CanHear())
94 ADD_MESSAGE("You produce a mighty sound.");
95 else
96 ADD_MESSAGE("You blow %s.", CHAR_NAME(DEFINITE));
98 else if(Blower->CanBeSeenByPlayer())
100 if(PLAYER->CanHear())
101 ADD_MESSAGE("%s blows %s and produces a mighty sound.", Blower->CHAR_NAME(DEFINITE), CHAR_NAME(DEFINITE));
102 else
103 ADD_MESSAGE("%s blows %s.", Blower->CHAR_NAME(DEFINITE), CHAR_NAME(DEFINITE));
105 else if(PLAYER->CanHear())
106 ADD_MESSAGE("You hear a horn being blown.");
109 game::CallForAttention(GetPos(), 900);
110 Blower->EditAP(-1000);
111 return true;
116 void horn::Save(outputfile& SaveFile) const
118 item::Save(SaveFile);
119 SaveFile << LastUsed;
124 void horn::Load(inputfile& SaveFile)
126 item::Load(SaveFile);
127 SaveFile >> LastUsed;
132 void horn::FinalProcessForBone()
134 item::FinalProcessForBone();
135 LastUsed = 0;
137 #endif