typos
[k8-i-v-a-n.git] / src / game / humans / humanoid_bananagrower.cpp
blob7252a785ca16e2eeb3f25e9cb01e2c39ffe6ef01
1 #ifdef HEADER_PHASE
2 CHARACTER(bananagrower, humanoid)
4 public:
5 virtual void Save(outputfile&) const;
6 virtual void Load(inputfile&);
7 virtual void BeTalkedTo();
8 virtual festring& ProcessMessage(festring&) const;
9 virtual truth IsBananaGrower() const { return true; }
10 festring GetProfession() const { return Profession; }
11 protected:
12 virtual truth HandleCharacterBlockingTheWay(character*, v2, int);
13 virtual void PostConstruct();
14 virtual void GetAICommand();
15 void RandomizeProfession();
16 festring Profession;
17 truth HasDroppedBananas;
18 truth FeedingSumo;
22 #else
26 void bananagrower::BeTalkedTo()
28 static sLong Said;
30 if(GetRelation(PLAYER) == HOSTILE)
31 ProcessAndAddMessage(GetHostileReplies()[RandomizeReply(Said, GetHostileReplies().Size)]);
32 else if(!game::TweraifIsFree())
34 if(GetRelation(PLAYER) != HOSTILE
35 && Profession.Find("president", 0) != festring::NPos && !(RAND() % 7))
36 ADD_MESSAGE("\"I'm glad Petrus spared my life even though I was the president.\"");
38 ProcessAndAddMessage(GetFriendlyReplies()[RandomizeReply(Said, 6)]);
40 else
41 ProcessAndAddMessage(GetFriendlyReplies()[6 + RandomizeReply(Said, 3)]);
46 void bananagrower::RandomizeProfession()
48 switch(RAND_N(12))
50 case 0:
51 Profession = CONST_S("the president of Tweraif");
52 break;
53 case 1:
54 Profession = CONST_S("a diplomat");
55 break;
56 case 2:
57 Profession = CONST_S("a teacher");
58 break;
59 case 3:
60 Profession = CONST_S("a philosopher");
61 break;
62 case 4:
63 Profession = CONST_S("a journalist");
64 break;
65 case 5:
66 Profession = CONST_S("an alchemist");
67 break;
68 case 6:
69 Profession = CONST_S("a renowned mathematician");
70 break;
71 case 7:
72 Profession = CONST_S("a priest of Silva");
73 break;
74 case 8:
75 case 9:
76 case 10:
77 case 11:
78 Profession = CONST_S("a professor of ");
79 AddRandomScienceName(Profession);
80 break;
86 void bananagrower::PostConstruct()
88 Stamina = MaxStamina / 5;
89 RandomizeProfession();
90 HasDroppedBananas = FeedingSumo = false;
95 void bananagrower::Save(outputfile& SaveFile) const
97 humanoid::Save(SaveFile);
98 SaveFile << Profession << HasDroppedBananas << FeedingSumo;
103 void bananagrower::Load(inputfile& SaveFile)
105 humanoid::Load(SaveFile);
106 SaveFile >> Profession >> HasDroppedBananas >> FeedingSumo;
111 void bananagrower::GetAICommand()
113 if(game::TweraifIsFree())
115 humanoid::GetAICommand();
116 return;
119 if(CheckForEnemies(false, false, true, true))
120 return;
122 if(!IsEnabled())
123 return;
125 cv2 BananaTarget = FeedingSumo ? SUMO_ROOM_POS + v2(1, 2) : v2(45, 45);
127 if(GetPos() == BananaTarget)
129 itemvector ItemVector;
130 GetStack()->FillItemVector(ItemVector);
131 int BananasDropped = 0;
132 uInt c;
134 for(c = 0; c < ItemVector.size(); ++c)
135 if(ItemVector[c]->IsBanana())
137 ItemVector[c]->MoveTo(GetStackUnder());
138 ++BananasDropped;
141 if(BananasDropped)
143 if(CanBeSeenByPlayer())
144 ADD_MESSAGE("%s drops %s.", CHAR_NAME(DEFINITE), BananasDropped == 1 ? "a banana" : "some bananas");
146 return;
149 ItemVector.clear();
150 GetStackUnder()->FillItemVector(ItemVector);
151 int PeelsPickedUp = 0;
153 for(c = 0; c < ItemVector.size(); ++c)
154 if(ItemVector[c]->IsBananaPeel())
156 ItemVector[c]->MoveTo(GetStack());
157 ++PeelsPickedUp;
160 if(PeelsPickedUp)
162 if(CanBeSeenByPlayer())
163 ADD_MESSAGE("%s picks up %s.", CHAR_NAME(DEFINITE), PeelsPickedUp == 1 ? "a banana peel" : "some banana peels");
165 return;
168 HasDroppedBananas = true;
171 if(!HasDroppedBananas)
173 SetGoingTo(BananaTarget);
175 if(MoveTowardsTarget(true))
176 return;
178 else if(GetPos().X == 54)
180 if(CanBeSeenByPlayer())
181 ADD_MESSAGE("%s leaves the town to gather more bananas.", CHAR_NAME(DEFINITE));
183 GetStack()->Clean();
184 character* Sumo = game::GetSumo();
185 FeedingSumo = Sumo && Sumo->GetNP() < (SATIATED_LEVEL + BLOATED_LEVEL) >> 1 && !(RAND() % 15);
186 int Bananas = FeedingSumo ? 3 : 10;
188 for(int c = 0; c < Bananas; ++c)
189 GetStack()->AddItem(banana::Spawn());
191 v2 Where = GetLevel()->GetNearestFreeSquare(this, v2(0, 45));
193 if(Where == ERROR_V2)
194 Where = GetLevel()->GetRandomSquare(this, NOT_IN_ROOM); // this is odd but at least it doesn't crash
196 Move(Where, true);
197 RandomizeProfession();
198 RestoreBodyParts();
199 RestoreHP();
200 Stamina = MaxStamina / 5;
201 ResetStates();
202 TemporaryState = 0;
204 if(CanBeSeenByPlayer())
205 ADD_MESSAGE("%s enters the town.", CHAR_NAME(INDEFINITE));
207 HasDroppedBananas = false;
209 else
211 SetGoingTo(v2(54, 45));
213 if(MoveTowardsTarget(true))
214 return;
217 EditAP(-1000);
222 truth bananagrower::HandleCharacterBlockingTheWay(character* Char, v2 Pos, int Dir)
224 return Char->GetPos() == v2(45, 45) && (Displace(Char, true) || Hit(Char, Pos, Dir));
229 festring& bananagrower::ProcessMessage(festring& Msg) const
231 character::ProcessMessage(Msg);
232 SEARCH_N_REPLACE(Msg, "@pd", GetProfession());
233 SEARCH_N_REPLACE(Msg, "@Pd", GetProfession().CapitalizeCopy());
234 return Msg;
236 #endif