Exemple #1
0
 def build(self):
     Window.size = (320, 480)
     sm = ScreenManager()
     sm.add_widget(
         SplashScreen(name='SplashScreen', sm=sm, switchTo='_2048Game'))
     sm.add_widget(_2048Game(name='_2048Game'))
     sm.current = 'SplashScreen'
     #sm.current = '_2048Game'
     return sm
Exemple #2
0
 def appStarted(app):
     app.splashScreen = SplashScreen()
     app.suit = Suit()
     app.informationScreen = InformationScreen()
     app.draft = DraftMode()
     app.teamPage = TeamPage()
     app.simulateGame = SimulateGame()
     app.gameOverScreen = GameOverScreen()
     app.setActiveMode(app.splashScreen)
Exemple #3
0
    def __init__(self, argv, hidden=False):
        super(CollectorApplication, self).__init__(argv)

        # Create and display the splash screen
        if not hidden:
            self.splash = SplashScreen()
            self.splash.show()
        self.processEvents()
        self.view = None
        self.uri = None
        self.home = None
        if argv is not None:
            self.parse_args(argv)
        # Launch collector
        self.collector = Collector(self.home)

        self.load_translations(":/lang")

        # Create the main window
        # FIXME: Some view variables are language dependent,
        # is needed to import them after load the language settings
        from mainwindow import MainWindow

        self.main = MainWindow()
        self.main.views = CollectorApplication.get_views(self.main)
        self.main.display_view('dashboard')

        if not hidden:
            # Show main window
            self.main.show()
            # Hide splash
            self.splash.finish(self.main)

        # Bring window to front if development
        if 'COLLECTION_PATH' in os.environ:
            self.main.raise_()

        if self.view is not None:
            self.main.display_view(self.view)
        elif self.uri is not None:
            self.main.collector_uri_call(self.uri)
Exemple #4
0
 def __init__(self, profile):
     self._splash = SplashScreen()
     QMainWindow.__init__(self)
     self.setupUi(self)
     
     self._profile = profile
     self.rollback_button.clicked.connect(self.load)
     self.commit_button.clicked.connect(self.commit)
     self.key_list.currentItemChanged.connect(self.key_item_selected)
     self.key_list.itemChanged.connect(self.key_item_changed)
     self.server_tree.itemChanged.connect(self.server_item_selected)
     
     self.add_key_button.clicked.connect(self.import_key)
     self.remove_key_button.clicked.connect(self.remove_key)
     
     self.action_import_key.triggered.connect(self.import_key)
     self.action_profiles.triggered.connect(self.open_profiles)
     self.action_exit.triggered.connect(self.close)
     self.action_about.triggered.connect(self.about)
     
     self.load()
     self.move(self._splash.pos() + self._splash.rect().center() - self.rect().center());
Exemple #5
0
class CollectorApplication(QtGui.QApplication):
    """The GUI Application for Collector"""

    translators = {}
    current = None
    collector = None

    def __init__(self, argv, hidden=False):
        super(CollectorApplication, self).__init__(argv)

        # Create and display the splash screen
        if not hidden:
            self.splash = SplashScreen()
            self.splash.show()
        self.processEvents()
        self.view = None
        self.uri = None
        self.home = None
        if argv is not None:
            self.parse_args(argv)
        # Launch collector
        self.collector = Collector(self.home)

        self.load_translations(":/lang")

        # Create the main window
        # FIXME: Some view variables are language dependent,
        # is needed to import them after load the language settings
        from mainwindow import MainWindow

        self.main = MainWindow()
        self.main.views = CollectorApplication.get_views(self.main)
        self.main.display_view('dashboard')

        if not hidden:
            # Show main window
            self.main.show()
            # Hide splash
            self.splash.finish(self.main)

        # Bring window to front if development
        if 'COLLECTION_PATH' in os.environ:
            self.main.raise_()

        if self.view is not None:
            self.main.display_view(self.view)
        elif self.uri is not None:
            self.main.collector_uri_call(self.uri)

    def parse_args(self, argv):
        """Parse argv, the input arguments"""
        if '--view' in argv:
            self.view = argv[argv.index('--view') + 1]
        elif '--uri' in argv:
            self.uri = argv[argv.index('--uri') + 1]
        if '--home' in argv:
            self.home = self._checkhome(argv[argv.index('--home') + 1])
        elif '-h' in argv:
            self.home = self._checkhome(argv[argv.index('-h') + 1])

    def _checkhome(self, value):
        """Checks the home value"""
        truehome = os.path.realpath(value)
        if truehome is None:
            raise Exception("Wrong home folder")
            self.quit()
        return truehome

    # The language code selector is from:
    # "switch translations dynamically in a PyQt4 application"
    #
    # PyQt version by Hans-Peter Jansen <*****@*****.**>

    def load_translations(self, folder):
        """Loads the transaltions from the parameter folder, the translations
         must match the pattern *_*.qm"""
        if not isinstance(folder, QtCore.QDir):
            folder = QtCore.QDir(folder)
        pattern = "*_*.qm"  # <language>_<country>.qm
        filters = QtCore.QDir.Files | QtCore.QDir.Readable
        sort = QtCore.QDir.SortFlags(QtCore.QDir.Name)
        for lang_file in folder.entryInfoList([pattern], filters, sort):
            # pick country and language out of the file name
            language, country = lang_file.baseName().split("_", 1)
            language = language.toLower()
            country = country.toUpper()
            locale = language + "_" + country
            # only load translation, if it does not exist already
            if not locale in CollectorApplication.translators:
                # create and load translator
                translator = QtCore.QTranslator(self.instance())
                if translator.load(lang_file.absoluteFilePath()):
                    CollectorApplication.translators[locale] = translator

        system = QtCore.QLocale.system()
        # Get user language from collector.conf
        user_language = self.collector.conf('lang')
        # if user_language is ':system:' or is empty, use the system language
        if user_language in [':system:', '']:
            user_language = system.name()
        # Look if the user_language exists, then set as current language
        for lang in CollectorApplication.available_languages():
            if str(lang) == user_language:
                # language match the current system
                CollectorApplication.set_language(lang)

    @staticmethod
    def available_languages():
        """ Returns the avaible languages (code_country) as a list"""
        return sorted(CollectorApplication.translators.keys())

    @staticmethod
    def set_language(locale):
        """ Sets the language of the application using the deseired locale"""
        app = CollectorApplication
        if app.current:
            app.removeTranslator(app.current)
        app.current = app.translators.get(locale, None)
        if app.current is not None:
            app.installTranslator(app.current)
            qt_qm = app.translators.get('qt' + locale[2:], None)
            if qt_qm is not None:
                app.installTranslator(qt_qm)

    @staticmethod
    def get_views(parent):
        """ Initialize the avaible views, each view is loaded by a provider"""
        return {
            'dashboard': DashboardView(parent),
            'fitxa': FitxaView(parent),
            'edit': FitxaEditView(parent),
            'collection': CollectionView(parent),
            'add': FitxaNewView(parent),
            'search': SearchView(parent),
            'discover': DiscoverView(parent),
            'preferences': PreferencesView(parent),
            'quicksearch': SearchDialog(parent),
            'properties': PropertiesView(parent),
            'pluginfile': PluginFileView(parent),
            'filters': AdvancedSearch(parent),
            'import': ImportView(parent),
            'export': ExportView(parent),
        }
Exemple #6
0
    def __init__(self, x, y, width, height):
        SplashScreen.__init__(self, x, y, width, height)
        self.logo = PhysicsBody(0, 0, width, height, ASSET.studio_logo)
        self.state = STATE.logo

        self.assemble()
Exemple #7
0
class MainWindow(QMainWindow, Ui_main):
    
    _servers = {}
    _keys = {}
    _commit_keys = {}
    _items = {}
    _splash = None
    
    _profile = None
    
    _selected_key_name = None
    _reload_profiles = False
 
    def __init__(self, profile):
        self._splash = SplashScreen()
        QMainWindow.__init__(self)
        self.setupUi(self)
        
        self._profile = profile
        self.rollback_button.clicked.connect(self.load)
        self.commit_button.clicked.connect(self.commit)
        self.key_list.currentItemChanged.connect(self.key_item_selected)
        self.key_list.itemChanged.connect(self.key_item_changed)
        self.server_tree.itemChanged.connect(self.server_item_selected)
        
        self.add_key_button.clicked.connect(self.import_key)
        self.remove_key_button.clicked.connect(self.remove_key)
        
        self.action_import_key.triggered.connect(self.import_key)
        self.action_profiles.triggered.connect(self.open_profiles)
        self.action_exit.triggered.connect(self.close)
        self.action_about.triggered.connect(self.about)
        
        self.load()
        self.move(self._splash.pos() + self._splash.rect().center() - self.rect().center());
        
    def load(self, action=u'load'):   
        self.key_list.blockSignals(True)
         
        if action == u'commit':
            self._commit_keys = self._keys
        else:
            self._commit_keys = {}
        self._keys = {}
        self._items = {}
         
        self.hide() 
        self._splash.setProgress(0.0, u'Loading server list...')
        self._splash.show()
        
        for _ in range(20):
            time.sleep(0.001)
            QApplication.processEvents()
        
        try:
            self.load_server_list()
            self.load_key_list(action)
            
            self._splash.hide()
            self.show()
            self.key_list.blockSignals(False)
            
            item = self.key_list.item(0)
            item.setSelected(True)
            self.key_item_selected(item)
        except (jsonschema.SchemaError, jsonschema.ValidationError) as ex:
            self.key_list.blockSignals(False)
            self.server_tree.blockSignals(False)
            self._splash.close()
            raise ex
        
    def load_server_list(self):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        try:
            ssh.connect(self._profile[u'host'], username=self._profile[u'user'], 
                        key_filename=self._profile[u'key'] if self._profile[u'key'] else None,
                        timeout=self._profile[u'timeout'])
        except socket.error as ex:
            self._splash.close()
            raise ex
        
        _, stdout, stderr = ssh.exec_command('cat %s' % self._profile['file'])
        error = stderr.read()
        if error:
            raise NameError(error)
        schema_file = open('media/servers-schema-1.0.json', 'r')
        schema = json.load(schema_file)
        schema_file.close()
        self._servers = json.load(stdout)
        validate(self._servers, schema)
        ssh.close()
        
        self.server_tree.blockSignals(True)
        self._items = {}
        while self.server_tree.topLevelItemCount() > 0:
            self.server_tree.takeTopLevelItem(0)
        for group, servers in self._servers[u'servers'].items():
            group_item = self.add_server_tree_item(group)
            for server_name, server in servers.items():
                server_item = self.add_server_tree_item(server_name, group_item)
                for user in server[u'users']:
                    item = self.add_server_tree_item(user, server_item, True)
                    self._items[server_name] = {user: item}          
        self.server_tree.expandAll()
        self.server_tree.blockSignals(False)
        
    def add_server_tree_item(self, label, parent=None, is_leaf=False):
        item = QTreeWidgetItem(parent)
        item.setText(0, unicode(label))
        if is_leaf:
            item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
        self.server_tree.addTopLevelItem(item)
        return item      
            
    def load_key_list(self, action):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
          
        total = 1
        for servers in self._servers[u'servers'].values():
            for server in servers.values():
                total += len(server[u'users'])  
        
        i=0
        for servers in self._servers[u'servers'].values():
            for server_name, server in sorted(servers.items()):
                for user in server[u'users']:
                    i += 1
                    self._splash.setProgress(float(i)/float(total), u'%s %s %s settings...' % (u'Writing' if action == u'commit' else u'Loading', server_name, user))
                    self.load_key_list_from(ssh, server_name, server[u'host'], user, action)
            
        self.reload_key_list()
        
    def reload_key_list(self):
        while self.key_list.count() > 0:
            self.key_list.takeItem(0)
        for key in sorted(self._keys.keys()):
            item = QListWidgetItem(unicode(key))
            item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable)
            item.setData(Qt.UserRole, unicode(key))
            self.key_list.addItem(item)
        
    def load_key_list_from(self, ssh, server_name, host, user, action):
        try:
            ssh.connect(host, username=user, key_filename=self._profile[u'key'] if self._profile[u'key'] else None,
                        timeout=self._profile[u'timeout'])
        except:
            ssh.close()
            self.server_tree.blockSignals(True)
            self._items[server_name][user].setDisabled(True)
            self.server_tree.blockSignals(False)
            return
              
        if action == u'commit':
            sftp = ssh.open_sftp()
            keyfile = sftp.open('./.ssh/authorized_keys.new', 'w')

            content = u''
            for keyname, key in self._commit_keys.items():
                if (server_name, user) in key[u'servers']:
                    content += (key[u'full'] + u'\n' )
            keyfile.write(content)
            keyfile.close()
            sftp.close()
            ssh.exec_command('mv ./.ssh/authorized_keys.new ./.ssh/authorized_keys')
        
        _, stdout, _ = ssh.exec_command('cat ./.ssh/authorized_keys')
        for line in stdout.readlines():
            keyline = unicode(line).split(' ')
            if len(keyline) == 3:
                proto = keyline[0].rstrip()
                key = keyline[1].rstrip()
                keyname = keyline[2].rstrip()
                
                for i_keyname, i_key in self._keys.items():
                    if i_keyname != keyname and i_key[u'proto'] == proto and i_key[u'key'] == key:
                        keyname = i_keyname
                
                i = 1
                while self._keys.has_key(keyname):
                    if self._keys[keyname][u'proto'] != proto or self._keys[keyname][u'key'] != key:
                        i += 1
                        keyname = keyline[2] + u'_%s' % i
                    else:
                        if not (server_name, user) in self._keys[keyname][u'servers']:
                            self._keys[keyname][u'servers'].append((server_name, user))
                        break
                        
                if not self._keys.has_key(keyname):
                    self._keys[keyname] = {u'proto' : proto, u'key' : key, u'full' : line.rstrip(), u'servers' : [(server_name, user)]}
        
        ssh.close()
                
    def key_item_selected(self, item):
        if not item:
            return
        
        self.server_tree.blockSignals(True)
        self._selected_key_name = unicode(item.text())
        key = self._keys[self._selected_key_name]
        self.key_edit.setText(key[u'full'])
        for server, users in self._items.items():
            for user, item in users.items():
                if (server, user) in key[u'servers']:
                    item.setCheckState(0, Qt.Checked)
                else:
                    item.setCheckState(0, Qt.Unchecked)
        self.server_tree.blockSignals(False)
        
    def key_item_changed(self, item):
        if unicode(item.text()) != unicode(item.data(Qt.UserRole).toString()):
            self._keys[unicode(item.text())] = self._keys.pop(unicode(item.data(Qt.UserRole).toString()))
            self._keys[unicode(item.text())][u'full'] = '%s %s %s' % (self._keys[unicode(item.text())][u'proto'],
                                                                      self._keys[unicode(item.text())][u'key'],
                                                                      unicode(item.text()))
            item.setData(Qt.UserRole, unicode(item.text()))
                
    def server_item_selected(self, item):
        user = unicode(item.text(0))
        server_name = unicode(item.parent().text(0))
        if item.checkState(0) == Qt.Checked:
            if (server_name, user) not in self._keys[self._selected_key_name][u'servers']:
                self._keys[self._selected_key_name][u'servers'].append((server_name, user))
        else:
            if (server_name, user) in self._keys[self._selected_key_name][u'servers']:
                self._keys[self._selected_key_name][u'servers'].remove((server_name, user))
     
    def commit(self):
        self.load(u'commit')
        
    def import_key(self):
        add_key_dialog = AddKeyDialog()
        add_key_dialog.exec_()
        new_key = add_key_dialog.key()
        if new_key:
            self._keys[new_key['keyname']] = {
                u'proto' : new_key['proto'], 
                u'key' : new_key['key'], 
                u'full' : new_key['full'], 
                u'servers' : []
            }
            item = QListWidgetItem(unicode(new_key[u'keyname']))
            self.key_list.addItem(item)
            self.key_list.sortItems()
            item.setSelected(True)
            self.key_item_selected(item)

    def remove_key(self):
        del self._keys[self._selected_key_name]
        self.reload_key_list()
    
        item = self.key_list.item(0)
        item.setSelected(True)
        self.key_item_selected(item)
        
    def reload_profiles(self):
        if self._reload_profiles:
            self._reload_profiles = False
            return True
        return False
        
    def open_profiles(self):
        self._reload_profiles = True
        self.close()

    def about(self):
        QMessageBox.about(self.parent(), u"About SSH key manager", 
                          u"<big><b>SSH key manager</b></big><br/><i>v1.0_alpha1</i><br/><br/>" + 
                          u"<b>Author:</b>" + u"<br/>Hervé Martinet<br/><br/>" +
                          u'<b>Splashscreen Photo:</b><br/>Joel Bennett<br/><a href="http://www.flickr.com/photos/jaykul/">http://www.flickr.com/photos/jaykul/</a>' +
                          u'<br/><i>licensed under a Creative Commons (CC BY-NC-SA 2.0)</i><br/><br/>' +
                          u'<b>Icon Set:</b><br/>Default Icon by interactivemania<br/><a href="http://www.defaulticon.com/">http://www.defaulticon.com/</a>' +
                          u'<br/><i>licensed under a Creative Commons (CC BY-ND 3.0)</i>') 
Exemple #8
0
    def __init__(self):
        pygame.init()
        pygame.font.init()
        pygame.mixer.init()

        os.environ["SDL_VIDEO_CENTERED"] = "1"

        self.screen = SCREEN.display
        self.fpsClock = pygame.time.Clock()
        self.fps = GAME.fps
        self.ticks = 0
        self.firstrun = True

        self.music = Music("mainmenu.ogg", 0.5, -1)
        self.menu_music = False
        self.game_music = False

        self.game_time = GameText("0", 24, True)
        self.game_time.font_file = FONT.default
        self.game_time.centerx = SCREEN.width/2
        self.game_time.y = 18
        self.game_time.color = COLOR.white
        self.game_time.create()
        self.timer_red = False
        self.flash_timer = 0

        self.p1_score = GameText("0", 24, True)
        self.p1_score.font_file = FONT.default
        self.p1_score.left = 30
        self.p1_score.y = 18
        self.p1_score.color = COLOR.blue_sea
        self.p1_score.create()

        self.p2_score = GameText("0", 24, True)
        self.p2_score.font_file = FONT.default
        self.p2_score.right = SCREEN.width - 30
        self.p2_score.y = 18
        self.p2_score.color = COLOR.petal_green
        self.p2_score.create()

        self.bg_text = GameText("01", 72, True)
        self.bg_text.font_file = FONT.kenpixel_blocks
        self.bg_text.centerx = SCREEN.width/2
        self.bg_text.centery = SCREEN.height/2
        self.bg_text.color = COLOR.gray7
        self.bg_text.create()

        self.state = STATE.logo
        self.stage_number = 1
        self.stage = Stage(self.stage_number)
        self.hi_score = 0
        self.splashscreen = SplashScreen(0, 0, SPLASHSCREEN.width, SPLASHSCREEN.height)
        self.logoscreen = LogoScreen(0, 0, LOGO.width, LOGO.height)
        self.timer = GAME.time
        self.totalscore = 0

        self.p1_scores = {}
        self.p2_scores = {}

        self.camera = Camera(self.complex_camera, self.stage.level.width, self.stage.level.height)        

        self.bg = SCREEN.bg
        self.screen_color = (choice(COLOR.colors))
        self.menu = Menu(SCREEN.width, SCREEN.height, self.screen_color)
        self.score_screen = ScoreScreen()
        self.controls_screen = Controls()

        self.screen_number = 1
        self.capture_video = False

        self.countdownOverlay = CountDownOverlay()
        self.intro = True
        self.intro_countdown = self.fps * 4
        
        self.scanlines = ScanLines()

        self.controller_present = False
        try:
            self.player1_joy = pygame.joystick.Joystick(0)
            self.player1_joy.init()
            self.controller_present = True
        except:
            pass
Exemple #9
0
class GameEngine(object):
    def __init__(self):
        pygame.init()
        pygame.font.init()
        pygame.mixer.init()

        os.environ["SDL_VIDEO_CENTERED"] = "1"

        self.screen = SCREEN.display
        self.fpsClock = pygame.time.Clock()
        self.fps = GAME.fps
        self.ticks = 0
        self.firstrun = True

        self.music = Music("mainmenu.ogg", 0.5, -1)
        self.menu_music = False
        self.game_music = False

        self.game_time = GameText("0", 24, True)
        self.game_time.font_file = FONT.default
        self.game_time.centerx = SCREEN.width/2
        self.game_time.y = 18
        self.game_time.color = COLOR.white
        self.game_time.create()
        self.timer_red = False
        self.flash_timer = 0

        self.p1_score = GameText("0", 24, True)
        self.p1_score.font_file = FONT.default
        self.p1_score.left = 30
        self.p1_score.y = 18
        self.p1_score.color = COLOR.blue_sea
        self.p1_score.create()

        self.p2_score = GameText("0", 24, True)
        self.p2_score.font_file = FONT.default
        self.p2_score.right = SCREEN.width - 30
        self.p2_score.y = 18
        self.p2_score.color = COLOR.petal_green
        self.p2_score.create()

        self.bg_text = GameText("01", 72, True)
        self.bg_text.font_file = FONT.kenpixel_blocks
        self.bg_text.centerx = SCREEN.width/2
        self.bg_text.centery = SCREEN.height/2
        self.bg_text.color = COLOR.gray7
        self.bg_text.create()

        self.state = STATE.logo
        self.stage_number = 1
        self.stage = Stage(self.stage_number)
        self.hi_score = 0
        self.splashscreen = SplashScreen(0, 0, SPLASHSCREEN.width, SPLASHSCREEN.height)
        self.logoscreen = LogoScreen(0, 0, LOGO.width, LOGO.height)
        self.timer = GAME.time
        self.totalscore = 0

        self.p1_scores = {}
        self.p2_scores = {}

        self.camera = Camera(self.complex_camera, self.stage.level.width, self.stage.level.height)        

        self.bg = SCREEN.bg
        self.screen_color = (choice(COLOR.colors))
        self.menu = Menu(SCREEN.width, SCREEN.height, self.screen_color)
        self.score_screen = ScoreScreen()
        self.controls_screen = Controls()

        self.screen_number = 1
        self.capture_video = False

        self.countdownOverlay = CountDownOverlay()
        self.intro = True
        self.intro_countdown = self.fps * 4
        
        self.scanlines = ScanLines()

        self.controller_present = False
        try:
            self.player1_joy = pygame.joystick.Joystick(0)
            self.player1_joy.init()
            self.controller_present = True
        except:
            pass

    def reset(self):
        self.stage_number += 1
        if self.stage_number > self.stage.number_of_levels:
            self.stage_number = 1
            self.state = STATE.menu
            self.score_screen = ScoreScreen()
            self.controls_screen = Controls()
            self.firstrun = True
        else:
            self.firstrun = False
            self.state = STATE.game

        self.stage = Stage(self.stage_number)
        self.timer = GAME.time
        self.camera = Camera(self.complex_camera, self.stage.level.width, self.stage.level.height)
        self.screen_color = (choice(COLOR.colors))
        self.menu = Menu(SCREEN.width, SCREEN.height, self.screen_color)
        
        self.countdownOverlay = CountDownOverlay()
        self.intro = True
        self.intro_countdown = self.fps * 4        

    def handle_events(self):
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    self.state = STATE.menu
                if event.key == K_p:
                    if not self.capture_video:
                        self.capture_video = True # change to True and press p to capture screenshots
                    else:
                        self.capture_video = False
                if event.key == K_q:
                    #self.stage.level.spawn_data()
                    pass
            elif event.type == JOYBUTTONDOWN:
                if self.player1_joy.get_button(9) == 1:
                    self.state = STATE.menu
            if self.state == STATE.game:                
                if self.stage.level.timer == 0:
                    self.stage.level.timer = pygame.time.get_ticks()/1000.0
                self.stage.level.player1.handle_events(event)
                self.stage.level.player2.handle_events(event)
            elif self.state == STATE.menu:
                self.menu.handle_events(event)
                self.state = self.menu.state
            elif self.state == STATE.controls:
                self.controls_screen.handle_events(event)
                self.state = self.controls_screen.state
            elif self.state == STATE.scorescreen:
                self.score_screen.handle_events(event)
                self.state = self.score_screen.state
            elif self.state == STATE.exit:
                pygame.quit()
                sys.exit()

    def update(self):
        if self.state == STATE.nextlevel:
            self.reset()
            return
        if self.capture_video:
            self.makeVideo()

        if self.timer == 0:
            self.state = STATE.scorescreen

        if self.state == STATE.logo:
            self.logoscreen.update()
            self.state = self.logoscreen.state
        if self.state == STATE.splashscreen:
            self.splashscreen.update()
            self.state = self.splashscreen.state
        elif self.state == STATE.controls:
            self.controls_screen.update()
        elif self.state == STATE.menu:
            self.menu.update()
            if self.game_music:
                self.game_music = False
                mixer.music.fadeout(2000)
        elif self.state == STATE.scorescreen:
            self.p1_scores[self.stage_number-1] = self.stage.level.p1_data
            self.p2_scores[self.stage_number-1] = self.stage.level.p2_data

            self.score_screen.p1_scores[self.stage_number-1].text = self.stage.level.p1_data
            self.score_screen.p2_scores[self.stage_number-1].text = self.stage.level.p2_data

            self.score_screen.update(self.stage_number, 1, self.hi_score)
        elif self.state == STATE.game:
            if not self.game_music:
                mixer.music.load(os.path.join('assets', 'music', 'cyberspine.ogg'))
                mixer.music.play(-1)
                self.game_music = True
            self.camera.update(self.stage.level.player1)
            if self.intro_countdown <= GAME.fps:
                self.intro = False
                self.intro_countdown = 0
            if self.intro:
                self.countdownOverlay.update(self.intro_countdown)
                self.intro_countdown -= 1
            else:
                self.stage.level.update()
                if self.stage.level.intro:
                    self.timer = GAME.time
                if self.ticks > self.fps:
                    self.ticks = 0
                    self.timer -= 1
                else:
                    self.ticks += 1

            display_time = self.format_timer(self.timer)
            self.game_time.text = display_time
            if self.timer_red:
                self.animate_flash()
            else:
                self.game_time.color = COLOR.white
            self.game_time.update()

            self.p1_score.text = str(self.stage.level.p1_data)
            self.p1_score.update()

            self.p2_score.text = str(self.stage.level.p2_data)
            self.p2_score.update()
            self.bg_text.text = "0" + str(self.stage_number)
            self.bg_text.update()

    def draw(self):
        self.screen.fill(COLOR.black)

        if self.state == STATE.logo:
            self.logoscreen.draw(self.screen)
        elif self.state == STATE.splashscreen:
            self.splashscreen.draw(self.screen)
        elif self.state == STATE.scorescreen:
            self.score_screen.draw(self.screen)
        elif self.state == STATE.controls:
            self.controls_screen.draw(self.screen)
        elif self.state == STATE.game:
            self.screen.blit(SCREEN.bg, (0, 0))
            self.bg_text.draw_to(self.screen)
            self.screen.blit(ASSET.score_bg, (0, 0))
            self.stage.draw(self.screen)
            for particle in self.stage.level.particles:
                self.screen.blit(particle.image, self.camera.apply(particle))

            self.game_time.draw_to(self.screen)
            self.p1_score.draw_to(self.screen)
            self.p2_score.draw_to(self.screen)

            if self.intro:
                self.countdownOverlay.draw(self.screen)

        elif self.state == STATE.menu:
            self.menu.draw(self.screen)
            if not self.firstrun:
                pass
            
        self.scanlines.draw(self.screen)

    def run_game(self, fps=30):
        self.fps = fps
        while True:
            self.handle_events()
            self.update()
            self.draw()

            pygame.display.update()
            pygame.display.set_caption("CleanerBots v0.1 - " + str(int(self.fpsClock.get_fps())) + " fps")
            self.fpsClock.tick(self.fps)

    def complex_camera(self, camera_rect, target_rect):
        x, y, dummy, dummy = target_rect
        dummy, dummy, w, h = camera_rect
        x, y = int(SCREEN.width/2)-x, int(SCREEN.height/2) - y

        x = min(0, x)
        x = max(-(camera_rect.width-SCREEN.width), x)
        y = max(-(camera_rect.height-SCREEN.height), y)
        y = min(0, y)

        return pygame.Rect(x, y, w, h)

    def format_timer(self, timer):
        self.timer_red = False
        minutes = timer/60
        seconds = timer % 60
        if minutes == 0 and seconds < 10:
            self.timer_red = True
        if seconds < 10:
            seconds = "0" + str(seconds)
        return str(minutes)+":"+str(seconds)

    def makeVideo(self):
        pygame.image.save(self.screen, os.path.join("screenshots", "screenshot%d.jpg" %self.screen_number))
        self.screen_number += 1

    def animate_flash(self):
        self.flash_timer += 1
        if self.flash_timer < GAME.fps/4:
            self.game_time.color = COLOR.white
        elif self.flash_timer < GAME.fps/2:
            self.game_time.color = COLOR.red
        else:
            self.flash_timer = 0