(norganizer) web status filter
[experiments.git] / evolution / entities.py
1
2 import logging
3
4 from scene import Scene
5 from utils import Vector
6
7 _entityCounter = 0
8
9 class Entity(object):
10 TYPES = []
11 def __init__(self):
12 global _entityCounter
13 self.id = _entityCounter
14 _entityCounter += 1
15
16 def __repr__(self):
17 return "%s(%d)" % (self.__class__.__name__, self.id)
18
19
20 class Physical(Entity):
21 TYPES = Entity.TYPES + [Scene.Types.DRAWABLE, Scene.Types.PHYSICAL]
22 def __init__(self, pos, walkable=True):
23 super(Physical, self).__init__()
24 self.scene = None
25 self.pos = pos
26 self.walkable = walkable
27
28 def addToScene(self, scene):
29 self.scene = scene
30 self.scene.add(self)
31 return self
32
33 def removeFromScene(self):
34 self.scene.remove(self)
35 self.scene = None
36 return self
37
38 def move(self, dv):
39 self.pos += dv
40 return self
41
42 def at(self, newPos):
43 self.pos = newPos
44 return self
45
46
47 class Good(Physical):
48 TYPES = Physical.TYPES + [Scene.Types.GOODS]
49 RENDER = Scene.Render.Good
50 def __init__(self, pos):
51 super(Good, self).__init__(pos, False)
52 self.type = Scene.GoodTypes.FOOD
53 self.value = 100
54 self.color = "blue"
55
56 def use(self, e):
57 e.stats["life"] += self.value
58 self.removeFromScene()
59
60
61 class Bot(Physical):
62 TYPES = Physical.TYPES + [Scene.Types.ALIVE]
63 RENDER = Scene.Render.Bot
64 def __init__(self, pos):
65 super(Bot, self).__init__(pos, True)
66 self.forces = Vector(0, 0)
67 self.velocity = Vector(0, 0)
68 self.genes = []
69 self.stats = {"life": 100, "speed": 1}
70 self.behavior = None
71 self.behaviorData = {}
72
73 def check(self):
74 badValues = [k for k, v in self.stats.iteritems() if v < 0]
75 if badValues:
76 logging.debug("%s died by bad genes: %s", self, badValues)
77
78 def addGene(self, gene):
79 self.genes.append(gene)
80 gene.apply(self)
81 self.check()
82 return self
83
84 def getGenes(self):
85 return self.genes
86
87
88 class Gene(object):
89 def __init__(self):
90 self.name = self.__class__.__name__
91
92 def modifyStat(self, entity, attribute, value):
93 stat = entity.stats.setdefault(attribute, 0)
94 entity.stats[attribute] = stat + value
95
96 def apply(self, entity):
97 return self
98
99 def __repr__(self):
100 return "%s" % (self.name)
101
102 class ColorRed(Gene):
103 def apply(self, entity):
104 self.modifyStat(entity, "color_red", 25)
105
106 class ColorGreen(Gene):
107 def apply(self, entity):
108 self.modifyStat(entity, "color_green", 25)
109
110 class ColorBlue(Gene):
111 def apply(self, entity):
112 self.modifyStat(entity, "color_blue", 25)
113
114 class LongLegs(Gene):
115 def apply(self, entity):
116 self.modifyStat(entity, "speed", 0.5)
117
118 class ShortLegs(Gene):
119 def apply(self, entity):
120 self.modifyStat(entity, "speed", 0.5)
121
122 class ClassicBeauty(Gene):
123 def apply(self, entity):
124 self.modifyStat(entity, "charisma", 0.5)
125
126 class ExoticBeauty(Gene):
127 def apply(self, entity):
128 self.modifyStat(entity, "charisma", 1)
129
130 class Eyes(Gene):
131 def apply(self, entity):
132 self.modifyStat(entity, "perception", 2)
133
134
135 import inspect, sys
136 GENES = dict(inspect.getmembers(sys.modules[__name__], lambda member: inspect.isclass(member) and member.__module__ == __name__ and issubclass(member, Gene)))
137 del GENES["Gene"]
138 GENE_NAMES = GENES.keys()
139 GENE_NAMES.sort()
140 print "Available genes: ", GENE_NAMES
141