1040 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1040 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from worlds.generic.Rules import set_rule, add_rule
 | 
						|
from BaseClasses import CollectionState
 | 
						|
from typing import Dict
 | 
						|
from .Regions import Stages
 | 
						|
 | 
						|
 | 
						|
def graffitiM(state: CollectionState, player: int, limit: bool, spots: int) -> bool:
 | 
						|
    return state.count_group_unique("graffitim", player) * 7 >= spots if limit \
 | 
						|
        else state.has_group("graffitim", player)
 | 
						|
 | 
						|
 | 
						|
def graffitiL(state: CollectionState, player: int, limit: bool, spots: int) -> bool:
 | 
						|
    return state.count_group_unique("graffitil", player) * 6 >= spots if limit \
 | 
						|
        else state.has_group("graffitil", player)
 | 
						|
 | 
						|
 | 
						|
def graffitiXL(state: CollectionState, player: int, limit: bool, spots: int) -> bool:
 | 
						|
    return state.count_group_unique("graffitixl", player) * 4 >= spots if limit \
 | 
						|
        else state.has_group("graffitixl", player)
 | 
						|
 | 
						|
 | 
						|
def skateboard(state: CollectionState, player: int, movestyle: int) -> bool:
 | 
						|
    return True if movestyle == 2 else state.has_group("skateboard", player)
 | 
						|
 | 
						|
 | 
						|
def inline_skates(state: CollectionState, player: int, movestyle: int) -> bool:
 | 
						|
    return True if movestyle == 3 else state.has_group("skates", player)
 | 
						|
 | 
						|
 | 
						|
def bmx(state: CollectionState, player: int, movestyle: int) -> bool:
 | 
						|
    return True if movestyle == 1 else state.has_group("bmx", player)
 | 
						|
 | 
						|
 | 
						|
def camera(state: CollectionState, player: int) -> bool:
 | 
						|
    return state.has("Camera App", player)
 | 
						|
 | 
						|
 | 
						|
def is_girl(state: CollectionState, player: int) -> bool:
 | 
						|
    return state.has_group("girl", player)
 | 
						|
 | 
						|
 | 
						|
def current_chapter(state: CollectionState, player: int, chapter: int) -> bool:
 | 
						|
    return state.has("Chapter Completed", player, chapter-1)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 20)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_ch1_roadblock(state: CollectionState, player: int, limit: bool) -> bool:
 | 
						|
    return graffitiL(state, player, limit, 10)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_challenge1(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 50)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_challenge2(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 58)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_challenge3(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 65)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_all_challenges(state: CollectionState, player: int) -> bool:
 | 
						|
    return versum_hill_challenge3(state, player)
 | 
						|
 | 
						|
 | 
						|
def versum_hill_basketball_court(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 90)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_oldhead(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 120)
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_crew_battle(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            rep(state, player, 90)
 | 
						|
            and graffitiM(state, player, limit, 98)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            rep(state, player, 90)
 | 
						|
            and graffitiM(state, player, limit, 27)
 | 
						|
        )
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_rietveld(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            current_chapter(state, player, 2)
 | 
						|
            and graffitiM(state, player, limit, 114)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            current_chapter(state, player, 2)
 | 
						|
            and graffitiM(state, player, limit, 67)
 | 
						|
        )
 | 
						|
    
 | 
						|
 | 
						|
def versum_hill_rave(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        if current_chapter(state, player, 4):
 | 
						|
            return (
 | 
						|
                graffitiL(state, player, limit, 90)
 | 
						|
                and graffitiXL(state, player, limit, 51)
 | 
						|
            )
 | 
						|
        elif current_chapter(state, player, 3):
 | 
						|
            return (
 | 
						|
                graffitiL(state, player, limit, 89)
 | 
						|
                and graffitiXL(state, player, limit, 51)
 | 
						|
            )
 | 
						|
        else:
 | 
						|
            return (
 | 
						|
                graffitiL(state, player, limit, 85)
 | 
						|
                and graffitiXL(state, player, limit, 48)
 | 
						|
            )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            graffitiL(state, player, limit, 26)
 | 
						|
            and graffitiXL(state, player, limit, 10)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def millennium_square_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return current_chapter(state, player, 2)
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return (
 | 
						|
        is_girl(state, player)
 | 
						|
        and rep(state, player, 180)
 | 
						|
        and current_chapter(state, player, 2)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_challenge1(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 188)
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_challenge2(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 200)
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_challenge3(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 220)
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_all_challenges(state: CollectionState, player: int) -> bool:
 | 
						|
    return brink_terminal_challenge3(state, player)
 | 
						|
 | 
						|
 | 
						|
def brink_terminal_plaza(state: CollectionState, player: int) -> bool:
 | 
						|
    return brink_terminal_all_challenges(state, player)
 | 
						|
    
 | 
						|
 | 
						|
def brink_terminal_tower(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 280)
 | 
						|
    
 | 
						|
 | 
						|
def brink_terminal_oldhead_underground(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 250)
 | 
						|
    
 | 
						|
 | 
						|
def brink_terminal_oldhead_dock(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 320)
 | 
						|
    
 | 
						|
 | 
						|
def brink_terminal_crew_battle(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            rep(state, player, 280)
 | 
						|
            and graffitiL(state, player, limit, 103)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            rep(state, player, 280)
 | 
						|
            and graffitiL(state, player, limit, 62)
 | 
						|
        )
 | 
						|
    
 | 
						|
 | 
						|
def brink_terminal_mesh(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 114)
 | 
						|
            and graffitiXL(state, player, limit, 45)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 67)
 | 
						|
            and graffitiXL(state, player, limit, 45)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return (
 | 
						|
        rep(state, player, 380)
 | 
						|
        and current_chapter(state, player, 3)
 | 
						|
    )
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_oldhead_ceiling(state: CollectionState, player: int, limit: bool) -> bool:
 | 
						|
    return (
 | 
						|
        rep(state, player, 580)
 | 
						|
        or millennium_mall_theater(state, player, limit)
 | 
						|
    )
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_switch(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 114)
 | 
						|
            and current_chapter(state, player, 3)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 72)
 | 
						|
            and current_chapter(state, player, 3)
 | 
						|
        )
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_big(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return millennium_mall_switch(state, player, limit, glitched)
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_oldhead_race(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 530)
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_challenge1(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 434)
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_challenge2(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 442)
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_challenge3(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 450)
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_challenge4(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 458)
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_all_challenges(state: CollectionState, player: int) -> bool:
 | 
						|
    return millennium_mall_challenge4(state, player)
 | 
						|
 | 
						|
 | 
						|
def millennium_mall_theater(state: CollectionState, player: int, limit: bool) -> bool:
 | 
						|
    return (
 | 
						|
        rep(state, player, 491)
 | 
						|
        and graffitiM(state, player, limit, 78)
 | 
						|
    )
 | 
						|
    
 | 
						|
 | 
						|
def millennium_mall_crew_battle(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            rep(state, player, 491)
 | 
						|
            and graffitiM(state, player, limit, 114)
 | 
						|
            and graffitiL(state, player, limit, 107)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            rep(state, player, 491)
 | 
						|
            and graffitiM(state, player, limit, 78)
 | 
						|
            and graffitiL(state, player, limit, 80)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return current_chapter(state, player, 4)
 | 
						|
    
 | 
						|
 | 
						|
def pyramid_island_gate(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 620)
 | 
						|
    
 | 
						|
 | 
						|
def pyramid_island_oldhead(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 780)
 | 
						|
    
 | 
						|
 | 
						|
def pyramid_island_challenge1(state: CollectionState, player: int) -> bool:
 | 
						|
    return (
 | 
						|
        rep(state, player, 630)
 | 
						|
        and current_chapter(state, player, 4)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_race(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched: 
 | 
						|
        return (
 | 
						|
            pyramid_island_challenge1(state, player)
 | 
						|
            and graffitiL(state, player, limit, 108)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            pyramid_island_challenge1(state, player)
 | 
						|
            and graffitiL(state, player, limit, 93)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_challenge2(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 650)
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_challenge3(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 660)
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_all_challenges(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 114)
 | 
						|
            and rep(state, player, 660)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            graffitiM(state, player, limit, 88)
 | 
						|
            and rep(state, player, 660)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_upper_half(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return pyramid_island_all_challenges(state, player, limit, glitched)
 | 
						|
    
 | 
						|
 | 
						|
def pyramid_island_crew_battle(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            rep(state, player, 730)
 | 
						|
            and graffitiL(state, player, limit, 108)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            rep(state, player, 730)
 | 
						|
            and graffitiL(state, player, limit, 97)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def pyramid_island_top(state: CollectionState, player: int) -> bool:
 | 
						|
    return current_chapter(state, player, 5)
 | 
						|
 | 
						|
 | 
						|
def mataan_entrance(state: CollectionState, player: int) -> bool:
 | 
						|
    return current_chapter(state, player, 2)
 | 
						|
    
 | 
						|
 | 
						|
def mataan_smoke_wall(state: CollectionState, player: int) -> bool:
 | 
						|
    return (
 | 
						|
        current_chapter(state, player, 5)
 | 
						|
        and rep(state, player, 850)
 | 
						|
    )
 | 
						|
    
 | 
						|
 | 
						|
def mataan_challenge1(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            current_chapter(state, player, 5)
 | 
						|
            and rep(state, player, 864)
 | 
						|
            and graffitiL(state, player, limit, 108)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            current_chapter(state, player, 5)
 | 
						|
            and rep(state, player, 864)
 | 
						|
            and graffitiL(state, player, limit, 98)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def mataan_deep_city(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return mataan_challenge1(state, player, limit, glitched)
 | 
						|
    
 | 
						|
 | 
						|
def mataan_oldhead(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 935)
 | 
						|
    
 | 
						|
 | 
						|
def mataan_challenge2(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            rep(state, player, 880)
 | 
						|
            and graffitiXL(state, player, limit, 59)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            rep(state, player, 880)
 | 
						|
            and graffitiXL(state, player, limit, 57)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
def mataan_challenge3(state: CollectionState, player: int) -> bool:
 | 
						|
    return rep(state, player, 920)
 | 
						|
 | 
						|
 | 
						|
def mataan_all_challenges(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return (
 | 
						|
        mataan_challenge2(state, player, limit, glitched)
 | 
						|
        and mataan_challenge3(state, player)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def mataan_smoke_wall2(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return (
 | 
						|
        mataan_all_challenges(state, player, limit, glitched)
 | 
						|
        and rep(state, player, 960)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def mataan_crew_battle(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    if glitched:
 | 
						|
        return (
 | 
						|
            mataan_smoke_wall2(state, player, limit, glitched)
 | 
						|
            and graffitiM(state, player, limit, 122)
 | 
						|
            and graffitiXL(state, player, limit, 59)
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        return (
 | 
						|
            mataan_smoke_wall2(state, player, limit, glitched)
 | 
						|
            and graffitiM(state, player, limit, 117)
 | 
						|
            and graffitiXL(state, player, limit, 57)
 | 
						|
        )
 | 
						|
    
 | 
						|
 | 
						|
def mataan_deepest(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return mataan_crew_battle(state, player, limit, glitched)
 | 
						|
    
 | 
						|
 | 
						|
def mataan_faux(state: CollectionState, player: int, limit: bool, glitched: bool) -> bool:
 | 
						|
    return (
 | 
						|
        mataan_deepest(state, player, limit, glitched)
 | 
						|
        and graffitiM(state, player, limit, 122)
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def spots_s_glitchless(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 10
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "versum_hill_entrance": 1,
 | 
						|
        "versum_hill_ch1_roadblock": 11,
 | 
						|
        "chapter2": 12,
 | 
						|
        "versum_hill_oldhead": 1,
 | 
						|
        "brink_terminal_entrance": 9,
 | 
						|
        "brink_terminal_plaza": 3,
 | 
						|
        "brink_terminal_tower": 0,
 | 
						|
        "chapter3": 6,
 | 
						|
        "brink_terminal_oldhead_dock": 1,
 | 
						|
        "millennium_mall_entrance": 3,
 | 
						|
        "millennium_mall_switch": 4,
 | 
						|
        "millennium_mall_theater": 3,
 | 
						|
        "chapter4": 2,
 | 
						|
        "pyramid_island_gate": 5,
 | 
						|
        "pyramid_island_upper_half": 8,
 | 
						|
        "pyramid_island_oldhead": 2,
 | 
						|
        "mataan_smoke_wall": 3,
 | 
						|
        "mataan_deep_city": 5,
 | 
						|
        "mataan_oldhead": 3,
 | 
						|
        "mataan_deepest": 2
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = 5 + (state.count_group_unique("characters", player) * 5)
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        return total
 | 
						|
    
 | 
						|
 | 
						|
def spots_s_glitched(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 75
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "brink_terminal_entrance": 13,
 | 
						|
        "chapter3": 6
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = 5 + (state.count_group_unique("characters", player) * 5)
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        return total
 | 
						|
    
 | 
						|
 | 
						|
def spots_m_glitchless(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 4
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "versum_hill_entrance": 3,
 | 
						|
        "versum_hill_ch1_roadblock": 13,
 | 
						|
        "versum_hill_all_challenges": 3,
 | 
						|
        "chapter2": 16,
 | 
						|
        "versum_hill_oldhead": 4,
 | 
						|
        "brink_terminal_entrance": 13,
 | 
						|
        "brink_terminal_plaza": 4,
 | 
						|
        "brink_terminal_tower": 0,
 | 
						|
        "chapter3": 3,
 | 
						|
        "brink_terminal_oldhead_dock": 4,
 | 
						|
        "millennium_mall_entrance": 5,
 | 
						|
        "millennium_mall_big": 6,
 | 
						|
        "millennium_mall_theater": 4,
 | 
						|
        "chapter4": 2,
 | 
						|
        "millennium_mall_oldhead_ceiling": 1,
 | 
						|
        "pyramid_island_gate": 3,
 | 
						|
        "pyramid_island_upper_half": 8,
 | 
						|
        "chapter5": 2,
 | 
						|
        "pyramid_island_oldhead": 5,
 | 
						|
        "mataan_deep_city": 7,
 | 
						|
        "skateboard": 1,
 | 
						|
        "mataan_oldhead": 1,
 | 
						|
        "mataan_smoke_wall2": 1,
 | 
						|
        "mataan_deepest": 10
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        elif access_name != "skateboard":
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitim", player) * 7
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitim", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
        
 | 
						|
 | 
						|
def spots_m_glitched(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 99
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "brink_terminal_entrance": 21,
 | 
						|
        "chapter3": 3
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitim", player) * 7
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitim", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
        
 | 
						|
 | 
						|
def spots_l_glitchless(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 7
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "inline_skates": 1,
 | 
						|
        "versum_hill_entrance": 2,
 | 
						|
        "versum_hill_ch1_roadblock": 13,
 | 
						|
        "versum_hill_all_challenges": 1,
 | 
						|
        "chapter2": 14,
 | 
						|
        "versum_hill_oldhead": 2,
 | 
						|
        "brink_terminal_entrance": 10,
 | 
						|
        "brink_terminal_plaza": 2,
 | 
						|
        "brink_terminal_oldhead_underground": 1,
 | 
						|
        "brink_terminal_tower": 1,
 | 
						|
        "chapter3": 4,
 | 
						|
        "brink_terminal_oldhead_dock": 4,
 | 
						|
        "millennium_mall_entrance": 3,
 | 
						|
        "millennium_mall_big": 8,
 | 
						|
        "millennium_mall_theater": 4,
 | 
						|
        "chapter4": 5,
 | 
						|
        "millennium_mall_oldhead_ceiling": 3,
 | 
						|
        "pyramid_island_gate": 4,
 | 
						|
        "pyramid_island_upper_half": 5,
 | 
						|
        "pyramid_island_crew_battle": 1,
 | 
						|
        "chapter5": 1,
 | 
						|
        "pyramid_island_oldhead": 2,
 | 
						|
        "mataan_smoke_wall": 1,
 | 
						|
        "mataan_deep_city": 2,
 | 
						|
        "skateboard": 1,
 | 
						|
        "mataan_oldhead": 2,
 | 
						|
        "mataan_deepest": 7
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        elif not (access_name == "inline_skates" or access_name == "skateboard"):
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitil", player) * 6
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitil", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
        
 | 
						|
 | 
						|
def spots_l_glitched(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 88
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "brink_terminal_entrance": 18,
 | 
						|
        "chapter3": 4,
 | 
						|
        "chapter4": 1
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitil", player) * 6
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitil", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
        
 | 
						|
 | 
						|
def spots_xl_glitchless(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 3
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "versum_hill_ch1_roadblock": 6,
 | 
						|
        "versum_hill_basketball_court": 1,
 | 
						|
        "chapter2": 9,
 | 
						|
        "brink_terminal_entrance": 3,
 | 
						|
        "brink_terminal_plaza": 1,
 | 
						|
        "brink_terminal_oldhead_underground": 1,
 | 
						|
        "brink_terminal_tower": 1,
 | 
						|
        "chapter3": 3,
 | 
						|
        "brink_terminal_oldhead_dock": 2,
 | 
						|
        "millennium_mall_entrance": 2,
 | 
						|
        "millennium_mall_big": 5,
 | 
						|
        "millennium_mall_theater": 5,
 | 
						|
        "chapter4": 3,
 | 
						|
        "millennium_mall_oldhead_ceiling": 1,
 | 
						|
        "pyramid_island_upper_half": 5,
 | 
						|
        "pyramid_island_oldhead": 3,
 | 
						|
        "mataan_smoke_wall": 2,
 | 
						|
        "mataan_deep_city": 2,
 | 
						|
        "mataan_oldhead": 2,
 | 
						|
        "mataan_deepest": 2
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitixl", player) * 4
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitixl", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
        
 | 
						|
 | 
						|
def spots_xl_glitched(state: CollectionState, player: int, limit: bool, access_cache: Dict[str, bool]) -> int:
 | 
						|
    total: int = 51
 | 
						|
    conditions: Dict[str, int] = {
 | 
						|
        "brink_terminal_entrance": 7,
 | 
						|
        "chapter3": 3,
 | 
						|
        "chapter4": 1
 | 
						|
    }
 | 
						|
 | 
						|
    for access_name, graffiti_count in conditions.items():
 | 
						|
        if access_cache[access_name]:
 | 
						|
            total += graffiti_count
 | 
						|
        else:
 | 
						|
            break
 | 
						|
 | 
						|
    if limit:
 | 
						|
        sprayable: int = state.count_group_unique("graffitixl", player) * 4
 | 
						|
        if total <= sprayable:
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return sprayable
 | 
						|
    else:
 | 
						|
        if state.has_group("graffitixl", player):
 | 
						|
            return total
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
 | 
						|
def build_access_cache(state: CollectionState, player: int, movestyle: int, limit: bool, glitched: bool) -> Dict[str, bool]:
 | 
						|
    funcs: Dict[str, tuple] = {
 | 
						|
        "versum_hill_entrance": (state, player),
 | 
						|
        "versum_hill_ch1_roadblock": (state, player, limit),
 | 
						|
        "versum_hill_oldhead": (state, player),
 | 
						|
        "versum_hill_all_challenges": (state, player),
 | 
						|
        "versum_hill_basketball_court": (state, player),
 | 
						|
        "brink_terminal_entrance": (state, player),
 | 
						|
        "brink_terminal_oldhead_underground": (state, player),
 | 
						|
        "brink_terminal_oldhead_dock": (state, player),
 | 
						|
        "brink_terminal_plaza": (state, player),
 | 
						|
        "brink_terminal_tower": (state, player),
 | 
						|
        "millennium_mall_entrance": (state, player),
 | 
						|
        "millennium_mall_switch": (state, player, limit, glitched),
 | 
						|
        "millennium_mall_oldhead_ceiling": (state, player, limit),
 | 
						|
        "millennium_mall_big": (state, player, limit, glitched),
 | 
						|
        "millennium_mall_theater": (state, player, limit),
 | 
						|
        "pyramid_island_gate": (state, player),
 | 
						|
        "pyramid_island_oldhead": (state, player),
 | 
						|
        "pyramid_island_upper_half": (state, player, limit, glitched),
 | 
						|
        "pyramid_island_crew_battle": (state, player, limit, glitched),
 | 
						|
        "mataan_smoke_wall": (state, player),
 | 
						|
        "mataan_deep_city": (state, player, limit, glitched),
 | 
						|
        "mataan_oldhead": (state, player),
 | 
						|
        "mataan_smoke_wall2": (state, player, limit, glitched),
 | 
						|
        "mataan_deepest": (state, player, limit, glitched)
 | 
						|
    }
 | 
						|
 | 
						|
    access_cache: Dict[str, bool] = {
 | 
						|
        "skateboard": skateboard(state, player, movestyle),
 | 
						|
        "inline_skates": inline_skates(state, player, movestyle),
 | 
						|
        "chapter2": current_chapter(state, player, 2),
 | 
						|
        "chapter3": current_chapter(state, player, 3),
 | 
						|
        "chapter4": current_chapter(state, player, 4),
 | 
						|
        "chapter5": current_chapter(state, player, 5)
 | 
						|
    }
 | 
						|
    
 | 
						|
    stop: bool = False
 | 
						|
    for fname, fvars in funcs.items():
 | 
						|
        if stop:
 | 
						|
            access_cache[fname] = False
 | 
						|
            continue
 | 
						|
        func = globals()[fname]
 | 
						|
        access: bool = func(*fvars)
 | 
						|
        access_cache[fname] = access
 | 
						|
        if not access and "oldhead" not in fname:
 | 
						|
            stop = True
 | 
						|
 | 
						|
    return access_cache
 | 
						|
 | 
						|
 | 
						|
def graffiti_spots(state: CollectionState, player: int, movestyle: int, limit: bool, glitched: bool, spots: int) -> bool:
 | 
						|
    access_cache = build_access_cache(state, player, movestyle, limit, glitched)
 | 
						|
 | 
						|
    total: int = 0
 | 
						|
 | 
						|
    if glitched:
 | 
						|
        total = spots_s_glitched(state, player, limit, access_cache) \
 | 
						|
        + spots_m_glitched(state, player, limit, access_cache) \
 | 
						|
        + spots_l_glitched(state, player, limit, access_cache) \
 | 
						|
        + spots_xl_glitched(state, player, limit, access_cache)
 | 
						|
    else:
 | 
						|
        total = spots_s_glitchless(state, player, limit, access_cache) \
 | 
						|
        + spots_m_glitchless(state, player, limit, access_cache) \
 | 
						|
        + spots_l_glitchless(state, player, limit, access_cache) \
 | 
						|
        + spots_xl_glitchless(state, player, limit, access_cache)
 | 
						|
 | 
						|
    return total >= spots
 | 
						|
 | 
						|
 | 
						|
def rep(state: CollectionState, player: int, required: int) -> bool:
 | 
						|
    return state.has("rep", player, required)
 | 
						|
 | 
						|
 | 
						|
def rules(brcworld):
 | 
						|
    multiworld = brcworld.multiworld
 | 
						|
    player = brcworld.player
 | 
						|
 | 
						|
    movestyle = brcworld.options.starting_movestyle
 | 
						|
    limit = brcworld.options.limited_graffiti
 | 
						|
    glitched = brcworld.options.logic
 | 
						|
    extra = brcworld.options.extra_rep_required
 | 
						|
    photos = not brcworld.options.skip_polo_photos
 | 
						|
 | 
						|
    # entrances
 | 
						|
    for e in multiworld.get_region(Stages.BT1, player).entrances:
 | 
						|
        set_rule(e, lambda state: brink_terminal_entrance(state, player))
 | 
						|
 | 
						|
    if not glitched:
 | 
						|
        # versum hill
 | 
						|
        for e in multiworld.get_region(Stages.VH1, player).entrances:
 | 
						|
            set_rule(e, lambda state: versum_hill_entrance(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.VH2, player).entrances:
 | 
						|
            set_rule(e, lambda state: versum_hill_ch1_roadblock(state, player, limit))
 | 
						|
        for e in multiworld.get_region(Stages.VHO, player).entrances:
 | 
						|
            set_rule(e, lambda state: versum_hill_oldhead(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.VH3, player).entrances:
 | 
						|
            set_rule(e, lambda state: versum_hill_all_challenges(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.VH4, player).entrances:
 | 
						|
            set_rule(e, lambda state: versum_hill_basketball_court(state, player))
 | 
						|
 | 
						|
        # millennium square
 | 
						|
        for e in multiworld.get_region(Stages.MS, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_square_entrance(state, player))
 | 
						|
 | 
						|
        # brink terminal
 | 
						|
        for e in multiworld.get_region(Stages.BTO1, player).entrances:
 | 
						|
            set_rule(e, lambda state: brink_terminal_oldhead_underground(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.BTO2, player).entrances:
 | 
						|
            set_rule(e, lambda state: brink_terminal_oldhead_dock(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.BT2, player).entrances:
 | 
						|
            set_rule(e, lambda state: brink_terminal_plaza(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.BT3, player).entrances:
 | 
						|
            set_rule(e, lambda state: brink_terminal_tower(state, player))
 | 
						|
 | 
						|
        # millennium mall
 | 
						|
        for e in multiworld.get_region(Stages.MM1, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_mall_entrance(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.MMO1, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_mall_oldhead_ceiling(state, player, limit))
 | 
						|
        for e in multiworld.get_region(Stages.MM2, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_mall_big(state, player, limit, glitched))
 | 
						|
        for e in multiworld.get_region(Stages.MMO2, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_mall_oldhead_race(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.MM3, player).entrances:
 | 
						|
            set_rule(e, lambda state: millennium_mall_theater(state, player, limit))
 | 
						|
 | 
						|
        # pyramid island
 | 
						|
        for e in multiworld.get_region(Stages.PI1, player).entrances:
 | 
						|
            set_rule(e, lambda state: pyramid_island_entrance(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.PI2, player).entrances:
 | 
						|
            set_rule(e, lambda state: pyramid_island_gate(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.PIO, player).entrances:
 | 
						|
            set_rule(e, lambda state: pyramid_island_oldhead(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.PI3, player).entrances:
 | 
						|
            set_rule(e, lambda state: pyramid_island_upper_half(state, player, limit, glitched))
 | 
						|
        for e in multiworld.get_region(Stages.PI4, player).entrances:
 | 
						|
            set_rule(e, lambda state: pyramid_island_top(state, player))
 | 
						|
 | 
						|
        # mataan
 | 
						|
        for e in multiworld.get_region(Stages.MA1, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_entrance(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.MA2, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_smoke_wall(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.MA3, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_deep_city(state, player, limit, glitched))
 | 
						|
        for e in multiworld.get_region(Stages.MAO, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_oldhead(state, player))
 | 
						|
        for e in multiworld.get_region(Stages.MA4, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_smoke_wall2(state, player, limit, glitched))
 | 
						|
        for e in multiworld.get_region(Stages.MA5, player).entrances:
 | 
						|
            set_rule(e, lambda state: mataan_deepest(state, player, limit, glitched))
 | 
						|
 | 
						|
    # locations
 | 
						|
    # hideout
 | 
						|
    set_rule(multiworld.get_location("Hideout: BMX garage skateboard", player),
 | 
						|
        lambda state: bmx(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Hideout: Unlock phone app", player),
 | 
						|
        lambda state: current_chapter(state, player, 2))
 | 
						|
    set_rule(multiworld.get_location("Hideout: Vinyl joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 4))
 | 
						|
    set_rule(multiworld.get_location("Hideout: Solace joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 5))
 | 
						|
    
 | 
						|
    # versum hill
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Wallrunning challenge reward", player),
 | 
						|
        lambda state: versum_hill_challenge1(state, player))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Manual challenge reward", player),
 | 
						|
        lambda state: versum_hill_challenge2(state, player))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Corner challenge reward", player),
 | 
						|
        lambda state: versum_hill_challenge3(state, player))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: BMX gate outfit", player),
 | 
						|
        lambda state: bmx(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Glass floor skates", player),
 | 
						|
        lambda state: inline_skates(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Basketball court shortcut CD", player),
 | 
						|
        lambda state: current_chapter(state, player, 2))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Rave joins the crew", player),
 | 
						|
        lambda state: versum_hill_rave(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Frank joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 2))
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Rietveld joins the crew", player),
 | 
						|
        lambda state: versum_hill_rietveld(state, player, limit, glitched))
 | 
						|
    if photos:
 | 
						|
        set_rule(multiworld.get_location("Versum Hill: Big Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Versum Hill: Trash Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Versum Hill: Fruit stand Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
    
 | 
						|
    # millennium square
 | 
						|
    if photos:
 | 
						|
        set_rule(multiworld.get_location("Millennium Square: Half pipe Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
    
 | 
						|
    # brink terminal
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Upside grind challenge reward", player),
 | 
						|
        lambda state: brink_terminal_challenge1(state, player))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Manual challenge reward", player),
 | 
						|
        lambda state: brink_terminal_challenge2(state, player))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Score challenge reward", player),
 | 
						|
        lambda state: brink_terminal_challenge3(state, player))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: BMX gate graffiti", player),
 | 
						|
        lambda state: bmx(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Mesh's skateboard", player),
 | 
						|
        lambda state: brink_terminal_mesh(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Rooftop glass CD", player),
 | 
						|
        lambda state: inline_skates(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Mesh joins the crew", player),
 | 
						|
        lambda state: brink_terminal_mesh(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Eclipse joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 3))
 | 
						|
    if photos:
 | 
						|
        set_rule(multiworld.get_location("Brink Terminal: Behind glass Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
    
 | 
						|
    # millennium mall
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Glass cylinder CD", player),
 | 
						|
        lambda state: inline_skates(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Trick challenge reward", player),
 | 
						|
        lambda state: millennium_mall_challenge1(state, player))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Slide challenge reward", player),
 | 
						|
        lambda state: millennium_mall_challenge2(state, player))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Fish challenge reward", player),
 | 
						|
        lambda state: millennium_mall_challenge3(state, player))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Score challenge reward", player),
 | 
						|
        lambda state: millennium_mall_challenge4(state, player))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Atrium BMX gate BMX", player),
 | 
						|
        lambda state: bmx(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Shine joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 4))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: DOT.EXE joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 4))
 | 
						|
    
 | 
						|
    # pyramid island
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: BMX gate BMX", player),
 | 
						|
        lambda state: bmx(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Score challenge reward", player),
 | 
						|
        lambda state: pyramid_island_challenge1(state, player))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Score challenge 2 reward", player),
 | 
						|
        lambda state: pyramid_island_challenge2(state, player))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Quarter pipe challenge reward", player),
 | 
						|
        lambda state: pyramid_island_challenge3(state, player))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Shortcut glass CD", player),
 | 
						|
        lambda state: inline_skates(state, player, movestyle))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Maze outfit", player),
 | 
						|
        lambda state: skateboard(state, player, movestyle))
 | 
						|
    if not glitched:
 | 
						|
        add_rule(multiworld.get_location("Pyramid Island: Rise joins the crew", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Devil Theory joins the crew", player),
 | 
						|
        lambda state: current_chapter(state, player, 5))
 | 
						|
    if photos:
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Polo pile 1", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Polo pile 2", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Polo pile 3", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Polo pile 4", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Maze glass Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Maze classroom Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Maze vent Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Big maze Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Maze desk Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Pyramid Island: Maze forklift Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
 | 
						|
    # mataan
 | 
						|
    set_rule(multiworld.get_location("Mataan: Race challenge reward", player),
 | 
						|
        lambda state: mataan_challenge1(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Mataan: Wallrunning challenge reward", player),
 | 
						|
        lambda state: mataan_challenge2(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Mataan: Score challenge reward", player),
 | 
						|
        lambda state: mataan_challenge3(state, player))
 | 
						|
    if photos:
 | 
						|
        set_rule(multiworld.get_location("Mataan: Trash Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
        set_rule(multiworld.get_location("Mataan: Shopping Polo", player),
 | 
						|
            lambda state: camera(state, player))
 | 
						|
 | 
						|
    # events
 | 
						|
    set_rule(multiworld.get_location("Versum Hill: Complete Chapter 1", player),
 | 
						|
        lambda state: versum_hill_crew_battle(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Brink Terminal: Complete Chapter 2", player),
 | 
						|
        lambda state: brink_terminal_crew_battle(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Millennium Mall: Complete Chapter 3", player),
 | 
						|
        lambda state: millennium_mall_crew_battle(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Pyramid Island: Complete Chapter 4", player),
 | 
						|
        lambda state: pyramid_island_crew_battle(state, player, limit, glitched))
 | 
						|
    set_rule(multiworld.get_location("Defeat Faux", player),
 | 
						|
        lambda state: mataan_faux(state, player, limit, glitched))
 | 
						|
    
 | 
						|
    if extra:
 | 
						|
        add_rule(multiworld.get_location("Defeat Faux", player),
 | 
						|
            lambda state: rep(state, player, 1000))
 | 
						|
 | 
						|
    # graffiti spots
 | 
						|
    spots: int = 0
 | 
						|
    while spots < 385:
 | 
						|
        spots += 5
 | 
						|
        set_rule(multiworld.get_location(f"Tagged {spots} Graffiti Spots", player),
 | 
						|
            lambda state, spot_count=spots: graffiti_spots(state, player, movestyle, limit, glitched, spot_count))
 | 
						|
 | 
						|
    set_rule(multiworld.get_location("Tagged 389 Graffiti Spots", player),
 | 
						|
        lambda state: graffiti_spots(state, player, movestyle, limit, glitched, 389))
 |