/
creep_strata.py
105 lines (87 loc) · 3.31 KB
/
creep_strata.py
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
import pygame, random, math
from pygame.locals import *
from utils_strata import *
from animal_strata import Animal
from hunter_strata import Hunter
class Creep(Animal):
def __init__(self, id, game, pos, speed, speedmod=None, life=50.0, range=150):
Animal.__init__(self, id, "creep" + str(random.randint(1, 3)) + ".png", pos, speed, life, range)
self.nearestEnemy = None
self.eating = False
self.range = random.randint(50, 150)
self.speedmod = speedmod if speedmod else random.uniform(0.8, 1.5)
self.game = game
def _update(self):
self.checkDanger(self.game.oEntities['preds'])
if self.nearestEnemy:
self.eating = False
self.searching = False
else:
if self.nearestFood:
if self.eating and self.nearestFood.life > 0:
self._feed()
if self.nearestFood.life <= 0:
self._finishedEating()
else:
self.eating = False
self.searching = True
myTiles = self.game.map.getTilesFromRect(self.rect)
modifier = max([x.modifier for x in myTiles])
self.speed = self.speed / modifier
self._nextMove()
def _draw(self, screen):
if self.id == 1:
pygame.draw.rect(screen, BLUE, self.rect)
pygame.draw.rect(screen, (200, 0, 200), self.rect, 1)
def _search(self):
food = self.game.oEntities['food']
self.nearestFood = self._findNearestFood(food)
self.searching = self.nearestFood is not None
if self.searching:
self._foundFood(self.nearestFood)
def _foundFood(self, nFood):
if self.rect.colliderect(nFood.rect):
self.searching = False
if nFood.life > 0 and len(nFood.grazers) <= 5:
self.eating = True
else:
if not self.nearestEnemy:
self._goToPoint(nFood.position)
def _finishedEating(self):
self.eating = False
self.searching = True
self.nearestFood = None
self.speed = 0
def _feed(self):
self.speed = 0
self.life += self.decay
self.full += .05
def checkDanger(self, hunters):
self.nearestEnemy = self._findNearestEntity(hunters)
def _grow(self):
nextid = self.game.getNextId('creeps')
newchild = Creep(nextid, self.game, self.position, None)
self.game.addEntity(newchild, 'creeps')
def _nextMove(self):
if self.speed == 0:
if self.eating:
pass
else:
self.speed = self.speedmod
self._setRandomDirection()
if self.nearestEnemy:
self._goAwayPoint(self.nearestEnemy.rect.center)
def _findNearestFood(self, food):
mini = (None, 99999)
for f in food:
if self in f.grazers:
mini = (f, 0)
break
if len(f.grazers) <= 5:
distance = math.sqrt(((self.position.x - f.position.x) ** 2) + ((self.position.y - f.position.y) ** 2))
if distance < mini[1]:
mini = (f, distance)
if mini[1] < 200:
return mini[0]
else:
return None