Browse Source

Add TMX experimental loader for rocks

Bastien Sevajol 9 years ago
parent
commit
b8d29c1c44

+ 11 - 0
intelligine/core/exceptions.py View File

@@ -0,0 +1,11 @@
1
+class MovementException(Exception):
2
+    pass
3
+
4
+class SamePosition(MovementException):
5
+    pass
6
+
7
+class PheromoneException(Exception):
8
+    pass
9
+
10
+class NoPheromoneMove(PheromoneException, MovementException):
11
+    pass

BIN
intelligine/display/pygame/image/food.png View File


BIN
intelligine/display/pygame/image/test.png View File


+ 2 - 2
intelligine/sandbox/exploration/ColonyConfiguration.py View File

@@ -4,8 +4,8 @@ from intelligine.synergy.object.ant.Ant import Ant
4 4
 
5 5
 class ColonyConfiguration(ColonyConfiguration):
6 6
 
7
-    _start_position = (0, 20, 20)
7
+    _start_position = (0, 5, 5)
8 8
     _ant_class = Ant
9
-    _ant_count = 2
9
+    _ant_count = 50
10 10
 
11 11
 

+ 33 - 0
intelligine/sandbox/exploration/RocksConfiguration.py View File

@@ -0,0 +1,33 @@
1
+from synergine.synergy.collection.Configuration import Configuration
2
+from intelligine.synergy.object.Rock import Rock
3
+import pytmx
4
+from os import getcwd
5
+
6
+
7
+class RocksConfiguration(Configuration):
8
+
9
+    def get_start_objects(self, collection, context):
10
+        rocks = []
11
+        # TODO: Experimental: Crer un loader de TMX (qui gere aussi les visualisation ?)
12
+        tmxdata = pytmx.TiledMap(getcwd()+"/intelligine/sandbox/exploration/map2.tmx")
13
+
14
+        objects = {}
15
+        for tileset in tmxdata.tilesets:
16
+            obj_id = tileset.firstgid
17
+            file = tmxdata.tile_properties[obj_id]['file']
18
+            classname = tmxdata.tile_properties[obj_id]['classname']
19
+            mod = __import__(file,
20
+                             fromlist=[classname])
21
+            objects[obj_id] = {
22
+                'class': getattr(mod, classname)
23
+            }
24
+
25
+        for layer in [vl for vl in tmxdata.visible_layers]:
26
+            for xi, x in enumerate(layer.data):
27
+                for yi, y in enumerate(x):
28
+                    if y in objects:
29
+                        rock = objects[y]['class'](collection, context)
30
+                        rock.set_position((0, xi, yi))
31
+                        rocks.append(rock)
32
+
33
+        return rocks

+ 17 - 0
intelligine/sandbox/exploration/map.tmx View File

@@ -0,0 +1,17 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<map version="1.0" orientation="isometric" width="200" height="100" tilewidth="20" tileheight="20">
3
+ <tileset firstgid="1" name="Rock" tilewidth="20" tileheight="20">
4
+  <image source="../../display/pygame/image/rock.png" width="20" height="20"/>
5
+  <tile id="0">
6
+   <properties>
7
+    <property name="classname" value="Rock"/>
8
+    <property name="file" value="intelligine.synergy.object.Rock"/>
9
+   </properties>
10
+  </tile>
11
+ </tileset>
12
+ <layer name="Calque 1" width="200" height="100">
13
+  <data encoding="base64" compression="zlib">
14
+   eJzt3Ntu6lAMRVH4/58+QpVVVacpxMQk2x5DylMhqRZ7PvVyv91ud5fLtXlxLJv2oI8aNu1BHzVs2oM+ati0B33UsGkP+qhh0x70UcOmPeijhk170EcNm/agjxo27WFvH2f/nH+V3zHQRw+ZPnjOTj3oo4adetBHDTv1oI8adupBHzXs1IM+atipB33UsFMP+qhhpx70UcNOPeijhp160EcNO/Wgjxp26kEfNezUgz5q2KkHfdSwUw/6qGGnHvRRw0496KOGnXrQRw079aAP2KYP2KYP2KYP2KYP2HalPrL/iw2qnNXH0f+vECqc2cezr2uEs121j3iNRjjTlfuI12mEs1y9j3itRjjDCn3E6zXCp63SR7xHI3zSSn3E+zTCp6zWR7xXI3zCin3E+zVCtVX7iHtohEor9xH30QhVVu8j7qURKnToI+6nEY7WpY+4p0Y4Uqc+4r4a4Sjd+oh7a4QjdOwj7q8R3tW1j3iGRnhH5z7iORohq3sf8SyNkDGhj3ieRthrSh/xTI2wx6Q+4rkaed+UDaf1Ec+e8vlWmbLfxD7i+Wd/Dyubst3UPh40kjdlt8l9PGgkZ8pm0/t40Mh+U/bSxxeN7DNlK31808jrpuykj5808popG511Hq68r0aem7KPPn6nkb9N2UYf2zSybcou+vibRn43ZRN9PKeR/03ZQx+v0chPU7bQx+s08m3KDvrYRyNfpmygj/1W/t6PMmUDfZAx5fPTBxlTPr/7iRfrmvL5OatkTDkz+iBjypnRBxlTzow+yJhyZvRBxpQzow8yppwZfZAx5czog4wpZ0YfZEw5M/ogY8qZ0QcZU86MPsiYcmb0QcaUM6MPMqacGX2QMeXM6IOMKWdGH2RMOTP6IGPKmTnz72tdrhWufwjmA7Q=
15
+  </data>
16
+ </layer>
17
+</map>

+ 26 - 0
intelligine/sandbox/exploration/map2.tmx View File

@@ -0,0 +1,26 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<map version="1.0" orientation="isometric" width="200" height="100" tilewidth="20" tileheight="20">
3
+ <tileset firstgid="1" name="Rock" tilewidth="20" tileheight="20">
4
+  <image source="../../display/pygame/image/rock.png" width="20" height="20"/>
5
+  <tile id="0">
6
+   <properties>
7
+    <property name="classname" value="Rock"/>
8
+    <property name="file" value="intelligine.synergy.object.Rock"/>
9
+   </properties>
10
+  </tile>
11
+ </tileset>
12
+ <tileset firstgid="2" name="Food" tilewidth="20" tileheight="20">
13
+  <image source="../../display/pygame/image/food.png" width="20" height="20"/>
14
+  <tile id="0">
15
+   <properties>
16
+    <property name="classname" value="Food"/>
17
+    <property name="file" value="intelligine.synergy.object.Food"/>
18
+   </properties>
19
+  </tile>
20
+ </tileset>
21
+ <layer name="Calque 1" width="200" height="100">
22
+  <data encoding="base64" compression="zlib">
23
+   eJzt3MEKg0AQREH1/z86lxyFBFnxTVIFc2+36av7tm27u3z8tikdF3MWM7HWlI6LOYuZWGtKx8WcxUysNaXjYs5iJtaa0nExZzETa03p+FPOJ75jyttxXaHjbzLYB08odGwfVBU6tg+qCh3bB1WFju2DqkLH9kFVoWP7oKrQsX1QVejYPqgqdGwfVBU6tg+qCh1P28fxvsLbca9Cxysy3P0dx8kV3o57FTqu7+NsG/bxHwod2wdVhY7tg6qn/48z/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaHgB3d0BMg==
24
+  </data>
25
+ </layer>
26
+</map>

+ 15 - 2
intelligine/synergy/event/move/MoveAction.py View File

@@ -1,9 +1,10 @@
1 1
 from synergine.synergy.event.Action import Action
2 2
 from intelligine.synergy.event.move.MoveEvent import MoveEvent
3
-from random import randint, choice
3
+from random import randint, choice, randrange
4 4
 from xyzworld.cst import POSITION, POSITIONS
5 5
 from intelligine.cst import PREVIOUS_DIRECTION, BLOCKED_SINCE
6 6
 from intelligine.synergy.event.move.direction import directions_same_level, directions_modifiers, directions_slighty
7
+from intelligine.core.exceptions import NoPheromoneMove
7 8
 
8 9
 
9 10
 class MoveAction(Action):
@@ -17,7 +18,10 @@ class MoveAction(Action):
17 18
 
18 19
     def prepare(self, context):
19 20
       object_point = context.metas.value.get(POSITION, self._object_id)
20
-      choosed_direction_name, choosed_direction_point = self._get_random_direction_point(context, object_point)
21
+      try:
22
+          choosed_direction_name, choosed_direction_point = self._get_pheromone_direction_point(context, object_point)
23
+      except NoPheromoneMove:
24
+          choosed_direction_name, choosed_direction_point = self._get_random_direction_point(context, object_point)
21 25
       if self._direction_point_is_possible(context, choosed_direction_point):
22 26
         self._move_to_point = choosed_direction_point
23 27
         self._move_to_direction = choosed_direction_name
@@ -38,6 +42,11 @@ class MoveAction(Action):
38 42
         if blocked_since <= 3:  #TODO: config
39 43
             try:
40 44
                 previous_direction = context.metas.value.get(PREVIOUS_DIRECTION, self._object_id)
45
+                # TODO: Faut mettre ca en plus propre (proba d'aller tou droit, config, etc)
46
+                if randrange(100) < 75:  # 75% de change d'aller tout droit
47
+                    # Dans le futur: les fourmis vont moins tout droit quand elle se croient et se touche
48
+                    return previous_direction
49
+
41 50
                 directions_list = directions_slighty[previous_direction]
42 51
                 # TODO: TMP tant que 1 niveau (z)
43 52
                 directions_list = [direction for direction in directions_list if direction > 9 and direction < 19]
@@ -64,3 +73,7 @@ class MoveAction(Action):
64 73
             except:
65 74
                 blocked_since = 0
66 75
             context.metas.value.set(BLOCKED_SINCE, self._object_id, blocked_since+1)
76
+
77
+    def _get_pheromone_direction_point(self, context, object_point):
78
+
79
+        raise NoPheromoneMove()

+ 9 - 0
intelligine/synergy/object/Food.py View File

@@ -0,0 +1,9 @@
1
+from xyzworld.SynergyObject import SynergyObject as XyzSynergyObject
2
+from intelligine.cst import IMPENETRABLE
3
+
4
+
5
+class Food(XyzSynergyObject):
6
+
7
+    def __init__(self, collection, context):
8
+        super().__init__(collection, context)
9
+        context.metas.states.add(self.get_id(), IMPENETRABLE)