freg  0.3
Free-Roaming Elementary Game
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Animal.cpp
Go to the documentation of this file.
1  /* freg, Free-Roaming Elementary Game with open and interactive world
2  * Copyright (C) 2012-2014 Alexander 'mmaulwurff' Kromm
3  * mmaulwurff@gmail.com
4  *
5  * This file is part of FREG.
6  *
7  * FREG is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * FREG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with FREG. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "blocks/Animal.h"
21 #include "blocks/Inventory.h"
22 #include "DeferredAction.h"
23 #include "BlockManager.h"
24 #include "World.h"
25 
26 // Animal:: section
28  if ( GROUP_MEAT != GetSubGroup(Sub()) ) return INNER_ACTION_NONE;
29  if ( satiation <= 0 ) {
31  } else {
32  --satiation;
33  Mend(1);
34  }
35  emit Updated();
36  return INNER_ACTION_NONE;
37  }
38 
40  if ( deferredAction != nullptr ) {
42  delete deferredAction;
43  deferredAction = nullptr;
44  }
45  }
46 
48  if ( GROUP_MEAT != GetSubGroup(Sub()) ) return;
49  if ( not IsSubAround(AIR) ) {
50  if ( breath <= 0 ) {
51  Damage(10, DAMAGE_BREATH);
52  } else {
53  --breath;
54  }
55  } else if ( breath < MAX_BREATH ) {
56  ++breath;
57  }
58  if ( GetDurability() <= 0 ) {
59  GetWorld()->DestroyAndReplace(X(), Y(), Z());
60  } else {
61  emit Updated();
62  }
63  }
64 
65  int Animal::Breath() const { return breath; }
66  int Animal::Satiation() const { return satiation; }
68  int Animal::DamageKind() const { return DAMAGE_BITE; }
69  int Animal::NutritionalValue(subs) const { return 0; }
70  Animal * Animal::IsAnimal() { return this; }
71 
72  bool Animal::Eat(const subs sub) {
73  const int value = NutritionalValue(sub);
74  if ( value ) {
75  satiation += value;
76  ReceiveSignal(tr("Ate %1.").arg(SubName(sub)));
77  if ( SECONDS_IN_DAY < satiation ) {
78  satiation = 1.1 * SECONDS_IN_DAY;
79  ReceiveSignal(tr("You have gorged yourself!"));
80  }
81  return true;
82  } else {
83  return false;
84  }
85  }
86 
87  void Animal::SaveAttributes(QDataStream & out) const {
89  out << breath << satiation;
90  }
91 
93  for (int x=X()-1; x<=X()+1; ++x)
94  for (int y=Y()-1; y<=Y()+1; ++y) {
95  if ( world->InBounds(x, y) &&
96  GREENERY == world->GetBlock(x, y, Z())->Sub() )
97  {
98  TryDestroy(x, y, Z());
99  Eat(GREENERY);
100  return;
101  }
102  }
103  }
104 
106  Block * const cadaver = BlockManager::NewBlock(BOX, Sub());
108  return cadaver;
109  }
110 
112  delete deferredAction;
113  deferredAction = action;
114  }
115 
116  Animal::Animal(const int kind, const int sub) :
117  Falling(kind, sub, NONSTANDARD),
118  breath(MAX_BREATH),
119  satiation(SECONDS_IN_DAY)
120  {}
121 
122  Animal::Animal(QDataStream & str, const int kind, const int sub) :
123  Falling(str, kind, sub, NONSTANDARD),
124  breath(),
125  satiation()
126  {
127  str >> breath >> satiation;
128  }
129 
131  delete deferredAction;
132  deferredAction = nullptr;
133  }
134 
135 // Predator:: section
136  int Predator::DamageLevel() const { return 10; }
137  QString Predator::FullName() const { return "Predator"; }
138 
139  int Predator::NutritionalValue(const subs sub) const {
140  return Attractive(sub) * SECONDS_IN_HOUR;
141  }
142 
144  if ( Gravitate(5, 1, 2, 0) ) {
145  world->Move(X(), Y(), Z(), GetDir());
146  }
147  }
148 
150  const Xyz coords[] = {
151  Xyz(X()-1, Y(), Z()),
152  Xyz(X()+1, Y(), Z()),
153  Xyz(X(), Y()-1, Z()),
154  Xyz(X(), Y()+1, Z()),
155  Xyz(X(), Y(), Z()-1)
156  };
157  World * const world = GetWorld();
158  for (const Xyz xyz : coords) {
159  if ( not world->InBounds(xyz.X(), xyz.Y()) ) {
160  continue;
161  }
162  Block * const block = world->GetBlock(xyz.X(), xyz.Y(), xyz.Z());
163  if ( Attractive(block->Sub()) ) {
164  block->ReceiveSignal(tr("Predator bites you!"));
165  world->Damage(xyz.X(), xyz.Y(), xyz.Z(),
166  DamageLevel(), DamageKind());
167  Eat(static_cast<subs>(block->Sub()));
168  }
169  }
170  if ( SECONDS_IN_DAY/4 > Satiation() ) {
171  EatGrass();
172  }
174  }
175 
176  int Predator::Attractive(const int sub) const {
177  return ( GROUP_MEAT == GetSubGroup(sub) ) ?
178  10 : ( sub == GREENERY ) ?
179  1 : 0;
180  }
bool Move(int x, int y, int z, dirs dir)
Check and move.
Definition: World.cpp:375
int X() const
Definition: Active.cpp:158
int Satiation() const
Definition: Animal.cpp:66
void ActFrequent() override
Definition: Animal.cpp:143
void Mend(int plus)
Increase durability, no more than MAX_DURABILITY.
Definition: Block.cpp:238
static QString SubName(int sub)
Returns translated substance name.
Definition: Block.cpp:69
void DoRareAction() override
Definition: Animal.cpp:149
World * world
Definition: World.cpp:32
void MakeAction() const
World provides global physics and shred connection.
Definition: World.h:52
void DoRareAction() override
Definition: Animal.cpp:47
short Z() const
Definition: Xyz.cpp:30
10
Definition: Block.h:49
void EatGrass()
Definition: Animal.cpp:92
Block * DropAfterDamage(bool *delete_block) override
Should return dropped block.
Definition: Animal.cpp:105
virtual bool Get(Block *block, int start=0)
Returns true on success.
Definition: Inventory.cpp:78
dirs GetDir() const
Definition: Block.cpp:231
void Updated()
static sub_groups GetSubGroup(int sub)
Definition: Block.cpp:275
bool Gravitate(int range, int down, int up, int calmness)
Definition: Active.cpp:178
virtual Inventory * HasInventory()
Definition: Block.cpp:224
const int MAX_BREATH
Definition: World.h:41
void SaveAttributes(QDataStream &out) const override
Definition: Animal.cpp:87
Deferred Action is used when some action needs to be done at next physics turn.
QString FullName() const override
Definition: Animal.cpp:137
int DamageKind() const override
Definition: Animal.cpp:68
quint8 breath
Definition: Animal.h:59
DeferredAction * deferredAction
Definition: Animal.h:61
void SetDeferredAction(DeferredAction *)
Definition: Animal.cpp:111
inner_actions
See Shred::PhysEventsRare() for details.
Definition: Active.h:36
void ReceiveSignal(QString) override
Receive text signal.
Definition: Active.cpp:156
int Y() const
Definition: Active.cpp:162
Block * GetBlock(int x, int y, int z) const
Definition: World.cpp:204
Provides declaration for class Inventory for freg.
World * GetWorld() const
Definition: Active.cpp:140
int Attractive(int sub) const override
Definition: Animal.cpp:176
Definition: Animal.h:27
inner_actions ActInner() override
Definition: Animal.cpp:27
void TryDestroy(int x, int y, int z) const
Damages block and destroys it if it is broken.
Definition: Active.cpp:131
Animal(int sub, int id)
Definition: Animal.cpp:116
int Breath() const
Definition: Animal.cpp:65
int Sub() const
Definition: Block.h:144
subs
Substance block is made from.
Definition: header.h:157
13
Definition: header.h:128
19
Definition: header.h:179
static Block * NewBlock(int kind, int sub)
Use this to receive a pointer to new not-normal block.
void SaveAttributes(QDataStream &out) const override
Definition: Active.cpp:248
Xyz()
Definition: Xyz.cpp:26
Definition: Xyz.h:35
void DestroyAndReplace(int x, int y, int z)
Does not check target block durability.
Definition: World.cpp:525
22
Definition: header.h:182
void Damage(int dmg, int dmg_kind) override
Definition: Active.cpp:142
int ShouldAct() const override
Definition: Animal.cpp:67
bool InBounds(int x, int y) const
Definition: World.cpp:117
int Damage(int x, int y, int z, int level, int dmg_kind)
Returns damaged block result durability.
Definition: World.cpp:508
Animal * IsAnimal() override
Definition: Animal.cpp:70
int GetDurability() const
Definition: Block.cpp:232
16
Definition: header.h:131
~Animal()
Definition: Animal.cpp:130
int NutritionalValue(subs) const override
Definition: Animal.cpp:139
bool Eat(subs)
Definition: Animal.cpp:72
void ActFrequent() override
Definition: Animal.cpp:39
int DamageLevel() const override
Definition: Animal.cpp:136
virtual void ReceiveSignal(QString)
Receive text signal.
Definition: Block.cpp:211
Block without special physics and attributes.
Definition: Block.h:89
quint16 satiation
Definition: Animal.h:60
bool IsSubAround(int sub) const
Returns true if there is at least 1 block of substance sub around.
Definition: Active.cpp:219
14
Definition: header.h:174
virtual int NutritionalValue(subs) const
Definition: Animal.cpp:69