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();
20 truth
horn::Apply(character
* Blower
)
22 if(!Blower
->HasHead())
24 if(Blower
->IsPlayer())
25 ADD_MESSAGE("You need a head to do this.");
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())
46 ADD_MESSAGE("You produce a %s sound.", SoundDescription
);
48 ADD_MESSAGE("You blow %s.", CHAR_NAME(DEFINITE
));
50 else if(Blower
->CanBeSeenByPlayer())
53 ADD_MESSAGE("%s blows %s and produces a %s sound.", Blower
->CHAR_NAME(DEFINITE
), CHAR_NAME(DEFINITE
), SoundDescription
);
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
);
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();
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);
91 if(Blower
->IsPlayer())
94 ADD_MESSAGE("You produce a mighty sound.");
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
));
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);
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();