/
soldier.py
80 lines (71 loc) · 2.74 KB
/
soldier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import pygame
import character
import sound
import game
class Soldier(character.Character):
def __init__(self, gx, gy):
character.Character.__init__(self, "assets/soldier.png", gx, gy, 14)
self.type = "soldier"
self.state = "stand"
self.state_time = 0
def get_neighbors(self, game):
x,y = self.gx, self.gy
n = []
if x > 0: n.append((x-1,y))
if y > 0: n.append((x,y-1))
if x < len(game.object_grid[0]) - 1: n.append((x+1,y))
if y < len(game.object_grid) - 1: n.append((x,y+1))
return n
def find_contiguous_soldiers(self, game):
open = self.get_neighbors(game)
closed = [(self.gx, self.gy)]
soldiers = [self]
for (gx,gy) in open:
if (gx,gy) in closed:
continue
obj = game.object_grid[gy][gx]
if obj and obj.type == "soldier":
soldiers.append(obj)
open.extend(obj.get_neighbors(game))
closed.append((gx,gy))
return soldiers
def interact(self, state, worker):
soldier_group = self.find_contiguous_soldiers(state.scene)
enough_workers = True
snake_poss = [(s.gx, s.gy) for s in state.scene.snake]
for s in soldier_group:
any_worker_neighbor = False
for nx,ny in s.get_neighbors(state.scene):
if (nx,ny) in snake_poss:
any_worker_neighbor = True
s.state = "disarm"
s.state_time = 0.5
dx = nx - s.gx
dy = ny - s.gy
s.last_move_direction = game.DIRS_FROM_OFFSETS[(dx, dy)]
if not any_worker_neighbor:
enough_workers = False
if len(state.scene.snake) < len(soldier_group):
enough_workers = False
if enough_workers:
sound.play("soldier")
for s in soldier_group:
state.scene.object_grid[s.gy][s.gx] = None
state.scene.add_queued_worker()
state.scene.animatedsprites.remove(s)
s.state = "won"
s.state_time = 0.2
else:
sound.play("cannot")
def update(self, dt):
character.Character.update(self,dt)
if self.state == "disarm" or self.state == "won":
self.set_frame(self.last_move_direction + 8)
self.state_time -= dt
if self.state_time < 0:
if self.state == "disarm":
self.state = "standing"
self.step_animation()
self.update_direction()
elif self.state == "won":
self.kill()