summaryrefslogtreecommitdiff
path: root/pokemontools/crystal.py
diff options
context:
space:
mode:
Diffstat (limited to 'pokemontools/crystal.py')
-rw-r--r--pokemontools/crystal.py93
1 files changed, 62 insertions, 31 deletions
diff --git a/pokemontools/crystal.py b/pokemontools/crystal.py
index c76d006..45eb306 100644
--- a/pokemontools/crystal.py
+++ b/pokemontools/crystal.py
@@ -67,6 +67,9 @@ is_valid_address = addresses.is_valid_address
import old_text_script
OldTextScript = old_text_script
+import configuration
+conf = configuration.Config()
+
from map_names import map_names
# ---- script_parse_table explanation ----
@@ -112,16 +115,22 @@ def map_name_cleaner(input):
rom = romstr.RomStr(None)
-def direct_load_rom(filename="../baserom.gbc"):
+def direct_load_rom(filename=None):
"""loads bytes into memory"""
+ if filename == None:
+ filename = os.path.join(conf.path, "baserom.gbc")
+ global rom
file_handler = open(filename, "rb")
rom = romstr.RomStr(file_handler.read())
file_handler.close()
return rom
-def load_rom(filename="../baserom.gbc"):
+def load_rom(filename=None):
"""checks that the loaded rom matches the path
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):
@@ -129,14 +138,19 @@ def load_rom(filename="../baserom.gbc"):
elif os.lstat(filename).st_size != len(rom):
return direct_load_rom(filename)
-def direct_load_asm(filename="../main.asm"):
+def direct_load_asm(filename=None):
+ if filename == None:
+ filename = os.path.join(conf.path, "main.asm")
"""returns asm source code (AsmList) from a file"""
asm = open(filename, "r").read().split("\n")
asm = romstr.AsmList(asm)
return asm
-def load_asm(filename="../main.asm"):
+def load_asm(filename=None):
"""returns asm source code (AsmList) from a file (uses a global)"""
+ if filename == None:
+ filename = os.path.join(conf.path, "main.asm")
+ global asm
asm = direct_load_asm(filename=filename)
return asm
@@ -2164,8 +2178,8 @@ pksv_crystal_more = {
0x07: ["if not equal", ["byte", SingleByteParam], ["pointer", ScriptPointerLabelParam]],
0x08: ["iffalse", ["pointer", ScriptPointerLabelParam]],
0x09: ["iftrue", ["pointer", ScriptPointerLabelParam]],
- 0x0A: ["if less than", ["byte", SingleByteParam], ["pointer", ScriptPointerLabelParam]],
- 0x0B: ["if greater than", ["byte", SingleByteParam], ["pointer", ScriptPointerLabelParam]],
+ 0x0A: ["if greater than", ["byte", SingleByteParam], ["pointer", ScriptPointerLabelParam]],
+ 0x0B: ["if less than", ["byte", SingleByteParam], ["pointer", ScriptPointerLabelParam]],
0x0C: ["jumpstd", ["predefined_script", MultiByteParam]],
0x0D: ["callstd", ["predefined_script", MultiByteParam]],
0x0E: ["3callasm", ["asm", AsmPointerParam]],
@@ -2206,14 +2220,14 @@ pksv_crystal_more = {
0x2E: ["giveegg", ["pkmn", PokemonParam], ["level", DecimalParam]],
0x2F: ["givepokeitem", ["pointer", PointerParamToItemAndLetter]],
0x30: ["checkpokeitem", ["pointer", PointerParamToItemAndLetter]], # not pksv
- 0x31: ["checkbit1", ["bit_number", MultiByteParam]],
- 0x32: ["clearbit1", ["bit_number", MultiByteParam]],
- 0x33: ["setbit1", ["bit_number", MultiByteParam]],
- 0x34: ["checkbit2", ["bit_number", MultiByteParam]],
- 0x35: ["clearbit2", ["bit_number", MultiByteParam]],
- 0x36: ["setbit2", ["bit_number", MultiByteParam]],
- 0x37: ["wildoff"],
- 0x38: ["wildon"],
+ 0x31: ["checkevent", ["bit_number", MultiByteParam]],
+ 0x32: ["clearevent", ["bit_number", MultiByteParam]],
+ 0x33: ["setevent", ["bit_number", MultiByteParam]],
+ 0x34: ["checkflag", ["bit_number", MultiByteParam]],
+ 0x35: ["clearflag", ["bit_number", MultiByteParam]],
+ 0x36: ["setflag", ["bit_number", MultiByteParam]],
+ 0x37: ["wildon"],
+ 0x38: ["wildoff"],
0x39: ["xycompare", ["pointer", MultiByteParam]],
0x3A: ["warpmod", ["warp_id", SingleByteParam], ["map_group", MapGroupParam], ["map_id", MapIdParam]],
0x3B: ["blackoutmod", ["map_group", MapGroupParam], ["map_id", MapIdParam]],
@@ -2326,12 +2340,11 @@ pksv_crystal_more = {
0xA2: ["credits"],
0xA3: ["warpfacing", ["facing", SingleByteParam], ["map_group", MapGroupParam], ["map_id", MapIdParam], ["x", SingleByteParam], ["y", SingleByteParam]],
0xA4: ["storetext", ["pointer", PointerLabelBeforeBank], ["memory", SingleByteParam]],
- 0xA5: ["displaylocation", ["id", SingleByteParam]],
- 0xA6: ["unknown0xa6"],
- 0xA7: ["unknown0xa7"],
- 0xA8: ["unknown0xa8", ["unknown", SingleByteParam]],
+ 0xA5: ["displaylocation", ["id", SingleByteParam], ["memory", SingleByteParam]],
+ 0xA6: ["trainerclassname", ["id", SingleByteParam]],
+ 0xA7: ["name", ["type", SingleByteParam], ["id", SingleByteParam]],
+ 0xA8: ["wait", ["unknown", SingleByteParam]],
0xA9: ["unknown0xa9"],
- 0xAA: ["unknown0xaa"],
}
def create_command_classes(debug=False):
"""creates some classes for each command byte"""
@@ -2612,7 +2625,7 @@ effect_commands = {
0xa7: ['effect0xa7'],
0xa8: ['effect0xa8'],
0xa9: ['clearmissdamage'],
- 0xaa: ['wait'],
+ 0xaa: ['movedelay'],
0xab: ['hittarget'],
0xac: ['tristatuschance'],
0xad: ['supereffectivelooptext'],
@@ -2654,7 +2667,9 @@ effect_classes = create_effect_command_classes()
-def generate_macros(filename="../script_macros.asm"):
+def generate_macros(filename=None):
+ if filename == None:
+ filename = os.path.join(conf.path, "script_macros.asm")
"""generates all macros based on commands
this is dumped into script_macros.asm"""
output = "; This file is generated by generate_macros.\n"
@@ -5278,7 +5293,7 @@ def parse_second_map_header_at(address, map_group=None, map_id=None, debug=True)
class MapBlockData:
base_label = "MapBlockData_"
- maps_path = os.path.realpath(os.path.join(os.path.realpath("."), "../maps"))
+ maps_path = os.path.realpath(os.path.join(conf.path, "maps"))
def __init__(self, address, map_group=None, map_id=None, debug=True, bank=None, label=None, width=None, height=None):
self.address = address
@@ -5922,9 +5937,11 @@ def reset_incbins():
isolate_incbins(asm=asm)
process_incbins()
-def find_incbin_to_replace_for(address, debug=False, rom_file="../baserom.gbc"):
+def find_incbin_to_replace_for(address, debug=False, rom_file=None):
"""returns a line number for which incbin to edit
if you were to insert bytes into main.asm"""
+ if rom_file == None:
+ rom_file = os.path.join(conf.path, "baserom.gbc")
if type(address) == str: address = int(address, 16)
if not (0 <= address <= os.lstat(rom_file).st_size):
raise IndexError("address is out of bounds")
@@ -5952,7 +5969,7 @@ def find_incbin_to_replace_for(address, debug=False, rom_file="../baserom.gbc"):
return incbin_key
return None
-def split_incbin_line_into_three(line, start_address, byte_count, rom_file="../baserom.gbc"):
+def split_incbin_line_into_three(line, start_address, byte_count, rom_file=None):
"""
splits an incbin line into three pieces.
you can replace the middle one with the new content of length bytecount
@@ -5960,6 +5977,8 @@ def split_incbin_line_into_three(line, start_address, byte_count, rom_file="../b
start_address: where you want to start inserting bytes
byte_count: how many bytes you will be inserting
"""
+ if rom_file == None:
+ rom_file = os.path.join(conf.path, "baserom.gbc")
if type(start_address) == str: start_address = int(start_address, 16)
if not (0 <= start_address <= os.lstat(rom_file).st_size):
raise IndexError("start_address is out of bounds")
@@ -6019,9 +6038,9 @@ def generate_diff_insert(line_number, newline, debug=False):
CalledProcessError = None
try:
- diffcontent = subprocess.check_output("diff -u ../main.asm " + newfile_filename, shell=True)
+ diffcontent = subprocess.check_output("diff -u " + os.path.join(conf.path, "main.asm") + " " + newfile_filename, shell=True)
except (AttributeError, CalledProcessError):
- p = subprocess.Popen(["diff", "-u", "../main.asm", newfile_filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p = subprocess.Popen(["diff", "-u", os.path.join(conf.path, "main.asm"), newfile_filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
diffcontent = out
@@ -6041,8 +6060,8 @@ def apply_diff(diff, try_fixing=True, do_compile=True):
fh.close()
# apply the patch
- os.system("cp ../main.asm ../main1.asm")
- os.system("patch ../main.asm temp.patch")
+ os.system("cp " + os.path.join(conf.path, "main.asm") + " " + os.path.join(conf.path, "main1.asm"))
+ os.system("patch " + os.path.join(conf.path, "main.asm") + " " + "temp.patch")
# remove the patch
os.system("rm temp.patch")
@@ -6050,11 +6069,11 @@ def apply_diff(diff, try_fixing=True, do_compile=True):
# confirm it's working
if do_compile:
try:
- subprocess.check_call("cd ../; make clean; make", shell=True)
+ subprocess.check_call("cd " + conf.path + "; make clean; make", shell=True)
return True
except Exception, exc:
if try_fixing:
- os.system("mv ../main1.asm ../main.asm")
+ os.system("mv " + os.path.join(conf.path, "main1.asm") + " " + os.path.join(conf.path, "main.asm"))
return False
import crystalparts.asmline
@@ -6179,9 +6198,21 @@ class AsmSection:
def to_asm(self):
return self.line
+new_asm = None
+def load_asm2(filename=None, force=False):
+ """loads the asm source code into memory"""
+ if filename == None:
+ filename = os.path.join(conf.path, "main.asm")
+ global new_asm
+ if new_asm == None or force:
+ new_asm = Asm(filename=filename)
+ return new_asm
+
class Asm:
"""controls the overall asm output"""
- def __init__(self, filename="../main.asm", debug=True):
+ def __init__(self, filename=None, debug=True):
+ if filename == None:
+ filename = os.path.join(conf.path, "main.asm")
self.parts = []
self.labels = []
self.filename = filename