diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a90cee26..b12176d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,8 +26,8 @@ jobs: # os & python versions strategy: matrix: - os-name: [ ubuntu-latest, ubuntu-16.04, macOS-latest, windows-latest ] - python-version: [ 3.7 ] + os-name: [ ubuntu-latest, ubuntu-18.04, macOS-latest, windows-latest ] + python-version: [ 3.8 ] # needs: [ install-test ] steps: # checkout commit @@ -57,11 +57,11 @@ jobs: # run build-gui.py - name: Build GUI run: | - python ./build-gui.py + python ./source/meta/build-gui.py # run build-dr.py - name: Build DungeonRandomizer run: | - python ./build-dr.py + python ./source/meta/build-dr.py # prepare binary artifacts for later step - name: Prepare Binary Artifacts env: @@ -88,8 +88,8 @@ jobs: strategy: matrix: # install/release on not xenial - os-name: [ ubuntu-latest, macOS-latest, windows-latest ] - python-version: [ 3.7 ] + os-name: [ ubuntu-latest, ubuntu-18.04, macOS-latest, windows-latest ] + python-version: [ 3.8 ] needs: [ install-build ] steps: @@ -150,9 +150,9 @@ jobs: # os & python versions strategy: matrix: - # release only on bionic + # release only on focal/bionic os-name: [ ubuntu-latest ] - python-version: [ 3.7 ] + python-version: [ 3.8 ] needs: [ install-prepare-release ] steps: diff --git a/BaseClasses.py b/BaseClasses.py index cda3ff61..588ff955 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -154,9 +154,10 @@ class World(object): self._door_cache[(door.name, door.player)] = door def remove_door(self, door, player): - if (door, player) in self._door_cache.keys(): - del self._door_cache[(door, player)] - self.doors.remove(door) + if (door.name, player) in self._door_cache.keys(): + del self._door_cache[(door.name, player)] + if door in self.doors: + self.doors.remove(door) def get_regions(self, player=None): return self.regions if player is None else self._region_cache[player].values() @@ -1220,6 +1221,7 @@ class Door(object): # self.connected = False # combine with Dest? self.dest = None self.blocked = False # Indicates if the door is normally blocked off as an exit. (Sanc door or always closed) + self.blocked_orig = False self.stonewall = False # Indicate that the door cannot be enter until exited (Desert Torches, PoD Eye Statue) self.smallKey = False # There's a small key door on this side self.bigKey = False # There's a big key door on this side @@ -1231,7 +1233,7 @@ class Door(object): self.dead = False self.entrance = entrance - if entrance is not None: + if entrance is not None and not entrance.door: entrance.door = self def getAddress(self): @@ -1317,7 +1319,7 @@ class Door(object): return self def no_exit(self): - self.blocked = True + self.blocked = self.blocked_orig = True return self def no_entrance(self): diff --git a/DoorShuffle.py b/DoorShuffle.py index 922142f4..33e42e63 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -8,17 +8,43 @@ from typing import DefaultDict, Dict, List from functools import reduce from BaseClasses import RegionType, Region, Door, DoorType, Direction, Sector, CrystalBarrier, DungeonInfo +from Doors import reset_portals from Dungeons import dungeon_regions, region_starts, standard_starts, split_region_starts from Dungeons import dungeon_bigs, dungeon_keys, dungeon_hints from Items import ItemFactory -from RoomData import DoorKind, PairedDoor +from RoomData import DoorKind, PairedDoor, reset_rooms from DungeonGenerator import ExplorationState, convert_regions, generate_dungeon, pre_validate, determine_required_paths, drop_entrances from DungeonGenerator import create_dungeon_builders, split_dungeon_builder, simple_dungeon_builder, default_dungeon_entrances -from DungeonGenerator import dungeon_portals, dungeon_drops +from DungeonGenerator import dungeon_portals, dungeon_drops, GenerationException from KeyDoorShuffle import analyze_dungeon, validate_vanilla_key_logic, build_key_layout, validate_key_layout def link_doors(world, player): + attempt, valid = 1, False + while not valid: + try: + link_doors_main(world, player) + valid = True + except GenerationException as e: + logging.getLogger('').debug(f'Irreconcilable generation. {str(e)} Starting a new attempt.') + attempt += 1 + if attempt > 10: + raise Exception('Could not create world in 10 attempts. Generation algorithms need more work', e) + for door in world.doors: + if door.player == player: + door.dest = None + door.entranceFlag = False + ent = door.entrance + if door.type != DoorType.Logical and ent.connected_region is not None: + ent.connected_region.entrances = [x for x in ent.connected_region.entrances if x != ent] + ent.connected_region = None + for portal in world.dungeon_portals[player]: + disconnect_portal(portal, world, player) + reset_portals(world, player) + reset_rooms(world, player) + + +def link_doors_main(world, player): # Drop-down connections & push blocks for exitName, regionName in logical_connections: @@ -45,7 +71,8 @@ def link_doors(world, player): mirror_route = world.get_entrance('Sanctuary Mirror Route', player) mr_door = mirror_route.door sanctuary = mirror_route.parent_region - sanctuary.exits.remove(mirror_route) + if mirror_route in sanctuary.exits: + sanctuary.exits.remove(mirror_route) world.remove_entrance(mirror_route, player) world.remove_door(mr_door, player) @@ -388,7 +415,10 @@ def choose_portals(world, player): possible_portals = outstanding_portals if not info.sole_entrance else [x for x in outstanding_portals if x != info.sole_entrance] choice, portal = assign_portal(candidates, possible_portals, world, player) if choice.deadEnd: - portal.deadEnd = True + if choice.passage: + portal.destination = True + else: + portal.deadEnd = True clean_up_portal_assignment(portal_assignment, dungeon, portal, master_door_list, outstanding_portals) the_rest = info.total - len(portal_assignment[dungeon]) for i in range(0, the_rest): @@ -477,7 +507,6 @@ def connect_portal(portal, world, player): ent, ext, entrance_name = portal_map[portal.name] if world.mode[player] == 'inverted' and portal.name in ['Ganons Tower', 'Agahnims Tower']: ext = 'Inverted ' + ext - # ent = 'Inverted ' + ent portal_entrance = world.get_entrance(portal.door.entrance.name, player) # ensures I get the right one for copying target_exit = world.get_entrance(ext, player) portal_entrance.connected_region = target_exit.parent_region @@ -491,22 +520,18 @@ def connect_portal(portal, world, player): portal_entrance.parent_region.entrances.append(edit_entrance) -# todo: remove this? -def connect_portal_copy(portal, world, player): +def disconnect_portal(portal, world, player): ent, ext, entrance_name = portal_map[portal.name] - if world.mode[player] == 'inverted' and portal.name in ['Ganons Tower', 'Agahnims Tower']: - ext = 'Inverted ' + ext - portal_entrance = world.get_entrance(portal.door.entrance.name, player) # ensures I get the right one for copying - target_exit = world.get_entrance(ext, player) - portal_entrance.connected_region = target_exit.parent_region - portal_region = world.get_region(portal.name + ' Portal', player) - portal_region.entrances.append(portal_entrance) + portal_entrance = world.get_entrance(portal.door.entrance.name, player) + # portal_region = world.get_region(portal.name + ' Portal', player) edit_entrance = world.get_entrance(entrance_name, player) - edit_entrance.connected_region = portal_entrance.parent_region chosen_door = world.get_door(portal_entrance.name, player) - chosen_door.blocked = False - connect_door_only(world, chosen_door, portal_region, player) - portal_entrance.parent_region.entrances.append(edit_entrance) + + # reverse work + if edit_entrance in portal_entrance.parent_region.entrances: + portal_entrance.parent_region.entrances.remove(edit_entrance) + chosen_door.blocked = chosen_door.blocked_orig + chosen_door.entranceFlag = False def find_portal_candidates(door_list, dungeon, need_passage=False, dead_end_allowed=False, crossed=False, bk_shuffle=False): @@ -710,10 +735,11 @@ def main_dungeon_generation(dungeon_builders, recombinant_builders, connections_ continue origin_list = list(builder.entrance_list) find_enabled_origins(builder.sectors, enabled_entrances, origin_list, entrances_map, name) + split_dungeon = treat_split_as_whole_dungeon(split_dungeon, name, origin_list, world, player) if len(origin_list) <= 0 or not pre_validate(builder, origin_list, split_dungeon, world, player): if last_key == builder.name or loops > 1000: origin_name = world.get_region(origin_list[0], player).entrances[0].parent_region.name if len(origin_list) > 0 else 'no origin' - raise Exception('Infinite loop detected for "%s" located at %s' % (builder.name, origin_name)) + raise GenerationException(f'Infinite loop detected for "{builder.name}" located at {origin_name}') sector_queue.append(builder) last_key = builder.name loops += 1 @@ -857,6 +883,22 @@ def aga_tower_enabled(enabled): return False +def treat_split_as_whole_dungeon(split_dungeon, name, origin_list, world, player): + # what about ER dungeons? - find an example? (bad key doors 0 keys not valid) + if split_dungeon and name in multiple_portal_map: + possible_entrances = [] + for portal_name in multiple_portal_map[name]: + portal = world.get_portal(portal_name, player) + portal_entrance = world.get_entrance(portal_map[portal_name][0], player) + if not portal.destination and portal_entrance.parent_region.name not in world.inaccessible_regions[player]: + possible_entrances.append(portal) + if len(possible_entrances) == 1: + single_portal = possible_entrances[0] + if single_portal.door.entrance.parent_region.name in origin_list and len(origin_list) == 1: + return False + return split_dungeon + + # goals: # 1. have enough chests to be interesting (2 more than dungeon items) # 2. have a balanced amount of regions added (check) @@ -2828,6 +2870,14 @@ portal_map = { 'Ganons Tower': ('Ganons Tower', 'Ganons Tower Exit', 'Enter Ganons Tower'), } + +multiple_portal_map = { + 'Hyrule Castle': ['Sanctuary', 'Hyrule Castle West', 'Hyrule Castle South', 'Hyrule Castle East'], + 'Desert Palace': ['Desert West', 'Desert South', 'Desert East', 'Desert Back'], + 'Skull Woods': ['Skull 1', 'Skull 2 West', 'Skull 2 East', 'Skull 3'], + 'Turtle Rock': ['Turtle Rock Lazy Eyes', 'Turtle Rock Eye Bridge', 'Turtle Rock Chest', 'Turtle Rock Main'], +} + split_portals = { 'Desert Palace': ['Back', 'Main'], 'Skull Woods': ['1', '2', '3'] diff --git a/Doors.py b/Doors.py index 460bf0d9..9c40838f 100644 --- a/Doors.py +++ b/Doors.py @@ -1271,36 +1271,11 @@ def create_doors(world, player): assign_entrances(world, player) - dungeon_portals = [ - create_portal(player, 'Sanctuary', world.get_door('Sanctuary S', player), 0x02, 0x02), - create_portal(player, 'Hyrule Castle West', world.get_door('Hyrule Castle West Lobby S', player), 0x03, 0x04), - create_portal(player, 'Hyrule Castle South', world.get_door('Hyrule Castle Lobby S', player), 0x04, 0x06), - create_portal(player, 'Hyrule Castle East', world.get_door('Hyrule Castle East Lobby S', player), 0x05, 0x08), - create_portal(player, 'Eastern', world.get_door('Eastern Lobby S', player), 0x08, 0x12, 0), - create_portal(player, 'Desert South', world.get_door('Desert Main Lobby S', player), 0x09, 0x14), - create_portal(player, 'Desert East', world.get_door('Desert East Lobby S', player), 0x0a, 0x16), - create_portal(player, 'Desert West', world.get_door('Desert West S', player), 0x0b, 0x18), - create_portal(player, 'Desert Back', world.get_door('Desert Back Lobby S', player), 0x0c, 0x1a, 1), - create_portal(player, 'Turtle Rock Lazy Eyes', world.get_door('TR Lazy Eyes SE', player), 0x15, 0x2c), - create_portal(player, 'Turtle Rock Eye Bridge', world.get_door('TR Eye Bridge SW', player), 0x18, 0x32), - create_portal(player, 'Turtle Rock Chest', world.get_door('TR Big Chest Entrance SE', player), 0x19, 0x34), - create_portal(player, 'Agahnims Tower', world.get_door('Tower Lobby S', player), 0x24, 0x4a), - create_portal(player, 'Swamp', world.get_door('Swamp Lobby S', player), 0x25, 0x4c, 4), - create_portal(player, 'Palace of Darkness', world.get_door('PoD Lobby S', player), 0x26, 0x4e, 5), - create_portal(player, 'Mire', world.get_door('Mire Lobby S', player), 0x27, 0x50, 7), - create_portal(player, 'Skull 2 West', world.get_door('Skull 2 West Lobby S', player), 0x28, 0x52), - create_portal(player, 'Skull 2 East', world.get_door('Skull 2 East Lobby SW', player), 0x29, 0x54), - create_portal(player, 'Skull 1', world.get_door('Skull 1 Lobby S', player), 0x2a, 0x56), - create_portal(player, 'Skull 3', world.get_door('Skull 3 Lobby SW', player), 0x2b, 0x58, 6), - create_portal(player, 'Ice', world.get_door('Ice Lobby SE', player), 0x2d, 0x5c, 8), - create_portal(player, 'Hera', world.get_door('Hera Lobby S', player), 0x33, 0x5a, 2), - create_portal(player, 'Thieves Town', world.get_door('Thieves Lobby S', player), 0x34, 0x6a, 10), - create_portal(player, 'Turtle Rock Main', world.get_door('TR Main Lobby SE', player), 0x35, 0x68, 9), - create_portal(player, 'Ganons Tower', world.get_door('GT Lobby S', player), 0x37, 0x70), - ] - world.dungeon_portals[player] += dungeon_portals + create_portals(world, player) + # static portal flags world.get_door('Sanctuary S', player).dead_end(allowPassage=True) + world.get_door('Eastern Hint Tile Blocked Path SE', player).passage = False world.get_door('TR Big Chest Entrance SE', player).passage = False world.get_door('Sewers Secret Room Key Door S', player).dungeonLink = 'Hyrule Castle' world.get_door('Desert Cannonball S', player).dead_end() @@ -1336,6 +1311,42 @@ def create_doors(world, player): world.get_door('Ice Conveyor SW', player).dungeonLink = 'linkIceFalls2' +def create_portals(world, player): + dungeon_portals = [ + create_portal(player, 'Sanctuary', world.get_door('Sanctuary S', player), 0x02, 0x02), + create_portal(player, 'Hyrule Castle West', world.get_door('Hyrule Castle West Lobby S', player), 0x03, 0x04), + create_portal(player, 'Hyrule Castle South', world.get_door('Hyrule Castle Lobby S', player), 0x04, 0x06), + create_portal(player, 'Hyrule Castle East', world.get_door('Hyrule Castle East Lobby S', player), 0x05, 0x08), + create_portal(player, 'Eastern', world.get_door('Eastern Lobby S', player), 0x08, 0x12, 0), + create_portal(player, 'Desert South', world.get_door('Desert Main Lobby S', player), 0x09, 0x14), + create_portal(player, 'Desert East', world.get_door('Desert East Lobby S', player), 0x0a, 0x16), + create_portal(player, 'Desert West', world.get_door('Desert West S', player), 0x0b, 0x18), + create_portal(player, 'Desert Back', world.get_door('Desert Back Lobby S', player), 0x0c, 0x1a, 1), + create_portal(player, 'Turtle Rock Lazy Eyes', world.get_door('TR Lazy Eyes SE', player), 0x15, 0x2c), + create_portal(player, 'Turtle Rock Eye Bridge', world.get_door('TR Eye Bridge SW', player), 0x18, 0x32), + create_portal(player, 'Turtle Rock Chest', world.get_door('TR Big Chest Entrance SE', player), 0x19, 0x34), + create_portal(player, 'Agahnims Tower', world.get_door('Tower Lobby S', player), 0x24, 0x4a), + create_portal(player, 'Swamp', world.get_door('Swamp Lobby S', player), 0x25, 0x4c, 4), + create_portal(player, 'Palace of Darkness', world.get_door('PoD Lobby S', player), 0x26, 0x4e, 5), + create_portal(player, 'Mire', world.get_door('Mire Lobby S', player), 0x27, 0x50, 7), + create_portal(player, 'Skull 2 West', world.get_door('Skull 2 West Lobby S', player), 0x28, 0x52), + create_portal(player, 'Skull 2 East', world.get_door('Skull 2 East Lobby SW', player), 0x29, 0x54), + create_portal(player, 'Skull 1', world.get_door('Skull 1 Lobby S', player), 0x2a, 0x56), + create_portal(player, 'Skull 3', world.get_door('Skull 3 Lobby SW', player), 0x2b, 0x58, 6), + create_portal(player, 'Ice', world.get_door('Ice Lobby SE', player), 0x2d, 0x5c, 8), + create_portal(player, 'Hera', world.get_door('Hera Lobby S', player), 0x33, 0x5a, 2), + create_portal(player, 'Thieves Town', world.get_door('Thieves Lobby S', player), 0x34, 0x6a, 10), + create_portal(player, 'Turtle Rock Main', world.get_door('TR Main Lobby SE', player), 0x35, 0x68, 9), + create_portal(player, 'Ganons Tower', world.get_door('GT Lobby S', player), 0x37, 0x70), + ] + world.dungeon_portals[player] += dungeon_portals + + +def reset_portals(world, player): + world.dungeon_portals[player].clear() + world._portal_cache.clear() + create_portals(world, player) + def create_paired_doors(world, player): world.paired_doors[player] = [ PairedDoor('Sewers Secret Room Key Door S', 'Sewers Key Rat Key Door N', True), diff --git a/DungeonGenerator.py b/DungeonGenerator.py index d14715b2..4fd59d80 100644 --- a/DungeonGenerator.py +++ b/DungeonGenerator.py @@ -1225,15 +1225,15 @@ def simple_dungeon_builder(name, sector_list): def create_dungeon_builders(all_sectors, connections_tuple, world, player, dungeon_entrances=None, split_dungeon_entrances=None): logger = logging.getLogger('') + logger.info('Shuffling Dungeon Sectors') if dungeon_entrances is None: dungeon_entrances = default_dungeon_entrances if split_dungeon_entrances is None: split_dungeon_entrances = split_region_starts define_sector_features(all_sectors) - finished, dungeon_map = False, {} + finished, dungeon_map, attempts = False, {}, 0 while not finished: - logger.info('Shuffling Dungeon Sectors') candidate_sectors = dict.fromkeys(all_sectors) global_pole = GlobalPolarity(candidate_sectors) @@ -1248,6 +1248,7 @@ def create_dungeon_builders(all_sectors, connections_tuple, world, player, for r_name in ['Hyrule Dungeon Cellblock', 'Sanctuary']: # need to deliver zelda assign_sector(find_sector(r_name, candidate_sectors), current_dungeon, candidate_sectors, global_pole) + standard_stair_check(dungeon_map, current_dungeon, candidate_sectors, global_pole) entrances_map, potentials, connections = connections_tuple accessible_sectors, reverse_d_map = set(), {} for key in dungeon_entrances.keys(): @@ -1324,11 +1325,27 @@ def create_dungeon_builders(all_sectors, connections_tuple, world, player, assign_the_rest(dungeon_map, neutral_sectors, global_pole, builder_info) dungeon_map.update(complete_dungeons) finished = True - except NeutralizingException: - pass + except (NeutralizingException, GenerationException) as e: + attempts += 1 + logger.debug(f'Attempt {attempts} failed with {str(e)}') + if attempts >= 10: + raise Exception('Could not find a valid seed quickly, something is likely horribly wrong.', e) return dungeon_map +def standard_stair_check(dungeon_map, dungeon, candidate_sectors, global_pole): + # this is because there must be at least one non-dead stairway in hc to get out + # this check may not be necessary + filtered_sectors = [x for x in candidate_sectors if any(y for y in x.outstanding_doors if not y.dead and y.type == DoorType.SpiralStairs)] + valid = False + while not valid: + chosen_sector = random.choice(filtered_sectors) + filtered_sectors.remove(chosen_sector) + valid = global_pole.is_valid_choice(dungeon_map, dungeon, [chosen_sector]) + if valid: + assign_sector(chosen_sector, dungeon, candidate_sectors, global_pole) + + def identify_destination_sectors(accessible_sectors, reverse_d_map, dungeon_map, connections, dungeon_entrances, split_dungeon_entrances): accessible_overworld, found_connections, explored = set(), set(), False @@ -1578,6 +1595,8 @@ def assign_crystal_switch_sectors(dungeon_map, crystal_switches, crystal_barrier if len(crystal_switches) == 0: raise GenerationException('No crystal switches to assign') sector_list = list(crystal_switches) + if len(population) > len(sector_list): + raise GenerationException('Not enough crystal switch sectors for those needed') choices = random.sample(sector_list, k=len(population)) for i, choice in enumerate(choices): builder = dungeon_map[population[i]] @@ -1588,7 +1607,7 @@ def assign_crystal_switch_sectors(dungeon_map, crystal_switches, crystal_barrier def ensure_crystal_switches_reachable(dungeon_map, crystal_switches, polarized_sectors, crystal_barriers, global_pole): invalid_builders = [] for name, builder in dungeon_map.items(): - if builder.c_switch_present and not builder.c_locked: + if builder.c_switch_present and builder.c_switch_required and not builder.c_locked: invalid_builders.append(builder) while len(invalid_builders) > 0: valid_builders = [] @@ -1597,7 +1616,7 @@ def ensure_crystal_switches_reachable(dungeon_map, crystal_switches, polarized_s reachable_crystals = defaultdict() for sector in builder.sectors: if sector.equations is None: - sector.equations = calc_sector_equations(sector, builder) + sector.equations = calc_sector_equations(sector) if sector.is_entrance_sector() and not sector.destination_entrance: need_switch = True for region in sector.get_start_regions(): @@ -1631,7 +1650,7 @@ def ensure_crystal_switches_reachable(dungeon_map, crystal_switches, polarized_s valid, sector, which_list = False, None, None while not valid: if len(candidates) <= 0: - raise GenerationException(f'need to provide more sophisticatedted crystal connection for {entrance_sector}') + raise GenerationException(f'need to provide more sophisticated crystal connection for {entrance_sector}') sector, which_list = random.choice(list(candidates.items())) del candidates[sector] valid = global_pole.is_valid_choice(dungeon_map, builder, [sector]) @@ -1690,7 +1709,7 @@ def find_pol_cand_for_c_switch(access, reachable_crystals, polarized_candidates) def pol_cand_matches_access_reach(sector, access, reachable_crystals): if sector.equations is None: - sector.equations = calc_sector_equations(sector, None) + sector.equations = calc_sector_equations(sector) for eq in sector.equations: key, cost_door = eq.cost if key in access.keys() and access[key]: @@ -1712,7 +1731,7 @@ def find_crystal_cand(access, crystal_switches): def crystal_cand_matches_access(sector, access): if sector.equations is None: - sector.equations = calc_sector_equations(sector, None) + sector.equations = calc_sector_equations(sector) for eq in sector.equations: key, cost_door = eq.cost if key in access.keys() and access[key] and eq.c_switch and len(sector.outstanding_doors) > 1: @@ -1984,6 +2003,9 @@ def polarity_step_3(dungeon_map, polarized_sectors, global_pole): sample_target = 100 if combos > 10 else combos * 2 while best_choices is None or samples < sample_target: samples += 1 + if len(odd_candidates) < len(odd_builders): + raise GenerationException(f'Unable to fix dungeon parity - not enough candidates.' + f' Ref: {next(iter(odd_builders)).name}') choices = random.sample(odd_candidates, k=len(odd_builders)) valid = global_pole.is_valid_multi_choice(dungeon_map, odd_builders, choices) charge = calc_total_charge(dungeon_map, odd_builders, choices) @@ -3649,14 +3671,14 @@ def copy_door_equations(builder, sector_list): for sector in builder.sectors + sector_list: if sector.equations is None: # todo: sort equations? - sector.equations = calc_sector_equations(sector, builder) + sector.equations = calc_sector_equations(sector) curr_list = equations[sector] = [] for equation in sector.equations: curr_list.append(equation.copy()) return equations -def calc_sector_equations(sector, builder): +def calc_sector_equations(sector): equations = [] is_entrance = sector.is_entrance_sector() and not sector.destination_entrance if is_entrance: @@ -3686,6 +3708,8 @@ def calc_door_equation(door, sector, look_for_entrance): eq.benefit[hook_from_door(door)].append(door) eq.required = True eq.c_switch = door.crystal == CrystalBarrier.Either + # exceptions for long entrances ??? + # if door.name in ['PoD Dark Alley']: eq.entrance_flag = True return eq, flag eq = DoorEquation(door) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 710767f6..282bc5db 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -3181,7 +3181,7 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ('Sanctuary Grave', 'Sewer Drop'), ('Sanctuary Exit', 'Light World'), - ('Old Man Cave (West)', 'Old Man Cave'), + ('Old Man Cave (West)', 'Old Man Cave Ledge'), ('Old Man Cave (East)', 'Old Man Cave'), ('Old Man Cave Exit (West)', 'Light World'), ('Old Man Cave Exit (East)', 'Death Mountain'), @@ -3327,7 +3327,7 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing' ('Two Brothers House (West)', 'Two Brothers House'), ('Two Brothers House Exit (East)', 'Light World'), ('Two Brothers House Exit (West)', 'Maze Race Ledge'), - ('Sanctuary', 'Sanctuary'), + ('Sanctuary', 'Sanctuary Portal'), ('Sanctuary Grave', 'Sewer Drop'), ('Sanctuary Exit', 'Light World'), ('Old Man House (Bottom)', 'Old Man House'), @@ -3398,7 +3398,7 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing' ('Old Man Cave Exit (West)', 'West Dark World'), ('Old Man Cave Exit (East)', 'Dark Death Mountain'), ('Dark Death Mountain Fairy', 'Old Man Cave'), - ('Bumper Cave (Bottom)', 'Old Man Cave'), + ('Bumper Cave (Bottom)', 'Old Man Cave Ledge'), ('Bumper Cave (Top)', 'Dark Death Mountain Healer Fairy'), ('Bumper Cave Exit (Top)', 'Death Mountain Return Ledge'), ('Bumper Cave Exit (Bottom)', 'Light World'), diff --git a/Gui.py b/Gui.py index 66fd4999..4cc5b106 100755 --- a/Gui.py +++ b/Gui.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 import json import os import sys diff --git a/KeyDoorShuffle.py b/KeyDoorShuffle.py index 5b690c22..becf6bf8 100644 --- a/KeyDoorShuffle.py +++ b/KeyDoorShuffle.py @@ -335,8 +335,9 @@ def adjust_locations_rules(key_logic, rule, accessible_loc, key_layout, key_coun test_set = None needed = rule.needed_keys_w_bk if needed > 0: - accessible_loc.update(key_counter.other_locations) - blocked_loc = key_layout.all_locations-accessible_loc + all_accessible = set(accessible_loc) + all_accessible.update(key_counter.other_locations) + blocked_loc = key_layout.all_locations-all_accessible for location in blocked_loc: if location not in key_logic.location_rules.keys(): loc_rule = LocationRule() @@ -373,11 +374,16 @@ def refine_placement_rules(key_layout, max_ctr): rule.needed_keys_w_bk -= len(key_onlys) if rule.needed_keys_w_bk == 0: rules_to_remove.append(rule) - if rule.bk_relevant and len(rule.check_locations_w_bk) == rule.needed_keys_w_bk + 1: - new_restricted = set(max_ctr.free_locations) - rule.check_locations_w_bk - if len(new_restricted - key_logic.bk_restricted) > 0: - key_logic.bk_restricted.update(new_restricted) # bk must be in one of the check_locations - changed = True + # todo: evaluate this usage + # if rule.bk_relevant and len(rule.check_locations_w_bk) == rule.needed_keys_w_bk + 1: + # new_restricted = set(max_ctr.free_locations) - rule.check_locations_w_bk + # if len(new_restricted | key_logic.bk_restricted) < len(key_layout.all_chest_locations): + # if len(new_restricted - key_logic.bk_restricted) > 0: + # key_logic.bk_restricted.update(new_restricted) # bk must be in one of the check_locations + # changed = True + # else: + # rules_to_remove.append(rule) + # changed = True if rule.needed_keys_w_bk > key_layout.max_chests or len(rule.check_locations_w_bk) < rule.needed_keys_w_bk: logging.getLogger('').warning('Invalid rule - what went wrong here??') rules_to_remove.append(rule) @@ -501,6 +507,8 @@ def find_bk_locked_sections(key_layout, world, player): key_layout.all_chest_locations.update(counter.free_locations) key_layout.item_locations.update(counter.free_locations) key_layout.item_locations.update(counter.key_only_locations) + key_layout.all_locations.update(key_layout.item_locations) + key_layout.all_locations.update(counter.other_locations) if counter.big_key_opened and counter.important_location: big_chest_allowed_big_key = False if not counter.big_key_opened: diff --git a/Main.py b/Main.py index 721541bc..5cf4c918 100644 --- a/Main.py +++ b/Main.py @@ -17,7 +17,7 @@ from InvertedRegions import create_inverted_regions, mark_dark_world_regions from EntranceShuffle import link_entrances, link_inverted_entrances from Rom import patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, LocalRom, JsonRom, get_hash_string from Doors import create_doors -from DoorShuffle import link_doors, connect_portal_copy +from DoorShuffle import link_doors, connect_portal from RoomData import create_rooms from Rules import set_rules from Dungeons import create_dungeons, fill_dungeons, fill_dungeons_restrictive @@ -25,8 +25,7 @@ from Fill import distribute_items_cutoff, distribute_items_staleness, distribute from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops from Utils import output_path, parse_player_names -__version__ = '0.2.1.0-u' - +__version__ = '0.3.1.0-u' class EnemizerError(RuntimeError): pass @@ -116,7 +115,7 @@ def main(args, seed=None, fish=None): create_dungeons(world, player) adjust_locations(world, player) - if any(world.potshuffle): + if any(world.potshuffle.values()): logger.info(world.fish.translate("cli", "cli", "shuffling.pots")) for player in range(1, world.players + 1): if world.potshuffle[player]: @@ -232,9 +231,6 @@ def main(args, seed=None, fish=None): if use_enemizer: base_patch = LocalRom(args.rom) # update base2current.json - if use_enemizer: - base_patch = LocalRom(args.rom) # update base2current.json - rom = JsonRom() if args.jsonout or use_enemizer else LocalRom(args.rom) if use_enemizer and (args.enemizercli or not args.jsonout): @@ -448,9 +444,7 @@ def copy_world(world): copied_region.is_light_world = region.is_light_world copied_region.is_dark_world = region.is_dark_world copied_region.dungeon = region.dungeon - copied_region.locations = [copy.copy(location) for location in region.locations] - for location in copied_region.locations: - location.parent_region = copied_region + copied_region.locations = [ret.get_location(location.name, location.player) for location in region.locations] for entrance in region.entrances: ret.get_entrance(entrance.name, entrance.player).connect(copied_region) @@ -494,7 +488,7 @@ def copy_world(world): ret.dungeon_portals = world.dungeon_portals for player, portals in world.dungeon_portals.items(): for portal in portals: - connect_portal_copy(portal, ret, player) + connect_portal(portal, ret, player) ret.sanc_portal = world.sanc_portal for player in range(1, world.players + 1): diff --git a/README.md b/README.md index 5a224b15..5e3292e2 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,10 @@ Key drop location are added to the pool. The keys normally found there are added ### Mixed Travel (--mixed_travel value) Due to Hammerjump, Hovering in PoD Arena, and the Mire Big Key Chest bomb jump two sections of a supertile that are -otherwise unconnected logically can be reach using these glitches. To prevent the player from unintentionally +otherwise unconnected logically can be reached using these glitches. To prevent the player from unintentionally changing +dungeons while doing these tricks, you may use one of the following options. -#### Prevent +#### Prevent (default) Rails are added the 3 spots to prevent this tricks. This setting is recommend for those learning crossed dungeon mode to learn what is dangerous and what is not. No logic seeds ignore this setting. @@ -73,17 +74,17 @@ The rooms are left alone and it is up to the discretion of the player whether to #### Force -The two disjointed sections are forced to be in the same dungeon but never logically required to complete that game. +The two disjointed sections are forced to be in the same dungeon but the glitches are never logically required to complete that game. ### Standardize Palettes (--standardize_palettes) No effect if door shuffle is not on crossed -#### Standardize +#### Standardize (default) Rooms in the same dungeon have their palettes changed to match. Hyrule Castle is split between Sewer and HC palette. -Rooms adjacent to sanctuary get their coloring to match sanc. +Rooms adjacent to sanctuary get their coloring to match the Sanctuary's original palette. #### Original -Room keep their original palettes. +Rooms/supertiles keep their original palettes. ## Map/Compass/Small Key/Big Key shuffle (aka Keysanity) @@ -121,13 +122,31 @@ Use to batch generate multiple seeds with same settings. If a seed number is pro Show the help message and exit. ``` ---door_shuffle +--door_shuffle ``` For specifying the door shuffle you want as above. (default: basic) ``` ---intensity +--intensity ``` For specifying the door shuffle intensity level you want as above. (default: 2) + +``` +--keydropshuffle +``` + +Include mobs and pots drop in the item pool. (default: not enabled) + +``` +--mixed_travel +``` + +How to handle certain glitches in crossed dungeon mode. (default: prevent) + +``` +--standardize_palettes (mode) +``` + +Whether to standardize dungeon palettes in crossed dungeon mode. (default: standardize) \ No newline at end of file diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7f440ea6..f3b9fb99 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,173 +1,21 @@ # New Features -## Lobby shuffle added as Intensity level 3 - -* Standard notes: - * The sanctuary is vanilla, and will be missing the exit door until Zelda is rescued - * In entrance shuffle the hyrule castle left and right exit door will be missing until Zelda is rescued. This - replaces the rails that used to block those lobby exits - * In non-entrance shuffle, Agahnims tower can be in logic if you have cape and/or Master sword, but you are never - required to beat Agahnim 1 until Zelda is rescued. -* Open notes: - * The Sanctuary is limited to be in a LW dungeon unless you have ER Crossed or higher enabled - * Mirroring from the Sanctuary to the new "Sanctuary" lobby is now in logic, as is exiting there. - * In ER crossed or higher, if the Sanctuary is in the Dark World, Link starts as Bunny there until the Moon Pearl - is found. Nothing inside that dungeon is in logic until the Moon Pearl is found. (Unless it is a multi-entrance - dungeon that you can access from some LW entrance) -* Lobby list is found in the spoiler -* Exits for Multi-entrance dungeons after beating bosses now makes more sense. Generally you'll exit from a entrance - from which the boss can logically be reached. If there are multiple, ones that do not lead to regions only accessible - by connector are preferred. The exit is randomly chosen if there's no obvious preference. However, In certain poor - cases like Skull Woods in ER, sometimes an exit is chosen not because you can reach the boss from there, but to - prevent a potential forced S&Q. -* Palette changes: - * Certain doors/transition no longer have an effect on the palette choice (dead ends mostly or just bridges) - * Sanctuary palette used on the adjacent rooms to Sanctuary (Sanctuary stays the dungeon color for now) - * Sewer palette comes back for part of Hyrule Castle for areas "near" the sewer dropdown - * There is a setting to keep original palettes (--standardize_palettes original) -* Known issues: - * Palettes aren't perfect - * Some ugly colors - * Invisible floors can be see in many palettes - ## Shopsanity --shopsanity added. This adds 29 shop locations (9 more in retro) to the general and location pool. -** **Todo** **: add more info here. - -## Key Drop Shuffle - ---keydropshuffle added. This add 33 new locations to the game where keys are found under pots -and where enemies drop keys. This includes 32 small key location and the ball and chain guard who normally drop the HC -Big Key. - -* Overall location count updated -* Setting mentioned in spoiler -* Minor change: if a key is Universal or for that dungeon, then if will use the old mechanics of picking up the key without -an entire pose and should be obtainable with the hookshot or boomerang as before - -## --mixed_travel setting -* Due to Hammerjump, Hovering in PoD Arena, and the Mire Big Key Chest bomb jump two sections of a supertile that are -otherwise unconnected logically can be reach using these glitches. To prevent the player from unintentionally - * prevent: Rails are added the 3 spots to prevent this tricks. This setting is recommend for those learning - crossed dungeon mode to learn what is dangerous and what is not. No logic seeds ignore this setting. - * allow: The rooms are left alone and it is up to the discretion of the player whether to use these tricks or not. - * force: The two disjointed sections are forced to be in the same dungeon but never logically required to complete that game. - -## Keysanity menu redesign - -Redesign of Keysanity Menu complete for crossed dungeon and moved out of experimental. -* First screen about Big Keys and Small Keys - * 1st Column: The map is required for information about the Big Key - * If you don't have the map, it'll be blank until you obtain the Big Key - * If have the map: - * 0 indicates there is no Big Key for that dungeon - * A red symbol indicates the Ball N Chain guard has the big key for that dungeon (does not apply in - --keydropshuffle) - * Blank if there a big key but you haven't found it yet - * 2nd Column displays the current number of keys for that dungeon. Suppressed in retro (always blank) - * 3rd Column only display if you have the map. It shows the number of keys left to collect for that dungeon. If - --keydropshuffle is off, this does not count key drops. If on, it does. - * (Note: the key columns can display up to 36 using the letters A-Z after 9) -* Second screen about Maps / Compass - * 1st Column: indicate if you have foudn the map of not for that dungeon - * 2nd and 3rd Column: You must have the compass to see these columns. A two-digit display that show you how - many chests are left in the dungeon. If -keydropshuffle is off, this does not count key drop. If on, it does. - -## Potshuffle by compiling - -Same flag as before but uses python logic written by compiling instead of the enemizer logic-less version. Needs some -testing to verify logic is all good. - -## Other features - -### Spoiler log improvements - -* In crossed mode, the new dungeon is listed along with the location designated by a '@' sign -* Random gt crystals and ganon crystal are noted in the settings for better reproduction of seeds - -### Experimental features - -* Only the item counter is currently experimental - * Item counter is suppressed in Triforce Hunt - - -#### Temporary debug features - -* Removed the red square in the upper right corner of the hud if the castle gate is closed +** **Todo** **: add more info here. # Bug Fixes -* 2.0.20u - * Problem with Desert Wall not being pre-opened in intensity 3 fixed -* 2.0.19u - * Generation improvement - * Possible fix for shop vram corruption - * The Cane of Byrna does not count as a chest key anymore -* 2.0.18u - * Generation improvements - * Bombs/Dash doors more consistent with the amount in vanilla. -* 2.0.17u - * Generation improvements -* 2.0.16u - * Prevent HUD from showing key counter when in the overworld. (Aga 2 doesn't always clear the dungeon indicator) - * Fixed key logic regarding certain isolated "important" locations - * Fixed a problem with keydropshuffle thinking certain progression items are keys - * A couple of inverted rules fixed - * A more accurate count of which locations are blocked by teh big key in Ganon's Tower - * Updated base rom to 31.0.7 (includes potential hera basement cage fix) -* 2.0.15u - * Allow Aga Tower lobby door as a a paired keydoor (typo) - * Fix portal check for multi-entrance dungeons -* 2.0.14u - * Removal of key doors no longer messes up certain lobbies - * Fixed ER entrances when Desert Back is a connector -* 2.0.13u - * Minor portal re-work for certain logic and spoiler information - * Repaired certain exits wrongly affected by Sanctuary placement (ER crossed + intensity 3) - * Fix for inverted ER + intensity 3 - * Fix for current small keys missing on keysanity menu - * Logic added for cases where you can flood Swamp Trench 1 before finding flippers and lock yourself out of getting - something behind the trench that leads to the flippers -* 2.0.12u - * Another fix for animated tiles (fairy fountains) - * GT Big Key stat fixed on credits - * Any denomination of rupee 20 or below can be removed to make room for Crossed Dungeon's extra dungeon items. This - helps retro generate more often. - * Fix for TR Lobbies in intensity 3 and ER shuffles that was causing a hardlock - * Standard ER logic revised for lobby shuffle and rain state considerations. -* 2.0.11u - * Fix output path setting in settings.json - * Fix trock entrances when intensity <= 2 -* 2.0.10u - * Fix POD, TR, GT and SKULL 3 entrances if sanc ends up in that dungeon in crossed ER+ - * TR Lobbies that need a bomb and can be entered before bombing should be pre-opened - * Animated tiles are loaded correctly in lobbies - * If a wallmaster grabs you and the lobby is dark, the lamp turns on now - * Certain key rules no longer override item requirements (e.g. Somaria behind TR Hub) - * Old Man Cave is correctly one way in the graph - * Some key logic fixes -* 2.0.9-u - * /missing command in MultiClient fixed -* 2.0.8-u - * Player sprite disappears after picking up a key drop in keydropshuffle - * Sewers and Hyrule Castle compass problems - * Double count of the Hera Basement Cage item (both overall and compass) - * Unnecessary/inconsistent rug cutoff - * TR Crystal Maze thought you get through backwards without Somaria - * Ensure Thieves Attic Window area can always be reached - * Fixed where HC big key was not counted -* Prior fixes - * Fixed a situation where logic did not account properly for Big Key doors in standard Hyrule Castle - * Fixed a problem ER shuffle generation that did not account for lobbies moving around - * Fixed a problem with camera unlock (GT Mimics and Mire Minibridge) - * Fixed a problem with bad-pseudo layer at PoD map Balcony (unable to hit switch with Bomb) - * Fixed a problem with the Ganon hint when hints are turned off +* 0.3.0.1-u + * Problem with lobbies on re-rolls corrected + * Potential playthrough problem addressed +* 0.3.0.0-u + * Generation improvements. Basic >95% success. Crossed >80% success. + * Possible increased generation times as certain generation problem tries a partial re-roll # Known Issues -* Multiworld = /missing command not working -* Potenial keylocks in multi-entrance dungeons -* Incorrect vanilla keylogic for Mire -* ER - Potential for Skull Woods West to be completely inaccessible in non-beatable logic \ No newline at end of file +* Potential keylocks in multi-entrance dungeons +* Incorrect vanilla key logic for Mire \ No newline at end of file diff --git a/Rom.py b/Rom.py index aa14ebc0..0e96f520 100644 --- a/Rom.py +++ b/Rom.py @@ -284,14 +284,23 @@ def patch_enemizer(world, player, rom, baserom_path, enemizercli, random_sprite_ with open(options_path, 'w') as f: json.dump(options, f) - subprocess.check_call([os.path.abspath(enemizercli), - '--rom', baserom_path, - '--seed', str(world.rom_seeds[player]), - '--base', basepatch_path, - '--randomizer', randopatch_path, - '--enemizer', options_path, - '--output', enemizer_output_path], - cwd=os.path.dirname(enemizercli), stdout=subprocess.DEVNULL) + try: + subprocess.run([os.path.abspath(enemizercli), + '--rom', baserom_path, + '--seed', str(world.rom_seeds[player]), + '--base', basepatch_path, + '--randomizer', randopatch_path, + '--enemizer', options_path, + '--output', enemizer_output_path], + cwd=os.path.dirname(enemizercli), + check=True, + capture_output=True) + except subprocess.CalledProcessError as e: + from Main import EnemizerError + enemizerMsg = world.fish.translate("cli","cli","Enemizer returned exit code: ") + str(e.returncode) + "\n" + enemizerMsg += world.fish.translate("cli","cli","enemizer.nothing.applied") + logging.error(f'Enemizer error output: {e.stderr.decode("utf-8")}\n') + raise EnemizerError(enemizerMsg) with open(enemizer_basepatch_path, 'r') as f: for patch in json.load(f): @@ -690,7 +699,7 @@ def patch_rom(world, rom, player, team, enemized): for name, pair in boss_indicator.items(): dungeon_id, boss_door = pair opposite_door = world.get_door(boss_door, player).dest - if opposite_door and opposite_door.roomIndex > -1: + if opposite_door and isinstance(opposite_door, Door) and opposite_door.roomIndex > -1: dungeon_name = opposite_door.entrance.parent_region.dungeon.name dungeon_id = boss_indicator[dungeon_name][0] rom.write_byte(0x13f000+dungeon_id, opposite_door.roomIndex) @@ -2579,4 +2588,4 @@ def write_pots_to_rom(rom, pot_contents): write_int16(rom, pot_item_room_table_lookup + 2*i, n-2) else: write_int16(rom, pot_item_room_table_lookup + 2*i, n-2) - assert n <= pot_item_table_end \ No newline at end of file + assert n <= pot_item_table_end diff --git a/RoomData.py b/RoomData.py index ac740c90..3fe8d594 100644 --- a/RoomData.py +++ b/RoomData.py @@ -254,6 +254,12 @@ def create_rooms(world, player): world.get_room(0xc0, player).change(0, DoorKind.Normal) # fix this kill room if enemizer is on +def reset_rooms(world, player): + world.rooms = [x for x in world.rooms if x.player != player] + world._room_cache.clear() + create_rooms(world, player) + + class Room(object): def __init__(self, player, index, address): self.player = player diff --git a/Utils.py b/Utils.py index 18d46667..229573f2 100644 --- a/Utils.py +++ b/Utils.py @@ -36,6 +36,9 @@ def is_bundled(): return getattr(sys, 'frozen', False) def local_path(path): + # just do stuff here and bail + return os.path.join(".", path) + if local_path.cached_path is not None: return os.path.join(local_path.cached_path, path) @@ -51,6 +54,9 @@ def local_path(path): local_path.cached_path = None def output_path(path): + # just do stuff here and bail + return os.path.join(".", path) + if output_path.cached_path is not None: return os.path.join(output_path.cached_path, path) @@ -61,15 +67,7 @@ def output_path(path): # has been packaged, so cannot use CWD for output. if sys.platform == 'win32': #windows - import ctypes.wintypes - CSIDL_PERSONAL = 5 # My Documents - SHGFP_TYPE_CURRENT = 0 # Get current, not default value - - buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) - - documents = buf.value - + documents = os.path.join(os.path.expanduser("~"),"Documents") elif sys.platform == 'darwin': from AppKit import NSSearchPathForDirectoriesInDomains # pylint: disable=import-error # http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSearchPathForDirectoriesInDomains @@ -655,4 +653,3 @@ if __name__ == '__main__': # room_palette_data(old_rom=sys.argv[1]) # extract_data_from_us_rom(sys.argv[1]) extract_data_from_jp_rom(sys.argv[1]) - diff --git a/data/sprites/official/4slink-armors.1.zspr b/data/sprites/official/4slink-armors.1.zspr deleted file mode 100644 index 7a944113..00000000 Binary files a/data/sprites/official/4slink-armors.1.zspr and /dev/null differ diff --git a/data/sprites/official/abigail.1.zspr b/data/sprites/official/abigail.1.zspr deleted file mode 100644 index 526990c5..00000000 Binary files a/data/sprites/official/abigail.1.zspr and /dev/null differ diff --git a/data/sprites/official/adol.1.zspr b/data/sprites/official/adol.1.zspr deleted file mode 100644 index da8210a9..00000000 Binary files a/data/sprites/official/adol.1.zspr and /dev/null differ diff --git a/data/sprites/official/aggretsuko.1.zspr b/data/sprites/official/aggretsuko.1.zspr deleted file mode 100644 index c23d9d83..00000000 Binary files a/data/sprites/official/aggretsuko.1.zspr and /dev/null differ diff --git a/data/sprites/official/alice.1.zspr b/data/sprites/official/alice.1.zspr deleted file mode 100644 index 4c673acd..00000000 Binary files a/data/sprites/official/alice.1.zspr and /dev/null differ diff --git a/data/sprites/official/angry-video-game-nerd.1.zspr b/data/sprites/official/angry-video-game-nerd.1.zspr deleted file mode 100644 index 79aee561..00000000 Binary files a/data/sprites/official/angry-video-game-nerd.1.zspr and /dev/null differ diff --git a/data/sprites/official/arcane.1.zspr b/data/sprites/official/arcane.1.zspr deleted file mode 100644 index b0fd4760..00000000 Binary files a/data/sprites/official/arcane.1.zspr and /dev/null differ diff --git a/data/sprites/official/ark-dorana.1.zspr b/data/sprites/official/ark-dorana.1.zspr deleted file mode 100644 index afd1c574..00000000 Binary files a/data/sprites/official/ark-dorana.1.zspr and /dev/null differ diff --git a/data/sprites/official/ark.1.zspr b/data/sprites/official/ark.1.zspr deleted file mode 100644 index 6ee7c09e..00000000 Binary files a/data/sprites/official/ark.1.zspr and /dev/null differ diff --git a/data/sprites/official/arrghus.2.zspr b/data/sprites/official/arrghus.2.zspr deleted file mode 100644 index 2064009d..00000000 Binary files a/data/sprites/official/arrghus.2.zspr and /dev/null differ diff --git a/data/sprites/official/astronaut.1.zspr b/data/sprites/official/astronaut.1.zspr deleted file mode 100644 index a4db3020..00000000 Binary files a/data/sprites/official/astronaut.1.zspr and /dev/null differ diff --git a/data/sprites/official/asuna.1.zspr b/data/sprites/official/asuna.1.zspr deleted file mode 100644 index f6f41545..00000000 Binary files a/data/sprites/official/asuna.1.zspr and /dev/null differ diff --git a/data/sprites/official/badeline.1.zspr b/data/sprites/official/badeline.1.zspr deleted file mode 100644 index b9fb1346..00000000 Binary files a/data/sprites/official/badeline.1.zspr and /dev/null differ diff --git a/data/sprites/official/bananas-in-pyjamas.1.zspr b/data/sprites/official/bananas-in-pyjamas.1.zspr deleted file mode 100644 index f75af2b2..00000000 Binary files a/data/sprites/official/bananas-in-pyjamas.1.zspr and /dev/null differ diff --git a/data/sprites/official/bandit.1.zspr b/data/sprites/official/bandit.1.zspr deleted file mode 100644 index 5b3288f8..00000000 Binary files a/data/sprites/official/bandit.1.zspr and /dev/null differ diff --git a/data/sprites/official/batman.1.zspr b/data/sprites/official/batman.1.zspr deleted file mode 100644 index a4a1e9c0..00000000 Binary files a/data/sprites/official/batman.1.zspr and /dev/null differ diff --git a/data/sprites/official/beau.1.zspr b/data/sprites/official/beau.1.zspr deleted file mode 100644 index 8d8d2079..00000000 Binary files a/data/sprites/official/beau.1.zspr and /dev/null differ diff --git a/data/sprites/official/bewp.1.zspr b/data/sprites/official/bewp.1.zspr deleted file mode 100644 index 265d2e1a..00000000 Binary files a/data/sprites/official/bewp.1.zspr and /dev/null differ diff --git a/data/sprites/official/bigkey.1.zspr b/data/sprites/official/bigkey.1.zspr deleted file mode 100644 index eab4854e..00000000 Binary files a/data/sprites/official/bigkey.1.zspr and /dev/null differ diff --git a/data/sprites/official/birb.1.zspr b/data/sprites/official/birb.1.zspr deleted file mode 100644 index d6d86bb6..00000000 Binary files a/data/sprites/official/birb.1.zspr and /dev/null differ diff --git a/data/sprites/official/birdo.1.zspr b/data/sprites/official/birdo.1.zspr deleted file mode 100644 index 54c49747..00000000 Binary files a/data/sprites/official/birdo.1.zspr and /dev/null differ diff --git a/data/sprites/official/blackmage.1.zspr b/data/sprites/official/blackmage.1.zspr deleted file mode 100644 index d9b56288..00000000 Binary files a/data/sprites/official/blackmage.1.zspr and /dev/null differ diff --git a/data/sprites/official/blacksmithlink.1.zspr b/data/sprites/official/blacksmithlink.1.zspr deleted file mode 100644 index e9aeb31a..00000000 Binary files a/data/sprites/official/blacksmithlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/blazer.1.zspr b/data/sprites/official/blazer.1.zspr deleted file mode 100644 index 9a15c25c..00000000 Binary files a/data/sprites/official/blazer.1.zspr and /dev/null differ diff --git a/data/sprites/official/blossom.1.zspr b/data/sprites/official/blossom.1.zspr deleted file mode 100644 index 57f4918c..00000000 Binary files a/data/sprites/official/blossom.1.zspr and /dev/null differ diff --git a/data/sprites/official/bobross.1.zspr b/data/sprites/official/bobross.1.zspr deleted file mode 100644 index eaa9811b..00000000 Binary files a/data/sprites/official/bobross.1.zspr and /dev/null differ diff --git a/data/sprites/official/boco.1.zspr b/data/sprites/official/boco.1.zspr deleted file mode 100644 index 21825520..00000000 Binary files a/data/sprites/official/boco.1.zspr and /dev/null differ diff --git a/data/sprites/official/boo-two.1.zspr b/data/sprites/official/boo-two.1.zspr deleted file mode 100644 index a5c5463c..00000000 Binary files a/data/sprites/official/boo-two.1.zspr and /dev/null differ diff --git a/data/sprites/official/boo.2.zspr b/data/sprites/official/boo.2.zspr deleted file mode 100644 index 24c74bde..00000000 Binary files a/data/sprites/official/boo.2.zspr and /dev/null differ diff --git a/data/sprites/official/bottle_o_goo.1.zspr b/data/sprites/official/bottle_o_goo.1.zspr deleted file mode 100644 index 28ca1f9b..00000000 Binary files a/data/sprites/official/bottle_o_goo.1.zspr and /dev/null differ diff --git a/data/sprites/official/botw-link.1.zspr b/data/sprites/official/botw-link.1.zspr deleted file mode 100644 index 1e14eff1..00000000 Binary files a/data/sprites/official/botw-link.1.zspr and /dev/null differ diff --git a/data/sprites/official/botw-zelda.1.zspr b/data/sprites/official/botw-zelda.1.zspr deleted file mode 100644 index 39f4a893..00000000 Binary files a/data/sprites/official/botw-zelda.1.zspr and /dev/null differ diff --git a/data/sprites/official/bowser.1.zspr b/data/sprites/official/bowser.1.zspr deleted file mode 100644 index 1cc256d8..00000000 Binary files a/data/sprites/official/bowser.1.zspr and /dev/null differ diff --git a/data/sprites/official/bowsette-red.1.zspr b/data/sprites/official/bowsette-red.1.zspr deleted file mode 100644 index d4bd4346..00000000 Binary files a/data/sprites/official/bowsette-red.1.zspr and /dev/null differ diff --git a/data/sprites/official/bowsette.1.zspr b/data/sprites/official/bowsette.1.zspr deleted file mode 100644 index 017414bc..00000000 Binary files a/data/sprites/official/bowsette.1.zspr and /dev/null differ diff --git a/data/sprites/official/branch.1.zspr b/data/sprites/official/branch.1.zspr deleted file mode 100644 index b7926418..00000000 Binary files a/data/sprites/official/branch.1.zspr and /dev/null differ diff --git a/data/sprites/official/brian.1.zspr b/data/sprites/official/brian.1.zspr deleted file mode 100644 index 013a2207..00000000 Binary files a/data/sprites/official/brian.1.zspr and /dev/null differ diff --git a/data/sprites/official/broccoli.1.zspr b/data/sprites/official/broccoli.1.zspr deleted file mode 100644 index e335df01..00000000 Binary files a/data/sprites/official/broccoli.1.zspr and /dev/null differ diff --git a/data/sprites/official/bronzor.1.zspr b/data/sprites/official/bronzor.1.zspr deleted file mode 100644 index d1afd117..00000000 Binary files a/data/sprites/official/bronzor.1.zspr and /dev/null differ diff --git a/data/sprites/official/bsboy.1.zspr b/data/sprites/official/bsboy.1.zspr deleted file mode 100644 index 7d00be74..00000000 Binary files a/data/sprites/official/bsboy.1.zspr and /dev/null differ diff --git a/data/sprites/official/bsgirl.1.zspr b/data/sprites/official/bsgirl.1.zspr deleted file mode 100644 index 82923751..00000000 Binary files a/data/sprites/official/bsgirl.1.zspr and /dev/null differ diff --git a/data/sprites/official/bubbles.1.zspr b/data/sprites/official/bubbles.1.zspr deleted file mode 100644 index bbba3b75..00000000 Binary files a/data/sprites/official/bubbles.1.zspr and /dev/null differ diff --git a/data/sprites/official/bullet_bill.1.zspr b/data/sprites/official/bullet_bill.1.zspr deleted file mode 100644 index 5b561b9e..00000000 Binary files a/data/sprites/official/bullet_bill.1.zspr and /dev/null differ diff --git a/data/sprites/official/buttercup.1.zspr b/data/sprites/official/buttercup.1.zspr deleted file mode 100644 index bd066c27..00000000 Binary files a/data/sprites/official/buttercup.1.zspr and /dev/null differ diff --git a/data/sprites/official/cactuar.1.zspr b/data/sprites/official/cactuar.1.zspr deleted file mode 100644 index 51c32893..00000000 Binary files a/data/sprites/official/cactuar.1.zspr and /dev/null differ diff --git a/data/sprites/official/cadence.1.zspr b/data/sprites/official/cadence.1.zspr deleted file mode 100644 index 05f174f7..00000000 Binary files a/data/sprites/official/cadence.1.zspr and /dev/null differ diff --git a/data/sprites/official/carlsagan42.1.zspr b/data/sprites/official/carlsagan42.1.zspr deleted file mode 100644 index 2632cb6f..00000000 Binary files a/data/sprites/official/carlsagan42.1.zspr and /dev/null differ diff --git a/data/sprites/official/casual-zelda.1.zspr b/data/sprites/official/casual-zelda.1.zspr deleted file mode 100644 index 80257f11..00000000 Binary files a/data/sprites/official/casual-zelda.1.zspr and /dev/null differ diff --git a/data/sprites/official/cat.3.zspr b/data/sprites/official/cat.3.zspr deleted file mode 100644 index 69946d73..00000000 Binary files a/data/sprites/official/cat.3.zspr and /dev/null differ diff --git a/data/sprites/official/catboo.1.zspr b/data/sprites/official/catboo.1.zspr deleted file mode 100644 index 45a4fa81..00000000 Binary files a/data/sprites/official/catboo.1.zspr and /dev/null differ diff --git a/data/sprites/official/cdilink.1.zspr b/data/sprites/official/cdilink.1.zspr deleted file mode 100644 index 3236f799..00000000 Binary files a/data/sprites/official/cdilink.1.zspr and /dev/null differ diff --git a/data/sprites/official/celes.1.zspr b/data/sprites/official/celes.1.zspr deleted file mode 100644 index ac0c1226..00000000 Binary files a/data/sprites/official/celes.1.zspr and /dev/null differ diff --git a/data/sprites/official/charizard.1.zspr b/data/sprites/official/charizard.1.zspr deleted file mode 100644 index babed511..00000000 Binary files a/data/sprites/official/charizard.1.zspr and /dev/null differ diff --git a/data/sprites/official/cheepcheep.1.zspr b/data/sprites/official/cheepcheep.1.zspr deleted file mode 100644 index a49545f2..00000000 Binary files a/data/sprites/official/cheepcheep.1.zspr and /dev/null differ diff --git a/data/sprites/official/chibity.1.zspr b/data/sprites/official/chibity.1.zspr deleted file mode 100644 index 949dbe2e..00000000 Binary files a/data/sprites/official/chibity.1.zspr and /dev/null differ diff --git a/data/sprites/official/chrizzz.1.zspr b/data/sprites/official/chrizzz.1.zspr deleted file mode 100644 index 337d5e5d..00000000 Binary files a/data/sprites/official/chrizzz.1.zspr and /dev/null differ diff --git a/data/sprites/official/cirno.1.zspr b/data/sprites/official/cirno.1.zspr deleted file mode 100644 index 75de8ab6..00000000 Binary files a/data/sprites/official/cirno.1.zspr and /dev/null differ diff --git a/data/sprites/official/clifford.1.zspr b/data/sprites/official/clifford.1.zspr deleted file mode 100644 index 73f848c1..00000000 Binary files a/data/sprites/official/clifford.1.zspr and /dev/null differ diff --git a/data/sprites/official/clyde.1.zspr b/data/sprites/official/clyde.1.zspr deleted file mode 100644 index b590a2ef..00000000 Binary files a/data/sprites/official/clyde.1.zspr and /dev/null differ diff --git a/data/sprites/official/conker.1.zspr b/data/sprites/official/conker.1.zspr deleted file mode 100644 index 121d5233..00000000 Binary files a/data/sprites/official/conker.1.zspr and /dev/null differ diff --git a/data/sprites/official/cornelius.1.zspr b/data/sprites/official/cornelius.1.zspr deleted file mode 100644 index 4c58f356..00000000 Binary files a/data/sprites/official/cornelius.1.zspr and /dev/null differ diff --git a/data/sprites/official/corona.1.zspr b/data/sprites/official/corona.1.zspr deleted file mode 100644 index 2ed39a78..00000000 Binary files a/data/sprites/official/corona.1.zspr and /dev/null differ diff --git a/data/sprites/official/crewmate.1.zspr b/data/sprites/official/crewmate.1.zspr deleted file mode 100644 index f2ce441d..00000000 Binary files a/data/sprites/official/crewmate.1.zspr and /dev/null differ diff --git a/data/sprites/official/cucco.1.zspr b/data/sprites/official/cucco.1.zspr deleted file mode 100644 index f237de4a..00000000 Binary files a/data/sprites/official/cucco.1.zspr and /dev/null differ diff --git a/data/sprites/official/cursor.1.zspr b/data/sprites/official/cursor.1.zspr deleted file mode 100644 index 45bc9739..00000000 Binary files a/data/sprites/official/cursor.1.zspr and /dev/null differ diff --git a/data/sprites/official/d_owls.2.zspr b/data/sprites/official/d_owls.2.zspr deleted file mode 100644 index a49080bb..00000000 Binary files a/data/sprites/official/d_owls.2.zspr and /dev/null differ diff --git a/data/sprites/official/dark-panda.1.zspr b/data/sprites/official/dark-panda.1.zspr deleted file mode 100644 index 1b39b747..00000000 Binary files a/data/sprites/official/dark-panda.1.zspr and /dev/null differ diff --git a/data/sprites/official/darkboy.1.zspr b/data/sprites/official/darkboy.1.zspr deleted file mode 100644 index de55ebbe..00000000 Binary files a/data/sprites/official/darkboy.1.zspr and /dev/null differ diff --git a/data/sprites/official/darkgirl.1.zspr b/data/sprites/official/darkgirl.1.zspr deleted file mode 100644 index 8fd848fd..00000000 Binary files a/data/sprites/official/darkgirl.1.zspr and /dev/null differ diff --git a/data/sprites/official/darklink-tunic.1.zspr b/data/sprites/official/darklink-tunic.1.zspr deleted file mode 100644 index fe417308..00000000 Binary files a/data/sprites/official/darklink-tunic.1.zspr and /dev/null differ diff --git a/data/sprites/official/darklink.1.zspr b/data/sprites/official/darklink.1.zspr deleted file mode 100644 index b0d9a95f..00000000 Binary files a/data/sprites/official/darklink.1.zspr and /dev/null differ diff --git a/data/sprites/official/darkswatchy.1.zspr b/data/sprites/official/darkswatchy.1.zspr deleted file mode 100644 index 88677425..00000000 Binary files a/data/sprites/official/darkswatchy.1.zspr and /dev/null differ diff --git a/data/sprites/official/darkzelda.1.zspr b/data/sprites/official/darkzelda.1.zspr deleted file mode 100644 index 519c278a..00000000 Binary files a/data/sprites/official/darkzelda.1.zspr and /dev/null differ diff --git a/data/sprites/official/darkzora.2.zspr b/data/sprites/official/darkzora.2.zspr deleted file mode 100644 index fbb15c69..00000000 Binary files a/data/sprites/official/darkzora.2.zspr and /dev/null differ diff --git a/data/sprites/official/deadpool-mythic.1.zspr b/data/sprites/official/deadpool-mythic.1.zspr deleted file mode 100644 index abcda926..00000000 Binary files a/data/sprites/official/deadpool-mythic.1.zspr and /dev/null differ diff --git a/data/sprites/official/deadpool.1.zspr b/data/sprites/official/deadpool.1.zspr deleted file mode 100644 index 3d2e87f7..00000000 Binary files a/data/sprites/official/deadpool.1.zspr and /dev/null differ diff --git a/data/sprites/official/deadrock.1.zspr b/data/sprites/official/deadrock.1.zspr deleted file mode 100644 index cc28cd79..00000000 Binary files a/data/sprites/official/deadrock.1.zspr and /dev/null differ diff --git a/data/sprites/official/decidueye.1.zspr b/data/sprites/official/decidueye.1.zspr deleted file mode 100644 index 1c769e62..00000000 Binary files a/data/sprites/official/decidueye.1.zspr and /dev/null differ diff --git a/data/sprites/official/dekar.1.zspr b/data/sprites/official/dekar.1.zspr deleted file mode 100644 index 203abccd..00000000 Binary files a/data/sprites/official/dekar.1.zspr and /dev/null differ diff --git a/data/sprites/official/demonlink.1.zspr b/data/sprites/official/demonlink.1.zspr deleted file mode 100644 index 2daf7359..00000000 Binary files a/data/sprites/official/demonlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/dragonite.2.zspr b/data/sprites/official/dragonite.2.zspr deleted file mode 100644 index 37d95ad0..00000000 Binary files a/data/sprites/official/dragonite.2.zspr and /dev/null differ diff --git a/data/sprites/official/drake.1.zspr b/data/sprites/official/drake.1.zspr deleted file mode 100644 index 1be94a75..00000000 Binary files a/data/sprites/official/drake.1.zspr and /dev/null differ diff --git a/data/sprites/official/eggplant.1.zspr b/data/sprites/official/eggplant.1.zspr deleted file mode 100644 index c33c2008..00000000 Binary files a/data/sprites/official/eggplant.1.zspr and /dev/null differ diff --git a/data/sprites/official/emosaru.1.zspr b/data/sprites/official/emosaru.1.zspr deleted file mode 100644 index a636dad9..00000000 Binary files a/data/sprites/official/emosaru.1.zspr and /dev/null differ diff --git a/data/sprites/official/ezlo.1.zspr b/data/sprites/official/ezlo.1.zspr deleted file mode 100644 index 54596847..00000000 Binary files a/data/sprites/official/ezlo.1.zspr and /dev/null differ diff --git a/data/sprites/official/fierce-deity-link.2.zspr b/data/sprites/official/fierce-deity-link.2.zspr deleted file mode 100644 index 0700bcac..00000000 Binary files a/data/sprites/official/fierce-deity-link.2.zspr and /dev/null differ diff --git a/data/sprites/official/finn.3.zspr b/data/sprites/official/finn.3.zspr deleted file mode 100644 index 265b197c..00000000 Binary files a/data/sprites/official/finn.3.zspr and /dev/null differ diff --git a/data/sprites/official/finny_bear.1.zspr b/data/sprites/official/finny_bear.1.zspr deleted file mode 100644 index 9c3a530b..00000000 Binary files a/data/sprites/official/finny_bear.1.zspr and /dev/null differ diff --git a/data/sprites/official/fish_floodgate.1.zspr b/data/sprites/official/fish_floodgate.1.zspr deleted file mode 100644 index 86684e7d..00000000 Binary files a/data/sprites/official/fish_floodgate.1.zspr and /dev/null differ diff --git a/data/sprites/official/flavor_guy.1.zspr b/data/sprites/official/flavor_guy.1.zspr deleted file mode 100644 index 5e1df365..00000000 Binary files a/data/sprites/official/flavor_guy.1.zspr and /dev/null differ diff --git a/data/sprites/official/foxlink.1.zspr b/data/sprites/official/foxlink.1.zspr deleted file mode 100644 index d6eaf433..00000000 Binary files a/data/sprites/official/foxlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/freya.1.zspr b/data/sprites/official/freya.1.zspr deleted file mode 100644 index b43338d5..00000000 Binary files a/data/sprites/official/freya.1.zspr and /dev/null differ diff --git a/data/sprites/official/frisk.1.zspr b/data/sprites/official/frisk.1.zspr deleted file mode 100644 index d521cae3..00000000 Binary files a/data/sprites/official/frisk.1.zspr and /dev/null differ diff --git a/data/sprites/official/froglink.3.zspr b/data/sprites/official/froglink.3.zspr deleted file mode 100644 index f5c46d82..00000000 Binary files a/data/sprites/official/froglink.3.zspr and /dev/null differ diff --git a/data/sprites/official/fujin.2.zspr b/data/sprites/official/fujin.2.zspr deleted file mode 100644 index 9254ff7b..00000000 Binary files a/data/sprites/official/fujin.2.zspr and /dev/null differ diff --git a/data/sprites/official/future_trunks.1.zspr b/data/sprites/official/future_trunks.1.zspr deleted file mode 100644 index 456e64c7..00000000 Binary files a/data/sprites/official/future_trunks.1.zspr and /dev/null differ diff --git a/data/sprites/official/gamer.1.zspr b/data/sprites/official/gamer.1.zspr deleted file mode 100644 index 9f78d894..00000000 Binary files a/data/sprites/official/gamer.1.zspr and /dev/null differ diff --git a/data/sprites/official/ganon.1.zspr b/data/sprites/official/ganon.1.zspr deleted file mode 100644 index a6adda43..00000000 Binary files a/data/sprites/official/ganon.1.zspr and /dev/null differ diff --git a/data/sprites/official/ganondorf.1.zspr b/data/sprites/official/ganondorf.1.zspr deleted file mode 100644 index 5bb6f548..00000000 Binary files a/data/sprites/official/ganondorf.1.zspr and /dev/null differ diff --git a/data/sprites/official/garfield.2.zspr b/data/sprites/official/garfield.2.zspr deleted file mode 100644 index 6ca890e8..00000000 Binary files a/data/sprites/official/garfield.2.zspr and /dev/null differ diff --git a/data/sprites/official/garnet.1.zspr b/data/sprites/official/garnet.1.zspr deleted file mode 100644 index 858497c7..00000000 Binary files a/data/sprites/official/garnet.1.zspr and /dev/null differ diff --git a/data/sprites/official/garomaster.1.zspr b/data/sprites/official/garomaster.1.zspr deleted file mode 100644 index 65b9959d..00000000 Binary files a/data/sprites/official/garomaster.1.zspr and /dev/null differ diff --git a/data/sprites/official/gbc-link.1.zspr b/data/sprites/official/gbc-link.1.zspr deleted file mode 100644 index e98a6d08..00000000 Binary files a/data/sprites/official/gbc-link.1.zspr and /dev/null differ diff --git a/data/sprites/official/geno.1.zspr b/data/sprites/official/geno.1.zspr deleted file mode 100644 index 3d747a2a..00000000 Binary files a/data/sprites/official/geno.1.zspr and /dev/null differ diff --git a/data/sprites/official/gliitchwiitch.1.zspr b/data/sprites/official/gliitchwiitch.1.zspr deleted file mode 100644 index 0f618df0..00000000 Binary files a/data/sprites/official/gliitchwiitch.1.zspr and /dev/null differ diff --git a/data/sprites/official/gobli.1.zspr b/data/sprites/official/gobli.1.zspr deleted file mode 100644 index 51dd1192..00000000 Binary files a/data/sprites/official/gobli.1.zspr and /dev/null differ diff --git a/data/sprites/official/goomba.1.zspr b/data/sprites/official/goomba.1.zspr deleted file mode 100644 index 0438682f..00000000 Binary files a/data/sprites/official/goomba.1.zspr and /dev/null differ diff --git a/data/sprites/official/goose.1.zspr b/data/sprites/official/goose.1.zspr deleted file mode 100644 index d2ffb5ba..00000000 Binary files a/data/sprites/official/goose.1.zspr and /dev/null differ diff --git a/data/sprites/official/grandpoobear.2.zspr b/data/sprites/official/grandpoobear.2.zspr deleted file mode 100644 index 72663680..00000000 Binary files a/data/sprites/official/grandpoobear.2.zspr and /dev/null differ diff --git a/data/sprites/official/gretis.1.zspr b/data/sprites/official/gretis.1.zspr deleted file mode 100644 index 87607a17..00000000 Binary files a/data/sprites/official/gretis.1.zspr and /dev/null differ diff --git a/data/sprites/official/grunclestan.1.zspr b/data/sprites/official/grunclestan.1.zspr deleted file mode 100644 index cf371839..00000000 Binary files a/data/sprites/official/grunclestan.1.zspr and /dev/null differ diff --git a/data/sprites/official/guiz.1.zspr b/data/sprites/official/guiz.1.zspr deleted file mode 100644 index 995c08ad..00000000 Binary files a/data/sprites/official/guiz.1.zspr and /dev/null differ diff --git a/data/sprites/official/hanna.1.zspr b/data/sprites/official/hanna.1.zspr deleted file mode 100644 index 92ce372e..00000000 Binary files a/data/sprites/official/hanna.1.zspr and /dev/null differ diff --git a/data/sprites/official/hardhat_beetle.1.zspr b/data/sprites/official/hardhat_beetle.1.zspr deleted file mode 100644 index 80b63af1..00000000 Binary files a/data/sprites/official/hardhat_beetle.1.zspr and /dev/null differ diff --git a/data/sprites/official/hat-kid.1.zspr b/data/sprites/official/hat-kid.1.zspr deleted file mode 100644 index d0341060..00000000 Binary files a/data/sprites/official/hat-kid.1.zspr and /dev/null differ diff --git a/data/sprites/official/headlesslink.1.zspr b/data/sprites/official/headlesslink.1.zspr deleted file mode 100644 index 8a9b3ce4..00000000 Binary files a/data/sprites/official/headlesslink.1.zspr and /dev/null differ diff --git a/data/sprites/official/hello_kitty.1.zspr b/data/sprites/official/hello_kitty.1.zspr deleted file mode 100644 index a2f5df06..00000000 Binary files a/data/sprites/official/hello_kitty.1.zspr and /dev/null differ diff --git a/data/sprites/official/hidari.1.zspr b/data/sprites/official/hidari.1.zspr deleted file mode 100644 index 54a4d0da..00000000 Binary files a/data/sprites/official/hidari.1.zspr and /dev/null differ diff --git a/data/sprites/official/hint_tile.1.zspr b/data/sprites/official/hint_tile.1.zspr deleted file mode 100644 index 9cfd7e90..00000000 Binary files a/data/sprites/official/hint_tile.1.zspr and /dev/null differ diff --git a/data/sprites/official/hoarder-bush.1.zspr b/data/sprites/official/hoarder-bush.1.zspr deleted file mode 100644 index d2adb227..00000000 Binary files a/data/sprites/official/hoarder-bush.1.zspr and /dev/null differ diff --git a/data/sprites/official/hoarder-pot.1.zspr b/data/sprites/official/hoarder-pot.1.zspr deleted file mode 100644 index 717e4199..00000000 Binary files a/data/sprites/official/hoarder-pot.1.zspr and /dev/null differ diff --git a/data/sprites/official/hoarder-rock.1.zspr b/data/sprites/official/hoarder-rock.1.zspr deleted file mode 100644 index a93fd1c4..00000000 Binary files a/data/sprites/official/hoarder-rock.1.zspr and /dev/null differ diff --git a/data/sprites/official/hollow-knight.1.zspr b/data/sprites/official/hollow-knight.1.zspr deleted file mode 100644 index 31d8ee3d..00000000 Binary files a/data/sprites/official/hollow-knight.1.zspr and /dev/null differ diff --git a/data/sprites/official/homer.1.zspr b/data/sprites/official/homer.1.zspr deleted file mode 100644 index ee8b5f5f..00000000 Binary files a/data/sprites/official/homer.1.zspr and /dev/null differ diff --git a/data/sprites/official/hotdog.1.zspr b/data/sprites/official/hotdog.1.zspr deleted file mode 100644 index 4ed5e636..00000000 Binary files a/data/sprites/official/hotdog.1.zspr and /dev/null differ diff --git a/data/sprites/official/hyruleknight.1.zspr b/data/sprites/official/hyruleknight.1.zspr deleted file mode 100644 index a8815bc3..00000000 Binary files a/data/sprites/official/hyruleknight.1.zspr and /dev/null differ diff --git a/data/sprites/official/ibazly.1.zspr b/data/sprites/official/ibazly.1.zspr deleted file mode 100644 index 01114c9e..00000000 Binary files a/data/sprites/official/ibazly.1.zspr and /dev/null differ diff --git a/data/sprites/official/ignignokt.2.zspr b/data/sprites/official/ignignokt.2.zspr deleted file mode 100644 index f06d07cc..00000000 Binary files a/data/sprites/official/ignignokt.2.zspr and /dev/null differ diff --git a/data/sprites/official/informant_woman.1.zspr b/data/sprites/official/informant_woman.1.zspr deleted file mode 100644 index 6465a0e9..00000000 Binary files a/data/sprites/official/informant_woman.1.zspr and /dev/null differ diff --git a/data/sprites/official/inkling.1.zspr b/data/sprites/official/inkling.1.zspr deleted file mode 100644 index 6b39e4a7..00000000 Binary files a/data/sprites/official/inkling.1.zspr and /dev/null differ diff --git a/data/sprites/official/invisibleman.1.zspr b/data/sprites/official/invisibleman.1.zspr deleted file mode 100644 index 7993c500..00000000 Binary files a/data/sprites/official/invisibleman.1.zspr and /dev/null differ diff --git a/data/sprites/official/jack-frost.1.zspr b/data/sprites/official/jack-frost.1.zspr deleted file mode 100644 index 12dd417a..00000000 Binary files a/data/sprites/official/jack-frost.1.zspr and /dev/null differ diff --git a/data/sprites/official/jason_frudnick.1.zspr b/data/sprites/official/jason_frudnick.1.zspr deleted file mode 100644 index 2411759c..00000000 Binary files a/data/sprites/official/jason_frudnick.1.zspr and /dev/null differ diff --git a/data/sprites/official/jasp.1.zspr b/data/sprites/official/jasp.1.zspr deleted file mode 100644 index 6dc74496..00000000 Binary files a/data/sprites/official/jasp.1.zspr and /dev/null differ diff --git a/data/sprites/official/jogurt.1.zspr b/data/sprites/official/jogurt.1.zspr deleted file mode 100644 index b229060c..00000000 Binary files a/data/sprites/official/jogurt.1.zspr and /dev/null differ diff --git a/data/sprites/official/katsura.1.zspr b/data/sprites/official/katsura.1.zspr deleted file mode 100644 index 422a0faf..00000000 Binary files a/data/sprites/official/katsura.1.zspr and /dev/null differ diff --git a/data/sprites/official/kecleon.1.zspr b/data/sprites/official/kecleon.1.zspr deleted file mode 100644 index 5e1786ba..00000000 Binary files a/data/sprites/official/kecleon.1.zspr and /dev/null differ diff --git a/data/sprites/official/kenny_mccormick.1.zspr b/data/sprites/official/kenny_mccormick.1.zspr deleted file mode 100644 index c66a74a5..00000000 Binary files a/data/sprites/official/kenny_mccormick.1.zspr and /dev/null differ diff --git a/data/sprites/official/ketchup.1.zspr b/data/sprites/official/ketchup.1.zspr deleted file mode 100644 index 9dbb326c..00000000 Binary files a/data/sprites/official/ketchup.1.zspr and /dev/null differ diff --git a/data/sprites/official/kholdstare.1.zspr b/data/sprites/official/kholdstare.1.zspr deleted file mode 100644 index 393a491d..00000000 Binary files a/data/sprites/official/kholdstare.1.zspr and /dev/null differ diff --git a/data/sprites/official/king_gothalion.1.zspr b/data/sprites/official/king_gothalion.1.zspr deleted file mode 100644 index 65c73f04..00000000 Binary files a/data/sprites/official/king_gothalion.1.zspr and /dev/null differ diff --git a/data/sprites/official/king_graham.1.zspr b/data/sprites/official/king_graham.1.zspr deleted file mode 100644 index 28b75cf1..00000000 Binary files a/data/sprites/official/king_graham.1.zspr and /dev/null differ diff --git a/data/sprites/official/kirby-meta.1.zspr b/data/sprites/official/kirby-meta.1.zspr deleted file mode 100644 index 9cb132b3..00000000 Binary files a/data/sprites/official/kirby-meta.1.zspr and /dev/null differ diff --git a/data/sprites/official/kore8.1.zspr b/data/sprites/official/kore8.1.zspr deleted file mode 100644 index a1db104a..00000000 Binary files a/data/sprites/official/kore8.1.zspr and /dev/null differ diff --git a/data/sprites/official/korok.1.zspr b/data/sprites/official/korok.1.zspr deleted file mode 100644 index 3045b95b..00000000 Binary files a/data/sprites/official/korok.1.zspr and /dev/null differ diff --git a/data/sprites/official/lakitu.1.zspr b/data/sprites/official/lakitu.1.zspr deleted file mode 100644 index 24d0f12e..00000000 Binary files a/data/sprites/official/lakitu.1.zspr and /dev/null differ diff --git a/data/sprites/official/lapras.1.zspr b/data/sprites/official/lapras.1.zspr deleted file mode 100644 index bcec01b2..00000000 Binary files a/data/sprites/official/lapras.1.zspr and /dev/null differ diff --git a/data/sprites/official/lest.1.zspr b/data/sprites/official/lest.1.zspr deleted file mode 100644 index 99764924..00000000 Binary files a/data/sprites/official/lest.1.zspr and /dev/null differ diff --git a/data/sprites/official/lily.1.zspr b/data/sprites/official/lily.1.zspr deleted file mode 100644 index 5cb5d2aa..00000000 Binary files a/data/sprites/official/lily.1.zspr and /dev/null differ diff --git a/data/sprites/official/linja.1.zspr b/data/sprites/official/linja.1.zspr deleted file mode 100644 index 414efaf7..00000000 Binary files a/data/sprites/official/linja.1.zspr and /dev/null differ diff --git a/data/sprites/official/link-redrawn.1.zspr b/data/sprites/official/link-redrawn.1.zspr deleted file mode 100644 index 1cbb7501..00000000 Binary files a/data/sprites/official/link-redrawn.1.zspr and /dev/null differ diff --git a/data/sprites/official/linkhatcolor.1.zspr b/data/sprites/official/linkhatcolor.1.zspr deleted file mode 100644 index af53898d..00000000 Binary files a/data/sprites/official/linkhatcolor.1.zspr and /dev/null differ diff --git a/data/sprites/official/linktuniccolor.1.zspr b/data/sprites/official/linktuniccolor.1.zspr deleted file mode 100644 index 305a9f8f..00000000 Binary files a/data/sprites/official/linktuniccolor.1.zspr and /dev/null differ diff --git a/data/sprites/official/little-hylian.1.zspr b/data/sprites/official/little-hylian.1.zspr deleted file mode 100644 index fbee749c..00000000 Binary files a/data/sprites/official/little-hylian.1.zspr and /dev/null differ diff --git a/data/sprites/official/littlepony.1.zspr b/data/sprites/official/littlepony.1.zspr deleted file mode 100644 index 0ed4b1b1..00000000 Binary files a/data/sprites/official/littlepony.1.zspr and /dev/null differ diff --git a/data/sprites/official/locke.1.zspr b/data/sprites/official/locke.1.zspr deleted file mode 100644 index c2273791..00000000 Binary files a/data/sprites/official/locke.1.zspr and /dev/null differ diff --git a/data/sprites/official/locke_merchant.1.zspr b/data/sprites/official/locke_merchant.1.zspr deleted file mode 100644 index bfd87c7d..00000000 Binary files a/data/sprites/official/locke_merchant.1.zspr and /dev/null differ diff --git a/data/sprites/official/lucario.1.zspr b/data/sprites/official/lucario.1.zspr deleted file mode 100644 index 44ce395e..00000000 Binary files a/data/sprites/official/lucario.1.zspr and /dev/null differ diff --git a/data/sprites/official/luffy.1.zspr b/data/sprites/official/luffy.1.zspr deleted file mode 100644 index 0661577b..00000000 Binary files a/data/sprites/official/luffy.1.zspr and /dev/null differ diff --git a/data/sprites/official/luigi.1.zspr b/data/sprites/official/luigi.1.zspr deleted file mode 100644 index 1a1dc552..00000000 Binary files a/data/sprites/official/luigi.1.zspr and /dev/null differ diff --git a/data/sprites/official/luna-maindo.1.zspr b/data/sprites/official/luna-maindo.1.zspr deleted file mode 100644 index 5a8acdbf..00000000 Binary files a/data/sprites/official/luna-maindo.1.zspr and /dev/null differ diff --git a/data/sprites/official/madeline.1.zspr b/data/sprites/official/madeline.1.zspr deleted file mode 100644 index 8256e6a3..00000000 Binary files a/data/sprites/official/madeline.1.zspr and /dev/null differ diff --git a/data/sprites/official/magus.1.zspr b/data/sprites/official/magus.1.zspr deleted file mode 100644 index 171980ef..00000000 Binary files a/data/sprites/official/magus.1.zspr and /dev/null differ diff --git a/data/sprites/official/maiden.1.zspr b/data/sprites/official/maiden.1.zspr deleted file mode 100644 index e0297901..00000000 Binary files a/data/sprites/official/maiden.1.zspr and /dev/null differ diff --git a/data/sprites/official/mallow-cat.1.zspr b/data/sprites/official/mallow-cat.1.zspr deleted file mode 100644 index 395684b2..00000000 Binary files a/data/sprites/official/mallow-cat.1.zspr and /dev/null differ diff --git a/data/sprites/official/mangalink.1.zspr b/data/sprites/official/mangalink.1.zspr deleted file mode 100644 index adb57b99..00000000 Binary files a/data/sprites/official/mangalink.1.zspr and /dev/null differ diff --git a/data/sprites/official/maplequeen.2.zspr b/data/sprites/official/maplequeen.2.zspr deleted file mode 100644 index 35b7deec..00000000 Binary files a/data/sprites/official/maplequeen.2.zspr and /dev/null differ diff --git a/data/sprites/official/marin.2.zspr b/data/sprites/official/marin.2.zspr deleted file mode 100644 index 72a06ecf..00000000 Binary files a/data/sprites/official/marin.2.zspr and /dev/null differ diff --git a/data/sprites/official/mario-classic.2.zspr b/data/sprites/official/mario-classic.2.zspr deleted file mode 100644 index 6443e327..00000000 Binary files a/data/sprites/official/mario-classic.2.zspr and /dev/null differ diff --git a/data/sprites/official/mario_tanooki.1.zspr b/data/sprites/official/mario_tanooki.1.zspr deleted file mode 100644 index 255350dd..00000000 Binary files a/data/sprites/official/mario_tanooki.1.zspr and /dev/null differ diff --git a/data/sprites/official/mariocappy.1.zspr b/data/sprites/official/mariocappy.1.zspr deleted file mode 100644 index b888396d..00000000 Binary files a/data/sprites/official/mariocappy.1.zspr and /dev/null differ diff --git a/data/sprites/official/marisa.1.zspr b/data/sprites/official/marisa.1.zspr deleted file mode 100644 index 16b2a803..00000000 Binary files a/data/sprites/official/marisa.1.zspr and /dev/null differ diff --git a/data/sprites/official/matthias.1.zspr b/data/sprites/official/matthias.1.zspr deleted file mode 100644 index 062dae6d..00000000 Binary files a/data/sprites/official/matthias.1.zspr and /dev/null differ diff --git a/data/sprites/official/meatwad.1.zspr b/data/sprites/official/meatwad.1.zspr deleted file mode 100644 index a09a4adf..00000000 Binary files a/data/sprites/official/meatwad.1.zspr and /dev/null differ diff --git a/data/sprites/official/medallions.1.zspr b/data/sprites/official/medallions.1.zspr deleted file mode 100644 index dc4b04d1..00000000 Binary files a/data/sprites/official/medallions.1.zspr and /dev/null differ diff --git a/data/sprites/official/medli.1.zspr b/data/sprites/official/medli.1.zspr deleted file mode 100644 index 59284a36..00000000 Binary files a/data/sprites/official/medli.1.zspr and /dev/null differ diff --git a/data/sprites/official/megaman-x.2.zspr b/data/sprites/official/megaman-x.2.zspr deleted file mode 100644 index ffe75595..00000000 Binary files a/data/sprites/official/megaman-x.2.zspr and /dev/null differ diff --git a/data/sprites/official/metroid.1.zspr b/data/sprites/official/metroid.1.zspr deleted file mode 100644 index d81187cb..00000000 Binary files a/data/sprites/official/metroid.1.zspr and /dev/null differ diff --git a/data/sprites/official/mew.1.zspr b/data/sprites/official/mew.1.zspr deleted file mode 100644 index a06dc8d6..00000000 Binary files a/data/sprites/official/mew.1.zspr and /dev/null differ diff --git a/data/sprites/official/mike-jones.2.zspr b/data/sprites/official/mike-jones.2.zspr deleted file mode 100644 index 550fb213..00000000 Binary files a/data/sprites/official/mike-jones.2.zspr and /dev/null differ diff --git a/data/sprites/official/minish_link.1.zspr b/data/sprites/official/minish_link.1.zspr deleted file mode 100644 index 4b342c1a..00000000 Binary files a/data/sprites/official/minish_link.1.zspr and /dev/null differ diff --git a/data/sprites/official/minishcaplink.2.zspr b/data/sprites/official/minishcaplink.2.zspr deleted file mode 100644 index aaca256b..00000000 Binary files a/data/sprites/official/minishcaplink.2.zspr and /dev/null differ diff --git a/data/sprites/official/missingno.1.zspr b/data/sprites/official/missingno.1.zspr deleted file mode 100644 index 68e61b9b..00000000 Binary files a/data/sprites/official/missingno.1.zspr and /dev/null differ diff --git a/data/sprites/official/moblin.1.zspr b/data/sprites/official/moblin.1.zspr deleted file mode 100644 index 3e425e12..00000000 Binary files a/data/sprites/official/moblin.1.zspr and /dev/null differ diff --git a/data/sprites/official/modernlink.1.zspr b/data/sprites/official/modernlink.1.zspr deleted file mode 100644 index 6d5e68a4..00000000 Binary files a/data/sprites/official/modernlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/mog.2.zspr b/data/sprites/official/mog.2.zspr deleted file mode 100644 index a6ed2225..00000000 Binary files a/data/sprites/official/mog.2.zspr and /dev/null differ diff --git a/data/sprites/official/momiji.1.zspr b/data/sprites/official/momiji.1.zspr deleted file mode 100644 index 86a18586..00000000 Binary files a/data/sprites/official/momiji.1.zspr and /dev/null differ diff --git a/data/sprites/official/moosh.1.zspr b/data/sprites/official/moosh.1.zspr deleted file mode 100644 index 0a1e167a..00000000 Binary files a/data/sprites/official/moosh.1.zspr and /dev/null differ diff --git a/data/sprites/official/mouse.1.zspr b/data/sprites/official/mouse.1.zspr deleted file mode 100644 index 16ba884d..00000000 Binary files a/data/sprites/official/mouse.1.zspr and /dev/null differ diff --git a/data/sprites/official/ms-paintdog.1.zspr b/data/sprites/official/ms-paintdog.1.zspr deleted file mode 100644 index 75f5f541..00000000 Binary files a/data/sprites/official/ms-paintdog.1.zspr and /dev/null differ diff --git a/data/sprites/official/mushy.1.zspr b/data/sprites/official/mushy.1.zspr deleted file mode 100644 index a6c924a5..00000000 Binary files a/data/sprites/official/mushy.1.zspr and /dev/null differ diff --git a/data/sprites/official/naturelink.1.zspr b/data/sprites/official/naturelink.1.zspr deleted file mode 100644 index bdfd0efb..00000000 Binary files a/data/sprites/official/naturelink.1.zspr and /dev/null differ diff --git a/data/sprites/official/navi.1.zspr b/data/sprites/official/navi.1.zspr deleted file mode 100644 index 4621bf4a..00000000 Binary files a/data/sprites/official/navi.1.zspr and /dev/null differ diff --git a/data/sprites/official/navirou.2.zspr b/data/sprites/official/navirou.2.zspr deleted file mode 100644 index ea9d95a4..00000000 Binary files a/data/sprites/official/navirou.2.zspr and /dev/null differ diff --git a/data/sprites/official/ned-flanders.1.zspr b/data/sprites/official/ned-flanders.1.zspr deleted file mode 100644 index 78ed5bc4..00000000 Binary files a/data/sprites/official/ned-flanders.1.zspr and /dev/null differ diff --git a/data/sprites/official/negativelink.1.zspr b/data/sprites/official/negativelink.1.zspr deleted file mode 100644 index a3dd1566..00000000 Binary files a/data/sprites/official/negativelink.1.zspr and /dev/null differ diff --git a/data/sprites/official/neosad.1.zspr b/data/sprites/official/neosad.1.zspr deleted file mode 100644 index 7e95d7f7..00000000 Binary files a/data/sprites/official/neosad.1.zspr and /dev/null differ diff --git a/data/sprites/official/neslink.1.zspr b/data/sprites/official/neslink.1.zspr deleted file mode 100644 index 805b3162..00000000 Binary files a/data/sprites/official/neslink.1.zspr and /dev/null differ diff --git a/data/sprites/official/ness.1.zspr b/data/sprites/official/ness.1.zspr deleted file mode 100644 index b8b3de81..00000000 Binary files a/data/sprites/official/ness.1.zspr and /dev/null differ diff --git a/data/sprites/official/nia.1.zspr b/data/sprites/official/nia.1.zspr deleted file mode 100644 index 5d01ba4b..00000000 Binary files a/data/sprites/official/nia.1.zspr and /dev/null differ diff --git a/data/sprites/official/niddraig.1.zspr b/data/sprites/official/niddraig.1.zspr deleted file mode 100644 index d02794bc..00000000 Binary files a/data/sprites/official/niddraig.1.zspr and /dev/null differ diff --git a/data/sprites/official/niko.1.zspr b/data/sprites/official/niko.1.zspr deleted file mode 100644 index 5d39e6bb..00000000 Binary files a/data/sprites/official/niko.1.zspr and /dev/null differ diff --git a/data/sprites/official/oldman.2.zspr b/data/sprites/official/oldman.2.zspr deleted file mode 100644 index 1d47cdac..00000000 Binary files a/data/sprites/official/oldman.2.zspr and /dev/null differ diff --git a/data/sprites/official/ori.2.zspr b/data/sprites/official/ori.2.zspr deleted file mode 100644 index 10c1e462..00000000 Binary files a/data/sprites/official/ori.2.zspr and /dev/null differ diff --git a/data/sprites/official/outlinelink.1.zspr b/data/sprites/official/outlinelink.1.zspr deleted file mode 100644 index 50ae98bc..00000000 Binary files a/data/sprites/official/outlinelink.1.zspr and /dev/null differ diff --git a/data/sprites/official/parallelworldslink.1.zspr b/data/sprites/official/parallelworldslink.1.zspr deleted file mode 100644 index 71a9bdc1..00000000 Binary files a/data/sprites/official/parallelworldslink.1.zspr and /dev/null differ diff --git a/data/sprites/official/paula.1.zspr b/data/sprites/official/paula.1.zspr deleted file mode 100644 index 657752ea..00000000 Binary files a/data/sprites/official/paula.1.zspr and /dev/null differ diff --git a/data/sprites/official/peach.1.zspr b/data/sprites/official/peach.1.zspr deleted file mode 100644 index 7973f952..00000000 Binary files a/data/sprites/official/peach.1.zspr and /dev/null differ diff --git a/data/sprites/official/penguinlink.1.zspr b/data/sprites/official/penguinlink.1.zspr deleted file mode 100644 index 2fe01e49..00000000 Binary files a/data/sprites/official/penguinlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/pete.1.zspr b/data/sprites/official/pete.1.zspr deleted file mode 100644 index a3135615..00000000 Binary files a/data/sprites/official/pete.1.zspr and /dev/null differ diff --git a/data/sprites/official/phoenix-wright.1.zspr b/data/sprites/official/phoenix-wright.1.zspr deleted file mode 100644 index d7cb0be2..00000000 Binary files a/data/sprites/official/phoenix-wright.1.zspr and /dev/null differ diff --git a/data/sprites/official/pikachu.1.zspr b/data/sprites/official/pikachu.1.zspr deleted file mode 100644 index 0b8a88c4..00000000 Binary files a/data/sprites/official/pikachu.1.zspr and /dev/null differ diff --git a/data/sprites/official/pinkribbonlink.2.zspr b/data/sprites/official/pinkribbonlink.2.zspr deleted file mode 100644 index ba516f18..00000000 Binary files a/data/sprites/official/pinkribbonlink.2.zspr and /dev/null differ diff --git a/data/sprites/official/piranha_plant.1.zspr b/data/sprites/official/piranha_plant.1.zspr deleted file mode 100644 index 59bf4d0d..00000000 Binary files a/data/sprites/official/piranha_plant.1.zspr and /dev/null differ diff --git a/data/sprites/official/plagueknight.1.zspr b/data/sprites/official/plagueknight.1.zspr deleted file mode 100644 index 258bed7b..00000000 Binary files a/data/sprites/official/plagueknight.1.zspr and /dev/null differ diff --git a/data/sprites/official/pokey.1.zspr b/data/sprites/official/pokey.1.zspr deleted file mode 100644 index 4de17faf..00000000 Binary files a/data/sprites/official/pokey.1.zspr and /dev/null differ diff --git a/data/sprites/official/popoi.1.zspr b/data/sprites/official/popoi.1.zspr deleted file mode 100644 index 663d4dc1..00000000 Binary files a/data/sprites/official/popoi.1.zspr and /dev/null differ diff --git a/data/sprites/official/poppy.1.zspr b/data/sprites/official/poppy.1.zspr deleted file mode 100644 index 80d4ca69..00000000 Binary files a/data/sprites/official/poppy.1.zspr and /dev/null differ diff --git a/data/sprites/official/porg_knight.1.zspr b/data/sprites/official/porg_knight.1.zspr deleted file mode 100644 index 4d6f9635..00000000 Binary files a/data/sprites/official/porg_knight.1.zspr and /dev/null differ diff --git a/data/sprites/official/powerpuff_girl.1.zspr b/data/sprites/official/powerpuff_girl.1.zspr deleted file mode 100644 index fbf3c694..00000000 Binary files a/data/sprites/official/powerpuff_girl.1.zspr and /dev/null differ diff --git a/data/sprites/official/pridelink.2.zspr b/data/sprites/official/pridelink.2.zspr deleted file mode 100644 index 66231013..00000000 Binary files a/data/sprites/official/pridelink.2.zspr and /dev/null differ diff --git a/data/sprites/official/primm.1.zspr b/data/sprites/official/primm.1.zspr deleted file mode 100644 index e9ff2d05..00000000 Binary files a/data/sprites/official/primm.1.zspr and /dev/null differ diff --git a/data/sprites/official/princess_bubblegum.1.zspr b/data/sprites/official/princess_bubblegum.1.zspr deleted file mode 100644 index c46dcc0f..00000000 Binary files a/data/sprites/official/princess_bubblegum.1.zspr and /dev/null differ diff --git a/data/sprites/official/psyduck.2.zspr b/data/sprites/official/psyduck.2.zspr deleted file mode 100644 index c9e17117..00000000 Binary files a/data/sprites/official/psyduck.2.zspr and /dev/null differ diff --git a/data/sprites/official/pug.1.zspr b/data/sprites/official/pug.1.zspr deleted file mode 100644 index 60692711..00000000 Binary files a/data/sprites/official/pug.1.zspr and /dev/null differ diff --git a/data/sprites/official/purplechest-bottle.1.zspr b/data/sprites/official/purplechest-bottle.1.zspr deleted file mode 100644 index 8daed4d6..00000000 Binary files a/data/sprites/official/purplechest-bottle.1.zspr and /dev/null differ diff --git a/data/sprites/official/pyro.1.zspr b/data/sprites/official/pyro.1.zspr deleted file mode 100644 index 9037c8e4..00000000 Binary files a/data/sprites/official/pyro.1.zspr and /dev/null differ diff --git a/data/sprites/official/rainbowlink.1.zspr b/data/sprites/official/rainbowlink.1.zspr deleted file mode 100644 index bc8443f9..00000000 Binary files a/data/sprites/official/rainbowlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/rat.1.zspr b/data/sprites/official/rat.1.zspr deleted file mode 100644 index b4574c06..00000000 Binary files a/data/sprites/official/rat.1.zspr and /dev/null differ diff --git a/data/sprites/official/red-mage.1.zspr b/data/sprites/official/red-mage.1.zspr deleted file mode 100644 index 803a5b6f..00000000 Binary files a/data/sprites/official/red-mage.1.zspr and /dev/null differ diff --git a/data/sprites/official/remeer.1.zspr b/data/sprites/official/remeer.1.zspr deleted file mode 100644 index 8d7f245a..00000000 Binary files a/data/sprites/official/remeer.1.zspr and /dev/null differ diff --git a/data/sprites/official/rick.1.zspr b/data/sprites/official/rick.1.zspr deleted file mode 100644 index 93a163f6..00000000 Binary files a/data/sprites/official/rick.1.zspr and /dev/null differ diff --git a/data/sprites/official/robotlink.1.zspr b/data/sprites/official/robotlink.1.zspr deleted file mode 100644 index 8a1eed43..00000000 Binary files a/data/sprites/official/robotlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/rocko.1.zspr b/data/sprites/official/rocko.1.zspr deleted file mode 100644 index ab34f635..00000000 Binary files a/data/sprites/official/rocko.1.zspr and /dev/null differ diff --git a/data/sprites/official/rottytops.1.zspr b/data/sprites/official/rottytops.1.zspr deleted file mode 100644 index d4007ffb..00000000 Binary files a/data/sprites/official/rottytops.1.zspr and /dev/null differ diff --git a/data/sprites/official/rover.1.zspr b/data/sprites/official/rover.1.zspr deleted file mode 100644 index 8b9e9edd..00000000 Binary files a/data/sprites/official/rover.1.zspr and /dev/null differ diff --git a/data/sprites/official/roykoopa.1.zspr b/data/sprites/official/roykoopa.1.zspr deleted file mode 100644 index e1f9699f..00000000 Binary files a/data/sprites/official/roykoopa.1.zspr and /dev/null differ diff --git a/data/sprites/official/rumia.1.zspr b/data/sprites/official/rumia.1.zspr deleted file mode 100644 index dc037ae2..00000000 Binary files a/data/sprites/official/rumia.1.zspr and /dev/null differ diff --git a/data/sprites/official/rydia.1.zspr b/data/sprites/official/rydia.1.zspr deleted file mode 100644 index ff98ab56..00000000 Binary files a/data/sprites/official/rydia.1.zspr and /dev/null differ diff --git a/data/sprites/official/ryu.1.zspr b/data/sprites/official/ryu.1.zspr deleted file mode 100644 index 5c6d5411..00000000 Binary files a/data/sprites/official/ryu.1.zspr and /dev/null differ diff --git a/data/sprites/official/sailormoon.1.zspr b/data/sprites/official/sailormoon.1.zspr deleted file mode 100644 index 1120d3f4..00000000 Binary files a/data/sprites/official/sailormoon.1.zspr and /dev/null differ diff --git a/data/sprites/official/saitama.1.zspr b/data/sprites/official/saitama.1.zspr deleted file mode 100644 index acd9170d..00000000 Binary files a/data/sprites/official/saitama.1.zspr and /dev/null differ diff --git a/data/sprites/official/samus-sm.1.zspr b/data/sprites/official/samus-sm.1.zspr deleted file mode 100644 index c8fde01b..00000000 Binary files a/data/sprites/official/samus-sm.1.zspr and /dev/null differ diff --git a/data/sprites/official/samus.2.zspr b/data/sprites/official/samus.2.zspr deleted file mode 100644 index 81b0912f..00000000 Binary files a/data/sprites/official/samus.2.zspr and /dev/null differ diff --git a/data/sprites/official/samus_classic.1.zspr b/data/sprites/official/samus_classic.1.zspr deleted file mode 100644 index 6559e25c..00000000 Binary files a/data/sprites/official/samus_classic.1.zspr and /dev/null differ diff --git a/data/sprites/official/santalink.2.zspr b/data/sprites/official/santalink.2.zspr deleted file mode 100644 index 0e78fedb..00000000 Binary files a/data/sprites/official/santalink.2.zspr and /dev/null differ diff --git a/data/sprites/official/scholar.1.zspr b/data/sprites/official/scholar.1.zspr deleted file mode 100644 index bf697f16..00000000 Binary files a/data/sprites/official/scholar.1.zspr and /dev/null differ diff --git a/data/sprites/official/selan.1.zspr b/data/sprites/official/selan.1.zspr deleted file mode 100644 index eb3b0318..00000000 Binary files a/data/sprites/official/selan.1.zspr and /dev/null differ diff --git a/data/sprites/official/sevens1ns.1.zspr b/data/sprites/official/sevens1ns.1.zspr deleted file mode 100644 index d59a1b52..00000000 Binary files a/data/sprites/official/sevens1ns.1.zspr and /dev/null differ diff --git a/data/sprites/official/shadow.1.zspr b/data/sprites/official/shadow.1.zspr deleted file mode 100644 index fcd0d49b..00000000 Binary files a/data/sprites/official/shadow.1.zspr and /dev/null differ diff --git a/data/sprites/official/shadowsaku.2.zspr b/data/sprites/official/shadowsaku.2.zspr deleted file mode 100644 index 8972f9f2..00000000 Binary files a/data/sprites/official/shadowsaku.2.zspr and /dev/null differ diff --git a/data/sprites/official/shantae.1.zspr b/data/sprites/official/shantae.1.zspr deleted file mode 100644 index 03a1c7b9..00000000 Binary files a/data/sprites/official/shantae.1.zspr and /dev/null differ diff --git a/data/sprites/official/shuppet.1.zspr b/data/sprites/official/shuppet.1.zspr deleted file mode 100644 index 55a51ae9..00000000 Binary files a/data/sprites/official/shuppet.1.zspr and /dev/null differ diff --git a/data/sprites/official/shy-gal.1.zspr b/data/sprites/official/shy-gal.1.zspr deleted file mode 100644 index b86b27bc..00000000 Binary files a/data/sprites/official/shy-gal.1.zspr and /dev/null differ diff --git a/data/sprites/official/shy-guy.1.zspr b/data/sprites/official/shy-guy.1.zspr deleted file mode 100644 index 43ee0fe4..00000000 Binary files a/data/sprites/official/shy-guy.1.zspr and /dev/null differ diff --git a/data/sprites/official/sighn_waive.1.zspr b/data/sprites/official/sighn_waive.1.zspr deleted file mode 100644 index d961dc4d..00000000 Binary files a/data/sprites/official/sighn_waive.1.zspr and /dev/null differ diff --git a/data/sprites/official/slime.1.zspr b/data/sprites/official/slime.1.zspr deleted file mode 100644 index 711e459f..00000000 Binary files a/data/sprites/official/slime.1.zspr and /dev/null differ diff --git a/data/sprites/official/slowpoke.1.zspr b/data/sprites/official/slowpoke.1.zspr deleted file mode 100644 index d1b40e23..00000000 Binary files a/data/sprites/official/slowpoke.1.zspr and /dev/null differ diff --git a/data/sprites/official/snes-controller.1.zspr b/data/sprites/official/snes-controller.1.zspr deleted file mode 100644 index 5dd70f39..00000000 Binary files a/data/sprites/official/snes-controller.1.zspr and /dev/null differ diff --git a/data/sprites/official/sodacan.1.zspr b/data/sprites/official/sodacan.1.zspr deleted file mode 100644 index 93e6fb1e..00000000 Binary files a/data/sprites/official/sodacan.1.zspr and /dev/null differ diff --git a/data/sprites/official/solaire.1.zspr b/data/sprites/official/solaire.1.zspr deleted file mode 100644 index e216a7d9..00000000 Binary files a/data/sprites/official/solaire.1.zspr and /dev/null differ diff --git a/data/sprites/official/soldiersprite.1.zspr b/data/sprites/official/soldiersprite.1.zspr deleted file mode 100644 index d5e8ee35..00000000 Binary files a/data/sprites/official/soldiersprite.1.zspr and /dev/null differ diff --git a/data/sprites/official/sonic.1.zspr b/data/sprites/official/sonic.1.zspr deleted file mode 100644 index 55724219..00000000 Binary files a/data/sprites/official/sonic.1.zspr and /dev/null differ diff --git a/data/sprites/official/sora.1.zspr b/data/sprites/official/sora.1.zspr deleted file mode 100644 index c8d656fd..00000000 Binary files a/data/sprites/official/sora.1.zspr and /dev/null differ diff --git a/data/sprites/official/sora_kh1.1.zspr b/data/sprites/official/sora_kh1.1.zspr deleted file mode 100644 index e77c922d..00000000 Binary files a/data/sprites/official/sora_kh1.1.zspr and /dev/null differ diff --git a/data/sprites/official/spongebob.1.zspr b/data/sprites/official/spongebob.1.zspr deleted file mode 100644 index 714f6983..00000000 Binary files a/data/sprites/official/spongebob.1.zspr and /dev/null differ diff --git a/data/sprites/official/squall.1.zspr b/data/sprites/official/squall.1.zspr deleted file mode 100644 index b9cd9556..00000000 Binary files a/data/sprites/official/squall.1.zspr and /dev/null differ diff --git a/data/sprites/official/squirrel.1.zspr b/data/sprites/official/squirrel.1.zspr deleted file mode 100644 index 64e399a1..00000000 Binary files a/data/sprites/official/squirrel.1.zspr and /dev/null differ diff --git a/data/sprites/official/squirtle.1.zspr b/data/sprites/official/squirtle.1.zspr deleted file mode 100644 index 274bf1c7..00000000 Binary files a/data/sprites/official/squirtle.1.zspr and /dev/null differ diff --git a/data/sprites/official/stalfos.1.zspr b/data/sprites/official/stalfos.1.zspr deleted file mode 100644 index d4787a3b..00000000 Binary files a/data/sprites/official/stalfos.1.zspr and /dev/null differ diff --git a/data/sprites/official/stan.1.zspr b/data/sprites/official/stan.1.zspr deleted file mode 100644 index 5fd3eb11..00000000 Binary files a/data/sprites/official/stan.1.zspr and /dev/null differ diff --git a/data/sprites/official/staticlink.1.zspr b/data/sprites/official/staticlink.1.zspr deleted file mode 100644 index d0f1bc06..00000000 Binary files a/data/sprites/official/staticlink.1.zspr and /dev/null differ diff --git a/data/sprites/official/steamedhams.1.zspr b/data/sprites/official/steamedhams.1.zspr deleted file mode 100644 index bcae82fb..00000000 Binary files a/data/sprites/official/steamedhams.1.zspr and /dev/null differ diff --git a/data/sprites/official/superbomb.1.zspr b/data/sprites/official/superbomb.1.zspr deleted file mode 100644 index 1ed38ae3..00000000 Binary files a/data/sprites/official/superbomb.1.zspr and /dev/null differ diff --git a/data/sprites/official/superbunny.2.zspr b/data/sprites/official/superbunny.2.zspr deleted file mode 100644 index b842d1c3..00000000 Binary files a/data/sprites/official/superbunny.2.zspr and /dev/null differ diff --git a/data/sprites/official/supermeatboy.1.zspr b/data/sprites/official/supermeatboy.1.zspr deleted file mode 100644 index ad4368bb..00000000 Binary files a/data/sprites/official/supermeatboy.1.zspr and /dev/null differ diff --git a/data/sprites/official/susie.1.zspr b/data/sprites/official/susie.1.zspr deleted file mode 100644 index c1127b87..00000000 Binary files a/data/sprites/official/susie.1.zspr and /dev/null differ diff --git a/data/sprites/official/swatchy.1.zspr b/data/sprites/official/swatchy.1.zspr deleted file mode 100644 index 46795e9b..00000000 Binary files a/data/sprites/official/swatchy.1.zspr and /dev/null differ diff --git a/data/sprites/official/tasbot.1.zspr b/data/sprites/official/tasbot.1.zspr deleted file mode 100644 index b7278587..00000000 Binary files a/data/sprites/official/tasbot.1.zspr and /dev/null differ diff --git a/data/sprites/official/teatime.1.zspr b/data/sprites/official/teatime.1.zspr deleted file mode 100644 index 8953bc79..00000000 Binary files a/data/sprites/official/teatime.1.zspr and /dev/null differ diff --git a/data/sprites/official/terra.1.zspr b/data/sprites/official/terra.1.zspr deleted file mode 100644 index e24ca87a..00000000 Binary files a/data/sprites/official/terra.1.zspr and /dev/null differ diff --git a/data/sprites/official/tetra.1.zspr b/data/sprites/official/tetra.1.zspr deleted file mode 100644 index 77525f08..00000000 Binary files a/data/sprites/official/tetra.1.zspr and /dev/null differ diff --git a/data/sprites/official/tgh.1.zspr b/data/sprites/official/tgh.1.zspr deleted file mode 100644 index 929b8705..00000000 Binary files a/data/sprites/official/tgh.1.zspr and /dev/null differ diff --git a/data/sprites/official/thief.1.zspr b/data/sprites/official/thief.1.zspr deleted file mode 100644 index b6b0ffef..00000000 Binary files a/data/sprites/official/thief.1.zspr and /dev/null differ diff --git a/data/sprites/official/thomcrow.1.zspr b/data/sprites/official/thomcrow.1.zspr deleted file mode 100644 index 81bba95d..00000000 Binary files a/data/sprites/official/thomcrow.1.zspr and /dev/null differ diff --git a/data/sprites/official/tile.2.zspr b/data/sprites/official/tile.2.zspr deleted file mode 100644 index 38332bb0..00000000 Binary files a/data/sprites/official/tile.2.zspr and /dev/null differ diff --git a/data/sprites/official/tingle.1.zspr b/data/sprites/official/tingle.1.zspr deleted file mode 100644 index 9a53f8d2..00000000 Binary files a/data/sprites/official/tingle.1.zspr and /dev/null differ diff --git a/data/sprites/official/tmnt.1.zspr b/data/sprites/official/tmnt.1.zspr deleted file mode 100644 index 8f01c1db..00000000 Binary files a/data/sprites/official/tmnt.1.zspr and /dev/null differ diff --git a/data/sprites/official/toad.2.zspr b/data/sprites/official/toad.2.zspr deleted file mode 100644 index 6abca2d7..00000000 Binary files a/data/sprites/official/toad.2.zspr and /dev/null differ diff --git a/data/sprites/official/toadette.2.zspr b/data/sprites/official/toadette.2.zspr deleted file mode 100644 index 8c6498b2..00000000 Binary files a/data/sprites/official/toadette.2.zspr and /dev/null differ diff --git a/data/sprites/official/toadette_captain.1.zspr b/data/sprites/official/toadette_captain.1.zspr deleted file mode 100644 index e69f74a7..00000000 Binary files a/data/sprites/official/toadette_captain.1.zspr and /dev/null differ diff --git a/data/sprites/official/totem-links.1.zspr b/data/sprites/official/totem-links.1.zspr deleted file mode 100644 index e4ac6abc..00000000 Binary files a/data/sprites/official/totem-links.1.zspr and /dev/null differ diff --git a/data/sprites/official/trogdor.1.zspr b/data/sprites/official/trogdor.1.zspr deleted file mode 100644 index b37191ac..00000000 Binary files a/data/sprites/official/trogdor.1.zspr and /dev/null differ diff --git a/data/sprites/official/twilightprincesszelda.2.zspr b/data/sprites/official/twilightprincesszelda.2.zspr deleted file mode 100644 index 2487f44a..00000000 Binary files a/data/sprites/official/twilightprincesszelda.2.zspr and /dev/null differ diff --git a/data/sprites/official/two_faced.1.zspr b/data/sprites/official/two_faced.1.zspr deleted file mode 100644 index d504c321..00000000 Binary files a/data/sprites/official/two_faced.1.zspr and /dev/null differ diff --git a/data/sprites/official/ty.1.zspr b/data/sprites/official/ty.1.zspr deleted file mode 100644 index 1091b298..00000000 Binary files a/data/sprites/official/ty.1.zspr and /dev/null differ diff --git a/data/sprites/official/ultros.1.zspr b/data/sprites/official/ultros.1.zspr deleted file mode 100644 index bd312843..00000000 Binary files a/data/sprites/official/ultros.1.zspr and /dev/null differ diff --git a/data/sprites/official/valeera.1.zspr b/data/sprites/official/valeera.1.zspr deleted file mode 100644 index 090a6631..00000000 Binary files a/data/sprites/official/valeera.1.zspr and /dev/null differ diff --git a/data/sprites/official/vanillalink.1.zspr b/data/sprites/official/vanillalink.1.zspr deleted file mode 100644 index 409171fa..00000000 Binary files a/data/sprites/official/vanillalink.1.zspr and /dev/null differ diff --git a/data/sprites/official/vaporeon.1.zspr b/data/sprites/official/vaporeon.1.zspr deleted file mode 100644 index 55372722..00000000 Binary files a/data/sprites/official/vaporeon.1.zspr and /dev/null differ diff --git a/data/sprites/official/vegeta.1.zspr b/data/sprites/official/vegeta.1.zspr deleted file mode 100644 index b4f46019..00000000 Binary files a/data/sprites/official/vegeta.1.zspr and /dev/null differ diff --git a/data/sprites/official/vera.1.zspr b/data/sprites/official/vera.1.zspr deleted file mode 100644 index b8914365..00000000 Binary files a/data/sprites/official/vera.1.zspr and /dev/null differ diff --git a/data/sprites/official/vitreous.1.zspr b/data/sprites/official/vitreous.1.zspr deleted file mode 100644 index 947eff30..00000000 Binary files a/data/sprites/official/vitreous.1.zspr and /dev/null differ diff --git a/data/sprites/official/vivi.1.zspr b/data/sprites/official/vivi.1.zspr deleted file mode 100644 index a7ad1a5f..00000000 Binary files a/data/sprites/official/vivi.1.zspr and /dev/null differ diff --git a/data/sprites/official/vivian.1.zspr b/data/sprites/official/vivian.1.zspr deleted file mode 100644 index 9de1061f..00000000 Binary files a/data/sprites/official/vivian.1.zspr and /dev/null differ diff --git a/data/sprites/official/wario.1.zspr b/data/sprites/official/wario.1.zspr deleted file mode 100644 index f1a5aab7..00000000 Binary files a/data/sprites/official/wario.1.zspr and /dev/null differ diff --git a/data/sprites/official/will.1.zspr b/data/sprites/official/will.1.zspr deleted file mode 100644 index d3794969..00000000 Binary files a/data/sprites/official/will.1.zspr and /dev/null differ diff --git a/data/sprites/official/wizzrobe.2.zspr b/data/sprites/official/wizzrobe.2.zspr deleted file mode 100644 index f79195d2..00000000 Binary files a/data/sprites/official/wizzrobe.2.zspr and /dev/null differ diff --git a/data/sprites/official/wolf_link.1.zspr b/data/sprites/official/wolf_link.1.zspr deleted file mode 100644 index 5ee07dcb..00000000 Binary files a/data/sprites/official/wolf_link.1.zspr and /dev/null differ diff --git a/data/sprites/official/wolf_link_tp.1.zspr b/data/sprites/official/wolf_link_tp.1.zspr deleted file mode 100644 index 9627cd73..00000000 Binary files a/data/sprites/official/wolf_link_tp.1.zspr and /dev/null differ diff --git a/data/sprites/official/yoshi.1.zspr b/data/sprites/official/yoshi.1.zspr deleted file mode 100644 index 189ea390..00000000 Binary files a/data/sprites/official/yoshi.1.zspr and /dev/null differ diff --git a/data/sprites/official/yunica.1.zspr b/data/sprites/official/yunica.1.zspr deleted file mode 100644 index 57f1f416..00000000 Binary files a/data/sprites/official/yunica.1.zspr and /dev/null differ diff --git a/data/sprites/official/zandra.1.zspr b/data/sprites/official/zandra.1.zspr deleted file mode 100644 index d7e5012c..00000000 Binary files a/data/sprites/official/zandra.1.zspr and /dev/null differ diff --git a/data/sprites/official/zebraunicorn.1.zspr b/data/sprites/official/zebraunicorn.1.zspr deleted file mode 100644 index c06130ff..00000000 Binary files a/data/sprites/official/zebraunicorn.1.zspr and /dev/null differ diff --git a/data/sprites/official/zeck.1.zspr b/data/sprites/official/zeck.1.zspr deleted file mode 100644 index 630acd1a..00000000 Binary files a/data/sprites/official/zeck.1.zspr and /dev/null differ diff --git a/data/sprites/official/zelda.1.zspr b/data/sprites/official/zelda.1.zspr deleted file mode 100644 index 26ba1a05..00000000 Binary files a/data/sprites/official/zelda.1.zspr and /dev/null differ diff --git a/data/sprites/official/zerosuitsamus.2.zspr b/data/sprites/official/zerosuitsamus.2.zspr deleted file mode 100644 index 0e5a7d17..00000000 Binary files a/data/sprites/official/zerosuitsamus.2.zspr and /dev/null differ diff --git a/data/sprites/official/zora.2.zspr b/data/sprites/official/zora.2.zspr deleted file mode 100644 index 1ca568e1..00000000 Binary files a/data/sprites/official/zora.2.zspr and /dev/null differ diff --git a/data/sprites/unofficial/.gitignore b/data/sprites/unofficial/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/data/sprites/unofficial/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/data/sprites/unofficial/.gitkeep b/data/sprites/unofficial/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/resources/ci/common/common.py b/resources/ci/common/common.py index 7066fa8d..f2288fe2 100644 --- a/resources/ci/common/common.py +++ b/resources/ci/common/common.py @@ -1,6 +1,22 @@ import os # for env vars import stat # file statistics +global UBUNTU_VERSIONS +global DEFAULT_EVENT +global DEFAULT_REPO_SLUG +global FILENAME_CHECKS +global FILESIZE_CHECK +UBUNTU_VERSIONS = { + "latest": "focal", + "20.04": "focal", + "18.04": "bionic", + "16.04": "xenial" +} +DEFAULT_EVENT = "event" +DEFAULT_REPO_SLUG = "miketrethewey/ALttPDoorRandomizer" +FILENAME_CHECKS = [ "Gui", "DungeonRandomizer" ] +FILESIZE_CHECK = (6 * 1024 * 1024) # 6MB + # take number of bytes and convert to string with units measure def convert_bytes(num): for x in ["bytes","KB","MB","GB","TB","PB"]: @@ -16,9 +32,8 @@ def file_size(file_path): # prepare environment variables def prepare_env(): - DEFAULT_EVENT = "event" - DEFAULT_REPO_SLUG = "miketrethewey/ALttPDoorRandomizer" - + global DEFAULT_EVENT + global DEFAULT_REPO_SLUG env = {} # get app version @@ -33,7 +48,7 @@ def prepare_env(): env["BRANCH"] = os.getenv("TRAVIS_BRANCH","") env["GITHUB_ACTOR"] = os.getenv("GITHUB_ACTOR","MegaMan.EXE") env["GITHUB_SHA"] = os.getenv("GITHUB_SHA","") - env["GITHUB_RUN_ID"] = os.getenv("GITHUB_RUN_ID","") + env["GITHUB_RUN_NUMBER"] = os.getenv("GITHUB_RUN_NUMBER","") env["GITHUB_SHA_SHORT"] = env["GITHUB_SHA"] # commit data env["COMMIT_ID"] = os.getenv("TRAVIS_COMMIT",os.getenv("GITHUB_SHA","")) @@ -57,7 +72,7 @@ def prepare_env(): env["GITHUB_SHA_SHORT"] = env["GITHUB_SHA"][:7] # ci data - env["BUILD_NUMBER"] = os.getenv("TRAVIS_BUILD_NUMBER",env["GITHUB_RUN_ID"]) + env["BUILD_NUMBER"] = os.getenv("TRAVIS_BUILD_NUMBER",env["GITHUB_RUN_NUMBER"]) GITHUB_TAG = os.getenv("TRAVIS_TAG",os.getenv("GITHUB_TAG","")) OS_NAME = os.getenv("TRAVIS_OS_NAME",os.getenv("OS_NAME","")).replace("macOS","osx") @@ -68,10 +83,8 @@ def prepare_env(): OS_VERSION = OS_NAME[OS_NAME.find('-')+1:] OS_NAME = OS_NAME[:OS_NAME.find('-')] if OS_NAME == "linux" or OS_NAME == "ubuntu": - if OS_VERSION == "latest": - OS_VERSION = "bionic" - elif OS_VERSION == "16.04": - OS_VERSION = "xenial" + if OS_VERSION in UBUNTU_VERSIONS: + OS_VERSION = UBUNTU_VERSIONS[OS_VERSION] OS_DIST = OS_VERSION if OS_VERSION == "" and not OS_DIST == "" and not OS_DIST == "notset": @@ -115,8 +128,8 @@ def prepare_filename(BUILD_FILENAME): # find a binary file if it's executable # failing that, assume it's over 6MB def find_binary(listdir): - FILENAME_CHECKS = [ "Gui", "DungeonRandomizer" ] - FILESIZE_CHECK = (6 * 1024 * 1024) # 6MB + global FILENAME_CHECKS + global FILESIZE_CHECK BUILD_FILENAMES = [] executable = stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH diff --git a/resources/ci/common/prepare_binary.py b/resources/ci/common/prepare_binary.py index 583c7d7b..ff9b7c99 100644 --- a/resources/ci/common/prepare_binary.py +++ b/resources/ci/common/prepare_binary.py @@ -32,6 +32,8 @@ for BUILD_FILENAME in BUILD_FILENAMES: print("Dest Filename: " + DEST_FILENAME) if not BUILD_FILENAME == "": print("Build Filesize: " + common.file_size(BUILD_FILENAME)) + else: + exit(1) if not BUILD_FILENAME == "": move( diff --git a/resources/ci/common/prepare_release.py b/resources/ci/common/prepare_release.py index 5e32b410..c3869f2d 100644 --- a/resources/ci/common/prepare_release.py +++ b/resources/ci/common/prepare_release.py @@ -29,6 +29,11 @@ for dirname in ["resources","user","meta","manifests"]: if os.path.isdir(dirpath): os.chmod(dirpath,0o755) +# nuke git files +for git in [ os.path.join(".", ".gitattrubutes"), os.path.join(".", ".gitignore") ]: + if os.path.isfile(git): + os.remove(git) + # nuke travis file if it exists for travis in [ os.path.join(".", ".travis.yml"), os.path.join(".", ".travis.off") ]: if os.path.isfile(travis): @@ -95,7 +100,10 @@ if len(BUILD_FILENAMES) > 0: # .zip if windows # .tar.gz otherwise - ZIP_FILENAME = os.path.join("..","deploy",env["REPO_NAME"]) if len(BUILD_FILENAMES) > 1 else os.path.join("..","deploy",os.path.splitext(BUILD_FILENAME)[0]) + if len(BUILD_FILENAMES) > 1: + ZIP_FILENAME = os.path.join("..","deploy",env["REPO_NAME"]) + else: + ZIP_FILENAME = os.path.join("..","deploy",os.path.splitext(BUILD_FILENAME)[0]) if env["OS_NAME"] == "windows": make_archive(ZIP_FILENAME,"zip") ZIP_FILENAME += ".zip" @@ -125,3 +133,6 @@ else: print("No Zip to prepare: " + ZIP_FILENAME) print("Git tag: " + env["GITHUB_TAG"]) + +if (len(BUILD_FILENAMES) == 0) or (ZIP_FILENAME == ""): + exit(1) diff --git a/DungeonRandomizer.spec b/source/DungeonRandomizer.spec similarity index 85% rename from DungeonRandomizer.spec rename to source/DungeonRandomizer.spec index d7234682..beb2ecfc 100644 --- a/DungeonRandomizer.spec +++ b/source/DungeonRandomizer.spec @@ -3,7 +3,10 @@ import sys block_cipher = None -console = True +console = True # <--- change this to True to enable command prompt when the app runs + +if sys.platform.find("mac") or sys.platform.find("osx"): + console = False BINARY_SLUG = "DungeonRandomizer" @@ -27,13 +30,10 @@ def recurse_for_py_files(names_so_far): hiddenimports = [] binaries = [] -#if sys.platform.find("windows"): -# binaries.append(("ucrtbase.dll",".")) - -a = Analysis([f"./{BINARY_SLUG}.py"], +a = Analysis([f"../{BINARY_SLUG}.py"], pathex=[], binaries=binaries, - datas=[], + datas=[('../data/', 'data/')], hiddenimports=hiddenimports, hookspath=[], runtime_hooks=[], @@ -46,6 +46,7 @@ a = Analysis([f"./{BINARY_SLUG}.py"], # https://stackoverflow.com/questions/17034434/how-to-remove-exclude-modules-and-files-from-pyinstaller excluded_binaries = [ 'VCRUNTIME140.dll', + 'ucrtbase.dll', 'msvcp140.dll', 'mfc140u.dll'] a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries]) @@ -64,4 +65,4 @@ exe = EXE(pyz, strip=False, upx=True, runtime_tmpdir=None, - console=console ) # <--- change this to True to enable command prompt when the app runs + console=console ) diff --git a/Gui.spec b/source/Gui.spec similarity index 88% rename from Gui.spec rename to source/Gui.spec index 001e82b2..8b140a75 100644 --- a/Gui.spec +++ b/source/Gui.spec @@ -3,10 +3,11 @@ import sys block_cipher = None -console = True +console = True # <--- change this to True to enable command prompt when the app runs if sys.platform.find("mac") or sys.platform.find("osx"): console = False + BINARY_SLUG = "Gui" def recurse_for_py_files(names_so_far): @@ -29,13 +30,10 @@ def recurse_for_py_files(names_so_far): hiddenimports = [] binaries = [] -#if sys.platform.find("windows"): -# binaries.append(("ucrtbase.dll",".")) - -a = Analysis([f"./{BINARY_SLUG}.py"], +a = Analysis([f"../{BINARY_SLUG}.py"], pathex=[], binaries=binaries, - datas=[], + datas=[('../data/', 'data/')], hiddenimports=hiddenimports, hookspath=[], runtime_hooks=[], @@ -48,6 +46,7 @@ a = Analysis([f"./{BINARY_SLUG}.py"], # https://stackoverflow.com/questions/17034434/how-to-remove-exclude-modules-and-files-from-pyinstaller excluded_binaries = [ 'VCRUNTIME140.dll', + 'ucrtbase.dll', 'msvcp140.dll', 'mfc140u.dll'] a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries]) @@ -63,7 +62,8 @@ exe = EXE(pyz, name=BINARY_SLUG, debug=False, bootloader_ignore_signals=False, + icon='../data/ER.ico', strip=False, upx=True, runtime_tmpdir=None, - console=console ) # <--- change this to True to enable command prompt when the app runs + console=console ) diff --git a/source/classes/SpriteSelector.py b/source/classes/SpriteSelector.py index 1ab073ad..102e4351 100644 --- a/source/classes/SpriteSelector.py +++ b/source/classes/SpriteSelector.py @@ -31,6 +31,11 @@ class SpriteSelector(object): def open_official_sprite_listing(_evt): webbrowser.open("http://alttpr.com/sprite_preview") + def open_official_sprite_dir(_evt): + if not os.path.isdir(self.official_sprite_dir): + os.makedirs(self.official_sprite_dir) + open_file(self.official_sprite_dir) + def open_unofficial_sprite_dir(_evt): if not os.path.isdir(self.unofficial_sprite_dir): os.makedirs(self.unofficial_sprite_dir) @@ -42,14 +47,17 @@ class SpriteSelector(object): official_frametitle = Frame(self.window) official_title_text = Label(official_frametitle, text="Official Sprites") - official_title_link = Label(official_frametitle, text="(open)", fg="blue", cursor="hand2") official_title_text.pack(side=LEFT) + official_local_title_link = Label(official_frametitle, text="(open local)", fg="blue", cursor="hand2") + official_local_title_link.pack(side=LEFT) + official_local_title_link.bind("", open_official_sprite_dir) + official_title_link = Label(official_frametitle, text="(ALttPR)", fg="blue", cursor="hand2") official_title_link.pack(side=LEFT) official_title_link.bind("", open_official_sprite_listing) unofficial_frametitle = Frame(self.window) unofficial_title_text = Label(unofficial_frametitle, text="Unofficial Sprites") - unofficial_title_link = Label(unofficial_frametitle, text="(open)", fg="blue", cursor="hand2") + unofficial_title_link = Label(unofficial_frametitle, text="(open local)", fg="blue", cursor="hand2") unofficial_title_text.pack(side=LEFT) unofficial_title_link.pack(side=LEFT) unofficial_title_link.bind("", open_unofficial_sprite_dir) @@ -231,8 +239,6 @@ class SpriteSelector(object): @property def official_sprite_dir(self): -# if is_bundled(): -# return output_path(os.path.join("sprites","official")) return self.local_official_sprite_dir @property @@ -241,8 +247,6 @@ class SpriteSelector(object): @property def unofficial_sprite_dir(self): -# if is_bundled(): -# return output_path(os.path.join("sprites","unofficial")) return self.local_unofficial_sprite_dir @property diff --git a/build-dr.py b/source/meta/build-dr.py similarity index 91% rename from build-dr.py rename to source/meta/build-dr.py index 46f5b88a..6f26adb9 100644 --- a/build-dr.py +++ b/source/meta/build-dr.py @@ -4,7 +4,7 @@ import shutil import sys # Spec file -SPEC_FILE = os.path.join("DungeonRandomizer.spec") +SPEC_FILE = os.path.join(".", "source", "DungeonRandomizer.spec") # Destination is current dir DEST_DIRECTORY = '.' diff --git a/build-gui.py b/source/meta/build-gui.py similarity index 93% rename from build-gui.py rename to source/meta/build-gui.py index 6cc69228..ae284261 100644 --- a/build-gui.py +++ b/source/meta/build-gui.py @@ -4,7 +4,7 @@ import shutil import sys # Spec file -SPEC_FILE = os.path.join("Gui.spec") +SPEC_FILE = os.path.join(".", "source", "Gui.spec") # Destination is current dir DEST_DIRECTORY = '.'