Example #1
0
    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)
Example #2
0
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)
Example #3
0
    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
Example #4
0
    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 = []
Example #5
0
    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)
Example #6
0
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)
Example #7
0
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
Example #8
0
 def __init__(self, pos, level):
     Entity.__init__(self, pos, level)
     self.sprite = SpriteFromFile('blast.png')
     self.sprite.transform(size=Vec2(SSize))
     self.colletable = True
Example #9
0
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)
Example #10
0
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