class KoalaKross(Microgame):
    
    
    def __init__(self):
        Microgame.__init__(self)
        self.rect= Rect(0,0, locals.WIDTH, locals.HEIGHT)
##        surface=pygame.display.set_mode((1024,768))
##        surface.fill(Color(0,0,250))
        self.koala=Koala(self)
        self.panda1=Panda(self,200,100,randint(2,10),randint(5,15))
        self.panda2=Panda(self,500,100,randint(5,15),randint(10,25))
        self.panda3=Panda(self,800,100,randint(6,17),randint(20,30))
        self.bread=Bread(self,randint(400,1000),randint(100,600))
        self.background=Background()
        self.sprites=OrderedUpdates([self.background,self.koala,self.bread,self.panda1,self.panda2,self.panda3,self.background])
        self.clock=pygame.time.Clock()

    def start(self):
 ##       music.load(join('games','Koala_Kross','remix.ogg')
        music.load('games/Koala_Kross/remix.ogg')
        music.play()

    def stop(self):
        music.stop()

    def update(self):
##        time=pygame.time.get_ticks()
        self.sprites.update()
        for event in pygame.event.get():
      
            
            if event.type==KEYDOWN and event.key==K_DOWN:
                self.koala.velocity=(0,30)
            if event.type==KEYUP and event.key==K_DOWN:
                self.koala.velocity=(0,0)
                
            if  event.type==KEYDOWN and event.key==K_UP:
                self.koala.velocity=(0,-30)
            if event.type==KEYUP and event.key == K_UP:
                self.koala.velocity=(0,0)
                
            if event.type==KEYDOWN and event.key == K_LEFT:
                self.koala.velocity=(-30,0)
            if event.type==KEYUP and event.key==K_LEFT:
                self.koala.velocity=(0,0)
            if event.type==KEYDOWN and event.key==K_RIGHT:
                self.koala.velocity=(30,0)
            if event.type==KEYUP and event.key==K_RIGHT:
                self.koala.velocity=(0,0)
            if event.type==KEYDOWN and event.key == K_q:
                self.lose()
            
            

    def render (self, surface):
##        Surface=display.set_mode((1024,768))
        surface.fill(Color(0,0,0))
        self.sprites.draw(surface)
Exemple #2
0
class Gameboard(object):
    '''
    classdocs
    '''

    def __init__(self, surface, width, height, song_filename):
        '''
        Constructor
        '''
        
        #progressively increase; must end with 1
        self.PROB_HEALTH = 0.4
        
        self.PROB_KI = 0.7
        
        self.PROB_SHIELD = 0.9
        self.PROB_SWORD = 1.0
        
        self.windowSurface = surface
        self.width = width
        self.height = height
        self.song_filename = song_filename
        board_size = (width, height)
        self.gameSurface = Surface(board_size) # This will be drawn every frame to the window
        
        song_file = open(song_filename)
        self.song_name = song_file.readline().strip()
        self.song_length = float(song_file.readline())
        self.pixels_per_second = float(song_file.readline())
        self.level_filename = song_file.readline().strip()
        self.music_filename = song_file.readline().strip()
        self.background_filename = song_file.readline().strip()
        
        
        self.pixel_offset = 0
        self.last_frame_time = -1
        self.frac_scroll = 0
#        print "{0}[{1}] : {2}".format(self.song_name, self.song_length, self.pixels_per_second)
        
#        self.background_width = (self.pixels_per_second * self.song_length) + width
        self.background_width = width + 96  # Jank scroll edition!
        background_size = (self.background_width, height)
        self.backgroundSurface = Surface(background_size)
        self.__render_background()
        
        self.backgroundSurface.set_colorkey((0,0,0),pygame.RLEACCEL)
        #self.backgroundSurface.set_colorkey((217,62,245),pygame.RLEACCEL)
        #self.backgroundSurface.set_alpha(100,pygame.RLEACCEL)
        
        self.mainScreenBackground,self.mainScreenBackgroundRect = load_image_from_folder('backgrounds', self.background_filename)
        
        #self.backgroundSurface.blit(mainScreenBackground, (0,0))
        #self.__render_background()
        
        possible_samurai_positions = []
        
        for i in range(0, 6):
            possible_samurai_positions.append(PATH_HEIGHT * i + 15)
        
        self.samurai = Samurai(possible_samurai_positions)
        self.samurai_sprite_group = Group(self.samurai)
        
        self.bridge_group = OrderedUpdates()
        self.mine_group = OrderedUpdates()
        self.enemy_group = OrderedUpdates()
        self.attack_group = OrderedUpdates()
        self.healthpack_group = OrderedUpdates()
        self.ki_potion_group = OrderedUpdates()
        self.shield_group = OrderedUpdates()
        self.sword_group = OrderedUpdates()
        self.explosion_group = OrderedUpdates()
        
#        tempSprite = self.samurai_sprite_group.sprites()
#        tempRect = tempSprite[0].get_rect()
#        self.testSword = VerticalSlash(tempRect.centerx,tempRect.centery, self.remove_attack)
#        self.attack_group.add(self.testSword)
        
        if sys.platform == "win32":
            # On Windows, the best timer is time.clock()
            self.default_timer = time.clock
        else:
            # On most other platforms, the best timer is time.time()
            self.default_timer = time.time
            
        
        
    def draw(self):
        self.gameSurface.fill((0,0,0))
        #self.gameSurface.fill((217,62,245))
        origin = (0, 0)
#        this_scroll = 0
        self.scroll_amount = 0
        if self.last_frame_time > 0:
            cur_time = self.default_timer()
            self.gap_time = cur_time - self.last_frame_time
#            print "Pixels per second: {0}\nGap Time: {1}\nScrollAmount: {2}".format(self.pixels_per_second, self.gap_time, this_scroll)
            self.last_frame_time = cur_time
        else:
            self.gap_time = 0
            self.last_frame_time = self.default_timer()
            
        this_scroll = self.pixels_per_second * self.gap_time
    
        self.frac_scroll += this_scroll
        if self.frac_scroll >= 1:
            self.scroll_amount = math.floor(self.frac_scroll)
            self.pixel_offset += self.scroll_amount
#            print "Now scrolling {0} pixel(s)".format(whole_part)
            self.frac_scroll -= self.scroll_amount

        if self.pixel_offset > 96:
            self.pixel_offset = self.pixel_offset - 96
            if self.pixel_offset < 0:
                self.pixel_offset = 0
                     
        self.gameSurface.blit(self.mainScreenBackground, origin)
        
        window_rect = Rect(self.pixel_offset, 0, self.gameSurface.get_width(), self.gameSurface.get_height()) 
#        print window_rect
        self.gameSurface.blit(self.backgroundSurface, origin, window_rect)
        
        #All other drawing
        self.bridge_group.update(self.scroll_amount)
        self.bridge_group.draw(self.gameSurface)
        
        self.mine_group.update(self.scroll_amount)
        self.mine_group.draw(self.gameSurface)
        
        self.enemy_group.update(self.scroll_amount)
        self.enemy_group.draw(self.gameSurface)
        
        self.samurai_sprite_group.update()
        self.samurai_sprite_group.draw(self.gameSurface) 
        
        self.healthpack_group.update(self.scroll_amount)
        self.healthpack_group.draw(self.gameSurface)
        
        self.ki_potion_group.update(self.scroll_amount)
        self.ki_potion_group.draw(self.gameSurface)
        
        self.shield_group.update(self.scroll_amount)
        self.shield_group.draw(self.gameSurface)
        
        self.sword_group.update(self.scroll_amount)
        self.sword_group.draw(self.gameSurface)
        
        #self.testSword = VerticalSlash(400,400)
        #self.attack_group.add(self.testSword)
        self.attack_group.update()
        self.attack_group.draw(self.gameSurface)
        
        self.explosion_group.update()
        self.explosion_group.draw(self.gameSurface)
        
#        self.testSword.draw(self.gameSurface)
        
        
        
        for bridge in self.bridge_group.sprites():
            if bridge.rect.left < 0:
                self.bridge_group.remove(bridge)
            
        
        #Annnnd blast it back to the screen
        window_origin = (0, 60)
        self.windowSurface.blit(self.gameSurface, window_origin)
        
        
    def add_bridge(self, bridge_num):
#        print "FAKE BRIDGE"
        
        new_bridge = Bridge(1101, bridge_num * PATH_HEIGHT + 39)
        self.bridge_group.add(new_bridge)
        
    def add_mine(self, string_num):
#        print "CREATE ZE LANDMINE"
        new_mine = Mine(1101, PATH_HEIGHT * string_num + 42)
        self.mine_group.add(new_mine)
    
    def add_powerup(self, string_num):
        r = random.random()
        if r < self.PROB_HEALTH:
            self.add_healthpack(string_num)
        elif r < self.PROB_KI:
            self.add_kiboost(string_num)
        elif r < self.PROB_SHIELD:
            self.add_shield(string_num)
        elif r < self.PROB_SWORD:
            self.add_sword(string_num)

    def add_healthpack(self, string_num):
#        print "such a healthy young man!"
        new_healthpack = Healthpack(1101, PATH_HEIGHT * string_num + 42)
        self.healthpack_group.add(new_healthpack)
        
    def add_shield(self, string_num):
        new_shield = Shield(1101, PATH_HEIGHT * string_num + 42)
        self.shield_group.add(new_shield)
        
    def add_sword(self, string_num):
        new_sword = MegaSword(1101, PATH_HEIGHT * string_num + 42)
        self.sword_group.add(new_sword)
        
    def add_kiboost(self, string_num):
        new_ki_potion = KiPotion(1101, PATH_HEIGHT * string_num + 42)
        self.ki_potion_group.add(new_ki_potion)
    
    def add_enemy(self, string_num):
        new_enemy = Enemy(1111, PATH_HEIGHT * string_num + 42)
        self.enemy_group.add(new_enemy)
        
    def add_male_groupie(self, string_num):
        new_enemy = MaleGroupie(1111, PATH_HEIGHT * string_num + 15)
        self.enemy_group.add(new_enemy)
        
    def add_lawyer(self, string_num):
        new_lawyer = Lawyer(1111, PATH_HEIGHT * string_num + 15)
        self.enemy_group.add(new_lawyer)
        
    def add_bodyguard(self, string_num):
        new_bodyguard = Bodyguard(1111, PATH_HEIGHT * string_num + 15)
        self.enemy_group.add(new_bodyguard)
        
    def remove_attack(self, attack):
        self.attack_group.remove(attack)
        
    def add_attack(self, attack):
        self.attack_group.add(attack)
        
    def add_explosion(self, y_val):
        new_explosion = Explosion(20, y_val, self.explosion_group)
        
        
    def __render_background(self):
        # Jank implementation that just uses that one sprite over and over again!
        # Jay's jank dirtBlockThingy is 96x48 pixels
        num_blocks = int(math.ceil(self.background_width / 96.0))
        cur_width = 0
        for bI in range(0, num_blocks):
            for hI in range(0, 6):
                my_location = (cur_width, (PATH_HEIGHT * hI + 35))
                dp = DirtPath(my_location)
#                print "DirtPath at {0}".format(my_location)
                self.backgroundSurface.blit(dp.image, my_location)
            cur_width += 96
Exemple #3
0
class Menu(Prefab):
    """
    Controls the menu system.
    """

    def __init__(self, game):
        """
        Constructor.

        Args:
            game (Game): The game instance.

        """
        super().__init__("menu", 0, 0)

        self.game = game
        self.leaderboard = Leaderboard()
        self.components = OrderedUpdates()
        self.clear()
        self.show_main_screen()
        self.visible = True
        self.leaderboard_name = None
        
    def show(self):
        """
        Shows the menu.
        """
        self.visible = True
        self.show_main_screen()

    def hide(self):
        """
        Hides the menu and enables in game icons.
        """
        self.visible = False
        self.clear()

        self.defence_buttons = [MenuButton(self, "menu_defence_button", self.game.defence_prototypes[i].display_name, (i + 1) * 64, 0, lambda: self.game.select_defence((pygame.mouse.get_pos()[0] - 64) // 64)) for i in range(len(self.game.defence_prototypes))]
        self.components.add(self.defence_buttons)

        self.wave_label = MenuLabel(self, "menu_pause_button", "Wave", 448, 0)
        self.lives_label = MenuLabel(self, "menu_pause_button", "Lives", 576, 0)
        self.money_label = MenuLabel(self, "menu_pause_button", "Money", 704, 0)
        self.score_label = MenuLabel(self, "menu_pause_button", "Score", 832, 0)
        self.components.add(self.wave_label)
        self.components.add(self.lives_label)
        self.components.add(self.money_label)
        self.components.add(self.score_label)

        self.components.add(MenuButton(self, "menu_pause_button", "Menu", 1088, 0, self.show))

        self.update()

    def clear(self):
        """
        Removes all components from the menu.
        """
        self.components.remove(self.components)
        self.component_next = self.top

    def update(self):
        """
        Called each frame.
        """
        if not self.visible:
            self.wave_label.set_text("Wave: " + str(self.game.wave.number))
            self.lives_label.set_text("Lives: " + str(self.game.level.lives))
            self.lives_label.highlighted = (self.game.level.lives < 5)
            self.money_label.set_text("Money: " + str(self.game.level.money))
            self.score_label.set_text("Score: " + str(self.game.level.get_score()))

            for i in range(len(self.defence_buttons)):
                self.defence_buttons[i].disabled = (self.game.defence_prototypes[i].cost > self.game.level.money)
                self.defence_buttons[i].selected = (self.game.defence_type == i)
        
        self.components.update()

    def clicked(self):
        """
        Called when a mouse button is pressed.
        """
        for component in self.components:
            if isinstance(component, MenuButton):
                component.clicked()

    def key_pressed(self, key):
        """
        Called when a key has been pressed.

        Args:
            key: The key that was pressed.

        """
        if self.leaderboard_name is None:
            return

        keys = { pygame.K_a: "a", pygame.K_b: "b", pygame.K_c: "c", pygame.K_d: "d", pygame.K_e: "e", pygame.K_f: "f", pygame.K_g: "g", pygame.K_h: "h", pygame.K_i: "i", 
                pygame.K_j: "j", pygame.K_k: "k", pygame.K_l: "l", pygame.K_m: "m", pygame.K_n: "n", pygame.K_o: "o", pygame.K_p: "p", pygame.K_q: "q", pygame.K_r: "r", 
                pygame.K_s: "s", pygame.K_t: "t", pygame.K_u: "u", pygame.K_v: "v", pygame.K_w: "w", pygame.K_x: "x", pygame.K_y: "y", pygame.K_z: "z",
                pygame.K_0: "0", pygame.K_1: "1", pygame.K_2: "2", pygame.K_3: "3", pygame.K_4: "4", pygame.K_5: "5", pygame.K_6: "6", pygame.K_7: "7",
                pygame.K_8: "8", pygame.K_9: "9" }

        if key in keys.keys():
            self.leaderboard_name.set_text(self.leaderboard_name.text + (keys[key].upper() if pygame.key.get_pressed()[pygame.K_LSHIFT] or pygame.key.get_pressed()[pygame.K_RSHIFT] else keys[key]))
        elif key is pygame.K_BACKSPACE and self.leaderboard_name.text != "":
            self.leaderboard_name.set_text(self.leaderboard_name.text[:-1])

    def draw(self, screen):
        """
        Draws the menu and its components.

        Args:
            screen (Surface): The surface that is blitted to.

        """
        if self.visible:
            screen.blit(self.image, (0, 0))

        self.components.draw(screen)

    def add_button(self, text, callback):
        """
        Adds a standard button to the menu screen.

        Args:
            text (str): The text to display on the button.
            callback (callable): The callback when the button is clicked.

        Returns:
            (MenuButton): The button.

        """
        button = MenuButton(self, "menu_button", text, 0, self.component_next, callback)
        button.rect.x = (self.rect.width - button.rect.width) / 2

        self.components.add(button)
        self.component_next += button.rect.height
        self.component_next += button.padding

        return button

    def add_level_button(self, level):
        """
        Adds a change level button to the menu screen.

        Args:
            level (str): The name of the level to display on the button.

        """
        button = MenuButton(self, "menu_level_" + level, level, 0, self.component_next, lambda: self.game.load_level(level))
        button.rect.x = (self.rect.width - button.rect.width) / 2
        
        self.components.add(button)
        self.component_next += button.rect.height
        self.component_next += button.padding

    def show_main_screen(self):
        """
        Shows the main menu screen.
        """
        self.clear()

        if self.game.level.time > 0:
            self.add_button("Continue", self.hide)
            self.add_button("Restart Game", lambda: self.game.load_level(self.game.level.name))
        else:
            self.add_button("Start Game", self.hide)

        self.add_button("How To Play", self.show_how_to_play_screen)
        self.add_button("Change Level", self.show_change_level_screen)
        self.add_button("Leaderboard", self.show_leaderboard_screen)
        self.add_button("Quit Game", self.game.quit)

    def show_how_to_play_screen(self):
        """
        Shows the how to play menu screen.
        """
        self.clear()
        self.add_button("Back", self.show_main_screen)

        instructions = Prefab("menu_how_to_play", 0, self.component_next)
        self.components.add(instructions)
        instructions.rect.x = (self.rect.width - instructions.rect.width) / 2

    def show_change_level_screen(self):
        """
        Shows the change level screen.
        """
        self.clear()
        self.add_button("Back", self.show_main_screen)

        if self.game.level.name != "basic":
            self.add_level_button("basic")

        if self.game.level.name != "path":
            self.add_level_button("path")

        if self.game.level.name != "maze":
            self.add_level_button("maze")

    def show_leaderboard_screen(self):
        """
        Shows the leaderboard screen.
        """
        self.leaderboard.retrieve()
        self.clear()
        self.add_button("Back", self.show_main_screen)

        if self.leaderboard.entries is None:
            self.add_button("Error Loading Leaderboard", None)
        else:
            for i in range(0, 4 if len(self.leaderboard.entries) > 6 else len(self.leaderboard.entries)):
                entry = self.leaderboard.entries[i]
                self.add_button(entry.name + "   Lvl=" + entry.level + "   Scr=" + str(entry.score) + "   Wve=" + str(entry.wave), None)

    def show_lose_screen(self):
        """
        Shows the game over screen.
        """
        self.show()
        self.clear()
        self.add_button("Game Over", None)
        self.add_button("You Reached Wave " + str(self.game.wave.number), None)
        self.add_button(str(self.game.level.get_score()) + " Points", None)
        self.add_button("Restart Game", lambda: self.game.load_level(self.game.level.name))
        self.add_button("Add To Leaderboard", self.show_add_to_leaderboard_screen)

    def show_add_to_leaderboard_screen(self):
        """
        Shows the add to leaderboard screen.
        """
        self.clear()
        self.add_button("Type Your Name", None)
        self.leaderboard_name = self.add_button("", None)
        self.add_button("Submit", self.submit_leaderboard)

    def submit_leaderboard(self):
        """
        Attempts to submit a score to the leaderboard.
        """
        if self.leaderboard_name.text != "":
            self.leaderboard.add(self.game.level.name, self.leaderboard_name.text, self.game.level.get_score(), self.game.wave.number)
            self.game.load_level(self.game.level.name)
            self.show_leaderboard_screen()
class Super_Saast_Bros(Microgame):
    def __init__(self):
        Microgame.__init__(self)
        self.character_select = True
        self.player1_selector = Player1_Selector()
        self.player2_selector = Player2_Selector()
        self.falco = Falco_Selector()
        self.fox = Fox_Selector()
        self.samus = Samus_Selector()
        self.snake = Snake_Selector()
        self.pit = Pit_Selector()
        self.mewtwo = Mewtwo_Selector()
        self.zelda = Zelda_Selector()
        self.character_possibilities = Group(self.falco, self.fox, self.samus, self.snake, self.pit, self.mewtwo, self.zelda)
        self.sprites = OrderedUpdates(self.falco, self.fox, self.samus, self.snake, self.pit, self.mewtwo, self.zelda, self.player1_selector, self.player2_selector)
        self.player1 = Fox()
        self.player2 = Falco()
        self.p1victory = pygame.image.load(join('games', 'ssb', 'p1_win.png'))
        self.p2victory = pygame.image.load(join('games', 'ssb', 'p2_win.png'))

        self.platform = Final_Destination()

        self.p1win = False
        self.p2win = False
        self.wincondition = False

        self.a_track = False
        self.d_track = False
        self.lshift_track = False
        self.quote_track = False
        self.l_track = False
        self.rshift_track = False

        self.playergroup = Group(self.player1, self.player2)
        self.player1_projectiles = Group()
        self.player2_projectiles = Group()

    def start(self):
        pygame.mixer.music.load(join('games', 'ssb', 'battlefield_melee.ogg'))
        pygame.mixer.music.play()

    def stop(self):
        pygame.mixer.music.stop()

    def update(self, events):
        if self.wincondition == False:
            if self.character_select == True:
                player_1_character = self.detect_character(self.player1_selector, self.character_possibilities)
                player_2_character = self.detect_character(self.player2_selector, self.character_possibilities)
                if player_1_character == self.falco:
                    self.player1 = Falco()
                elif player_1_character == self.fox:
                    self.player1 = Fox()
                elif player_1_character == self.samus:
                    self.player1 = Samus()
                elif player_1_character == self.snake:
                    self.player1 = Snake()
                elif player_1_character == self.pit:
                    self.player1 = Pit()
                elif player_1_character == self.mewtwo:
                    self.player1 = Mewtwo()
                elif player_1_character == self.zelda:
                    self.player1 = Zelda()

                if player_2_character == self.falco:
                    self.player2 = Falco()
                elif player_2_character == self.fox:
                    self.player2 = Fox()
                elif player_2_character == self.samus:
                    self.player2 = Samus()
                elif player_2_character == self.snake:
                    self.player2 = Snake()
                elif player_2_character == self.pit:
                    self.player2 = Pit()
                elif player_2_character == self.mewtwo:
                    self.player2 = Mewtwo()
                elif player_2_character == self.zelda:
                    self.player2 = Zelda()

                for event in events:
                    self.player1_selector_logic(event, self.player1_selector)
                    self.player2_selector_logic(event, self.player2_selector)
                    self.character_select_logic(event)

                self.sprites.update()

            if self.character_select == False:
                self.detect_hit(self.player2, self.player1_projectiles)
                self.detect_hit(self.player1, self.player2_projectiles)

                self.remove_projectiles(self.player1_projectiles, self.sprites)
                self.remove_projectiles(self.player2_projectiles, self.sprites)

                self.sprites.update()

                self.detect_floor()
                
                for event in events:
                    self.char_logic1(event, self.player1)
                    self.char_logic2(event, self.player2)

                self.player1.projectile_logic()
                self.player2.projectile_logic()

                y1 = self.player1.rect.top
                y2 = self.player2.rect.top

                if (y1 > 1200) or (y2 > 1200):
                    if y1 > 1200:
                        self.p2win = True
                    if y2 > 1200:
                        self.p1win = True
                    self.sprites.remove(self.platform, self.player1, self.player2)
                    self.wincondition = True
                    self.win_time = pygame.time.get_ticks()

        elif self.wincondition == True:
            if pygame.time.get_ticks() - self.win_time >= 3000:
                self.win()

    def player1_selector_logic(self, event, player_selector):
        if event.type == KEYDOWN:
            if event.key == K_w:
                player_selector.uvelocity -= 15
            elif event.key == K_d:
                player_selector.rvelocity += 15
            elif event.key == K_s:
                player_selector.dvelocity += 15
            elif event.key == K_a:
                player_selector.lvelocity -= 15
        if event.type == KEYUP:
            if event.key == K_w:
                player_selector.uvelocity += 15
            elif event.key == K_d:
                player_selector.rvelocity -= 15
            elif event.key == K_s:
                player_selector.dvelocity -= 15
            elif event.key == K_a:
                player_selector.lvelocity += 15

    def player2_selector_logic(self, event, player_selector):
        if event.type == KEYDOWN:
            if event.key == K_p:
                player_selector.uvelocity -= 15
            elif event.key == K_QUOTE:
                player_selector.rvelocity += 15
            elif event.key == K_SEMICOLON:
                player_selector.dvelocity += 15
            elif event.key == K_l:
                player_selector.lvelocity -= 15
        if event.type == KEYUP:
            if event.key == K_p:
                player_selector.uvelocity += 15
            elif event.key == K_QUOTE:
                player_selector.rvelocity -= 15
            elif event.key == K_SEMICOLON:
                player_selector.dvelocity -= 15
            elif event.key == K_l:
                player_selector.lvelocity += 15

    def detect_character(self, player_selector, character_possibilities):
        for character in pygame.sprite.spritecollide(player_selector, character_possibilities, False):
            return character

    def character_select_logic(self, event):
        if event.type == KEYDOWN:
            if event.key == K_t:
                self.character_select = False
                self.player1.direct = 'right'
                self.player2.direct = 'left'
                self.player1.image, self.player1.rect = _load_image(self.player1.idle[0], 250, 350)
                self.player2.image, self.player2.rect = _load_image(self.player2.idle[1], 650, 350)
                self.sprites.remove(self.falco, self.fox, self.samus, self.snake, self.pit, self.mewtwo, self.zelda, self.player1_selector, self.player2_selector)
                self.sprites.add(self.platform, self.player1, self.player2)
                self.playergroup.add(self.player1, self.player2)


    def detect_floor(self):
        for char in pygame.sprite.spritecollide(self.platform, self.playergroup, False):
            char.rect.y = (self.platform.rect.topleft[1] - char.rect.height)
            char.uvelocity = 0
            char.jumps = 2

    def detect_hit(self, receiver, hitboxes):
        for hitbox in pygame.sprite.spritecollide(receiver, hitboxes, True):
            receiver.percent += hitbox.damage
            receiver.knockback_calc(hitbox)

    def remove_projectiles(self, projectilegroup, spritegroup):
        for projectile in projectilegroup:
            x_left, _ = projectile.rect.topleft
            x_right, _ = projectile.rect.bottomright
            if (x_left <= 0) or (x_right >= locals.WIDTH):
                spritegroup.remove(projectile)


    def render(self, surface):
        surface.fill(Color(0, 0, 0))
        self.sprites.draw(surface)

        if self.p1win == True:
            surface.blit(self.p1victory, (0, 0))
        elif self.p2win == True:
            surface.blit(self.p2victory, (0, 0))

    def get_timelimit(self):
        return 60

    def char_logic1(self, event, charac):
        x, y = charac.rect.topleft
        if event.type == KEYDOWN:
            if event.key == K_w:
                self.jump_logic(charac)
            elif event.key == K_a:
                self.a_track = True
                charac.image, charac.rect = _load_image(charac.run[1], x, y)
                charac.lvelocity -= 10
                charac.direct = 'left'
            elif event.key == K_d:
                self.d_track = True
                charac.rvelocity += 10
                charac.image, charac.rect = _load_image(charac.run[0], x, y)
                charac.direct = 'right'
            elif event.key == K_LSHIFT:
                if charac.projectilecount > 0:
                    charac.projectilesound.play()
                    self.lshift_track = True
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y)
                        x, y = charac.rect.topright
                        charac.make_projectile(x, y, charac)
                    elif charac.direct == 'left':
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y)
                        x, y = charac.rect.topleft
                        charac.make_projectile(x, y, charac)
                    self.sprites.add(charac.projectile)
                    self.player1_projectiles.add(charac.projectile)
                    charac.projectilecount -= 1
                    if charac.projectilecount == 0:
                        charac.no_projectile_time = pygame.time.get_ticks()
        elif event.type == KEYUP:
            if event.key == K_a:
                charac.lvelocity += 10
                self.a_track = False
                if self.d_track == False:
                    if self.lshift_track == False:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                    elif self.lshift_track == True:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
                elif self.d_track == True:
                    if self.lshift_track == False:
                            charac.image, charac.rect = _load_image(charac.run[0], x, y)
                            charac.direct = 'right'
                    elif self.lshift_track == True:
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
            elif event.key == K_d:
                charac.rvelocity -= 10
                self.d_track = False
                if self.a_track == False:
                    if self.lshift_track == False:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                        elif charac.direct == 'left':    
                            charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                    elif self.lshift_track == True:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
                elif self.a_track == True:
                    if self.lshift_track == False:
                        charac.image, charac.rect = _load_image(charac.run[1], x, y)
                        charac.direct = 'left'
                    elif self.lshift_track == True:
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
            elif event.key == K_LSHIFT:
                self.lshift_track = False
                if (self.a_track == False) and (self.d_track == False):
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                    elif charac.direct == 'left':    
                        charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                elif (self.a_track == False) and (self.d_track == True):
                    charac.image, charac.rect = _load_image(charac.run[0], x, y)
                    charac.direct = 'right'
                elif (self.a_track == True) and (self.d_track == False):
                    charac.image, charac.rect = _load_image(charac.run[1], x, y)
                    charac.direct = 'left'
                elif (self.a_track == True) and (self.d_track == False):
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y)
                    elif charac.direct == 'left':
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y)

    def char_logic2(self, event, charac):
        x, y = charac.rect.topleft
        if event.type == KEYDOWN:
            if event.key == K_p:
                self.jump_logic(charac)
            elif event.key == K_l:
                self.l_track = True
                charac.image, charac.rect = _load_image(charac.run[1], x, y)
                charac.lvelocity -= 10
                charac.direct = 'left'
            elif event.key == K_QUOTE:
                self.quote_track = True
                charac.rvelocity += 10
                charac.image, charac.rect = _load_image(charac.run[0], x, y)
                charac.direct = 'right'
            elif event.key == K_RSHIFT:
                if charac.projectilecount > 0:
                    charac.projectilesound.play()
                    self.rshift_track = True
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y)
                        x, y = charac.rect.topright
                        charac.make_projectile(x, y, charac)
                    elif charac.direct == 'left':
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y)
                        x, y = charac.rect.topleft
                        charac.make_projectile(x, y, charac)
                    self.sprites.add(charac.projectile)
                    self.player2_projectiles.add(charac.projectile)
                    charac.projectilecount -= 1
                    if charac.projectilecount == 0:
                        charac.no_projectile_time = pygame.time.get_ticks()
        elif event.type == KEYUP:
            if event.key == K_l:
                charac.lvelocity += 10
                self.l_track = False
                if self.quote_track == False:
                    if self.rshift_track == False:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                    elif self.rshift_track == True:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
                elif self.quote_track == True:
                    if self.rshift_track == False:
                            charac.image, charac.rect = _load_image(charac.run[0], x, y)
                            charac.direct = 'right'
                    elif self.rshift_track == True:
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
            elif event.key == K_QUOTE:
                charac.rvelocity -= 10
                self.quote_track = False
                if self.l_track == False:
                    if self.rshift_track == False:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                        elif charac.direct == 'left':    
                            charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                    elif self.rshift_track == True:
                        if charac.direct == 'right':
                            charac.image, charac.rect = _load_image(charac.gun[0], x, y - 5)
                        elif charac.direct == 'left':
                            charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
                elif self.l_track == True:
                    if self.rshift_track == False:
                        charac.image, charac.rect = _load_image(charac.run[1], x, y)
                        charac.direct = 'left'
                    elif self.rshift_track == True:
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y - 5)
            elif event.key == K_RSHIFT:
                self.rshift_track = False
                if (self.l_track == False) and (self.quote_track == False):
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.idle[0], x, y - 10)
                    elif charac.direct == 'left':    
                        charac.image, charac.rect = _load_image(charac.idle[1], x, y - 10)
                elif (self.l_track == False) and (self.quote_track == True):
                    charac.image, charac.rect = _load_image(charac.run[0], x, y)
                    charac.direct = 'right'
                elif (self.l_track == True) and (self.quote_track == False):
                    charac.image, charac.rect = _load_image(charac.run[1], x, y)
                    charac.direct = 'left'
                elif (self.l_track == True) and (self.quote_track == False):
                    if charac.direct == 'right':
                        charac.image, charac.rect = _load_image(charac.gun[0], x, y)
                    elif charac.direct == 'left':
                        charac.image, charac.rect = _load_image(charac.gun[1], x, y)

    def jump_logic(self, ch):
        if ch.jumps == 2:
            ch.uvelocity = JUMP_BOOST
            ch.jumpsounds[randint(0, len(ch.jumpsounds) - 1)].play()
        elif ch.jumps == 1:
            ch.uvelocity = AIR_JUMP_BOOST
            ch.jumpsounds[randint(0, len(ch.jumpsounds) - 1)].play()
        ch.jumps -= 1
Exemple #5
0
class Room:
    """ base class for all rooms """

    # these variables are set in the subclass
    width = None
    height = None

    def __init__(self, screen):
        """ Initialization of our lists """
        self.wall_list = Group()
        self.coin_list = Group()
        self.plat_move = Group()
        self.door_list = OrderedUpdates()

        # the screen and its rect
        self.screen = screen
        self.screct = self.screen.get_rect()

        # the room's size and image
        self.rect = Rect(0, 0, self.width, self.height)
        self.bckimg = gf.get_checkboard(20, 20, self.width, self.height,
                                        [WHITE, GREY])
        #self.bckimg.fill(WHITE)

    def draw(self):
        """ Draw the room on the screen"""
        self.screen.blit(self.bckimg, self.rect)
        self.wall_list.draw(self.screen)
        self.door_list.draw(self.screen)
        self.coin_list.draw(self.screen)

    def move_room(self, move_x, move_y):
        """ Move all walls in the room """
        self.move_obj(move_x, move_y)
        self.rect.x += move_x
        self.rect.y += move_y

    def move_obj(self, move_x, move_y):
        """ Move all objects in the room, but not the room itself """
        self.wall_list.update(move_x, move_y)
        self.door_list.update(move_x, move_y)
        self.coin_list.update(move_x, move_y)

    def reset(self, player=None):
        """ reset the room rect's topleft to the topleft of the screen and
        move everything accordingly. """

        displace_x = self.screct.x - self.rect.x
        displace_y = self.screct.y - self.rect.y

        self.move_room(displace_x, displace_y)

        if player:
            player.rect.x += displace_x
            player.rect.y += displace_y

    def old_set_around(self, player):
        """ Move the room so that the room and the player are in the right place"""
        plax = player.rect.x
        play = player.rect.y
        roox = self.rect.x
        rooy = self.rect.y

        # check horizontal position
        if player.rect.centerx < self.rect.left + self.screct.centerx:
            self.rect.left = self.screct.left
            dis_x = self.rect.x - roox
            self.move_obj(dis_x, 0)
            player.rect.x += dis_x
        elif player.rect.centerx > self.rect.right - self.screct.centerx:
            self.rect.right = self.screct.right
            dis_x = self.rect.x - roox
            self.move_obj(dis_x, 0)
            player.rect.x += dis_x
        else:
            player.rect.centerx = self.screct.centerx
            dis_x = player.rect.x - plax
            self.move_room(dis_x, 0)

        # check vertical position
        if player.rect.centery < self.rect.top + self.screct.centery:
            self.rect.top = self.screct.top
            dis_y = self.rect.y - rooy
            self.move_obj(0, dis_y)
            player.rect.y += dis_y
        elif player.rect.centery > self.rect.bottom - self.screct.centery:
            self.rect.bottom = self.screct.bottom
            dis_y = self.rect.y - rooy
            self.move_obj(0, dis_y)
            player.rect.y += dis_y
        else:
            player.rect.centery = self.screct.centery
            dis_y = player.rect.y - play
            self.move_room(0, dis_y)

    def reset_coins(self):
        """ reset all coins """

        # improve this so it doesn't have to keep removing sprites already in the group
        self.coin_list.empty()

        self.get_coins()

    def get_coins(self):
        """ get the coins for the room, overloaded in subclasses """
        pass
Exemple #6
0
class EditorLevel(object):
  def __init__(self, editor, level_file=None):
    self.editor = editor
    self.font_manager = editor.font_manager

    if level_file is not None:
      (name, player_start, player_direction, board, enemies, powerups) = level_loader.load(level_file)
    else:
      player_start = None
      player_direction = None
      board = None
      enemies = []
      powerups = []

    self.board = Board(constants.HORIZONTAL_TILES, constants.VERTICAL_TILES)
    
    for x in xrange(0, constants.HORIZONTAL_TILES):
      for y in xrange(0, constants.VERTICAL_TILES):
        if board is None:
          if x == 0 or y == 0 or x == constants.HORIZONTAL_TILES - 1 or y == constants.VERTICAL_TILES - 1:
            tile = Tile("W", Point(x, y))
          else:
            tile = Tile("G", Point(x, y))
        else:
          tile = Tile(board.get_tile(x, y).type, Point(x, y))

        self.board.set_tile(x, y, tile) 
    self.tiles = OrderedUpdates([tile for tile in self.board])

    self.entities = Group()

    if player_start is not None:
      player_entity = Entity("PLAYER", editor_constants.ENTITY_DATA_MAP["PLAYER"], player_start, self.font_manager)
      player_entity.rotate(player_direction, 1)
      self.entities.add(player_entity)

    for (position, direction, waypoint_type, waypoints) in enemies:
      entity = Entity("ENEMY", editor_constants.ENTITY_DATA_MAP["ENEMY"], position, self.font_manager)
      entity.rotate(direction, 1)
      actual_waypoints = []
      for waypoint in waypoints:
        actual_waypoints.append(Entity("WAYPOINT", editor_constants.WAYPOINT_DATA, waypoint, self.font_manager))
      entity.waypoints.set_waypoints(actual_waypoints)
      self.entities.add(entity)

    for powerup in powerups:
      entity = Entity(powerup.type, editor_constants.ENTITY_DATA_MAP[powerup.type], powerup.position, self.font_manager)
      self.entities.add(entity)

    self.toolbars = Group()
    vertical_toolbar = VerticalToolbar(self, self.font_manager)
    self.toolbars.add(vertical_toolbar)

    self.player_exists = bool([entity for entity in self.entities if entity.name == "PLAYER"])
    self.entity_to_create = vertical_toolbar.selected.name
    self.mode = MODE_ADD

    self.rotating = False

    self.pending_actions = []
    self.action_stack = []
    self.undone_action_stack = []

    self.selected_entities = []
    self.waypoint_entity_selected = None      
  
  def add_action(self, action_type, *args):
    self.undone_action_stack = []
    self.pending_actions.append(action_type(self, *args))

  def get_entity(self, position):
    data = editor_constants.ENTITY_DATA_MAP[self.entity_to_create]
    return Entity(self.entity_to_create, data, position, self.font_manager)

  def add_entity(self, entity):
    if entity.name == "PLAYER":
      self.player_exists = True
    self.entities.add(entity)

  def remove_entity(self, entity):
    if entity.name == "PLAYER":
      self.player_exists = False
    self.entities.remove(entity)
    if entity in self.selected_entities:
      entity.select(False)
      self.selected_entities.remove(entity)
    
    if entity is self.waypoint_entity_selected:
      entity.select(False)
      self.waypoint_entity_selected = None

  def delete_selection(self):
    self.add_action(DeleteSelectionAction, list(self.selected_entities))

  def set_selection(self, entities):
    self.clear_selection()
    for entity in entities:
      if not entity in self.entities:
        raise Exception("Tried to select non-existent entity.")
      entity.select(True)
      self.selected_entities.append(entity)

  def clear_selection(self):
    for entity in self.selected_entities:
      entity.select(False)
    self.selected_entities = []

  def selection_click(self, entity, shift):
    if shift:
      if entity in self.selected_entities:
        entity.select(False)
        self.selected_entities.remove(entity)
      else:
        entity.select(True)
        self.selected_entities.append(entity)
    else:
      if entity in self.selected_entities:
        for entity in self.selected_entities:
          entity.select(False)
        self.selected_entities = []
      else:
        for other_entity in self.selected_entities:
          other_entity.select(False)
        entity.select(True)
        self.selected_entities = [entity]

  def left_click(self, position, pressed):
    for toolbar in self.toolbars:
      rect = pygame.Rect(toolbar.position, (toolbar.width, toolbar.height))
      if rect.collidepoint(position):
        toolbar.left_click(position, pressed)

    if self.mode == MODE_ADD:
      entity = self.get_entity(position)
      # make sure the entity doesn't intersect any others
      for other_entity in self.entities:
        if cd.sprite_collide(entity, other_entity):
          return
      # make sure the entity creation is in bounds
      if not sphere_in_bounds(position, entity.data.ratio / 2, editor_constants.EDITOR_AREA_BOUNDS):
        return
      if entity.name != "PLAYER" or not self.player_exists:
        self.add_action(AddEntityAction, entity)
    elif self.mode == MODE_SELECT:
      for entity in self.entities:
        if entity.contains_point(position):
          ctrl = (pressed[pygame.K_LCTRL] or pressed[pygame.K_RCTRL])
          self.selection_click(entity, ctrl)
          break
    elif self.mode == MODE_TILE:
      for tile in self.tiles:
        if cd.sprite_contains(tile, position.scale(constants.TILE_SIZE)):
          tile.toggle_type()
    elif self.mode == MODE_WAYPOINT:
      ctrl = (pressed[pygame.K_LCTRL] or pressed[pygame.K_RCTRL])
      if ctrl:
        if self.waypoint_entity_selected is not None:
          self.add_action(AddWaypointAction, self.waypoint_entity_selected, Entity("WAYPOINT", editor_constants.WAYPOINT_DATA, position, self.font_manager))
      else:
        for entity in self.entities:
          if entity.name == "ENEMY" and entity.contains_point(position):
            if self.waypoint_entity_selected is not None:
              self.waypoint_entity_selected.select(False)
            self.waypoint_entity_selected = entity
            entity.select(True)

  def switch_mode(self):
    if self.mode == MODE_ADD:
      self.mode = MODE_SELECT
    elif self.mode == MODE_SELECT:
      self.clear_selection()
      self.mode = MODE_WAYPOINT
    elif self.mode == MODE_WAYPOINT:
      if self.waypoint_entity_selected is not None:
        self.waypoint_entity_selected.select(False)
      self.waypoint_entity_selected = None
      self.mode = MODE_TILE
    elif self.mode == MODE_TILE:
      self.mode = MODE_ADD
    print self.mode

  def start_rotation(self, key):
    self.rotating = True
    self.total_rotation = 0
    for entity in self.selected_entities:
      entity.rotating = True
      entity.rotation_sign = (1 if key == pygame.K_RIGHT else -1)
    self.rotation_key = key

  def stop_rotation(self, key):
    self.rotating = False
    for entity in self.selected_entities:
      entity.rotating = False
    # directly append to action stack so that we 
    self.action_stack.append(RotateSelectionAction(self, self.selected_entities, self.total_rotation, (1 if key == pygame.K_RIGHT else -1)))

  def update(self, delta, events, pressed, mouse):
    if self.rotating:
      for event in events:
        if event.type == pygame.KEYUP and event.key == self.rotation_key:
          self.stop_rotation(event.key)
    else:
      for event in events:
        if event.type == pygame.KEYDOWN and (event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT) and event.mod & pygame.KMOD_CTRL and self.mode == MODE_SELECT and self.selected_entities:
          self.start_rotation(event.key)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_m:
          self.switch_mode()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_DELETE and self.mode == MODE_SELECT:
          self.delete_selection()
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_DELETE and self.mode == MODE_WAYPOINT:
          if self.waypoint_entity_selected is not None:
            self.add_action(DeleteWaypointsAction, self.waypoint_entity_selected)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_y and event.mod & pygame.KMOD_CTRL:
          if self.undone_action_stack:
            action = self.undone_action_stack.pop()
            action.undo = False
            self.pending_actions.append(action)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_z and event.mod & pygame.KMOD_CTRL:
          if self.action_stack:
            action = self.action_stack.pop()
            action.undo = True
            self.pending_actions.append(action)
        elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
          self.left_click(Point(event.pos[0], event.pos[1]).scale(1.0 / constants.TILE_SIZE), pressed)
        elif event.type == pygame.KEYDOWN:
          for toolbar in self.toolbars:
            toolbar.hotkey(event.key)

    for action in self.pending_actions:
      action.do()
      if action.undo:
        self.undone_action_stack.append(action)
      else:
        self.action_stack.append(action)
    self.pending_actions = []

    if self.rotating:
      self.total_rotation += 2 * math.pi * (delta / 1000.0)

    self.entities.update(delta)

  def draw(self, screen):
    self.tiles.draw(screen)
    self.entities.draw(screen)
    if self.waypoint_entity_selected is not None:
      self.waypoint_entity_selected.draw(screen)
    self.toolbars.draw(screen)
    for toolbar in self.toolbars:
      toolbar.draw(screen)
Exemple #7
0
class Game(object):
    title = 'Gravity'
    screen_size = 1000, 750
    
    def __init__(self,level=0):
        pygame.init()
        
        self.screen = pygame.display.set_mode(self.screen_size)
        if self.title:
            pygame.display.set_caption(self.title)
        self.fps = 30

        #group definitions
        self.userPlacedObjects = Group()
        self.startItems = RenderUpdates()
        self.playerGroup = RenderUpdates()
        self.tails = RenderUpdates()
        self.blackHoles = RenderUpdates()
        self.obstacles = RenderUpdates()
        self.masslessObstacles = RenderUpdates()
        self.goalCollide = Group()
        self.toolbar = OrderedUpdates()

        #level/transition/player & enemy/obstacle creation hocus pocus
        self.goal = Goal(573,372,self.goalCollide,30)
        self.bar = ToolBar(0,626,self.toolbar,self.screen,self,self.goal)
        self.player = Player(50,535,self.screen,(255,0,0),self.playerGroup,1000,624,(2,-2),self.tails,self)
        
        self.level = level
        self.levelUp = True
        self.stars = Starfield(self.screen,1000,626,200)
        BlackHole(339,70,self.blackHoles,self.screen,80,71,16)
        temp = EarthRounder(513,313,self.masslessObstacles,self.screen,40,0)
        temp.rotate(55)
        temp = Alien(60,188,self.masslessObstacles,self.screen,34,1)
        temp.rotate(-15)
        temp = Alien(107,268,self.masslessObstacles,self.screen,35,1)
        temp.rotate(-75)
        temp = Alien(816,533,self.masslessObstacles,self.screen,39,0)
        temp.rotate(-13)
        temp = BlueUpAnDown(811,227,self.masslessObstacles,self.screen,34,1,97,239)
        temp.rotate(80)
        self.obstacles.add(self.blackHoles)
        self.obstacles.add(self.goalCollide)
        self.freeb = False
        self.gotoLevel = level
        self.loaded = False

        if system.thereIsASaveFile() and level == 0:
            self.intro_screen = Intro(0,0,self.startItems,str('title_w_file.png'))
            self.thereIsAFile = True
        elif level == 0:
            self.intro_screen = Intro(0,0,self.startItems)
            self.thereIsAFile = False
      
    def quit(self):
        self.done = True
   
    def level_0(self):
        self.clock.tick(self.fps)
        pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
        
        for evt in pygame.event.get():
            if evt.type == QUIT:
                self.quit()
            if evt.type == KEYDOWN:
                if evt.key == K_ESCAPE:
                    self.quit()
                elif evt.key == K_RETURN:
                    if not self.thereIsAFile:
                        self.transition = Transition(-1314,0,self.screen,self.startItems)
                        self.intro_screen.begin()
                    else:
                        loadingDial = system.Loading()
                        pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
                        self.startItems.draw(self.screen)
                        loadingDial.draw(self.screen)
                        pygame.display.flip()
                        self.loadFile(system.loadFile())
                        
                elif evt.key == K_RIGHT:
                    self.intro_screen.instruct(True)
                elif evt.key == K_LEFT:
                    self.intro_screen.instruct(False)
                elif evt.key == K_n:
                    if self.thereIsAFile:
                        self.transition = Transition(-1314,0,self.screen,self.startItems)
                        self.intro_screen.begin()
                        self.transition = Transition(-1314,0,self.screen,self.startItems)
                elif evt.key == K_d:
                    if self.thereIsAFile:
                        os.remove('save.txt')
                        self.thereIsAFile = False
                        self.startItems.empty()
                        self.intro_screen = Intro(0,0,self.startItems)

       
        if self.intro_screen.next_level():
            self.level = 1
        
        
        self.startItems.update()
        self.stars.draw()
        self.goalCollide.draw(self.screen)
        self.toolbar.draw(self.screen)
        self.masslessObstacles.draw(self.screen)
        self.playerGroup.draw(self.screen)
        self.blackHoles.draw(self.screen)
        self.startItems.draw(self.screen)
        

        pygame.display.flip()

        

    def tick(self):
        self.clock.tick(self.fps)
        pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
        pos = pygame.mouse.get_pos()

        #inputs queue
        for evt in pygame.event.get():
            if evt.type == QUIT:
                self.quit()
            elif evt.type == KEYDOWN:
                if evt.key == K_ESCAPE and not self.bar.itemsTab.open and self.bar.grabbed == None:
                    self.bar.menuWidget.dropped()
                elif evt.key == K_ESCAPE and self.bar.grabbed == None:
                    self.bar.itemsTab.dropped()
                    self.bar.menuWidget.dropped()
                                        
            elif evt.type == MOUSEBUTTONDOWN:
                #print pos
                should_freebie = self.bar.collision_test(pos,self.player,evt.button)
                if should_freebie and not self.freeb:
                    self.freebie()
                    self.freeb = True
                if evt.button == 1:
                    for obj in self.userPlacedObjects:
                        if obj.rect.collidepoint(pos) and not self.player.makeANew and not self.bar.menuWidget.open:
                            obj.grab(pos)
                elif evt.button == 3:
                    for obj in self.userPlacedObjects:
                        if obj.rect.collidepoint(pos) and not self.player.makeANew and not self.bar.menuWidget.open:
                            obj.remove()
            elif evt.type == MOUSEBUTTONUP:
                self.bar.clear_grabbed()
                for obj in self.userPlacedObjects:
                    obj.drop(self.blackHoles)
             
   
        if self.level == 4 and self.player.makeANew:
            self.masslessObstacles.update()
   
        #self.masslessObstacles.update(self.player.makeANew)
        self.stars.draw()
        self.player.drawTails()
        self.blackHoles.update()
        self.bar.update(pos)
        self.blackHoles.draw(self.screen)
        self.userPlacedObjects.update(pos)
        self.userPlacedObjects.draw(self.screen)
        self.masslessObstacles.draw(self.screen)
        self.goalCollide.draw(self.screen)
        self.toolbar.draw(self.screen)
        self.playerGroup.update()
        self.playerGroup.draw(self.screen)  

        if len(self.playerGroup) == 0 and self.player.lives >1:
            self.bar.lives_update()
            self.bar.score.update(-200)
            pygame.time.wait(750)
            self.player.lives -= 1
            if self.level == 4:
                self.asteroid.reset()
            self.player.add(self.playerGroup)
        elif len(self.playerGroup) == 0:
            self.bar.score.update(-200)
            self.bar.lives_update()
            self.over_screen = GameOverScreen(293,161,self.screen)
            if self.level == 4:
                self.asteroid.reset()
            self.gameOver()
                
        if pygame.sprite.collide_mask(self.player, self.goal):
            if self.loaded != 0:
                self.level = self.loaded
                self.loaded = 0
            self.next_level()
            

        for obj in self.blackHoles:
            if pygame.sprite.collide_mask(self.player,obj):
                self.player.blackHoleCollision(True,False)

        for obj in self.masslessObstacles:
            if  pygame.sprite.collide_mask(self.player,obj):
                self.player.update(True)
        
        for obj in self.userPlacedObjects:
            if pygame.sprite.collide_mask(self.player,obj) and not obj.grabbed:
                self.player.update(True)
        

        pygame.display.flip()


    def next_level(self,add_score_bool=True,trans_effect=True):
        if self.level < 5:
            print self.level,"pre-adding"
            self.level += 1
            print self.level,"post-adding"
        #print self.level
        if self.level == 5:
            return
        if trans_effect: self.transition.add_to_group()
        changed = False
        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
            
            for evt in pygame.event.get():
                if evt.type == QUIT:
                    self.quit()
                if evt.type == KEYDOWN:
                    if evt.key == K_ESCAPE:
                        self.quit()
                        
            if not trans_effect or self.transition.rect.x >= -50 and not changed:
                print self.level
                if self.level == 2:
                    self.make_level_two(add_score_bool)
                if self.level == 3:
                    self.make_level_three(add_score_bool)
                if self.level == 4:
                    self.make_level_four(add_score_bool)

                if add_score_bool:
                    self.bar.score.update(2000)


                self.player.restart(add_score_bool)
                changed = True      

            if not trans_effect:
                print self.level,"load" 
                break
                
            self.startItems.update()
            self.stars.draw()
            self.player.drawTails()
            self.goalCollide.draw(self.screen)
            self.masslessObstacles.draw(self.screen)
            self.userPlacedObjects.draw(self.screen)
            self.toolbar.draw(self.screen)
            self.blackHoles.draw(self.screen)
            self.playerGroup.draw(self.screen)  
            self.startItems.draw(self.screen)
            if self.transition.rect.x > 1000:
                self.transition.kill()
                break


            pygame.display.flip()
        if trans_effect:
            self.transition.reset(-1314)
        print self.level,"end o loop"
        return False

    
    def freebie(self):
        groupus = Group()
        groupus.add(self.blackHoles,self.goal)
        self.player.makeANew = True
        self.player.addTail = False
        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
            
            for evt in pygame.event.get():
                if evt.type == QUIT:
                    self.quit()
                if evt.type == KEYDOWN:
                    if evt.key == K_ESCAPE:
                        self.quit()
            
            
            for obj in self.blackHoles:
                if pygame.sprite.collide_mask(self.player,obj):
                    self.player.blackHoleCollision(True,False)

            for obj in self.masslessObstacles:
                if  pygame.sprite.collide_mask(self.player,obj):
                    self.player.update(True)
        
            for obj in self.userPlacedObjects:
                if pygame.sprite.collide_mask(self.player,obj) and not obj.grabbed:
                    self.player.update(True)
            

            self.startItems.update()
            #self.masslessObstacles.update()
            self.stars.draw()
            self.player.drawTails()
            self.goalCollide.draw(self.screen)
            self.masslessObstacles.draw(self.screen)
            self.userPlacedObjects.draw(self.screen)
            self.toolbar.draw(self.screen)
            self.blackHoles.draw(self.screen)
            self.player.update(False,groupus)
            self.playerGroup.draw(self.screen)  
            self.startItems.draw(self.screen)
            if len(self.playerGroup) < 1:
                self.player.addTail = True
                pygame.time.wait(750)
                self.player.add(self.playerGroup)
                break
            pygame.display.flip()
            

    def gameOver(self):
        overing = True
        self.bar.update()
        self.toolbar.draw(self.screen)
        self.over_screen.draw()
        pygame.display.flip()
        while overing:
            self.clock.tick(self.fps)
            
            for evt in pygame.event.get():
                if evt.type == QUIT:
                    overing = False
                    self.quit()
                if evt.type == KEYDOWN:
                    if evt.key == K_ESCAPE:
                        overing = False
                        self.quit()
                    if evt.key == K_RETURN:
                        overing = False
            
            
        
        self.player.add(self.playerGroup)
        self.bar.reset_lives_over()
        self.player.restart()
        self.over_screen.kill()

    def inStructionees(self):
        self.instructions = Instructions(0,-750,self.startItems)
        self.instructions.instruct(True)

        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))

            if self.instructions.instruct and self.instructions.rect.y < 0:
                self.instructions.rect.y += 50

            elif not self.instructions.instruct and self.instructions.rect.y > -750:
                self.instructions.rect.y -= 50
            elif not self.instructions.instruct and self.instructions.rect.y <= -750:
                self.instructions.kill()
                return
            
            
            for evt in pygame.event.get():
                if evt.type == QUIT:
                    self.quit()
                    return
                elif evt.type == KEYDOWN:
                    if evt.key == K_RETURN:
                        self.instructions.instruct = False
                    elif evt.key == K_ESCAPE:
                        self.quit()
                        return

            self.stars.draw()
            self.player.drawTails()
            self.goalCollide.draw(self.screen)
            self.masslessObstacles.draw(self.screen)
            self.userPlacedObjects.draw(self.screen)
            self.toolbar.draw(self.screen)
            self.blackHoles.draw(self.screen)
            self.playerGroup.draw(self.screen)  
            self.startItems.draw(self.screen)
                
            pygame.display.flip()
    
    def saveFile(self):
        save_confirm = GameOverScreen(293,161,self.screen,str('filesaved.png'))
        save_confirm.draw()
        self.bar.menuWidget.dropped()
        system.saveFile(self.level,self.player.lives,self.bar.score.score)
        pygame.display.flip()
        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))

            for evt in pygame.event.get():
                if evt.type == QUIT:
                    self.quit()
                    return
                elif evt.type == KEYDOWN:
                    if evt.key == K_RETURN:
                        return
                    elif evt.key == K_ESCAPE:
                        self.quit()
                        return

            
    def loadFile(self,file_tuple):
        gotoLevel,gotoLives,gotoScore = file_tuple
        self.level = gotoLevel
        if self.level > 1:
            self.loaded = self.level
        self.player.lives = gotoLives
        self.bar.lives.next_life = gotoLives+1
        self.bar.lives_update()
        self.bar.score.reset(gotoScore)
        if gotoLevel != 1:
            self.level -= 1
            self.next_level(False,False)
        self.startItems.empty()
        self.intro_screen = Intro(0,0,self.startItems,str('title_w_file.png'))
        self.intro_screen.begin()
        self.transition = Transition(-1314,0,self.screen,self.startItems)

        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
            
            
            if self.intro_screen.next_level():
                break
            
            self.startItems.update()
            self.startItems.update()
            self.stars.draw()
            self.goalCollide.draw(self.screen)
            self.toolbar.draw(self.screen)
            self.masslessObstacles.draw(self.screen)
            self.playerGroup.draw(self.screen)
            self.blackHoles.draw(self.screen)
            self.startItems.draw(self.screen)
            
            
            pygame.display.flip()

        
    def gameWinner(self):
        self.clock.tick(self.fps)
        pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
            
            
        for evt in pygame.event.get():
            if evt.type == QUIT:
                self.quit()
                
            elif evt.type == KEYDOWN:
                self.quit()
            
        self.winnerScreen.draw()
        pygame.display.flip()
        
    def run(self,level=0):
        self.done = False
        self.clock = pygame.time.Clock()
        if self.gotoLevel > 1 and self.gotoLevel < 4:
            self.transition = Transition(-1314,0,self.screen,self.startItems)
            self.tick()
            self.level = self.gotoLevel
            self.next_level()
        while not self.done:
            while self.level == 0 and not self.done:
                self.level_0()
            while self.level >= 1 and self.level < 5 and not self.done:
                self.tick()
            self.winnerScreen = WinScreen(0,0,self.screen)
            while not self.done:
                self.gameWinner()


    def make_level_two(self,reset_lives_bool):
        self.tails.empty()
        self.goal.next_level(self.level)
        self.bar.next_level(self.level,reset_lives_bool)
        self.userPlacedObjects.empty()
        self.blackHoles.empty()
        self.obstacles.empty()
        self.freeb = False
        self.bar.itemsTab.earth_item.light()
        self.masslessObstacles.empty()
        temp = Alien(55,143,self.masslessObstacles,self.screen,39,1)
        temp.rotate(-66)
        temp = Alien(189,98,self.masslessObstacles,self.screen,36,1)
        temp.rotate(23)
        temp = Alien(107,228,self.masslessObstacles,self.screen,32,1)
        temp.rotate(17)
        temp = BlueUpAnDown(249,244,self.masslessObstacles,self.screen,41,1,204,245)
        temp.rotate(80)
        temp = TwitchyOnes(898,541,self.masslessObstacles,self.screen,45,2)
        temp.rotate(22)
        temp = TwitchyOnes(730,545,self.masslessObstacles,self.screen,40,2)
        temp.rotate(-30)
        temp = Rotator(525,121,self.masslessObstacles,self.screen,50,0,-70)
        BlackHole(842,388,self.blackHoles,self.screen,80,71,16)
        hole = BlackHole(388,189,self.blackHoles,self.screen,80,71,16)
        hole.flip()
        self.obstacles.add(self.blackHoles)
        self.obstacles.add(self.goal)

    def make_level_three(self,reset_lives_bool):
        self.goal.next_level(self.level)
        self.bar.next_level(self.level,reset_lives_bool)
        self.userPlacedObjects.empty()
        self.blackHoles.empty()
        self.obstacles.empty()
        self.freeb = False
        self.bar.itemsTab.earth_item.light()
        self.masslessObstacles.empty()
        temp = Alien(519,257,self.masslessObstacles,self.screen,28,3)
        temp.rotate(18)
        temp = Alien(539,247,self.masslessObstacles,self.screen,27,3)
        temp.rotate(60)
        temp = Alien(555,240,self.masslessObstacles,self.screen,25,3)
        temp.rotate(-20)
        temp = Alien(568,281,self.masslessObstacles,self.screen,29,3)
        temp.rotate(-45)
        temp = Alien(549,291,self.masslessObstacles,self.screen,32,3)
        temp.rotate(10)
        temp = Alien(530,301,self.masslessObstacles,self.screen,26,3)
        temp = Alien(562,265,self.masslessObstacles,self.screen,27,3)
        temp.rotate(25)   
        temp = Alien(519,334,self.masslessObstacles,self.screen,25,3)
        temp.rotate(-70)
        temp = Alien(500,307,self.masslessObstacles,self.screen,25,3)
        temp.rotate(-80)
        temp = Alien(494,356,self.masslessObstacles,self.screen,25,3)
        temp.rotate(-3)
        temp = Alien(560,365,self.masslessObstacles,self.screen,25,3)
        temp.rotate(77)
        temp = Alien(525,374,self.masslessObstacles,self.screen,29,3)
        temp.rotate(33)
        temp = Alien(640,290,self.masslessObstacles,self.screen,26,3)
        temp.rotate(37)
        temp = Alien(607,250,self.masslessObstacles,self.screen,33,3)
        temp.rotate(-27)  
        temp = Alien(518,421,self.masslessObstacles,self.screen,24,3)
        temp.rotate(55)
        temp = Alien(473,419,self.masslessObstacles,self.screen,28,3)
        temp.rotate(-43)
        temp = Alien(480,453,self.masslessObstacles,self.screen,27,3)
        temp = Alien(512,479,self.masslessObstacles,self.screen,31,3)
        temp.rotate(4)
        temp = Alien(422,500,self.masslessObstacles,self.screen,32,3)
        temp = Alien(463,521,self.masslessObstacles,self.screen,27,3)
        temp.rotate(22)
        temp = Alien(471,486,self.masslessObstacles,self.screen,22,3)
        temp.rotate(80)
        temp = Alien(743,713,self.masslessObstacles,self.screen,25,3)
        temp.rotate(13)
        temp = Alien(527,532,self.masslessObstacles,self.screen,28,3)
        temp.rotate(-8)
        temp = Alien(568,559,self.masslessObstacles,self.screen,27,3)
        temp = Alien(527,593,self.masslessObstacles,self.screen,23,3)
        temp.rotate(-60)
        temp = Alien(652,552,self.masslessObstacles,self.screen,25,3)
        temp.rotate(-24)
        temp = Alien(636,581,self.masslessObstacles,self.screen,26,3)
        temp.rotate(-19)
        temp = Alien(714,596,self.masslessObstacles,self.screen,22,3)
        temp.rotate(-88)
        BlackHole(162,42,self.blackHoles,self.screen,80,71,29)
        self.obstacles.add(self.goal)
        self.obstacles.add(self.blackHoles)

    def make_level_four(self,reset_lives_bool):
        self.goal.next_level(self.level)
        self.bar.next_level(self.level,reset_lives_bool)
        self.userPlacedObjects.empty()
        self.blackHoles.empty()
        self.obstacles.empty()
        self.freeb = False
        self.bar.itemsTab.earth_item.light()
        self.masslessObstacles.empty()
        BlackHole(183,61,self.blackHoles,self.screen,80,71,16)
        BlackHole(101,157,self.blackHoles,self.screen,80,71,16)
        BlackHole(234,157,self.blackHoles,self.screen,80,71,16)
        BlackHole(178,250,self.blackHoles,self.screen,80,71,16)
        hole = BlackHole(683,41,self.blackHoles,self.screen,80,71,16)
        hole = BlackHole(577,41,self.blackHoles,self.screen,80,71,16)
        hole = BlackHole(646,133,self.blackHoles,self.screen,80,71,16)
        hole = BlackHole(747,133,self.blackHoles,self.screen,80,71,16)
        self.asteroid = Asteroid(840,530,self.masslessObstacles,self.screen,55,4)
        self.asteroid.rotate(137)

        self.obstacles.add(self.blackHoles)
        self.obstacles.add(self.goal)