Skip to content

Commit efbc662

Browse files
author
p.witvoet
committed
- implemented camera dragging and snapping to boundaries
- added two (bigger) levels, one for 4 players - added titles to server/client/observer run batch files
1 parent 3bd1684 commit efbc662

File tree

8 files changed

+166
-54
lines changed

8 files changed

+166
-54
lines changed

levels/mirror_islands.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#================================================================================
2+
# Level info
3+
level.name = 'Mirror Islands'
4+
level.supportedDatabases = ['AI Wars']
5+
level.playerCount = 2
6+
7+
#================================================================================
8+
# Terrain data
9+
level.setTileData( [[7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
10+
[7, 7, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 1, 2, 2, 1, 1, 4, 1, 1, 2, 2, 1, 7, 7],
11+
[7, 1, 0, 0, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 1, 4, 1, 1, 1, 9, 0, 0, 9, 1, 4, 1, 9, 2, 2, 9, 1, 7],
12+
[7, 9, 0, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 1, 4, 1, 1, 9, 0, 2, 2, 2, 1, 4, 1, 1, 1, 1, 0, 1, 7],
13+
[7, 1, 0, 1, 2, 2, 2, 2, 1, 2, 3, 3, 3, 0, 0, 5, 0, 0, 0, 0, 2, 2, 2, 1, 4, 3, 3, 9, 3, 0, 1, 7],
14+
[7, 1, 0, 1, 1, 2, 2, 2, 9, 2, 3, 1, 1, 0, 1, 4, 1, 1, 2, 2, 2, 1, 2, 1, 4, 3, 3, 1, 1, 0, 1, 7],
15+
[7, 10, 0, 12, 1, 2, 2, 2, 2, 2, 3, 9, 0, 0, 1, 4, 1, 1, 1, 2, 2, 9, 1, 1, 4, 3, 3, 1, 12, 0, 10, 7],
16+
[7, 11, 10, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 0, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 1, 2, 10, 11, 7],
17+
[7, 10, 0, 12, 1, 1, 2, 1, 1, 9, 3, 3, 1, 0, 1, 1, 4, 1, 9, 3, 3, 3, 1, 1, 1, 1, 4, 1, 2, 0, 10, 7],
18+
[7, 1, 0, 1, 9, 1, 1, 1, 3, 1, 1, 1, 1, 0, 1, 1, 4, 1, 1, 3, 3, 3, 3, 3, 0, 0, 5, 0, 1, 0, 1, 7],
19+
[7, 1, 0, 2, 2, 2, 3, 1, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 1, 3, 3, 3, 3, 0, 1, 4, 0, 9, 0, 1, 7],
20+
[7, 1, 0, 1, 1, 2, 3, 3, 1, 0, 1, 1, 1, 0, 1, 1, 4, 1, 0, 1, 3, 1, 2, 0, 0, 1, 4, 1, 2, 2, 1, 7],
21+
[7, 9, 0, 9, 9, 0, 0, 0, 0, 0, 9, 3, 0, 0, 9, 1, 4, 1, 0, 0, 0, 9, 0, 0, 1, 1, 4, 1, 1, 1, 9, 7],
22+
[7, 7, 7, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 1, 1, 4, 1, 9, 1, 7, 7],
23+
[7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]] )
24+
25+
#================================================================================
26+
# Player starting buildings
27+
player1 = level.addPlayer()
28+
player1.addBuilding(level.getBuildingAtPosition(Point(1, 6)))
29+
player1.addBuilding(level.getBuildingAtPosition(Point(3, 6)))
30+
player1.addBuilding(level.getBuildingAtPosition(Point(1, 7)))
31+
player1.addBuilding(level.getBuildingAtPosition(Point(2, 7)))
32+
player1.addBuilding(level.getBuildingAtPosition(Point(1, 8)))
33+
player1.addBuilding(level.getBuildingAtPosition(Point(3, 8)))
34+
35+
player2 = level.addPlayer()
36+
player2.addBuilding(level.getBuildingAtPosition(Point(22, 2)))
37+
player2.addBuilding(level.getBuildingAtPosition(Point(26, 2)))
38+
player2.addBuilding(level.getBuildingAtPosition(Point(29, 2)))
39+
player2.addBuilding(level.getBuildingAtPosition(Point(27, 4)))
40+
player2.addBuilding(level.getBuildingAtPosition(Point(21, 6)))
41+
player2.addBuilding(level.getBuildingAtPosition(Point(28, 6)))
42+
player2.addBuilding(level.getBuildingAtPosition(Point(30, 6)))
43+
player2.addBuilding(level.getBuildingAtPosition(Point(18, 7)))
44+
player2.addBuilding(level.getBuildingAtPosition(Point(29, 7)))
45+
player2.addBuilding(level.getBuildingAtPosition(Point(30, 7)))
46+
player2.addBuilding(level.getBuildingAtPosition(Point(30, 8)))
47+
player2.addBuilding(level.getBuildingAtPosition(Point(28, 10)))
48+
player2.addBuilding(level.getBuildingAtPosition(Point(30, 12)))
49+
player2.addBuilding(level.getBuildingAtPosition(Point(28, 13)))

levels/spring_lakes.py

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#================================================================================
2+
# Level info
3+
level.name = 'Spring Lakes'
4+
level.supportedDatabases = ['AI Wars']
5+
level.playerCount = 4
6+
7+
#================================================================================
8+
# Terrain data
9+
level.setTileData( [[7, 7, 2, 2, 1, 1, 1, 2, 3, 3, 3, 3, 2, 1, 2, 2, 3, 3, 3, 2, 2, 2, 1, 2, 3, 3, 3, 3, 2, 2, 7, 7],
10+
[7, 2, 2, 2, 9, 9, 1, 2, 3, 3, 3, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 2, 3, 3, 3, 2, 2, 2, 7],
11+
[2, 2, 1, 1, 1, 1, 1, 3, 3, 3, 2, 1, 9, 10, 9, 1, 2, 3, 2, 1, 10, 0, 11, 1, 2, 3, 2, 2, 1, 2, 2, 2],
12+
[2, 1, 1, 7, 7, 7, 1, 3, 3, 2, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2],
13+
[1, 1, 7, 7, 7, 7, 1, 1, 1, 2, 1, 1, 7, 7, 7, 1, 1, 2, 1, 1, 10, 0, 10, 2, 2, 1, 9, 9, 1, 1, 2, 2],
14+
[2, 1, 7, 7, 1, 1, 2, 1, 1, 2, 2, 1, 7, 7, 7, 7, 1, 2, 1, 1, 1, 0, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2],
15+
[3, 1, 1, 1, 1, 2, 11, 0, 10, 1, 2, 1, 1, 7, 7, 7, 1, 2, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2],
16+
[3, 3, 3, 1, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 1, 0, 1, 7, 7, 7, 1, 1, 1, 1, 1, 1],
17+
[3, 2, 2, 1, 1, 1, 10, 0, 10, 2, 1, 9, 1, 2, 2, 1, 1, 1, 1, 1, 2, 0, 1, 7, 7, 7, 7, 7, 1, 1, 9, 1],
18+
[2, 1, 1, 1, 2, 1, 1, 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 7, 7, 7, 1, 9, 1, 2],
19+
[2, 9, 9, 1, 2, 1, 1, 0, 2, 1, 1, 1, 1, 7, 7, 7, 7, 7, 5, 7, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 3],
20+
[2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 5, 7, 7, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3],
21+
[2, 2, 1, 1, 7, 7, 1, 0, 7, 7, 1, 7, 7, 7, 7, 7, 2, 1, 1, 7, 7, 7, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3],
22+
[3, 2, 2, 2, 7, 7, 7, 5, 7, 7, 9, 7, 7, 7, 7, 7, 9, 10, 9, 1, 7, 7, 1, 1, 1, 2, 2, 1, 2, 2, 2, 3],
23+
[3, 3, 3, 2, 1, 7, 7, 5, 7, 1, 1, 2, 7, 7, 7, 7, 7, 1, 2, 7, 7, 7, 1, 1, 2, 9, 1, 1, 1, 1, 2, 2],
24+
[3, 3, 3, 3, 0, 0, 0, 0, 1, 2, 2, 1, 2, 7, 7, 7, 7, 7, 5, 7, 7, 7, 2, 1, 9, 7, 7, 7, 7, 7, 1, 2],
25+
[3, 3, 2, 2, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 7, 5, 7, 7, 2, 2, 1, 1, 7, 7, 7, 7, 7, 7, 7],
26+
[2, 2, 1, 1, 0, 9, 9, 9, 2, 1, 2, 9, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 7, 7, 7],
27+
[2, 1, 7, 7, 5, 7, 1, 1, 1, 2, 2, 1, 9, 9, 1, 1, 1, 0, 2, 2, 2, 2, 1, 1, 10, 0, 10, 1, 1, 1, 7, 7],
28+
[2, 1, 7, 7, 5, 7, 7, 7, 1, 2, 1, 2, 2, 1, 2, 1, 2, 0, 1, 1, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 1, 2],
29+
[3, 1, 2, 1, 0, 7, 7, 7, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 7, 7, 1, 2, 2, 1, 10, 0, 11, 2, 1, 2, 2, 3],
30+
[3, 3, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 7, 7, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 3, 3],
31+
[3, 2, 1, 2, 2, 1, 10, 0, 10, 1, 1, 2, 1, 7, 7, 1, 1, 7, 7, 7, 1, 1, 2, 1, 1, 1, 7, 7, 7, 1, 2, 3],
32+
[2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 1, 7, 7, 7, 7, 7, 7, 7, 1, 2, 1, 7, 7, 7, 7, 7, 7, 1, 2, 3],
33+
[2, 2, 9, 1, 2, 2, 11, 0, 10, 2, 3, 3, 1, 7, 7, 7, 7, 7, 1, 1, 1, 1, 9, 7, 7, 7, 7, 7, 7, 1, 2, 2],
34+
[2, 2, 1, 9, 1, 2, 2, 1, 1, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 9, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2],
35+
[7, 2, 2, 1, 2, 2, 3, 2, 3, 3, 3, 1, 9, 9, 10, 2, 2, 2, 3, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 7],
36+
[7, 7, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 7, 7]] )
37+
38+
#================================================================================
39+
# Player starting buildings
40+
player1 = level.addPlayer()
41+
player1.addBuilding(level.getBuildingAtPosition(Point(6, 6)))
42+
player1.addBuilding(level.getBuildingAtPosition(Point(8, 6)))
43+
player1.addBuilding(level.getBuildingAtPosition(Point(6, 8)))
44+
player1.addBuilding(level.getBuildingAtPosition(Point(8, 8)))
45+
46+
player2 = level.addPlayer()
47+
player2.addBuilding(level.getBuildingAtPosition(Point(20, 2)))
48+
player2.addBuilding(level.getBuildingAtPosition(Point(22, 2)))
49+
player2.addBuilding(level.getBuildingAtPosition(Point(20, 4)))
50+
player2.addBuilding(level.getBuildingAtPosition(Point(22, 4)))
51+
52+
player3 = level.addPlayer()
53+
player3.addBuilding(level.getBuildingAtPosition(Point(6, 22)))
54+
player3.addBuilding(level.getBuildingAtPosition(Point(8, 22)))
55+
player3.addBuilding(level.getBuildingAtPosition(Point(6, 24)))
56+
player3.addBuilding(level.getBuildingAtPosition(Point(8, 24)))
57+
58+
player4 = level.addPlayer()
59+
player4.addBuilding(level.getBuildingAtPosition(Point(24, 18)))
60+
player4.addBuilding(level.getBuildingAtPosition(Point(26, 18)))
61+
player4.addBuilding(level.getBuildingAtPosition(Point(24, 20)))
62+
player4.addBuilding(level.getBuildingAtPosition(Point(26, 20)))

run server.bat

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
TITLE AI Wars - Server
2+
13
CD source
24

3-
run_server.py localhost 7777 bean_island.py aiwars.py
5+
run_server.py localhost 7777 spring_lakes.py aiwars.py
46

57
PAUSE

run_ai_client.bat

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
TITLE AI Wars - AI client
2+
13
CD source
24

35
run_ai_client.py localhost 7777 "AIClient 1"

run_visualization.bat

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
TITLE AI Wars - Visualization observer
2+
13
CD source
24

35
run_visualization.py localhost 7777 "Observer 1"

source/visualization/gameScreen.py

+42-52
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66

77

88
class GameScreen:
9-
def __init__(self, game, imageCache):
9+
def __init__(self, game, imageCache, screenDimension):
1010
self.game = game
1111
self.imageCache = imageCache
12+
self.screenDimension = screenDimension
13+
14+
self.cameraMouseOffset = Point(0, 0)
15+
self.rightMouseButtonDown = False
16+
17+
self.drawGrid = True
1218

1319
self.camera = Point(0, 0)
1420

@@ -19,26 +25,32 @@ def __init__(self, game, imageCache):
1925
#
2026

2127
def onKeyDown(self, key):
22-
pass
28+
if key == ord('g'):
29+
self.drawGrid = not self.drawGrid
2330
#
2431

2532
def onKeyUp(self, key):
2633
pass
2734
#
2835

2936
def onMouseDown(self, button, position):
30-
#print 'down', button
31-
pass
37+
if button == 3: # Right mouse button, TODO: Look for pygame constants for this?
38+
self.cameraMouseOffset.x = self.camera.x - position[0]
39+
self.cameraMouseOffset.y = self.camera.y - position[1]
40+
self.rightMouseButtonDown = True
3241
#
3342

3443
def onMouseUp(self, button, position):
35-
#print 'up', button
36-
pass
44+
if button == 3:
45+
self.rightMouseButtonDown = False
3746
#
3847

3948
def onMouseMove(self, position):
40-
#print 'move', position
41-
pass
49+
if self.rightMouseButtonDown:
50+
self.camera.x = position[0] + self.cameraMouseOffset.x
51+
self.camera.y = position[1] + self.cameraMouseOffset.y
52+
53+
self.clampCameraToLevel()
4254
#
4355

4456
def update(self):
@@ -48,10 +60,29 @@ def update(self):
4860
def draw(self, screen):
4961
self.baseTilemap.draw(screen, self.camera)
5062
self.spriteCollection.draw(screen, self.camera)
51-
self.gridTilemap.draw(screen, self.camera)
63+
64+
if self.drawGrid:
65+
self.gridTilemap.draw(screen, self.camera)
5266
#
5367

5468

69+
def clampCameraToLevel(self):
70+
margin = 5
71+
72+
levelWidth = self.baseTilemap.width() * self.baseTilemap.getTileSize().x + margin
73+
levelHeight = self.baseTilemap.height() * self.baseTilemap.getTileSize().y + margin
74+
75+
if levelWidth <= self.screenDimension[0]:
76+
self.camera.x = (self.screenDimension[0] - levelWidth) / 2
77+
else:
78+
self.camera.x = min(margin, max(self.screenDimension[0] - levelWidth, self.camera.x))
79+
80+
if levelHeight <= self.screenDimension[1]:
81+
self.camera.y = (self.screenDimension[1] - levelHeight) / 2
82+
else:
83+
self.camera.y = min(margin, max(self.screenDimension[1] - levelHeight, self.camera.y))
84+
#
85+
5586
def updateLevel(self):
5687
self.baseTilemap = Tilemap()
5788
self.gridTilemap = Tilemap()
@@ -68,48 +99,7 @@ def updateLevel(self):
6899

69100
self.gridTilemap.addImage(self.imageCache.getImage('../textures/terrain/grid_lines.png'))
70101
self.gridTilemap.setSize(Point(self.game.level.width(), self.game.level.height()), 0)
102+
103+
self.clampCameraToLevel()
71104
#
72-
#
73-
74-
def matchPattern(pattern, images):
75-
matches = []
76-
for i in xrange(len(images)):
77-
for j in xrange(len(pattern)):
78-
if images[i][j] != None and images[i][j] != pattern[j]:
79-
break
80-
else:
81-
matches.append(i)
82-
if len(matches) == 0:
83-
return None
84-
85-
bestMatch = matches[0]
86-
bestMatchCount = images[bestMatch].count(None)
87-
for match in matches[1:]:
88-
matchCount = images[match].count(None)
89-
if matchCount < bestMatchCount:
90-
bestMatch = match
91-
bestMatchCount = matchCount
92-
return bestMatch
93-
#
94-
95-
def processLevel(level, images):
96-
# Create a border around the levels tilemap, to circumvent boundary checks
97-
tiles = level.terrain[:]
98-
for y in xrange(len(tiles)):
99-
tiles[y] = level.terrain[y][:]
100-
tiles[y].insert(0, tiles[y][0])
101-
tiles[y].append(tiles[y][-1])
102-
tiles.insert(0, tiles[0][:])
103-
tiles.append(tiles[-1][:])
104-
105-
# Do actual pattern matching
106-
for y in xrange(level.height()):
107-
for x in xrange(level.width()):
108-
pattern = []
109-
for oy in xrange(3):
110-
for ox in xrange(3):
111-
pattern.append(tiles[y + oy][x + ox])
112-
# Do pattern matching!
113-
print prints[matchPattern(pattern, images)],
114-
print ''
115105
#

source/visualization/main.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def __init__(self, host, port, name):
3030
self.gameDatabase = GameDatabase()
3131
self.game = Game(self.gameDatabase)
3232

33-
self.gameScreen = GameScreen(self.game, self.imageCache)
33+
self.gameScreen = GameScreen(self.game, self.imageCache, self.screenDimension)
3434
self.running = False
3535

3636
self.gameClient = GameClient()
@@ -78,6 +78,7 @@ def update(self):
7878
#
7979

8080
def draw(self, screen):
81+
screen.fill((255, 255, 255))
8182
self.gameScreen.draw(screen)
8283
pygame.display.flip()
8384
#

source/visualization/tilemap.py

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ def setTileSize(self, tileSize):
2727
self.tileSize = tileSize
2828
#
2929

30+
def getTileSize(self):
31+
return self.tileSize
32+
#
33+
3034
def setSize(self, size, fillIndex = -1):
3135
while self.height() < size.y:
3236
self.tiles.append([])

0 commit comments

Comments
 (0)