commit b3406aa04e721400b9f08824cae4d32507a76f6e Author: sergiotarxz Date: Sun Jan 29 20:59:55 2023 +0100 Adding initial commit. diff --git a/Build.PL b/Build.PL new file mode 100755 index 0000000..205b99e --- /dev/null +++ b/Build.PL @@ -0,0 +1,15 @@ +#!/usr/bin/env perl +use Module::Build; + +my $home = $ENV{HOME}; + +my $build = Module::Build->new( + module_name => 'Rsaves', + license => 'AGPLv3', + dist_author => 'Sergio Iglesias ', + dist_abstract => 'Ruby/Sapphire save editor lib.', + requires => { + 'Inline::C' => 0, + }, +); +$build->create_build_script; diff --git a/README.md b/README.md new file mode 100644 index 0000000..913b3b8 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Rsaves + +## Work in progress pokémon ruby sav editing Perl library + +TODO: Documentation. + +The gba ROM is literally a backup of my own cartragide in spanish. + +I have no rights over the ROM and you should not download or use it if you do +not have a copy of the same exact cartragide, it is there for debugging purposes +and it is absolutely not covered by the license of the program. diff --git a/examples/all_pokemon_shiny.pl b/examples/all_pokemon_shiny.pl new file mode 100644 index 0000000..b09a299 --- /dev/null +++ b/examples/all_pokemon_shiny.pl @@ -0,0 +1,38 @@ +#!/usr/bin/env perl +use v5.34.1; + +use strict; +use warnings; + +use Rsaves + qw/read_save check_correct_size get_saves find_current_save_index check_correct_size find_pokemon_substruct change_gender read_pc_storage save_pc_changes enable_eon_ticket save_changes pokemon_set_shiny read_pkm_file_box/; + +use Rsaves::Constants::Ruby::Global qw/$MALE $FEMALE/; + +sub start { + my ( @saves_raw, $extra ); + ( @saves_raw[ 0, 1 ], $extra ) = read_save('ruby.sav'); + check_correct_size( @saves_raw, $extra ); + my @saves = get_saves(@saves_raw); + my $current_save_index = find_current_save_index(@saves); + my $save = $saves[$current_save_index]; + make_all_pokemon_shiny($save); + save_changes( @saves, $extra, 'ruby1.sav' ); +} + +sub make_all_pokemon_shiny { + my $save = shift; + my $pc = read_pc_storage($save); + for my $box ( $pc->{boxes}->@* ) { + for my $pokemon ( $box->@* ) { + my $substructures = $pokemon->{substructures}; + my $substruct0 = find_pokemon_substruct( $substructures, 0 ); + if ( $substruct0->{species} ) { + pokemon_set_shiny($pokemon); + } + } + } + save_pc_changes( $save, $pc ); +} + +start; diff --git a/examples/change_sex.pl b/examples/change_sex.pl new file mode 100644 index 0000000..88493ee --- /dev/null +++ b/examples/change_sex.pl @@ -0,0 +1,26 @@ +#!/usr/bin/env perl +use v5.34.1; + +use strict; +use warnings; + +use Rsaves + qw/read_save check_correct_size get_saves find_current_save_index check_correct_size find_pokemon_substruct change_gender read_pc_storage save_pc_changes enable_eon_ticket save_changes pokemon_set_shiny read_pkm_file_box/; + +use Rsaves::Constants::Ruby::Global qw/$MALE $FEMALE/; + +sub start { + my ( @saves_raw, $extra ); + ( @saves_raw[ 0, 1 ], $extra ) = read_save('ruby.sav'); + check_correct_size( @saves_raw, $extra ); + my @saves = get_saves(@saves_raw); + my $current_save_index = find_current_save_index(@saves); + my $save = $saves[$current_save_index]; + + # Easier than in real life. + # You will need to change room and voila. + change_gender( $save, $FEMALE ); + save_changes( @saves, $extra, 'ruby1.sav' ); +} + +start; diff --git a/examples/enable_latias.pl b/examples/enable_latias.pl new file mode 100644 index 0000000..cd7b316 --- /dev/null +++ b/examples/enable_latias.pl @@ -0,0 +1,25 @@ +#!/usr/bin/env perl +use v5.34.1; + +use strict; +use warnings; + +use Rsaves + qw/read_save check_correct_size get_saves find_current_save_index check_correct_size find_pokemon_substruct change_gender read_pc_storage save_pc_changes enable_eon_ticket save_changes pokemon_set_shiny read_pkm_file_box/; + +use Rsaves::Constants::Ruby::Global qw/$MALE $FEMALE/; + +sub start { + my ( @saves_raw, $extra ); + ( @saves_raw[ 0, 1 ], $extra ) = read_save('ruby.sav'); + check_correct_size( @saves_raw, $extra ); + my @saves = get_saves(@saves_raw); + my $current_save_index = find_current_save_index(@saves); + my $save = $saves[$current_save_index]; + + # Sightly more complex for other flags, take a look to enable_eon_ticket to see how it works. + enable_eon_ticket($save); + save_changes( @saves, $extra, 'ruby1.sav' ); +} + +start; diff --git a/examples/import_pk3_pokemon.pl b/examples/import_pk3_pokemon.pl new file mode 100644 index 0000000..6c7446a --- /dev/null +++ b/examples/import_pk3_pokemon.pl @@ -0,0 +1,36 @@ +#!/usr/bin/env perl +use v5.34.1; + +use strict; +use warnings; + +use Rsaves + qw/read_save check_correct_size get_saves find_current_save_index check_correct_size find_pokemon_substruct change_gender read_pc_storage save_pc_changes enable_eon_ticket save_changes pokemon_set_shiny read_pkm_file_box/; + +sub start { + my ( @saves_raw, $extra ); + ( @saves_raw[ 0, 1 ], $extra ) = read_save('ruby.sav'); + check_correct_size( @saves_raw, $extra ); + my @saves = get_saves(@saves_raw); + my $current_save_index = find_current_save_index(@saves); + my $save = $saves[$current_save_index]; + my $pc = read_pc_storage($save); + + for my $i ( 0 .. 13 ) { + for my $j ( 0 .. 29 ) { + my $pokemon = $pc->{boxes}[$i][$j]; + my $substructures = $pokemon->{substructures}; + my $substruct0 = find_pokemon_substruct( $substructures, 0 ); + if ( $substruct0->{species} == 0 ) { + # Celebi because it is almost unobtainable. + $pc->{boxes}[$i][$j] = read_pkm_file_box( + 'firered event mons/251 - CELEBI - B434BCEB935C.pk3'); + last; + } + } + } + save_pc_changes( $save, $pc ); + save_changes( @saves, $extra, 'ruby1.sav' ); +} + +start; diff --git a/firered event mons/251 - CELEBI - B434BCEB935C.pk3 b/firered event mons/251 - CELEBI - B434BCEB935C.pk3 new file mode 100644 index 0000000..11a22b3 Binary files /dev/null and b/firered event mons/251 - CELEBI - B434BCEB935C.pk3 differ diff --git a/lib/Rsaves.pm b/lib/Rsaves.pm new file mode 100644 index 0000000..348740a --- /dev/null +++ b/lib/Rsaves.pm @@ -0,0 +1,989 @@ +package Rsaves; + +use v5.34.1; + +use strict; +use warnings; + +use Data::Dumper; + +use Rsaves::Constants::Ruby::Flags qw/$FLAG_SYS_HAS_EON_TICKET/; + +use Exporter; + +use parent 'Exporter'; + +our @EXPORT_OK = ( + qw/read_pc_storage save_pc_changes save_changes enable_eon_ticket + add_key_item set_flag_id change_gender read_save get_saves + find_current_save_index check_correct_size find_pokemon_substruct + read_pkm_file_box calculate_shiny_personality pokemon_set_shiny get_first_super_data set_first_super_data/ +); + +my $SAVE_SIZE = 57344; +my $SECTION_DATA_SIZE = 3968; +my $SECTION_AFTER_DATA_PADDING = 4084; +my $SECTION_ID_SIZE = 2; +my $SECTION_CHECKSUM_SIZE = 2; +my $SECTION_SIGNATURE_SIZE = 4; +my $SECTION_SAVE_INDEX_SIZE = 4; + +my @ORDER_SECTION_WITHOUT_DATA = (qw/id checksum signature save_index/); +my @ORDER_SECTION_FIELDS = ( 'data', @ORDER_SECTION_WITHOUT_DATA ); +my $TRAINER_INFO = 0; +my $TEAM_ITEMS = 1; +my $GAME_STATE = 2; +my $MISC_DATA = 3; +my $RIVAL_INFO = 4; +my $PC_BUFFER_A = 5; +my $PC_BUFFER_B = 6; +my $PC_BUFFER_C = 7; +my $PC_BUFFER_D = 8; +my $PC_BUFFER_E = 9; +my $PC_BUFFER_F = 10; +my $PC_BUFFER_G = 11; +my $PC_BUFFER_H = 12; +my $PC_BUFFER_I = 13; +my ( $FEMALE, $MALE ) = ( 1, 0 ); +my $FLAGS_OFFSET = hex '1220'; +my $TRAINER_FLAG_START = hex '500'; +my $NUMBER_OF_TRAINERS = 693; +my $KEY_ITEMS_OFFSET = hex '5b0'; +my $MAX_KEY_ITEMS = 20; +my $ITEM_EON_TICKET = 275; +my $POKEMON_NAME_LENGTH = 10; +my $OT_NAME_LENGTH = 7; +my $BOX_NAME_LENGTH = 9; + +my %CHECKSUM_BYTES = ( + $TRAINER_INFO => hex 'F80', + $TEAM_ITEMS => 3968, + $GAME_STATE => 3968, + $MISC_DATA => 3968, + $RIVAL_INFO => 3848, + ( map { ( $_ => 3968 ) } ( $PC_BUFFER_A .. $PC_BUFFER_H ) ), + $PC_BUFFER_I => 0x83d0 - ( @{ [ $PC_BUFFER_A .. $PC_BUFFER_H ] } * 3968 ), +); + +die 'Invalid number of checksum sections.' + if ( scalar keys %CHECKSUM_BYTES ) != 14; + +sub _hihalf_u32 { + my $n = shift; + return (($n & 0xFFFF0000) >> 16); +} + +sub _lowhalf_u32 { + my $n = shift; + return ($n & 0xFFFF); +} + + +sub pokemon_set_shiny { + my $pokemon = shift; + $pokemon->{personality} = calculate_shiny_personality($pokemon->{otid}, $pokemon->{personality}); +} + +sub calculate_shiny_personality { + my $otid = shift; + my $personality = shift; + my $wanted_three_parts_bytes = _lowhalf_u32($personality) ^ int(rand(7)); + my $wanted_high_personality = _hihalf_u32($otid) ^ _lowhalf_u32($otid) ^ $wanted_three_parts_bytes; + return ($wanted_high_personality << 16) | _lowhalf_u32($personality); +} + +sub get_first_super_data { + my $save = shift; + my @sections = _find_sections_save( $save, 1 .. 4 ); + my $superdata = join '', map { $_->{data} } @sections; + return \$superdata; +} + +sub set_first_super_data { + my $save = shift; + my $superdata = shift; + my @sections = _find_sections_save( $save, 1 .. 4 ); + open my $fh, '<', $superdata; + for my $section (@sections) { + read $fh, $section->{data}, $SECTION_DATA_SIZE; + } + close $fh; +} + + + +sub find_pokemon_substruct { + my $substructures = shift; + my $type = shift; + for my $substruct (@$substructures) { + return $substruct if $substruct->{type} == $type; + } +} + +sub read_pc_storage { + my $save = shift; + my @sections = _find_sections_save( $save, $PC_BUFFER_A .. $PC_BUFFER_I ); + my $superdata = join '', map { $_->{data} } @sections; + open my $fh, '<', \$superdata; + read $fh, my $read, 1; + my $current_box = unpack 'C', $read; + read $fh, $read, 3; + my $unknown = $read; + my $pc = _read_pokemon_boxes_from_fh($fh); + my @box_names; + + for ( 0 .. 13 ) { + read $fh, ( my $read ), $BOX_NAME_LENGTH; + push @box_names, $read; + } + my @wallpapers; + for ( 0 .. 13 ) { + read $fh, ( my $read ), 1; + push @wallpapers, unpack 'C', $read; + } + read $fh, $read, 1 and die "Unread space"; + close $fh; + return { + current_box => $current_box, + boxes => $pc, + unknown => $unknown, + boxes_names => \@box_names, + wallpapers => \@wallpapers, + }; +} + +sub save_pc_changes { + my $save = shift; + my $pc = shift; + my $superdata = ''; + open my $fh, '>', \$superdata; + print $fh pack 'C', $pc->{current_box}; + print $fh $pc->{unknown}; + _write_pokemon_boxes_to_fh( $fh, $pc->{boxes} ); + for (0..13) { + print $fh $pc->{boxes_names}[$_]; + } + for (0..13) { + print $fh (pack 'C', $pc->{wallpapers}[$_]); + } + my $length = length $superdata; + die "Wrong pc size $length != @{[0x83d0]}" if $length != 0x83d0; + my @sections = _find_sections_save( $save, $PC_BUFFER_A .. $PC_BUFFER_I ); + open $fh, '<', \$superdata; + for my $section (@sections) { + read $fh, (my $read), $SECTION_DATA_SIZE; + my $length = length $read; + $section->{data} = $read; + } + read $fh, my $read, 1 and die "Not all readed"; + close $fh; +} + +sub _write_pokemon_boxes_to_fh { + my $fh = shift; + my $boxes = shift; + for my $box ( $boxes->@* ) { + for my $pokemon ( $box->@* ) { + my $pokemon_raw = ''; + open my $fh_pokemon, '>', \$pokemon_raw; + _write_pokemon_fh( $fh_pokemon, $pokemon ); + close $fh_pokemon; + my $length = length $pokemon_raw; + die "Bad size pokemon $length" if $length != 0x50; + print $fh $pokemon_raw; + } + } +} + +sub _read_pokemon_boxes_from_fh { + my $fh = shift; + my $boxes = []; + my $read; + for my $i ( 0 .. 13 ) { + my $box = []; + for my $j ( 0 .. 29 ) { + read $fh, my $pokemon_data, 0x50 or die "Failed to read 0x50 bytes"; + open my $pokemon_fh, '<', \$pokemon_data; + push @$box, _read_pokemon_box_from_fh($pokemon_fh); + close $pokemon_fh; + } + push @$boxes, $box; + } + return $boxes; +} + +sub read_pkm_file_box { + my $file = shift; + open my $fh, '<', $file or die "Unable to open $file"; + my $file_contents = join '', <$fh>; + $file_contents = substr $file_contents, 0, 0x50; + open $fh, '<', \$file_contents; + return _read_pokemon_box_from_fh($fh, 1); +} + +sub _write_pokemon_fh { + my $fh = shift; + my $pokemon = shift; + if ($pokemon->{personality} > 0xFFFFFFFF) { + die "Too big personality"; + } + print $fh pack 'V', $pokemon->{personality}; + print $fh pack 'V', $pokemon->{otid}; + print $fh $pokemon->{nickname}; + print $fh pack 'C', $pokemon->{language}; + print $fh pack 'C', $pokemon->{flags_eggs}; + print $fh $pokemon->{ot_name}; + print $fh pack 'C', $pokemon->{markings}; + + my $substructures_raw = ''; + { + open my $fh_substructures, '>', \$substructures_raw; + $pokemon->{checksum} = _write_pokemon_substructures_fh( + $fh_substructures, + $pokemon->{substructures}, + $pokemon->{personality}, + $pokemon->{otid} + ); + close $fh_substructures; + } + my $length = length $substructures_raw; + die "Bad size for the whole substructures $length" if $length != 12 * 4; + + print $fh pack 'v', $pokemon->{checksum}; + print $fh pack 'v', $pokemon->{unknown}; + print $fh $substructures_raw; +} + +sub _read_pokemon_box_from_fh { + my $fh = shift; + my $is_pkm_file = shift; + + # 0 + read $fh, my $read, 4; + my $personality = unpack 'V', $read // die "\$personality undefined"; + + # 4 + read $fh, $read, 4; + my $otid = unpack 'V', $read; + + # 8 + read $fh, $read, $POKEMON_NAME_LENGTH; + + my $nickname = $read; + read $fh, $read, 1; + my $language = unpack 'C', $read; + read $fh, $read, 1; + my $flags_eggs = unpack 'C', $read; + read $fh, $read, $OT_NAME_LENGTH; + my $ot_name = $read; + read $fh, $read, 1; + my $markings = unpack 'C', $read; + read $fh, $read, 2; + my $checksum = unpack 'v', $read; + read $fh, $read, 2; + my $unknown = unpack 'v', $read; + my $substructures = + _read_pokemon_substructures_from_fh( $fh, $otid, $personality, + $checksum, $is_pkm_file ); + read $fh, $read, 1 and die "You have not read all"; + return { + personality => $personality, + otid => $otid, + nickname => $nickname, + language => $language, + flags_eggs => $flags_eggs, + ot_name => $ot_name, + markings => $markings, + checksum => $checksum, + unknown => $unknown, + substructures => $substructures, + }; +} + +sub _read_pokemon_substructures_from_fh { + my $fh = shift; + my $otid = shift; + my $personality = shift; + my $checksum = shift; + my $is_pkm_file = shift; + read $fh, my $read, ( 12 * 4 ); + my $raw; + my @order_substructures; + if (!$is_pkm_file) { + $raw = _decrypt_pokemon_substructures_raw( $read, $otid, $personality, + $checksum ); + @order_substructures = + _pokemon_substructures_order_by_modulo( $personality % 24 ); + } else { + $raw = $read; + @order_substructures = (0, 1, 2, 3); + } + my $substructures = []; + open my $fh_raw, '<', \$raw; + + for my $i (@order_substructures) { + read $fh_raw, my $substruct, 12; + open my $fh_substruct, '<', \$substruct; + push @$substructures, + _read_pokemon_substruct_n_from_fh( $fh_substruct, $i); + close $fh_substruct; + } + close $fh_raw; + read $fh, $read, 1 and die "You have not read all"; + return $substructures; +} + +sub _write_pokemon_substructures_fh { + my $fh = shift; + my $substructures = shift; + my $personality = shift; + my $otid = shift; + my $modulo = $personality % 24; + my $decrypted_substructures = ''; + open my $fh_decrypted_substructures, '>', \$decrypted_substructures; + my @order_substructures = _pokemon_substructures_order_by_modulo($modulo); + + my $substruct0 = find_pokemon_substruct( $substructures, 0 ); + + for my $i (@order_substructures) { + my $substruct = find_pokemon_substruct( $substructures, $i ); + my $substruct_raw = ''; + open my $fh_decrypted_substruct, '>', \$substruct_raw; + _write_pokemon_substruct_fh( $fh_decrypted_substruct, $substruct ); + close $fh_decrypted_substruct; + my $length = length $substruct_raw; + die "Bad size substruct $i -> $length" if $length != 12; + print $fh_decrypted_substructures $substruct_raw; + } + close $fh_decrypted_substructures; + open $fh_decrypted_substructures, '<', \$decrypted_substructures; + my $checksum = _pokemon_checksum_substructures_fh($fh_decrypted_substructures); + seek $fh_decrypted_substructures, 0, 0; + my $encrypted_substructures; + open my $fh_encrypted_substructures, '>', \$encrypted_substructures; + for ( 0 .. 11 ) { + read $fh_decrypted_substructures, my $read, 4; + $read = pack 'V', ( ( ( unpack 'V', $read ) ^ $personality ) ^ $otid ); + print $fh_encrypted_substructures $read; + } + close $fh_decrypted_substructures; + close $fh_encrypted_substructures; + print $fh $encrypted_substructures; + return $checksum; +} + +sub _pokemon_checksum_substructures_fh { + my $fh = shift; + my $checksum = 0; + for ( 0 .. 3 ) { + for ( 0 .. 5 ) { + read $fh, my $read, 2 or die "Unable to read"; + $checksum = _sum_u16( (unpack 'v', $read), $checksum ); + } + } + return $checksum; +} + +sub _read_pokemon_substruct_n_from_fh { + my $fh = shift; + my $type = shift; + return _read_pokemon_substruct_0_from_fh($fh) if $type == 0; + return _read_pokemon_substruct_1_from_fh($fh) if $type == 1; + return _read_pokemon_substruct_2_from_fh($fh) if $type == 2; + return _read_pokemon_substruct_3_from_fh($fh) if $type == 3; +} + +sub _write_pokemon_substruct_fh { + my $fh = shift; + my $substruct = shift; + my $type = $substruct->{type}; + return _write_pokemon_substruct0_fh( $fh, $substruct ) if $type == 0; + return _write_pokemon_substruct1_fh( $fh, $substruct ) if $type == 1; + return _write_pokemon_substruct2_fh( $fh, $substruct ) if $type == 2; + return _write_pokemon_substruct3_fh( $fh, $substruct ) if $type == 3; +} +{ + my %translate_encoding_table; + my %translate_real_table; + { + my $counter = hex 'BB'; + for my $char ( 'A' .. 'Z', 'a' .. 'z' ) { + $translate_encoding_table{ chr($counter) } = $char; + $translate_real_table{$char} = chr($counter); + $counter++; + } + $translate_real_table{'♂'} = chr(0xB5); + $translate_real_table{'♀'} = chr(0xB6); + $translate_encoding_table{ chr(0xB5) } = '♂'; + $translate_encoding_table{ chr(0xB6) } = '♀'; + } + + sub _to_3rd_encoding { + my $text = shift; + my @chars = split '', $text; + my $return_text = ''; + for my $char (@chars) { + $return_text .= $translate_real_table{$char}; + } + return $return_text; + } + + sub _translate_3rd_encoding { + my $text = shift; + my @chars = split '', $text; + my $return_text = ''; + for my $char (@chars) { + last if ord($char) == hex 'FF'; + $return_text .= $translate_encoding_table{$char} // '?'; + } + return $return_text; + } +} + +sub _read_pokemon_substruct_0_from_fh { + my $fh = shift; + my $read; + read $fh, $read, 2; + my $species = unpack 'v', $read; + read $fh, $read, 2; + my $held_item = unpack 'v', $read; + read $fh, $read, 4; + my $experience = unpack 'V', $read; + read $fh, $read, 1; + my $pp_bonuses = unpack 'C', $read; + read $fh, $read, 1; + my $friendship = unpack 'C', $read; + read $fh, $read, 2; + my $unknown = unpack 'v', $read; + return { + type => 0, + species => $species, + held_item => $held_item, + experience => $experience, + pp_bonuses => $pp_bonuses, + friendship => $friendship, + unknown => $unknown, + }; +} + +sub _write_pokemon_substruct0_fh { + my $fh = shift; + my $substruct = shift; + print $fh pack 'v', $substruct->{species}; + print $fh pack 'v', $substruct->{held_item}; + print $fh pack 'V', $substruct->{experience}; + print $fh pack 'C', $substruct->{pp_bonuses}; + print $fh pack 'C', $substruct->{friendship}; + print $fh pack 'v', $substruct->{unknown}; +} + +sub _read_pokemon_substruct_1_from_fh { + my $fh = shift; + my $read; + my @movements; + my @pp; + for ( 0 .. 3 ) { + read $fh, $read, 2; + push @movements, unpack 'v', $read; + } + for ( 0 .. 3 ) { + read $fh, $read, 1; + push @pp, unpack 'C', $read; + } + return { + type => 1, + movements => \@movements, + pp => \@pp, + }; +} + +sub _write_pokemon_substruct1_fh { + my $fh = shift; + my $substruct = shift; + for my $i ( 0 .. 3 ) { + print $fh pack 'v', $substruct->{movements}[$i]; + } + for my $i ( 0 .. 3 ) { + print $fh pack 'C', $substruct->{pp}[$i]; + } +} + +sub _read_pokemon_substruct_2_from_fh { + my $fh = shift; + my $read; + read $fh, $read, 1; + my $hp_ev = unpack 'C', $read; + read $fh, $read, 1; + my $attack_ev = unpack 'C', $read; + read $fh, $read, 1; + my $defense_ev = unpack 'C', $read; + read $fh, $read, 1; + my $speed_ev = unpack 'C', $read; + read $fh, $read, 1; + my $special_attack_ev = unpack 'C', $read; + read $fh, $read, 1; + my $special_defense_ev = unpack 'C', $read; + read $fh, $read, 1; + my $cool = unpack 'C', $read; + read $fh, $read, 1; + my $beauty = unpack 'C', $read; + read $fh, $read, 1; + my $cute = unpack 'C', $read; + read $fh, $read, 1; + my $smart = unpack 'C', $read; + read $fh, $read, 1; + my $tough = unpack 'C', $read; + read $fh, $read, 1; + my $sheen = unpack 'C', $read; + return { + type => 2, + hp_ev => $hp_ev, + attack_ev => $attack_ev, + defense_ev => $defense_ev, + speed_ev => $speed_ev, + special_attack_ev => $special_attack_ev, + special_defense_ev => $special_defense_ev, + cool => $cool, + beauty => $beauty, + cute => $cute, + smart => $smart, + tough => $tough, + sheen => $sheen, + }; +} + +sub _write_pokemon_substruct2_fh { + my $fh = shift; + my $substruct = shift; + print $fh pack 'C', $substruct->{hp_ev}; + print $fh pack 'C', $substruct->{attack_ev}; + print $fh pack 'C', $substruct->{defense_ev}; + print $fh pack 'C', $substruct->{speed_ev}; + print $fh pack 'C', $substruct->{special_attack_ev}; + print $fh pack 'C', $substruct->{special_defense_ev}; + print $fh pack 'C', $substruct->{cool}; + print $fh pack 'C', $substruct->{beauty}; + print $fh pack 'C', $substruct->{cute}; + print $fh pack 'C', $substruct->{smart}; + print $fh pack 'C', $substruct->{tough}; + print $fh pack 'C', $substruct->{sheen}; +} + +sub _read_pokemon_substruct_3_from_fh { + my $fh = shift; + my $read; + read $fh, $read, 1; + my $pokerus = unpack 'C', $read; + read $fh, $read, 1; + my $met_location = unpack 'C', $read; + read $fh, $read, 2; + my $met_data = unpack 'v', $read; + read $fh, $read, 4; + + # We do not mess with this here. + my $ivs_egg_status_and_ability = unpack 'V', $read; + read $fh, $read, 4; + my $ribbons_and_event_legal = unpack 'V', $read; + return { + type => 3, + pokerus => $pokerus, + met_location => $met_location, + met_data => $met_data, + ivs_egg_status_and_ability => $ivs_egg_status_and_ability, + ribbons_and_event_legal => $ribbons_and_event_legal, + }; +} + +sub _write_pokemon_substruct3_fh { + my $fh = shift; + my $substruct = shift; + print $fh pack 'C', $substruct->{pokerus}; + print $fh pack 'C', $substruct->{met_location}; + print $fh pack 'v', $substruct->{met_data}; + print $fh pack 'V', $substruct->{ivs_egg_status_and_ability}; + print $fh pack 'V', $substruct->{ribbons_and_event_legal}; +} + +sub _generate_permutations_array { + my $array = shift; + my @permutations; + if ( ( scalar @$array ) == 1 ) { + push @permutations, $array; + return \@permutations; + } + for ( my $i = 0 ; $i < @$array ; $i++ ) { + my @list_to_send_recursive; + for ( my $j = 0 ; $j < @$array ; $j++ ) { + next if $j == $i; + push @list_to_send_recursive, $array->[$j]; + } + for my $permutation ( + @{ _generate_permutations_array( \@list_to_send_recursive ) } ) + { + push @permutations, [ $array->[$i], @$permutation ]; + } + } + return \@permutations; +} + +sub _decrypt_pokemon_substructures_raw { + my $raw = shift; + my $otid = shift; + my $personality = shift; + my $checksum = shift; + my $result = ''; + open my $fh, '<', \$raw; + for ( 0 .. 11 ) { + read $fh, my $read, 4 or die "Unable to read"; + $read = unpack 'V', $read; + $read ^= $otid; + $read ^= $personality; + $result .= pack 'V', $read; + } + read $fh, my $read, 1 and die "Not all read"; + close $fh; + open $fh, '<', \$result; + +# my @order_substructures = _pokemon_substructures_order_by_modulo($personality % 24); +# for my $substruct_n (0..3) { +# my $offset = $substruct_n * 12; +# seek $fh, $substruct_n * 12, 0; +# for (0..5) { +# read $fh, my $read, 2 or die "Unable to read"; +# $read = unpack 'v', $read; +# $compare_checksum = _sum_u16($read, $compare_checksum); +# } +# } +# + my $compare_checksum = _pokemon_checksum_substructures_fh($fh); + die "Checksum $compare_checksum not equal to $checksum" + if $compare_checksum != $checksum; + close $fh; + return $result; +} + +sub _pokemon_substructures_order_by_modulo { + my $modulo = shift; + my @return; + my @types_location = _pokemon_substructures_types_location($modulo); + for ( my $i = 0 ; $i < @types_location ; $i++ ) { + @return[ $types_location[$i] ] = $i; + } + return @return; +} + +sub _pokemon_substructures_types_location { + my $modulo = shift; + return ( 0, 1, 2, 3 ) if $modulo == 0; + return ( 0, 1, 3, 2 ) if $modulo == 1; + return ( 0, 2, 1, 3 ) if $modulo == 2; + return ( 0, 3, 1, 2 ) if $modulo == 3; + return ( 0, 2, 3, 1 ) if $modulo == 4; + return ( 0, 3, 2, 1 ) if $modulo == 5; + return ( 1, 0, 2, 3 ) if $modulo == 6; + return ( 1, 0, 3, 2 ) if $modulo == 7; + return ( 2, 0, 1, 3 ) if $modulo == 8; + return ( 3, 0, 1, 2 ) if $modulo == 9; + return ( 2, 0, 3, 1 ) if $modulo == 10; + return ( 3, 0, 2, 1 ) if $modulo == 11; + return ( 1, 2, 0, 3 ) if $modulo == 12; + return ( 1, 3, 0, 2 ) if $modulo == 13; + return ( 2, 1, 0, 3 ) if $modulo == 14; + return ( 3, 1, 0, 2 ) if $modulo == 15; + return ( 2, 3, 0, 1 ) if $modulo == 16; + return ( 3, 2, 0, 1 ) if $modulo == 17; + return ( 1, 2, 3, 0 ) if $modulo == 18; + return ( 1, 3, 2, 0 ) if $modulo == 19; + return ( 2, 1, 3, 0 ) if $modulo == 20; + return ( 3, 1, 2, 0 ) if $modulo == 21; + return ( 2, 3, 1, 0 ) if $modulo == 22; + return ( 3, 2, 1, 0 ) if $modulo == 23; +} + +sub _save_section { + my ( $content, $section ) = @_; + my $new_content = ''; + $new_content .= $section->{data}; + $new_content .= + "\x00" x ( $SECTION_AFTER_DATA_PADDING - $SECTION_DATA_SIZE ); + $new_content .= + "\x00" x ( $SECTION_DATA_SIZE - $CHECKSUM_BYTES{ $section->{id} } ); + $new_content .= pack 'v', $section->{id}; + $new_content .= pack 'v', $section->{checksum}; + $new_content .= pack 'V', $section->{signature}; + $new_content .= pack 'V', $section->{save_index}; + die +"The section size for section @{[$section->{id}]} is wrong @{[length $new_content]}." + if length $new_content != 4 * 1024; + ${$content} .= $new_content; +} + +sub save_changes { + my ( @saves, $extra, $filename ); + ( @saves[ 0, 1 ], $extra, $filename ) = @_; + my $content = ''; + for my $save (@saves) { + my $counter_j = 0; + for my $section (@$save) { + die "Too much memory allocated" if length $content > 1000000; + _recalculate_checksum($section); + _save_section( \$content, $section ); + } + } + $content .= $extra; + die "Save length is incorrect." if length $content != 128 * 1024; + open my $fh, '>', $filename; + print $fh $content; + close $fh; +} + +sub enable_eon_ticket { + my $save = shift; + my $superdata = get_first_super_data($save); + say "Latios already enabled", return + if _check_flag_id( $save, $superdata, $FLAG_SYS_HAS_EON_TICKET ); + printf "%x", $FLAG_SYS_HAS_EON_TICKET; + set_flag_id( $save, $superdata, $FLAG_SYS_HAS_EON_TICKET, 1 ); + add_key_item( $save, $superdata, $ITEM_EON_TICKET ); + set_first_super_data( $save, $superdata ); +} + +sub add_key_item { + my $save = shift; + my $superdata = shift; + my $item_id = shift; + my $result = ''; + open my $fh, '<', $superdata; + read $fh, my ($read), $KEY_ITEMS_OFFSET; + $result .= $read; + LOOP: { + for my $i ( 0 .. 19 ) { + read $fh, $read, 2; + my $found_item = unpack 'v', $read; + if ( $found_item == 0 ) { + read $fh, $read, 2; + $result .= pack 'v', $item_id; + $result .= pack 'v', 1; + last LOOP; + } + $result .= $read; + read $fh, $read, 2; + my $quantity = unpack 'v', $read; + $result .= $read; + if ( $found_item == $item_id ) { + warn "$item_id already present."; + last LOOP; + } + } + die "No room to add $item_id."; + } + $result .= join '', <$fh>; + ${$superdata} = $result; + close $fh; +} + +sub set_flag_id { + my $save = shift; + my $superdata = shift; + my $id = shift; + my $to_set = shift; + my $offset = int( $id / 8 ) + $FLAGS_OFFSET; + my $result = ''; + open my $fh, '<', $superdata; + read $fh, my ($read), $offset; + $result .= $read; + read $fh, $read, 1; + $read = unpack 'C', $read; + + if ($to_set) { + $result .= pack 'C', ( $read | ( 1 << ( $id & 7 ) ) ); + } + else { + $result .= pack 'C', ( $read & ~( 1 << ( $id & 7 ) ) ); + } + $result .= join '', <$fh>; + ${$superdata} = $result; + close $fh; +} + +sub _check_flag_id { + my $save = shift; + my $superdata = shift; + my $id = shift; + my $offset = int( $id / 8 ) + $FLAGS_OFFSET; + + my $flags_offset = unpack "x@{[$offset]} C", ${$superdata}; + return ( $flags_offset >> ( $id & 7 ) ) & 1; +} + +sub change_gender { + my $save = shift; + my $gender = shift; + my $section = _find_section_save( $save, $TRAINER_INFO ); + my $new_data = ''; + my $data = $section->{data}; + open my $fh, '<', \$data; + read $fh, my $read, 8; + $new_data .= $read; + $new_data .= pack 'c', $gender; + read $fh, $read, 1; + $new_data .= join '', <$fh>; + $section->{data} = $new_data; +} + +sub _recalculate_checksum { + my $section = shift; + my $data = $section->{data}; + my $section_id = $section->{id}; + my $size = $CHECKSUM_BYTES{$section_id}; + my $checksum = 0; + open my $fh, '<', \$data; + for ( my $i = 0 ; $i < $size ; $i += 4 ) { + my $readed = ''; + read $fh, $readed, 4; + my $to_add = unpack 'V', $readed; + $checksum = _sum_u32( $checksum, $to_add ); + } + my $final_checksum = _sum_u32_to_u16( $checksum, $checksum >> 16 ); + $section->{checksum} = $final_checksum; +} + +use Inline C => <<'EOF'; +unsigned int +_sum_u32(unsigned int a, unsigned int b) { + return a + b; +} +unsigned short +_sum_u32_to_u16(unsigned int a, unsigned int b) { + return (short) a + b; +} +unsigned short +_sum_u16(unsigned short a, unsigned short b) { + return (unsigned short) a + b; +} +EOF + +sub _find_section_save { + my $save = shift; + my $section_id = shift; + for my $section (@$save) { + return $section if $section_id == $section->{id}; + } +} + +sub _find_sections_save { + my $save = shift; + my @section_ids = @_; + my @return; + for my $section_id (@section_ids) { + push @return, _find_section_save( $save, $section_id ); + } + return @return; +} + +sub find_current_save_index { + my @saves = @_; + my $max_index; + my $max_save_pos; + for my $pos ( 0 .. 1 ) { + my $save = $saves[$pos]; + my $section = _find_section_save( $save, $TRAINER_INFO ); + my $index = $section->{save_index}; + ( ( $max_index, $max_save_pos ) = ( $index, $pos ) ), next + if !defined $max_index; + if ( $index > $max_index ) { + ( $max_index, $max_save_pos ) = ( $index, $pos ); + } + } + return $max_save_pos; +} + +sub _print_sections_debug { + my @saves = map { + [ + map { + { %$_ } + } @$_ + ] + } @_; + for my $save (@saves) { + say "PRINTING SAVE"; + for my $section (@$save) { + say "\tPRINTING SECTION"; + for my $key (@ORDER_SECTION_WITHOUT_DATA) { + say "\t\t$key = @{[sprintf('%x', $section->{$key})]}"; + } + } + } + +} + +sub get_saves { + my @saves_raw = @_; + my @saves; + for my $save_raw (@saves_raw) { + push @saves, _get_sections($save_raw); + } + return @saves; +} + +sub _get_sections { + my $content = shift; + my $sections = []; + for ( 0 .. 13 ) { + my $section; + ( $content, $section ) = _get_section($content); + push @$sections, $section; + } + return $sections; +} + +sub _get_section { + my $content = shift; + my $data = substr $content, 0, $SECTION_DATA_SIZE; + $content = substr $content, $SECTION_AFTER_DATA_PADDING; + my $section_id = substr $content, 0, $SECTION_ID_SIZE; + $content = substr $content, $SECTION_ID_SIZE; + my $checksum = substr $content, 0, $SECTION_CHECKSUM_SIZE; + $content = substr $content, $SECTION_CHECKSUM_SIZE; + my $signature = substr $content, 0, $SECTION_SIGNATURE_SIZE; + $content = substr $content, $SECTION_SIGNATURE_SIZE; + my $save_index = substr $content, 0, $SECTION_SAVE_INDEX_SIZE; + $content = substr $content, $SECTION_SAVE_INDEX_SIZE; + $data = substr $data, 0, $CHECKSUM_BYTES{ unpack 'v', $section_id }; + return ( + $content, + { + save_index => unpack( 'V', $save_index ), + signature => unpack( 'V', $signature ), + checksum => unpack( 'v', $checksum ), + id => unpack( 'v', $section_id ), + data => $data, + } + ); +} + +sub check_correct_size { + my @sections_raw = @_; + my $sum = 0; + for my $section (@sections_raw) { + $sum += length $section; + } + die "Incorrect size" if $sum / 1024 != 128; +} + +sub read_save { + my $file = shift; + my @sections; + my $extra; + open my $fh, '<', $file or die "Unable to read $file"; + my $contents = join '', <$fh>; + for ( 0 .. 1 ) { + push @sections, substr $contents, 0, $SAVE_SIZE; + $contents = substr $contents, $SAVE_SIZE; + } + $extra = $contents; + close $fh; + return ( @sections, $extra ); +} +1; diff --git a/lib/Rsaves/Constants/Ruby/Flags.pm b/lib/Rsaves/Constants/Ruby/Flags.pm new file mode 100644 index 0000000..fb41918 --- /dev/null +++ b/lib/Rsaves/Constants/Ruby/Flags.pm @@ -0,0 +1,812 @@ +package Rsaves::Constants::Ruby::Flags; + +use v5.34.1; + +use strict; +use warnings; + +use Exporter; + +use parent 'Exporter'; + +our $FLAG_SET_WALL_CLOCK = 0x51; +our $FLAG_RESCUED_BIRCH = 0x52; +our $FLAG_LINK_CONTEST_ROOM_POKEBALL = 0x56; +our $FLAG_MET_RIVAL_MOM = 0x57; +our $FLAG_BIRCH_AIDE_MET = 0x58; +our $FLAG_DECLINED_BIKE = 0x59; +our $FLAG_RECEIVED_BIKE = 0x5A; +our $FLAG_RECEIVED_WAILMER_PAIL = 0x5E; +our $FLAG_RECEIVED_POKEBLOCK_CASE = 0x5F; +our $FLAG_RECEIVED_SECRET_POWER = 0x60; +our $FLAG_TV_EXPLAINED = 0x62; +our $FLAG_MAUVILLE_GYM_BARRIERS_STATE = 0x63; +our $FLAG_MOSSDEEP_GYM_SWITCH_1 = 0x64; +our $FLAG_MOSSDEEP_GYM_SWITCH_2 = 0x65; +our $FLAG_MOSSDEEP_GYM_SWITCH_3 = 0x66; +our $FLAG_MOSSDEEP_GYM_SWITCH_4 = 0x67; +our $FLAG_OCEANIC_MUSEUM_MET_REPORTER = 0x69; +our $FLAG_RECEIVED_HM04 = 0x6A; +our $FLAG_RECEIVED_HM06 = 0x6B; +our $FLAG_RECEIVED_HM05 = 0x6D; +our $FLAG_RECEIVED_HM02 = 0x6E; +our $FLAG_MT_PYRE_ORB_STOLEN = 0x6F; +our $FLAG_EVIL_TEAM_ESCAPED_IN_SUBMARINE = 0x70; +our $FLAG_LEGENDARY_BATTLE_COMPLETED = 0x71; +our $FLAG_RECEIVED_METEORITE = 0x73; +our $FLAG_ADVENTURE_STARTED = 0x74; +our $FLAG_MET_HIDDEN_POWER_GIVER = 0x76; +our $FLAG_RECEIVED_TM31 = 0x79; +our $FLAG_RECEIVED_HM03 = 0x7A; +our $FLAG_RECEIVED_HM08 = 0x7B; +our $FLAG_DEFEATED_WALLY_VICTORY_ROAD = 0x7E; +our $FLAG_MET_PRETTY_PETAL_SHOP_OWNER = 0x7F; +our $FLAG_LEGEND_ESCAPED_SEAFLOOR_CAVERN = 0x81; +our $FLAG_DEFEATED_RIVAL_ROUTE103 = 0x82; +our $FLAG_RECEIVED_DOLL_LANETTE = 0x83; +our $FLAG_RECEIVED_POTION_OLDALE = 0x84; +our $FLAG_RECEIVED_AMULET_COIN = 0x85; +our $FLAG_PENDING_DAYCARE_EGG = 0x86; +our $FLAG_THANKED_FOR_PLAYING_WITH_WALLY = 0x87; +our $FLAG_RECEIVED_HM01 = 0x89; +our $FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY = 0x8B; +our $FLAG_RECEIVED_6_SODA_POP = 0x8C; +our $FLAG_DEFEATED_SEASHORE_HOUSE_TRAINERS = 0x8D; +our $FLAG_DEVON_GOODS_STOLEN = 0x8E; +our $FLAG_RECOVERED_DEVON_GOODS = 0x8F; +our $FLAG_RETURNED_DEVON_GOODS = 0x90; +our $FLAG_MR_BRINEY_SAILING_INTRO = 0x93; +our $FLAG_DOCK_REJECTED_DEVON_GOODS = 0x94; +our $FLAG_DELIVERED_DEVON_GOODS = 0x95; +our $FLAG_RECEIVED_CONTEST_PASS = 0x96; +our $FLAG_RECEIVED_CASTFORM = 0x97; +our $FLAG_RECEIVED_SUPER_ROD = 0x98; +our $FLAG_RUSTBORO_NPC_TRADE_COMPLETED = 0x99; +our $FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED = 0x9A; +our $FLAG_FORTREE_NPC_TRADE_COMPLETED = 0x9B; +our $FLAG_UNKNOWN_9F = 0x9F; +our $FLAG_COOL_PAINTING_MADE = 0xA0; +our $FLAG_BEAUTY_PAINTING_MADE = 0xA1; +our $FLAG_CUTE_PAINTING_MADE = 0xA2; +our $FLAG_SMART_PAINTING_MADE = 0xA3; +our $FLAG_TOUGH_PAINTING_MADE = 0xA4; +our $FLAG_RECEIVED_TM39 = 0xA5; +our $FLAG_RECEIVED_TM08 = 0xA6; +our $FLAG_RECEIVED_TM34 = 0xA7; +our $FLAG_RECEIVED_TM50 = 0xA8; +our $FLAG_RECEIVED_TM42 = 0xA9; +our $FLAG_RECEIVED_TM40 = 0xAA; +our $FLAG_RECEIVED_TM04 = 0xAB; +our $FLAG_RECEIVED_TM03 = 0xAC; +our $FLAG_DECORATION_1 = 0xAD; +our $FLAG_DECORATION_2 = 0xAE; +our $FLAG_DECORATION_3 = 0xAF; +our $FLAG_DECORATION_4 = 0xB0; +our $FLAG_DECORATION_5 = 0xB1; +our $FLAG_DECORATION_6 = 0xB2; +our $FLAG_DECORATION_7 = 0xB3; +our $FLAG_DECORATION_8 = 0xB4; +our $FLAG_DECORATION_9 = 0xB5; +our $FLAG_DECORATION_10 = 0xB6; +our $FLAG_DECORATION_11 = 0xB7; +our $FLAG_DECORATION_12 = 0xB8; +our $FLAG_DECORATION_13 = 0xB9; +our $FLAG_DECORATION_14 = 0xBA; +our $FLAG_DECORATION_15 = 0xBB; +our $FLAG_RECEIVED_POKENAV = 0xBC; +our $FLAG_DELIVERED_STEVEN_LETTER = 0xBD; +our $FLAG_DEFEATED_WALLY_MAUVILLE = 0xBE; +our $FLAG_RECEIVED_SUN_STONE_MOSSDEEP = 0xC0; +our $FLAG_WALLY_SPEECH = 0xC1; +our $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1 = 0xC2; +our $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2 = 0xC3; +our $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3 = 0xC4; +our $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4 = 0xC5; +our $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5 = 0xC6; +our $FLAG_RUSTURF_TUNNEL_OPENED = 0xC7; +our $FLAG_RECEIVED_RED_SCARF = 0xC8; +our $FLAG_RECEIVED_BLUE_SCARF = 0xC9; +our $FLAG_RECEIVED_PINK_SCARF = 0xCA; +our $FLAG_RECEIVED_GREEN_SCARF = 0xCB; +our $FLAG_RECEIVED_YELLOW_SCARF = 0xCC; +our $FLAG_ENCOUNTERED_LATIAS_OR_LATIOS = 0xCE; +our $FLAG_RECEIVED_BASEMENT_KEY = 0xD0; +our $FLAG_RECEIVED_TM24 = 0xD1; +our $FLAG_RECEIVED_RED_OR_BLUE_ORB = 0xD4; +our $FLAG_RECEIVED_PREMIER_BALL_RUSTBORO = 0xD5; +our $FLAG_ROUTE104_PROTOTYPE_COMPLETED_1 = 0xD7; +our $FLAG_ROUTE104_PROTOTYPE_COMPLETED_2 = 0xD8; +our $FLAG_MET_DIVING_TREASURE_HUNTER = 0xD9; +our $FLAG_MET_WAILMER_TRAINER = 0xDA; +our $FLAG_EVIL_LEADER_PLEASE_STOP = 0xDB; +our $FLAG_RECEIVED_GO_GOGGLES = 0xDD; +our $FLAG_WINGULL_SENT_ON_ERRAND = 0xDE; +our $FLAG_RECEIVED_MENTAL_HERB = 0xDF; +our $FLAG_WINGULL_DELIVERED_MAIL = 0xE0; +our $FLAG_RECEIVED_20_COINS = 0xE1; +our $FLAG_RECEIVED_STARTER_DOLL = 0xE2; +our $FLAG_RECEIVED_GOOD_ROD = 0xE3; +our $FLAG_REGI_DOORS_OPENED = 0xE4; +our $FLAG_RECEIVED_TM27 = 0xE5; +our $FLAG_RECEIVED_TM36 = 0xE6; +our $FLAG_RECEIVED_TM05 = 0xE7; +our $FLAG_RECEIVED_TM19 = 0xE8; +our $FLAG_RECEIVED_TM44 = 0xEA; +our $FLAG_RECEIVED_TM45 = 0xEB; +our $FLAG_RECEIVED_GLASS_ORNAMENT = 0xEC; +our $FLAG_RECEIVED_SILVER_SHIELD = 0xED; +our $FLAG_RECEIVED_GOLD_SHIELD = 0xEE; +our $FLAG_USED_STORAGE_KEY = 0xEF; +our $FLAG_USED_ROOM_1_KEY = 0xF0; +our $FLAG_USED_ROOM_2_KEY = 0xF1; +our $FLAG_USED_ROOM_4_KEY = 0xF2; +our $FLAG_USED_ROOM_6_KEY = 0xF3; +our $FLAG_MET_PROF_COSMO = 0xF4; +our $FLAG_RECEIVED_WAILMER_DOLL = 0xF5; +our $FLAG_RECEIVED_CHESTO_BERRY_ROUTE104 = 0xF6; +our $FLAG_DEFEATED_SS_TIDAL_TRAINERS = 0xF7; +our $FLAG_RECEIVED_SPELON_BERRY = 0xF8; +our $FLAG_RECEIVED_PAMTRE_BERRY = 0xF9; +our $FLAG_RECEIVED_WATMEL_BERRY = 0xFA; +our $FLAG_RECEIVED_DURIN_BERRY = 0xFB; +our $FLAG_RECEIVED_BELUE_BERRY = 0xFC; +our $FLAG_RECEIVED_CHARCOAL = 0xFE; +our $FLAG_LATIOS_OR_LATIAS_ROAMING = 0xFF; +our $FLAG_RECEIVED_REPEAT_BALL = 0x100; +our $FLAG_RECEIVED_OLD_ROD = 0x101; +our $FLAG_RECEIVED_COIN_CASE = 0x102; +our $FLAG_RETURNED_RED_OR_BLUE_ORB = 0x103; +our $FLAG_RECEIVED_TM49 = 0x104; +our $FLAG_RECEIVED_TM28 = 0x105; +our $FLAG_RECEIVED_TM09 = 0x106; +our $FLAG_ENTERED_ELITE_FOUR = 0x107; +our $FLAG_RECEIVED_TM10 = 0x108; +our $FLAG_RECEIVED_TM41 = 0x109; +our $FLAG_RECEIVED_LAVARIDGE_EGG = 0x10A; +our $FLAG_RECEIVED_FOSSIL_MON = 0x10B; +our $FLAG_SECRET_BASE_REGISTRY_ENABLED = 0x10C; +our $FLAG_RECEIVED_TM46 = 0x10D; +our $FLAG_CONTEST_SKETCH_CREATED = 0x10E; +our $FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE = 0x10F; +our $FLAG_RECEIVED_EXP_SHARE = 0x110; +our $FLAG_POKERUS_EXPLAINED = 0x111; +our $FLAG_RECEIVED_RUNNING_SHOES = 0x112; +our $FLAG_RECEIVED_QUICK_CLAW = 0x113; +our $FLAG_RECEIVED_KINGS_ROCK = 0x114; +our $FLAG_RECEIVED_MACHO_BRACE = 0x115; +our $FLAG_RECEIVED_SOOTHE_BELL = 0x116; +our $FLAG_RECEIVED_WHITE_HERB = 0x117; +our $FLAG_RECEIVED_SOFT_SAND = 0x118; +our $FLAG_RECEIVED_CLEANSE_TAG = 0x11A; +our $FLAG_RECEIVED_FOCUS_BAND = 0x11B; +our $FLAG_DECLINED_WALLY_BATTLE_MAUVILLE = 0x11C; +our $FLAG_RECEIVED_DEVON_SCOPE = 0x11D; +our $FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE = 0x11E; +our $FLAG_MET_DEVON_EMPLOYEE = 0x11F; +our $FLAG_MET_RIVAL_RUSTBORO = 0x120; +our $FLAG_RECEIVED_SILK_SCARF = 0x121; +our $FLAG_NOT_READY_FOR_BATTLE_ROUTE120 = 0x122; +our $FLAG_RECEIVED_SS_TICKET = 0x123; +our $FLAG_MET_RIVAL_LILYCOVE = 0x124; +our $FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE = 0x125; +our $FLAG_EXCHANGED_SCANNER = 0x126; +our $FLAG_KECLEON_FLED_FORTREE = 0x127; +our $FLAG_PETALBURG_MART_EXPANDED_ITEMS = 0x128; +our $FLAG_RECEIVED_MIRACLE_SEED = 0x129; +our $FLAG_RECEIVED_BELDUM = 0x12A; +our $FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK = 0x12B; +our $FLAG_MET_FANCLUB_YOUNGER_BROTHER = 0x12C; +our $FLAG_RIVAL_LEFT_FOR_ROUTE103 = 0x12D; +our $FLAG_OMIT_DIVE_FROM_STEVEN_LETTER = 0x12E; +our $FLAG_HIDDEN_ITEMS_START = 0x258; +our $FLAG_HIDDEN_ITEM_0 = 0x258; +our $FLAG_HIDDEN_ITEM_1 = 0x259; +our $FLAG_HIDDEN_ITEM_2 = 0x25A; +our $FLAG_HIDDEN_ITEM_3 = 0x25B; +our $FLAG_HIDDEN_ITEM_4 = 0x25C; +our $FLAG_HIDDEN_ITEM_5 = 0x25D; +our $FLAG_HIDDEN_ITEM_6 = 0x25E; +our $FLAG_HIDDEN_ITEM_7 = 0x25F; +our $FLAG_HIDDEN_ITEM_8 = 0x260; +our $FLAG_HIDDEN_ITEM_9 = 0x261; +our $FLAG_HIDDEN_ITEM_A = 0x262; +our $FLAG_HIDDEN_ITEM_B = 0x263; +our $FLAG_HIDDEN_ITEM_C = 0x264; +our $FLAG_HIDDEN_ITEM_D = 0x265; +our $FLAG_HIDDEN_ITEM_E = 0x266; +our $FLAG_HIDDEN_ITEM_F = 0x267; +our $FLAG_HIDDEN_ITEM_10 = 0x268; +our $FLAG_HIDDEN_ITEM_11 = 0x269; +our $FLAG_HIDDEN_ITEM_12 = 0x26A; +our $FLAG_HIDDEN_ITEM_13 = 0x26B; +our $FLAG_HIDDEN_ITEM_14 = 0x26C; +our $FLAG_HIDDEN_ITEM_15 = 0x26D; +our $FLAG_HIDDEN_ITEM_16 = 0x26E; +our $FLAG_HIDDEN_ITEM_17 = 0x26F; +our $FLAG_HIDDEN_ITEM_18 = 0x270; +our $FLAG_HIDDEN_ITEM_19 = 0x271; +our $FLAG_HIDDEN_ITEM_1A = 0x272; +our $FLAG_HIDDEN_ITEM_1B = 0x273; +our $FLAG_HIDDEN_ITEM_1C = 0x274; +our $FLAG_HIDDEN_ITEM_1D = 0x275; +our $FLAG_HIDDEN_ITEM_1E = 0x276; +our $FLAG_HIDDEN_ITEM_1F = 0x277; +our $FLAG_HIDDEN_ITEM_20 = 0x278; +our $FLAG_HIDDEN_ITEM_21 = 0x279; +our $FLAG_HIDDEN_ITEM_22 = 0x27A; +our $FLAG_HIDDEN_ITEM_23 = 0x27B; +our $FLAG_HIDDEN_ITEM_24 = 0x27C; +our $FLAG_HIDDEN_ITEM_25 = 0x27D; +our $FLAG_HIDDEN_ITEM_26 = 0x27E; +our $FLAG_HIDDEN_ITEM_27 = 0x27F; +our $FLAG_HIDDEN_ITEM_28 = 0x280; +our $FLAG_HIDDEN_ITEM_29 = 0x281; +our $FLAG_HIDDEN_ITEM_2A = 0x282; +our $FLAG_HIDDEN_ITEM_2B = 0x283; +our $FLAG_HIDDEN_ITEM_2C = 0x284; +our $FLAG_HIDDEN_ITEM_2D = 0x285; +our $FLAG_HIDDEN_ITEM_2E = 0x286; +our $FLAG_HIDDEN_ITEM_2F = 0x287; +our $FLAG_HIDDEN_ITEM_30 = 0x288; +our $FLAG_HIDDEN_ITEM_31 = 0x289; +our $FLAG_HIDDEN_ITEM_32 = 0x28A; +our $FLAG_HIDDEN_ITEM_33 = 0x28B; +our $FLAG_HIDDEN_ITEM_34 = 0x28C; +our $FLAG_HIDDEN_ITEM_35 = 0x28D; +our $FLAG_HIDDEN_ITEM_36 = 0x28E; +our $FLAG_HIDDEN_ITEM_37 = 0x28F; +our $FLAG_HIDDEN_ITEM_38 = 0x290; +our $FLAG_HIDDEN_ITEM_39 = 0x291; +our $FLAG_HIDDEN_ITEM_3A = 0x292; +our $FLAG_HIDDEN_ITEM_3B = 0x293; +our $FLAG_HIDDEN_ITEM_3C = 0x294; +our $FLAG_HIDDEN_ITEM_3D = 0x295; +our $FLAG_HIDDEN_ITEM_3E = 0x296; +our $FLAG_HIDDEN_ITEM_3F = 0x297; +our $FLAG_HIDDEN_ITEM_40 = 0x298; +our $FLAG_HIDDEN_ITEM_41 = 0x299; +our $FLAG_HIDDEN_ITEM_42 = 0x29A; +our $FLAG_HIDDEN_ITEM_43 = 0x29B; +our $FLAG_HIDDEN_ITEM_44 = 0x29C; +our $FLAG_HIDDEN_ITEM_45 = 0x29D; +our $FLAG_HIDDEN_ITEM_46 = 0x29E; +our $FLAG_HIDDEN_ITEM_47 = 0x29F; +our $FLAG_HIDDEN_ITEM_48 = 0x2A0; +our $FLAG_HIDDEN_ITEM_49 = 0x2A1; +our $FLAG_HIDDEN_ITEM_4A = 0x2A2; +our $FLAG_HIDDEN_ITEM_4B = 0x2A3; +our $FLAG_HIDDEN_ITEM_4C = 0x2A4; +our $FLAG_HIDDEN_ITEM_4D = 0x2A5; +our $FLAG_HIDDEN_ITEM_4E = 0x2A6; +our $FLAG_HIDDEN_ITEM_4F = 0x2A7; +our $FLAG_HIDDEN_ITEM_50 = 0x2A8; +our $FLAG_HIDDEN_ITEM_51 = 0x2A9; +our $FLAG_HIDDEN_ITEM_52 = 0x2AA; +our $FLAG_HIDDEN_ITEM_53 = 0x2AB; +our $FLAG_HIDDEN_ITEM_54 = 0x2AC; +our $FLAG_HIDDEN_ITEM_55 = 0x2AD; +our $FLAG_HIDDEN_ITEM_56 = 0x2AE; +our $FLAG_HIDDEN_ITEM_57 = 0x2AF; +our $FLAG_HIDDEN_ITEM_58 = 0x2B0; +our $FLAG_HIDDEN_ITEM_59 = 0x2B1; +our $FLAG_HIDDEN_ITEM_5A = 0x2B2; +our $FLAG_HIDDEN_ITEM_5B = 0x2B3; +our $FLAG_HIDDEN_ITEM_5C = 0x2B4; +our $FLAG_HIDDEN_ITEM_5D = 0x2B5; +our $FLAG_HIDDEN_ITEM_5E = 0x2B6; +our $FLAG_HIDDEN_ITEM_5F = 0x2B7; +our $FLAG_HIDDEN_ITEM_BLACK_GLASSES = 0x2B8; +our $FLAG_HIDDEN_ITEM_61 = 0x2B9; +our $FLAG_HIDE_BIRCH_STARTERS_BAG = 0x2BC; +our $FLAG_HIDE_BIRCH_BATTLE_POOCHYENA = 0x2D0; +our $FLAG_HIDE_BIRCH_IN_LAB = 0x2D1; +our $FLAG_HIDE_MAY_UPSTAIRS = 0x2D2; +our $FLAG_HIDE_RIVAL_ROUTE103 = 0x2D3; +our $FLAG_HIDE_DEVON_PETALBURG_WOODS = 0x2D4; +our $FLAG_HIDE_EVIL_TEAM_PETALBURG_WOODS = 0x2D5; +our $FLAG_HIDE_WALLY_PETALBURG = 0x2D6; +our $FLAG_HIDE_STEVENS_LETTER = 0x2D7; +our $FLAG_HIDE_WALLY_MOM_PETALBURG_1 = 0x2D8; +our $FLAG_HIDE_GRUNT_RUSTBORO = 0x2DB; +our $FLAG_HIDE_DEVON_RUSTBORO = 0x2DC; +our $FLAG_HIDE_SLEEPING_MON_SEAFLOOR_CAVERN = 0x2DD; +our $FLAG_HIDE_NORMAN_LITTLEROOT = 0x2DE; +our $FLAG_UNKNOWN_2E1 = 0x2E1; +our $FLAG_HIDE_MR_BRINEY_ROUTE104 = 0x2E2; +our $FLAG_HIDE_MR_BRINEY_ROUTE104_HOUSE = 0x2E3; +our $FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN = 0x2E4; +our $FLAG_HIDE_MR_BRINEY_ROUTE109 = 0x2E5; +our $FLAG_HIDE_MR_BRINEY_BOAT_ROUTE104 = 0x2E6; +our $FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD = 0x2E7; +our $FLAG_HIDE_MR_BRINEY_BOAT_ROUTE109 = 0x2E8; +our $FLAG_UNKNOWN_2EB = 0x2EB; +our $FLAG_UNKNOWN_2EC = 0x2EC; +our $FLAG_UNKNOWN_2ED = 0x2ED; +our $FLAG_HIDE_POOCHYENA_ROUTE101 = 0x2EE; +our $FLAG_HIDE_WALLY_DEFEATED_VICTORY_ROAD = 0x2EF; +our $FLAG_HIDE_MOM_LITTLEROOT = 0x2F0; +our $FLAG_HIDE_MACHOKE_MOVER_1 = 0x2F2; +our $FLAG_HIDE_MACHOKE_MOVER_2 = 0x2F3; +our $FLAG_UNKNOWN_2F4 = 0x2F4; +our $FLAG_HIDE_MOM_UPSTAIRS = 0x2F5; +our $FLAG_HIDE_BRENDAN_MOM_DOWNSTAIRS = 0x2F6; +our $FLAG_HIDE_MAY_MOM_DOWNSTAIRS = 0x2F7; +our $FLAG_HIDE_BRENDAN_UPSTAIRS = 0x2F8; +our $FLAG_HIDE_MOVING_TRUCK_BRENDAN = 0x2F9; +our $FLAG_HIDE_MOVING_TRUCK_MAY = 0x2FA; +our $FLAG_HIDE_VICTOR_WINSTRATE = 0x300; +our $FLAG_HIDE_VICTORIA_WINSTRATE = 0x301; +our $FLAG_HIDE_VIVI_WINSTRATE = 0x302; +our $FLAG_HIDE_VICKI_WINSTRATE = 0x303; +our $FLAG_HIDE_NORMAN_PETALBURG_GYM = 0x304; +our $FLAG_HIDE_RAYQUAZA = 0x305; +our $FLAG_HIDE_LILYCOVE_CONTEST_ATTENDENT_1 = 0x306; +our $FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR = 0x307; +our $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_LADY = 0x308; +our $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_GIRL = 0x309; +our $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_MAN = 0x30A; +our $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTER = 0x30B; +our $FLAG_HIDE_LILYCOVE_MUSEUM_VISITORS = 0x30C; +our $FLAG_HIDE_PETALBURG_GYM_GUIDE = 0x30D; +our $FLAG_UNKNOWN_30E = 0x30E; +our $FLAG_UNKNOWN_30F = 0x30F; +our $FLAG_HIDE_BRENDAN_MOM = 0x310; +our $FLAG_HIDE_MAY_MOM = 0x311; +our $FLAG_HIDE_FANCLUB_OLD_LADY = 0x315; +our $FLAG_HIDE_FANCLUB_BOY = 0x316; +our $FLAG_HIDE_FANCLUB_LITTLE_BOY = 0x317; +our $FLAG_HIDE_FANCLUB_LADY = 0x318; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE111_1 = 0x31C; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE118_1 = 0x31D; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE120_1 = 0x31E; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE111_2 = 0x31F; +our $FLAG_HIDE_CONTEST_REPORTER_FALLARBOR = 0x320; +our $FLAG_HIDE_CONTEST_REPORTER_VERDANTURF = 0x321; +our $FLAG_HIDE_CONTEST_REPORTER_LILYCOVE = 0x322; +our $FLAG_HIDE_CONTEST_REPORTER_SLATEPORT = 0x323; +our $FLAG_HIDE_WALLY_MAUVILLE = 0x324; +our $FLAG_HIDE_WALLY_FATHER_MAUVILLE = 0x325; +our $FLAG_HIDE_WALLY_WANDAS_HOUSE = 0x326; +our $FLAG_HIDE_BOYFRIEND_RUSTURF_TUNNEL = 0x327; +our $FLAG_HIDE_BOYFRIEND_WANDAS_HOUSE = 0x328; +our $FLAG_HIDE_WALLY_FATHER_WANDAS_HOUSE = 0x329; +our $FLAG_HIDE_WALLY_FATHER_PETALBURG = 0x32B; +our $FLAG_HIDE_WALLY_MOTHER_PETALBURG = 0x32C; +our $FLAG_HIDE_LOST_GLASSES_MAN = 0x32D; +our $FLAG_HIDE_RIVAL_RUSTBORO = 0x32E; +our $FLAG_HIDE_WALLACE_SOOTOPOLIS_GYM = 0x32F; +our $FLAG_HIDE_WALLACE_SOOTOPOLIS = 0x330; +our $FLAG_HIDE_GRUNTS_BLOCKING_CABLE_CAR = 0x333; +our $FLAG_HIDE_GRUNT_1_BLOCKING_HIDEOUT = 0x335; +our $FLAG_HIDE_GRUNT_2_BLOCKING_HIDEOUT = 0x336; +our $FLAG_UNKNOWN_337 = 0x337; +our $FLAG_HIDE_LEGEND_MON_CAVE_OF_ORIGIN = 0x339; +our $FLAG_HIDE_EVIL_LEADER_SEAFLOOR_CAVERN = 0x33C; +our $FLAG_HIDE_OTHER_LEADER_SEAFLOOR_CAVERN = 0x33D; +our $FLAG_HIDE_OTHER_TEAM_GRUNTS_SEAFLOOR_CAVERN = 0x33F; +our $FLAG_HIDE_STEVEN_GRANITE_CAVE = 0x341; +our $FLAG_HIDE_STEVEN_ROUTE128 = 0x342; +our $FLAG_HIDE_GABBY_AND_TY_SLATEPORT = 0x343; +our $FLAG_HIDE_STERN_SLATEPORT = 0x348; +our $FLAG_HIDE_STERN_SLATEPORT_HARBOR = 0x349; +our $FLAG_UNKNOWN_34B = 0x34B; +our $FLAG_UNKNOWN_34C = 0x34C; +our $FLAG_HIDE_GRUNT_1_SLATEPORT_HARBOR = 0x34D; +our $FLAG_HIDE_GRUNT_2_SLATEPORT_HARBOR = 0x34E; +our $FLAG_UNKNOWN_34F = 0x34F; +our $FLAG_HIDE_SUBMARINE_SHADOW_SLATEPORT_HARBOR = 0x350; +our $FLAG_HIDE_MAY_PICHU_DOLL = 0x351; +our $FLAG_HIDE_RIVAL_ROUTE119 = 0x353; +our $FLAG_HIDE_GRUNTS_LILYCOVE = 0x354; +our $FLAG_HIDE_SOOTOPOLIS_RESIDENTS = 0x356; +our $FLAG_HIDE_CAVE_OF_ORIGIN_ENTRANCE_WOMAN_1 = 0x357; +our $FLAG_HIDE_CAVE_OF_ORIGIN_ENTRANCE_WOMAN_2 = 0x358; +our $FLAG_HIDE_WALLY_BATTLE_VICTORY_ROAD = 0x35A; +our $FLAG_HIDE_AWAKENED_MON_SEAFLOOR_CAVERN = 0x35B; +our $FLAG_HIDE_SS_TIDAL_SLATEPORT_HARBOR = 0x35C; +our $FLAG_HIDE_SS_TIDAL_LILYCOVE_HARBOR = 0x35D; +our $FLAG_HIDE_WALLY_PETALBURG_GYM = 0x362; +our $FLAG_UNKNOWN_363 = 0x363; +our $FLAG_HIDE_FAT_MAN_LITTLEROOT = 0x364; +our $FLAG_HIDE_BRINEY_SLATEPORT_SHIPYARD = 0x365; +our $FLAG_HIDE_LANETTE = 0x366; +our $FLAG_HIDE_LANETTE_FALLARBOR = 0x367; +our $FLAG_HIDE_TRICKMASTER_ENTRANCE = 0x368; +our $FLAG_HIDE_MT_CHIMNEY_PEOPLE = 0x36D; +our $FLAG_HIDE_GRUNT_RUSTURF_TUNNEL = 0x36E; +our $FLAG_HIDE_BRINEY_RUSTURF_TUNNEL = 0x36F; +our $FLAG_HIDE_PEEKO_RUSTURF_TUNNEL = 0x370; +our $FLAG_HIDE_PEEKO_BRINEY_HOUSE = 0x371; +our $FLAG_HIDE_EVIL_TEAM_SLATEPORT = 0x372; +our $FLAG_HIDE_EVIL_TEAM_OCEANIC_MUSEUM = 0x373; +our $FLAG_HIDE_GRUNT_1_OCEANIC_MUSEUM_2F = 0x374; +our $FLAG_HIDE_GRUNT_2_OCEANIC_MUSEUM_2F = 0x375; +our $FLAG_HIDE_EVIL_TEAM_LEADER_OCEANIC_MUSEUM_2F = 0x376; +our $FLAG_HIDE_STERN_OCEANIC_MUSEUM_2F = 0x377; +our $FLAG_HIDE_BATTLE_TOWER_OPPONENT = 0x378; +our $FLAG_HIDE_RIVAL_BIRCH_LAB = 0x379; +our $FLAG_HIDE_EVIL_TEAM_WEATHER_INSTITUTE = 0x37A; +our $FLAG_HIDE_BRINEY_ROUTE116 = 0x37B; +our $FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_1F = 0x37C; +our $FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_2F = 0x37D; +our $FLAG_HIDE_TUNNER_DIGGER_ROUTE116 = 0x37E; +our $FLAG_HIDE_ARTIST_LILCOVE_CONTEST = 0x37F; +our $FLAG_UNKNOWN_BIRCH_380 = 0x380; +our $FLAG_HIDE_BIRCH_ROUTE101 = 0x381; +our $FLAG_HIDE_BIRCH_ROUTE103 = 0x382; +our $FLAG_HIDE_TRICKMASTER_END = 0x383; +our $FLAG_HIDE_EVIL_TEAM_ROUTE110 = 0x384; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE118_2 = 0x385; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE120_2 = 0x386; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE111_3 = 0x387; +our $FLAG_HIDE_GABBY_AND_TY_ROUTE118_3 = 0x388; +our $FLAG_HIDE_WORKERS_SLATEPORT_HARBOR = 0x389; +our $FLAG_HIDE_FLOWER_SHOP_WORKER_OUTSIDE = 0x38A; +our $FLAG_HIDE_AZURILL_FALLARBOR = 0x38B; +our $FLAG_HIDE_FERRY_ATTENDANT_LILYCOVE = 0x38C; +our $FLAG_HIDE_FERRY_SAILOR_LILYCOVE = 0x38D; +our $FLAG_HIDE_LATIOS_OR_LATIAS_FLYING = 0x38E; +our $FLAG_HIDE_LATIOS_OR_LATIAS_STATIONARY = 0x38F; +our $FLAG_HIDE_WATTSON_MAUVILLE = 0x390; +our $FLAG_HIDE_WATTSON_MAUVILLE_GYM = 0x391; +our $FLAG_HIDE_GRUNTS_ROUTE121 = 0x392; +our $FLAG_UNKNOWN_393 = 0x393; +our $FLAG_HIDE_LEADER_MT_PYRE_SUMMIT = 0x394; +our $FLAG_HIDE_GRUNTS_MT_PYRE_SUMMIT = 0x395; +our $FLAG_HIDE_REPORTER_BATTLE_TOWER = 0x396; +our $FLAG_HIDE_RIVAL_ROUTE110 = 0x397; +our $FLAG_HIDE_RIVAL_CHAMPIONS_ROOM = 0x398; +our $FLAG_HIDE_BIRCH_CHAMPIONS_ROOM = 0x399; +our $FLAG_HIDE_RIVAL_ON_BIKE_ROUTE110 = 0x39A; +our $FLAG_HIDE_RIVAL_ROUTE119_ON_BIKE = 0x39B; +our $FLAG_HIDE_GRUNTS_HIDEOUTS = 0x39C; +our $FLAG_HIDE_LILYCOVE_MOTEL_PEOPLE = 0x39D; +our $FLAG_HIDE_EVIL_TEAM_MT_CHIMNEY = 0x39E; +our $FLAG_HIDE_OTHER_TEAM_MT_CHIMNEY = 0x39F; +our $FLAG_HIDE_PROF_COSMO_FALLARBOR = 0x3A0; +our $FLAG_HIDE_RIVAL_LAVARIDGE_1 = 0x3A1; +our $FLAG_HIDE_RIVAL_LAVARIDGE_2 = 0x3A2; +our $FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1 = 0x3A3; +our $FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2 = 0x3A4; +our $FLAG_HIDE_WINGULL_FORTREE_HOUSE = 0x3A5; +our $FLAG_HIDE_WINGULL_MOSSDEEP_HOUSE = 0x3A6; +our $FLAG_HIDE_REGIROCK = 0x3A7; +our $FLAG_HIDE_REGICE = 0x3A8; +our $FLAG_HIDE_REGISTEEL = 0x3A9; +our $FLAG_HIDE_GRUNTS_METEOR_FALLS_1F = 0x3AA; +our $FLAG_HIDE_OTHER_TEAM_METEOR_FALLS_1F = 0x3AB; +our $FLAG_HIDE_SLUDGE_BOMB_MAN_DEWFORD_HALL = 0x3AC; +our $FLAG_HIDE_AWARD_MAN_BATTLE_TOWER = 0x3AD; +our $FLAG_HIDE_PROF_COSMO_METEOR_FALLS = 0x3AE; +our $FLAG_HIDE_SUBMARINE_SHADOW_HIDEOUT = 0x3AF; +our $FLAG_HIDE_EVIL_LEADER_ROUTE128 = 0x3B0; +our $FLAG_HIDE_OTHER_LEADER_ROUTE128 = 0x3B1; +our $FLAG_HIDE_EVIL_TEAM_GRUNTS_SEAFLOOR_CAVERN = 0x3B2; +our $FLAG_HIDE_DEVON_EMPLOYEE_ROUTE116 = 0x3B3; +our $FLAG_HIDE_TM_SALESMAN_SLATEPORT = 0x3B4; +our $FLAG_HIDE_EMPLOYEE_DEVON_CORP_3F = 0x3B5; +our $FLAG_HIDE_BRINEY_AND_PEEKO_SS_TIDAL = 0x3B6; +our $FLAG_HIDE_TM_49_GIVER_SS_TIDAL = 0x3B7; +our $FLAG_HIDE_TOOK_SHOAL_SALT_1 = 0x3B8; +our $FLAG_HIDE_TOOK_SHOAL_SALT_2 = 0x3B9; +our $FLAG_HIDE_TOOK_SHOAL_SALT_3 = 0x3BA; +our $FLAG_HIDE_TOOK_SHOAL_SALT_4 = 0x3BB; +our $FLAG_HIDE_TOOK_SHOAL_SHELL_1 = 0x3BC; +our $FLAG_HIDE_TOOK_SHOAL_SHELL_2 = 0x3BD; +our $FLAG_HIDE_TOOK_SHOAL_SHELL_3 = 0x3BE; +our $FLAG_HIDE_TOOK_SHOAL_SHELL_4 = 0x3BF; +our $FLAG_HIDE_SECRET_POWER_MAN = 0x3C0; +our $FLAG_HIDE_OCEANIC_MUSEUM_VISITORS = 0x3C1; +our $FLAG_HIDE_ROOFTOP_LADY_LILYCOVE_MART = 0x3C2; +our $FLAG_HIDE_ROOT_FOSSIL = 0x3C3; +our $FLAG_HIDE_CLAW_FOSSIL = 0x3C4; +our $FLAG_HIDE_SCARED_GRUNT_OCEANIC_MUSEUM = 0x3C5; +our $FLAG_HIDE_STEVEN_ROUTE118 = 0x3C6; +our $FLAG_HIDE_STEVEN_STEVENS_HOUSE = 0x3C7; +our $FLAG_HIDE_BELDUM_BALL_STEVENS_HOUSE = 0x3C8; +our $FLAG_HIDE_KECLEON_FORTREE = 0x3C9; +our $FLAG_HIDE_KECLEON_ROUTE120_1 = 0x3CA; +our $FLAG_HIDE_RIVAL_LILYCOVE_MART = 0x3CB; +our $FLAG_HIDE_STEVEN_ROUTE120 = 0x3CC; +our $FLAG_HIDE_STEVEN_SOOTOPOLIS = 0x3CD; +our $FLAG_HIDE_VOLTORB_1_NEW_MAUVILLE = 0x3CE; +our $FLAG_HIDE_VOLTORB_2_NEW_MAUVILLE = 0x3CF; +our $FLAG_HIDE_VOLTORB_3_NEW_MAUVILLE = 0x3D0; +our $FLAG_HIDE_ELECTRODE_1_HIDEOUT = 0x3D1; +our $FLAG_HIDE_ELECTRODE_2_HIDEOUT = 0x3D2; +our $FLAG_HIDE_RIVAL_OLDALE_TOWN = 0x3D3; +our $FLAG_HIDE_UNDERWATER_SUBMARINE_INTERACTION = 0x3D4; +our $FLAG_HIDE_KECLEON_ROUTE120_2 = 0x3D5; +our $FLAG_HIDE_KECLEON_ROUTE120_3 = 0x3D6; +our $FLAG_HIDE_GIRLFRIEND_RUSTURF_TUNNEL = 0x3D7; +our $FLAG_HIDE_GIRLFRIEND_WANDAS_HOUSE = 0x3D8; +our $FLAG_HIDE_KECLEON_ROUTE120_4 = 0x3D9; +our $FLAG_HIDE_KECLEON_ROUTE120_5 = 0x3DA; +our $FLAG_HIDE_KECLEON_ROUTE120_6 = 0x3DB; +our $FLAG_HIDE_KECLEON_ROUTE120_7 = 0x3DC; +our $FLAG_HIDE_KECLEON_ROUTE119_1 = 0x3DD; +our $FLAG_HIDE_KECLEON_ROUTE119_2 = 0x3DE; +our $FLAG_HIDE_BOY_ROUTE101 = 0x3DF; +our $FLAG_ITEM_ROUTE102_1 = 0x3E8; +our $FLAG_ITEM_ROUTE116_1 = 0x3E9; +our $FLAG_ITEM_ROUTE104_1 = 0x3EA; +our $FLAG_ITEM_ROUTE105_1 = 0x3EB; +our $FLAG_ITEM_ROUTE106_1 = 0x3EC; +our $FLAG_ITEM_ROUTE109_1 = 0x3ED; +our $FLAG_ITEM_ROUTE110_1 = 0x3EE; +our $FLAG_ITEM_ROUTE110_2 = 0x3EF; +our $FLAG_ITEM_ROUTE111_1 = 0x3F0; +our $FLAG_ITEM_ROUTE111_2 = 0x3F1; +our $FLAG_ITEM_ROUTE111_3 = 0x3F2; +our $FLAG_ITEM_ROUTE112_1 = 0x3F3; +our $FLAG_ITEM_ROUTE113_1 = 0x3F4; +our $FLAG_ITEM_ROUTE113_2 = 0x3F5; +our $FLAG_ITEM_ROUTE114_1 = 0x3F6; +our $FLAG_ITEM_ROUTE114_2 = 0x3F7; +our $FLAG_ITEM_ROUTE115_1 = 0x3F8; +our $FLAG_ITEM_ROUTE115_2 = 0x3F9; +our $FLAG_ITEM_ROUTE115_3 = 0x3FA; +our $FLAG_ITEM_ROUTE116_2 = 0x3FB; +our $FLAG_ITEM_ROUTE116_3 = 0x3FC; +our $FLAG_ITEM_ROUTE116_4 = 0x3FD; +our $FLAG_ITEM_ROUTE117_1 = 0x3FE; +our $FLAG_ITEM_ROUTE117_2 = 0x3FF; +our $FLAG_ITEM_ROUTE119_1 = 0x400; +our $FLAG_ITEM_ROUTE119_2 = 0x401; +our $FLAG_ITEM_ROUTE119_3 = 0x402; +our $FLAG_ITEM_ROUTE119_4 = 0x403; +our $FLAG_ITEM_ROUTE119_5 = 0x404; +our $FLAG_ITEM_ROUTE119_6 = 0x405; +our $FLAG_ITEM_ROUTE120_1 = 0x406; +our $FLAG_ITEM_ROUTE120_2 = 0x407; +our $FLAG_ITEM_ROUTE123_1 = 0x408; +our $FLAG_ITEM_ROUTE123_2 = 0x409; +our $FLAG_ITEM_ROUTE127_1 = 0x40A; +our $FLAG_ITEM_ROUTE127_2 = 0x40B; +our $FLAG_ITEM_ROUTE132_1 = 0x40C; +our $FLAG_ITEM_ROUTE133_1 = 0x40D; +our $FLAG_ITEM_ROUTE133_2 = 0x40E; +our $FLAG_ITEM_PETALBURG_1 = 0x40F; +our $FLAG_ITEM_PETALBURG_2 = 0x410; +our $FLAG_ITEM_RUSTBORO_1 = 0x411; +our $FLAG_ITEM_LILYCOVE_1 = 0x412; +our $FLAG_ITEM_MOSSDEEP_1 = 0x413; +our $FLAG_ITEM_METEOR_FALLS_1F_1R_1 = 0x414; +our $FLAG_ITEM_METEOR_FALLS_1F_1R_2 = 0x415; +our $FLAG_ITEM_METEOR_FALLS_1F_1R_3 = 0x416; +our $FLAG_ITEM_METEOR_FALLS_1F_1R_4 = 0x417; +our $FLAG_ITEM_RUSTURF_TUNNEL_1 = 0x418; +our $FLAG_ITEM_RUSTURF_TUNNEL_2 = 0x419; +our $FLAG_ITEM_GRANITE_CAVE_1F_1 = 0x41A; +our $FLAG_ITEM_GRANITE_CAVE_B1F_1 = 0x41B; +our $FLAG_ITEM_MT_PYRE_5F_1 = 0x41C; +our $FLAG_ITEM_GRANITE_CAVE_B2F_1 = 0x41D; +our $FLAG_ITEM_GRANITE_CAVE_B2F_2 = 0x41E; +our $FLAG_ITEM_PETALBURG_WOODS_1 = 0x41F; +our $FLAG_ITEM_PETALBURG_WOODS_2 = 0x420; +our $FLAG_ITEM_ROUTE104_2 = 0x421; +our $FLAG_ITEM_PETALBURG_WOODS_3 = 0x422; +our $FLAG_ITEM_CAVE_OF_ORIGIN_B3F_1 = 0x423; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_1 = 0x424; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_1 = 0x425; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_2 = 0x426; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_1 = 0x427; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_2 = 0x428; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_1 = 0x429; +our $FLAG_ITEM_ROUTE124_1 = 0x42A; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_1 = 0x42B; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_1 = 0x42C; +our $FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_1 = 0x42D; +our $FLAG_ITEM_JAGGED_PASS_1 = 0x42E; +our $FLAG_ITEM_AQUA_HIDEOUT_B1F_1 = 0x42F; +our $FLAG_ITEM_AQUA_HIDEOUT_B2F_1 = 0x430; +our $FLAG_ITEM_MT_PYRE_EXTERIOR_1 = 0x431; +our $FLAG_ITEM_MT_PYRE_EXTERIOR_2 = 0x432; +our $FLAG_ITEM_NEW_MAUVILLE_INSIDE_1 = 0x433; +our $FLAG_ITEM_NEW_MAUVILLE_INSIDE_2 = 0x434; +our $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_1 = 0x435; +our $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_2 = 0x436; +our $FLAG_ITEM_SCORCHED_SLAB_1 = 0x437; +our $FLAG_ITEM_METEOR_FALLS_B1F_2R_1 = 0x438; +our $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ENTRANCE_1 = 0x439; +our $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_INNER_ROOM_1 = 0x43A; +our $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM_1 = 0x43B; +our $FLAG_ITEM_VICTORY_ROAD_1F_1 = 0x43C; +our $FLAG_ITEM_VICTORY_ROAD_1F_2 = 0x43D; +our $FLAG_ITEM_VICTORY_ROAD_B1F_1 = 0x43E; +our $FLAG_ITEM_VICTORY_ROAD_B1F_2 = 0x43F; +our $FLAG_ITEM_VICTORY_ROAD_B2F_1 = 0x440; +our $FLAG_ITEM_MT_PYRE_6F_1 = 0x441; +our $FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_1 = 0x442; +our $FLAG_ITEM_FIERY_PATH_1 = 0x443; +our $FLAG_ITEM_ROUTE124_2 = 0x444; +our $FLAG_ITEM_ROUTE124_3 = 0x445; +our $FLAG_ITEM_SAFARI_ZONE_NORTHWEST_1 = 0x446; +our $FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_1 = 0x447; +our $FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_1 = 0x448; +our $FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_1 = 0x449; +our $FLAG_ITEM_ABANDONED_SHIP_ROOM_B1F_1 = 0x44A; +our $FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_1 = 0x44B; +our $FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_1 = 0x44C; +our $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_3 = 0x44D; +our $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_4 = 0x44E; +our $FLAG_ITEM_ROUTE121_1 = 0x44F; +our $FLAG_ITEM_ROUTE123_3 = 0x450; +our $FLAG_ITEM_ROUTE126_1 = 0x451; +our $FLAG_ITEM_ROUTE119_7 = 0x452; +our $FLAG_ITEM_ROUTE120_3 = 0x453; +our $FLAG_ITEM_ROUTE120_4 = 0x454; +our $FLAG_ITEM_ROUTE123_4 = 0x455; +our $FLAG_ITEM_NEW_MAUVILLE_INSIDE_3 = 0x456; +our $FLAG_ITEM_FIERY_PATH_2 = 0x457; +our $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ICE_ROOM_1 = 0x458; +our $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ICE_ROOM_2 = 0x459; +our $FLAG_ITEM_ROUTE103_1 = 0x45A; +our $FLAG_ITEM_ROUTE104_3 = 0x45B; +our $FLAG_ITEM_MAUVILLE_1 = 0x45C; +our $FLAG_ITEM_PETALBURG_WOODS_4 = 0x45D; +our $FLAG_ITEM_ROUTE115_4 = 0x45E; +our $FLAG_ITEM_SAFARI_ZONE_NORTHEAST_1 = 0x45F; +our $FLAG_ITEM_MT_PYRE_3F_1 = 0x460; +our $FLAG_ITEM_ROUTE118_1 = 0x461; +our $FLAG_ITEM_NEW_MAUVILLE_INSIDE_4 = 0x462; +our $FLAG_ITEM_NEW_MAUVILLE_INSIDE_5 = 0x463; +our $FLAG_ITEM_AQUA_HIDEOUT_B1F_2 = 0x464; +our $FLAG_ITEM_MAGMA_HIDEOUT_B1F_1 = 0x465; +our $FLAG_ITEM_MAGMA_HIDEOUT_B1F_2 = 0x466; +our $FLAG_ITEM_MAGMA_HIDEOUT_B2F_1 = 0x467; +our $FLAG_ITEM_MT_PYRE_2F_1 = 0x469; +our $FLAG_ITEM_MT_PYRE_4F_1 = 0x46A; +our $FLAG_ITEM_SAFARI_ZONE_SOUTHWEST = 0x46B; +our $FLAG_ITEM_AQUA_HIDEOUT_B1F_3 = 0x46C; +our $FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08 = 0x46D; +our $FLAG_ITEM_MAGMA_HIDEOUT_B1F_3 = 0x46E; +our $FLAG_ITEM_ROUTE104_4 = 0x46F; +our $FLAG_DEFEATED_RUSTBORO_GYM = 0x4B1; +our $FLAG_DEFEATED_DEWFORD_GYM = 0x4B4; +our $FLAG_DEFEATED_MAUVILLE_GYM = 0x4B8; +our $FLAG_DEFEATED_LAVARIDGE_GYM = 0x4BD; +our $FLAG_DEFEATED_PETALBURG_GYM = 0x4C1; +our $FLAG_DEFEATED_FORTREE_GYM = 0x4C9; +our $FLAG_DEFEATED_MOSSDEEP_GYM = 0x4CD; +our $FLAG_DEFEATED_SOOTOPOLIS_GYM = 0x4D4; +our $FLAG_DEFEATED_ELITE_4_SYDNEY = 0x4DD; +our $FLAG_DEFEATED_ELITE_4_PHOEBE = 0x4DE; +our $FLAG_DEFEATED_ELITE_4_GLACIA = 0x4DF; +our $FLAG_DEFEATED_ELITE_4_DRAKE = 0x4E0; +our $TRAINER_FLAG_START = 0x500; +our $NUMBER_OF_TRAINERS = 693; +our $SYSTEM_FLAGS = ( $TRAINER_FLAG_START + $NUMBER_OF_TRAINERS + 0x4B ); +our $FLAG_SYS_POKEMON_GET = ( $SYSTEM_FLAGS + 0x00 ); +our $FLAG_SYS_POKEDEX_GET = ( $SYSTEM_FLAGS + 0x01 ); +our $FLAG_SYS_POKENAV_GET = ( $SYSTEM_FLAGS + 0x02 ); +our $FLAG_SYS_GAME_CLEAR = ( $SYSTEM_FLAGS + 0x04 ); +our $FLAG_SYS_CHAT_USED = ( $SYSTEM_FLAGS + 0x05 ); +our $FLAG_SYS_HIPSTER_MEET = ( $SYSTEM_FLAGS + 0x06 ); +our $FLAG_BADGE01_GET = ( $SYSTEM_FLAGS + 0x07 ); +our $FLAG_BADGE02_GET = ( $SYSTEM_FLAGS + 0x08 ); +our $FLAG_BADGE03_GET = ( $SYSTEM_FLAGS + 0x09 ); +our $FLAG_BADGE04_GET = ( $SYSTEM_FLAGS + 0x0A ); +our $FLAG_BADGE05_GET = ( $SYSTEM_FLAGS + 0x0B ); +our $FLAG_BADGE06_GET = ( $SYSTEM_FLAGS + 0x0C ); +our $FLAG_BADGE07_GET = ( $SYSTEM_FLAGS + 0x0D ); +our $FLAG_BADGE08_GET = ( $SYSTEM_FLAGS + 0x0E ); +our $FLAG_VISITED_LITTLEROOT_TOWN = ( $SYSTEM_FLAGS + 0x0F ); +our $FLAG_VISITED_OLDALE_TOWN = ( $SYSTEM_FLAGS + 0x10 ); +our $FLAG_VISITED_DEWFORD_TOWN = ( $SYSTEM_FLAGS + 0x11 ); +our $FLAG_VISITED_LAVARIDGE_TOWN = ( $SYSTEM_FLAGS + 0x12 ); +our $FLAG_VISITED_FALLARBOR_TOWN = ( $SYSTEM_FLAGS + 0x13 ); +our $FLAG_VISITED_VERDANTURF_TOWN = ( $SYSTEM_FLAGS + 0x14 ); +our $FLAG_VISITED_PACIFIDLOG_TOWN = ( $SYSTEM_FLAGS + 0x15 ); +our $FLAG_VISITED_PETALBURG_CITY = ( $SYSTEM_FLAGS + 0x16 ); +our $FLAG_VISITED_SLATEPORT_CITY = ( $SYSTEM_FLAGS + 0x17 ); +our $FLAG_VISITED_MAUVILLE_CITY = ( $SYSTEM_FLAGS + 0x18 ); +our $FLAG_VISITED_RUSTBORO_CITY = ( $SYSTEM_FLAGS + 0x19 ); +our $FLAG_VISITED_FORTREE_CITY = ( $SYSTEM_FLAGS + 0x1A ); +our $FLAG_VISITED_LILYCOVE_CITY = ( $SYSTEM_FLAGS + 0x1B ); +our $FLAG_VISITED_MOSSDEEP_CITY = ( $SYSTEM_FLAGS + 0x1C ); +our $FLAG_VISITED_SOOTOPOLIS_CITY = ( $SYSTEM_FLAGS + 0x1D ); +our $FLAG_VISITED_EVER_GRANDE_CITY = ( $SYSTEM_FLAGS + 0x1E ); +our $FLAG_SYS_USE_FLASH = ( $SYSTEM_FLAGS + 0x28 ); +our $FLAG_SYS_USE_STRENGTH = ( $SYSTEM_FLAGS + 0x29 ); +our $FLAG_SYS_WEATHER_CTRL = ( $SYSTEM_FLAGS + 0x2A ); +our $FLAG_SYS_CYCLING_ROAD = ( $SYSTEM_FLAGS + 0x2B ); +our $FLAG_SYS_SAFARI_MODE = ( $SYSTEM_FLAGS + 0x2C ); +our $FLAG_SYS_CRUISE_MODE = ( $SYSTEM_FLAGS + 0x2D ); +our $FLAG_SYS_TV_HOME = ( $SYSTEM_FLAGS + 0x30 ); +our $FLAG_SYS_TV_WATCH = ( $SYSTEM_FLAGS + 0x31 ); +our $FLAG_SYS_TV_START = ( $SYSTEM_FLAGS + 0x32 ); +our $FLAG_SYS_POPWORD_INPUT = ( $SYSTEM_FLAGS + 0x33 ); +our $FLAG_SYS_MIX_RECORD = ( $SYSTEM_FLAGS + 0x34 ); +our $FLAG_SYS_CLOCK_SET = ( $SYSTEM_FLAGS + 0x35 ); +our $FLAG_SYS_NATIONAL_DEX = ( $SYSTEM_FLAGS + 0x36 ); +our $FLAG_SYS_CAVE_SHIP = ( $SYSTEM_FLAGS + 0x37 ); +our $FLAG_SYS_CAVE_WONDER = ( $SYSTEM_FLAGS + 0x38 ); +our $FLAG_SYS_CAVE_BATTLE = ( $SYSTEM_FLAGS + 0x39 ); +our $FLAG_SYS_SHOAL_TIDE = ( $SYSTEM_FLAGS + 0x3A ); +our $FLAG_SYS_RIBBON_GET = ( $SYSTEM_FLAGS + 0x3B ); +our $FLAG_LANDMARK_FLOWER_SHOP = ( $SYSTEM_FLAGS + 0x3C ); +our $FLAG_LANDMARK_MR_BRINEY_HOUSE = ( $SYSTEM_FLAGS + 0x3D ); +our $FLAG_LANDMARK_ABANDONED_SHIP = ( $SYSTEM_FLAGS + 0x3E ); +our $FLAG_LANDMARK_SEASHORE_HOUSE = ( $SYSTEM_FLAGS + 0x3F ); +our $FLAG_LANDMARK_NEW_MAUVILLE = ( $SYSTEM_FLAGS + 0x40 ); +our $FLAG_LANDMARK_OLD_LADY_REST_SHOP = ( $SYSTEM_FLAGS + 0x41 ); +our $FLAG_LANDMARK_TRICK_HOUSE = ( $SYSTEM_FLAGS + 0x42 ); +our $FLAG_LANDMARK_WINSTRATE_FAMILY = ( $SYSTEM_FLAGS + 0x43 ); +our $FLAG_LANDMARK_GLASS_WORKSHOP = ( $SYSTEM_FLAGS + 0x44 ); +our $FLAG_LANDMARK_LANETTES_HOUSE = ( $SYSTEM_FLAGS + 0x45 ); +our $FLAG_LANDMARK_POKEMON_DAYCARE = ( $SYSTEM_FLAGS + 0x46 ); +our $FLAG_LANDMARK_SEAFLOOR_CAVERN = ( $SYSTEM_FLAGS + 0x47 ); +our $FLAG_LANDMARK_BATTLE_TOWER = ( $SYSTEM_FLAGS + 0x48 ); +our $FLAG_LANDMARK_SOUTHERN_ISLAND = ( $SYSTEM_FLAGS + 0x49 ); +our $FLAG_LANDMARK_FIERY_PATH = ( $SYSTEM_FLAGS + 0x4A ); +our $FLAG_SYS_PC_LANETTE = ( $SYSTEM_FLAGS + 0x4B ); +our $FLAG_SYS_EXDATA_ENABLE = ( $SYSTEM_FLAGS + 0x4C ); +our $FLAG_SYS_ENC_UP_ITEM = ( $SYSTEM_FLAGS + 0x4D ); +our $FLAG_SYS_ENC_DOWN_ITEM = ( $SYSTEM_FLAGS + 0x4E ); +our $FLAG_SYS_BRAILLE_DIG = ( $SYSTEM_FLAGS + 0x4F ); +our $FLAG_SYS_BRAILLE_STRENGTH = ( $SYSTEM_FLAGS + 0x50 ); +our $FLAG_SYS_BRAILLE_WAIT = ( $SYSTEM_FLAGS + 0x51 ); +our $FLAG_SYS_BRAILLE_FLY = ( $SYSTEM_FLAGS + 0x52 ); +our $FLAG_SYS_HAS_EON_TICKET = ( $SYSTEM_FLAGS + 0x53 ); +our $FLAG_SYS_POKEMON_LEAGUE_FLY = ( $SYSTEM_FLAGS + 0x54 ); +our $FLAG_LANDMARK_ISLAND_CAVE = ( $SYSTEM_FLAGS + 0x55 ); +our $FLAG_LANDMARK_DESERT_RUINS = ( $SYSTEM_FLAGS + 0x56 ); +our $FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE = ( $SYSTEM_FLAGS + 0x57 ); +our $FLAG_LANDMARK_SCORCHED_SLAB = ( $SYSTEM_FLAGS + 0x58 ); +our $FLAG_LANDMARK_ANCIENT_TOMB = ( $SYSTEM_FLAGS + 0x59 ); +our $FLAG_LANDMARK_TUNNELERS_REST_HOUSE = ( $SYSTEM_FLAGS + 0x5A ); +our $FLAG_LANDMARK_HUNTERS_HOUSE = ( $SYSTEM_FLAGS + 0x5B ); +our $FLAG_LANDMARK_SEALED_CHAMBER = ( $SYSTEM_FLAGS + 0x5C ); +our $FLAG_SYS_TV_LATI = ( $SYSTEM_FLAGS + 0x5D ); +our $FLAG_LANDMARK_SKY_PILLAR = ( $SYSTEM_FLAGS + 0x5E ); +our $FLAG_SYS_SHOAL_ITEM = ( $SYSTEM_FLAGS + 0x5F ); +our $FLAG_SYS_B_DASH = ( $SYSTEM_FLAGS + 0x60 ); +our $FLAG_SYS_CTRL_OBJ_DELETE = ( $SYSTEM_FLAGS + 0x61 ); +our $FLAG_SYS_RESET_RTC_ENABLE = ( $SYSTEM_FLAGS + 0x62 ); +our $FLAG_LANDMARK_BERRY_MASTERS_HOUSE = ( $SYSTEM_FLAGS + 0x63 ); +our $DAILY_FLAGS_START = ( $SYSTEM_FLAGS + 0xC0 ); +our $FLAG_DAILY_RECEIVED_BERRY_FALLARBOR = ( $SYSTEM_FLAGS + 0xC1 ); +our $FLAG_DAILY_UNKNOWN_8C2 = ( $SYSTEM_FLAGS + 0xC2 ); +our $FLAG_DAILY_PICKED_LOTTO_TICKET = ( $SYSTEM_FLAGS + 0xCA ); +our $FLAG_DAILY_RECEIVED_BERRY_ROUTE114 = ( $SYSTEM_FLAGS + 0xCB ); +our $FLAG_DAILY_RECEIVED_BERRY_ROUTE111 = ( $SYSTEM_FLAGS + 0xCC ); +our $FLAG_DAILY_RECEIVED_BERRY_FROM_BERRYMASTER = ( $SYSTEM_FLAGS + 0xCD ); +our $FLAG_DAILY_RECEIVED_BERRY_ROUTE120 = ( $SYSTEM_FLAGS + 0xCE ); +our $FLAG_DAILY_RECEIVED_BERRY_LILYCOVE = ( $SYSTEM_FLAGS + 0xCF ); +our $FLAG_DAILY_RECEIVED_BERRY_FLOWER_SHOP = ( $SYSTEM_FLAGS + 0xD0 ); +our $FLAG_DAILY_RECEIVED_BERRY_FROM_BERRYMASTER_WIFE = ( $SYSTEM_FLAGS + 0xD1 ); +our $FLAG_DAILY_RECEIVED_BERRY_SOOTOPOLIS = ( $SYSTEM_FLAGS + 0xD2 ); + +our @EXPORT_OK = + qw/$FLAG_SET_WALL_CLOCK $FLAG_RESCUED_BIRCH $FLAG_LINK_CONTEST_ROOM_POKEBALL $FLAG_MET_RIVAL_MOM $FLAG_BIRCH_AIDE_MET $FLAG_DECLINED_BIKE $FLAG_RECEIVED_BIKE $FLAG_RECEIVED_WAILMER_PAIL $FLAG_RECEIVED_POKEBLOCK_CASE $FLAG_RECEIVED_SECRET_POWER $FLAG_TV_EXPLAINED $FLAG_MAUVILLE_GYM_BARRIERS_STATE $FLAG_MOSSDEEP_GYM_SWITCH_1 $FLAG_MOSSDEEP_GYM_SWITCH_2 $FLAG_MOSSDEEP_GYM_SWITCH_3 $FLAG_MOSSDEEP_GYM_SWITCH_4 $FLAG_OCEANIC_MUSEUM_MET_REPORTER $FLAG_RECEIVED_HM04 $FLAG_RECEIVED_HM06 $FLAG_RECEIVED_HM05 $FLAG_RECEIVED_HM02 $FLAG_MT_PYRE_ORB_STOLEN $FLAG_EVIL_TEAM_ESCAPED_IN_SUBMARINE $FLAG_LEGENDARY_BATTLE_COMPLETED $FLAG_RECEIVED_METEORITE $FLAG_ADVENTURE_STARTED $FLAG_MET_HIDDEN_POWER_GIVER $FLAG_RECEIVED_TM31 $FLAG_RECEIVED_HM03 $FLAG_RECEIVED_HM08 $FLAG_DEFEATED_WALLY_VICTORY_ROAD $FLAG_MET_PRETTY_PETAL_SHOP_OWNER $FLAG_LEGEND_ESCAPED_SEAFLOOR_CAVERN $FLAG_DEFEATED_RIVAL_ROUTE103 $FLAG_RECEIVED_DOLL_LANETTE $FLAG_RECEIVED_POTION_OLDALE $FLAG_RECEIVED_AMULET_COIN $FLAG_PENDING_DAYCARE_EGG $FLAG_THANKED_FOR_PLAYING_WITH_WALLY $FLAG_RECEIVED_HM01 $FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY $FLAG_RECEIVED_6_SODA_POP $FLAG_DEFEATED_SEASHORE_HOUSE_TRAINER $FLAG_DEVON_GOODS_STOLEN $FLAG_RECOVERED_DEVON_GOODS $FLAG_RETURNED_DEVON_GOODS $FLAG_MR_BRINEY_SAILING_INTRO $FLAG_DOCK_REJECTED_DEVON_GOODS $FLAG_DELIVERED_DEVON_GOODS $FLAG_RECEIVED_CONTEST_PASS $FLAG_RECEIVED_CASTFORM $FLAG_RECEIVED_SUPER_ROD $FLAG_RUSTBORO_NPC_TRADE_COMPLETED $FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED $FLAG_FORTREE_NPC_TRADE_COMPLETED $FLAG_UNKNOWN_9F $FLAG_COOL_PAINTING_MADE $FLAG_BEAUTY_PAINTING_MADE $FLAG_CUTE_PAINTING_MADE $FLAG_SMART_PAINTING_MADE $FLAG_TOUGH_PAINTING_MADE $FLAG_RECEIVED_TM39 $FLAG_RECEIVED_TM08 $FLAG_RECEIVED_TM34 $FLAG_RECEIVED_TM50 $FLAG_RECEIVED_TM42 $FLAG_RECEIVED_TM40 $FLAG_RECEIVED_TM04 $FLAG_RECEIVED_TM03 $FLAG_DECORATION_1 $FLAG_DECORATION_2 $FLAG_DECORATION_3 $FLAG_DECORATION_4 $FLAG_DECORATION_5 $FLAG_DECORATION_6 $FLAG_DECORATION_7 $FLAG_DECORATION_8 $FLAG_DECORATION_9 $FLAG_DECORATION_10 $FLAG_DECORATION_11 $FLAG_DECORATION_12 $FLAG_DECORATION_13 $FLAG_DECORATION_14 $FLAG_DECORATION_15 $FLAG_RECEIVED_POKENAV $FLAG_DELIVERED_STEVEN_LETTER $FLAG_DEFEATED_WALLY_MAUVILLE $FLAG_RECEIVED_SUN_STONE_MOSSDEEP $FLAG_WALLY_SPEECH $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1 $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2 $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3 $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4 $FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5 $FLAG_RUSTURF_TUNNEL_OPENED $FLAG_RECEIVED_RED_SCARF $FLAG_RECEIVED_BLUE_SCARF $FLAG_RECEIVED_PINK_SCARF $FLAG_RECEIVED_GREEN_SCARF $FLAG_RECEIVED_YELLOW_SCARF $FLAG_ENCOUNTERED_LATIAS_OR_LATIOS $FLAG_RECEIVED_BASEMENT_KEY $FLAG_RECEIVED_TM24 $FLAG_RECEIVED_RED_OR_BLUE_ORB $FLAG_RECEIVED_PREMIER_BALL_RUSTBORO $FLAG_ROUTE104_PROTOTYPE_COMPLETED_1 $FLAG_ROUTE104_PROTOTYPE_COMPLETED_2 $FLAG_MET_DIVING_TREASURE_HUNTER $FLAG_MET_WAILMER_TRAINER $FLAG_EVIL_LEADER_PLEASE_STOP $FLAG_RECEIVED_GO_GOGGLES $FLAG_WINGULL_SENT_ON_ERRAND $FLAG_RECEIVED_MENTAL_HERB/; +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_WINGULL_DELIVERED_MAIL $FLAG_RECEIVED_20_COINS $FLAG_RECEIVED_STARTER_DOLL $FLAG_RECEIVED_GOOD_ROD $FLAG_REGI_DOORS_OPENED $FLAG_RECEIVED_TM27 $FLAG_RECEIVED_TM36 $FLAG_RECEIVED_TM05 $FLAG_RECEIVED_TM19 $FLAG_RECEIVED_TM44 $FLAG_RECEIVED_TM45 $FLAG_RECEIVED_GLASS_ORNAMENT $FLAG_RECEIVED_SILVER_SHIELD $FLAG_RECEIVED_GOLD_SHIELD $FLAG_USED_STORAGE_KEY $FLAG_USED_ROOM_1_KEY $FLAG_USED_ROOM_2_KEY $FLAG_USED_ROOM_4_KEY $FLAG_USED_ROOM_6_KEY $FLAG_MET_PROF_COSMO $FLAG_RECEIVED_WAILMER_DOLL $FLAG_RECEIVED_CHESTO_BERRY_ROUTE104 $FLAG_DEFEATED_SS_TIDAL_TRAINERS $FLAG_RECEIVED_SPELON_BERRY $FLAG_RECEIVED_PAMTRE_BERRY $FLAG_RECEIVED_WATMEL_BERRY $FLAG_RECEIVED_DURIN_BERRY $FLAG_RECEIVED_BELUE_BERRY $FLAG_RECEIVED_CHARCOAL $FLAG_LATIOS_OR_LATIAS_ROAMING $FLAG_RECEIVED_REPEAT_BALL $FLAG_RECEIVED_OLD_ROD $FLAG_RECEIVED_COIN_CASE $FLAG_RETURNED_RED_OR_BLUE_ORB $FLAG_RECEIVED_TM49 $FLAG_RECEIVED_TM28 $FLAG_RECEIVED_TM09 $FLAG_ENTERED_ELITE_FOUR $FLAG_RECEIVED_TM10 $FLAG_RECEIVED_TM41 $FLAG_RECEIVED_LAVARIDGE_EGG $FLAG_RECEIVED_FOSSIL_MON $FLAG_SECRET_BASE_REGISTRY_ENABLED $FLAG_RECEIVED_TM46 $FLAG_CONTEST_SKETCH_CREATED $FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE $FLAG_RECEIVED_EXP_SHARE $FLAG_POKERUS_EXPLAINED $FLAG_RECEIVED_RUNNING_SHOES $FLAG_RECEIVED_QUICK_CLAW $FLAG_RECEIVED_KINGS_ROCK $FLAG_RECEIVED_MACHO_BRACE $FLAG_RECEIVED_SOOTHE_BELL $FLAG_RECEIVED_WHITE_HERB $FLAG_RECEIVED_SOFT_SAND $FLAG_RECEIVED_CLEANSE_TAG $FLAG_RECEIVED_FOCUS_BAND $FLAG_DECLINED_WALLY_BATTLE_MAUVILLE $FLAG_RECEIVED_DEVON_SCOPE $FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE $FLAG_MET_DEVON_EMPLOYEE $FLAG_MET_RIVAL_RUSTBORO $FLAG_RECEIVED_SILK_SCARF $FLAG_NOT_READY_FOR_BATTLE_ROUTE120 $FLAG_RECEIVED_SS_TICKET $FLAG_MET_RIVAL_LILYCOVE $FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE $FLAG_EXCHANGED_SCANNER $FLAG_KECLEON_FLED_FORTREE $FLAG_PETALBURG_MART_EXPANDED_ITEMS $FLAG_RECEIVED_MIRACLE_SEED $FLAG_RECEIVED_BELDUM $FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK $FLAG_MET_FANCLUB_YOUNGER_BROTHER $FLAG_RIVAL_LEFT_FOR_ROUTE103 $FLAG_OMIT_DIVE_FROM_STEVEN_LETTER $FLAG_HIDDEN_ITEMS_START $FLAG_HIDDEN_ITEM_0 $FLAG_HIDDEN_ITEM_1 $FLAG_HIDDEN_ITEM_2 $FLAG_HIDDEN_ITEM_3 $FLAG_HIDDEN_ITEM_4 $FLAG_HIDDEN_ITEM_5 $FLAG_HIDDEN_ITEM_6 $FLAG_HIDDEN_ITEM_7 $FLAG_HIDDEN_ITEM_8 $FLAG_HIDDEN_ITEM_9 $FLAG_HIDDEN_ITEM_A $FLAG_HIDDEN_ITEM_B $FLAG_HIDDEN_ITEM_C $FLAG_HIDDEN_ITEM_D $FLAG_HIDDEN_ITEM_E $FLAG_HIDDEN_ITEM_F $FLAG_HIDDEN_ITEM_10 $FLAG_HIDDEN_ITEM_11 $FLAG_HIDDEN_ITEM_12 $FLAG_HIDDEN_ITEM_13 $FLAG_HIDDEN_ITEM_14 $FLAG_HIDDEN_ITEM_15 $FLAG_HIDDEN_ITEM_16 $FLAG_HIDDEN_ITEM_17 $FLAG_HIDDEN_ITEM_18 $FLAG_HIDDEN_ITEM_19 $FLAG_HIDDEN_ITEM_1A $FLAG_HIDDEN_ITEM_1B $FLAG_HIDDEN_ITEM_1C $FLAG_HIDDEN_ITEM_1D $FLAG_HIDDEN_ITEM_1E $FLAG_HIDDEN_ITEM_1F $FLAG_HIDDEN_ITEM_20 $FLAG_HIDDEN_ITEM_21 $FLAG_HIDDEN_ITEM_22 $FLAG_HIDDEN_ITEM_23 $FLAG_HIDDEN_ITEM_24 $FLAG_HIDDEN_ITEM_25 $FLAG_HIDDEN_ITEM_26 $FLAG_HIDDEN_ITEM_27 $FLAG_HIDDEN_ITEM_28 $FLAG_HIDDEN_ITEM_29 $FLAG_HIDDEN_ITEM_2A $FLAG_HIDDEN_ITEM_2B/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_HIDDEN_ITEM_2C $FLAG_HIDDEN_ITEM_2D $FLAG_HIDDEN_ITEM_2E $FLAG_HIDDEN_ITEM_2F $FLAG_HIDDEN_ITEM_30 $FLAG_HIDDEN_ITEM_31 $FLAG_HIDDEN_ITEM_32 $FLAG_HIDDEN_ITEM_33 $FLAG_HIDDEN_ITEM_34 $FLAG_HIDDEN_ITEM_35 $FLAG_HIDDEN_ITEM_36 $FLAG_HIDDEN_ITEM_37 $FLAG_HIDDEN_ITEM_38 $FLAG_HIDDEN_ITEM_39 $FLAG_HIDDEN_ITEM_3A $FLAG_HIDDEN_ITEM_3B $FLAG_HIDDEN_ITEM_3C $FLAG_HIDDEN_ITEM_3D $FLAG_HIDDEN_ITEM_3E $FLAG_HIDDEN_ITEM_3F $FLAG_HIDDEN_ITEM_40 $FLAG_HIDDEN_ITEM_41 $FLAG_HIDDEN_ITEM_42 $FLAG_HIDDEN_ITEM_43 $FLAG_HIDDEN_ITEM_44 $FLAG_HIDDEN_ITEM_45 $FLAG_HIDDEN_ITEM_46 $FLAG_HIDDEN_ITEM_47 $FLAG_HIDDEN_ITEM_48 $FLAG_HIDDEN_ITEM_49 $FLAG_HIDDEN_ITEM_4A $FLAG_HIDDEN_ITEM_4B $FLAG_HIDDEN_ITEM_4C $FLAG_HIDDEN_ITEM_4D $FLAG_HIDDEN_ITEM_4E $FLAG_HIDDEN_ITEM_4F $FLAG_HIDDEN_ITEM_50 $FLAG_HIDDEN_ITEM_51 $FLAG_HIDDEN_ITEM_52 $FLAG_HIDDEN_ITEM_53 $FLAG_HIDDEN_ITEM_54 $FLAG_HIDDEN_ITEM_55 $FLAG_HIDDEN_ITEM_56 $FLAG_HIDDEN_ITEM_57 $FLAG_HIDDEN_ITEM_58 $FLAG_HIDDEN_ITEM_59 $FLAG_HIDDEN_ITEM_5A $FLAG_HIDDEN_ITEM_5B $FLAG_HIDDEN_ITEM_5C $FLAG_HIDDEN_ITEM_5D $FLAG_HIDDEN_ITEM_5E $FLAG_HIDDEN_ITEM_5F $FLAG_HIDDEN_ITEM_BLACK_GLASSES $FLAG_HIDDEN_ITEM_61 $FLAG_HIDE_BIRCH_STARTERS_BAG $FLAG_HIDE_BIRCH_BATTLE_POOCHYENA $FLAG_HIDE_BIRCH_IN_LAB $FLAG_HIDE_MAY_UPSTAIRS $FLAG_HIDE_RIVAL_ROUTE103 $FLAG_HIDE_DEVON_PETALBURG_WOODS $FLAG_HIDE_EVIL_TEAM_PETALBURG_WOODS $FLAG_HIDE_WALLY_PETALBURG $FLAG_HIDE_STEVENS_LETTER $FLAG_HIDE_WALLY_MOM_PETALBURG_1 $FLAG_HIDE_GRUNT_RUSTBORO $FLAG_HIDE_DEVON_RUSTBORO $FLAG_HIDE_SLEEPING_MON_SEAFLOOR_CAVERN $FLAG_HIDE_NORMAN_LITTLEROOT $FLAG_UNKNOWN_2E1 $FLAG_HIDE_MR_BRINEY_ROUTE104 $FLAG_HIDE_MR_BRINEY_ROUTE104_HOUSE $FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN $FLAG_HIDE_MR_BRINEY_ROUTE109 $FLAG_HIDE_MR_BRINEY_BOAT_ROUTE104 $FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD $FLAG_HIDE_MR_BRINEY_BOAT_ROUTE109 $FLAG_UNKNOWN_2EB $FLAG_UNKNOWN_2EC $FLAG_UNKNOWN_2ED $FLAG_HIDE_POOCHYENA_ROUTE101 $FLAG_HIDE_WALLY_DEFEATED_VICTORY_ROAD $FLAG_HIDE_MOM_LITTLEROOT $FLAG_HIDE_MACHOKE_MOVER_1 $FLAG_HIDE_MACHOKE_MOVER_2 $FLAG_UNKNOWN_2F4 $FLAG_HIDE_MOM_UPSTAIRS $FLAG_HIDE_BRENDAN_MOM_DOWNSTAIRS $FLAG_HIDE_MAY_MOM_DOWNSTAIRS $FLAG_HIDE_BRENDAN_UPSTAIRS $FLAG_HIDE_MOVING_TRUCK_BRENDAN $FLAG_HIDE_MOVING_TRUCK_MAY $FLAG_HIDE_VICTOR_WINSTRATE $FLAG_HIDE_VICTORIA_WINSTRATE $FLAG_HIDE_VIVI_WINSTRATE $FLAG_HIDE_VICKI_WINSTRATE $FLAG_HIDE_NORMAN_PETALBURG_GYM $FLAG_HIDE_RAYQUAZA $FLAG_HIDE_LILYCOVE_CONTEST_ATTENDENT_1 $FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_LADY $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_GIRL $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTING_MAN $FLAG_HIDE_LILYCOVE_MUSEUM_PAINTER $FLAG_HIDE_LILYCOVE_MUSEUM_VISITORS $FLAG_HIDE_PETALBURG_GYM_GUIDE $FLAG_UNKNOWN_30E $FLAG_UNKNOWN_30F $FLAG_HIDE_BRENDAN_MOM $FLAG_HIDE_MAY_MOM $FLAG_HIDE_FANCLUB_OLD_LADY $FLAG_HIDE_FANCLUB_BOY $FLAG_HIDE_FANCLUB_LITTLE_BOY $FLAG_HIDE_FANCLUB_LADY $FLAG_HIDE_GABBY_AND_TY_ROUTE111_1 $FLAG_HIDE_GABBY_AND_TY_ROUTE118_1 $FLAG_HIDE_GABBY_AND_TY_ROUTE120_1/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_HIDE_GABBY_AND_TY_ROUTE111_2 $FLAG_HIDE_CONTEST_REPORTER_FALLARBOR $FLAG_HIDE_CONTEST_REPORTER_VERDANTURF $FLAG_HIDE_CONTEST_REPORTER_LILYCOVE $FLAG_HIDE_CONTEST_REPORTER_SLATEPORT $FLAG_HIDE_WALLY_MAUVILLE $FLAG_HIDE_WALLY_FATHER_MAUVILLE $FLAG_HIDE_WALLY_WANDAS_HOUSE $FLAG_HIDE_BOYFRIEND_RUSTURF_TUNNEL $FLAG_HIDE_BOYFRIEND_WANDAS_HOUSE $FLAG_HIDE_WALLY_FATHER_WANDAS_HOUSE $FLAG_HIDE_WALLY_FATHER_PETALBURG $FLAG_HIDE_WALLY_MOTHER_PETALBURG $FLAG_HIDE_LOST_GLASSES_MAN $FLAG_HIDE_RIVAL_RUSTBORO $FLAG_HIDE_WALLACE_SOOTOPOLIS_GYM $FLAG_HIDE_WALLACE_SOOTOPOLIS $FLAG_HIDE_GRUNTS_BLOCKING_CABLE_CAR $FLAG_HIDE_GRUNT_1_BLOCKING_HIDEOUT $FLAG_HIDE_GRUNT_2_BLOCKING_HIDEOUT $FLAG_UNKNOWN_337 $FLAG_HIDE_LEGEND_MON_CAVE_OF_ORIGIN $FLAG_HIDE_EVIL_LEADER_SEAFLOOR_CAVERN $FLAG_HIDE_OTHER_LEADER_SEAFLOOR_CAVERN $FLAG_HIDE_OTHER_TEAM_GRUNTS_SEAFLOOR_CAVERN $FLAG_HIDE_STEVEN_GRANITE_CAVE $FLAG_HIDE_STEVEN_ROUTE128 $FLAG_HIDE_GABBY_AND_TY_SLATEPORT $FLAG_HIDE_STERN_SLATEPORT $FLAG_HIDE_STERN_SLATEPORT_HARBOR $FLAG_UNKNOWN_34B $FLAG_UNKNOWN_34C $FLAG_HIDE_GRUNT_1_SLATEPORT_HARBOR $FLAG_HIDE_GRUNT_2_SLATEPORT_HARBOR $FLAG_UNKNOWN_34F $FLAG_HIDE_SUBMARINE_SHADOW_SLATEPORT_HARBOR $FLAG_HIDE_MAY_PICHU_DOLL $FLAG_HIDE_RIVAL_ROUTE119 $FLAG_HIDE_GRUNTS_LILYCOVE $FLAG_HIDE_SOOTOPOLIS_RESIDENTS $FLAG_HIDE_CAVE_OF_ORIGIN_ENTRANCE_WOMAN_1 $FLAG_HIDE_CAVE_OF_ORIGIN_ENTRANCE_WOMAN_2 $FLAG_HIDE_WALLY_BATTLE_VICTORY_ROAD $FLAG_HIDE_AWAKENED_MON_SEAFLOOR_CAVERN $FLAG_HIDE_SS_TIDAL_SLATEPORT_HARBOR $FLAG_HIDE_SS_TIDAL_LILYCOVE_HARBOR $FLAG_HIDE_WALLY_PETALBURG_GYM $FLAG_UNKNOWN_363 $FLAG_HIDE_FAT_MAN_LITTLEROOT $FLAG_HIDE_BRINEY_SLATEPORT_SHIPYARD $FLAG_HIDE_LANETTE $FLAG_HIDE_LANETTE_FALLARBOR $FLAG_HIDE_TRICKMASTER_ENTRANCE $FLAG_HIDE_MT_CHIMNEY_PEOPLE $FLAG_HIDE_GRUNT_RUSTURF_TUNNEL $FLAG_HIDE_BRINEY_RUSTURF_TUNNEL $FLAG_HIDE_PEEKO_RUSTURF_TUNNEL $FLAG_HIDE_PEEKO_BRINEY_HOUSE $FLAG_HIDE_EVIL_TEAM_SLATEPORT $FLAG_HIDE_EVIL_TEAM_OCEANIC_MUSEUM $FLAG_HIDE_GRUNT_1_OCEANIC_MUSEUM_2F $FLAG_HIDE_GRUNT_2_OCEANIC_MUSEUM_2F $FLAG_HIDE_EVIL_TEAM_LEADER_OCEANIC_MUSEUM_2F $FLAG_HIDE_STERN_OCEANIC_MUSEUM_2F $FLAG_HIDE_BATTLE_TOWER_OPPONENT $FLAG_HIDE_RIVAL_BIRCH_LAB $FLAG_HIDE_EVIL_TEAM_WEATHER_INSTITUTE $FLAG_HIDE_BRINEY_ROUTE116 $FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_1F $FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_2F $FLAG_HIDE_TUNNER_DIGGER_ROUTE116 $FLAG_HIDE_ARTIST_LILCOVE_CONTEST $FLAG_UNKNOWN_BIRCH_380 $FLAG_HIDE_BIRCH_ROUTE101 $FLAG_HIDE_BIRCH_ROUTE103 $FLAG_HIDE_TRICKMASTER_END $FLAG_HIDE_EVIL_TEAM_ROUTE110 $FLAG_HIDE_GABBY_AND_TY_ROUTE118_2 $FLAG_HIDE_GABBY_AND_TY_ROUTE120_2 $FLAG_HIDE_GABBY_AND_TY_ROUTE111_3 $FLAG_HIDE_GABBY_AND_TY_ROUTE118_3 $FLAG_HIDE_WORKERS_SLATEPORT_HARBOR $FLAG_HIDE_FLOWER_SHOP_WORKER_OUTSIDE $FLAG_HIDE_AZURILL_FALLARBOR $FLAG_HIDE_FERRY_ATTENDANT_LILYCOVE $FLAG_HIDE_FERRY_SAILOR_LILYCOVE $FLAG_HIDE_LATIOS_OR_LATIAS_FLYING $FLAG_HIDE_LATIOS_OR_LATIAS_STATIONARY $FLAG_HIDE_WATTSON_MAUVILLE $FLAG_HIDE_WATTSON_MAUVILLE_GYM/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_HIDE_GRUNTS_ROUTE121 $FLAG_UNKNOWN_393 $FLAG_HIDE_LEADER_MT_PYRE_SUMMIT $FLAG_HIDE_GRUNTS_MT_PYRE_SUMMIT $FLAG_HIDE_REPORTER_BATTLE_TOWER $FLAG_HIDE_RIVAL_ROUTE110 $FLAG_HIDE_RIVAL_CHAMPIONS_ROOM $FLAG_HIDE_BIRCH_CHAMPIONS_ROOM $FLAG_HIDE_RIVAL_ON_BIKE_ROUTE110 $FLAG_HIDE_RIVAL_ROUTE119_ON_BIKE $FLAG_HIDE_GRUNTS_HIDEOUTS $FLAG_HIDE_LILYCOVE_MOTEL_PEOPLE $FLAG_HIDE_EVIL_TEAM_MT_CHIMNEY $FLAG_HIDE_OTHER_TEAM_MT_CHIMNEY $FLAG_HIDE_PROF_COSMO_FALLARBOR $FLAG_HIDE_RIVAL_LAVARIDGE_1 $FLAG_HIDE_RIVAL_LAVARIDGE_2 $FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1 $FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2 $FLAG_HIDE_WINGULL_FORTREE_HOUSE $FLAG_HIDE_WINGULL_MOSSDEEP_HOUSE $FLAG_HIDE_REGIROCK $FLAG_HIDE_REGICE $FLAG_HIDE_REGISTEEL $FLAG_HIDE_GRUNTS_METEOR_FALLS_1F $FLAG_HIDE_OTHER_TEAM_METEOR_FALLS_1F $FLAG_HIDE_SLUDGE_BOMB_MAN_DEWFORD_HALL $FLAG_HIDE_AWARD_MAN_BATTLE_TOWER $FLAG_HIDE_PROF_COSMO_METEOR_FALLS $FLAG_HIDE_SUBMARINE_SHADOW_HIDEOUT $FLAG_HIDE_EVIL_LEADER_ROUTE128 $FLAG_HIDE_OTHER_LEADER_ROUTE128 $FLAG_HIDE_EVIL_TEAM_GRUNTS_SEAFLOOR_CAVERN $FLAG_HIDE_DEVON_EMPLOYEE_ROUTE116 $FLAG_HIDE_TM_SALESMAN_SLATEPORT $FLAG_HIDE_EMPLOYEE_DEVON_CORP_3F $FLAG_HIDE_BRINEY_AND_PEEKO_SS_TIDAL $FLAG_HIDE_TM_49_GIVER_SS_TIDAL $FLAG_HIDE_TOOK_SHOAL_SALT_1 $FLAG_HIDE_TOOK_SHOAL_SALT_2 $FLAG_HIDE_TOOK_SHOAL_SALT_3 $FLAG_HIDE_TOOK_SHOAL_SALT_4 $FLAG_HIDE_TOOK_SHOAL_SHELL_1 $FLAG_HIDE_TOOK_SHOAL_SHELL_2 $FLAG_HIDE_TOOK_SHOAL_SHELL_3 $FLAG_HIDE_TOOK_SHOAL_SHELL_4 $FLAG_HIDE_SECRET_POWER_MAN $FLAG_HIDE_OCEANIC_MUSEUM_VISITORS $FLAG_HIDE_ROOFTOP_LADY_LILYCOVE_MART $FLAG_HIDE_ROOT_FOSSIL $FLAG_HIDE_CLAW_FOSSIL $FLAG_HIDE_SCARED_GRUNT_OCEANIC_MUSEUM $FLAG_HIDE_STEVEN_ROUTE118 $FLAG_HIDE_STEVEN_STEVENS_HOUSE $FLAG_HIDE_BELDUM_BALL_STEVENS_HOUSE $FLAG_HIDE_KECLEON_FORTREE $FLAG_HIDE_KECLEON_ROUTE120_1 $FLAG_HIDE_RIVAL_LILYCOVE_MART $FLAG_HIDE_STEVEN_ROUTE120 $FLAG_HIDE_STEVEN_SOOTOPOLIS $FLAG_HIDE_VOLTORB_1_NEW_MAUVILLE $FLAG_HIDE_VOLTORB_2_NEW_MAUVILLE $FLAG_HIDE_VOLTORB_3_NEW_MAUVILLE $FLAG_HIDE_ELECTRODE_1_HIDEOUT $FLAG_HIDE_ELECTRODE_2_HIDEOUT $FLAG_HIDE_RIVAL_OLDALE_TOWN $FLAG_HIDE_UNDERWATER_SUBMARINE_INTERACTION $FLAG_HIDE_KECLEON_ROUTE120_2 $FLAG_HIDE_KECLEON_ROUTE120_3 $FLAG_HIDE_GIRLFRIEND_RUSTURF_TUNNEL $FLAG_HIDE_GIRLFRIEND_WANDAS_HOUSE $FLAG_HIDE_KECLEON_ROUTE120_4 $FLAG_HIDE_KECLEON_ROUTE120_5 $FLAG_HIDE_KECLEON_ROUTE120_6 $FLAG_HIDE_KECLEON_ROUTE120_7 $FLAG_HIDE_KECLEON_ROUTE119_1 $FLAG_HIDE_KECLEON_ROUTE119_2 $FLAG_HIDE_BOY_ROUTE101 $FLAG_ITEM_ROUTE102_1 $FLAG_ITEM_ROUTE116_1 $FLAG_ITEM_ROUTE104_1 $FLAG_ITEM_ROUTE105_1 $FLAG_ITEM_ROUTE106_1 $FLAG_ITEM_ROUTE109_1 $FLAG_ITEM_ROUTE110_1 $FLAG_ITEM_ROUTE110_2 $FLAG_ITEM_ROUTE111_1 $FLAG_ITEM_ROUTE111_2 $FLAG_ITEM_ROUTE111_3 $FLAG_ITEM_ROUTE112_1 $FLAG_ITEM_ROUTE113_1 $FLAG_ITEM_ROUTE113_2 $FLAG_ITEM_ROUTE114_1 $FLAG_ITEM_ROUTE114_2 $FLAG_ITEM_ROUTE115_1 $FLAG_ITEM_ROUTE115_2 $FLAG_ITEM_ROUTE115_3 $FLAG_ITEM_ROUTE116_2 $FLAG_ITEM_ROUTE116_3 $FLAG_ITEM_ROUTE116_4 $FLAG_ITEM_ROUTE117_1 $FLAG_ITEM_ROUTE117_2/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_ITEM_ROUTE119_1 $FLAG_ITEM_ROUTE119_2 $FLAG_ITEM_ROUTE119_3 $FLAG_ITEM_ROUTE119_4 $FLAG_ITEM_ROUTE119_5 $FLAG_ITEM_ROUTE119_6 $FLAG_ITEM_ROUTE120_1 $FLAG_ITEM_ROUTE120_2 $FLAG_ITEM_ROUTE123_1 $FLAG_ITEM_ROUTE123_2 $FLAG_ITEM_ROUTE127_1 $FLAG_ITEM_ROUTE127_2 $FLAG_ITEM_ROUTE132_1 $FLAG_ITEM_ROUTE133_1 $FLAG_ITEM_ROUTE133_2 $FLAG_ITEM_PETALBURG_1 $FLAG_ITEM_PETALBURG_2 $FLAG_ITEM_RUSTBORO_1 $FLAG_ITEM_LILYCOVE_1 $FLAG_ITEM_MOSSDEEP_1 $FLAG_ITEM_METEOR_FALLS_1F_1R_1 $FLAG_ITEM_METEOR_FALLS_1F_1R_2 $FLAG_ITEM_METEOR_FALLS_1F_1R_3 $FLAG_ITEM_METEOR_FALLS_1F_1R_4 $FLAG_ITEM_RUSTURF_TUNNEL_1 $FLAG_ITEM_RUSTURF_TUNNEL_2 $FLAG_ITEM_GRANITE_CAVE_1F_1 $FLAG_ITEM_GRANITE_CAVE_B1F_1 $FLAG_ITEM_MT_PYRE_5F_1 $FLAG_ITEM_GRANITE_CAVE_B2F_1 $FLAG_ITEM_GRANITE_CAVE_B2F_2 $FLAG_ITEM_PETALBURG_WOODS_1 $FLAG_ITEM_PETALBURG_WOODS_2 $FLAG_ITEM_ROUTE104_2 $FLAG_ITEM_PETALBURG_WOODS_3 $FLAG_ITEM_CAVE_OF_ORIGIN_B3F_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_2 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_2 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_1 $FLAG_ITEM_ROUTE124_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_1 $FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_1 $FLAG_ITEM_JAGGED_PASS_1 $FLAG_ITEM_AQUA_HIDEOUT_B1F_1 $FLAG_ITEM_AQUA_HIDEOUT_B2F_1 $FLAG_ITEM_MT_PYRE_EXTERIOR_1 $FLAG_ITEM_MT_PYRE_EXTERIOR_2 $FLAG_ITEM_NEW_MAUVILLE_INSIDE_1 $FLAG_ITEM_NEW_MAUVILLE_INSIDE_2 $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_1 $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_2 $FLAG_ITEM_SCORCHED_SLAB_1 $FLAG_ITEM_METEOR_FALLS_B1F_2R_1 $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ENTRANCE_1 $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_INNER_ROOM_1 $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM_1 $FLAG_ITEM_VICTORY_ROAD_1F_1 $FLAG_ITEM_VICTORY_ROAD_1F_2 $FLAG_ITEM_VICTORY_ROAD_B1F_1 $FLAG_ITEM_VICTORY_ROAD_B1F_2 $FLAG_ITEM_VICTORY_ROAD_B2F_1 $FLAG_ITEM_MT_PYRE_6F_1 $FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_1 $FLAG_ITEM_FIERY_PATH_1 $FLAG_ITEM_ROUTE124_2 $FLAG_ITEM_ROUTE124_3 $FLAG_ITEM_SAFARI_ZONE_NORTHWEST_1 $FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_1 $FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_1 $FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_1 $FLAG_ITEM_ABANDONED_SHIP_ROOM_B1F_1 $FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_1 $FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_1 $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_3 $FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_4 $FLAG_ITEM_ROUTE121_1 $FLAG_ITEM_ROUTE123_3 $FLAG_ITEM_ROUTE126_1 $FLAG_ITEM_ROUTE119_7 $FLAG_ITEM_ROUTE120_3 $FLAG_ITEM_ROUTE120_4 $FLAG_ITEM_ROUTE123_4 $FLAG_ITEM_NEW_MAUVILLE_INSIDE_3 $FLAG_ITEM_FIERY_PATH_2 $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ICE_ROOM_1 $FLAG_ITEM_SHOAL_CAVE_LOW_TIDE_ICE_ROOM_2 $FLAG_ITEM_ROUTE103_1 $FLAG_ITEM_ROUTE104_3 $FLAG_ITEM_MAUVILLE_1 $FLAG_ITEM_PETALBURG_WOODS_4 $FLAG_ITEM_ROUTE115_4 $FLAG_ITEM_SAFARI_ZONE_NORTHEAST_1 $FLAG_ITEM_MT_PYRE_3F_1 $FLAG_ITEM_ROUTE118_1 $FLAG_ITEM_NEW_MAUVILLE_INSIDE_4 $FLAG_ITEM_NEW_MAUVILLE_INSIDE_5 $FLAG_ITEM_AQUA_HIDEOUT_B1F_2/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_ITEM_MAGMA_HIDEOUT_B1F_1 $FLAG_ITEM_MAGMA_HIDEOUT_B1F_2 $FLAG_ITEM_MAGMA_HIDEOUT_B2F_1 $FLAG_ITEM_MT_PYRE_2F_1 $FLAG_ITEM_MT_PYRE_4F_1 $FLAG_ITEM_SAFARI_ZONE_SOUTHWEST $FLAG_ITEM_AQUA_HIDEOUT_B1F_3 $FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08 $FLAG_ITEM_MAGMA_HIDEOUT_B1F_3 $FLAG_ITEM_ROUTE104_4 $FLAG_DEFEATED_RUSTBORO_GYM $FLAG_DEFEATED_DEWFORD_GYM $FLAG_DEFEATED_MAUVILLE_GYM $FLAG_DEFEATED_LAVARIDGE_GYM $FLAG_DEFEATED_PETALBURG_GYM $FLAG_DEFEATED_FORTREE_GYM $FLAG_DEFEATED_MOSSDEEP_GYM $FLAG_DEFEATED_SOOTOPOLIS_GYM $FLAG_DEFEATED_ELITE_4_SYDNEY $FLAG_DEFEATED_ELITE_4_PHOEBE $FLAG_DEFEATED_ELITE_4_GLACIA $FLAG_DEFEATED_ELITE_4_DRAKE $TRAINER_FLAG_START $NUMBER_OF_TRAINERS $SYSTEM_FLAGS $FLAG_SYS_POKEMON_GET $FLAG_SYS_POKEDEX_GET $FLAG_SYS_POKENAV_GET $FLAG_SYS_GAME_CLEAR $FLAG_SYS_CHAT_USED $FLAG_SYS_HIPSTER_MEET $FLAG_BADGE01_GET $FLAG_BADGE02_GET $FLAG_BADGE03_GET $FLAG_BADGE04_GET $FLAG_BADGE05_GET $FLAG_BADGE06_GET $FLAG_BADGE07_GET $FLAG_BADGE08_GET $FLAG_VISITED_LITTLEROOT_TOWN $FLAG_VISITED_OLDALE_TOWN $FLAG_VISITED_DEWFORD_TOWN $FLAG_VISITED_LAVARIDGE_TOWN $FLAG_VISITED_FALLARBOR_TOWN $FLAG_VISITED_VERDANTURF_TOWN $FLAG_VISITED_PACIFIDLOG_TOWN $FLAG_VISITED_PETALBURG_CITY $FLAG_VISITED_SLATEPORT_CITY $FLAG_VISITED_MAUVILLE_CITY $FLAG_VISITED_RUSTBORO_CITY $FLAG_VISITED_FORTREE_CITY $FLAG_VISITED_LILYCOVE_CITY $FLAG_VISITED_MOSSDEEP_CITY $FLAG_VISITED_SOOTOPOLIS_CITY $FLAG_VISITED_EVER_GRANDE_CITY $FLAG_SYS_USE_FLASH $FLAG_SYS_USE_STRENGTH $FLAG_SYS_WEATHER_CTRL $FLAG_SYS_CYCLING_ROAD $FLAG_SYS_SAFARI_MODE $FLAG_SYS_CRUISE_MODE $FLAG_SYS_TV_HOME $FLAG_SYS_TV_WATCH $FLAG_SYS_TV_START $FLAG_SYS_POPWORD_INPUT $FLAG_SYS_MIX_RECORD $FLAG_SYS_CLOCK_SET $FLAG_SYS_NATIONAL_DEX $FLAG_SYS_CAVE_SHIP $FLAG_SYS_CAVE_WONDER $FLAG_SYS_CAVE_BATTLE $FLAG_SYS_SHOAL_TIDE $FLAG_SYS_RIBBON_GET $FLAG_LANDMARK_FLOWER_SHOP $FLAG_LANDMARK_MR_BRINEY_HOUSE $FLAG_LANDMARK_ABANDONED_SHIP $FLAG_LANDMARK_SEASHORE_HOUSE $FLAG_LANDMARK_NEW_MAUVILLE $FLAG_LANDMARK_OLD_LADY_REST_SHOP $FLAG_LANDMARK_TRICK_HOUSE $FLAG_LANDMARK_WINSTRATE_FAMILY $FLAG_LANDMARK_GLASS_WORKSHOP $FLAG_LANDMARK_LANETTES_HOUSE $FLAG_LANDMARK_POKEMON_DAYCARE $FLAG_LANDMARK_SEAFLOOR_CAVERN $FLAG_LANDMARK_BATTLE_TOWER $FLAG_LANDMARK_SOUTHERN_ISLAND $FLAG_LANDMARK_FIERY_PATH $FLAG_SYS_PC_LANETTE $FLAG_SYS_EXDATA_ENABLE $FLAG_SYS_ENC_UP_ITEM $FLAG_SYS_ENC_DOWN_ITEM $FLAG_SYS_BRAILLE_DIG $FLAG_SYS_BRAILLE_STRENGTH $FLAG_SYS_BRAILLE_WAIT $FLAG_SYS_BRAILLE_FLY $FLAG_SYS_HAS_EON_TICKET $FLAG_SYS_POKEMON_LEAGUE_FLY $FLAG_LANDMARK_ISLAND_CAVE $FLAG_LANDMARK_DESERT_RUINS $FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE $FLAG_LANDMARK_SCORCHED_SLAB $FLAG_LANDMARK_ANCIENT_TOMB $FLAG_LANDMARK_TUNNELERS_REST_HOUSE $FLAG_LANDMARK_HUNTERS_HOUSE $FLAG_LANDMARK_SEALED_CHAMBER $FLAG_SYS_TV_LATI $FLAG_LANDMARK_SKY_PILLAR $FLAG_SYS_SHOAL_ITEM $FLAG_SYS_B_DASH $FLAG_SYS_CTRL_OBJ_DELETE $FLAG_SYS_RESET_RTC_ENABLE $FLAG_LANDMARK_BERRY_MASTERS_HOUSE $DAILY_FLAGS_START $FLAG_DAILY_RECEIVED_BERRY_FALLARBOR/ +); +@EXPORT_OK = ( + @EXPORT_OK, + qw/$FLAG_DAILY_UNKNOWN_8C2 $FLAG_DAILY_PICKED_LOTTO_TICKET $FLAG_DAILY_RECEIVED_BERRY_ROUTE114 $FLAG_DAILY_RECEIVED_BERRY_ROUTE111 $FLAG_DAILY_RECEIVED_BERRY_FROM_BERRYMASTER $FLAG_DAILY_RECEIVED_BERRY_ROUTE120 $FLAG_DAILY_RECEIVED_BERRY_LILYCOVE $FLAG_DAILY_RECEIVED_BERRY_FLOWER_SHOP $FLAG_DAILY_RECEIVED_BERRY_FROM_BERRYMASTER_WIFE $FLAG_DAILY_RECEIVED_BERRY_SOOTOPOLIS/ +); + +1; diff --git a/lib/Rsaves/Constants/Ruby/Global.pm b/lib/Rsaves/Constants/Ruby/Global.pm new file mode 100644 index 0000000..90a3907 --- /dev/null +++ b/lib/Rsaves/Constants/Ruby/Global.pm @@ -0,0 +1,16 @@ +package Rsaves::Constants::Ruby::Global; + +use v5.34.1; + +use strict; +use warnings; + +use Exporter; + +use parent 'Exporter'; + +our $MALE = 0; +our $FEMALE = 1; + +our @EXPORT_OK = qw/$MALE $FEMALE/; +1; diff --git a/ruby.gba b/ruby.gba new file mode 100644 index 0000000..670488b Binary files /dev/null and b/ruby.gba differ diff --git a/ruby.sav b/ruby.sav new file mode 100644 index 0000000..3016c7b Binary files /dev/null and b/ruby.sav differ