summaryrefslogtreecommitdiff
path: root/src/creature.cpp
blob: b81153e5b267e01f6df54490ee387fd98fc9af1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "creature.hpp"

Creature::Creature(Window m, int size)
{
    Init(m);
    type = 1;
    
    rect.h = rect.w = size;
    
    L.x = rect.x;
    L.y = rect.y;

    health = CREATURE_START_HEALTH;
	maxHealth = CREATURE_MAX_HEALTH;
    
    hungry = false;
    hasTarget = false;
	wander = false;
    able = true;
}

void Creature::Behavior()
{
	health-=1; 

	this->Priority();

    this->setTarget();

	this->Action();
}

void Creature::Priority()
{	 
    if(health < maxHealth/2){
        hungry = true;
        able = false;
    }
    else{
        hungry = false;
        able = true;
    }
}

void Creature::setTarget()
{
    if(hasTarget)
        return;

    for(list <Entity*>::iterator it = N.begin(); it!=N.end(); it++){
       if((*it)->getType() == 2 && hungry){ 
           if(!hasTarget){
                target = *it;
                hasTarget = true; 
                wander = false;
           }
           else
               break;
       }
    }

    if(!hasTarget&&!wander){
        wander = true;
        wTarget = Location(rand()%WINDOW_X,rand()%WINDOW_Y);
    }
}


void Creature::Action()
{	
	if(hasTarget){ 
        if(Distance(L,target->getLocation())<reach){
            target->eat();
            health+=10; 
        }
        else
            Move(target->getLocation());

        if(target->getAmount()<=0){
            hasTarget = false; 
        }
    }
    else{
        if(Distance(L,wTarget)<5)
            wander = false;
        else
            Move(wTarget);
    }
}

void Creature::Move(Location l)
{
    if( L.x == l.x ){
        if( L.y < l.y )
		    L.y+=speed;
		else
			L.y-=speed;
	}
	else if( L.y == l.y ){
		if( L.x < l.x )
			L.x+=speed;
		else
			L.x-=speed;
	}
	else if( L.x < l.x ){
		if( L.y < l.y ){
			L.x+=speed;
			L.y+=speed;
		}
		else{
			L.x+=speed;
			L.y-=speed;
		}
	}
	else if ( L.x > l.x ){
		if( L.y < l.y ){
			L.x-=speed;
			L.y+=speed;
		}
		else{
			L.x-=speed;
			L.y-=speed;
		}
	}
    rect.x = L.x;
    rect.y = L.y;
}