class NewBombObject(Entity): def __init__(self, pos, level): Entity.__init__(self, pos, level) self.sprite = SpriteFromFile('blast.png') self.sprite.transform(size=Vec2(SSize)) self.colletable = True def collect(self, player): player.maxbombs += 1 self.level.entities.remove(self) def render(self, screen): p = (self.pos + .5) * SSize self.sprite.draw(screen, p.floor(), center=True)
class Tile(): def __init__(self, info): info = info.split(',') self.name = info[0] self.sprite = SpriteFromFile(info[0] + '.png') self.sprite.transform(size=Vec2(ssize)) self.solid = True self.breakable = True for i in info[1:]: value = True if i.startswith('!'): value = False i = i[1:] if i == 'solid': self.solid = value if i == 'breakable': self.breakable = value def break_(self, x, y): return None def draw(self, screen, x, y): self.sprite.draw(screen, Vec2(x, y) * ssize, center=False)
class Game(Application): def __init__(self, mainMenu): Application.__init__(self, mainMenu, (0, 0)) self.gameStarted = False self.bg = SpriteFromFile('bg 6.jpg') self.bg.transform(size=self.bg.scale('fill', ScreenSize / 4)) self.stoneSpriteScheet = ShitFromFile('stones 1.png', 3, 2) self.width = ScreenWidth self.height = ScreenHeight self.level = Level(self) self.add(self.level) self.myColor = -1 self.whoesTurn = -1 self.gmenu = GameMenu(self, (0, 0, ScreenWidth, ScreenHeight)) self.add(self.gmenu) self.selectedStone = None self.pathStone = None self.path = [] self.serverClient = GameClient(mainMenu.serverClient, self) def update(self): if self.gameStarted: Entity.update(self) else: self.gmenu.update() def eventAction(self, event): if self.gameStarted: Entity.eventAction(self, event) else: self.gmenu.eventAction(event) def Render(self, screen, pos): for i in range(4): for j in range(4): self.bg.draw(screen, ScreenSize / 4 * Vec(i, j), center=False) for t in self.path: screen.circle(red, t.getPos(), t.space * 0.4) def EventAction(self, event): '''if (event.type == pygame.MOUSEBUTTONDOWN): if self.selectedStone != None: for stone in self.level.stones''' if (event.type == pygame.MOUSEBUTTONUP): if self.selectedStone != None: tile = self.level.getClosestTile(Vec(pygame.mouse.get_pos())) if tile != None: if self.path.__contains__(tile): self.selectedStone.setTile(tile) self.path = self.path[:self.path.index(tile) + 1] if self.level.legalMove( self.selectedStone.tile.cord, tile.cord, self.selectedStone != self.pathStone or len(self.path) <= 1): self.selectedStone.setTile(tile) self.path.append(tile) self.selectedStone.selected = False self.selectedStone = None if (event.type == pygame.KEYDOWN): if [K_RETURN, K_SPACE].__contains__(event.key): self.applyMove() def chooseColor(self, color): responce = self.serverClient.setColor(color) if responce.startswith('[0]'): self.myColor = color self.gmenu.nextColor(color) def nextColor(self, color): self.whoesTurn = color self.gmenu.nextColor(color) def selectStone(self, stone): # TODO: Is it my turn ... if stone != self.pathStone: if self.pathStone != None: self.pathStone.setTile(self.path[0]) self.pathStone = stone self.path = [stone.tile] if self.selectedStone != None: self.selectedStone.selected = False self.selectedStone = stone stone.selected = True def startGame(self): if not self.gameStarted: self.gameStarted = True self.gmenu.startGame() def applyMove(self): if self.pathStone == None or len(self.path) <= 1: return if self.myColor == self.whoesTurn: self.pathStone.tile = self.path[0] self.path[0].stone = self.pathStone print self.serverClient.move(self.path) self.pathStone = None self.path = [] self.whoesTurn = -1
class Bomb(Entity): def __init__(self, pos, parent): Entity.__init__(self, IVec(pos), parent.level) self.parent = parent self.lifetime = 2 * 60 self.firetime = 1 * 60 self.firing = False self.solid = True self.players = self.level.players[:] self.sprite = SpriteFromFile('bomb' + '.png') self.sprite.transform(size=Vec2(ssize)) self.blastsprite = SpriteFromFile('blast' + '.png') self.blastsprite.transform(size=Vec2(ssize)) self.sheet = ShitFromFile('bomb2.png', 2, 2) [s.transform(size=Vec2(ssize)) for s in self.sheet] self.sprite = self.sheet[0] self.level.entities.append(self) def update(self): self.lifetime -= 1 if self.lifetime == 0: self.fire() if self.lifetime < -self.firetime: self.parent.bombs.remove(self) self.level.entities.remove(self) del self return if self.firing: i = len(self.players) while i > 0: i -= 1 p = self.players[i] if self.blast.__contains__(IVec(p.pos) - self.pos): p.loseLife() self.players.pop(i) def fire(self): self.firing = True bx, by = self.pos.asTuple() self.blast = [] def apply(x, y): tile = self.level.getTile(Vec(bx + x, by + y)) if tile.breakable: self.blast.append(Vec(x, y)) self.level.breakTile(Vec(bx + x, by + y)) return tile.solid f = 0xf apply(0, 0) for i in range(1, 3): if f & 1 and apply(i, 0): f &= 14 #0xe if f & 2 and apply(-i, 0): f &= 13 #0xd if f & 4 and apply(0, i): f &= 11 #0xb if f & 8 and apply(0, -i): f &= 7 #0x7 def render(self, screen): if not self.firing: self.sprite.draw(screen, (self.pos + .5) * ssize) else: for b in self.blast: i = 1 if b[0] else 2 if b[1] else 3 self.sheet[i].draw(screen, (self.pos + b + .5) * ssize)
class Player(): def __init__(self, level, info, keys): self.level = level self.sprite = SpriteFromFile(info[0] + '.png') self.sprite.transform(size=Vec2(ssize) * .9) self.pos = Vec2(info[1:3]) + .5 self.keys = keys self.speed = 5 * 1 / 60. self.cooldown = 0 self.firerate = 2 # per secound self.colition = [-.4, .4, -.4, .4] self.name = info[0] self.lifes = 3 self.dead = False self.maxbombs = 1 self.bombs = [] def update(self): if self.dead: return keys = pygame.key.get_pressed() u = keys[self.keys['up']] d = keys[self.keys['down']] r = keys[self.keys['right']] l = keys[self.keys['left']] self.move(r - l, d - u) [b.update() for b in self.bombs] self.cooldown -= 1 if keys[self.keys['bomb']] and self.cooldown <= 0: if len(self.level.getTileEntity(self.pos)) <= 0: if len(self.bombs) < self.maxbombs: self.bombs.append(Bomb(self.pos, self)) self.cooldown = 60 / self.firerate def move(self, x, y): if x == 0 and y == 0: return xdes = Vec2(self.pos) ydes = Vec2(self.pos) xdes[0] += x * self.speed ydes[1] += y * self.speed if not self.colides(self.pos, xdes): self.pos[0] = xdes[0] if not self.colides(self.pos, ydes): self.pos[1] = ydes[1] for e in self.level.getTileEntity(self.pos): if (e.colletable): e.collect(self) def colides(self, current, dest): for i in range(4): x = self.colition[i % 2] y = self.colition[i / 2 + 1] if IVec(dest + Vec2(x, y)) == IVec(current + Vec2(x, y)): continue if self.level.getTile(dest + Vec2(x, y)).solid: return True for e in self.level.getTileEntity(dest + Vec2(x, y)): if e.solid: return True return False def render(self, screen, index): if self.dead: return [b.render(screen) for b in self.bombs] self.sprite.draw(screen, (self.pos) * ssize) def loseLife(self): self.lifes -= 1 self.dead = self.lifes <= 0