157 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from enum import IntEnum | ||
|  | from BaseClasses import Item, ItemClassification | ||
|  | from .game_id import jak1_name, jak1_max | ||
|  | from .locs import (orb_locations as orbs, | ||
|  |                    cell_locations as cells, | ||
|  |                    scout_locations as scouts, | ||
|  |                    special_locations as specials, | ||
|  |                    orb_cache_locations as caches) | ||
|  | 
 | ||
|  | 
 | ||
|  | class OrbAssoc(IntEnum): | ||
|  |     """
 | ||
|  |     Identifies an item's association to unlocking new sources of Precursor Orbs. For example, Double Jump will unlock | ||
|  |     new orbs, but Freed the Green Sage will not. Power Cells conditionally unlock new orbs if they get you across | ||
|  |     connector levels. | ||
|  |     """
 | ||
|  |     NEVER_UNLOCKS_ORBS = 0 | ||
|  |     ALWAYS_UNLOCKS_ORBS = 1 | ||
|  |     IS_POWER_CELL = 2 | ||
|  | 
 | ||
|  | 
 | ||
|  | class JakAndDaxterItem(Item): | ||
|  |     game: str = jak1_name | ||
|  |     orb_assoc: OrbAssoc | ||
|  |     orb_amount: int  # Only non-zero for Orb Bundle items. | ||
|  | 
 | ||
|  |     def __init__(self, name: str, | ||
|  |                  classification: ItemClassification, | ||
|  |                  code: int | None, | ||
|  |                  player: int, | ||
|  |                  orb_assoc: OrbAssoc = OrbAssoc.NEVER_UNLOCKS_ORBS, | ||
|  |                  orb_amount: int = 0): | ||
|  |         super().__init__(name, classification, code, player) | ||
|  |         self.orb_assoc = orb_assoc | ||
|  |         self.orb_amount = orb_amount | ||
|  | 
 | ||
|  | 
 | ||
|  | # 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", | ||
|  | } | ||
|  | 
 | ||
|  | # These are trap items. Their Item ID is to be subtracted from the base game ID. They do not have corresponding | ||
|  | # game locations because they are intended to replace other items that have been marked as filler. | ||
|  | trap_item_table = { | ||
|  |     1: "Trip Trap", | ||
|  |     2: "Slippery Trap", | ||
|  |     3: "Gravity Trap", | ||
|  |     4: "Camera Trap", | ||
|  |     5: "Darkness Trap", | ||
|  |     6: "Earthquake Trap", | ||
|  |     7: "Teleport Trap", | ||
|  |     8: "Despair Trap", | ||
|  |     9: "Pacifism Trap", | ||
|  |     10: "Ecoless Trap", | ||
|  |     11: "Health Trap", | ||
|  |     12: "Ledge Trap", | ||
|  |     13: "Zoomer Trap", | ||
|  |     14: "Mirror Trap", | ||
|  | } | ||
|  | 
 | ||
|  | # All Items | ||
|  | # While we're here, do all the ID conversions needed. | ||
|  | item_table = { | ||
|  |     **{cells.to_ap_id(k): name for k, name in cell_item_table.items()}, | ||
|  |     **{scouts.to_ap_id(k): name for k, name in scout_item_table.items()}, | ||
|  |     **{specials.to_ap_id(k): name for k, name in special_item_table.items()}, | ||
|  |     **{caches.to_ap_id(k): name for k, name in move_item_table.items()}, | ||
|  |     **{orbs.to_ap_id(k): name for k, name in orb_item_table.items()}, | ||
|  |     **{jak1_max - k: name for k, name in trap_item_table.items()}, | ||
|  |     jak1_max: "Green Eco Pill"  # Filler item. | ||
|  | } |