def __init__(self):
         self.dimensions = ( int(get("Window Width")), int(get("Window Height")) )
         
         pygame.init()
         
         self.init_screen()
         self.init_background()
         self.init_physics()
         
         self.init_explosions()
         self.init_fonts()
         
         # 1 Objects under the standart objects
         self.fast_objects = []
         
         # 2 Standart obejcts
         self.objects = []
         
         # 3 Objects over the standart objects
         self.over_objects = []
         
         # 4 Texts which we want to show
         self.texts = []
         
         # 5 Interface objects we're blitting to the screen
         self.interfaces = []
         
         
         self.clock = pygame.time.Clock()
         
         self.fps = int(get("FPS"))
         
         self.tickcount = 0
         self.input = Input()
         
         self.stop = False
         
         self.global_mappings = GlobalKeyMappings(self)
class World():
        def __init__(self):
                self.dimensions = ( int(get("Window Width")), int(get("Window Height")) )
                
                pygame.init()
                
                self.init_screen()
                self.init_background()
                self.init_physics()
                
                self.init_explosions()
                self.init_fonts()
                
                # 1 Objects under the standart objects
                self.fast_objects = []
                
                # 2 Standart obejcts
                self.objects = []
                
                # 3 Objects over the standart objects
                self.over_objects = []
                
                # 4 Texts which we want to show
                self.texts = []
                
                # 5 Interface objects we're blitting to the screen
                self.interfaces = []
                
                
                self.clock = pygame.time.Clock()
                
                self.fps = int(get("FPS"))
                
                self.tickcount = 0
                self.input = Input()
                
                self.stop = False
                
                self.global_mappings = GlobalKeyMappings(self)
                
        @staticmethod
        def font(name):
                # return pygame.font.Font(pygame.font.match_font(get("Font {0}".format(name))), int(get("Font {0} Size".format(name))))
                n,s = get("Font {0}".format(name)), int(get("Font {0} Size".format(name)))
                print('iii Loading Font {}, Size={}'.format(n,s))
                r = pygame.font.Font(pygame.font.match_font(n), s)
                #r = None
                #r = pygame.font.Font(pygame.font.match_font(None, s))
                print('iii Loaded Font {}, Size={}'.format(n,s))
                return r 
                
        def init_fonts(self):
                pygame.font.init()
                self.font_HP = self.font("HP")
                self.font_info = self.font("Info")
                self.font_fastinfo = self.font("FastInfo")
                
        def add_over(self, obj):
                self.over_objects+=[obj]
                
        def remove_over(self, obj):
                try:
                        self.over_objects.remove(obj)
                except ValueError:
                        pass
                
        def physics_add(self, obj, modules):
                for i in modules:
                        self.physics[i].add(obj)
                        
        def physics_remove(self, obj, modules):
                for i in modules:
                        self.physics[i].remove(obj)
                
        def add_decoration(self, P, V, path):
                image = Modules.Object.Loader.load_images([['default',path]])['default']
                obj = Decoration(P, V, image)
                self.physics_add(obj, self.physics_decoration_modules)
                self.fast_add(obj)
                
        def add_bullet(self, P, V, r, color, mass):
                obj = Bullet(P, V, r, color, mass)
                # Collisions Moving and ScreenLoop 
                self.physics_add(obj, self.physics_bullet_modules)
                self.fast_add(obj)
                
        def remove_bullet(self, obj):
                self.physics_remove(obj, self.physics_bullet_modules)
                try:
                        self.fast_remove(obj)   
                except ValueError:
                        pass 
                
        def fast_add(self, obj, physics_modules=None):
                if physics_modules:
                        self.physics_add(obj, physics_modules)
                self.fast_objects.append(obj)
                
        def fast_remove(self, obj, physics_modules=None):
                if physics_modules:
                        self.physics_remove(obj, physics_modules)
                try:
                        self.fast_objects.remove(obj)
                except ValueError:
                        pass
                
        def add(self, obj, physics_modules=None):
                if physics_modules == None:
                        physics_modules = self.physics_object_modules
                obj.blit_static()
                self.objects.append(obj)
                for i in physics_modules:
                                self.physics[i].add(obj)
                
        def remove(self, obj):
                try:
                        self.objects.remove(obj)
                        for i in self.physics_object_modules:
                                self.physics[i].remove(obj)
                except ValueError:
                        pass
                        
        def add_interface(self, obj):
                self.interfaces.append(obj)     
                
        def remove_interface(self, obj):
                try:
                        self.interfaces.remove(obj)
                except ValueError:
                        pass
                        
        def add_text(self, text, obj, scaleV, seconds, V = Vector25D()):
                '''
                Show short text message for a user
                text - what text to show
                obj - to what object the position of a text is related
                scaleV - scaleVelocity -> how much to scale the text on each frame
                seconds - how many seconds to show the text
                '''
                frames_to_live = seconds*self.fps
                
                if DRAW_FONTS:
                    self.texts.append([ self.font_fastinfo.render(text, True, (123,34,12)).convert_alpha(), obj, scaleV, frames_to_live, 0, V ])
                
        def remove_text(self, obj):
                self.texts.remove(obj)
                
        def self_draw_font(self, font, text, color, P, flags=0):
                World.draw_font(self.background, font, text, color, P, flags)
        @staticmethod        
        def draw_font(surf_to, font, text, color, P, flags=0):
                if DRAW_FONTS:
                    surf = font.render(text, True, color).convert_alpha()
                    r = surf.get_rect()
                    surf_to.blit(surf, (int(P[0]-r.w/2), int(P[1]-r.h/2)), special_flags=flags)
        
        def redraw(self):
                #self.background.blit(self.background_image, (0,0))
                self.background.fill ( (0,0,0, 255) )
                
                counter = 0
                
                for obj in self.fast_objects:
                        obj.draw(self.background)
                        counter+=1
                
                for obj in self.objects:
                        obj.draw(self.background)
                        counter+=1
                        
                for obj in self.over_objects:
                        obj.draw(self.background)
                        counter+=1
                        
                for obj in self.objects:
                        # Drawing font info here
                        self.self_draw_font(self.font_HP, str(int(obj.HP)), (255,255,255), obj.P+Vector25D(0,30))
                        counter+=1
                
                i = 0        
                for text in self.texts:
                        r = text[0].get_rect()
                        scale_factor = 1/text[2]**text[4]
                        blit_font = pygame.transform.scale( text[0], (int(r.w*scale_factor), int(r.h*scale_factor)))
                        r = blit_font.get_rect()
                        passed = text[4]/text[3]
                        self.background.blit(blit_font, (int(text[1].P[0] - r.w/2 + text[5][0]*passed), int(text[1].P[1] - r.h/2 + text[5][1]*passed)) )
                        self.texts[i][4]+=1
                        if (self.texts[i][4] > self.texts[i][3]):
                                self.remove_text(text)
                        i+=1
                        counter+=1
                        
                for obj in self.interfaces:
                        obj.draw(self.background)
                        counter+=1
                                
                #self.self_draw_font(self.font_info, "FPS: "+str(self.clock.get_fps()), (255,255,255), (800,100))
                #self.self_draw_font(self.font_info, "Fast object count: "+str(len(self.fast_objects)), (255,255,255), (1000,500))
                #self.self_draw_font(self.font_info, "Overall draw function calls: "+str(counter), (255,255,255), (1000,600))
                        
                self.screen.blit(self.background, (0,0))
                pygame.display.flip()
                
        def init_explosions(self):
        	self.explosion_bomb = Modules.Sprite.SpriteLoader.singleton.load ( "SkybusterExplosion", "First", 1 ) 
        	self.explosion_bullet = Modules.Sprite.SpriteLoader.singleton.load ( "BlueExplosion", "First", 1 )
        	self.explosion_ship = Modules.Sprite.SpriteLoader.singleton.load ( "RedExplosion", "First", 1 )
        	
        def asteroid(self, P, V):
                asteroid = Modules.Object.Loader.load("GenericAsteroid", Asteroid)
                asteroid.P = P
                asteroid.V = V
                self.add(asteroid)
                self.fast_add(asteroid, self.physics_bullet_modules)
                return asteroid
        
        def explosion(self, sprite, P):
                e = Explosion(P, sprite)
                self.add_over(e)
        	
        def bomb_explosion(self, P):
                self.explosion ( Sprite( self.explosion_bomb, random.random()*360), P )
                
        def bullet_explosion(self,P):
        	self.explosion ( Sprite( self.explosion_bullet, random.random()*360), P )
        	
        def ship_explosion(self, P):
                self.explosion ( Sprite( self.explosion_ship, random.random()*360 ), P )
                
        def init_background_image(self, path):
                img = Modules.Object.Loader.load_images([['default',path]])['default']
                img = pygame.transform.scale( img, self.dimensions )
                self.background_image = img
                
        def loop(self, times):
                for i in range(0, times):
                        self.clock.tick(self.fps)
                        #self.clock.tick()
                        self.tickcount+=1
                        self.input.tick()    
                        self.redraw()
                        self.physics.tick()
                        
                        if self.stop:
                                return False 
                       
                return True
                
        def flush(self):
                self.fast_objects = []
                self.objects = []
                self.over_objects = []
                self.texts = []
                self.interfaces = []
                
                for phys in self.physics:
                        phys.flush()
                        
        def init_screen(self):
                pygame.init()
                dims = self.dimensions
                opts = pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.FULLSCREEN
                opts = pygame.DOUBLEBUF | pygame.HWSURFACE

                self.screen = pygame.display.set_mode((dims[0], int(dims[1])), opts)
                pygame.display.set_caption( get("Game Name") )
                
        def init_background(self):
                self.background = pygame.Surface(self.dimensions)
                self.init_background_image('./default.jpg')
                
        def get_all_indexes(self, name):
                module_names = get("Physics Modules "+name).split(" ")
                r = []
                for module in module_names:
                        r+=[self.physics.get_module_index(module)]
                return r
                
        def init_physics(self):
                #Gravity Collisions Acceleration Moving ZeroAcceleration ScreenLoop
                self.physics = Modules.Physics.Physics(self)
                self.physics_bullet_modules = self.get_all_indexes ( "Bullets" )
                self.physics_decoration_modules = self.get_all_indexes ( "Decorations" )
                self.physics_object_modules = self.get_all_indexes ( "Objects" )