Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jak and Daxter: Implement New Game #3291

Open
wants to merge 104 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 93 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
57b2ecf
Jak 1: Initial commit: Cell Locations, Items, and Regions modeled.
massimilianodelliubaldini Apr 14, 2024
bff2d4a
Jak 1: Wrote Regions, Rules, init. Untested.
massimilianodelliubaldini Apr 15, 2024
ab4a5e9
Jak 1: Fixed mistakes, need better understanding of Entrances.
massimilianodelliubaldini Apr 15, 2024
723f641
Jak 1: Fixed bugs, refactored Regions, added missing Special Checks. …
massimilianodelliubaldini Apr 15, 2024
4031f19
Jak 1: Add Scout Fly Locations, code and style cleanup.
massimilianodelliubaldini Apr 15, 2024
352a26a
Jak 1: Add Scout Flies to Regions.
massimilianodelliubaldini Apr 15, 2024
3b197bb
Jak 1: Add version info.
massimilianodelliubaldini Apr 16, 2024
e1e8c04
Jak 1: Reduced code smell.
massimilianodelliubaldini Apr 16, 2024
293a282
Jak 1: Fixed UT bugs, added Free The Sages as Locations.
massimilianodelliubaldini Apr 16, 2024
db8d74e
Jak 1: Refactor ID scheme to better fit game's scheme. Add more subre…
massimilianodelliubaldini Apr 18, 2024
3cd3e73
Jak 1: Add some one-ways, adjust scout fly offset.
massimilianodelliubaldini Apr 18, 2024
d22c2ca
Jak 1: Found Scout Fly ID's for first 4 maps.
massimilianodelliubaldini Apr 19, 2024
0b26a99
Jak 1: Add more scout fly ID's, refactor game/AP ID translation for e…
massimilianodelliubaldini Apr 20, 2024
df31d87
Jak 1: Fixed a few things. Four maps to go.
massimilianodelliubaldini Apr 23, 2024
ef7b359
Jak 1: Last of the scout flies mapped!
massimilianodelliubaldini Apr 23, 2024
c497188
Jak 1: simplify citadel sages logic.
massimilianodelliubaldini Apr 24, 2024
7f8a41f
Jak 1: WebWorld setup, some documentation.
massimilianodelliubaldini Apr 24, 2024
3de94fb
Jak 1: Initial checkin of Client. Removed the colon from the game name.
massimilianodelliubaldini Apr 26, 2024
39364b3
Jak 1: Refactored client into components, working on async communicat…
massimilianodelliubaldini Apr 27, 2024
801e50b
Jak 1: In tandem with new ArchipelaGOAL memory structure, define read…
massimilianodelliubaldini Apr 29, 2024
75461d6
Jak 1: There's magic in the air...
massimilianodelliubaldini Apr 30, 2024
b1f1464
Jak 1: Fixed bug translating scout fly ID's.
massimilianodelliubaldini Apr 30, 2024
f0659e3
Jak 1: Make the REPL a little more verbose, easier to debug.
massimilianodelliubaldini May 1, 2024
f4a51a8
Jak 1: Did you know Snowy Mountain had such specific unlock requireme…
massimilianodelliubaldini May 3, 2024
6637452
Jak 1: Update Documentation.
massimilianodelliubaldini May 9, 2024
240bb6c
Jak 1: Simplify user interaction with agents, make process more robus…
massimilianodelliubaldini May 9, 2024
4b4489a
Jak 1: Simplified startup process, updated docs, prayed.
massimilianodelliubaldini May 12, 2024
89c15f5
Jak 1: quick fix to settings.
massimilianodelliubaldini May 12, 2024
1ac5302
Jak and Daxter: Implement New Game (#1)
massimilianodelliubaldini May 12, 2024
75989b8
Merge branch 'main' into jak-and-daxter
massimilianodelliubaldini May 13, 2024
0f4c221
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini May 18, 2024
7cf50b0
Jak and Daxter: Genericize Items, Update Scout Fly logic, Add Victory…
massimilianodelliubaldini May 18, 2024
064ae55
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini May 22, 2024
e76df68
Jak and Daxter - Gondola, Pontoons, Rules, Regions, and Client Update
massimilianodelliubaldini May 22, 2024
50f5606
Alpha Updates (#15)
massimilianodelliubaldini May 28, 2024
33a858e
Logging Update (#16)
massimilianodelliubaldini Jun 1, 2024
8293b9d
Deathlink (#18)
massimilianodelliubaldini Jun 7, 2024
1c42bdb
Move Randomizer (#26)
massimilianodelliubaldini Jun 27, 2024
1b0d6ad
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Jul 2, 2024
f875169
Move rando fixes (#29)
massimilianodelliubaldini Jul 3, 2024
f7b688d
Orbsanity (#32)
massimilianodelliubaldini Jul 11, 2024
35bf078
Finishing Touches (#36)
massimilianodelliubaldini Jul 23, 2024
22b43a8
Rename completion_condition to jak_completion_condition (#41)
DeamonHunter Jul 31, 2024
ea82846
The Afterparty (#42)
massimilianodelliubaldini Aug 3, 2024
b3b1ee4
Added more specific troubleshooting/setup instructions.
massimilianodelliubaldini Aug 3, 2024
da7de27
Add known issue about large releases taking time. (Dodge 6,666th comm…
massimilianodelliubaldini Aug 3, 2024
a675849
Remove "Bundle of", Add location name groups, set better default Root…
massimilianodelliubaldini Aug 7, 2024
17b4845
Make orb trade amounts configurable, make orbsanity defaults more rea…
massimilianodelliubaldini Aug 19, 2024
b7ca9cb
Add HUD info to doc.
massimilianodelliubaldini Aug 20, 2024
746b281
Exempt's Code Review Updates (#43)
massimilianodelliubaldini Aug 27, 2024
3eadf54
Added a host.yaml option to override friendly limits, plus a couple o…
massimilianodelliubaldini Aug 27, 2024
30f5d84
Added singleplayer limits, player names to enforcement rules.
massimilianodelliubaldini Aug 29, 2024
b63ed86
Updated friendly limits to be more strict, optimized recalculate logic.
massimilianodelliubaldini Aug 30, 2024
0e1a3df
Today's the big day Jak: updates docs for mod support in OpenGOAL Lau…
massimilianodelliubaldini Sep 1, 2024
9317486
Rearranged and clarified some instructions, ADDED PATH-SPACE FIX TO C…
massimilianodelliubaldini Sep 2, 2024
e6b58aa
Fix deathlink reset stalls on a busy client. (#47)
massimilianodelliubaldini Sep 7, 2024
8922b1a
Jak & Daxter Client : queue game text messages to get items faster du…
t-rbernard Sep 10, 2024
d15de80
Item Classifications (and REPL fixes) (#49)
massimilianodelliubaldini Sep 12, 2024
f22e5f6
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Sep 12, 2024
8af8dd7
Use math.ceil like a normal person.
massimilianodelliubaldini Sep 12, 2024
2431ba0
Missed a space.
massimilianodelliubaldini Sep 12, 2024
fd47d02
Fix non-accessibility due to bad orb calculation.
massimilianodelliubaldini Sep 12, 2024
39f0955
Updated documentation.
massimilianodelliubaldini Sep 14, 2024
e0410ea
More Options, More Docs, More Tests (#51)
massimilianodelliubaldini Sep 17, 2024
8f0a2bc
Clean imports of unit tests.
massimilianodelliubaldini Sep 17, 2024
4e4a59d
Create OptionGroups.
massimilianodelliubaldini Sep 17, 2024
95ec860
Fix region rule bug with Punch for Klaww.
massimilianodelliubaldini Sep 18, 2024
15145f9
Include Punch For Klaww in slot data.
massimilianodelliubaldini Sep 22, 2024
5a2da8e
Update worlds/jakanddaxter/__init__.py
massimilianodelliubaldini Sep 23, 2024
9bec937
Temper and Harden Text Client (#52)
massimilianodelliubaldini Oct 4, 2024
86460b4
Stellar Messaging (#54)
massimilianodelliubaldini Oct 14, 2024
0771796
ISO Data Enhancement (#58)
massimilianodelliubaldini Oct 29, 2024
ff5165e
Update memory version to 4.
massimilianodelliubaldini Oct 29, 2024
d0d609a
Docs update for iso_data.
massimilianodelliubaldini Nov 11, 2024
5f0ff2e
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Nov 13, 2024
0ae5faa
Auto Detect OpenGOAL Install (#63)
massimilianodelliubaldini Nov 22, 2024
c752cef
J&D : add per region location groups (#64)
t-rbernard Nov 29, 2024
1b93490
Rearrange location group names, quick fix to client error handling.
massimilianodelliubaldini Nov 29, 2024
79ee26a
Fix pycharm warnings.
massimilianodelliubaldini Nov 29, 2024
2a01836
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Nov 29, 2024
2519e49
Fix more pycharm warnings.
massimilianodelliubaldini Dec 4, 2024
d4b50c2
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Dec 9, 2024
770f057
Light cleanup: fix icons, add bug report page, remove py 3.8 code.
massimilianodelliubaldini Dec 10, 2024
3cf48a5
Update worlds/jakanddaxter/Options.py
massimilianodelliubaldini Jan 7, 2025
e3eff0d
Update worlds/jakanddaxter/Options.py
massimilianodelliubaldini Jan 7, 2025
7d0ab68
Update worlds/jakanddaxter/Options.py
massimilianodelliubaldini Jan 7, 2025
8bf21c4
Update worlds/jakanddaxter/Options.py
massimilianodelliubaldini Jan 7, 2025
4bed8aa
Code review updates on comments, tooltips, and type hints.
massimilianodelliubaldini Jan 7, 2025
364d653
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Jan 7, 2025
2d609f1
Update type hint for lists in regions.
massimilianodelliubaldini Jan 7, 2025
5d98dd4
Missed todo removal.
massimilianodelliubaldini Jan 7, 2025
4ebcda6
More type hint updates.
massimilianodelliubaldini Jan 8, 2025
02224bf
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Jan 8, 2025
82b3c90
Small region updates for location accessibility, small updates to wor…
massimilianodelliubaldini Jan 8, 2025
53f2dd9
Add GMC scout fly location group.
massimilianodelliubaldini Jan 19, 2025
8624207
Improved sanitization of game text.
massimilianodelliubaldini Jan 24, 2025
c1cceb5
Merge remote-tracking branch 'remotes/upstream/main'
massimilianodelliubaldini Feb 13, 2025
263311d
Traps 2 (#70)
massimilianodelliubaldini Feb 16, 2025
edc5f9e
Quick fixes for beta 0.5.0 release: template options and LPC logic.
massimilianodelliubaldini Feb 16, 2025
1297f9b
Quick fix to spoiler counts.
massimilianodelliubaldini Feb 19, 2025
699f779
Reorganize world guide for faster navigation.
massimilianodelliubaldini Feb 20, 2025
d2560b9
Fix links.
massimilianodelliubaldini Feb 20, 2025
16e60ca
Update HUD section.
massimilianodelliubaldini Feb 20, 2025
e0e4926
Found a way to render apostrophes in item names.
massimilianodelliubaldini Feb 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Currently, the following games are supported:
* Super Mario World
* Pokémon Red and Blue
* Hylics 2
* Jak and Daxter: The Precursor Legacy
* Overcooked! 2
* Zillion
* Lufia II Ancient Cave
Expand Down
3 changes: 3 additions & 0 deletions docs/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@
# Inscryption
/worlds/inscryption/ @DrBibop @Glowbuzz

# Jak and Daxter: The Precursor Legacy
/worlds/jakanddaxter/ @massimilianodelliubaldini

# Kirby's Dream Land 3
/worlds/kdl3/ @Silvris

Expand Down
569 changes: 569 additions & 0 deletions worlds/jakanddaxter/Client.py

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions worlds/jakanddaxter/GameID.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# All Jak And Daxter Archipelago IDs must be offset by this number.
jak1_id = 741000000

# This is maximum ID we will allow.
jak1_max = jak1_id + 999999

# The name of the game.
jak1_name = "Jak and Daxter The Precursor Legacy"
112 changes: 112 additions & 0 deletions worlds/jakanddaxter/Items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
from BaseClasses import Item
from .GameID import jak1_name, jak1_max
from .locs import (OrbLocations as Orbs,
CellLocations as Cells,
ScoutLocations as Scouts,
SpecialLocations as Specials,
OrbCacheLocations as Caches)


class JakAndDaxterItem(Item):
game: str = jak1_name


# Power Cells are generic, fungible, interchangeable items. Every cell is indistinguishable from every other.
cell_item_table = {
0: "Power Cell",
}

# Scout flies are interchangeable within their respective sets of 7. Notice the level name after each item.
# Also, notice that their Item ID equals their respective Power Cell's Location ID. This is necessary for
# game<->archipelago communication.
scout_item_table = {
95: "Scout Fly - Geyser Rock",
75: "Scout Fly - Sandover Village",
7: "Scout Fly - Forbidden Jungle",
20: "Scout Fly - Sentinel Beach",
28: "Scout Fly - Misty Island",
68: "Scout Fly - Fire Canyon",
76: "Scout Fly - Rock Village",
57: "Scout Fly - Precursor Basin",
49: "Scout Fly - Lost Precursor City",
43: "Scout Fly - Boggy Swamp",
88: "Scout Fly - Mountain Pass",
77: "Scout Fly - Volcanic Crater",
85: "Scout Fly - Spider Cave",
65: "Scout Fly - Snowy Mountain",
90: "Scout Fly - Lava Tube",
91: "Scout Fly - Citadel", # Had to shorten, it was >32 characters.
}

# Orbs are also generic and interchangeable.
# These items are only used by Orbsanity, and only one of these
# items will be used corresponding to the chosen bundle size.
orb_item_table = {
1: "1 Precursor Orb",
2: "2 Precursor Orbs",
4: "4 Precursor Orbs",
5: "5 Precursor Orbs",
8: "8 Precursor Orbs",
10: "10 Precursor Orbs",
16: "16 Precursor Orbs",
20: "20 Precursor Orbs",
25: "25 Precursor Orbs",
40: "40 Precursor Orbs",
50: "50 Precursor Orbs",
80: "80 Precursor Orbs",
100: "100 Precursor Orbs",
125: "125 Precursor Orbs",
200: "200 Precursor Orbs",
250: "250 Precursor Orbs",
400: "400 Precursor Orbs",
500: "500 Precursor Orbs",
1000: "1000 Precursor Orbs",
2000: "2000 Precursor Orbs",
}

# These are special items representing unique unlocks in the world. Notice that their Item ID equals their
# respective Location ID. Like scout flies, this is necessary for game<->archipelago communication.
special_item_table = {
5: "Fisherman's Boat", # Unlocks Misty Island
4: "Jungle Elevator", # Unlocks the Forbidden Jungle Temple
2: "Blue Eco Switch", # Unlocks Blue Eco Vents
17: "Flut Flut", # Unlocks Flut Flut sections in Boggy Swamp and Snowy Mountain
33: "Warrior's Pontoons", # Unlocks Boggy Swamp and everything post-Rock Village
105: "Snowy Mountain Gondola", # Unlocks Snowy Mountain
60: "Yellow Eco Switch", # Unlocks Yellow Eco Vents
63: "Snowy Fort Gate", # Unlocks the Snowy Mountain Fort
71: "Freed The Blue Sage", # 1 of 3 unlocks for the final staircase in Citadel
72: "Freed The Red Sage", # 1 of 3 unlocks for the final staircase in Citadel
73: "Freed The Yellow Sage", # 1 of 3 unlocks for the final staircase in Citadel
70: "Freed The Green Sage", # Unlocks the final boss elevator in Citadel
}

# These are the move items for move randomizer. Notice that their Item ID equals some of the Orb Cache Location ID's.
# This was 100% arbitrary. There's no reason to tie moves to orb caches except that I need a place to put them. ;_;
move_item_table = {
10344: "Crouch",
10369: "Crouch Jump",
11072: "Crouch Uppercut",
12634: "Roll",
12635: "Roll Jump",
10945: "Double Jump",
14507: "Jump Dive",
14838: "Jump Kick",
23348: "Punch",
23349: "Punch Uppercut",
23350: "Kick",
# 24038: "Orb Cache at End of Blast Furnace", # Hold onto these ID's for future use.
# 24039: "Orb Cache at End of Launch Pad Room",
# 24040: "Orb Cache at Start of Launch Pad Room",
}

# All Items
# While we're here, do all the ID conversions needed.
item_table = {
**{Cells.to_ap_id(k): cell_item_table[k] for k in cell_item_table},
**{Scouts.to_ap_id(k): scout_item_table[k] for k in scout_item_table},
**{Specials.to_ap_id(k): special_item_table[k] for k in special_item_table},
**{Caches.to_ap_id(k): move_item_table[k] for k in move_item_table},
**{Orbs.to_ap_id(k): orb_item_table[k] for k in orb_item_table},
jak1_max: "Green Eco Pill" # Filler item.
}
76 changes: 76 additions & 0 deletions worlds/jakanddaxter/Levels.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# This contains the list of levels in Jak and Daxter.
# Not to be confused with Regions - there can be multiple Regions in every Level.
level_table = {
"Geyser Rock": {
"level_index": 0,
"orbs": 50
},
"Sandover Village": {
"level_index": 1,
"orbs": 50
},
"Sentinel Beach": {
"level_index": 2,
"orbs": 150
},
"Forbidden Jungle": {
"level_index": 3,
"orbs": 150
},
"Misty Island": {
"level_index": 4,
"orbs": 150
},
"Fire Canyon": {
"level_index": 5,
"orbs": 50
},
"Rock Village": {
"level_index": 6,
"orbs": 50
},
"Lost Precursor City": {
"level_index": 7,
"orbs": 200
},
"Boggy Swamp": {
"level_index": 8,
"orbs": 200
},
"Precursor Basin": {
"level_index": 9,
"orbs": 200
},
"Mountain Pass": {
"level_index": 10,
"orbs": 50
},
"Volcanic Crater": {
"level_index": 11,
"orbs": 50
},
"Snowy Mountain": {
"level_index": 12,
"orbs": 200
},
"Spider Cave": {
"level_index": 13,
"orbs": 200
},
"Lava Tube": {
"level_index": 14,
"orbs": 50
},
"Gol and Maia's Citadel": {
"level_index": 15,
"orbs": 200
}
}

level_table_with_global = {
**level_table,
"": {
"level_index": 16, # Global
"orbs": 2000
}
}
73 changes: 73 additions & 0 deletions worlds/jakanddaxter/Locations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from BaseClasses import Location, CollectionState
from .GameID import jak1_name
from .locs import (OrbLocations as Orbs,
CellLocations as Cells,
ScoutLocations as Scouts,
SpecialLocations as Specials,
OrbCacheLocations as Caches)


class JakAndDaxterLocation(Location):
game: str = jak1_name

# In AP 0.5.0, the base Location.can_reach function had its two boolean conditions swapped for a faster
# short-circuit for better performance. However, Jak seeds actually generate faster using the older method,
# which has been re-implemented below.
def can_reach(self, state: CollectionState) -> bool:
assert self.parent_region, "Can't reach location without region"
return self.parent_region.can_reach(state) and self.access_rule(state)


# Different tables for location groups.
# Each Item ID == its corresponding Location ID. While we're here, do all the ID conversions needed.
cell_location_table = {
**{Cells.to_ap_id(k): Cells.loc7SF_cellTable[k] for k in Cells.loc7SF_cellTable},
**{Cells.to_ap_id(k): Cells.locGR_cellTable[k] for k in Cells.locGR_cellTable},
**{Cells.to_ap_id(k): Cells.locSV_cellTable[k] for k in Cells.locSV_cellTable},
**{Cells.to_ap_id(k): Cells.locFJ_cellTable[k] for k in Cells.locFJ_cellTable},
**{Cells.to_ap_id(k): Cells.locSB_cellTable[k] for k in Cells.locSB_cellTable},
**{Cells.to_ap_id(k): Cells.locMI_cellTable[k] for k in Cells.locMI_cellTable},
**{Cells.to_ap_id(k): Cells.locFC_cellTable[k] for k in Cells.locFC_cellTable},
**{Cells.to_ap_id(k): Cells.locRV_cellTable[k] for k in Cells.locRV_cellTable},
**{Cells.to_ap_id(k): Cells.locPB_cellTable[k] for k in Cells.locPB_cellTable},
**{Cells.to_ap_id(k): Cells.locLPC_cellTable[k] for k in Cells.locLPC_cellTable},
**{Cells.to_ap_id(k): Cells.locBS_cellTable[k] for k in Cells.locBS_cellTable},
**{Cells.to_ap_id(k): Cells.locMP_cellTable[k] for k in Cells.locMP_cellTable},
**{Cells.to_ap_id(k): Cells.locVC_cellTable[k] for k in Cells.locVC_cellTable},
**{Cells.to_ap_id(k): Cells.locSC_cellTable[k] for k in Cells.locSC_cellTable},
**{Cells.to_ap_id(k): Cells.locSM_cellTable[k] for k in Cells.locSM_cellTable},
**{Cells.to_ap_id(k): Cells.locLT_cellTable[k] for k in Cells.locLT_cellTable},
**{Cells.to_ap_id(k): Cells.locGMC_cellTable[k] for k in Cells.locGMC_cellTable}
}

scout_location_table = {
**{Scouts.to_ap_id(k): Scouts.locGR_scoutTable[k] for k in Scouts.locGR_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locSV_scoutTable[k] for k in Scouts.locSV_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locFJ_scoutTable[k] for k in Scouts.locFJ_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locSB_scoutTable[k] for k in Scouts.locSB_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locMI_scoutTable[k] for k in Scouts.locMI_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locFC_scoutTable[k] for k in Scouts.locFC_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locRV_scoutTable[k] for k in Scouts.locRV_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locPB_scoutTable[k] for k in Scouts.locPB_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locLPC_scoutTable[k] for k in Scouts.locLPC_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locBS_scoutTable[k] for k in Scouts.locBS_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locMP_scoutTable[k] for k in Scouts.locMP_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locVC_scoutTable[k] for k in Scouts.locVC_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locSC_scoutTable[k] for k in Scouts.locSC_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locSM_scoutTable[k] for k in Scouts.locSM_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locLT_scoutTable[k] for k in Scouts.locLT_scoutTable},
**{Scouts.to_ap_id(k): Scouts.locGMC_scoutTable[k] for k in Scouts.locGMC_scoutTable}
}

special_location_table = {Specials.to_ap_id(k): Specials.loc_specialTable[k] for k in Specials.loc_specialTable}
cache_location_table = {Caches.to_ap_id(k): Caches.loc_orbCacheTable[k] for k in Caches.loc_orbCacheTable}
orb_location_table = {Orbs.to_ap_id(k): Orbs.loc_orbBundleTable[k] for k in Orbs.loc_orbBundleTable}

# All Locations
location_table = {
**cell_location_table,
**scout_location_table,
**special_location_table,
**cache_location_table,
**orb_location_table
}
Loading
Loading