home · contact · privacy
Minor refactoring.
[plomrogue2-experiments] / server_ / map_.py
1 import sys
2 sys.path.append('../')
3 import game_common
4 import server_.game
5
6
7 class Map(game_common.Map):
8
9     def __getitem__(self, yx):
10         return self.terrain[self.get_position_index(yx)]
11
12     def __setitem__(self, yx, c):
13         pos_i = self.get_position_index(yx)
14         self.terrain = self.terrain[:pos_i] + c + self.terrain[pos_i + 1:]
15
16     def __iter__(self):
17         """Iterate over YX position coordinates."""
18         for y in range(self.size[0]):
19             for x in range(self.size[1]):
20                 yield [y, x]
21
22     @property
23     def geometry(self):
24         return self.__class__.__name__[3:]
25
26     def lines(self):
27         width = self.size[1]
28         for y in range(self.size[0]):
29             yield (y, self.terrain[y * width:(y + 1) * width])
30
31     # The following is used nowhere, so not implemented.
32     #def items(self):
33     #    for y in range(self.size[0]):
34     #        for x in range(self.size[1]):
35     #            yield ([y, x], self.terrain[self.get_position_index([y, x])])
36
37     def get_directions(self):
38         directions = []
39         for name in dir(self):
40             if name[:5] == 'move_':
41                 directions += [name[5:]]
42         return directions
43
44     def new_from_shape(self, init_char):
45         import copy
46         new_map = copy.deepcopy(self)
47         for pos in new_map:
48             new_map[pos] = init_char
49         return new_map
50
51     def move(self, start_pos, direction):
52         mover = getattr(self, 'move_' + direction)
53         new_pos = mover(start_pos)
54         if new_pos[0] < 0 or new_pos[1] < 0 or \
55                 new_pos[0] >= self.size[0] or new_pos[1] >= self.size[1]:
56             raise server_.game.GameError('would move outside map bounds')
57         return new_pos
58
59     def move_LEFT(self, start_pos):
60         return [start_pos[0], start_pos[1] - 1]
61
62     def move_RIGHT(self, start_pos):
63         return [start_pos[0], start_pos[1] + 1]
64
65
66 class MapHex(Map):
67
68     def are_neighbors(self, pos_1, pos_2):
69         if pos_1[0] == pos_2[0] and abs(pos_1[1] - pos_2[1]) <= 1:
70             return True
71         elif abs(pos_1[0] - pos_2[0]) == 1:
72             if pos_1[0] % 2 == 0:
73                 if pos_2[1] in (pos_1[1], pos_1[1] - 1):
74                     return True
75             elif pos_2[1] in (pos_1[1], pos_1[1] + 1):
76                 return True
77         return False
78
79     def move_UPLEFT(self, start_pos):
80         if start_pos[0] % 2 == 0:
81             return [start_pos[0] - 1, start_pos[1] - 1]
82         else:
83             return [start_pos[0] - 1, start_pos[1]]
84
85     def move_UPRIGHT(self, start_pos):
86         if start_pos[0] % 2 == 0:
87             return [start_pos[0] - 1, start_pos[1]]
88         else:
89             return [start_pos[0] - 1, start_pos[1] + 1]
90
91     def move_DOWNLEFT(self, start_pos):
92         if start_pos[0] % 2 == 0:
93             return [start_pos[0] + 1, start_pos[1] - 1]
94         else:
95             return [start_pos[0] + 1, start_pos[1]]
96
97     def move_DOWNRIGHT(self, start_pos):
98         if start_pos[0] % 2 == 0:
99             return [start_pos[0] + 1, start_pos[1]]
100         else:
101             return [start_pos[0] + 1, start_pos[1] + 1]
102
103
104 class MapSquare(Map):
105
106     def are_neighbors(self, pos_1, pos_2):
107         return abs(pos_1[0] - pos_2[0]) <= 1 and abs(pos_1[1] - pos_2[1] <= 1)
108
109     def move_UP(self, start_pos):
110         return [start_pos[0] - 1, start_pos[1]]
111
112     def move_DOWN(self, start_pos):
113         return [start_pos[0] + 1, start_pos[1]]
114
115
116 def get_map_class(geometry):
117     return globals()['Map' + geometry]
118
119
120 map_manager = game_common.MapManager(globals())