2 ITEM(magicalwhistle
, whistle
)
5 magicalwhistle() : LastUsed(0) { }
6 virtual void BlowEffect(character
*);
7 virtual void Load(inputfile
&);
8 virtual void Save(outputfile
&) const;
9 virtual void FinalProcessForBone();
20 distancepair(sLong Distance
, character
* Char
) : Distance(Distance
), Char(Char
) { }
21 bool operator<(const distancepair
& D
) const { return Distance
> D
.Distance
; }
27 void magicalwhistle::BlowEffect(character
* Whistler
)
29 if(LastUsed
&& game::GetTick() - LastUsed
< 2000)
31 whistle::BlowEffect(Whistler
);
35 LastUsed
= game::GetTick();
37 if(Whistler
->IsPlayer())
39 if(Whistler
->CanHear())
40 ADD_MESSAGE("You produce a peculiar sound.");
42 ADD_MESSAGE("You blow %s.", CHAR_NAME(DEFINITE
));
44 else if(Whistler
->CanBeSeenByPlayer())
47 ADD_MESSAGE("%s blows %s and produces a peculiar sound.", Whistler
->CHAR_NAME(DEFINITE
), CHAR_NAME(DEFINITE
));
49 ADD_MESSAGE("%s blows %s.", Whistler
->CHAR_NAME(DEFINITE
), CHAR_NAME(DEFINITE
));
51 else if(PLAYER
->CanHear())
52 ADD_MESSAGE("You hear a strange tune playing.");
54 const std::list
<character
*>& Member
= Whistler
->GetTeam()->GetMember();
55 std::vector
<distancepair
> ToSort
;
56 v2 Pos
= Whistler
->GetPos();
58 for(std::list
<character
*>::const_iterator i
= Member
.begin(); i
!= Member
.end(); ++i
)
59 if((*i
)->IsEnabled() && Whistler
!= *i
)
60 ToSort
.push_back(distancepair((Pos
- (*i
)->GetPos()).GetLengthSquare(), *i
));
63 std::sort(ToSort
.begin(), ToSort
.end());
65 for(uInt c
= 0; c
< 5 && c
< ToSort
.size(); ++c
)
66 ToSort
[c
].Char
->TeleportNear(Whistler
);
68 game::CallForAttention(GetPos(), 400);
73 void magicalwhistle::Save(outputfile
& SaveFile
) const
75 whistle::Save(SaveFile
);
81 void magicalwhistle::Load(inputfile
& SaveFile
)
83 whistle::Load(SaveFile
);
89 void magicalwhistle::FinalProcessForBone()
91 whistle::FinalProcessForBone();