annotate pytouhou/formats/exe.py @ 654:ec7e888e88f3

Up to instruction 34 validated.
author Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
date Thu, 08 Aug 2019 16:42:25 +0200
parents d1f0bb0b7a17
children
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
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
16 from copy import copy
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 from struct import Struct, unpack
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
18
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 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
20
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 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
22
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 logger = get_logger(__name__)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24
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 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
27
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28
298
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
29 class InvalidExeException(Exception):
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
30 pass
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
31
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
32
615
d1f0bb0b7a17 Don’t inherit explicitely from object, we are not on Python 2.7 anymore. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 590
diff changeset
33 class Shot:
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 def __init__(self):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 self.interval = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 self.delay = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 self.pos = (0., 0.)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 self.hitbox = (0., 0.)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 self.angle = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 self.speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41 self.damage = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 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
43 self.type = 0
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 self.sprite = 0
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 self.unknown1 = None
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47
615
d1f0bb0b7a17 Don’t inherit explicitely from object, we are not on Python 2.7 anymore. :)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 590
diff changeset
48 class SHT:
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 def __init__(self):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 #self.unknown1 = None
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 #self.bombs = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 #self.unknown2 = None
390
b11953cf1d3b Use only half-size hitboxes for player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 367
diff changeset
53 self.hitbox = 2.
b11953cf1d3b Use only half-size hitboxes for player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 367
diff changeset
54 self.graze_hitbox = 21.
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55 self.autocollection_speed = 8.
390
b11953cf1d3b Use only half-size hitboxes for player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 367
diff changeset
56 self.item_hitbox = 19.
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57 # 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
58 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
59 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
60 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
61 self.diagonal_speed = 0.
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62 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
63 self.shots = {}
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
64
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
65
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
66 @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
67 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
68 """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
69
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 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
71 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
72 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
73 """
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
74
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 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
76 data_section = [section for section in pe_file.sections
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
77 if section.Name.startswith(b'.data')][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
78 text_section = [section for section in pe_file.sections
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
79 if section.Name.startswith(b'.text')][0]
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
80 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
81 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
82 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
83 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
84
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
85 # Search the whole data segment for 4 successive character definitions
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
86 for addr in range(data_va, data_va + data_size, 4):
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
87 for character_id in range(4):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
88 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
89 (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
90 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
91
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
92 # 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
93 # 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
94 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
95 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
96 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
97 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
98 break
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
99
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
100 # 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
101 # Now, make sure the shoot function wrappers pass valid addresses
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
102
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
103 # Search for the “push” instruction
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
104 for i in range(20):
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
105 # Find the “push” instruction
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
106 pe_file.seek_to_va(ptr1 + i)
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
107 instr1, shtptr1 = unpack('<BI', pe_file.file.read(5))
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
108 pe_file.seek_to_va(ptr2 + i)
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
109 instr2, shtptr2 = unpack('<BI', pe_file.file.read(5))
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
110 if instr1 == 0x68 and instr2 == 0x68 and (0 <= shtptr1 - data_va < data_size - 12
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
111 and 0 <= shtptr2 - data_va < data_size - 12):
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
112 # It is unlikely this character record is *not* valid, but
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
113 # just to be sure, let's check the first SHT definition.
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
114 pe_file.seek_to_va(shtptr1)
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
115 nb_shots, power, shotsptr = unpack('<III', pe_file.file.read(12))
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
116 if (0 < nb_shots <= 1000
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
117 and 0 <= power < 1000
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
118 and 0 <= shotsptr - data_va < data_size - 36*nb_shots):
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
119 break
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
120 # Check if everything is fine...
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
121 if not (0 <= shtptr1 - data_va < data_size - 12
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
122 and 0 <= shtptr2 - data_va < data_size - 12
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
123 and 0 < nb_shots <= 1000
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
124 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
125 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
126 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
127
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
128 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
129 # 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
130 # 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
131 # 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
132 # 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
133 yield addr
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 @classmethod
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137 def read(cls, file):
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 pe_file = PEFile(file)
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
139 data_section = [section for section in pe_file.sections
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
140 if section.Name.startswith(b'.data')][0]
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
141 data_va = pe_file.image_base + data_section.VirtualAddress
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
142 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
143
367
2674c789e0c3 Various optimizations
Thibaut Girka <thib@sitedethib.com>
parents: 305
diff changeset
144 try:
2674c789e0c3 Various optimizations
Thibaut Girka <thib@sitedethib.com>
parents: 305
diff changeset
145 character_records_va = next(cls.find_character_defs(pe_file))
2674c789e0c3 Various optimizations
Thibaut Girka <thib@sitedethib.com>
parents: 305
diff changeset
146 except StopIteration:
298
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
147 raise InvalidExeException
92a6fd2632f1 Improve heuristic to filter out non-game exes (like custom.exe).
Thibaut Girka <thib@sitedethib.com>
parents: 261
diff changeset
148
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149 characters = []
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
150 shots_offsets = {}
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
151 for character in range(4):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
152 sht = cls()
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 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
155
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 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
157 (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
158 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
159
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 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
161 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
162 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
163 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
164
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
165 # Characters might have different shot types whether they are
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
166 # focused or not, but properties read earlier apply to both modes.
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
167 focused_sht = copy(sht)
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
168 characters.append((sht, focused_sht))
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
170 for sht, func_offset in ((sht, shots_func_offset), (focused_sht, shots_func_offset_focused)):
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
171 # Search for the “push” instruction
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
172 for i in range(20):
261
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
173 # Find the “push” instruction
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
174 pe_file.seek_to_va(func_offset + i)
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
175 instr, offset = unpack('<BI', file.read(5))
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
176 if instr == 0x68 and 0 <= offset - data_va < data_size - 12:
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
177 pe_file.seek_to_va(offset)
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
178 nb_shots, power, shotsptr = unpack('<III', pe_file.file.read(12))
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
179 if (0 < nb_shots <= 1000
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
180 and 0 <= power < 1000
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
181 and 0 <= shotsptr - data_va < data_size - 36*nb_shots):
2876c267be00 Add heuristics to extract character data from the demo .exe.
Thibaut Girka <thib@sitedethib.com>
parents: 236
diff changeset
182 break
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
183 if offset not in shots_offsets:
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
184 shots_offsets[offset] = []
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
185 shots_offsets[offset].append(sht)
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
186
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
187 for shots_offset, shts in shots_offsets.items():
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
188 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
189
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
190 level_count = 9
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
191 levels = []
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
192 for i in range(level_count):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
193 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
194 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
195
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
196 shots = {}
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
197
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
198 for shots_count, power, offset in levels:
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
199 shots[power] = []
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 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
201
590
e15672733c93 Switch to Python 3.x instead of 2.7.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 390
diff changeset
202 for i in range(shots_count):
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
203 shot = Shot()
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
204
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
205 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
206 (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
207 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
208 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
209
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210 shot.pos = (x, y)
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
211 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
212
235
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
213 shots[power].append(shot)
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
214
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
215 for sht in shts:
e59bd7979ddc Do a little cleanup, and fix PCB SHT usage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 230
diff changeset
216 sht.shots = shots
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
217
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
219 return characters
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
220