summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortom <tombarrett@siu.edu>2017-01-21 08:58:12 -0600
committertom <tombarrett@siu.edu>2017-01-21 08:58:12 -0600
commita9281bfcf21861e621a3243ecb633a299c8d8e52 (patch)
tree7d4687fd9a8f40e806e6b7c8803c0e87fcae6639 /src
parentccb66c8d6d175b1bd3d8ecaa540e80baac5181b6 (diff)
-took basic math functions and put it into functions.hpp
-spaced various lines -reorganized variables by datatype -implemented reproduction -reorganized pathing so once a target is set, the creature checks if that same target is near every cycle
Diffstat (limited to 'src')
-rw-r--r--src/creature.cpp92
-rw-r--r--src/entity.cpp13
-rw-r--r--src/list.cpp7
-rw-r--r--src/resource.cpp21
4 files changed, 90 insertions, 43 deletions
diff --git a/src/creature.cpp b/src/creature.cpp
index 7c4c108..ff6290d 100644
--- a/src/creature.cpp
+++ b/src/creature.cpp
@@ -2,28 +2,31 @@
Creature::Creature(Window m, SDL_Rect R)
{
- renderer = m.getRenderer();
- rect = R;
+ renderer = m.getRenderer();
+ rect = R;
if(rect.x == 0 && rect.y == 0){
- rect.x = rand()%WINDOW_X;
- rect.y = rand()%WINDOW_Y;
+ rect.x = rand()%WINDOW_X;
+ rect.y = rand()%WINDOW_Y;
}
- type = CREATURE_TYPE;
- health = CREATURE_START_HEALTH;
- maxHealth = CREATURE_MAX_HEALTH;
- reach = CREATURE_REACH;
- speed = CREATURE_SPEED;
- bestSense = CREATURE_BEST_SENSE;
- bite = CREATURE_BITE;
- amountToGrow= CREATURE_AMOUNT_TO_GROW;
-
- gender = rand() % 2;
- hungry = false;
- hasTarget = false;
- wander = false;
- able = true;
+ type = CREATURE_TYPE;
+ health = CREATURE_START_HEALTH;
+ maxHealth = CREATURE_MAX_HEALTH;
+ reach = CREATURE_REACH;
+ speed = CREATURE_SPEED;
+ bestSense = CREATURE_BEST_SENSE;
+ bite = CREATURE_BITE;
+ amountToGrow = CREATURE_AMOUNT_TO_GROW;
+ expectedPregnancyTime = CREATURE_EXPECTED_PREGNANCY_TIME;
+
+ gender = rand() % 2;
+ hungry = false;
+ hasTarget = false;
+ wander = false;
+ pregnate = false;
+ pregnancyReady = false;
+ able = true;
}
void Creature::Behavior()
@@ -34,8 +37,17 @@ void Creature::Behavior()
if(!hasTarget)
this->setTarget();
+ else
+ this->checkTarget();
this->Action();
+
+ if(pregnate){
+ pregnancyTime++;
+ if(pregnancyTime > expectedPregnancyTime)
+ pregnancyReady = true;
+ }
+
}
void Creature::Priority()
@@ -59,20 +71,36 @@ void Creature::setTarget()
wander = false;
break;
}
+ if( (*it)->getType() == CREATURE_TYPE && able && (*it)->getGender() != gender ){
+ target = *it;
+ hasTarget = true;
+ wander = false;
+ break;
+ }
}
if(!hasTarget&&!wander){
wander = true;
- SDL_Rect r = {rand()%WINDOW_X, rand()%WINDOW_Y, 0, 0};
- wTarget = r;
+ SDL_Rect r = {rand() % WINDOW_X, rand() % WINDOW_Y, 0, 0};
+ wTarget = r;
}
}
+void Creature::checkTarget()
+{
+ for(list <Entity*>::iterator it = N.begin(); it!=N.end(); it++)
+ if( target == *it )
+ return;
+
+ hasTarget = false;
+ return;
+}
+
void Creature::Action()
{
if(hasTarget){
- if( Distance(rect,target->getRect() ) < reach ){
+ if( Distance(rect,target->getRect()) < reach && target->getType() == RESOURCE_TYPE){
target->eat(bite);
health+=bite;
amountAte++;
@@ -80,15 +108,17 @@ void Creature::Action()
amountAte = 0;
rect.w = rect.h = rect.w + 1;
}
+ if(target->getAmount()<=0)
+ hasTarget = false;
+ }
+ else if( Distance(rect,target->getRect()) < reach && target->getType() == CREATURE_TYPE && target->getGender() != gender ){
+ target->impregnate();
+ hasTarget = false;
}
else
- Move(target->getRect());
-
- if(target->getAmount()<=0){
- hasTarget = false;
- }
+ Move(target->getRect());
}
- else{
+ else if(wander){
if(Distance(rect,wTarget) < reach)
wander = false;
else
@@ -131,3 +161,11 @@ void Creature::Move(SDL_Rect R)
}
}
}
+
+void Creature::impregnate()
+{
+ if(!pregnate){
+ pregnate = true;
+ pregnancyTime = 0;
+ }
+}
diff --git a/src/entity.cpp b/src/entity.cpp
index 6ad0e3f..a2c2d87 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -2,9 +2,16 @@
void Entity::Place()
{
- if(type == 1)
- SDL_SetRenderDrawColor(renderer,255,0,255,255);
- else
+ if(type == CREATURE_TYPE){
+ if(gender)
+ SDL_SetRenderDrawColor(renderer,255,0,0,255);
+ else
+ if(pregnate)
+ SDL_SetRenderDrawColor(renderer,255,0,255,255);
+ else
+ SDL_SetRenderDrawColor(renderer,0,0,255,255);
+ }
+ else if (type == RESOURCE_TYPE)
SDL_SetRenderDrawColor(renderer,0,255,0,255);
SDL_RenderFillRect(renderer, &rect);
diff --git a/src/list.cpp b/src/list.cpp
index 5309109..d49f97a 100644
--- a/src/list.cpp
+++ b/src/list.cpp
@@ -40,6 +40,13 @@ void List::Behavior()
list<Entity*> N = getNear(*it);
it->giveN(N);
it->Behavior();
+ if(it->getPregnancyReady()){
+ SDL_Rect Rect = it->getRect();
+ Rect.h = Rect.w = CREATURE_SIZE_START;
+ Creature X(main,Rect);
+ C.push_back(X);
+ it->hadPregnancy();
+ }
}
for(list<Resource>::iterator it = R.begin(); it!=R.end(); it++)
diff --git a/src/resource.cpp b/src/resource.cpp
index 07f7ca9..2f2181f 100644
--- a/src/resource.cpp
+++ b/src/resource.cpp
@@ -2,13 +2,13 @@
Resource::Resource(Window m, SDL_Rect R)
{
- renderer = m.getRenderer();
- type = RESOURCE_TYPE;
- rect = R;
+ renderer = m.getRenderer();
+ type = RESOURCE_TYPE;
+ rect = R;
if(rect.x == 0 && rect.y == 0){
- rect.x = rand()%WINDOW_X;
- rect.y = rand()%WINDOW_Y;
+ rect.x = rand()%WINDOW_X;
+ rect.y = rand()%WINDOW_Y;
}
amount = RESOURCE_AMOUNT_START;
@@ -22,13 +22,8 @@ void Resource::eat(int bite)
void Resource::grow()
{
- if(amount < RESOURCE_AMOUNT_MAX)
+ if(amount < RESOURCE_AMOUNT_MAX){
amount+=growAmount;
-
- rect.h = rect.w = map(amount,0,RESOURCE_AMOUNT_MAX,0,RESOURCE_SIZE_MAX);
-}
-
-int Resource::map(int x, int inMin, int inMax, int outMin, int outMax)
-{
- return (x-inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
+ rect.h = rect.w = map(amount,0,RESOURCE_AMOUNT_MAX,0,RESOURCE_SIZE_MAX);
+ }
}