class Game: def __init__(self): print("Starting server...") # Init vars Global.is_server = True # Used for local client spawning # Initialise the database system Database.startup() # Create the dungeon self.dungeon = Dungeon() # Create the server interface self.server = Server(self.dungeon) # Create a client for the local player (for testing). self.do_shutdown = False #self.create_local_client() # Comment this out unless a test client is desired # Run the game loop self.game_loop() # Shut down the database Database.shutdown() """The main game loop. This updates the dungeons and all player events""" def game_loop(self): while not self.do_shutdown: # Update the game self.dungeon.update() time.sleep(0.1) self.dungeon.destroy() """Creates the local client for testing""" def create_local_client(self): # Start the client thread threading.Thread(target=self.local_client_thread, daemon=True).start() """Local client thread for testing""" def local_client_thread(self): # Create a local client! from ClientApp import ClientApp ClientApp() # Client has closed, shutdown self.do_shutdown = True
class Configuration: def __init__(self, filename): self.filename = filename with open(filename) as file: line = file.readline() dimL = line.split(" ") n = int(dimL[0]) m = int(dimL[1]) self.Dungeon = Dungeon(n, m) self.X = self.Dungeon.size_x self.Y = self.Dungeon.size_y self.start_position = self.Dungeon.start_position for i in range(n): line = file.readline() ElemL = line.split(" ") for j in range(m): elmnt = ElemL[j][:1] self.add_element(elmnt, i, j) self.Adventurer = Adventurer(self) def reset(self): with open(self.filename) as file: line = file.readline() dimL = line.split(" ") n = int(dimL[0]) m = int(dimL[1]) self.Dungeon = Dungeon(n, m) self.X = self.Dungeon.size_x self.Y = self.Dungeon.size_y self.start_position = self.Dungeon.start_position for i in range(n): line = file.readline() ElemL = line.split(" ") for j in range(m): elmnt = ElemL[j][:1] self.add_element(elmnt, i, j) self.Adventurer = Adventurer(self) def get_state(self): return (self.Adventurer.position, self.Adventurer.has_sword, self.Adventurer.has_key, self.Adventurer.has_treasure) state = property(fget=get_state) def get_adventurer_position(self): return self.Adventurer.position def move_adventurer_to_non_wall_cell(self): #L : list of non-wall cells L = self.Dungeon.list_of_non_wall_cells() self.Adventurer.position = L[random.randint(0, len(L) - 1)] self.Dungeon.update(self.Adventurer) return True def move_adventurer_to_neighbouring_cell(self): cell_x, cell_y = self.Adventurer.position #L : list of neighbouring cells L = self.Dungeon.list_of_neighbouring_cells(self.Adventurer.position) self.Adventurer.position = L[random.randint(0, len(L) - 1)] self.Dungeon.update(self.Adventurer) return True def add_element(self, type, i, j): if type == "B": self.Dungeon.grid[i][j] = B(self) elif type == "T": self.Dungeon.grid[i][j] = T(self) elif type == "R": self.Dungeon.grid[i][j] = R(self) elif type == "C": self.Dungeon.grid[i][j] = C(self) elif type == "S": self.Dungeon.grid[i][j] = S(self) elif type == "K": self.Dungeon.grid[i][j] = K(self) elif type == "E": self.Dungeon.grid[i][j] = E(self) elif type == "P": self.Dungeon.grid[i][j] = P(self) elif type == "-": self.Dungeon.grid[i][j] = MP(self) elif type == "W": self.Dungeon.grid[i][j] = W(self) else: exit(1000) def __str__(self): s = "" for i in range(self.X): for j in range(self.Y): if (i, j) != self.Adventurer.position: s += str(self.Dungeon.grid[i][j]) s += " " else: s += "* " s += "\n" s += "=" * (self.Y * 2) if self.Adventurer.has_sword: s += "S" if self.Adventurer.has_key: s += "K" if self.Adventurer.has_treasure: s += "T" s += "\n" return s def show(self): print(self)
class Game(object): def main(self, Surface): while True: Surface.fill((0, 0, 0)) dt = self.time self.mainClock.tick(30) for cell in self.tilemap.layers['triggers'].collide( self.player.collisionRect, 'Porta'): self.tilemap.StopSounds() self.Escroto.SaveTilemap(self.Location + '.tilemap', self.tilemap) if self.Location == 'Caverna' and cell[ 'Porta'] == 'Dungeon' or self.Location == 'Dungeon' and cell[ 'Porta'] == 'Caverna': play( pygame.mixer.Sound( resources.file_path('sfx_teleporte.ogg', 'Musica')), 1, self.musicPlaying) self.Location = cell['Porta'] NewSurface = pygame.Surface.copy(Surface) self.tilemap.draw(NewSurface) del self.tilemap if self.Location == 'Campo': self.tilemap = Campo(self.width, self.height, self) elif self.Location == 'Caverna': self.tilemap = Caverna(self.width, self.height, self) elif self.Location == 'Dungeon': self.tilemap = Dungeon(self.width, self.height, self) else: self.tilemap = SalaDoChefe(self.width, self.height, self) self.player.Reset( (cell['PlayerX'] - 16, cell['PlayerY'] - 28)) self.player.kill() self.player.add([self.tilemap.SpritesToChoose]) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) if self.Location != 'Sala do Mestre': self.tilemap.Reload( self, (cell['PlayerX'] - 16, cell['PlayerY'] - 28)) for sprite in np.array(self.tilemap.Holes): if self.player.collisionRect.colliderect(sprite.rect): sprite.kill() del sprite FadeOut(self, NewSurface, Surface) self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.Pause = True self.first = True if self.Master: self.Location = 'Dungeon' play(self.Sounds['Jóia'], 1, self.musicPlaying) NewSurface = pygame.Surface.copy(Surface) NewSurface.blit(self.tilemap.images['background'], ((self.width - WIDTH) // 2, 0)) self.tilemap.draw(NewSurface) del self.tilemap self.tilemap = Dungeon(self.width, self.height, self) self.tilemap.Reload(self, (664, 28)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) FadeOut(self, NewSurface, Surface) for sprite in self.tilemap.Holes: if self.player.collisionRect.colliderect(sprite.rect): sprite.kill() del sprite self.Pause = True self.first = True bloqueio = Pilastra( self.tilemap.images['bloqueio'], 'bloqueio', (656, 12), (self.tilemap.SpritesToChoose, self.tilemap.Pilastras)) for cell in self.tilemap.layers['triggers'].collide( bloqueio.rect, 'block'): if 'a' in cell['block']: cell['block'] = 'ftlrb' for event in pygame.event.get(): BASIC_GAME_Events(self, event, Surface) if event.type == KEYDOWN: if event.key == K_ESCAPE: play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Pause: if self.menu: if self.Menu.name == 'Escroto': self.menu = False self.Pause = False self.tilemap.UnpauseSounds() else: self.Menu = self.Escroto else: if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking ) or self.Location != 'Campo': self.Pause = True self.menu = True self.Menu = self.Escroto self.tilemap.PauseSounds() if event.key == K_RETURN: #Menu de Gente Grande play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Pause: if self.menu: if self.Menu.name == 'ItemMenu': if self.Menu.menu == 'Ferramenta': for key in self.Menu.Itens: if self.Menu.Itens[key][ 'Coluna'] == self.Menu.selected[ 0] and self.Menu.Itens[key][ 'Linha'] == self.Menu.selected[ 1]: self.Menu.Itens[ self.Menu. using]['Usando'] = False self.Menu.Itens[key][ 'Usando'] = True self.Menu.using = key self.player.item = key self.Pause = False self.menu = False self.tilemap.UnpauseSounds() else: self.Menu = self.ItemMenu else: if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking ) or self.Location != 'Campo': self.Pause = True self.menu = True self.Menu = self.ItemMenu self.tilemap.PauseSounds() if event.key == K_a: if not self.Pause: self.tilemap.EventGet(self) else: if self.Menu.name == 'Escroto': play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Menu.selected == 0 or self.Menu.selected == 4 or self.Menu.selected == 5: self.Menu.selected = 0 self.Menu.Max = 2 self.Menu.Min = 0 self.menu = False self.Pause = False self.tilemap.UnpauseSounds() elif self.Menu.selected == 1 and self.Location != 'Sala do Mestre': self.Menu.selected = 3 self.Menu.salvando = True elif self.Menu.selected == 2: self.Menu.selected = 5 self.Menu.Max = 6 self.Menu.Min = 5 elif self.Menu.selected == 6: terminate() if event.key == K_s and not self.player.atking and not self.Pause: tileX = testX1 = (self.player.collisionRect.centerx // 16) * 16 tileY = testY1 = (self.player.collisionRect.centery // 12) * 12 if self.player.direction == 0: testY1 += 12 elif self.player.direction == 2: testY1 -= 12 elif self.player.direction == 3: testX1 -= 16 else: testX1 += 16 colide = False for enemie in self.tilemap.Enemies: if pygame.rect.Rect(testX1, testY1, 16, 12).colliderect( enemie.collisionRect): colide = True break if not colide: if self.player.item == 'Pá': self.player.spritesheet = self.player.PaSheet self.player.number_of_sprite = 0 self.player.cont = 0 self.player.image = self.player.spritesheet[ self.player.direction][ self.player.number_of_sprite] self.player.digging = True self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 self.player.rect = pygame.rect.Rect( self.player.rect.left - 16, self.player.rect.top - 20, 48, 44) for hole in self.tilemap.Holes: if pygame.rect.Rect(testX1, testY1, 16, 12).colliderect(hole.rect): colide = True break if self.player.item == 'Bomba' and len( self.tilemap.Bombas) == 0 and not colide: if len(self.tilemap.Bombas) == 0: play(self.Sounds['Bomba'], 1, self.musicPlaying) if len(self.tilemap.layers['triggers']. collide( pygame.rect.Rect( testX1 + 7, testY1 + 5, 1, 1), 'block')) == 0: Pilastra( self.images['Bomba'], 'Bomba', (testX1, testY1), (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 else: Pilastra( self.images['Bomba'], 'Bomba', (tileX, tileY), (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) self.player.collisionRect.centerx = tileX + ( tileX - testX1) + 8 self.player.collisionRect.centery = tileY + ( tileY - testY1) + 6 if self.player.item == 'Martelo': self.player.spritesheet = self.player.MarteloSheet self.player.number_of_sprite = 0 self.player.cont = 0 self.player.image = self.player.spritesheet[ self.player.direction][ self.player.number_of_sprite] self.player.martelando = True self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 if self.menu: play(self.Sounds['MenuMove'], 1, self.musicPlaying) if self.Menu.name == 'ItemMenu': if event.key == K_UP: self.Menu.selected[1] -= 1 if event.key == K_DOWN: self.Menu.selected[1] += 1 if event.key == K_LEFT: self.Menu.selected[0] -= 1 if event.key == K_RIGHT: self.Menu.selected[0] += 1 else: if event.key == K_UP: if self.Menu.selected < self.Menu.Max + 1: self.Menu.selected -= 1 if event.key == K_DOWN: if self.Menu.selected < self.Menu.Max + 1: self.Menu.selected += 1 #if self.selected == 3: #self.selected = 0 self.tilemap.Actions(self) if self.first: if self.Location == 'Sala do Mestre': NewSurface.fill((0, 0, 0)) NewSurface.blit(self.tilemap.images['background'], (((self.width - WIDTH) // 2, 0))) self.tilemap.draw(NewSurface) FadeIn(self, NewSurface, Surface) del NewSurface self.first = False self.second = True if self.Master: self.Master = False self.Escroto.SaveGame(self, 'CheckPoint.save', 0, 2, 0) elif self.second: self.Pause = False self.second = False if self.musicPlaying: self.tilemap.InicializeSounds() if self.Location == 'Sala do Mestre': pygame.mixer.Sound( resources.file_path('sfx_mestre_intro.ogg', 'Musica')).play(0) if not self.Pause: self.tilemap.update(dt, self) if self.Location == 'Sala do Mestre': Surface.fill((0, 0, 0)) Surface.blit(self.tilemap.images['background'], ((self.width - WIDTH) // 2, 0)) self.tilemap.draw(Surface) if self.menu: self.Menu.update(dt, self) if self.menu: self.Menu.draw(self, Surface) else: BlitLife(Surface, self, self.Heart, self.images['Stamina'], self.tools[0][self.choosed[self.player.item]]) if self.PegouJóia: play(self.Sounds['Jóia'], 1, self.musicPlaying) self.Escroto.SaveGame(self, 'CheckPoint.save', 0, 2, 0) self.PegouJóia = False TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update() if self.Location == 'Campo': self.tilemap.SetSound(self) for npc in self.tilemap.NPCs: if npc.talking: self.tilemap.PauseEspecial() npc.display(Surface, self) if self.player.vida <= 0: self.tilemap.StopSounds() self.Died(Surface) elif 0 < self.player.vida <= 2: if self.musicPlaying: if self.Sounds['Morrendo'].get_num_channels() == 0: self.Sounds['Morrendo'].play(-1) else: if self.Sounds['Morrendo'].get_num_channels() > 0: self.Sounds['Morrendo'].stop() def ResizeScreen(self, newWidth, newHeight): """ Função que faz o resize da jogo de forma que o jogo seja compátivel com qualquer modo de tela entre 4:3 e 16:9 """ #precisamos primeiro calcular o tamanho da imagem que será disponibilizada no novo #tamanho de tela #Formato 16:9 ou 4:3 #Usaremos a altura como padrão Hfator_widscreen = newHeight / 9 Hfator_oldscreen = newHeight / 3 #Teste, tela 200/120 MAXW_widscreen = 16 * Hfator_widscreen #213,33333 MAXW_oldscreen = 4 * Hfator_oldscreen #160 if newWidth > MAXW_widscreen: self.width = self.tilemap.view_w = round(16 * HEIGHT / 9) elif newWidth <= MAXW_widscreen and newWidth >= MAXW_oldscreen: #Se isso for verdade devemos modificar o tamanho e posição #de algumas sprites do jogo #Antes, vamos calcular o novo tamanho de tela no tilemap self.width = round(newWidth / (newHeight / HEIGHT)) self.tilemap.view_w = self.width else: self.width = WIDTH self.tilemap.view_w = WIDTH self.rect = pygame.rect.Rect((0, 0), (self.width, self.height)) self.tilemap.viewport = Rect((0, 0), (self.width, self.height)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True) self.ModificaTamanho() def ModificaTamanho(self): #Vamos centralizar as posições dos menus for key in self.ItemMenu.Itens: self.ItemMenu.Itens[key]['Posição'][0] = self.ItemMenu.Itens[key][ 'Posição Inicial'] + (self.width - WIDTH) // 2 self.Escroto.x = (self.width - WIDTH) // 2 #Vamos agora ampliar algumas as imagens transparentes self.InvisivelCima = pygame.transform.scale( self.InvisivelCima, (self.width, self.InvisivelCima.get_height())) self.ItemMenu.escuro = pygame.transform.scale( self.ItemMenu.escuro, (self.width, self.ItemMenu.escuro.get_height())) self.rect = pygame.rect.Rect((0, 0), (self.width, self.height)) self.tilemap.viewport = Rect((0, 0), (self.width, self.height)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True) def CreateGame(self, music): self.mainClock = pygame.time.Clock() self.FPS = 30 self.musicPlaying = music self.Pause = False self.menu = False self.Menu = None self.Master = False self.width = WIDTH self.height = HEIGHT self.rect = pygame.rect.Rect(0, 0, self.width, self.height) self.first = self.second = False self.time = 0.033 self.menuHeart = load_sheet('menu_pause_coracao.png', 'Menus', 9, 8) self.Heart = load_sheet('menu_hud_coracao.png', 'Imagens', 9, 8) self.InvisivelCima = pygame.image.load( resources.file_path('menu_hud_escuro.png', 'Imagens')).convert_alpha() self.tools = load_sheet('menu_hud_ferramenta.png', 'Imagens', 26, 8) self.images = { 'Player': { 'MoveSheet': load_sheet('spr_pla_andando.png', 'Imagens', 48, 60), 'AtkSheet': load_sheet('spr_pla_ataque.png', 'Imagens', 48, 60), 'StopSheet': load_sheet('spr_pla_parado.png', 'Imagens', 48, 60) }, 'EnemyDeath': load_sheet('spr_obj_inimigomorto.png', 'Imagens', 16, 20), 'Sword': load_sheet('spr_pla_espada.png', 'Imagens', 48, 60), 'Hole': pygame.image.load( resources.file_path('spr_obj_buraco.png', 'Imagens')).convert_alpha(), 'Rachadura': pygame.image.load( resources.file_path('spr_obj_rachadura.png', 'Imagens')).convert_alpha(), 'Bomba': load_sheet('spr_obj_bomba.png', 'Imagens', 16, 12), 'Explosion': load_sheet('spr_obj_explosao.png', 'Imagens', 48, 36), 'Stamina': pygame.image.load( resources.file_path('menu_hud_stamina.png', 'Imagens')).convert_alpha(), 'StaminaMenu': pygame.image.load( resources.file_path('menu_pause_stamina.png', 'Menus')).convert_alpha(), 'Coracao': pygame.image.load( resources.file_path('spr_obj_coracao.png', 'Imagens')).convert_alpha(), 'FalaEscuro': pygame.transform.scale(self.InvisivelCima, (178, 36)).convert_alpha() } self.Sounds = { 'Espada': { 'Swing': pygame.mixer.Sound( resources.file_path('sfx_espada.ogg', 'Musica')), 'Parede': pygame.mixer.Sound( resources.file_path('sfx_wallhit.ogg', 'Musica')), 'Acertou': pygame.mixer.Sound( resources.file_path('sfx_acertando.ogg', 'Musica')) }, 'Bomba': pygame.mixer.Sound(resources.file_path('sfx_bomba.ogg', 'Musica')), 'Moshiro': 'ost_moshiro.ogg', 'Cavando': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')), 'MenuSelect': pygame.mixer.Sound( resources.file_path('sfx_menu_select.ogg', 'Musica')), 'MenuMove': pygame.mixer.Sound( resources.file_path('sfx_menu_move.ogg', 'Musica')), 'Jóia': pygame.mixer.Sound(resources.file_path('sfx_joia.ogg', 'Musica')), 'Morrendo': pygame.mixer.Sound( resources.file_path('sfx_morrendo.ogg', 'Musica')), 'Martelo': pygame.mixer.Sound(resources.file_path('sfx_martelo.ogg', 'Musica')), 'Buraco': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')), 'Coração': pygame.mixer.Sound(resources.file_path('sfx_heart.ogg', 'Musica')) } self.choosed = {'Pá': 0, 'Martelo': 1, 'Bomba': 2} self.ItemMenu = ItemMenu() self.Escroto = Escroto() self.Campo = Campo(self.width, self.height, self) self.Dungeon = Dungeon(self.width, self.height, self) self.Caverna = Caverna(self.width, self.height, self) self.player = Player( self.images['Player'], (self.Campo.start_cell.px - 16, self.Campo.start_cell.py - 28), [self.Campo.SpritesToChoose]) self.Location = 'Campo' self.tilemap = self.Campo self.Delivered = 0 self.PegouJóia = False #Vampos criar os canais onde os efeitos sonoros devem ser colocados def NewGame(self, Surface, music): self.CreateGame(music) if self.musicPlaying: self.tilemap.InicializeSounds() self.tilemap.SetSound(self) self.Pause = True dt = self.time self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.tilemap.update(dt, self) self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[ self.tilemap.Lisa.AllDirection['Up']][ self.tilemap.Lisa.number_of_sprite] self.tilemap.Moshiro.display(Surface, self, False) self.tilemap.Moshiro.MoshiroAndando(Surface, self) self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[ self.tilemap.Lisa.AllDirection['Left']][ self.tilemap.Lisa.number_of_sprite] self.tilemap.Lisa.display(Surface, self, False) self.Pause = False self.SaveTilemaps() self.Escroto.SaveGame(self, 'CheckPoint.save', 0, 2, 0) self.main(Surface) def LoadGame(self, Surface, music, Things_To_Dump, died=False): self.CreateGame(music) self.Location = Things_To_Dump[0] if self.Location == 'Campo': self.tilemap = self.Campo elif self.Location == 'Dungeon': self.tilemap = self.Dungeon else: self.tilemap = self.Caverna self.player.kill() self.player.add([self.tilemap.SpritesToChoose]) #Agora vamos atualizar as informações do tilemap onde o player se encontra #Primeiro as informações do Player self.player.direction = Things_To_Dump[2][0] self.player.number_of_sprite = Things_To_Dump[2][1] self.player.collisionRect = Things_To_Dump[2][2] self.player.placedPositions = Things_To_Dump[2][3] self.player.Justdied = Things_To_Dump[2][4] self.player.vida = Things_To_Dump[2][5] self.player.vx = Things_To_Dump[2][6] self.player.vy = Things_To_Dump[2][7] self.player.cooldown = Things_To_Dump[2][8] self.player.imunity = Things_To_Dump[2][9] self.player.alive = Things_To_Dump[2][10] self.player.atking = Things_To_Dump[2][11] self.player.digging = Things_To_Dump[2][12] self.player.digged = Things_To_Dump[2][13] self.player.first_pressed = Things_To_Dump[2][14] self.player.pressed = Things_To_Dump[2][15] self.player.cont = Things_To_Dump[2][16] self.player.cont2 = Things_To_Dump[2][17] self.player.numbX = Things_To_Dump[2][18] self.player.numbY = Things_To_Dump[2][19] self.player.item = Things_To_Dump[2][20] self.player.Undelivered = Things_To_Dump[2][21] if self.player.atking: self.player.spritesheet = self.player.atkSheet elif self.player.digging: self.player.spritesheet = self.player.PaSheet elif self.player.vx != 0 or self.player.vy != 0: self.player.spritesheet = self.player.MoveSheet else: self.player.spritesheet = self.player.StopSheet #Construimos as Espadas do jogo for SwordInfo in Things_To_Dump[3]: sword = Sword(self.images['Sword'], (self.player.rect.x - 16, self.player.rect.y - 20), 'Sword', self.player.direction, (self.tilemap.SpritesToChoose, self.tilemap.Swords)) sword.number_of_sprite = SwordInfo[0] sword.image = sword.spritesheet[sword.direction][ sword.number_of_sprite] sword.cont = SwordInfo[1] sword.rect = SwordInfo[2] #Construimos os inimigos do jogo for EnemieInfo in Things_To_Dump[4]: if 'Lesma' == EnemieInfo[0]: inimigo = Lesma( self.tilemap.images['Lesma'], (0, 0), 'Lesma', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Bitch' == EnemieInfo[0]: inimigo = Bitch( self.tilemap.images['Bitch'], (0, 0), 'Bitch', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Planta' == EnemieInfo[0]: inimigo = Planta( self.tilemap.images['Planta'], (0, 0), 'Planta', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Sniper' == EnemieInfo[0]: inimigo = Sniper( self.tilemap.images['Sniper'], (0, 0), 'Sniper', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) else: inimigo = Zumbi( self.tilemap.images['Zumbi'], (0, 0), 'Zumbi', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) inimigo.burn = EnemieInfo[1] inimigo.collisionRect = EnemieInfo[2] inimigo.direction = EnemieInfo[3] inimigo.number_of_sprite = EnemieInfo[4] inimigo.vida = EnemieInfo[5] inimigo.cooldown = EnemieInfo[6] inimigo.Max = EnemieInfo[7] inimigo.vy = EnemieInfo[8] inimigo.vx = EnemieInfo[9] inimigo.alive = EnemieInfo[10] inimigo.cont = EnemieInfo[11] inimigo.numbX = EnemieInfo[12] inimigo.numbY = EnemieInfo[13] inimigo.atking = EnemieInfo[14] inimigo.originalPosition = EnemieInfo[15] if not inimigo.alive: if inimigo.burn: inimigo.image = inimigo.cinzas else: inimigo.image = inimigo.deadImage #Construcao de Bombas for BombaInfo in Things_To_Dump[5]: Bomba = Pilastra( self.images['Bomba'], 'Bomba', (0, 0), (self.tilemap.SpritesToChoose, self.tilemap.Bombas)) Bomba.cont = BombaInfo[0] Bomba.number_of_sprite = BombaInfo[1] Bomba.rect = BombaInfo[2] #Construcao de Explosoes for ExploInfo in Things_To_Dump[6]: Explosion = Explosion( self.images['Explosion'], (0, 0), 'Explosion', 0, (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) Explosion.cont = ExploInfo[0] Explosion.number_of_sprite = ExploInfo[1] Explosion.rect = ExploInfo[2] #Contrucao de Animacoes for AniInfo in Things_To_Dump[7]: Animation = DeathAnimation(self.images[AniInfo[0]], (0, 0), AniInfo[0], [self.tilemap.SpritesToChoose]) Animation.rect = AniInfo[1] Animation.image = AniInfo[2] Animation.number_of_sprite = AniInfo[3] Animation.cont = AniInfo[4] #Construcao de Atks for ATKinfo in Things_To_Dump[8]: if ATKinfo[0] == 'AtkZumbi': ATK = ZumbiAtk(self.tilemap.images['Zumbi']['Atk'], (0, 0), ATKinfo[4], ATKinfo[0], [self.tilemap.SpritesToChoose], [ enemy for enemy in self.tilemap.Enemies if enemy.nome == 'Zumbi' ][0]) else: if 'Sniper' in ATKinfo[0]: ATK = Atk(self.tilemap.images['Sniper']['Atk'], (0, 0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose]) else: ATK = Atk(self.tilemap.images['Planta']['Atk'], (0, 0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose]) ATK.number_of_sprite = ATKinfo[2] ATK.alive = ATKinfo[3] ATK.rect = ATKinfo[5] ATK.Max = ATKinfo[6] ATK.cont = ATKinfo[7] #Colocando o menu de Itens self.ItemMenu.Itens = Things_To_Dump[9].Itens self.ItemMenu.selected = Things_To_Dump[9].selected self.ItemMenu.using = Things_To_Dump[9].using self.ItemMenu.menu = Things_To_Dump[9].menu self.ItemMenu.Fala = Things_To_Dump[9].Fala self.Campo.AdjustTileHoleAndRachadura(Things_To_Dump[1][0], self) self.Campo.AdjustJewels(Things_To_Dump[1][0], self) self.Caverna.AdjustTileHoleAndRachadura(Things_To_Dump[1][1], self) self.Caverna.AdjustJewels(Things_To_Dump[1][1], self) self.Dungeon.AdjustTileHoleAndRachadura(Things_To_Dump[1][2], self) self.Dungeon.AdjustJewels(Things_To_Dump[1][2], self) #Verificamos o numero de joias devolvidas self.Delivered = Things_To_Dump[10] #E por ultimo vemos se ja dialogamos com o sr moshiro ou nao self.Campo.Moshiro.first = Things_To_Dump[11] self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) if not died: self.Escroto.SaveGame(self, 'CheckPoint.save', 0, 2, 0) if self.musicPlaying: self.tilemap.InicializeSounds() self.tilemap.SetSound(self) self.SaveTilemaps() #self.ItemMenu.Itens['Safira']['Possui'] = True #self.ItemMenu.Itens['Safira']['Delivered'] = True #self.Delivered += 1 self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.main(Surface) def SaveTilemaps(self): self.Escroto.SaveTilemap('Campo.tilemap', self.Campo) self.Escroto.SaveTilemap('Caverna.tilemap', self.Caverna) self.Escroto.SaveTilemap('Dungeon.tilemap', self.Dungeon) del self.Campo del self.Caverna del self.Dungeon def winGame(self, Surface): #self.tilemap.Moshiro.display(Surface, self, music = False) pygame.mixer.music.load( resources.file_path('ost_moshiro_presto.ogg', 'Musica')) pygame.mixer.music.play(-1, 0.0) if self.player.collisionRect.x != 448 or self.player.collisionRect.y != 144: self.MovePlayer(Surface) self.tilemap.Moshiro.moshiroAndandoFinal(Surface, self) self.player.image = self.player.StopSheet[2][0] self.tilemap.Moshiro.display(Surface, self, False, False) for pilastra in self.tilemap.Pilastras: if pilastra.nome == 'RuinaFinal': pilastra.number_of_sprite = 1 pilastra.image = pilastra.spritesheet[0][ pilastra.number_of_sprite] contador = 0 limite = 2 self.tilemap.StopSounds() pygame.mixer.music.load(resources.file_path('ost_ending.ogg', 'Musica')) pygame.mixer.music.play(0, 0.0) while contador < limite: contador += self.mainClock.tick(30) / 1000 for event in pygame.event.get(): QUIT_Event(event) Surface = VIDEORESIZE_Event(self, event, Surface) self.tilemap.draw(Surface) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() #Fade para o Branco NewSurface = pygame.Surface.copy(Surface) NewSurface.fill((255, 255, 255)) FadeIn(self, NewSurface, Surface) selected = 0 self.images['Ending'] = load_sheet('menu_final.png', 'Menus', MAXWIDTH, HEIGHT) while True: for event in pygame.event.get(): if event.type == QUIT: terminate() if event.type == KEYUP: if event.key == ord('m'): if self.musicPlaying: pygame.mixer.music.stop() else: pygame.mixer.music.play(-1, 0.0) self.musicPlaying = not self.musicPlaying if event.type == KEYDOWN: if event.key == K_a: if selected < len(self.images['Ending'][0]) - 1: selected += 1 else: terminate() Surface = VIDEORESIZE_Event(self, event, Surface) Surface.blit(self.images['Ending'][0][selected], (-(MAXWIDTH - self.width) // 2, 0)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() self.mainClock.tick(self.FPS) def MovePlayer(self, Surface): #É preciso calcular a tragetória do player para que ele fique de frente para #o sr moshiro (432, 144) 432 + 16 = 448 posY = self.tilemap.Moshiro.collisionRect.bottom posX = self.tilemap.Moshiro.collisionRect.right tileX = (self.player.collisionRect.centerx // 16) tileY = (self.player.collisionRect.centery // 12) distY = posY - self.player.collisionRect.bottom #Temos que olhar para posição do retângulo do player como um todo #Caso o player esteja na linha dos tilesY 11 precisamos ver se #o fundo dele nao encosta na tile block if tileY == 11: #Caso o player esteja na linha dos tilesY 11 precisamos ver se #o fundo dele nao encosta na tile block if self.player.collisionRect.bottom > 144: self.player.AndaAutomatico(2, (self.player.collisionRect.x, 144), self, Surface) elif tileY == 12: #Caso o player esteja na linha de tilesY 12 ele precisa se deslocar para cima #ou para baixo dependendo do valor da distância em y if self.player.collisionRect.x < posX: if distY <= 0: self.player.AndaAutomatico( 0, (self.player.collisionRect.x, posY + 12), self, Surface) else: self.player.AndaAutomatico( 2, (self.player.collisionRect.x, posY - 12), self, Surface) else: #Neste último caso ele só pode estar na linha de 13 e logo devemos ver se o topo dele nao bate no block if self.player.collisionRect.bottom < posY + 12 and self.player.collisionRect.x < posX: self.player.AndaAutomatico( 0, (self.player.collisionRect.x, posY + 12), self, Surface) #Em seguida é preciso fazer o player se mover horizontalmente self.player.AndaAutomatico(1, (posX, self.player.collisionRect.bottom), self, Surface) #E por fim move-lo verticalmente novamente distY = posY - self.player.collisionRect.bottom if distY > 0: self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY), self, Surface) else: self.player.AndaAutomatico(2, (self.player.collisionRect.x, posY), self, Surface) def Died(self, Surface): #Leva o player girando para o centro da Tela if self.musicPlaying: pygame.mixer.Sound( resources.file_path('ost_gameover.ogg', 'Musica')).play() cont = 0 dt = self.time self.mainClock.tick(30) girando = load_sheet('spr_pla_olhosfechados.png', 'Imagens', 48, 60) caindo = load_sheet('spr_pla_morto.png', 'Imagens', 48, 60) sr_moshiro = load_sheet('menu_gameover_moshiro.png', 'Menus', MAXWIDTH, HEIGHT) menu = load_sheet('menu_gameover.png', 'Menus', WIDTH, HEIGHT) numero_da_imagem = 0 Max = len(girando) self.ResizeScreen(Surface.get_width(), Surface.get_height()) #Começa a mostrar a animação do player girando while cont < 2: dt = 2 * self.time self.mainClock.tick(self.FPS // 2) imagem = girando[numero_da_imagem][0] numero_da_imagem += 1 if numero_da_imagem == Max: numero_da_imagem = 0 Surface.fill((0, 0, 0)) Surface.blit(imagem, (56 + +(self.width - WIDTH) // 2, 34)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() cont += dt #Passa a Fazer o player cai numero_da_imagem = 0 Max = len(caindo[0]) while numero_da_imagem != Max: dt = 4 * self.time self.mainClock.tick(self.FPS // 4) imagem = caindo[0][numero_da_imagem] numero_da_imagem += 1 Surface.fill((0, 0, 0)) Surface.blit(imagem, (56 + (self.width - WIDTH) // 2, 34)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update() pygame.time.wait(1000) #Fade para o Branco NewSurface = pygame.Surface.copy(Surface) NewSurface.fill((255, 255, 255)) FadeIn(self, NewSurface, Surface) #Sr.Moshiro Falando texto = "Estou decepcionado com você" font = pygame.font.SysFont("Calibri", 14) display = TextHandler( texto, pygame.rect.Rect(20, 85, 123, 35), Surface, self, font, [[ sr_moshiro, [-(MAXWIDTH - self.width) // 2, 0], 0, 3 * self.time, 0 ], [ pygame.transform.scale(self.images['FalaEscuro'], (214, 36)).convert_alpha(), (0, 84) ]], life=False) del display #Colocando o Menu de Escolha Choose = False self.selected = 0 while not Choose: for event in pygame.event.get(): if event.type == QUIT: terminate() if event.type == KEYDOWN: if event.key == K_DOWN: self.selected += 1 if event.key == K_UP: self.selected -= 1 if event.key == K_a: if self.selected == 0: Archive = open('CheckPoint.save', 'rb') Things_to_Dump = pickle.load(Archive) self.LoadGame(Surface, self.musicPlaying, Things_to_Dump, died=True) else: terminate() if self.selected > 1: self.selected = 0 if self.selected < 0: self.selected = 1 Surface.fill((0, 0, 0)) Surface.blit(menu[0][self.selected], ((self.width - WIDTH) // 2, 0)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update()
class Game(object): def main (self, Surface): while True: Surface.fill((0,0,0)) dt = self.time self.mainClock.tick(30) for cell in self.tilemap.layers['triggers'].collide(self.player.collisionRect, 'Porta'): self.tilemap.StopSounds() self.Escroto.SaveTilemap(self.Location+'.tilemap', self.tilemap) if self.Location == 'Caverna' and cell['Porta'] == 'Dungeon' or self.Location == 'Dungeon' and cell['Porta'] == 'Caverna': play(pygame.mixer.Sound(resources.file_path('sfx_teleporte.ogg', 'Musica')), 1, self.musicPlaying) self.Location = cell['Porta'] NewSurface = pygame.Surface.copy(Surface) self.tilemap.draw(NewSurface) del self.tilemap if self.Location == 'Campo': self.tilemap = Campo(self.width, self.height, self) elif self.Location == 'Caverna': self.tilemap = Caverna(self.width, self.height, self) elif self.Location == 'Dungeon': self.tilemap = Dungeon(self.width, self.height, self) else: self.tilemap = SalaDoChefe(self.width, self.height, self) self.player.Reset((cell['PlayerX'] - 16, cell['PlayerY']-28)) self.player.kill() self.player.add([self.tilemap.SpritesToChoose]) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) if self.Location != 'Sala do Mestre': self.tilemap.Reload(self, (cell['PlayerX']-16, cell['PlayerY']-28)) for sprite in np.array(self.tilemap.Holes): if self.player.collisionRect.colliderect(sprite.rect): sprite.kill() del sprite FadeOut(self, NewSurface, Surface) self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.Pause = True self.first = True if self.Master: self.Location = 'Dungeon' play(self.Sounds['Jóia'], 1, self.musicPlaying) NewSurface = pygame.Surface.copy(Surface) NewSurface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0)) self.tilemap.draw(NewSurface) del self.tilemap self.tilemap = Dungeon(self.width, self.height, self) self.tilemap.Reload(self, (664, 28)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) FadeOut(self,NewSurface, Surface) for sprite in self.tilemap.Holes: if self.player.collisionRect.colliderect(sprite.rect): sprite.kill() del sprite self.Pause = True self.first = True bloqueio = Pilastra(self.tilemap.images['bloqueio'], 'bloqueio', (656, 12), (self.tilemap.SpritesToChoose, self.tilemap.Pilastras)) for cell in self.tilemap.layers['triggers'].collide(bloqueio.rect, 'block'): if 'a' in cell['block']: cell['block'] = 'ftlrb' for event in pygame.event.get(): BASIC_GAME_Events(self, event, Surface) if event.type == KEYDOWN: if event.key == K_ESCAPE: play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Pause: if self.menu: if self.Menu.name == 'Escroto': self.menu = False self.Pause = False self.tilemap.UnpauseSounds() else: self.Menu = self.Escroto else: if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': self.Pause = True self.menu = True self.Menu = self.Escroto self.tilemap.PauseSounds() if event.key == K_RETURN: #Menu de Gente Grande play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Pause: if self.menu: if self.Menu.name == 'ItemMenu': if self.Menu.menu == 'Ferramenta': for key in self.Menu.Itens: if self.Menu.Itens[key]['Coluna'] == self.Menu.selected[0] and self.Menu.Itens[key]['Linha'] == self.Menu.selected[1]: self.Menu.Itens[self.Menu.using]['Usando'] = False self.Menu.Itens[key]['Usando'] = True self.Menu.using = key self.player.item = key self.Pause = False self.menu = False self.tilemap.UnpauseSounds() else: self.Menu = self.ItemMenu else: if (self.Location == 'Campo' and not self.tilemap.Moshiro.talking and not self.tilemap.Lisa.talking) or self.Location != 'Campo': self.Pause = True self.menu = True self.Menu = self.ItemMenu self.tilemap.PauseSounds() if event.key == K_a: if not self.Pause: self.tilemap.EventGet(self) else: if self.Menu.name == 'Escroto': play(self.Sounds['MenuSelect'], 1, self.musicPlaying) if self.Menu.selected == 0 or self.Menu.selected == 4 or self.Menu.selected == 5: self.Menu.selected = 0 self.Menu.Max = 2 self.Menu.Min = 0 self.menu = False self.Pause = False self.tilemap.UnpauseSounds() elif self.Menu.selected == 1 and self.Location != 'Sala do Mestre': self.Menu.selected = 3 self.Menu.salvando = True elif self.Menu.selected == 2: self.Menu.selected = 5 self.Menu.Max = 6 self.Menu.Min = 5 elif self.Menu.selected == 6: terminate() if event.key == K_s and not self.player.atking and not self.Pause: tileX = testX1 = (self.player.collisionRect.centerx // 16)*16 tileY = testY1 = (self.player.collisionRect.centery // 12)*12 if self.player.direction == 0: testY1 += 12 elif self.player.direction == 2: testY1 -= 12 elif self.player.direction == 3: testX1 -= 16 else: testX1 += 16 colide = False for enemie in self.tilemap.Enemies: if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(enemie.collisionRect): colide = True break if not colide: if self.player.item == 'Pá': self.player.spritesheet = self.player.PaSheet self.player.number_of_sprite = 0 self.player.cont = 0 self.player.image = self.player.spritesheet[self.player.direction ][self.player.number_of_sprite] self.player.digging = True self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 self.player.rect = pygame.rect.Rect(self.player.rect.left - 16, self.player.rect.top - 20, 48, 44) for hole in self.tilemap.Holes: if pygame.rect.Rect(testX1, testY1, 16,12).colliderect(hole.rect): colide = True break if self.player.item == 'Bomba' and len(self.tilemap.Bombas) == 0 and not colide: if len(self.tilemap.Bombas) == 0: play(self.Sounds['Bomba'], 1, self.musicPlaying) if len(self.tilemap.layers['triggers'].collide(pygame.rect.Rect(testX1 + 7, testY1 + 5, 1,1), 'block')) == 0: Pilastra(self.images['Bomba'], 'Bomba', (testX1, testY1), (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 else: Pilastra(self.images['Bomba'], 'Bomba', (tileX, tileY), (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) self.player.collisionRect.centerx = tileX + (tileX - testX1) + 8 self.player.collisionRect.centery = tileY + (tileY - testY1) + 6 if self.player.item == 'Martelo': self.player.spritesheet = self.player.MarteloSheet self.player.number_of_sprite = 0 self.player.cont = 0 self.player.image = self.player.spritesheet[ self.player.direction][self.player.number_of_sprite] self.player.martelando = True self.player.collisionRect.centerx = tileX + 8 self.player.collisionRect.centery = tileY + 6 if self.menu: play(self.Sounds['MenuMove'], 1, self.musicPlaying) if self.Menu.name == 'ItemMenu': if event.key == K_UP: self.Menu.selected[1] -= 1 if event.key == K_DOWN: self.Menu.selected[1] += 1 if event.key == K_LEFT: self.Menu.selected[0] -= 1 if event.key == K_RIGHT: self.Menu.selected[0] += 1 else: if event.key == K_UP: if self.Menu.selected < self.Menu.Max + 1: self.Menu.selected -= 1 if event.key == K_DOWN: if self.Menu.selected < self.Menu.Max + 1: self.Menu.selected += 1 #if self.selected == 3: #self.selected = 0 self.tilemap.Actions(self) if self.first: if self.Location == 'Sala do Mestre': NewSurface.fill((0,0,0)) NewSurface.blit(self.tilemap.images['background'], (((self.width-WIDTH)//2,0))) self.tilemap.draw(NewSurface) FadeIn(self,NewSurface, Surface) del NewSurface self.first = False self.second = True if self.Master: self.Master = False self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0) elif self.second: self.Pause = False self.second = False if self.musicPlaying: self.tilemap.InicializeSounds() if self.Location == 'Sala do Mestre': pygame.mixer.Sound(resources.file_path('sfx_mestre_intro.ogg','Musica')).play(0) if not self.Pause: self.tilemap.update(dt, self) if self.Location == 'Sala do Mestre': Surface.fill((0,0,0)) Surface.blit(self.tilemap.images['background'], ((self.width-WIDTH)//2,0)) self.tilemap.draw(Surface) if self.menu: self.Menu.update(dt, self) if self.menu: self.Menu.draw(self, Surface) else: BlitLife(Surface, self, self.Heart, self.images['Stamina'], self.tools[0][self.choosed[self.player.item]]) if self.PegouJóia: play(self.Sounds['Jóia'], 1, self.musicPlaying) self.Escroto.SaveGame(self,'CheckPoint.save', 0 ,2,0) self.PegouJóia = False TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update() if self.Location == 'Campo': self.tilemap.SetSound(self) for npc in self.tilemap.NPCs: if npc.talking: self.tilemap.PauseEspecial() npc.display(Surface, self) if self.player.vida <= 0: self.tilemap.StopSounds() self.Died(Surface) elif 0 < self.player.vida <= 2: if self.musicPlaying: if self.Sounds['Morrendo'].get_num_channels() == 0: self.Sounds['Morrendo'].play(-1) else: if self.Sounds['Morrendo'].get_num_channels() > 0: self.Sounds['Morrendo'].stop() def ResizeScreen(self, newWidth, newHeight): """ Função que faz o resize da jogo de forma que o jogo seja compátivel com qualquer modo de tela entre 4:3 e 16:9 """ #precisamos primeiro calcular o tamanho da imagem que será disponibilizada no novo #tamanho de tela #Formato 16:9 ou 4:3 #Usaremos a altura como padrão Hfator_widscreen = newHeight/9 Hfator_oldscreen = newHeight/3 #Teste, tela 200/120 MAXW_widscreen = 16*Hfator_widscreen #213,33333 MAXW_oldscreen = 4*Hfator_oldscreen #160 if newWidth > MAXW_widscreen: self.width = self.tilemap.view_w = round(16*HEIGHT/9) elif newWidth <= MAXW_widscreen and newWidth >= MAXW_oldscreen: #Se isso for verdade devemos modificar o tamanho e posição #de algumas sprites do jogo #Antes, vamos calcular o novo tamanho de tela no tilemap self.width = round(newWidth/(newHeight/HEIGHT)) self.tilemap.view_w = self.width else: self.width = WIDTH self.tilemap.view_w = WIDTH self.rect = pygame.rect.Rect((0,0), (self.width, self.height)) self.tilemap.viewport = Rect((0,0), (self.width, self.height)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True) self.ModificaTamanho() def ModificaTamanho(self): #Vamos centralizar as posições dos menus for key in self.ItemMenu.Itens: self.ItemMenu.Itens[key]['Posição'][0] = self.ItemMenu.Itens[key]['Posição Inicial'] + (self.width-WIDTH)//2 self.Escroto.x = (self.width-WIDTH)//2 #Vamos agora ampliar algumas as imagens transparentes self.InvisivelCima = pygame.transform.scale(self.InvisivelCima, (self.width, self.InvisivelCima.get_height())) self.ItemMenu.escuro = pygame.transform.scale(self.ItemMenu.escuro, (self.width, self.ItemMenu.escuro.get_height())) self.rect = pygame.rect.Rect((0,0), (self.width, self.height)) self.tilemap.viewport = Rect((0,0), (self.width, self.height)) self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery, True) def CreateGame(self, music): self.mainClock = pygame.time.Clock() self.FPS = 30 self.musicPlaying = music self.Pause = False self.menu = False self.Menu = None self.Master = False self.width = WIDTH self.height = HEIGHT self.rect = pygame.rect.Rect(0, 0, self.width, self.height) self.first = self.second = False self.time = 0.033 self.menuHeart = load_sheet('menu_pause_coracao.png', 'Menus', 9, 8) self.Heart = load_sheet('menu_hud_coracao.png', 'Imagens', 9, 8) self.InvisivelCima = pygame.image.load(resources.file_path('menu_hud_escuro.png', 'Imagens')).convert_alpha() self.tools = load_sheet('menu_hud_ferramenta.png', 'Imagens', 26, 8) self.images = {'Player': {'MoveSheet': load_sheet('spr_pla_andando.png','Imagens', 48, 60), 'AtkSheet': load_sheet('spr_pla_ataque.png','Imagens', 48, 60), 'StopSheet': load_sheet('spr_pla_parado.png','Imagens', 48, 60)}, 'EnemyDeath': load_sheet('spr_obj_inimigomorto.png', 'Imagens', 16, 20), 'Sword': load_sheet('spr_pla_espada.png','Imagens', 48, 60), 'Hole': pygame.image.load(resources.file_path('spr_obj_buraco.png', 'Imagens')).convert_alpha(), 'Rachadura': pygame.image.load(resources.file_path('spr_obj_rachadura.png', 'Imagens')).convert_alpha(), 'Bomba': load_sheet('spr_obj_bomba.png', 'Imagens',16,12), 'Explosion': load_sheet('spr_obj_explosao.png', 'Imagens',48,36), 'Stamina': pygame.image.load(resources.file_path('menu_hud_stamina.png', 'Imagens')).convert_alpha(), 'StaminaMenu': pygame.image.load(resources.file_path('menu_pause_stamina.png', 'Menus')).convert_alpha(), 'Coracao': pygame.image.load(resources.file_path('spr_obj_coracao.png', 'Imagens')).convert_alpha(), 'FalaEscuro': pygame.transform.scale(self.InvisivelCima, (178, 36)).convert_alpha()} self.Sounds = {'Espada': {'Swing': pygame.mixer.Sound(resources.file_path('sfx_espada.ogg', 'Musica')), 'Parede': pygame.mixer.Sound(resources.file_path('sfx_wallhit.ogg', 'Musica')), 'Acertou': pygame.mixer.Sound(resources.file_path('sfx_acertando.ogg', 'Musica'))}, 'Bomba': pygame.mixer.Sound(resources.file_path('sfx_bomba.ogg', 'Musica')), 'Moshiro': 'ost_moshiro.ogg', 'Cavando': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')), 'MenuSelect':pygame.mixer.Sound(resources.file_path('sfx_menu_select.ogg', 'Musica')), 'MenuMove': pygame.mixer.Sound(resources.file_path('sfx_menu_move.ogg', 'Musica')), 'Jóia': pygame.mixer.Sound(resources.file_path('sfx_joia.ogg', 'Musica')), 'Morrendo':pygame.mixer.Sound(resources.file_path('sfx_morrendo.ogg', 'Musica')), 'Martelo': pygame.mixer.Sound(resources.file_path('sfx_martelo.ogg', 'Musica')), 'Buraco': pygame.mixer.Sound(resources.file_path('sfx_cavando.ogg', 'Musica')), 'Coração': pygame.mixer.Sound(resources.file_path('sfx_heart.ogg', 'Musica'))} self.choosed = {'Pá': 0, 'Martelo': 1, 'Bomba': 2} self.ItemMenu = ItemMenu() self.Escroto = Escroto() self.Campo = Campo(self.width, self.height, self) self.Dungeon = Dungeon(self.width, self.height, self) self.Caverna = Caverna(self.width, self.height, self) self.player = Player(self.images['Player'], (self.Campo.start_cell.px - 16, self.Campo.start_cell.py-28), [self.Campo.SpritesToChoose]) self.Location = 'Campo' self.tilemap = self.Campo self.Delivered = 0 self.PegouJóia = False #Vampos criar os canais onde os efeitos sonoros devem ser colocados def NewGame(self, Surface, music): self.CreateGame(music) if self.musicPlaying: self.tilemap.InicializeSounds() self.tilemap.SetSound(self) self.Pause = True dt = self.time self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.tilemap.update(dt, self) self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[self.tilemap.Lisa.AllDirection['Up']][self.tilemap.Lisa.number_of_sprite] self.tilemap.Moshiro.display(Surface, self, False) self.tilemap.Moshiro.MoshiroAndando(Surface, self) self.tilemap.Lisa.image = self.tilemap.Lisa.spritesheet[self.tilemap.Lisa.AllDirection['Left']][self.tilemap.Lisa.number_of_sprite] self.tilemap.Lisa.display(Surface, self, False) self.Pause = False self.SaveTilemaps() self.Escroto.SaveGame(self,'CheckPoint.save',0,2,0) self.main(Surface) def LoadGame(self, Surface, music, Things_To_Dump, died = False): self.CreateGame(music) self.Location = Things_To_Dump[0] if self.Location == 'Campo': self.tilemap = self.Campo elif self.Location == 'Dungeon': self.tilemap = self.Dungeon else: self.tilemap = self.Caverna self.player.kill() self.player.add([self.tilemap.SpritesToChoose]) #Agora vamos atualizar as informações do tilemap onde o player se encontra #Primeiro as informações do Player self.player.direction = Things_To_Dump[2][0] self.player.number_of_sprite= Things_To_Dump[2][1] self.player.collisionRect = Things_To_Dump[2][2] self.player.placedPositions = Things_To_Dump[2][3] self.player.Justdied = Things_To_Dump[2][4] self.player.vida = Things_To_Dump[2][5] self.player.vx = Things_To_Dump[2][6] self.player.vy = Things_To_Dump[2][7] self.player.cooldown = Things_To_Dump[2][8] self.player.imunity = Things_To_Dump[2][9] self.player.alive = Things_To_Dump[2][10] self.player.atking = Things_To_Dump[2][11] self.player.digging = Things_To_Dump[2][12] self.player.digged = Things_To_Dump[2][13] self.player.first_pressed = Things_To_Dump[2][14] self.player.pressed = Things_To_Dump[2][15] self.player.cont = Things_To_Dump[2][16] self.player.cont2 = Things_To_Dump[2][17] self.player.numbX = Things_To_Dump[2][18] self.player.numbY = Things_To_Dump[2][19] self.player.item = Things_To_Dump[2][20] self.player.Undelivered = Things_To_Dump[2][21] if self.player.atking: self.player.spritesheet = self.player.atkSheet elif self.player.digging: self.player.spritesheet = self.player.PaSheet elif self.player.vx != 0 or self.player.vy != 0: self.player.spritesheet = self.player.MoveSheet else: self.player.spritesheet = self.player.StopSheet #Construimos as Espadas do jogo for SwordInfo in Things_To_Dump[3]: sword = Sword(self.images['Sword'], (self.player.rect.x - 16, self.player.rect.y - 20), 'Sword', self.player.direction, (self.tilemap.SpritesToChoose, self.tilemap.Swords)) sword.number_of_sprite = SwordInfo[0] sword.image = sword.spritesheet[sword.direction][sword.number_of_sprite] sword.cont = SwordInfo[1] sword.rect = SwordInfo[2] #Construimos os inimigos do jogo for EnemieInfo in Things_To_Dump[4]: if 'Lesma' == EnemieInfo[0]: inimigo = Lesma(self.tilemap.images['Lesma'], (0,0), 'Lesma', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Bitch' == EnemieInfo[0]: inimigo = Bitch(self.tilemap.images['Bitch'], (0,0), 'Bitch', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Planta' == EnemieInfo[0]: inimigo = Planta(self.tilemap.images['Planta'], (0,0), 'Planta', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) elif 'Sniper' == EnemieInfo[0]: inimigo = Sniper(self.tilemap.images['Sniper'], (0,0), 'Sniper', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) else: inimigo = Zumbi(self.tilemap.images['Zumbi'], (0,0), 'Zumbi', (self.tilemap.SpritesToChoose, self.tilemap.Enemies)) inimigo.burn = EnemieInfo[1] inimigo.collisionRect = EnemieInfo[2] inimigo.direction = EnemieInfo[3] inimigo.number_of_sprite = EnemieInfo[4] inimigo.vida = EnemieInfo[5] inimigo.cooldown = EnemieInfo[6] inimigo.Max = EnemieInfo[7] inimigo.vy = EnemieInfo[8] inimigo.vx = EnemieInfo[9] inimigo.alive = EnemieInfo[10] inimigo.cont = EnemieInfo[11] inimigo.numbX = EnemieInfo[12] inimigo.numbY = EnemieInfo[13] inimigo.atking = EnemieInfo[14] inimigo.originalPosition = EnemieInfo[15] if not inimigo.alive: if inimigo.burn: inimigo.image = inimigo.cinzas else: inimigo.image = inimigo.deadImage #Construcao de Bombas for BombaInfo in Things_To_Dump[5]: Bomba = Pilastra(self.images['Bomba'], 'Bomba', (0,0), (self.tilemap.SpritesToChoose, self.tilemap.Bombas)) Bomba.cont = BombaInfo[0] Bomba.number_of_sprite = BombaInfo[1] Bomba.rect = BombaInfo[2] #Construcao de Explosoes for ExploInfo in Things_To_Dump[6]: Explosion = Explosion(self.images['Explosion'], (0,0), 'Explosion', 0, (self.tilemap.Bombas, self.tilemap.SpritesToChoose)) Explosion.cont = ExploInfo[0] Explosion.number_of_sprite = ExploInfo[1] Explosion.rect = ExploInfo[2] #Contrucao de Animacoes for AniInfo in Things_To_Dump[7]: Animation = DeathAnimation(self.images[AniInfo[0]], (0,0), AniInfo[0], [self.tilemap.SpritesToChoose]) Animation.rect = AniInfo[1] Animation.image = AniInfo[2] Animation.number_of_sprite = AniInfo[3] Animation.cont = AniInfo[4] #Construcao de Atks for ATKinfo in Things_To_Dump[8]: if ATKinfo[0] == 'AtkZumbi': ATK = ZumbiAtk(self.tilemap.images['Zumbi']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], [self.tilemap.SpritesToChoose], [enemy for enemy in self.tilemap.Enemies if enemy.nome == 'Zumbi'][0]) else: if 'Sniper' in ATKinfo[0]: ATK = Atk(self.tilemap.images['Sniper']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose]) else: ATK = Atk(self.tilemap.images['Planta']['Atk'], (0,0), ATKinfo[4], ATKinfo[0], ATKinfo[1], [self.tilemap.SpritesToChoose]) ATK.number_of_sprite = ATKinfo[2] ATK.alive = ATKinfo[3] ATK.rect = ATKinfo[5] ATK.Max = ATKinfo[6] ATK.cont = ATKinfo[7] #Colocando o menu de Itens self.ItemMenu.Itens = Things_To_Dump[9].Itens self.ItemMenu.selected = Things_To_Dump[9].selected self.ItemMenu.using = Things_To_Dump[9].using self.ItemMenu.menu = Things_To_Dump[9].menu self.ItemMenu.Fala = Things_To_Dump[9].Fala self.Campo.AdjustTileHoleAndRachadura(Things_To_Dump[1][0], self) self.Campo.AdjustJewels(Things_To_Dump[1][0], self) self.Caverna.AdjustTileHoleAndRachadura(Things_To_Dump[1][1], self) self.Caverna.AdjustJewels(Things_To_Dump[1][1], self) self.Dungeon.AdjustTileHoleAndRachadura(Things_To_Dump[1][2], self) self.Dungeon.AdjustJewels(Things_To_Dump[1][2], self) #Verificamos o numero de joias devolvidas self.Delivered = Things_To_Dump[10] #E por ultimo vemos se ja dialogamos com o sr moshiro ou nao self.Campo.Moshiro.first = Things_To_Dump[11] self.tilemap.set_focus(self.player.collisionRect.centerx, self.player.collisionRect.centery) if not died: self.Escroto.SaveGame(self,'CheckPoint.save', 0, 2,0) if self.musicPlaying: self.tilemap.InicializeSounds() self.tilemap.SetSound(self) self.SaveTilemaps() #self.ItemMenu.Itens['Safira']['Possui'] = True #self.ItemMenu.Itens['Safira']['Delivered'] = True #self.Delivered += 1 self.ResizeScreen(Surface.get_width(), Surface.get_height()) self.main(Surface) def SaveTilemaps(self): self.Escroto.SaveTilemap('Campo.tilemap', self.Campo) self.Escroto.SaveTilemap('Caverna.tilemap', self.Caverna) self.Escroto.SaveTilemap('Dungeon.tilemap', self.Dungeon) del self.Campo del self.Caverna del self.Dungeon def winGame(self, Surface): #self.tilemap.Moshiro.display(Surface, self, music = False) pygame.mixer.music.load(resources.file_path('ost_moshiro_presto.ogg', 'Musica')) pygame.mixer.music.play(-1, 0.0) if self.player.collisionRect.x != 448 or self.player.collisionRect.y != 144: self.MovePlayer(Surface) self.tilemap.Moshiro.moshiroAndandoFinal(Surface, self) self.player.image = self.player.StopSheet[2][0] self.tilemap.Moshiro.display(Surface, self, False, False) for pilastra in self.tilemap.Pilastras: if pilastra.nome == 'RuinaFinal': pilastra.number_of_sprite = 1 pilastra.image = pilastra.spritesheet[0][pilastra.number_of_sprite] contador = 0 limite = 2 self.tilemap.StopSounds() pygame.mixer.music.load(resources.file_path('ost_ending.ogg', 'Musica')) pygame.mixer.music.play(0, 0.0) while contador < limite: contador += self.mainClock.tick(30)/1000 for event in pygame.event.get(): QUIT_Event(event) Surface = VIDEORESIZE_Event(self, event, Surface) self.tilemap.draw(Surface) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() #Fade para o Branco NewSurface = pygame.Surface.copy(Surface) NewSurface.fill((255,255,255)) FadeIn(self,NewSurface, Surface) selected = 0 self.images['Ending'] = load_sheet('menu_final.png', 'Menus', MAXWIDTH, HEIGHT) while True: for event in pygame.event.get(): if event.type == QUIT: terminate () if event.type == KEYUP: if event.key == ord('m'): if self.musicPlaying: pygame.mixer.music.stop() else: pygame.mixer.music.play(-1, 0.0) self.musicPlaying = not self.musicPlaying if event.type == KEYDOWN: if event.key == K_a: if selected < len(self.images['Ending'][0]) - 1: selected += 1 else: terminate() Surface = VIDEORESIZE_Event(self, event, Surface) Surface.blit(self.images['Ending'][0][selected], (- (MAXWIDTH-self.width)//2,0)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() self.mainClock.tick(self.FPS) def MovePlayer(self, Surface): #É preciso calcular a tragetória do player para que ele fique de frente para #o sr moshiro (432, 144) 432 + 16 = 448 posY = self.tilemap.Moshiro.collisionRect.bottom posX = self.tilemap.Moshiro.collisionRect.right tileX = (self.player.collisionRect.centerx // 16) tileY = (self.player.collisionRect.centery // 12) distY = posY - self.player.collisionRect.bottom #Temos que olhar para posição do retângulo do player como um todo #Caso o player esteja na linha dos tilesY 11 precisamos ver se #o fundo dele nao encosta na tile block if tileY == 11: #Caso o player esteja na linha dos tilesY 11 precisamos ver se #o fundo dele nao encosta na tile block if self.player.collisionRect.bottom > 144: self.player.AndaAutomatico(2, (self.player.collisionRect.x, 144), self, Surface) elif tileY == 12: #Caso o player esteja na linha de tilesY 12 ele precisa se deslocar para cima #ou para baixo dependendo do valor da distância em y if self.player.collisionRect.x < posX: if distY <= 0: self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY+12), self, Surface) else: self.player.AndaAutomatico(2, (self.player.collisionRect.x, posY-12), self, Surface) else: #Neste último caso ele só pode estar na linha de 13 e logo devemos ver se o topo dele nao bate no block if self.player.collisionRect.bottom < posY+12 and self.player.collisionRect.x < posX: self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY+12), self, Surface) #Em seguida é preciso fazer o player se mover horizontalmente self.player.AndaAutomatico(1, (posX, self.player.collisionRect.bottom), self, Surface) #E por fim move-lo verticalmente novamente distY = posY - self.player.collisionRect.bottom if distY > 0: self.player.AndaAutomatico(0, (self.player.collisionRect.x, posY), self, Surface) else: self.player.AndaAutomatico(2, (self.player.collisionRect.x, posY), self, Surface) def Died(self, Surface): #Leva o player girando para o centro da Tela if self.musicPlaying: pygame.mixer.Sound(resources.file_path('ost_gameover.ogg', 'Musica')).play() cont = 0 dt = self.time self.mainClock.tick(30) girando = load_sheet('spr_pla_olhosfechados.png', 'Imagens', 48,60) caindo = load_sheet('spr_pla_morto.png', 'Imagens', 48,60) sr_moshiro = load_sheet('menu_gameover_moshiro.png', 'Menus', MAXWIDTH,HEIGHT) menu = load_sheet('menu_gameover.png', 'Menus', WIDTH, HEIGHT) numero_da_imagem = 0 Max = len(girando) self.ResizeScreen(Surface.get_width(), Surface.get_height()) #Começa a mostrar a animação do player girando while cont < 2: dt = 2*self.time self.mainClock.tick(self.FPS//2) imagem = girando[numero_da_imagem][0] numero_da_imagem += 1 if numero_da_imagem == Max: numero_da_imagem = 0 Surface.fill((0,0,0)) Surface.blit(imagem, (56+ + (self.width - WIDTH)//2,34)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.flip() cont += dt #Passa a Fazer o player cai numero_da_imagem = 0 Max = len(caindo[0]) while numero_da_imagem != Max: dt = 4*self.time self.mainClock.tick(self.FPS//4) imagem = caindo[0][numero_da_imagem] numero_da_imagem += 1 Surface.fill((0,0,0)) Surface.blit(imagem, (56 + (self.width - WIDTH)//2,34)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update() pygame.time.wait(1000) #Fade para o Branco NewSurface = pygame.Surface.copy(Surface) NewSurface.fill((255,255,255)) FadeIn(self,NewSurface, Surface) #Sr.Moshiro Falando texto = "Estou decepcionado com você" font = pygame.font.SysFont("Calibri", 14) display = TextHandler(texto, pygame.rect.Rect(20, 85, 123, 35), Surface, self, font,[[sr_moshiro, [-(MAXWIDTH - self.width)//2,0], 0, 3*self.time, 0], [pygame.transform.scale(self.images['FalaEscuro'], (214, 36)).convert_alpha(), (0, 84)]], life = False) del display #Colocando o Menu de Escolha Choose = False self.selected = 0 while not Choose: for event in pygame.event.get(): if event.type == QUIT: terminate() if event.type == KEYDOWN: if event.key == K_DOWN: self.selected += 1 if event.key == K_UP: self.selected -= 1 if event.key == K_a: if self.selected == 0: Archive = open('CheckPoint.save', 'rb') Things_to_Dump = pickle.load(Archive) self.LoadGame(Surface, self.musicPlaying, Things_to_Dump, died = True) else: terminate () if self.selected > 1: self.selected = 0 if self.selected < 0: self.selected = 1 Surface.fill((0,0,0)) Surface.blit(menu[0][self.selected], ((self.width - WIDTH)//2,0)) TransformSurfaceScale(Surface, self.width, self.height, self.rect) pygame.display.update()