2 CHARACTER(angel
, humanoid
)
5 angel() : LastHealed(0) {}
7 virtual void Load (inputfile
&);
8 virtual void Save (outputfile
&) const;
9 virtual truth
AttachBodyPartsOfFriendsNear ();
10 virtual truth
BodyPartIsVital (int) const;
11 virtual int GetAttribute (int, truth
= true) const;
12 virtual col24
GetBaseEmitation () const;
13 virtual truth
CanCreateBodyPart (int) const;
14 virtual cfestring
& GetStandVerb () const { return character::GetStandVerb(); }
15 virtual void FinalProcessForBone ();
16 virtual void CreateInitialEquipment (int);
19 virtual int GetTorsoMainColor () const;
20 virtual int GetArmMainColor () const;
21 virtual void GetAICommand ();
31 truth
angel::BodyPartIsVital (int I
) const { return I
== TORSO_INDEX
|| I
== HEAD_INDEX
; }
32 col16
angel::GetTorsoMainColor () const { return GetMasterGod()->GetColor(); }
33 col16
angel::GetArmMainColor () const { return GetMasterGod()->GetColor(); }
36 void angel::Save (outputfile
&SaveFile
) const {
37 humanoid::Save(SaveFile
);
38 SaveFile
<< LastHealed
;
42 void angel::Load (inputfile
&SaveFile
) {
43 humanoid::Load(SaveFile
);
44 SaveFile
>> LastHealed
;
48 void angel::FinalProcessForBone () {
49 humanoid::FinalProcessForBone();
54 void angel::CreateInitialEquipment (int SpecialFlags
) {
55 humanoid::CreateInitialEquipment(SpecialFlags
);
56 GetStack()->AddItem(holybook::Spawn(GetConfig(), SpecialFlags
));
60 void angel::GetAICommand () {
61 if ((LastHealed
|| game::GetTick() - LastHealed
> 10000) && AttachBodyPartsOfFriendsNear()) return;
62 humanoid::GetAICommand();
66 /* Returns true if the angel finds somebody near to heal else false */
67 truth
angel::AttachBodyPartsOfFriendsNear () {
68 character
*HurtOne
= 0;
69 bodypart
*SeveredOne
= 0;
71 for(int d
= 0; d
< GetNeighbourSquares(); ++d
) {
72 square
*Square
= GetNeighbourSquare(d
);
75 character
*Char
= Square
->GetCharacter();
77 if (Char
&& (!HurtOne
|| Char
->IsPlayer()) && GetRelation(Char
) == FRIEND
&& !Char
->HasAllBodyParts()) {
78 bodypart
*BodyPart
= Char
->FindRandomOwnBodyPart(false);
80 if (BodyPart
) { HurtOne
= Char
; SeveredOne
= BodyPart
; }
86 if (HurtOne
->IsPlayer()) ADD_MESSAGE("%s puts your %s back to its place.", CHAR_DESCRIPTION(DEFINITE
), SeveredOne
->GetBodyPartName().CStr());
87 else if (CanBeSeenByPlayer()) ADD_MESSAGE("%s helps %s by putting %s %s in its old place.", CHAR_DESCRIPTION(DEFINITE
), HurtOne
->CHAR_DESCRIPTION(DEFINITE
), HurtOne
->GetPossessivePronoun().CStr(), SeveredOne
->GetBodyPartName().CStr());
89 SeveredOne
->RemoveFromSlot();
90 HurtOne
->AttachBodyPart(SeveredOne
);
91 LastHealed
= game::GetTick();
99 // temporary until wings are bodyparts
100 int angel::GetAttribute (int Identifier
, truth AllowBonus
) const {
101 if (Identifier
== LEG_STRENGTH
) return GetDefaultLegStrength();
102 if (Identifier
== AGILITY
) return GetDefaultAgility();
103 return humanoid::GetAttribute(Identifier
, AllowBonus
);
107 col24
angel::GetBaseEmitation () const {
108 auto al
= GetMasterGod()->GetBasicAlignment();
109 if (al
== GOOD
) return MakeRGB24(150, 150, 150);
110 if (al
== NEUTRAL
) return MakeRGB24(120, 120, 150);
111 if (al
== EVIL
) return MakeRGB24(150, 110, 110);
116 truth
angel::CanCreateBodyPart (int I
) const {
117 return (I
== TORSO_INDEX
|| I
== HEAD_INDEX
|| I
== RIGHT_ARM_INDEX
|| I
== LEFT_ARM_INDEX
);