Mercurial > touhou
comparison pytouhou/formats/anm0.py @ 69:a142e57218a0
Refactor. Move VMs to pytouhou.vm.
| author | Thibaut Girka <thib@sitedethib.com> |
|---|---|
| date | Sat, 27 Aug 2011 10:58:54 +0200 |
| parents | 694f25881d0f |
| children | a03d7a94b997 |
comparison
equal
deleted
inserted
replaced
| 68:a2459defd4b6 | 69:a142e57218a0 |
|---|---|
| 11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 ## GNU General Public License for more details. | 12 ## GNU General Public License for more details. |
| 13 ## | 13 ## |
| 14 | 14 |
| 15 from struct import pack, unpack | 15 from struct import pack, unpack |
| 16 from pytouhou.utils.helpers import read_string | 16 from pytouhou.utils.helpers import read_string, get_logger |
| 17 | |
| 18 | |
| 19 logger = get_logger(__name__) | |
| 17 | 20 |
| 18 #TODO: refactor/clean up | 21 #TODO: refactor/clean up |
| 19 | 22 |
| 20 | 23 |
| 21 class Animations(object): | 24 class Animations(object): |
| 25 _instructions = {0: ('', 'delete'), | |
| 26 1: ('I', 'set_sprite'), | |
| 27 2: ('ff', 'set_scale'), | |
| 28 3: ('I', 'set_alpha'), | |
| 29 4: ('BBBx', 'set_color'), | |
| 30 5: ('I', 'jump'), | |
| 31 7: ('', 'toggle_mirrored'), | |
| 32 9: ('fff', 'set_3d_rotations'), | |
| 33 10: ('fff', 'set_3d_rotations_speed'), | |
| 34 11: ('ff', 'set_scale_speed'), | |
| 35 12: ('ii', 'fade'), | |
| 36 15: ('', 'keep_still'), | |
| 37 16: ('i', 'set_random_sprite'), | |
| 38 23: ('', 'set_corner_relative_placement'), | |
| 39 27: ('f', 'shift_texture_x'), | |
| 40 28: ('f', 'shift_texture_y'), | |
| 41 30: ('ffi', 'scale_in')} | |
| 42 | |
| 43 | |
| 22 def __init__(self): | 44 def __init__(self): |
| 23 self.size = (0, 0) | 45 self.size = (0, 0) |
| 24 self.first_name = None | 46 self.first_name = None |
| 25 self.secondary_name = None | 47 self.secondary_name = None |
| 26 self.sprites = {} | 48 self.sprites = {} |
| 69 instruction_offsets = [] | 91 instruction_offsets = [] |
| 70 file.seek(offset) | 92 file.seek(offset) |
| 71 while True: | 93 while True: |
| 72 #TODO | 94 #TODO |
| 73 instruction_offsets.append(file.tell() - offset) | 95 instruction_offsets.append(file.tell() - offset) |
| 74 time, instr_type, length = unpack('<HBB', file.read(4)) | 96 time, opcode, length = unpack('<HBB', file.read(4)) |
| 75 data = file.read(length) | 97 data = file.read(length) |
| 76 if instr_type == 1: # set_sprite | 98 if opcode in cls._instructions: |
| 77 args = unpack('<I', data) | 99 args = unpack('<%s' % cls._instructions[opcode][0], data) |
| 78 elif instr_type == 2: # set_scale | |
| 79 args = unpack('<ff', data) | |
| 80 elif instr_type == 3: # set_alpha | |
| 81 args = unpack('<I', data) | |
| 82 elif instr_type == 4: # set_color | |
| 83 args = unpack('<BBBx', data) | |
| 84 elif instr_type == 5: # jump | |
| 85 # Translate offset to instruction index | |
| 86 args = (instruction_offsets.index(unpack('<I', data)[0]),) | |
| 87 elif instr_type == 9: # set_3d_rotation | |
| 88 args = unpack('<fff', data) | |
| 89 elif instr_type == 10: # set_3d_rotation_speed | |
| 90 args = unpack('<fff', data) | |
| 91 elif instr_type == 11: # set_scale_speed | |
| 92 args = unpack('<ff', data) | |
| 93 elif instr_type == 12: # fade | |
| 94 args = unpack('<ii', data) | |
| 95 elif instr_type == 16: # set_random_sprite | |
| 96 args = unpack('<ii', data) | |
| 97 elif instr_type == 27: # shift_texture_x | |
| 98 args = unpack('<f', data) | |
| 99 elif instr_type == 28: # shift_texture_y | |
| 100 args = unpack('<f', data) | |
| 101 elif instr_type == 30: # scale_in | |
| 102 args = unpack('<ffi', data) | |
| 103 else: | 100 else: |
| 104 args = (data,) | 101 args = (data,) |
| 105 anm.scripts[i].append((time, instr_type, args)) | 102 logger.warn('unknown opcode %d', opcode) |
| 106 if instr_type == 0: | 103 |
| 104 anm.scripts[i].append((time, opcode, args)) | |
| 105 if opcode == 0: | |
| 107 break | 106 break |
| 107 | |
| 108 # Translate offsets to instruction pointers | |
| 109 for instr_offset, (j, instr) in zip(instruction_offsets, enumerate(anm.scripts[i])): | |
| 110 time, opcode, args = instr | |
| 111 if opcode == 5: | |
| 112 args = (instruction_offsets.index(args[0]),) | |
| 113 anm.scripts[i][j] = time, opcode, args | |
| 108 #TODO | 114 #TODO |
| 109 | 115 |
| 110 return anm | 116 return anm |
| 111 | 117 |
