2 CHARACTER(bananagrower
, humanoid
)
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
; }
12 virtual truth
HandleCharacterBlockingTheWay(character
*, v2
, int);
13 virtual void PostConstruct();
14 virtual void GetAICommand();
15 void RandomizeProfession();
17 truth HasDroppedBananas
;
26 void bananagrower::BeTalkedTo()
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)]);
41 ProcessAndAddMessage(GetFriendlyReplies()[6 + RandomizeReply(Said
, 3)]);
46 void bananagrower::RandomizeProfession()
51 Profession
= CONST_S("the president of Tweraif");
54 Profession
= CONST_S("a diplomat");
57 Profession
= CONST_S("a teacher");
60 Profession
= CONST_S("a philosopher");
63 Profession
= CONST_S("a journalist");
66 Profession
= CONST_S("an alchemist");
69 Profession
= CONST_S("a renowned mathematician");
72 Profession
= CONST_S("a priest of Silva");
78 Profession
= CONST_S("a professor of ");
79 AddRandomScienceName(Profession
);
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();
119 if(CheckForEnemies(false, false, true, true))
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;
134 for(c
= 0; c
< ItemVector
.size(); ++c
)
135 if(ItemVector
[c
]->IsBanana())
137 ItemVector
[c
]->MoveTo(GetStackUnder());
143 if(CanBeSeenByPlayer())
144 ADD_MESSAGE("%s drops %s.", CHAR_NAME(DEFINITE
), BananasDropped
== 1 ? "a banana" : "some bananas");
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());
162 if(CanBeSeenByPlayer())
163 ADD_MESSAGE("%s picks up %s.", CHAR_NAME(DEFINITE
), PeelsPickedUp
== 1 ? "a banana peel" : "some banana peels");
168 HasDroppedBananas
= true;
171 if(!HasDroppedBananas
)
173 SetGoingTo(BananaTarget
);
175 if(MoveTowardsTarget(true))
178 else if(GetPos().X
== 54)
180 if(CanBeSeenByPlayer())
181 ADD_MESSAGE("%s leaves the town to gather more bananas.", CHAR_NAME(DEFINITE
));
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
197 RandomizeProfession();
200 Stamina
= MaxStamina
/ 5;
204 if(CanBeSeenByPlayer())
205 ADD_MESSAGE("%s enters the town.", CHAR_NAME(INDEFINITE
));
207 HasDroppedBananas
= false;
211 SetGoingTo(v2(54, 45));
213 if(MoveTowardsTarget(true))
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());