From 836f56a40fa4a2b8e68c23b2c299e50fefe0c15d Mon Sep 17 00:00:00 2001 From: Tom Barrett Date: Sun, 12 Mar 2017 11:07:22 -0500 Subject: -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 --- src/dna.cpp | 39 +++++++++++++++++++-------------------- src/list.cpp | 4 ++-- src/organism.cpp | 40 ++++++++++++++++++++++++++-------------- src/spritebatch.cpp | 5 ++--- 4 files changed, 49 insertions(+), 39 deletions(-) (limited to 'src') 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::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::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; } -- cgit v1.2.3