rev |
line source |
me@34
|
1 import engine |
me@34
|
2 |
me@34
|
3 def preprocess(line): |
me@34
|
4 if '//' in line: |
me@34
|
5 line = line[:line.index('//')] |
me@34
|
6 line = line.rstrip() |
me@34
|
7 return line |
martiran@30
|
8 |
martiran@30
|
9 class Snake(object): |
martiran@32
|
10 def __init__ (self, cells, color): |
martiran@32
|
11 self.cells = cells |
martiran@32
|
12 self.color = color |
martiran@32
|
13 self.rules = [] |
me@34
|
14 |
me@34
|
15 def load (self, file): |
me@34
|
16 magic, name = preprocess(file.readline()).split(' ', 1) |
me@34
|
17 assert magic == "snake", "This is not snake file" |
me@34
|
18 while True: |
me@34
|
19 line = preprocess(file.readline()) |
me@34
|
20 if line == 'end': |
me@34
|
21 break |
me@34
|
22 assert line == '', "Rules must be separated by empty lines" |
me@34
|
23 self.rules.append(Rule().load(file)) |
me@34
|
24 |
martiran@30
|
25 def fill (self): |
martiran@32
|
26 for cell in self.cells: |
martiran@32
|
27 cell.snake = self |
martiran@31
|
28 snake.cells[0].type = 'head' |
martiran@31
|
29 snake.cells[-1].type = 'tail' |
martiran@31
|
30 snake.cells[1:-1].type = 'body' |
martiran@31
|
31 return |
me@34
|
32 |
martiran@33
|
33 def error (self): |
martiran@33
|
34 pass |
martiran@30
|
35 |
martiran@30
|
36 |
martiran@30
|
37 class Rule(object): |
me@34
|
38 |
me@34
|
39 codes = { |
me@34
|
40 'h': 'head', |
me@34
|
41 'b': 'body', |
me@34
|
42 't': 'tail', |
me@34
|
43 '#': 'wall', |
me@34
|
44 ' ': 'any', |
me@34
|
45 '-': 'empty', |
me@34
|
46 } |
me@34
|
47 |
martiran@32
|
48 def __init__ (self, snake): |
martiran@32
|
49 self.snake = snake |
me@34
|
50 self.direction = (1, 0) |
me@34
|
51 self.pattern = {} |
me@34
|
52 |
me@34
|
53 def load (self, file): |
me@34
|
54 y = 0 |
me@34
|
55 for line in file: |
me@34
|
56 line = preprocess(line) |
me@34
|
57 if y == 0 and line == '': |
me@34
|
58 continue |
me@34
|
59 assert line[-1] == ';', "Rule lines must end with semicolon" |
me@34
|
60 assert len(line) == 8, "Rule lines must be exactly 7 chars long" |
me@34
|
61 for x, char in enumerate(line[:8]): |
me@34
|
62 self.parse_cell(x, y, char) |
me@34
|
63 y += 1 |
me@34
|
64 |
me@34
|
65 def parse_cell(self, x, y, char): |
me@34
|
66 assert char.lower() in self.codes, "Illegal symbol in rule: %s" % char |
me@34
|
67 cell = engine.Cell(x, y, None) |
me@34
|
68 if char in 'htb': |
me@34
|
69 if char.islower(): |
me@34
|
70 cell.snake = 'my' |
me@34
|
71 else: |
me@34
|
72 cell.snake = 'enemy' |
me@34
|
73 cell.type = self.codes[char.lower()] |
me@34
|
74 self.pattern[x, y] = cell |
me@34
|
75 |
martiran@32
|
76 def applies (self, field, x, y): |
me@34
|
77 |
martiran@30
|
78 pass |
martiran@32
|
79 def rotate (self, rot): |
martiran@30
|
80 pass |
me@34
|
81 |
me@34
|
82 # vim: set ts=4 sts=4 sw=4 et: |