summaryrefslogtreecommitdiff
path: root/pokemontools/crystal.py
diff options
context:
space:
mode:
Diffstat (limited to 'pokemontools/crystal.py')
-rw-r--r--pokemontools/crystal.py67
1 files changed, 44 insertions, 23 deletions
diff --git a/pokemontools/crystal.py b/pokemontools/crystal.py
index d08c15d..74763e0 100644
--- a/pokemontools/crystal.py
+++ b/pokemontools/crystal.py
@@ -135,13 +135,7 @@ def load_rom(filename=None):
and then loads the rom if necessary."""
if filename == None:
filename = os.path.join(conf.path, "baserom.gbc")
- global rom
- if rom != romstr.RomStr(None) and rom != None:
- return rom
- if not isinstance(rom, romstr.RomStr):
- return direct_load_rom(filename=filename)
- elif os.lstat(filename).st_size != len(rom):
- return direct_load_rom(filename)
+ return direct_load_rom(filename)
def direct_load_asm(filename=None):
if filename == None:
@@ -903,6 +897,8 @@ class PointerLabelParam(MultiByteParam):
label = None
elif result.address != caddress:
label = None
+ elif hasattr(result, "keys") and "label" in result.keys():
+ label = result["label"]
elif result != None:
label = None
@@ -1457,21 +1453,27 @@ def read_event_flags():
global event_flags
constants = wram.read_constants(os.path.join(conf.path, 'constants.asm'))
event_flags = dict(filter(lambda key_value: key_value[1].startswith('EVENT_'), constants.items()))
+ return event_flags
engine_flags = None
def read_engine_flags():
global engine_flags
constants = wram.read_constants(os.path.join(conf.path, 'constants.asm'))
engine_flags = dict(filter(lambda key_value1: key_value1[1].startswith('ENGINE_'), constants.items()))
+ return engine_flags
class EventFlagParam(MultiByteParam):
def to_asm(self):
- if event_flags is None: read_event_flags()
+ global event_flags
+ if event_flags is None:
+ event_flags = read_event_flags()
return event_flags.get(self.parsed_number) or MultiByteParam.to_asm(self)
class EngineFlagParam(MultiByteParam):
def to_asm(self):
- if engine_flags is None: read_engine_flags()
+ global engine_flags
+ if engine_flags is None:
+ engine_flags = read_engine_flags()
return engine_flags.get(self.parsed_number) or MultiByteParam.to_asm(self)
@@ -4905,7 +4907,7 @@ class MapHeader(object):
output += "db " + ", ".join([self.location_on_world_map.to_asm(), self.music.to_asm(), self.time_of_day.to_asm(), self.fishing_group.to_asm()])
return output
-def parse_map_header_at(address, map_group=None, map_id=None, all_map_headers=None, debug=True):
+def parse_map_header_at(address, map_group=None, map_id=None, all_map_headers=None, rom=None, debug=True):
"""parses an arbitrary map header at some address"""
logging.debug("parsing a map header at {0}".format(hex(address)))
map_header = MapHeader(address, map_group=map_group, map_id=map_id, debug=debug)
@@ -6111,11 +6113,13 @@ def parse_map_header_by_id(*args, **kwargs):
map_header_offset = offset + ((map_id - 1) * map_header_byte_size)
return parse_map_header_at(map_header_offset, all_map_headers=all_map_headers, map_group=map_group, map_id=map_id)
-def parse_all_map_headers(map_names, all_map_headers=None, debug=True):
+def parse_all_map_headers(map_names, all_map_headers=None, _parse_map_header_at=None, rom=None, debug=True):
"""
Calls parse_map_header_at for each map in each map group. Updates the
map_names structure.
"""
+ if _parse_map_header_at == None:
+ _parse_map_header_at = parse_map_header_at
if "offset" not in map_names[1]:
raise Exception("dunno what to do - map_names should have groups with pre-calculated offsets by now")
for (group_id, group_data) in map_names.items():
@@ -6132,7 +6136,7 @@ def parse_all_map_headers(map_names, all_map_headers=None, debug=True):
map_header_offset = offset + ((map_id - 1) * map_header_byte_size)
map_names[group_id][map_id]["header_offset"] = map_header_offset
- new_parsed_map = parse_map_header_at(map_header_offset, map_group=group_id, map_id=map_id, all_map_headers=all_map_headers, debug=debug)
+ new_parsed_map = _parse_map_header_at(map_header_offset, map_group=group_id, map_id=map_id, all_map_headers=all_map_headers, rom=rom, debug=debug)
map_names[group_id][map_id]["header_new"] = new_parsed_map
class PokedexEntryPointerTable(object):
@@ -6457,12 +6461,15 @@ def split_incbin_line_into_three(line, start_address, byte_count, rom_file=None)
output += "INCBIN \"baserom.gbc\",$" + hex(third[0])[2:] + ",$" + hex(third[1])[2:] # no newline
return output
-def generate_diff_insert(line_number, newline, debug=False):
+def generate_diff_insert(line_number, newline, _asm=None, debug=False):
"""generates a diff between the old main.asm and the new main.asm
note: requires python2.7 i think? b/c of subprocess.check_output"""
global asm
- original = "\n".join(line for line in asm)
- newfile = deepcopy(asm)
+ if _asm == None:
+ _asm = asm
+
+ original = "\n".join(line for line in _asm)
+ newfile = deepcopy(_asm)
newfile[line_number] = newline # possibly inserting multiple lines
newfile = "\n".join(line for line in newfile)
@@ -6473,6 +6480,10 @@ def generate_diff_insert(line_number, newline, debug=False):
original_filename = "ejroqjfoad.temp"
newfile_filename = "fjiqefo.temp"
+ main_path = os.path.join(conf.path, "main.asm")
+ if os.path.exists(main_path):
+ original_filename = main_path
+
original_fh = open(original_filename, "w")
original_fh.write(original)
original_fh.close()
@@ -6487,9 +6498,9 @@ def generate_diff_insert(line_number, newline, debug=False):
CalledProcessError = None
try:
- diffcontent = subprocess.check_output("diff -u " + os.path.join(conf.path, "main.asm") + " " + newfile_filename, shell=True)
+ diffcontent = subprocess.check_output("diff -u " + original_filename + " " + newfile_filename, shell=True)
except (AttributeError, CalledProcessError):
- p = subprocess.Popen(["diff", "-u", os.path.join(conf.path, "main.asm"), newfile_filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p = subprocess.Popen(["diff", "-u", original_filename, newfile_filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
diffcontent = out
@@ -7077,11 +7088,18 @@ def get_ram_label(address):
return wram.wram_labels[address][-1]
return None
-def get_label_for(address):
+def get_label_for(address, _all_labels=None, _script_parse_table=None):
"""
returns a label assigned to a particular address
"""
global all_labels
+ global script_parse_table
+
+ if _all_labels == None:
+ _all_labels = all_labels
+
+ if _script_parse_table == None:
+ _script_parse_table = script_parse_table
if address == None:
return None
@@ -7093,15 +7111,17 @@ def get_label_for(address):
return None
# the old way
- for thing in all_labels:
+ for thing in _all_labels:
if thing["address"] == address:
return thing["label"]
# the new way
- obj = script_parse_table[address]
+ obj = _script_parse_table[address]
if obj:
if hasattr(obj, "label"):
return obj.label.name
+ elif hasattr(obj, "keys") and "label" in obj.keys():
+ return obj["label"]
else:
return "AlreadyParsedNoDefaultUnknownLabel_" + hex(address)
@@ -7320,13 +7340,14 @@ def add_map_offsets_into_map_names(map_group_offsets, map_names=None):
rom_parsed = False
-def parse_rom(rom=None):
+def parse_rom(rom=None, _skip_wram_labels=False, _parse_map_header_at=None, debug=False):
if not rom:
# read the rom and figure out the offsets for maps
rom = direct_load_rom()
# make wram.wram_labels available
- setup_wram_labels()
+ if not _skip_wram_labels:
+ setup_wram_labels()
# figure out the map offsets
map_group_offsets = load_map_group_offsets(map_group_pointer_table=map_group_pointer_table, map_group_count=map_group_count, rom=rom)
@@ -7335,7 +7356,7 @@ def parse_rom(rom=None):
add_map_offsets_into_map_names(map_group_offsets, map_names=map_names)
# parse map header bytes for each map
- parse_all_map_headers(map_names, all_map_headers=all_map_headers)
+ parse_all_map_headers(map_names, all_map_headers=all_map_headers, _parse_map_header_at=_parse_map_header_at, rom=rom, debug=debug)
# find trainers based on scripts and map headers
# this can only happen after parsing the entire map and map scripts