annotate pytouhou/formats/exe.py @ 230:1c24a6d93c1b

Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
author Thibaut Girka <thib@sitedethib.com>
date Fri, 30 Dec 2011 19:10:49 +0100
parents 5afc75f71fed
children e59bd7979ddc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 # -*- encoding: utf-8 -*-
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2 ##
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com>
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 ## Copyright (C) 2011 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
5 ##
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 ## This program is free software; you can redistribute it and/or modify
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 ## it under the terms of the GNU General Public License as published
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 ## by the Free Software Foundation; version 3 only.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 ##
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 ## This program is distributed in the hope that it will be useful,
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 ## GNU General Public License for more details.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 ##
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 from struct import Struct, unpack
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 from pytouhou.utils.pe import PEFile
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 from pytouhou.utils.helpers import get_logger
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 logger = get_logger(__name__)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 SQ2 = 2. ** 0.5 / 2.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 class Shot(object):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 def __init__(self):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 self.interval = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 self.delay = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31 self.pos = (0., 0.)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 self.hitbox = (0., 0.)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 self.angle = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 self.speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 self.damage = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 self.orb = 0
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
37 self.type = 0
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 self.sprite = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 self.unknown1 = None
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 class SHT(object):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 def __init__(self):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 #self.unknown1 = None
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 #self.bombs = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 #self.unknown2 = None
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 self.hitbox = 4.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 self.graze_hitbox = 42.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 self.autocollection_speed = 8.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 self.item_hitbox = 38.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 # No percentage_of_cherry_loss_on_die
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 self.point_of_collection = 128 #TODO: find the real default.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 self.horizontal_vertical_speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 self.horizontal_vertical_focused_speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55 self.diagonal_speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
56 self.diagonal_focused_speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57 self.shots = {}
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60 @classmethod
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
61 def find_character_defs(cls, pe_file):
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
62 """Generator returning the possible VA of character definition blocks.
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
63
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
64 Based on knowledge of the structure, it tries to find valid definition blocks
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
65 without embedding any copyrighted material or hard-coded offsets that would
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
66 only be useful for a specific build of the game.
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
67 """
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
68
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69 format = Struct('<4f2I')
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
70 data_section = [section for section in pe_file.sections
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
71 if section.Name.startswith('.data')][0]
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
72 text_section = [section for section in pe_file.sections
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
73 if section.Name.startswith('.text')][0]
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74 data_va = pe_file.image_base + data_section.VirtualAddress
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
75 data_size = data_section.SizeOfRawData
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
76 text_va = pe_file.image_base + text_section.VirtualAddress
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
77 text_size = text_section.SizeOfRawData
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
78
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
79 # Search the whole data segment for 4 successive character definitions
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
80 for addr in xrange(data_va, data_va + data_size, 4):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
81 for character_id in xrange(4):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
82 pe_file.seek_to_va(addr + character_id * 24)
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
83 (speed1, speed2, speed3, speed4,
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
84 ptr1, ptr2) = format.unpack(pe_file.file.read(format.size))
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
85
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
86 # Check whether the character's speed make sense,
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
87 # and whether the function pointers point to valid addresses
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
88 if not (all(0. < x < 10. for x in (speed1, speed2, speed3, speed4))
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
89 and speed2 <= speed1
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
90 and 0 <= ptr1 - text_va < text_size - 8
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
91 and 0 <= ptr2 - text_va < text_size - 8):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
92 break
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
93
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
94 # So far, this character definition seems to be valid.
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
95 # Now, make sure the shoot function wrappers pass valid addresses
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
96 pe_file.seek_to_va(ptr1 + 4)
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
97 shtptr1, = unpack('<I', pe_file.file.read(4))
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
98 pe_file.seek_to_va(ptr2 + 4)
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
99 shtptr2, = unpack('<I', pe_file.file.read(4))
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
100 if not (0 <= shtptr1 - data_va < data_size - 12
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
101 and 0 <= shtptr2 - data_va < data_size - 12):
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
102 break
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
103
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
104 # It is unlikely this character record is *not* valid, but
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
105 # just to be sure, let's check the first SHT definition.
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
106 pe_file.seek_to_va(shtptr1)
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
107 nb_shots, power, shotsptr = unpack('<III', pe_file.file.read(12))
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
108 if not (0 < nb_shots <= 1000
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
109 and 0 <= power < 1000
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
110 and 0 <= shotsptr - data_va < data_size - 36*nb_shots):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
111 break
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
112
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
113 else:
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
114 # XXX: Obscure python feature! This only gets executed if the
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
115 # XXX: loop ended without a break statement.
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
116 # In our case, it's only executed if all the 4 character
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
117 # definitions are considered valid.
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118 yield addr
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
119
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
120
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
121 @classmethod
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
122 def read(cls, file):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
123 pe_file = PEFile(file)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
124
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
125 character_records_va = list(cls.find_character_defs(pe_file))[0]
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
126
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
127 characters = []
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
128 shots_offsets = []
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
129 for character in xrange(4):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
130 sht = cls()
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
131
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
132 pe_file.seek_to_va(character_records_va + 6*4*character)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
133
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134 data = unpack('<4f2I', file.read(6*4))
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135 (speed, speed_focused, speed_unknown1, speed_unknown2,
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 shots_func_offset, shots_func_offset_focused) = data
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 sht.horizontal_vertical_speed = speed
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
139 sht.horizontal_vertical_focused_speed = speed_focused
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 sht.diagonal_speed = speed * SQ2
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 sht.diagonal_focused_speed = speed_focused * SQ2
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143 # Read from “push” operand
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144 pe_file.seek_to_va(shots_func_offset + 4)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
145 offset = unpack('<I', file.read(4))[0]
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146 shots_offsets.append(offset)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
147
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
148 characters.append(sht)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
150 character = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
151 for shots_offset in shots_offsets:
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
152 pe_file.seek_to_va(shots_offset)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
153
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
154 level_count = 9
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
155 levels = []
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 for i in xrange(level_count):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
157 shots_count, power, offset = unpack('<III', file.read(3*4))
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
158 levels.append((shots_count, power, offset))
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 sht = characters[character]
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161 sht.shots = {}
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
163 for shots_count, power, offset in levels:
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
164 sht.shots[power] = []
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
165 pe_file.seek_to_va(offset)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
166
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
167 for i in xrange(shots_count):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
168 shot = Shot()
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
170 data = unpack('<HH6fHBBhh', file.read(36))
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171 (shot.interval, shot.delay, x, y, hitbox_x, hitbox_y,
230
1c24a6d93c1b Improve find_character_defs, clean up a bit, and disable attack types 2 and 3 for now
Thibaut Girka <thib@sitedethib.com>
parents: 229
diff changeset
172 shot.angle, shot.speed, shot.damage, shot.orb, shot.type,
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
173 shot.sprite, shot.unknown1) = data
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
174
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
175 shot.pos = (x, y)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
176 shot.hitbox = (hitbox_x, hitbox_y)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
177
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
178 sht.shots[power].append(shot)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
179
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
180 character += 1
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
181
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
182
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
183 return characters
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
184