diff eclviewer.py @ 83:fc0294c745b6

Basic bullet handling! Clean up as soon as possible :p
author Thibaut Girka <thib@sitedethib.com>
date Sat, 03 Sep 2011 22:22:58 +0200
parents 6a08f44fa01b
children 85f3b8ba3f24
line wrap: on
line diff
--- a/eclviewer.py
+++ b/eclviewer.py
@@ -31,7 +31,7 @@ from pytouhou.game.sprite import AnmWrap
 from pytouhou.game.background import Background
 from pytouhou.game.enemymanager import EnemyManager
 from pytouhou.opengl.texture import TextureManager
-from pytouhou.game.game import GameState
+from pytouhou.game.game import GameState, Resources
 from pytouhou.game.player import Player
 
 import OpenGL
@@ -60,10 +60,34 @@ def main(path, stage_num):
     glEnableClientState(GL_VERTEX_ARRAY)
     glEnableClientState(GL_TEXTURE_COORD_ARRAY)
 
-    # Load data
-    with open(path, 'rb') as file:
+    texture_manager = TextureManager()
+
+    # Load common data
+    with open(os.path.join(path, 'CM.DAT'), 'rb') as file:
         archive = PBG3.read(file)
-        texture_manager = TextureManager(archive)
+        texture_manager.set_archive(archive)
+        etama_anm_wrappers = (AnmWrapper([Animations.read(BytesIO(archive.extract('etama3.anm')))]),
+                              AnmWrapper([Animations.read(BytesIO(archive.extract('etama4.anm')))]))
+        players_anm_wrappers = (AnmWrapper([Animations.read(BytesIO(archive.extract('player00.anm')))]),
+                                AnmWrapper([Animations.read(BytesIO(archive.extract('player01.anm')))]))
+        effects_anm_wrapper = AnmWrapper([Animations.read(BytesIO(archive.extract('eff00.anm')))])
+
+        for anm_wrapper in etama_anm_wrappers:
+            texture_manager.preload(anm_wrapper)
+
+        for anm_wrapper in players_anm_wrappers:
+            texture_manager.preload(anm_wrapper)
+
+        texture_manager.preload(effects_anm_wrapper)
+
+        resources = Resources(etama_anm_wrappers, players_anm_wrappers, effects_anm_wrapper)
+
+    game_state = GameState(resources, [Player()], stage_num, 3, 16)
+
+    # Load stage data
+    with open(os.path.join(path, 'ST.DAT'), 'rb') as file:
+        archive = PBG3.read(file)
+        texture_manager.set_archive(archive)
 
         stage = Stage.read(BytesIO(archive.extract('stage%d.std' % stage_num)), stage_num)
 
@@ -76,92 +100,92 @@ def main(path, stage_num):
             pass
         else:
             anims.append(enemies2_anim)
-        enemy_manager = EnemyManager(stage, AnmWrapper(anims), ecl, GameState([Player()], stage_num, 0, 16))
+        enemy_manager = EnemyManager(stage, AnmWrapper(anims), ecl, game_state)
         texture_manager.preload(anims)
 
         background_anim = Animations.read(BytesIO(archive.extract('stg%dbg.anm' % stage_num)))
         background = Background(stage, AnmWrapper((background_anim,)))
         texture_manager.preload((background_anim,))
 
-        print(enemy_manager.stage.name)
+    print(enemy_manager.stage.name)
 
-        frame = 0
+    frame = 0
 
-        # Main loop
-        clock = pygame.time.Clock()
-        while True:
-            # Check events
-            for event in pygame.event.get():
-                if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in (pygame.K_ESCAPE, pygame.K_q)):
-                    sys.exit(0)
-                elif event.type == pygame.KEYDOWN:
-                    if event.key == pygame.K_RETURN and event.mod & pygame.KMOD_ALT:
-                        pygame.display.toggle_fullscreen()
+    # Main loop
+    clock = pygame.time.Clock()
+    while True:
+        # Check events
+        for event in pygame.event.get():
+            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in (pygame.K_ESCAPE, pygame.K_q)):
+                sys.exit(0)
+            elif event.type == pygame.KEYDOWN:
+                if event.key == pygame.K_RETURN and event.mod & pygame.KMOD_ALT:
+                    pygame.display.toggle_fullscreen()
 
-            # Update game
-            enemy_manager.update(frame)
-            background.update(frame)
+        # Update game
+        enemy_manager.update(frame)
+        background.update(frame)
 
-            frame += 1
+        frame += 1
 
-            # Draw everything
+        # Draw everything
 #            glClearColor(0.0, 0.0, 1.0, 0)
-            glClear(GL_DEPTH_BUFFER_BIT)
+        glClear(GL_DEPTH_BUFFER_BIT)
 
-            fog_b, fog_g, fog_r, _, fog_start, fog_end = background.fog_interpolator.values
-            x, y, z = background.position_interpolator.values
-            dx, dy, dz = background.position2_interpolator.values
+        fog_b, fog_g, fog_r, _, fog_start, fog_end = background.fog_interpolator.values
+        x, y, z = background.position_interpolator.values
+        dx, dy, dz = background.position2_interpolator.values
 
-            glFogi(GL_FOG_MODE, GL_LINEAR)
-            glFogf(GL_FOG_START, fog_start)
-            glFogf(GL_FOG_END,  fog_end)
-            glFogfv(GL_FOG_COLOR, (fog_r / 255., fog_g / 255., fog_b / 255., 1.))
+        glFogi(GL_FOG_MODE, GL_LINEAR)
+        glFogf(GL_FOG_START, fog_start)
+        glFogf(GL_FOG_END,  fog_end)
+        glFogfv(GL_FOG_COLOR, (fog_r / 255., fog_g / 255., fog_b / 255., 1.))
 
-            #TODO
-            glMatrixMode(GL_MODELVIEW)
-            glLoadIdentity()
-            # Some explanations on the magic constants:
-            # 192. = 384. / 2. = width / 2.
-            # 224. = 448. / 2. = height / 2.
-            # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2))
-            # This is so that objects on the (O, x, y) plane use pixel coordinates
-            gluLookAt(192., 224., - 835.979370 * dz,
-                      192. + dx, 224. - dy, 0., 0., -1., 0.)
-            glTranslatef(-x, -y, -z)
+        #TODO
+        glMatrixMode(GL_MODELVIEW)
+        glLoadIdentity()
+        # Some explanations on the magic constants:
+        # 192. = 384. / 2. = width / 2.
+        # 224. = 448. / 2. = height / 2.
+        # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2))
+        # This is so that objects on the (O, x, y) plane use pixel coordinates
+        gluLookAt(192., 224., - 835.979370 * dz,
+                  192. + dx, 224. - dy, 0., 0., -1., 0.)
+        glTranslatef(-x, -y, -z)
 
-            glEnable(GL_DEPTH_TEST)
-            for (texture_key, blendfunc), (nb_vertices, vertices, uvs, colors) in background.objects_by_texture.items():
-                glBlendFunc(GL_SRC_ALPHA, {0: GL_ONE_MINUS_SRC_ALPHA, 1: GL_ONE}[blendfunc])
-                glBindTexture(GL_TEXTURE_2D, texture_manager[texture_key])
-                glVertexPointer(3, GL_FLOAT, 0, vertices)
-                glTexCoordPointer(2, GL_FLOAT, 0, uvs)
-                glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors)
-                glDrawArrays(GL_QUADS, 0, nb_vertices)
-            glDisable(GL_DEPTH_TEST)
+        glEnable(GL_DEPTH_TEST)
+        for (texture_key, blendfunc), (nb_vertices, vertices, uvs, colors) in background.objects_by_texture.items():
+            glBlendFunc(GL_SRC_ALPHA, {0: GL_ONE_MINUS_SRC_ALPHA, 1: GL_ONE}[blendfunc])
+            glBindTexture(GL_TEXTURE_2D, texture_manager[texture_key])
+            glVertexPointer(3, GL_FLOAT, 0, vertices)
+            glTexCoordPointer(2, GL_FLOAT, 0, uvs)
+            glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors)
+            glDrawArrays(GL_QUADS, 0, nb_vertices)
+        glDisable(GL_DEPTH_TEST)
 
-            #TODO
-            glMatrixMode(GL_MODELVIEW)
-            glLoadIdentity()
-            # Some explanations on the magic constants:
-            # 192. = 384. / 2. = width / 2.
-            # 224. = 448. / 2. = height / 2.
-            # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2))
-            # This is so that objects on the (O, x, y) plane use pixel coordinates
-            gluLookAt(192., 224., - 835.979370,
-                      192., 224., 0., 0., -1., 0.)
+        #TODO
+        glMatrixMode(GL_MODELVIEW)
+        glLoadIdentity()
+        # Some explanations on the magic constants:
+        # 192. = 384. / 2. = width / 2.
+        # 224. = 448. / 2. = height / 2.
+        # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2))
+        # This is so that objects on the (O, x, y) plane use pixel coordinates
+        gluLookAt(192., 224., - 835.979370,
+                  192., 224., 0., 0., -1., 0.)
 
-            glDisable(GL_FOG)
-            for (texture_key, blendfunc), (nb_vertices, vertices, uvs, colors) in enemy_manager.objects_by_texture.items():
-                glBlendFunc(GL_SRC_ALPHA, {0: GL_ONE_MINUS_SRC_ALPHA, 1: GL_ONE}[blendfunc])
-                glBindTexture(GL_TEXTURE_2D, texture_manager[texture_key])
-                glVertexPointer(3, GL_FLOAT, 0, vertices)
-                glTexCoordPointer(2, GL_FLOAT, 0, uvs)
-                glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors)
-                glDrawArrays(GL_QUADS, 0, nb_vertices)
-            glEnable(GL_FOG)
+        glDisable(GL_FOG)
+        for (texture_key, blendfunc), (nb_vertices, vertices, uvs, colors) in enemy_manager.objects_by_texture.items():
+            glBlendFunc(GL_SRC_ALPHA, {0: GL_ONE_MINUS_SRC_ALPHA, 1: GL_ONE}[blendfunc])
+            glBindTexture(GL_TEXTURE_2D, texture_manager[texture_key])
+            glVertexPointer(3, GL_FLOAT, 0, vertices)
+            glTexCoordPointer(2, GL_FLOAT, 0, uvs)
+            glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors)
+            glDrawArrays(GL_QUADS, 0, nb_vertices)
+        glEnable(GL_FOG)
 
-            pygame.display.flip()
-            clock.tick(120)
+        pygame.display.flip()
+        clock.tick(120)
 
 
 
@@ -169,7 +193,7 @@ try:
     file_path, stage_num = sys.argv[1:]
     stage_num = int(stage_num)
 except ValueError:
-    print('Usage: %s std_dat_path stage_num' % sys.argv[0])
+    print('Usage: %s game_dir_path stage_num' % sys.argv[0])
 else:
     main(file_path, stage_num)