changeset 245:d3ba32a9096e

Implement ANM0 instruction 29 and fix 24
author Thibaut Girka <thib@sitedethib.com>
date Mon, 02 Jan 2012 18:46:55 +0100
parents 2b7f69ad9ccd
children cb329dca4758
files pytouhou/formats/anm0.py pytouhou/game/sprite.py pytouhou/ui/renderer.pyx pytouhou/vm/anmrunner.py
diffstat 4 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/pytouhou/formats/anm0.py
+++ b/pytouhou/formats/anm0.py
@@ -64,6 +64,7 @@ class Animations(object):
                      26: ('i', 'set_automatic_orientation'),
                      27: ('f', 'shift_texture_x'),
                      28: ('f', 'shift_texture_y'),
+                     29: ('i', 'set_visible'),
                      30: ('ffi', 'scale_in'),
                      31: ('i', None)}
 
--- a/pytouhou/game/sprite.py
+++ b/pytouhou/game/sprite.py
@@ -23,11 +23,12 @@ class Sprite(object):
                  'texcoords', 'dest_offset', 'allow_dest_offset', 'texoffsets',
                  'mirrored', 'rescale', 'scale_speed', 'rotations_3d',
                  'rotations_speed_3d', 'corner_relative_placement', 'frame',
-                 'color', 'alpha', '_rendering_data')
+                 'color', 'alpha', 'visible', '_rendering_data')
     def __init__(self, width_override=0, height_override=0):
         self.anm = None
         self._removed = False
         self._changed = True
+        self.visible = True
 
         self.width_override = width_override
         self.height_override = height_override
--- a/pytouhou/ui/renderer.pyx
+++ b/pytouhou/ui/renderer.pyx
@@ -48,7 +48,7 @@ cdef class Renderer:
 
         for element in elements:
             sprite = element._sprite
-            if sprite:
+            if sprite and sprite.visible:
                 ox, oy = element.x, element.y
                 key, (vertices, uvs, colors) = get_sprite_rendering_data(sprite)
                 rec = indices_by_texture.setdefault(key, [])
--- a/pytouhou/vm/anmrunner.py
+++ b/pytouhou/vm/anmrunner.py
@@ -51,6 +51,7 @@ class ANMRunner(object):
         self.instruction_pointer = new_ip
         self.frame, opcode, args = self.script[self.instruction_pointer]
         self.waiting = False
+        self._sprite.visible = True
         return True
 
 
@@ -231,9 +232,9 @@ class ANMRunner(object):
 
     @instruction(24)
     def wait_ex(self):
-        """Hide/delete the sprite and wait for an interrupt.
+        """Hide the sprite and wait for an interrupt.
         """
-        #TODO: Hide/delete the sprite and figure what happens exactly
+        self._sprite.visible = False
         self.waiting = True
 
 
@@ -261,6 +262,11 @@ class ANMRunner(object):
         self._sprite.texoffsets = tox, toy + dy
 
 
+    @instruction(29)
+    def set_visible(self, visible):
+        self._sprite.visible = bool(visible & 1)
+
+
     @instruction(30)
     def scale_in(self, sx, sy, duration):
         self._sprite.scale_in(duration, sx, sy, lambda x: x) #TODO: formula