You've already forked pokecrystal-board
mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2025-04-09 05:44:44 -07:00
This commit is contained in:
251
audio/engine.asm
251
audio/engine.asm
File diff suppressed because it is too large
Load Diff
220
battle/magikarp_length.asm
Normal file
220
battle/magikarp_length.asm
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
CalcMagikarpLength: ; fbbfc
|
||||||
|
; Return Magikarp's length (in mm) in MagikarpLength (big endian)
|
||||||
|
;
|
||||||
|
; input:
|
||||||
|
; de: EnemyMonDVs
|
||||||
|
; bc: PlayerID
|
||||||
|
|
||||||
|
; This function is needlessly convoluted, and poorly commented.
|
||||||
|
; Reading is discouraged.
|
||||||
|
|
||||||
|
; In short, it generates a value between 190 and 1786 using
|
||||||
|
; a Magikarp's DVs and its trainer ID. This value is further
|
||||||
|
; scrutinized in GetEnemyMon to make longer Magikarp even rarer.
|
||||||
|
|
||||||
|
; This is done by calculating the value using operands from
|
||||||
|
; a conversion lookup table.
|
||||||
|
|
||||||
|
; Our index is calculated by xoring DVs with the trainer ID:
|
||||||
|
|
||||||
|
; bc = rrc(rrc(dvs)) xor rrc(id)
|
||||||
|
|
||||||
|
; if bc < $a: MagikarpLength = c + 190
|
||||||
|
; if bc >= $ff00: MagikarpLength = c + 1370
|
||||||
|
; else: MagikarpLength = z*100 + (bc-x)/y
|
||||||
|
|
||||||
|
; X, Y, and Z depend on the value of b as follows:
|
||||||
|
|
||||||
|
; if b = 0: x = 310, y = 2, z = 3
|
||||||
|
; if b = 1: x = 710, y = 4, z = 4
|
||||||
|
; if b = 2-9: x = 2710, y = 20, z = 5
|
||||||
|
; if b = 10-29: x = 7710, y = 50, z = 6
|
||||||
|
; if b = 30-68: x = 17710, y = 100, z = 7
|
||||||
|
; if b = 69-126: x = 32710, y = 150, z = 8
|
||||||
|
; if b = 127-185: x = 47710, y = 150, z = 9
|
||||||
|
; if b = 186-224: x = 57710, y = 100, z = 10
|
||||||
|
; if b = 225-243: x = 62710, y = 50, z = 11
|
||||||
|
; if b = 244-251: x = 64710, y = 20, z = 12
|
||||||
|
; if b = 252-253: x = 65210, y = 5, z = 13
|
||||||
|
; if b = 254: x = 65410, y = 2, z = 14
|
||||||
|
|
||||||
|
; These values represent arbitrary conversion points.
|
||||||
|
|
||||||
|
|
||||||
|
; b = rrcrrc(atkdefdv) xor rrc(id[0])
|
||||||
|
|
||||||
|
; id
|
||||||
|
ld h, b
|
||||||
|
ld l, c
|
||||||
|
ld a, [hli]
|
||||||
|
ld b, a
|
||||||
|
ld c, [hl]
|
||||||
|
rrc b
|
||||||
|
rrc c
|
||||||
|
|
||||||
|
; dvs
|
||||||
|
ld a, [de]
|
||||||
|
inc de
|
||||||
|
rrca
|
||||||
|
rrca
|
||||||
|
xor b
|
||||||
|
ld b, a
|
||||||
|
|
||||||
|
; c = rrcrrc(spdspcdv) xor rrc(id[1])
|
||||||
|
|
||||||
|
ld a, [de]
|
||||||
|
rrca
|
||||||
|
rrca
|
||||||
|
xor c
|
||||||
|
ld c, a
|
||||||
|
|
||||||
|
; if bc < $000a:
|
||||||
|
ld a, b
|
||||||
|
and a
|
||||||
|
jr nz, .loadtable
|
||||||
|
ld a, c
|
||||||
|
cp a, $a
|
||||||
|
jr nc, .loadtable
|
||||||
|
|
||||||
|
; de = hl = bc + $be
|
||||||
|
ld hl, $be
|
||||||
|
add hl, bc
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
jr .endtable
|
||||||
|
|
||||||
|
.loadtable
|
||||||
|
ld hl, .MagikarpLengthTable
|
||||||
|
ld a, $02
|
||||||
|
ld [$d265], a
|
||||||
|
|
||||||
|
.readtable
|
||||||
|
ld a, [hli]
|
||||||
|
ld e, a
|
||||||
|
ld a, [hli]
|
||||||
|
ld d, a
|
||||||
|
call .BLessThanD
|
||||||
|
jr nc, .advancetable
|
||||||
|
|
||||||
|
; c = bc / [hl]
|
||||||
|
call .BCMinusDE
|
||||||
|
ld a, b
|
||||||
|
ld [$ffb3], a
|
||||||
|
ld a, c
|
||||||
|
ld [$ffb4], a
|
||||||
|
ld a, [hl]
|
||||||
|
ld [$ffb7], a
|
||||||
|
ld b, $02
|
||||||
|
call Divide
|
||||||
|
ld a, [$ffb6]
|
||||||
|
ld c, a
|
||||||
|
|
||||||
|
; de = c + 100 * (2 + number of rows down the table)
|
||||||
|
xor a
|
||||||
|
ld [$ffb4], a
|
||||||
|
ld [$ffb5], a
|
||||||
|
ld a, $64
|
||||||
|
ld [$ffb6], a
|
||||||
|
ld a, [$d265]
|
||||||
|
ld [$ffb7], a
|
||||||
|
call Multiply
|
||||||
|
ld b, $00
|
||||||
|
ld a, [$ffb6]
|
||||||
|
add c
|
||||||
|
ld e, a
|
||||||
|
ld a, [$ffb5]
|
||||||
|
adc b
|
||||||
|
ld d, a
|
||||||
|
jr .endtable
|
||||||
|
|
||||||
|
.advancetable
|
||||||
|
inc hl ; align to next triplet
|
||||||
|
ld a, [$d265]
|
||||||
|
inc a
|
||||||
|
ld [$d265], a
|
||||||
|
cp a, $10
|
||||||
|
jr c, .readtable
|
||||||
|
|
||||||
|
call .BCMinusDE
|
||||||
|
ld hl, $0640
|
||||||
|
add hl, bc
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
|
||||||
|
.endtable
|
||||||
|
ld h, d
|
||||||
|
ld l, e
|
||||||
|
add hl, hl
|
||||||
|
add hl, hl
|
||||||
|
add hl, de
|
||||||
|
add hl, hl ; hl = de * 10
|
||||||
|
|
||||||
|
ld de, $ff02
|
||||||
|
ld a, $ff
|
||||||
|
.loop
|
||||||
|
inc a
|
||||||
|
add hl, de ; - 254
|
||||||
|
jr c, .loop
|
||||||
|
|
||||||
|
ld d, $00
|
||||||
|
|
||||||
|
; mod $0c
|
||||||
|
.modloop
|
||||||
|
cp a, $0c
|
||||||
|
jr c, .done
|
||||||
|
sub a, $0c
|
||||||
|
inc d
|
||||||
|
jr .modloop
|
||||||
|
|
||||||
|
.done
|
||||||
|
ld e, a
|
||||||
|
ld hl, MagikarpLength
|
||||||
|
ld [hl], d
|
||||||
|
inc hl
|
||||||
|
ld [hl], e
|
||||||
|
ret
|
||||||
|
; fbc9a
|
||||||
|
|
||||||
|
.BLessThanD ; fbc9a
|
||||||
|
; return carry if b < d
|
||||||
|
ld a, b
|
||||||
|
cp d
|
||||||
|
ret c
|
||||||
|
ret nc
|
||||||
|
; fbc9e
|
||||||
|
|
||||||
|
.CLessThanE ; fbc9e
|
||||||
|
; unused
|
||||||
|
ld a, c
|
||||||
|
cp e
|
||||||
|
ret
|
||||||
|
; fbca1
|
||||||
|
|
||||||
|
.BCMinusDE ; fbca1
|
||||||
|
; bc -= de
|
||||||
|
ld a, c
|
||||||
|
sub e
|
||||||
|
ld c, a
|
||||||
|
ld a, b
|
||||||
|
sbc d
|
||||||
|
ld b, a
|
||||||
|
ret
|
||||||
|
; fbca8
|
||||||
|
|
||||||
|
.MagikarpLengthTable ; fbca8
|
||||||
|
; ????, divisor
|
||||||
|
dwb $006e, $01
|
||||||
|
dwb $0136, $02
|
||||||
|
dwb $02c6, $04
|
||||||
|
dwb $0a96, $14
|
||||||
|
dwb $1e1e, $32
|
||||||
|
dwb $452e, $64
|
||||||
|
dwb $7fc6, $96
|
||||||
|
dwb $ba5e, $96
|
||||||
|
dwb $e16e, $64
|
||||||
|
dwb $f4f6, $32
|
||||||
|
dwb $fcc6, $14
|
||||||
|
dwb $feba, $05
|
||||||
|
dwb $ff82, $02
|
||||||
|
; fbccf
|
||||||
|
|
@@ -3417,15 +3417,20 @@ BATTLETYPE_SUICUNE EQU $0c
|
|||||||
|
|
||||||
|
|
||||||
; joypad
|
; joypad
|
||||||
NO_INPUT EQU %00000000
|
BUTTONS EQU %00010000
|
||||||
BUTTON_A EQU %00000001
|
D_PAD EQU %00100000
|
||||||
BUTTON_B EQU %00000010
|
|
||||||
SELECT EQU %00000100
|
AUTO_INPUT EQU $ff
|
||||||
START EQU %00001000
|
|
||||||
D_RIGHT EQU %00010000
|
NO_INPUT EQU %00000000
|
||||||
D_LEFT EQU %00100000
|
BUTTON_A EQU %00000001
|
||||||
D_UP EQU %01000000
|
BUTTON_B EQU %00000010
|
||||||
D_DOWN EQU %10000000
|
SELECT EQU %00000100
|
||||||
|
START EQU %00001000
|
||||||
|
D_RIGHT EQU %00010000
|
||||||
|
D_LEFT EQU %00100000
|
||||||
|
D_UP EQU %01000000
|
||||||
|
D_DOWN EQU %10000000
|
||||||
|
|
||||||
; mbc
|
; mbc
|
||||||
NUM_SRAM_BANKS EQU 4
|
NUM_SRAM_BANKS EQU 4
|
||||||
|
824
credits.asm
Normal file
824
credits.asm
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
151
extras/disassemble_map_scripts.py
Normal file
151
extras/disassemble_map_scripts.py
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Dump out asm for scripting things in bank $25. This script will modify main.asm
|
||||||
|
and insert all scripting commands.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import crystal
|
||||||
|
from gbz80disasm import output_bank_opcodes
|
||||||
|
|
||||||
|
rom = crystal.load_rom()
|
||||||
|
roml = [ord(x) for x in rom]
|
||||||
|
|
||||||
|
script_command_table_address = 0x96cb1
|
||||||
|
script_command_count = 170
|
||||||
|
|
||||||
|
# a list of addresses for each script command
|
||||||
|
command_pointers = [crystal.calculate_pointer_from_bytes_at(script_command_table_address + (id * 2), bank=0x25) for id in range(0, 170)]
|
||||||
|
|
||||||
|
# a list of hex addresses for each script command in bank $25
|
||||||
|
command_pointers_hex = ["$%.2x" % (x % 0x4000 + 0x4000) for x in command_pointers]
|
||||||
|
|
||||||
|
commands = {}
|
||||||
|
|
||||||
|
# force data into a more usable form
|
||||||
|
for command in crystal.command_classes:
|
||||||
|
name = "Script_" + command.macro_name
|
||||||
|
id = command.id
|
||||||
|
params = {}
|
||||||
|
|
||||||
|
for (id2, param_type) in command.param_types.items():
|
||||||
|
param = {
|
||||||
|
"name": param_type["name"],
|
||||||
|
"type": param_type["class"].__name__,
|
||||||
|
}
|
||||||
|
params[id2] = param
|
||||||
|
|
||||||
|
if id <= 0xa9:
|
||||||
|
commands[id] = {
|
||||||
|
"name": name,
|
||||||
|
"params": params,
|
||||||
|
"address": command_pointers[id],
|
||||||
|
}
|
||||||
|
|
||||||
|
avoid = [
|
||||||
|
0x974b0,
|
||||||
|
0x974be,
|
||||||
|
0x9754b,
|
||||||
|
0x97556,
|
||||||
|
0x97562,
|
||||||
|
0x9756e,
|
||||||
|
0x97540,
|
||||||
|
|
||||||
|
0x96f8e, # verbosegiveitem2
|
||||||
|
]
|
||||||
|
|
||||||
|
class DisassembledScriptCommand():
|
||||||
|
"""
|
||||||
|
Just a temporary object to store information about a script command's asm.
|
||||||
|
This is used by some of the infrastructure in crystal.py to automatically
|
||||||
|
insert asm into main.asm, rather than having someone do it manually.
|
||||||
|
"""
|
||||||
|
dependencies = None
|
||||||
|
|
||||||
|
def __init__(self, label=None, id=None, address=None, params=None):
|
||||||
|
self.id = id
|
||||||
|
self.label = crystal.Label(name=label, address=address, object=self)
|
||||||
|
self.address = address
|
||||||
|
self.params = params
|
||||||
|
|
||||||
|
max_byte_count = 0x4000
|
||||||
|
|
||||||
|
# Some of these scripts need to be truncated before insertion, because
|
||||||
|
# output_bank_opcodes doesn't know anything about stopping if some of
|
||||||
|
# the local labels are not resolved yet.
|
||||||
|
|
||||||
|
# Script_if_equal
|
||||||
|
if address == 0x97540:
|
||||||
|
max_byte_count = 86
|
||||||
|
|
||||||
|
# disassemble and laso get the last address
|
||||||
|
(asm, last_address, last_hl_address, last_a_address, used_3d97) = output_bank_opcodes(address, max_byte_count=max_byte_count, stop_at=command_pointers, include_last_address=False)
|
||||||
|
|
||||||
|
# remove indentation
|
||||||
|
asm = asm.replace("\n\t", "\n")
|
||||||
|
if asm[0] == "\t":
|
||||||
|
asm = asm[1:]
|
||||||
|
|
||||||
|
# remove the last two newlines
|
||||||
|
while asm[-1] == "\n":
|
||||||
|
asm = asm[:-1]
|
||||||
|
|
||||||
|
self.asm = asm
|
||||||
|
self.last_address = last_address
|
||||||
|
|
||||||
|
# make sure this gets dumped into main.asm
|
||||||
|
#if crystal.script_parse_table[self.address] == None and crystal.script_parse_table[self.last_address] == None:
|
||||||
|
crystal.script_parse_table[self.address : self.last_address] = self
|
||||||
|
#else:
|
||||||
|
# print ".. hm, something is already at " + hex(self.address) + " for " + self.label.name
|
||||||
|
|
||||||
|
def to_asm(self):
|
||||||
|
#output += self.label + ": ; " + hex(self.address) + "\n"
|
||||||
|
output = "; script command " + hex(self.id) + "\n"
|
||||||
|
if len(self.params) > 0:
|
||||||
|
output += "; parameters:\n"
|
||||||
|
for (id2, param) in self.params.items():
|
||||||
|
output += "; " + param["name"] + " (" + param["type"] + ")\n"
|
||||||
|
output += "\n"
|
||||||
|
output += self.asm
|
||||||
|
return output
|
||||||
|
|
||||||
|
def get_dependencies(*args, **kwargs):
|
||||||
|
return []
|
||||||
|
|
||||||
|
# make instances of DisassembledScriptCommand
|
||||||
|
for (id, command) in commands.items():
|
||||||
|
name = command["name"]
|
||||||
|
params = command["params"]
|
||||||
|
address = command["address"]
|
||||||
|
|
||||||
|
script_asm = DisassembledScriptCommand(label=name, id=id, address=address, params=params)
|
||||||
|
#print script_asm.to_asm()
|
||||||
|
#print crystal.to_asm(script_asm, use_asm_rules=True)
|
||||||
|
|
||||||
|
class ScriptCommandTable():
|
||||||
|
address = script_command_table_address
|
||||||
|
last_address = script_command_table_address + (2 * 170)
|
||||||
|
dependencies = None
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.label = crystal.Label(name="ScriptCommandTable", address=self.address, object=self)
|
||||||
|
|
||||||
|
# make sure this gets dumped into main.asm
|
||||||
|
crystal.script_parse_table[self.address : self.last_address] = self
|
||||||
|
|
||||||
|
def get_dependencies(*args, **kwargs):
|
||||||
|
return []
|
||||||
|
|
||||||
|
def to_asm(self):
|
||||||
|
output = ""
|
||||||
|
for (id, command) in commands.items():
|
||||||
|
output += "dw " + command["name"] + "; " + hex(command["address"]) + "\n"
|
||||||
|
if output[-1] == "\n":
|
||||||
|
output = output[:-1]
|
||||||
|
return output
|
||||||
|
script_command_table = ScriptCommandTable()
|
||||||
|
#print crystal.to_asm(script_command_table, use_asm_rules=True)
|
||||||
|
|
||||||
|
# automatic asm insertion
|
||||||
|
asm = crystal.Asm()
|
||||||
|
asm.insert_and_dump(limit=500)
|
@@ -592,7 +592,7 @@ def asm_label(address):
|
|||||||
# why using a random value when you can use the address?
|
# why using a random value when you can use the address?
|
||||||
return ".ASM_" + hex(address)[2:]
|
return ".ASM_" + hex(address)[2:]
|
||||||
|
|
||||||
def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_address=True, stop_at=[], debug = False):
|
||||||
#fs = current_address
|
#fs = current_address
|
||||||
#b = bank_byte
|
#b = bank_byte
|
||||||
#in = input_data -- rom
|
#in = input_data -- rom
|
||||||
@@ -601,6 +601,10 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
|||||||
#ad = end_address
|
#ad = end_address
|
||||||
#a, oa = current_byte_number
|
#a, oa = current_byte_number
|
||||||
|
|
||||||
|
# stop_at can be used to supply a list of addresses to not disassemble
|
||||||
|
# over. This is useful if you know in advance that there are a lot of
|
||||||
|
# fall-throughs.
|
||||||
|
|
||||||
load_labels()
|
load_labels()
|
||||||
load_rom()
|
load_rom()
|
||||||
|
|
||||||
@@ -622,6 +626,7 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
|||||||
|
|
||||||
byte_labels = {}
|
byte_labels = {}
|
||||||
|
|
||||||
|
first_loop = True
|
||||||
output = ""
|
output = ""
|
||||||
keep_reading = True
|
keep_reading = True
|
||||||
while offset <= end_address and keep_reading:
|
while offset <= end_address and keep_reading:
|
||||||
@@ -629,6 +634,11 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
|||||||
is_data = False
|
is_data = False
|
||||||
maybe_byte = current_byte
|
maybe_byte = current_byte
|
||||||
|
|
||||||
|
# stop at any address
|
||||||
|
if not first_loop and offset in stop_at:
|
||||||
|
keep_reading = False
|
||||||
|
break
|
||||||
|
|
||||||
#first check if this byte already has a label
|
#first check if this byte already has a label
|
||||||
#if it does, use the label
|
#if it does, use the label
|
||||||
#if not, generate a new label
|
#if not, generate a new label
|
||||||
@@ -816,6 +826,8 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
|||||||
#offset += 1
|
#offset += 1
|
||||||
#current_byte_number += 1
|
#current_byte_number += 1
|
||||||
|
|
||||||
|
first_loop = False
|
||||||
|
|
||||||
#clean up unused labels
|
#clean up unused labels
|
||||||
for label_line in byte_labels.keys():
|
for label_line in byte_labels.keys():
|
||||||
address = label_line
|
address = label_line
|
||||||
@@ -824,7 +836,8 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, debug = False):
|
|||||||
output = output.replace((label_line["name"] + "\n").lower(), "")
|
output = output.replace((label_line["name"] + "\n").lower(), "")
|
||||||
|
|
||||||
#add the offset of the final location
|
#add the offset of the final location
|
||||||
output += "; " + hex(offset)
|
if include_last_address:
|
||||||
|
output += "; " + hex(offset)
|
||||||
|
|
||||||
return (output, offset, last_hl_address, last_a_address, used_3d97)
|
return (output, offset, last_hl_address, last_a_address, used_3d97)
|
||||||
|
|
||||||
|
486
extras/map_names.py
Normal file
486
extras/map_names.py
Normal file
@@ -0,0 +1,486 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
|
||||||
|
# this is modified in crystal.py during run-time
|
||||||
|
map_names = {
|
||||||
|
1: {
|
||||||
|
0x1: {"name": "Olivine Pokémon Center 1F",
|
||||||
|
"label": "OlivinePokeCenter1F"},
|
||||||
|
0x2: {"name": "Olivine Gym"},
|
||||||
|
0x3: {"name": "Olivine Voltorb House"},
|
||||||
|
0x4: {"name": "Olivine House Beta"},
|
||||||
|
0x5: {"name": "Olivine Punishment Speech House"},
|
||||||
|
0x6: {"name": "Olivine Good Rod House"},
|
||||||
|
0x7: {"name": "Olivine Cafe"},
|
||||||
|
0x8: {"name": "Olivine Mart"},
|
||||||
|
0x9: {"name": "Route 38 Ecruteak Gate"},
|
||||||
|
0xA: {"name": "Route 39 Barn"},
|
||||||
|
0xB: {"name": "Route 39 Farmhouse"},
|
||||||
|
0xC: {"name": "Route 38"},
|
||||||
|
0xD: {"name": "Route 39"},
|
||||||
|
0xE: {"name": "Olivine City"},
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
0x1: {"name": "Mahogany Red Gyarados Speech House"},
|
||||||
|
0x2: {"name": "Mahogany Gym"},
|
||||||
|
0x3: {"name": "Mahogany Pokémon Center 1F",
|
||||||
|
"label": "MahoganyPokeCenter1F"},
|
||||||
|
0x4: {"name": "Route 42 Ecruteak Gate"},
|
||||||
|
0x5: {"name": "Route 42"},
|
||||||
|
0x6: {"name": "Route 44"},
|
||||||
|
0x7: {"name": "Mahogany Town"},
|
||||||
|
},
|
||||||
|
3: {
|
||||||
|
0x1: {"name": "Sprout Tower 1F"},
|
||||||
|
0x2: {"name": "Sprout Tower 2F"},
|
||||||
|
0x3: {"name": "Sprout Tower 3F"},
|
||||||
|
0x4: {"name": "Tin Tower 1F"},
|
||||||
|
0x5: {"name": "Tin Tower 2F"},
|
||||||
|
0x6: {"name": "Tin Tower 3F"},
|
||||||
|
0x7: {"name": "Tin Tower 4F"},
|
||||||
|
0x8: {"name": "Tin Tower 5F"},
|
||||||
|
0x9: {"name": "Tin Tower 6F"},
|
||||||
|
0xA: {"name": "Tin Tower 7F"},
|
||||||
|
0xB: {"name": "Tin Tower 8F"},
|
||||||
|
0xC: {"name": "Tin Tower 9F"},
|
||||||
|
0xD: {"name": "Burned Tower 1F"},
|
||||||
|
0xE: {"name": "Burned Tower B1F"},
|
||||||
|
0xF: {"name": "National Park"},
|
||||||
|
0x10: {"name": "National Park Bug Contest"},
|
||||||
|
0x11: {"name": "Radio Tower 1F"},
|
||||||
|
0x12: {"name": "Radio Tower 2F"},
|
||||||
|
0x13: {"name": "Radio Tower 3F"},
|
||||||
|
0x14: {"name": "Radio Tower 4F"},
|
||||||
|
0x15: {"name": "Radio Tower 5F"},
|
||||||
|
0x16: {"name": "Ruins of Alph Outside"},
|
||||||
|
0x17: {"name": "Ruins of Alph Ho-oh Chamber"},
|
||||||
|
0x18: {"name": "Ruins of Alph Kabuto Chamber"},
|
||||||
|
0x19: {"name": "Ruins of Alph Omanyte Chamber"},
|
||||||
|
0x1A: {"name": "Ruins of Alph Aerodactyl Chamber"},
|
||||||
|
0x1B: {"name": "Ruins of Alph Inner Chamber"},
|
||||||
|
0x1C: {"name": "Ruins of Alph Research Center"},
|
||||||
|
0x1D: {"name": "Ruins of Alph Ho-oh Item Room"},
|
||||||
|
0x1E: {"name": "Ruins of Alph Kabuto Item Room"},
|
||||||
|
0x1F: {"name": "Ruins of Alph Omanyte Item Room"},
|
||||||
|
0x20: {"name": "Ruins of Alph Aerodactyl Item Room"},
|
||||||
|
0x21: {"name": "Ruins of Alph Ho-Oh Word Room"},
|
||||||
|
0x22: {"name": "Ruins of Alph Kabuto Word Room"},
|
||||||
|
0x23: {"name": "Ruins of Alph Omanyte Word Room"},
|
||||||
|
0x24: {"name": "Ruins of Alph Aerodactyl Word Room"},
|
||||||
|
0x25: {"name": "Union Cave 1F"},
|
||||||
|
0x26: {"name": "Union Cave B1F"},
|
||||||
|
0x27: {"name": "Union Cave B2F"},
|
||||||
|
0x28: {"name": "Slowpoke Well B1F"},
|
||||||
|
0x29: {"name": "Slowpoke Well B2F"},
|
||||||
|
0x2A: {"name": "Olivine Lighthouse 1F"},
|
||||||
|
0x2B: {"name": "Olivine Lighthouse 2F"},
|
||||||
|
0x2C: {"name": "Olivine Lighthouse 3F"},
|
||||||
|
0x2D: {"name": "Olivine Lighthouse 4F"},
|
||||||
|
0x2E: {"name": "Olivine Lighthouse 5F"},
|
||||||
|
0x2F: {"name": "Olivine Lighthouse 6F"},
|
||||||
|
0x30: {"name": "Mahogany Mart 1F"},
|
||||||
|
0x31: {"name": "Team Rocket Base B1F"},
|
||||||
|
0x32: {"name": "Team Rocket Base B2F"},
|
||||||
|
0x33: {"name": "Team Rocket Base B3F"},
|
||||||
|
0x34: {"name": "Ilex Forest"},
|
||||||
|
0x35: {"name": "Warehouse Entrance"},
|
||||||
|
0x36: {"name": "Underground Path Switch Room Entrances"},
|
||||||
|
0x37: {"name": "Goldenrod Dept Store B1F"},
|
||||||
|
0x38: {"name": "Underground Warehouse"},
|
||||||
|
0x39: {"name": "Mount Mortar 1F Outside"},
|
||||||
|
0x3A: {"name": "Mount Mortar 1F Inside"},
|
||||||
|
0x3B: {"name": "Mount Mortar 2F Inside"},
|
||||||
|
0x3C: {"name": "Mount Mortar B1F"},
|
||||||
|
0x3D: {"name": "Ice Path 1F"},
|
||||||
|
0x3E: {"name": "Ice Path B1F"},
|
||||||
|
0x3F: {"name": "Ice Path B2F Mahogany Side"},
|
||||||
|
0x40: {"name": "Ice Path B2F Blackthorn Side"},
|
||||||
|
0x41: {"name": "Ice Path B3F"},
|
||||||
|
0x42: {"name": "Whirl Island NW"},
|
||||||
|
0x43: {"name": "Whirl Island NE"},
|
||||||
|
0x44: {"name": "Whirl Island SW"},
|
||||||
|
0x45: {"name": "Whirl Island Cave"},
|
||||||
|
0x46: {"name": "Whirl Island SE"},
|
||||||
|
0x47: {"name": "Whirl Island B1F"},
|
||||||
|
0x48: {"name": "Whirl Island B2F"},
|
||||||
|
0x49: {"name": "Whirl Island Lugia Chamber"},
|
||||||
|
0x4A: {"name": "Silver Cave Room 1"},
|
||||||
|
0x4B: {"name": "Silver Cave Room 2"},
|
||||||
|
0x4C: {"name": "Silver Cave Room 3"},
|
||||||
|
0x4D: {"name": "Silver Cave Item Rooms"},
|
||||||
|
0x4E: {"name": "Dark Cave Violet Entrance"},
|
||||||
|
0x4F: {"name": "Dark Cave Blackthorn Entrance"},
|
||||||
|
0x50: {"name": "Dragon's Den 1F"},
|
||||||
|
0x51: {"name": "Dragon's Den B1F"},
|
||||||
|
0x52: {"name": "Dragon Shrine"},
|
||||||
|
0x53: {"name": "Tohjo Falls"},
|
||||||
|
0x54: {"name": "Diglett's Cave"},
|
||||||
|
0x55: {"name": "Mount Moon"},
|
||||||
|
0x56: {"name": "Underground"},
|
||||||
|
0x57: {"name": "Rock Tunnel 1F"},
|
||||||
|
0x58: {"name": "Rock Tunnel B1F"},
|
||||||
|
0x59: {"name": "Safari Zone Fuchsia Gate Beta"},
|
||||||
|
0x5A: {"name": "Safari Zone Beta"},
|
||||||
|
0x5B: {"name": "Victory Road"},
|
||||||
|
},
|
||||||
|
4: {
|
||||||
|
0x1: {"name": "Ecruteak House"}, # passage to Tin Tower
|
||||||
|
0x2: {"name": "Wise Trio's Room"},
|
||||||
|
0x3: {"name": "Ecruteak Pokémon Center 1F",
|
||||||
|
"label": "EcruteakPokeCenter1F"},
|
||||||
|
0x4: {"name": "Ecruteak Lugia Speech House"},
|
||||||
|
0x5: {"name": "Dance Theatre"},
|
||||||
|
0x6: {"name": "Ecruteak Mart"},
|
||||||
|
0x7: {"name": "Ecruteak Gym"},
|
||||||
|
0x8: {"name": "Ecruteak Itemfinder House"},
|
||||||
|
0x9: {"name": "Ecruteak City"},
|
||||||
|
},
|
||||||
|
5: {
|
||||||
|
0x1: {"name": "Blackthorn Gym 1F"},
|
||||||
|
0x2: {"name": "Blackthorn Gym 2F"},
|
||||||
|
0x3: {"name": "Blackthorn Dragon Speech House"},
|
||||||
|
0x4: {"name": "Blackthorn Dodrio Trade House"},
|
||||||
|
0x5: {"name": "Blackthorn Mart"},
|
||||||
|
0x6: {"name": "Blackthorn Pokémon Center 1F",
|
||||||
|
"label": "BlackthornPokeCenter1F"},
|
||||||
|
0x7: {"name": "Move Deleter's House"},
|
||||||
|
0x8: {"name": "Route 45"},
|
||||||
|
0x9: {"name": "Route 46"},
|
||||||
|
0xA: {"name": "Blackthorn City"},
|
||||||
|
},
|
||||||
|
6: {
|
||||||
|
0x1: {"name": "Cinnabar Pokémon Center 1F",
|
||||||
|
"label": "CinnabarPokeCenter1F"},
|
||||||
|
0x2: {"name": "Cinnabar Pokémon Center 2F Beta",
|
||||||
|
"label": "CinnabarPokeCenter2FBeta"},
|
||||||
|
0x3: {"name": "Route 19 - Fuchsia Gate"},
|
||||||
|
0x4: {"name": "Seafoam Gym"},
|
||||||
|
0x5: {"name": "Route 19"},
|
||||||
|
0x6: {"name": "Route 20"},
|
||||||
|
0x7: {"name": "Route 21"},
|
||||||
|
0x8: {"name": "Cinnabar Island"},
|
||||||
|
},
|
||||||
|
7: {
|
||||||
|
0x1: {"name": "Cerulean Gym Badge Speech House"},
|
||||||
|
0x2: {"name": "Cerulean Police Station"},
|
||||||
|
0x3: {"name": "Cerulean Trade Speech House"},
|
||||||
|
0x4: {"name": "Cerulean Pokémon Center 1F",
|
||||||
|
"label": "CeruleanPokeCenter1F"},
|
||||||
|
0x5: {"name": "Cerulean Pokémon Center 2F Beta",
|
||||||
|
"label": "CeruleanPokeCenter2FBeta"},
|
||||||
|
0x6: {"name": "Cerulean Gym"},
|
||||||
|
0x7: {"name": "Cerulean Mart"},
|
||||||
|
0x8: {"name": "Route 10 Pokémon Center 1F",
|
||||||
|
"label": "Route10PokeCenter1F"},
|
||||||
|
0x9: {"name": "Route 10 Pokémon Center 2F Beta",
|
||||||
|
"label": "Route10PokeCenter2FBeta"},
|
||||||
|
0xA: {"name": "Power Plant"},
|
||||||
|
0xB: {"name": "Bill's House"},
|
||||||
|
0xC: {"name": "Route 4"},
|
||||||
|
0xD: {"name": "Route 9"},
|
||||||
|
0xE: {"name": "Route 10 North"},
|
||||||
|
0xF: {"name": "Route 24"},
|
||||||
|
0x10: {"name": "Route 25"},
|
||||||
|
0x11: {"name": "Cerulean City"},
|
||||||
|
},
|
||||||
|
8: {
|
||||||
|
0x1: {"name": "Azalea Pokémon Center 1F",
|
||||||
|
"label": "AzaleaPokeCenter1F"},
|
||||||
|
0x2: {"name": "Charcoal Kiln"},
|
||||||
|
0x3: {"name": "Azalea Mart"},
|
||||||
|
0x4: {"name": "Kurt's House"},
|
||||||
|
0x5: {"name": "Azalea Gym"},
|
||||||
|
0x6: {"name": "Route 33"},
|
||||||
|
0x7: {"name": "Azalea Town"},
|
||||||
|
},
|
||||||
|
9: {
|
||||||
|
0x1: {"name": "Lake of Rage Hidden Power House"},
|
||||||
|
0x2: {"name": "Lake of Rage Magikarp House"},
|
||||||
|
0x3: {"name": "Route 43 Mahogany Gate"},
|
||||||
|
0x4: {"name": "Route 43 Gate"},
|
||||||
|
0x5: {"name": "Route 43"},
|
||||||
|
0x6: {"name": "Lake of Rage"},
|
||||||
|
},
|
||||||
|
10: {
|
||||||
|
0x1: {"name": "Route 32"},
|
||||||
|
0x2: {"name": "Route 35"},
|
||||||
|
0x3: {"name": "Route 36"},
|
||||||
|
0x4: {"name": "Route 37"},
|
||||||
|
0x5: {"name": "Violet City"},
|
||||||
|
0x6: {"name": "Violet Mart"},
|
||||||
|
0x7: {"name": "Violet Gym"},
|
||||||
|
0x8: {"name": "Earl's Pokémon Academy",
|
||||||
|
"label": "EarlsPokemonAcademy"},
|
||||||
|
0x9: {"name": "Violet Nickname Speech House"},
|
||||||
|
0xA: {"name": "Violet Pokémon Center 1F",
|
||||||
|
"label": "VioletPokeCenter1F"},
|
||||||
|
0xB: {"name": "Violet Onix Trade House"},
|
||||||
|
0xC: {"name": "Route 32 Ruins of Alph Gate"},
|
||||||
|
0xD: {"name": "Route 32 Pokémon Center 1F",
|
||||||
|
"label": "Route32PokeCenter1F"},
|
||||||
|
0xE: {"name": "Route 35 Goldenrod gate"},
|
||||||
|
0xF: {"name": "Route 35 National Park gate"},
|
||||||
|
0x10: {"name": "Route 36 Ruins of Alph gate"},
|
||||||
|
0x11: {"name": "Route 36 National Park gate"},
|
||||||
|
},
|
||||||
|
11: {
|
||||||
|
0x1: {"name": "Route 34"},
|
||||||
|
0x2: {"name": "Goldenrod City"},
|
||||||
|
0x3: {"name": "Goldenrod Gym"},
|
||||||
|
0x4: {"name": "Goldenrod Bike Shop"},
|
||||||
|
0x5: {"name": "Goldenrod Happiness Rater"},
|
||||||
|
0x6: {"name": "Goldenrod Bill's House"},
|
||||||
|
0x7: {"name": "Goldenrod Magnet Train Station"},
|
||||||
|
0x8: {"name": "Goldenrod Flower Shop"},
|
||||||
|
0x9: {"name": "Goldenrod PP Speech House"},
|
||||||
|
0xA: {"name": "Goldenrod Name Rater's House"},
|
||||||
|
0xB: {"name": "Goldenrod Dept Store 1F"},
|
||||||
|
0xC: {"name": "Goldenrod Dept Store 2F"},
|
||||||
|
0xD: {"name": "Goldenrod Dept Store 3F"},
|
||||||
|
0xE: {"name": "Goldenrod Dept Store 4F"},
|
||||||
|
0xF: {"name": "Goldenrod Dept Store 5F"},
|
||||||
|
0x10: {"name": "Goldenrod Dept Store 6F"},
|
||||||
|
0x11: {"name": "Goldenrod Dept Store Elevator"},
|
||||||
|
0x12: {"name": "Goldenrod Dept Store Roof"},
|
||||||
|
0x13: {"name": "Goldenrod Game Corner"},
|
||||||
|
0x14: {"name": "Goldenrod Pokémon Center 1F",
|
||||||
|
"label": "GoldenrodPokeCenter1F"},
|
||||||
|
0x15: {"name": "Goldenrod PokéCom Center 2F Mobile",
|
||||||
|
"label": "GoldenrodPokeComCenter2FMobile"},
|
||||||
|
0x16: {"name": "Ilex Forest Azalea Gate"},
|
||||||
|
0x17: {"name": "Route 34 Ilex Forest Gate"},
|
||||||
|
0x18: {"name": "Day Care"},
|
||||||
|
},
|
||||||
|
12: {
|
||||||
|
0x1: {"name": "Route 6"},
|
||||||
|
0x2: {"name": "Route 11"},
|
||||||
|
0x3: {"name": "Vermilion City"},
|
||||||
|
0x4: {"name": "Vermilion House Fishing Speech House"},
|
||||||
|
0x5: {"name": "Vermilion Pokémon Center 1F",
|
||||||
|
"label": "VermilionPokeCenter1F"},
|
||||||
|
0x6: {"name": "Vermilion Pokémon Center 2F Beta",
|
||||||
|
"label": "VermilionPokeCenter2FBeta"},
|
||||||
|
0x7: {"name": "Pokémon Fan Club"},
|
||||||
|
0x8: {"name": "Vermilion Magnet Train Speech House"},
|
||||||
|
0x9: {"name": "Vermilion Mart"},
|
||||||
|
0xA: {"name": "Vermilion House Diglett's Cave Speech House"},
|
||||||
|
0xB: {"name": "Vermilion Gym"},
|
||||||
|
0xC: {"name": "Route 6 Saffron Gate"},
|
||||||
|
0xD: {"name": "Route 6 Underground Entrance"},
|
||||||
|
},
|
||||||
|
13: {
|
||||||
|
0x1: {"name": "Route 1"},
|
||||||
|
0x2: {"name": "Pallet Town"},
|
||||||
|
0x3: {"name": "Red's House 1F"},
|
||||||
|
0x4: {"name": "Red's House 2F"},
|
||||||
|
0x5: {"name": "Blue's House"},
|
||||||
|
0x6: {"name": "Oak's Lab"},
|
||||||
|
},
|
||||||
|
14: {
|
||||||
|
0x1: {"name": "Route 3"},
|
||||||
|
0x2: {"name": "Pewter City"},
|
||||||
|
0x3: {"name": "Pewter Nidoran Speech House"},
|
||||||
|
0x4: {"name": "Pewter Gym"},
|
||||||
|
0x5: {"name": "Pewter Mart"},
|
||||||
|
0x6: {"name": "Pewter Pokémon Center 1F",
|
||||||
|
"label": "PewterPokeCenter1F"},
|
||||||
|
0x7: {"name": "Pewter Pokémon Center 2F Beta",
|
||||||
|
"label": "PewterPokeCEnter2FBeta"},
|
||||||
|
0x8: {"name": "Pewter Snooze Speech House"},
|
||||||
|
},
|
||||||
|
15: {
|
||||||
|
0x1: {"name": "Olivine Port"},
|
||||||
|
0x2: {"name": "Vermilion Port"},
|
||||||
|
0x3: {"name": "Fast Ship 1F"},
|
||||||
|
0x4: {"name": "Fast Ship Cabins NNW, NNE, NE",
|
||||||
|
"label": "FastShipCabins_NNW_NNE_NE"},
|
||||||
|
0x5: {"name": "Fast Ship Cabins SW, SSW, NW",
|
||||||
|
"label": "FastShipCabins_SW_SSW_NW"},
|
||||||
|
0x6: {"name": "Fast Ship Cabins SE, SSE, Captain's Cabin",
|
||||||
|
"label": "FastShipCabins_SE_SSE_CaptainsCabin"},
|
||||||
|
0x7: {"name": "Fast Ship B1F"},
|
||||||
|
0x8: {"name": "Olivine Port Passage"},
|
||||||
|
0x9: {"name": "Vermilion Port Passage"},
|
||||||
|
0xA: {"name": "Mount Moon Square"},
|
||||||
|
0xB: {"name": "Mount Moon Gift Shop"},
|
||||||
|
0xC: {"name": "Tin Tower Roof"},
|
||||||
|
},
|
||||||
|
16: {
|
||||||
|
0x1: {"name": "Route 23"},
|
||||||
|
0x2: {"name": "Indigo Plateau Pokémon Center 1F",
|
||||||
|
"label": "IndigoPlateauPokeCenter1F"},
|
||||||
|
0x3: {"name": "Will's Room"},
|
||||||
|
0x4: {"name": "Koga's Room"},
|
||||||
|
0x5: {"name": "Bruno's Room"},
|
||||||
|
0x6: {"name": "Karen's Room"},
|
||||||
|
0x7: {"name": "Lance's Room"},
|
||||||
|
0x8: {"name": "Hall of Fame",
|
||||||
|
"label": "HallOfFame"},
|
||||||
|
},
|
||||||
|
17: {
|
||||||
|
0x1: {"name": "Route 13"},
|
||||||
|
0x2: {"name": "Route 14"},
|
||||||
|
0x3: {"name": "Route 15"},
|
||||||
|
0x4: {"name": "Route 18"},
|
||||||
|
0x5: {"name": "Fuchsia City"},
|
||||||
|
0x6: {"name": "Fuchsia Mart"},
|
||||||
|
0x7: {"name": "Safari Zone Main Office"},
|
||||||
|
0x8: {"name": "Fuchsia Gym"},
|
||||||
|
0x9: {"name": "Fuchsia Bill Speech House"},
|
||||||
|
0xA: {"name": "Fuchsia Pokémon Center 1F",
|
||||||
|
"label": "FuchsiaPokeCenter1F"},
|
||||||
|
0xB: {"name": "Fuchsia Pokémon Center 2F Beta",
|
||||||
|
"label": "FuchsiaPokeCenter2FBeta"},
|
||||||
|
0xC: {"name": "Safari Zone Warden's Home"},
|
||||||
|
0xD: {"name": "Route 15 Fuchsia Gate"},
|
||||||
|
},
|
||||||
|
18: {
|
||||||
|
0x1: {"name": "Route 8"},
|
||||||
|
0x2: {"name": "Route 12"},
|
||||||
|
0x3: {"name": "Route 10 South"},
|
||||||
|
0x4: {"name": "Lavender Town"},
|
||||||
|
0x5: {"name": "Lavender Pokémon Center 1F",
|
||||||
|
"label": "LavenderPokeCenter1F"},
|
||||||
|
0x6: {"name": "Lavender Pokémon Center 2F Beta",
|
||||||
|
"label": "LavenderPokeCenter2FBeta"},
|
||||||
|
0x7: {"name": "Mr. Fuji's House"},
|
||||||
|
0x8: {"name": "Lavender Town Speech House"},
|
||||||
|
0x9: {"name": "Lavender Name Rater"},
|
||||||
|
0xA: {"name": "Lavender Mart"},
|
||||||
|
0xB: {"name": "Soul House"},
|
||||||
|
0xC: {"name": "Lav Radio Tower 1F"},
|
||||||
|
0xD: {"name": "Route 8 Saffron Gate"},
|
||||||
|
0xE: {"name": "Route 12 Super Rod House"},
|
||||||
|
},
|
||||||
|
19: {
|
||||||
|
0x1: {"name": "Route 28"},
|
||||||
|
0x2: {"name": "Silver Cave Outside"},
|
||||||
|
0x3: {"name": "Silver Cave Pokémon Center 1F",
|
||||||
|
"label": "SilverCavePokeCenter1F"},
|
||||||
|
0x4: {"name": "Route 28 Famous Speech House"},
|
||||||
|
},
|
||||||
|
20: {
|
||||||
|
0x1: {"name": "Pokémon Center 2F",
|
||||||
|
"label": "PokeCenter2F"},
|
||||||
|
0x2: {"name": "Trade Center"},
|
||||||
|
0x3: {"name": "Colosseum"},
|
||||||
|
0x4: {"name": "Time Capsule"},
|
||||||
|
0x5: {"name": "Mobile Trade Room Mobile"},
|
||||||
|
0x6: {"name": "Mobile Battle Room"},
|
||||||
|
},
|
||||||
|
21: {
|
||||||
|
0x1: {"name": "Route 7"},
|
||||||
|
0x2: {"name": "Route 16"},
|
||||||
|
0x3: {"name": "Route 17"},
|
||||||
|
0x4: {"name": "Celadon City"},
|
||||||
|
0x5: {"name": "Celadon Dept Store 1F"},
|
||||||
|
0x6: {"name": "Celadon Dept Store 2F"},
|
||||||
|
0x7: {"name": "Celadon Dept Store 3F"},
|
||||||
|
0x8: {"name": "Celadon Dept Store 4F"},
|
||||||
|
0x9: {"name": "Celadon Dept Store 5F"},
|
||||||
|
0xA: {"name": "Celadon Dept Store 6F"},
|
||||||
|
0xB: {"name": "Celadon Dept Store Elevator"},
|
||||||
|
0xC: {"name": "Celadon Mansion 1F"},
|
||||||
|
0xD: {"name": "Celadon Mansion 2F"},
|
||||||
|
0xE: {"name": "Celadon Mansion 3F"},
|
||||||
|
0xF: {"name": "Celadon Mansion Roof"},
|
||||||
|
0x10: {"name": "Celadon Mansion Roof House"},
|
||||||
|
0x11: {"name": "Celadon Pokémon Center 1F",
|
||||||
|
"label": "CeladonPokeCenter1F"},
|
||||||
|
0x12: {"name": "Celadon Pokémon Center 2F Beta",
|
||||||
|
"label": "CeladonPokeCenter2FBeta"},
|
||||||
|
0x13: {"name": "Celadon Game Corner"},
|
||||||
|
0x14: {"name": "Celadon Game Corner Prize Room"},
|
||||||
|
0x15: {"name": "Celadon Gym"},
|
||||||
|
0x16: {"name": "Celadon Cafe"},
|
||||||
|
0x17: {"name": "Route 16 Fuchsia Speech House"},
|
||||||
|
0x18: {"name": "Route 16 Gate"},
|
||||||
|
0x19: {"name": "Route 7 Saffron Gate"},
|
||||||
|
0x1A: {"name": "Route 17 18 Gate"},
|
||||||
|
},
|
||||||
|
22: {
|
||||||
|
0x1: {"name": "Route 40"},
|
||||||
|
0x2: {"name": "Route 41"},
|
||||||
|
0x3: {"name": "Cianwood City"},
|
||||||
|
0x4: {"name": "Mania's House"},
|
||||||
|
0x5: {"name": "Cianwood Gym"},
|
||||||
|
0x6: {"name": "Cianwood Pokémon Center 1F",
|
||||||
|
"label": "CianwoodPokeCenter1F"},
|
||||||
|
0x7: {"name": "Cianwood Pharmacy"},
|
||||||
|
0x8: {"name": "Cianwood City Photo Studio"},
|
||||||
|
0x9: {"name": "Cianwood Lugia Speech House"},
|
||||||
|
0xA: {"name": "Poke Seer's House"},
|
||||||
|
0xB: {"name": "Battle Tower 1F"},
|
||||||
|
0xC: {"name": "Battle Tower Battle Room"},
|
||||||
|
0xD: {"name": "Battle Tower Elevator"},
|
||||||
|
0xE: {"name": "Battle Tower Hallway"},
|
||||||
|
0xF: {"name": "Route 40 Battle Tower Gate"},
|
||||||
|
0x10: {"name": "Battle Tower Outside"},
|
||||||
|
},
|
||||||
|
23: {
|
||||||
|
0x1: {"name": "Route 2"},
|
||||||
|
0x2: {"name": "Route 22"},
|
||||||
|
0x3: {"name": "Viridian City"},
|
||||||
|
0x4: {"name": "Viridian Gym"},
|
||||||
|
0x5: {"name": "Viridian Nickname Speech House"},
|
||||||
|
0x6: {"name": "Trainer House 1F"},
|
||||||
|
0x7: {"name": "Trainer House B1F"},
|
||||||
|
0x8: {"name": "Viridian Mart"},
|
||||||
|
0x9: {"name": "Viridian Pokémon Center 1F",
|
||||||
|
"label": "ViridianPokeCenter1F"},
|
||||||
|
0xA: {"name": "Viridian Pokémon Center 2F Beta",
|
||||||
|
"label": "ViridianPokeCenter2FBeta"},
|
||||||
|
0xB: {"name": "Route 2 Nugget Speech House"},
|
||||||
|
0xC: {"name": "Route 2 Gate"},
|
||||||
|
0xD: {"name": "Victory Road Gate"},
|
||||||
|
},
|
||||||
|
24: {
|
||||||
|
0x1: {"name": "Route 26"},
|
||||||
|
0x2: {"name": "Route 27"},
|
||||||
|
0x3: {"name": "Route 29"},
|
||||||
|
0x4: {"name": "New Bark Town"},
|
||||||
|
0x5: {"name": "Elm's Lab"},
|
||||||
|
0x6: {"name": "Kris's House 1F"},
|
||||||
|
0x7: {"name": "Kris's House 2F"},
|
||||||
|
0x8: {"name": "Kris's Neighbor's House"},
|
||||||
|
0x9: {"name": "Elm's House"},
|
||||||
|
0xA: {"name": "Route 26 Heal Speech House"},
|
||||||
|
0xB: {"name": "Route 26 Day of Week Siblings House"},
|
||||||
|
0xC: {"name": "Route 27 Sandstorm House"},
|
||||||
|
0xD: {"name": "Route 29 46 Gate"},
|
||||||
|
},
|
||||||
|
25: {
|
||||||
|
0x1: {"name": "Route 5"},
|
||||||
|
0x2: {"name": "Saffron City"},
|
||||||
|
0x3: {"name": "Fighting Dojo"},
|
||||||
|
0x4: {"name": "Saffron Gym"},
|
||||||
|
0x5: {"name": "Saffron Mart"},
|
||||||
|
0x6: {"name": "Saffron Pokémon Center 1F",
|
||||||
|
"label": "SaffronPokeCenter1F"},
|
||||||
|
0x7: {"name": "Saffron Pokémon Center 2F Beta",
|
||||||
|
"label": "SaffronPokeCenter2FBeta"},
|
||||||
|
0x8: {"name": "Mr. Psychic's House"},
|
||||||
|
0x9: {"name": "Saffron Train Station"},
|
||||||
|
0xA: {"name": "Silph Co. 1F"},
|
||||||
|
0xB: {"name": "Copycat's House 1F"},
|
||||||
|
0xC: {"name": "Copycat's House 2F"},
|
||||||
|
0xD: {"name": "Route 5 Underground Entrance"},
|
||||||
|
0xE: {"name": "Route 5 Saffron City Gate"},
|
||||||
|
0xF: {"name": "Route 5 Cleanse Tag Speech House"},
|
||||||
|
},
|
||||||
|
26: {
|
||||||
|
0x1: {"name": "Route 30"},
|
||||||
|
0x2: {"name": "Route 31"},
|
||||||
|
0x3: {"name": "Cherrygrove City"},
|
||||||
|
0x4: {"name": "Cherrygrove Mart"},
|
||||||
|
0x5: {"name": "Cherrygrove Pokémon Center 1F",
|
||||||
|
"label": "CherrygrovePokeCenter1F"},
|
||||||
|
0x6: {"name": "Cherrygrove Gym Speech House"},
|
||||||
|
0x7: {"name": "Guide Gent's House"},
|
||||||
|
0x8: {"name": "Cherrygrove Evolution Speech House"},
|
||||||
|
0x9: {"name": "Route 30 Berry Speech House"},
|
||||||
|
0xA: {"name": "Mr. Pokémon's House"},
|
||||||
|
0xB: {"name": "Route 31 Violet Gate"},
|
||||||
|
},
|
||||||
|
}
|
@@ -298,6 +298,7 @@ pksv_crystal_more_enders = [0x03, 0x04, 0x05, 0x0C, 0x51, 0x52,
|
|||||||
0x9B,
|
0x9B,
|
||||||
0xB2, #maybe?
|
0xB2, #maybe?
|
||||||
0xCC, #maybe?
|
0xCC, #maybe?
|
||||||
|
0x9A, # describedecoration
|
||||||
]
|
]
|
||||||
|
|
||||||
# these have no pksv names as of pksv 2.1.1
|
# these have no pksv names as of pksv 2.1.1
|
||||||
|
841
extras/vba.py
Normal file
841
extras/vba.py
Normal file
File diff suppressed because it is too large
Load Diff
15
extras/vba_config.py
Normal file
15
extras/vba_config.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/jython
|
||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
|
||||||
|
# by default we assume the user has things in their $HOME
|
||||||
|
home = os.path.expanduser("~") # or System.getProperty("user.home")
|
||||||
|
|
||||||
|
# and that the pokecrystal project folder is in there somewhere
|
||||||
|
project_path = os.path.join(home, os.path.join("code", "pokecrystal"))
|
||||||
|
|
||||||
|
# save states are in ~/code/pokecrystal/save-states/
|
||||||
|
save_state_path = os.path.join(project_path, "save-states")
|
||||||
|
|
||||||
|
# where is your rom?
|
||||||
|
rom_path = os.path.join(project_path, "baserom.gbc")
|
65
gbhw.asm
Normal file
65
gbhw.asm
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
; Graciously aped from http://nocash.emubase.de/pandocs.htm .
|
||||||
|
|
||||||
|
rJOYP EQU $ff00 ; Joypad (R/W)
|
||||||
|
rSB EQU $ff01 ; Serial transfer data (R/W)
|
||||||
|
rSC EQU $ff02 ; Serial Transfer Control (R/W)
|
||||||
|
rDIV EQU $ff04 ; Divider Register (R/W)
|
||||||
|
rTIMA EQU $ff05 ; Timer counter (R/W)
|
||||||
|
rTMA EQU $ff06 ; Timer Modulo (R/W)
|
||||||
|
rTAC EQU $ff07 ; Timer Control (R/W)
|
||||||
|
rIF EQU $ff0f ; Interrupt Flag (R/W)
|
||||||
|
rNR10 EQU $ff10 ; Channel 1 Sweep register (R/W)
|
||||||
|
rNR11 EQU $ff11 ; Channel 1 Sound length/Wave pattern duty (R/W)
|
||||||
|
rNR12 EQU $ff12 ; Channel 1 Volume Envelope (R/W)
|
||||||
|
rNR13 EQU $ff13 ; Channel 1 Frequency lo (Write Only)
|
||||||
|
rNR14 EQU $ff14 ; Channel 1 Frequency hi (R/W)
|
||||||
|
rNR21 EQU $ff16 ; Channel 2 Sound Length/Wave Pattern Duty (R/W)
|
||||||
|
rNR22 EQU $ff17 ; Channel 2 Volume Envelope (R/W)
|
||||||
|
rNR23 EQU $ff18 ; Channel 2 Frequency lo data (W)
|
||||||
|
rNR24 EQU $ff19 ; Channel 2 Frequency hi data (R/W)
|
||||||
|
rNR30 EQU $ff1a ; Channel 3 Sound on/off (R/W)
|
||||||
|
rNR31 EQU $ff1b ; Channel 3 Sound Length
|
||||||
|
rNR32 EQU $ff1c ; Channel 3 Select output level (R/W)
|
||||||
|
rNR33 EQU $ff1d ; Channel 3 Frequency's lower data (W)
|
||||||
|
rNR34 EQU $ff1e ; Channel 3 Frequency's higher data (R/W)
|
||||||
|
rNR41 EQU $ff20 ; Channel 4 Sound Length (R/W)
|
||||||
|
rNR42 EQU $ff21 ; Channel 4 Volume Envelope (R/W)
|
||||||
|
rNR43 EQU $ff22 ; Channel 4 Polynomial Counter (R/W)
|
||||||
|
rNR44 EQU $ff23 ; Channel 4 Counter/consecutive; Inital (R/W)
|
||||||
|
rNR50 EQU $ff24 ; Channel control / ON-OFF / Volume (R/W)
|
||||||
|
rNR51 EQU $ff25 ; Selection of Sound output terminal (R/W)
|
||||||
|
rNR52 EQU $ff26 ; Sound on/off
|
||||||
|
rLCDC EQU $ff40 ; LCD Control (R/W)
|
||||||
|
rSTAT EQU $ff41 ; LCDC Status (R/W)
|
||||||
|
rSCY EQU $ff42 ; Scroll Y (R/W)
|
||||||
|
rSCX EQU $ff43 ; Scroll X (R/W)
|
||||||
|
rLY EQU $ff44 ; LCDC Y-Coordinate (R)
|
||||||
|
rLYC EQU $ff45 ; LY Compare (R/W)
|
||||||
|
rDMA EQU $ff46 ; DMA Transfer and Start Address (W)
|
||||||
|
rBGP EQU $ff47 ; BG Palette Data (R/W) - Non CGB Mode Only
|
||||||
|
rOBP0 EQU $ff48 ; Object Palette 0 Data (R/W) - Non CGB Mode Only
|
||||||
|
rOBP1 EQU $ff49 ; Object Palette 1 Data (R/W) - Non CGB Mode Only
|
||||||
|
rWY EQU $ff4a ; Window Y Position (R/W)
|
||||||
|
rWX EQU $ff4b ; Window X Position minus 7 (R/W)
|
||||||
|
rKEY1 EQU $ff4d ; CGB Mode Only - Prepare Speed Switch
|
||||||
|
rVBK EQU $ff4f ; CGB Mode Only - VRAM Bank
|
||||||
|
rHDMA1 EQU $ff51 ; CGB Mode Only - New DMA Source, High
|
||||||
|
rHDMA2 EQU $ff52 ; CGB Mode Only - New DMA Source, Low
|
||||||
|
rHDMA3 EQU $ff53 ; CGB Mode Only - New DMA Destination, High
|
||||||
|
rHDMA4 EQU $ff54 ; CGB Mode Only - New DMA Destination, Low
|
||||||
|
rHDMA5 EQU $ff55 ; CGB Mode Only - New DMA Length/Mode/Start
|
||||||
|
rRP EQU $ff56 ; CGB Mode Only - Infrared Communications Port
|
||||||
|
rBGPI EQU $ff68 ; CGB Mode Only - Background Palette Index
|
||||||
|
rBGPD EQU $ff69 ; CGB Mode Only - Background Palette Data
|
||||||
|
rOBPI EQU $ff6a ; CGB Mode Only - Sprite Palette Index
|
||||||
|
rOBPD EQU $ff6b ; CGB Mode Only - Sprite Palette Data
|
||||||
|
rUNKNOWN1 EQU $ff6c ; (FEh) Bit 0 (Read/Write) - CGB Mode Only
|
||||||
|
rSVBK EQU $ff70 ; CGB Mode Only - WRAM Bank
|
||||||
|
rUNKNOWN2 EQU $ff72 ; (00h) - Bit 0-7 (Read/Write)
|
||||||
|
rUNKNOWN3 EQU $ff73 ; (00h) - Bit 0-7 (Read/Write)
|
||||||
|
rUNKNOWN4 EQU $ff74 ; (00h) - Bit 0-7 (Read/Write) - CGB Mode Only
|
||||||
|
rUNKNOWN5 EQU $ff75 ; (8Fh) - Bit 4-6 (Read/Write)
|
||||||
|
rUNKNOWN6 EQU $ff76 ; (00h) - Always 00h (Read Only)
|
||||||
|
rUNKNOWN7 EQU $ff77 ; (00h) - Always 00h (Read Only)
|
||||||
|
rIE EQU $ffff ; Interrupt Enable (R/W)
|
||||||
|
|
BIN
gfx/debug/color_test.2bpp
Normal file
BIN
gfx/debug/color_test.2bpp
Normal file
Binary file not shown.
BIN
gfx/evo/bubble.2bpp
Normal file
BIN
gfx/evo/bubble.2bpp
Normal file
Binary file not shown.
BIN
gfx/evo/bubble_large.2bpp
Normal file
BIN
gfx/evo/bubble_large.2bpp
Normal file
Binary file not shown.
BIN
gfx/misc/pack_f.2bpp
Normal file
BIN
gfx/misc/pack_f.2bpp
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user