summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Barrett <tombarrett@siu.edu>2017-03-12 11:07:22 -0500
committerTom Barrett <tombarrett@siu.edu>2017-03-12 11:07:22 -0500
commit836f56a40fa4a2b8e68c23b2c299e50fefe0c15d (patch)
tree56ca750d4f2c93b5a72d52fd7c1d4b575b3c061a /src
parent8f5a73f1daba39c8b0175036cf688f8ce1399a8f (diff)
-renamed constants to fit new datatypes
-reimplemented corpses -implemented hunger and starving (if creature is starving they will eat corpses and will take damage) -removed sides data from dna (think it is irrelavent) -removed data from dna that is not used for plants
Diffstat (limited to 'src')
-rw-r--r--src/dna.cpp39
-rw-r--r--src/list.cpp4
-rw-r--r--src/organism.cpp40
-rw-r--r--src/spritebatch.cpp5
4 files changed, 49 insertions, 39 deletions
diff --git a/src/dna.cpp b/src/dna.cpp
index 4e22d7a..dd1d606 100644
--- a/src/dna.cpp
+++ b/src/dna.cpp
@@ -10,52 +10,50 @@ DNA::DNA(std::string s)
bite = CREATURE_BITE;
expectedPregnancyTime = CREATURE_EXP_PREG_TIME;
expectedAge = CREATURE_EXP_AGE;
- growAmount = 0;
+ hungryAmount = CREATURE_HUNGRY_AMOUNT;
+ starveAmount = CREATURE_STARVE_AMOUNT;
reach = CREATURE_REACH;
speed = CREATURE_SPEED;
mutationPercent = CREATURE_MUTATION_PERCENT;
mutationChance = CREATURE_MUTATION_CHANCE;
- appearance.sides = CREATURE_SIDES;
appearance.red = 0;
- appearance.green = 0.5;
+ appearance.green = 1;
appearance.blue = 1;
}
else if(s == "carnivore"){
type = CARNIVORE_TYPE;
eatType = HERBAVORE_TYPE;
- maxHealth = CREATURE_MAX_HEALTH * 2;
+ maxHealth = CREATURE_MAX_HEALTH;
bestSense = CREATURE_BEST_SENSE * 2;
bite = CREATURE_BITE * 2;
expectedPregnancyTime = CREATURE_EXP_PREG_TIME;
expectedAge = CREATURE_EXP_AGE * 2;
- growAmount = 0;
+ hungryAmount = CREATURE_HUNGRY_AMOUNT;
+ starveAmount = CREATURE_STARVE_AMOUNT;
reach = CREATURE_REACH * 2;
speed = CREATURE_SPEED * 2;
mutationPercent = CREATURE_MUTATION_PERCENT;
mutationChance = CREATURE_MUTATION_CHANCE;
- appearance.sides = CREATURE_SIDES;
appearance.red = 1;
appearance.green = 0;
- appearance.blue = 0;
+ appearance.blue = 1;
}
else if(s == "plant"){
type = PLANT_TYPE;
- eatType = 0;
- maxHealth = RESOURCE_MAX_HEALTH;
- bestSense = 0;
- bite = 0;
- expectedPregnancyTime = 0;
- expectedAge = 0;
- growAmount = RESOURCE_GROW_AMOUNT;
- reach = 0;
- speed = 0;
- mutationPercent = 0;
- mutationChance = 0;
- appearance.sides = RESOURCE_SIDES;
+ maxHealth = PLANT_MAX_HEALTH;
+ growAmount = PLANT_GROW_AMOUNT;
appearance.red = 0;
appearance.green = 1;
appearance.blue = 0;
}
+ else if(s == "corpse"){
+ type = CORPSE_TYPE;
+ maxHealth = CORPSE_MAX_HEALTH;
+ growAmount = CORPSE_DECAY_AMOUNT;
+ appearance.red = 0;
+ appearance.green = 0;
+ appearance.blue = 1;
+ }
}
DNA DNA::combine(DNA D)
@@ -69,11 +67,12 @@ DNA DNA::combine(DNA D)
N.expectedPregnancyTime = (expectedPregnancyTime + D.expectedPregnancyTime)/2;
N.expectedAge = (expectedAge + D.expectedAge)/2;
N.growAmount = (growAmount + D.growAmount)/2;
+ N.hungryAmount = (hungryAmount + D.hungryAmount)/2;
+ N.starveAmount = (starveAmount + D.starveAmount)/2;
N.reach = (reach + D.reach)/2;
N.speed = (speed + D.speed)/2;
N.mutationPercent = (mutationPercent + D.mutationPercent)/2;
N.mutationChance = (mutationChance + D.mutationChance)/2;
- N.appearance.sides = CREATURE_SIDES;
N.appearance.red = appearance.red;
N.appearance.green = appearance.green;
N.appearance.blue = appearance.blue;
diff --git a/src/list.cpp b/src/list.cpp
index 9d32b21..0719ff0 100644
--- a/src/list.cpp
+++ b/src/list.cpp
@@ -22,7 +22,7 @@ List::List()
resources.push_back(X);
}
- Rectangle R1 = Rectangle(0,0,60,60);
+ Rectangle R1 = Rectangle(0,0,BOUNDS*2,BOUNDS*2);
tree = Quadtree(0, R1);
}
@@ -30,7 +30,7 @@ void List::Remove()
{
for(std::list<Organism>::iterator it = creatures.begin(); it!= creatures.end(); it++)
if(it->getHealth()<=0){
- DNA d = DNA("plant");
+ DNA d = DNA("corpse");
Organism X(it->getRectangle(), d);
resources.push_back(X);
creatures.erase(it--);
diff --git a/src/organism.cpp b/src/organism.cpp
index 93e2041..c3ec992 100644
--- a/src/organism.cpp
+++ b/src/organism.cpp
@@ -6,14 +6,16 @@ Organism::Organism(Rectangle r, DNA d)
myDNA = d;
if(rect.x == 0 && rect.y == 0){
- rect.x = getRandom(30);
- rect.y = getRandom(30);
+ rect.x = getRandom(BOUNDS);
+ rect.y = getRandom(BOUNDS);
}
+ hunger = 50;
health = myDNA.maxHealth/2;
gender = rand() % 2;
age = 0;
pregnancyTime = 0;
+ able = false;
pregnancyReady = false;
pregnate = false;
hasTarget = false;
@@ -22,8 +24,6 @@ Organism::Organism(Rectangle r, DNA d)
void Organism::Behavior()
{
- health-=1;
-
this->Priority();
if(!hasTarget)
@@ -42,17 +42,30 @@ void Organism::Behavior()
age++;
if(age > myDNA.expectedAge)
health = 0;
+
+ hunger++;
+ if(starving)
+ health-=1;
+ if(able)
+ health+=1;
}
void Organism::Priority()
{
- if(health < myDNA.maxHealth / 2){
- hungry = true;
- able = false;
+ if(hunger > myDNA.hungryAmount){
+ starving=false;
+ hungry = true;
+ able = false;
+ }
+ else if(hunger > myDNA.starveAmount){
+ hungry = true;
+ starving= true;
+ able = false;
}
else{
- hungry = false;
- able = true;
+ hungry = false;
+ starving= false;
+ able = true;
}
}
@@ -61,7 +74,7 @@ void Organism::setTarget()
std::random_shuffle(nearMe.begin(),nearMe.end());
for(std::vector<Organism*>::iterator it = nearMe.begin(); it!=nearMe.end(); it++){
- if( (*it)->getType() == myDNA.eatType && hungry){
+ if( ((*it)->getType() == myDNA.eatType && hungry) || ((*it)->getType() == CORPSE_TYPE && starving) ){
target = *it;
hasTarget = true;
wander = false;
@@ -77,7 +90,7 @@ void Organism::setTarget()
if(!hasTarget&&!wander){
wander = true;
- Rectangle tmp(getRandom(30),getRandom(30),0,0);
+ Rectangle tmp(getRandom(BOUNDS),getRandom(BOUNDS),0,0);
wTarget = tmp;
}
}
@@ -95,9 +108,9 @@ void Organism::Action()
{
if(hasTarget){
if(Distance(rect,target->getRectangle()) < myDNA.reach){
- if(target->getType() == myDNA.eatType){
+ if( (target->getType() == myDNA.eatType) || (target->getType() == CORPSE_TYPE) ){
target->takeBite(myDNA.bite);
- health+=myDNA.bite;
+ hunger-=myDNA.bite;
if(target->getHealth()<=0)
hasTarget = false;
}
@@ -107,7 +120,6 @@ void Organism::Action()
}
hasTarget = false;
}
-
}
else
moveTowards(target->getRectangle());
diff --git a/src/spritebatch.cpp b/src/spritebatch.cpp
index c756494..5b45e43 100644
--- a/src/spritebatch.cpp
+++ b/src/spritebatch.cpp
@@ -10,7 +10,6 @@ void SpriteBatch::init()
void SpriteBatch::begin()
{
_renderBatches.clear();
-
// Makes _glpyhs.size() == 0, however it does not free internal memory.
// So when we later call emplace_back it doesn't need to internally call new.
_gfx.clear();
@@ -67,7 +66,7 @@ void SpriteBatch::createRenderBatches()
vertices[cv++] = _gfxPtr[0]->second.red;
vertices[cv++] = _gfxPtr[0]->second.green;
vertices[cv++] = _gfxPtr[0]->second.blue;
- vertices[cv++] = _gfxPtr[0]->second.sides;
+ vertices[cv++] = SIDES;
offset += 6;
@@ -87,7 +86,7 @@ void SpriteBatch::createRenderBatches()
vertices[cv++] = _gfxPtr[cg]->second.red;
vertices[cv++] = _gfxPtr[cg]->second.green;
vertices[cv++] = _gfxPtr[cg]->second.blue;
- vertices[cv++] = _gfxPtr[cg]->second.sides;
+ vertices[cv++] = SIDES;
offset += 6;
}