Jak 1: Fixed UT bugs, added Free The Sages as Locations.

This commit is contained in:
massimilianodelliubaldini
2024-04-16 17:34:30 -04:00
parent e1e8c04f85
commit 293a282ff4
7 changed files with 82 additions and 45 deletions

View File

@@ -1,2 +1,5 @@
# All Jak And Daxter IDs will be offset by this number.
# All Jak And Daxter IDs must be offset by this number.
game_id = 74680000
# The name of the game.
game_name = "Jak and Daxter: The Precursor Legacy"

View File

@@ -1,8 +1,9 @@
from BaseClasses import Item
from .GameID import game_id, game_name
class JakAndDaxterItem(Item):
game: str = "Jak and Daxter: The Precursor Legacy"
game: str = game_name
# Items Found Multiple Times
@@ -20,7 +21,11 @@ special_item_table = {
2216: "Blue Eco Switch",
2217: "Gladiator's Pontoons",
2218: "Yellow Eco Switch",
2219: "Lurker Fort Gate"
2219: "Lurker Fort Gate",
2220: "Free The Yellow Sage",
2221: "Free The Red Sage",
2222: "Free The Blue Sage",
2223: "Free The Green Sage"
}
# All Items

View File

@@ -1,9 +1,10 @@
from BaseClasses import Location
from .GameID import game_id, game_name
from .locs import CellLocations, SpecialLocations, ScoutLocations
class JakAndDaxterLocation(Location):
game: str = "Jak and Daxter: The Precursor Legacy"
game: str = game_name
# All Locations

View File

@@ -1,6 +1,7 @@
import typing
from enum import Enum
from BaseClasses import MultiWorld, Region
from .GameID import game_id, game_name
from .Options import JakAndDaxterOptions
from .Locations import JakAndDaxterLocation, location_table
from .locs import CellLocations, SpecialLocations, ScoutLocations
@@ -34,6 +35,7 @@ class JakAndDaxterSubLevel(int, Enum):
SNOWY_MOUNTAIN_FLUT_FLUT = 5
SNOWY_MOUNTAIN_LURKER_FORT = 6
GOL_AND_MAIAS_CITADEL_ROTATING_TOWER = 7
GOL_AND_MAIAS_CITADEL_FINAL_BOSS = 8
level_table: typing.Dict[JakAndDaxterLevel, str] = {
@@ -63,12 +65,13 @@ subLevel_table: typing.Dict[JakAndDaxterSubLevel, str] = {
JakAndDaxterSubLevel.MOUNTAIN_PASS_SHORTCUT: "Mountain Pass Shortcut",
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_FLUT_FLUT: "Snowy Mountain Flut Flut",
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_LURKER_FORT: "Snowy Mountain Lurker Fort",
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_ROTATING_TOWER: "Gol and Maia's Citadel Rotating Tower"
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_ROTATING_TOWER: "Gol and Maia's Citadel Rotating Tower",
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_FINAL_BOSS: "Gol and Maia's Citadel Final Boss"
}
class JakAndDaxterRegion(Region):
game: str = "Jak and Daxter: The Precursor Legacy"
game: str = game_name
def create_regions(multiworld: MultiWorld, options: JakAndDaxterOptions, player: int):
@@ -198,16 +201,20 @@ def create_regions(multiworld: MultiWorld, options: JakAndDaxterOptions, player:
region_gmc = create_region(player, multiworld, level_table[JakAndDaxterLevel.GOL_AND_MAIAS_CITADEL])
create_locations(region_gmc, {
**{k: CellLocations.locGMC_cellTable[k] for k in {96, 97, 98}},
**{k: ScoutLocations.locGMC_scoutTable[k] for k in {206, 207, 208, 209, 210, 211}}
**{k: ScoutLocations.locGMC_scoutTable[k] for k in {206, 207, 208, 209, 210, 211}},
**{k: SpecialLocations.loc_specialTable[k] for k in {2220, 2221, 2222}}
})
sub_region_gmcrt = create_subregion(region_gmc,
subLevel_table[JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_ROTATING_TOWER])
create_locations(sub_region_gmcrt, {
**{k: CellLocations.locGMC_cellTable[k] for k in {99, 100}},
**{k: ScoutLocations.locGMC_scoutTable[k] for k in {212}}
**{k: ScoutLocations.locGMC_scoutTable[k] for k in {212}},
**{k: SpecialLocations.loc_specialTable[k] for k in {2223}}
})
create_subregion(sub_region_gmcrt, subLevel_table[JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_FINAL_BOSS])
def create_region(player: int, multiworld: MultiWorld, name: str) -> JakAndDaxterRegion:
region = JakAndDaxterRegion(name, player, multiworld)
@@ -223,5 +230,6 @@ def create_subregion(parent: Region, name: str) -> JakAndDaxterRegion:
return region
def create_locations(region: Region, locs: typing.Dict[int, str]):
region.locations += [JakAndDaxterLocation(region.player, location_table[loc], loc, region) for loc in locs]
def create_locations(region: Region, locations: typing.Dict[int, str]):
region.locations += [JakAndDaxterLocation(region.player, location_table[loc], game_id + loc, region)
for loc in locations]

View File

@@ -18,19 +18,19 @@ def set_rules(multiworld: MultiWorld, options: JakAndDaxterOptions, player: int)
JakAndDaxterLevel.SANDOVER_VILLAGE,
JakAndDaxterLevel.FORBIDDEN_JUNGLE)
connect_subregions(multiworld, player,
JakAndDaxterLevel.FORBIDDEN_JUNGLE,
JakAndDaxterSubLevel.FORBIDDEN_JUNGLE_PLANT_ROOM,
lambda state: state.has(item_table[2216], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.FORBIDDEN_JUNGLE,
JakAndDaxterSubLevel.FORBIDDEN_JUNGLE_PLANT_ROOM,
lambda state: state.has(item_table[2216], player))
connect_regions(multiworld, player,
JakAndDaxterLevel.SANDOVER_VILLAGE,
JakAndDaxterLevel.SENTINEL_BEACH)
connect_subregions(multiworld, player,
JakAndDaxterLevel.SENTINEL_BEACH,
JakAndDaxterSubLevel.SENTINEL_BEACH_CANNON_TOWER,
lambda state: state.has(item_table[2216], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.SENTINEL_BEACH,
JakAndDaxterSubLevel.SENTINEL_BEACH_CANNON_TOWER,
lambda state: state.has(item_table[2216], player))
connect_regions(multiworld, player,
JakAndDaxterLevel.SANDOVER_VILLAGE,
@@ -59,20 +59,20 @@ def set_rules(multiworld: MultiWorld, options: JakAndDaxterOptions, player: int)
JakAndDaxterLevel.BOGGY_SWAMP,
lambda state: state.has(item_table[2217], player))
connect_subregions(multiworld, player,
JakAndDaxterLevel.BOGGY_SWAMP,
JakAndDaxterSubLevel.BOGGY_SWAMP_FLUT_FLUT,
lambda state: state.has(item_table[2215], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.BOGGY_SWAMP,
JakAndDaxterSubLevel.BOGGY_SWAMP_FLUT_FLUT,
lambda state: state.has(item_table[2215], player))
connect_regions(multiworld, player,
JakAndDaxterLevel.ROCK_VILLAGE,
JakAndDaxterLevel.MOUNTAIN_PASS,
lambda state: state.has(item_table[2217], player) and state.has(item_table[0], player, 45))
connect_subregions(multiworld, player,
JakAndDaxterLevel.MOUNTAIN_PASS,
JakAndDaxterSubLevel.MOUNTAIN_PASS_SHORTCUT,
lambda state: state.has(item_table[2218], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.MOUNTAIN_PASS,
JakAndDaxterSubLevel.MOUNTAIN_PASS_SHORTCUT,
lambda state: state.has(item_table[2218], player))
connect_regions(multiworld, player,
JakAndDaxterLevel.MOUNTAIN_PASS,
@@ -86,15 +86,15 @@ def set_rules(multiworld: MultiWorld, options: JakAndDaxterOptions, player: int)
JakAndDaxterLevel.VOLCANIC_CRATER,
JakAndDaxterLevel.SNOWY_MOUNTAIN)
connect_subregions(multiworld, player,
JakAndDaxterLevel.SNOWY_MOUNTAIN,
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_FLUT_FLUT,
lambda state: state.has(item_table[2215], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.SNOWY_MOUNTAIN,
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_FLUT_FLUT,
lambda state: state.has(item_table[2215], player))
connect_subregions(multiworld, player,
JakAndDaxterLevel.SNOWY_MOUNTAIN,
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_LURKER_FORT,
lambda state: state.has(item_table[2219], player))
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.SNOWY_MOUNTAIN,
JakAndDaxterSubLevel.SNOWY_MOUNTAIN_LURKER_FORT,
lambda state: state.has(item_table[2219], player))
connect_regions(multiworld, player,
JakAndDaxterLevel.VOLCANIC_CRATER,
@@ -105,13 +105,22 @@ def set_rules(multiworld: MultiWorld, options: JakAndDaxterOptions, player: int)
JakAndDaxterLevel.LAVA_TUBE,
JakAndDaxterLevel.GOL_AND_MAIAS_CITADEL)
connect_region_to_sub(multiworld, player,
JakAndDaxterLevel.GOL_AND_MAIAS_CITADEL,
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_ROTATING_TOWER,
lambda state: state.has(item_table[2220], player)
and state.has(item_table[2221], player)
and state.has(item_table[2222], player))
connect_subregions(multiworld, player,
JakAndDaxterLevel.GOL_AND_MAIAS_CITADEL,
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_ROTATING_TOWER,
# lambda state: state.has(item_table[96], player)
# and state.has(item_table[97], player)
# and state.has(item_table[98], player))
lambda state: state.has(item_table[0], player, 75))
JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_FINAL_BOSS,
lambda state: state.has(item_table[2223], player))
multiworld.completion_condition[player] = lambda state: state.can_reach(
multiworld.get_region(subLevel_table[JakAndDaxterSubLevel.GOL_AND_MAIAS_CITADEL_FINAL_BOSS], player),
"Region",
player)
def connect_regions(multiworld: MultiWorld, player: int, source: JakAndDaxterLevel, target: JakAndDaxterLevel,
@@ -121,8 +130,15 @@ def connect_regions(multiworld: MultiWorld, player: int, source: JakAndDaxterLev
source_region.connect(target_region, rule=rule)
def connect_subregions(multiworld: MultiWorld, player: int, source: JakAndDaxterLevel, target: JakAndDaxterSubLevel,
rule=None):
def connect_region_to_sub(multiworld: MultiWorld, player: int, source: JakAndDaxterLevel, target: JakAndDaxterSubLevel,
rule=None):
source_region = multiworld.get_region(level_table[source], player)
target_region = multiworld.get_region(subLevel_table[target], player)
source_region.connect(target_region, rule=rule)
def connect_subregions(multiworld: MultiWorld, player: int, source: JakAndDaxterSubLevel, target: JakAndDaxterSubLevel,
rule=None):
source_region = multiworld.get_region(subLevel_table[source], player)
target_region = multiworld.get_region(subLevel_table[target], player)
source_region.connect(target_region, rule=rule)

View File

@@ -5,12 +5,12 @@ from .Regions import JakAndDaxterLevel, JakAndDaxterSubLevel, JakAndDaxterRegion
create_regions
from .Rules import set_rules
from .Items import JakAndDaxterItem, item_table, generic_item_table, special_item_table
from .GameID import game_id
from .GameID import game_id, game_name
from ..AutoWorld import World
class JakAndDaxterWorld(World):
game: str = "Jak and Daxter: The Precursor Legacy"
game: str = game_name
data_version = 1
required_client_version = (0, 4, 5)

View File

@@ -1,4 +1,4 @@
# Special Locations start at ID 2213 and end at ID 2219.
# Special Locations start at ID 2213 and end at ID 22xx.
loc_specialTable = {
2213: "Fisherman's Boat",
@@ -7,5 +7,9 @@ loc_specialTable = {
2216: "Blue Eco Switch",
2217: "Gladiator's Pontoons",
2218: "Yellow Eco Switch",
2219: "Lurker Fort Gate"
2219: "Lurker Fort Gate",
2220: "Free The Yellow Sage",
2221: "Free The Red Sage",
2222: "Free The Blue Sage",
2223: "Free The Green Sage"
}