239ad9ca1c7d7e42dabdda290978703f05003cdb
5 from utils
import SceneLogger
, Vector
17 def __init__(self
, name
, clock
):
23 self
.logger
= SceneLogger(self
)
25 def add(self
, entity
):
26 self
.logger
.debug("Scene: add %s", entity
)
28 for type in entity
.TYPES
:
29 self
.byType
.setdefault(type, []).append(entity
)
31 def remove(self
, entity
):
32 self
.logger
.debug("Scene: remove %s", entity
)
33 self
.all
.remove(entity
)
34 for type in entity
.TYPES
:
35 entities
= self
.byType
.get(type, [])
36 if entity
in entities
: entities
.remove(entity
)
38 def getByType(self
, type):
39 return self
.byType
.get(type, [])
41 def getAt(self
, entity
, type):
42 return [e
for e
in self
.getByType(type) if (e
.pos
[0] == entity
.pos
[0] and e
.pos
[1] == entity
.pos
[1])]
44 def getAround(self
, entity
, distance
, type):
46 return (e
.pos
- entity
.pos
).magnitude() < distance
47 return [e
for e
in self
.getByType(type) if isAround(e
)]
56 self
.id = _entityCounter
60 return "%s(%d)" % (self
.__class__
.__name__
, self
.id)
63 class Physical(Entity
):
64 TYPES
= Entity
.TYPES
+ [Scene
.Types
.DRAWABLE
, Scene
.Types
.PHYSICAL
]
65 def __init__(self
, pos
, walkable
=True):
66 super(Physical
, self
).__init__()
69 self
.walkable
= walkable
71 def addToScene(self
, scene
):
76 def removeFromScene(self
):
77 self
.scene
.remove(self
)
91 TYPES
= Physical
.TYPES
+ [Scene
.Types
.GOODS
]
92 def __init__(self
, pos
):
93 super(Good
, self
).__init__(pos
, False)
94 self
.type = Scene
.GoodTypes
.FOOD
97 def getRenderColor(self
):
101 e
.stats
["life"] += self
.value
102 self
.removeFromScene()
106 TYPES
= Physical
.TYPES
+ [Scene
.Types
.ALIVE
]
107 def __init__(self
, pos
):
108 super(Bot
, self
).__init__(pos
, True)
109 self
.direction
= Vector(0, 0)
111 self
.stats
= {"life": 10, "speed": 1}
114 self
.behaviorData
= {}
116 def addGene(self
, gene
):
117 self
.genes
.append(gene
)
124 def getRenderColor(self
):
130 self
.name
= self
.__class__
.__name__
134 def apply(self
, entity
):
135 stat
= entity
.stats
.setdefault(self
.attribute
, 0)
136 if stat
+ self
.modifier
>= 0:
137 entity
.stats
[self
.attribute
] = stat
+ self
.modifier
141 return "%s" % (self
.name
)
144 class LongLegs(Gene
):
146 super(LongLegs
, self
).__init__()
147 self
.attribute
= "speed"
150 class ShortLegs(Gene
):
152 super(ShortLegs
, self
).__init__()
153 self
.attribute
= "speed"
156 class ClassicBeauty(Gene
):
158 super(ClassicBeauty
, self
).__init__()
159 self
.attribute
= "charisma"
162 class ExoticBeauty(Gene
):
164 super(ExoticBeauty
, self
).__init__()
165 self
.attribute
= "charisma"
170 super(Eyes
, self
).__init__()
171 self
.attribute
= "perception"
176 GENES
= dict(inspect
.getmembers(sys
.modules
[__name__
], lambda member
: inspect
.isclass(member
) and member
.__module__
== __name__
and issubclass(member
, Gene
)))
178 GENE_NAMES
= GENES
.keys()
180 print "Available genes: ", GENE_NAMES