Browse Source

Add Interior management (back only)

Bastien Sevajol 6 years ago
parent
commit
c57a3fe3e2

+ 1 - 0
opencc/maps/003/terrain.tsx View File

@@ -18,6 +18,7 @@
18 18
    <property name="opacity" type="float" value="100.0"/>
19 19
    <property name="height" type="float" value="2.0"/>
20 20
   </properties>
21
+ </tile>
21 22
  <tile id="2">
22 23
   <properties>
23 24
    <property name="name" type="str" value="Bitume"/>

+ 89 - 0
opencc/simulation/interior.py View File

@@ -0,0 +1,89 @@
1
+# coding: utf-8
2
+import typing
3
+
4
+from synergine2_xyz.map import TMXMap
5
+from synergine2_xyz.utils import get_direct_around_positions_of_position
6
+
7
+
8
+class InteriorMapConfiguration(object):
9
+    def __init__(
10
+        self,
11
+        layer_name: str='interiors',
12
+        exterior_id: str='ext',
13
+        interior_id: str='int',
14
+        separator_id: str='sep',
15
+    ) -> None:
16
+        self.layer_name = layer_name
17
+        self.exterior_id = exterior_id
18
+        self.interior_id = interior_id
19
+        self.separator_id = separator_id
20
+
21
+
22
+class InteriorManager(object):
23
+    def __init__(
24
+        self,
25
+        map_: TMXMap,
26
+        configuration: InteriorMapConfiguration=None,
27
+    ) -> None:
28
+        self.interiors = []
29
+        self.map = map_
30
+        self.configuration = configuration or InteriorMapConfiguration()
31
+        self.interiors = self._compute_interiors()
32
+
33
+    def _compute_interiors(self) -> typing.List[typing.List[typing.Tuple[int, int]]]:
34
+        interiors = []
35
+        layer_tiles = self.map.layer_tiles(self.configuration.layer_name)
36
+        for tile_xy, tile in layer_tiles.items():
37
+
38
+            if tile.property('id') == self.configuration.interior_id:
39
+                x, y = map(int, tile_xy.split('.'))
40
+                if not any([(x, y) in i for i in interiors]):
41
+                    new_interior = [(x, y)]
42
+                    positions_to_parse = []
43
+                    possible_positions_xyz = get_direct_around_positions_of_position((x, y, 0))
44
+                    possible_positions_xy = [(p[0], p[1]) for p in possible_positions_xyz]
45
+                    positions_to_parse.extend(possible_positions_xy)
46
+
47
+                    for possible_position_xyz in positions_to_parse:
48
+                        test_tile = None
49
+                        new_tile_x = possible_position_xyz[0]
50
+                        new_tile_y = possible_position_xyz[1]
51
+                        possible_position_key = '{}.{}'.format(new_tile_x, new_tile_y)
52
+
53
+                        if (new_tile_x, new_tile_y) in new_interior:
54
+                            continue
55
+
56
+                        try:
57
+                            test_tile = layer_tiles[possible_position_key]
58
+                        except KeyError:
59
+                            continue
60
+
61
+                        if test_tile.property('id') not in [
62
+                            self.configuration.interior_id,
63
+                            self.configuration.separator_id,
64
+                        ]:
65
+                            continue
66
+
67
+                        new_interior.append((new_tile_x, new_tile_y))
68
+
69
+                        if not test_tile.property('id') == self.configuration.separator_id:
70
+                            new_position_neighbour = get_direct_around_positions_of_position((new_tile_x, new_tile_y, 0))
71
+                            positions_to_parse.extend(new_position_neighbour)
72
+
73
+                    interiors.append(new_interior)
74
+
75
+        return interiors
76
+
77
+    def get_interiors(
78
+        self,
79
+        where_positions: typing.List[typing.Tuple[int, int]]=None,
80
+    ) -> typing.List[typing.List[typing.Tuple[int, int]]]:
81
+        if not where_positions:
82
+            return self.interiors
83
+        interiors = []
84
+
85
+        for interior in self.interiors:
86
+            for where_position in where_positions:
87
+                if where_position in interior and interior not in interiors:
88
+                    interiors.append(interior)
89
+        return interiors

+ 1 - 0
requirements.txt View File

@@ -13,5 +13,6 @@ PyYAML==3.12
13 13
 redis==2.10.6
14 14
 six==1.11.0
15 15
 tmx==1.9.1
16
+pytest
16 17
 git+https://github.com/buxx/synergine2.git@master
17 18
 git+https://github.com/buxx/cocos.git@tileset

+ 1 - 0
tests/__init__.py View File

@@ -0,0 +1 @@
1
+# coding: utf-8

+ 1 - 0
tests/fixtures/__init__.py View File

@@ -0,0 +1 @@
1
+# coding: utf-8

BIN
tests/fixtures/interiors.png View File


+ 22 - 0
tests/fixtures/interiors.tsx View File

@@ -0,0 +1,22 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<tileset name="interiors" tilewidth="8" tileheight="8" spacing="1" tilecount="49" columns="7">
3
+ <image source="interiors.png" width="64" height="64"/>
4
+ <tile id="0">
5
+  <properties>
6
+   <property name="name" type="str" value="Exterior"/>
7
+   <property name="id" type="str" value="ext"/>
8
+  </properties>
9
+ </tile>
10
+ <tile id="1">
11
+  <properties>
12
+   <property name="name" type="str" value="interior"/>
13
+   <property name="id" type="str" value="int"/>
14
+  </properties>
15
+ </tile>
16
+ <tile id="2">
17
+  <properties>
18
+   <property name="name" type="str" value="separator"/>
19
+   <property name="id" type="str" value="sep"/>
20
+  </properties>
21
+ </tile>
22
+</tileset>

+ 13 - 0
tests/fixtures/one_interior.tmx View File

@@ -0,0 +1,13 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<map version="1.0" tiledversion="2017.07.26" orientation="orthogonal" renderorder="left-up" width="5" height="5" tilewidth="8" tileheight="8" nextobjectid="1">
3
+ <tileset firstgid="1" source="interiors.tsx"/>
4
+ <layer name="interiors" width="5" height="5">
5
+  <data encoding="csv">
6
+0,0,0,0,0,
7
+0,2,2,2,0,
8
+0,2,2,2,0,
9
+0,2,2,2,0,
10
+0,0,0,0,0
11
+</data>
12
+ </layer>
13
+</map>

+ 13 - 0
tests/fixtures/side_by_side_interiors.tmx View File

@@ -0,0 +1,13 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<map version="1.0" tiledversion="2017.07.26" orientation="orthogonal" renderorder="left-up" width="5" height="5" tilewidth="8" tileheight="8" nextobjectid="1">
3
+ <tileset firstgid="1" source="interiors.tsx"/>
4
+ <layer name="interiors" width="5" height="5">
5
+  <data encoding="csv">
6
+0,0,0,0,0,
7
+2,2,3,2,2,
8
+2,2,3,2,2,
9
+2,2,3,2,2,
10
+0,0,0,0,0
11
+</data>
12
+ </layer>
13
+</map>

+ 13 - 0
tests/fixtures/two_interiors.tmx View File

@@ -0,0 +1,13 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<map version="1.0" tiledversion="2017.07.26" orientation="orthogonal" renderorder="left-up" width="5" height="5" tilewidth="8" tileheight="8" nextobjectid="1">
3
+ <tileset firstgid="1" source="interiors.tsx"/>
4
+ <layer name="interiors" width="5" height="5">
5
+  <data encoding="csv">
6
+0,0,0,0,0,
7
+2,2,1,2,2,
8
+2,2,1,2,2,
9
+2,2,1,2,2,
10
+0,0,0,0,0
11
+</data>
12
+ </layer>
13
+</map>

+ 1 - 0
tests/gui/__init__.py View File

@@ -0,0 +1 @@
1
+# coding: utf-8

+ 130 - 0
tests/gui/test_interiors.py View File

@@ -0,0 +1,130 @@
1
+# coding: utf-8
2
+from synergine2_xyz.map import TMXMap
3
+
4
+from opencc.simulation.interior import InteriorManager
5
+
6
+
7
+def test_interior_zones__one_zone():
8
+    map_ = TMXMap('tests/fixtures/one_interior.tmx')
9
+    manager = InteriorManager(map_)
10
+    interiors = manager.get_interiors()
11
+
12
+    assert interiors
13
+    assert isinstance(interiors, list)
14
+    assert 1 == len(interiors)
15
+
16
+    assert (1, 1) in interiors[0]
17
+    assert (1, 2) in interiors[0]
18
+    assert (1, 3) in interiors[0]
19
+    assert (2, 1) in interiors[0]
20
+    assert (2, 2) in interiors[0]
21
+    assert (2, 3) in interiors[0]
22
+    assert (3, 1) in interiors[0]
23
+    assert (3, 2) in interiors[0]
24
+    assert (3, 3) in interiors[0]
25
+    assert 9 == len(interiors[0])
26
+
27
+
28
+def test_interior_zones__two_separated_zones():
29
+    map_ = TMXMap('tests/fixtures/two_interiors.tmx')
30
+    manager = InteriorManager(map_)
31
+    interiors = sorted(manager.get_interiors())
32
+
33
+    assert interiors
34
+    assert isinstance(interiors, list)
35
+    assert 2 == len(interiors)
36
+
37
+    assert (0, 1) in interiors[0]
38
+    assert (1, 1) in interiors[0]
39
+    assert (0, 2) in interiors[0]
40
+    assert (1, 2) in interiors[0]
41
+    assert (0, 3) in interiors[0]
42
+    assert (1, 3) in interiors[0]
43
+    assert 6 == len(interiors[0])
44
+
45
+    assert (3, 1) in interiors[1]
46
+    assert (4, 1) in interiors[1]
47
+    assert (3, 2) in interiors[1]
48
+    assert (4, 2) in interiors[1]
49
+    assert (3, 3) in interiors[1]
50
+    assert (4, 3) in interiors[1]
51
+    assert 6 == len(interiors[1])
52
+
53
+
54
+def test_interiors_zones__side_by_side_zones_with_separator():
55
+    map_ = TMXMap('tests/fixtures/side_by_side_interiors.tmx')
56
+    manager = InteriorManager(map_)
57
+    interiors = sorted(manager.get_interiors())
58
+
59
+    assert interiors
60
+    assert isinstance(interiors, list)
61
+    assert 2 == len(interiors)
62
+
63
+    assert (0, 1) in interiors[0]
64
+    assert (1, 1) in interiors[0]
65
+    assert (0, 2) in interiors[0]
66
+    assert (1, 2) in interiors[0]
67
+    assert (0, 3) in interiors[0]
68
+    assert (1, 3) in interiors[0]
69
+    assert (2, 1) in interiors[0]
70
+    assert (2, 2) in interiors[0]
71
+    assert (2, 3) in interiors[0]
72
+    assert 9 == len(interiors[0])
73
+
74
+    assert (2, 1) in interiors[1]
75
+    assert (2, 2) in interiors[1]
76
+    assert (2, 3) in interiors[1]
77
+    assert (3, 1) in interiors[1]
78
+    assert (4, 1) in interiors[1]
79
+    assert (3, 2) in interiors[1]
80
+    assert (4, 2) in interiors[1]
81
+    assert (3, 3) in interiors[1]
82
+    assert (4, 3) in interiors[1]
83
+    assert 9 == len(interiors[1])
84
+
85
+
86
+def test_interiors_zones__active_zones():
87
+    # active zones are zone where someone is in
88
+    map_ = TMXMap('tests/fixtures/two_interiors.tmx')
89
+    manager = InteriorManager(map_)
90
+
91
+    interiors = manager.get_interiors(where_positions=[(0, 1)])
92
+
93
+    assert (0, 1) in interiors[0]
94
+    assert (1, 1) in interiors[0]
95
+    assert (0, 2) in interiors[0]
96
+    assert (1, 2) in interiors[0]
97
+    assert (0, 3) in interiors[0]
98
+    assert (1, 3) in interiors[0]
99
+    assert 6 == len(interiors[0])
100
+
101
+    interiors = manager.get_interiors(where_positions=[(4, 2)])
102
+
103
+    assert 1 == len(interiors)
104
+    assert (3, 1) in interiors[0]
105
+    assert (4, 1) in interiors[0]
106
+    assert (3, 2) in interiors[0]
107
+    assert (4, 2) in interiors[0]
108
+    assert (3, 3) in interiors[0]
109
+    assert (4, 3) in interiors[0]
110
+    assert 6 == len(interiors[0])
111
+
112
+    interiors = manager.get_interiors(where_positions=[(0, 1), (4, 2)])
113
+
114
+    assert 2 == len(interiors)
115
+
116
+    assert (0, 1) in interiors[0]
117
+    assert (1, 1) in interiors[0]
118
+    assert (0, 2) in interiors[0]
119
+    assert (1, 2) in interiors[0]
120
+    assert (0, 3) in interiors[0]
121
+    assert (1, 3) in interiors[0]
122
+    assert 6 == len(interiors[0])
123
+
124
+    assert (3, 1) in interiors[1]
125
+    assert (4, 1) in interiors[1]
126
+    assert (3, 2) in interiors[1]
127
+    assert (4, 2) in interiors[1]
128
+    assert (3, 3) in interiors[1]
129
+    assert (4, 3) in interiors[1]
130
+    assert 6 == len(interiors[1])