fix for https://github.com/Attnam/ivan/issues/119
[k8-i-v-a-n.git] / src / game / items / whistle_magicalwhistle.cpp
blob5e1fcce874c298f08a254d399ce99edeaeb2a484
1 #ifdef HEADER_PHASE
2 ITEM(magicalwhistle, whistle)
4 public:
5 magicalwhistle() : LastUsed(0) { }
6 virtual void BlowEffect(character*);
7 virtual void Load(inputfile&);
8 virtual void Save(outputfile&) const;
9 virtual void FinalProcessForBone();
10 protected:
11 feuLong LastUsed;
15 #else
18 struct distancepair
20 distancepair(sLong Distance, character* Char) : Distance(Distance), Char(Char) { }
21 bool operator<(const distancepair& D) const { return Distance > D.Distance; }
22 sLong Distance;
23 character* Char;
27 void magicalwhistle::BlowEffect(character* Whistler)
29 if(LastUsed && game::GetTick() - LastUsed < 2000)
31 whistle::BlowEffect(Whistler);
32 return;
34 else
35 LastUsed = game::GetTick();
37 if(Whistler->IsPlayer())
39 if(Whistler->CanHear())
40 ADD_MESSAGE("You produce a peculiar sound.");
41 else
42 ADD_MESSAGE("You blow %s.", CHAR_NAME(DEFINITE));
44 else if(Whistler->CanBeSeenByPlayer())
46 if(PLAYER->CanHear())
47 ADD_MESSAGE("%s blows %s and produces a peculiar sound.", Whistler->CHAR_NAME(DEFINITE), CHAR_NAME(DEFINITE));
48 else
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));
62 if(ToSort.size() > 5)
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);
76 SaveFile << LastUsed;
81 void magicalwhistle::Load(inputfile& SaveFile)
83 whistle::Load(SaveFile);
84 SaveFile >> LastUsed;
89 void magicalwhistle::FinalProcessForBone()
91 whistle::FinalProcessForBone();
92 LastUsed = 0;
94 #endif