diff --git a/.github/ISSUE_TEMPLATE/map_data.yml b/.github/ISSUE_TEMPLATE/map_data.yml index f6cd97bf..67c3df26 100644 --- a/.github/ISSUE_TEMPLATE/map_data.yml +++ b/.github/ISSUE_TEMPLATE/map_data.yml @@ -21,15 +21,21 @@ body: description: Select map from dropdown or leave at **None** if title is properly filled. options: + - Absence of Mercy and Empathy + - Absence of Patience and Wisdom + - Absence of Symmetry and Harmony + - Absence of Value and Meaning - Academy - Acid Caverns - Acton's Nightmare - Alleyways - Altered Distant Memory - Ancient City + - Ancient Reliquary - Arachnid Nest - Arachnid Tomb - Arcade + - Archive Reliquary - Arena - Arid Lake - Armoury @@ -40,11 +46,13 @@ body: - Barrows - Basilica - Bazaar + - Beach Landing - Beach - Belfry - Bog - Bone Crypt - Bramble Valley + - BrambleFall - Burial Chambers - Caer Blaidd, Wolfpack's Den - Cage @@ -56,6 +64,7 @@ body: - Cemetery - Channel - Chateau + - Chayula's Domain - City Square - Cold River - Colonnade @@ -64,6 +73,7 @@ body: - Coral Ruins - Core - Cortex + - Cosmic Reliquary - Courthouse - Courtyard - Coves @@ -72,17 +82,21 @@ body: - Crimson Township - Crystal Ore - Cursed Crypt + - Darbel's Promise - Dark Forest - Death and Taxes + - Decaying Reliquary - Defiled Cathedral - Desert - Desert Spring + - Desert of Dementia - Dig + - Domain of Timeless Conflict - Doryani's Machinarium - Dry Sea - Dunes - Dungeon - - Engraved Ultimatum + - Esh's Domain - Estuary - Excavation - Factory @@ -90,6 +104,8 @@ body: - Flooded Mine - Forbidden Woods - Forge of the Phoenix + - Forge of the Titans + - Forgotten Reliquary - Forking River - Foundry - Frozen Cabins @@ -103,11 +119,14 @@ body: - Grotto - Hall of Grandmasters - Hallowed Ground - - Harbinger + - Halls of Delirium + - Harbinger's Isle - Haunted Mansion + - Hysteriagate - Iceberg - Infested Valley - Infused Beachhead + - Islands of Devastation - Ivory Temple - Jungle Valley - Laboratory @@ -118,8 +137,10 @@ body: - Leyline - Lighthouse - Lookout + - Lunacy's Watch - "Maelstr\xF6m of Chaos" - Malformation + - Manor of Madness - Mao Kun - Marshes - Mausoleum @@ -134,22 +155,28 @@ body: - Oba's Cursed Trove - Olmec's Sanctum - Orchard + - Oriath Delusion + - Oubliette Reliquary - Overgrown Ruin - Overgrown Shrine - Palace - Park - Pen - Peninsula + - Perandus Manor - Phantasmagoria - Pier - Pillars of Arun - Pit - Pit of the Chimera + - Pits of Sorrow - Plateau - Plaza + - Polaric Void - Poorjoy's Asylum - Port - Precinct + - Primeval City - Primordial Blocks - Primordial Pool - Promenade @@ -157,13 +184,16 @@ body: - Ramparts - Reef - Relic Chambers - - Replica Cortex - - Replica Pillars of Arun - - Replica Poorjoy's Asylum + - Repository of Derision - Residence - Rewritten Distant Memory + - River of Hysteria + - Ruins of Despair - Scriptorium + - Sea of Isolation + - Seething Chyme - Sepulchre + - Shiny Reliquary - Shipyard - Shore - Shrine @@ -171,43 +201,58 @@ body: - Silo - Spider Forest - Spider Lair + - Spires of Delusion - Stagnation + - Steppes - Strand - Sulphur Vents - Summit - Sunken City + - Synthesised World - Temple - Terrace - The Alluring Abyss - The Apex of Sacrifice - The Beachhead + - The Bridge Enraptured - The Coward's Trial + - The Lake of Kalandra - The Pale Court - - The Perandus Manor - The Putrid Cloister + - The Sacred Grove - The Shaper's Realm - - The Tower of Ordeals + - The Syndrome Encampment + - The Temple of Atzoatl - The Twilight Temple - The Vinktar Square - Thicket + - Timeworn Reliquary - Tower - Toxic Sewer - Tropical Island + - Tul's Domain - Twisted Distant Memory - Underground River - Underground Sea - Untainted Paradise + - Uul-Netol's Domain - Vaal Pyramid + - Vaal Reliquary - Vaal Temple - Vault - Vaults of Atziri + - Vaults of Insanity - Villa + - Visceral Reliquary + - Voidborn Reliquary - Volcano - Waste Pool - Wasteland + - Wastes of Lunacy - Waterways - Whakawairua Tuahu - Wharf + - Xoph's Domain validations: required: false - type: textarea diff --git a/data/config.yaml b/data/config.yaml index e89990e3..d4c282ce 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -1,9 +1,6 @@ data: league: Ancestor - ignored: - - "Synthesised Map" - # Links poedb: base: https://poedb.tw diff --git a/data/main.py b/data/main.py index 796c136f..6e0bd7bf 100644 --- a/data/main.py +++ b/data/main.py @@ -406,22 +406,28 @@ def get_map_ratings(key, config): def get_map_wiki(config): + def get_map_wiki_inner(offset): + return requests.get( + config["wiki"]["api"], + params={ + "action": "cargoquery", + "format": "json", + "smaxage": 0, + "maxage": 0, + "limit": 500, + "offset": offset, + "tables": "areas", + "fields": "areas.name, areas.id, areas.area_level, areas.is_map_area, areas.is_unique_map_area, areas.monster_ids, areas.boss_monster_ids, areas.act", + "group_by": "areas.name", + "where": "areas.id LIKE '%MapWorlds%' AND areas.is_legacy_map_area=false OR areas.is_unique_map_area AND areas.is_legacy_map_area=false OR areas.is_map_area=false AND areas.is_town_area=false AND areas.is_hideout_area=false AND areas.is_legacy_map_area=false AND areas.act!=0 AND areas.id NOT LIKE '%Expedition%' AND areas.name NOT LIKE '%Hideout%' AND areas.id NOT LIKE '%Test%' AND areas.id NOT LIKE '%Heist%' AND areas.id NOT LIKE '%Labyrinth%' AND areas.id NOT LIKE '%Descent%' AND areas.name NOT LIKE '%PvP%' AND areas.name NOT LIKE '%Programming%' AND areas.name NOT LIKE '%Test%'", + }, + ).json()["cargoquery"] + print(f"Getting map metadata from wiki") - wiki_maps = requests.get( - config["wiki"]["api"], - params={ - "action": "cargoquery", - "format": "json", - "smaxage": 0, - "maxage": 0, - "limit": "500", - "tables": "maps,items,areas", - "join_on": "items._pageID=maps._pageID,maps.area_id=areas.id", - "fields": "items.name,maps.area_id,maps.area_level,areas.boss_monster_ids,maps.unique_area_id", - "group_by": "items.name", - "where": "maps.area_id LIKE '%MapWorlds%' OR maps.series='Unique'", - }, - ).json()["cargoquery"] + wiki_maps = [] + wiki_maps = wiki_maps + get_map_wiki_inner(0) + wiki_maps = wiki_maps + get_map_wiki_inner(500) + print(f"Found {len(wiki_maps)} areas") return list(map(lambda x: x["title"], wiki_maps)) @@ -433,18 +439,57 @@ def get_maps(key, config): out = [] for m in map_wiki: - unique = not m["name"].endswith(" Map") + name = m.get("name") + id = m.get("id") + level = int(m.get("area level")) + act = int(m.get("act")) + if ( + not name + or "DNT" in name + or "UNUSED" in name + or "Character Select" in name + or "PetFlats" in name + or level == 0 + ): + continue + + name = name.strip().replace("The Hall of Grandmasters", "Hall of Grandmasters") + is_map_area = m.get("is map area", "0") != "0" + is_unique_map_area = m.get("is unique map area", "0") != "0" + is_act_area = False + is_special_area = False + + if not is_unique_map_area: + if is_map_area: + name = name + " Map" + else: + if id.startswith("1_") or id.startswith("2_") and act < 11: + is_act_area = True + else: + is_special_area = True + + map_type = "unknown area" + if is_unique_map_area: + map_type = "unique map" + elif is_map_area: + map_type = "map" + elif is_act_area: + map_type = "act area" + elif is_special_area: + map_type = "special area" + + if is_special_area: + print(f"Found special area {name}") + out_map = { - "name": m["name"], - "level": int(m["area level"]), - "poedb": "https://poedb.tw/us/" + m["name"].replace(" ", "_"), + "id": id, + "name": name, + "level": level, + "poedb": "https://poedb.tw/us/" + name.replace(" ", "_").replace("'", ""), "boss": {}, + "type": map_type, } - if unique and m.get("unique area id"): - out_map["id"] = m["unique area id"] - else: - out_map["id"] = m["area id"] if m.get("boss monster ids"): out_map["boss"]["ids"] = sorted( list(set(filter(None, m["boss monster ids"].split(",")))) @@ -473,7 +518,10 @@ def get_maps(key, config): out_map = {"name": name.strip(), "poedb": map_url} out.append(out_map) - base_names = sorted(list(map(lambda x: x["name"], out))) + base_names = sorted( + list(map(lambda x: x["name"], out)) + + ["Harbinger Map", "Engraved Ultimatum", "Synthesised Map"] + ) mapslist = soup.find(id="MapsUnique").find("table").find("tbody").find_all("tr") for row in mapslist: @@ -492,10 +540,9 @@ def get_maps(key, config): if existing_map: existing_map["poedb"] = map_url else: - out_map = {"name": name.strip(), "poedb": map_url} - out.append(out_map) + print(f"Found unknown poedb map {name}, skipping") + continue - out = list(filter(lambda x: x["name"] not in config["ignored"], out)) out = deduplicate(sorted(out, key=lambda d: d["name"]), "name") out_names = list(map(lambda x: x["name"], out)) @@ -514,15 +561,12 @@ def get_maps(key, config): ) for m in out: - name = m["name"].replace(" Synthesised Map", "") - m["name"] = name - unique = not name.endswith(" Map") + name = m["name"] m["shorthand"] = find_shortest_substring(name.replace(" Map", ""), out_names) m["boss"] = m.get("boss", {}) m["layout"] = {} m["rating"] = {} m["info"] = {} - m["unique"] = unique existing_meta = next(filter(lambda x: x["name"] == name, meta), None) if existing_meta: @@ -552,59 +596,57 @@ def get_maps(key, config): def get_map_data(map_data, extra_map_data): url = map_data.get("poedb") + map_data.pop("poedb") - if url: - map_data.pop("poedb") - - # PoeDB map metadata - print(f"Getting map data for {map_data['name']} from url {url}") - s = requests.Session() - r = s.get(url) - soup = BeautifulSoup(r.content, "html.parser") - maptabs = soup.find("div", class_="tab-content").findChildren( - "div", recursive=False - ) - - level_found = False - for data in maptabs: - table = data.find("table") - if not table: - continue - tbody = table.find("tbody") - if not tbody: - continue - rows = tbody.find_all("tr") - if not rows: - continue + # PoeDB map metadata + print(f"Getting map data for {map_data['name']} from url {url}") + s = requests.Session() + r = s.get(url) + soup = BeautifulSoup(r.content, "html.parser") + tabs = soup.find("div", class_="tab-content") + maptabs = tabs and tabs.findChildren("div", recursive=False) + maptabs = maptabs or [] + + level_found = False + for data in maptabs: + table = data.find("table") + if not table: + continue + tbody = table.find("tbody") + if not tbody: + continue + rows = tbody.find_all("tr") + if not rows: + continue - for row in rows: - cols = row.find_all("td") - name = cols[0].text.strip().lower() - value = cols[1] - if name == "monster level" and not level_found: - level = int(value.text.strip()) - if level: - level_found = True - map_data["level"] = level - elif name == "boss": - map_data["boss"]["names"] = sorted( - list(set(map(lambda x: x.text.strip(), value.find_all("a")))) - ) - elif name == "atlas linked": - map_data["connected"] = sorted( - list(set(map(lambda x: x.text.strip(), value.find_all("a")))) - ) - elif name == "the pantheon": - map_data["pantheon"] = next( - map(lambda x: x.text.strip(), value.find_all("a")) - ) - elif name == "tags": - if "cannot_be_twinned" in value.text.strip(): - map_data["boss"]["not_twinnable"] = True - if "no_boss" in value.text.strip(): - map_data["boss"].pop("ids", None) - elif name == "icon" and "icon" not in map_data: - map_data["icon"] = value.text.strip() + for row in rows: + cols = row.find_all("td") + name = cols[0].text.strip().lower() + value = cols[1] + if name == "monster level" and not level_found: + level = int(value.text.strip()) + if level: + level_found = True + map_data["level"] = level + elif name == "boss": + map_data["boss"]["names"] = sorted( + list(set(map(lambda x: x.text.strip(), value.find_all("a")))) + ) + elif name == "atlas linked": + map_data["connected"] = sorted( + list(set(map(lambda x: x.text.strip(), value.find_all("a")))) + ) + elif name == "the pantheon": + map_data["pantheon"] = next( + map(lambda x: x.text.strip(), value.find_all("a")) + ) + elif name == "tags": + if "cannot_be_twinned" in value.text.strip(): + map_data["boss"]["not_twinnable"] = True + if "no_boss" in value.text.strip(): + map_data["boss"].pop("ids", None) + elif name == "icon" and "icon" not in map_data: + map_data["icon"] = value.text.strip() # Merge existing data existing = next( @@ -642,7 +684,8 @@ def get_maps_template(maps, existing_maps): if existing_map: merge(existing_map, new_map) out.remove(existing_map) - out.append(new_map) + if "map" in map["type"]: + out.append(new_map) return sorted(out, key=lambda d: d["name"]) @@ -718,7 +761,10 @@ def dropdown_input(name, description, values, required=False): dropdown_input( "Map name", "Select map from dropdown or leave at **None** if title is properly filled.", - map(lambda x: x["name"].replace(" Map", ""), maps), + map( + lambda x: x["name"].replace(" Map", ""), + filter(lambda x: "map" in x["type"], maps), + ), ) ) body.append( diff --git a/data/maps.json b/data/maps.json index 93c15673..3cb7f7ae 100644 --- a/data/maps.json +++ b/data/maps.json @@ -1,4 +1,76 @@ [ + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Absence of Mercy and Empathy" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Absence of Patience and Wisdom" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Absence of Symmetry and Harmony" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Absence of Value and Meaning" + }, { "boss": { "not_spawned": null, @@ -107,6 +179,24 @@ }, "name": "Ancient City Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Ancient Reliquary" + }, { "boss": { "not_spawned": true, @@ -161,6 +251,24 @@ }, "name": "Arcade Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Archive Reliquary" + }, { "boss": { "not_spawned": null, @@ -341,6 +449,24 @@ }, "name": "Bazaar Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Beach Landing Map" + }, { "boss": { "not_spawned": false, @@ -431,6 +557,24 @@ }, "name": "Bramble Valley Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "BrambleFall Map" + }, { "boss": { "not_spawned": null, @@ -632,6 +776,24 @@ }, "name": "Chateau Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Chayula's Domain" + }, { "boss": { "not_spawned": false, @@ -779,6 +941,24 @@ }, "name": "Cortex" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Cosmic Reliquary" + }, { "boss": { "not_spawned": null, @@ -923,6 +1103,24 @@ }, "name": "Cursed Crypt Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Darbel's Promise" + }, { "boss": { "not_spawned": null, @@ -959,6 +1157,24 @@ }, "name": "Death and Taxes" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Decaying Reliquary" + }, { "boss": { "not_spawned": false, @@ -1013,6 +1229,24 @@ }, "name": "Desert Spring Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Desert of Dementia Map" + }, { "boss": { "not_spawned": false, @@ -1031,6 +1265,24 @@ }, "name": "Dig Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Domain of Timeless Conflict" + }, { "boss": { "not_spawned": null, @@ -1121,6 +1373,24 @@ }, "name": "Engraved Ultimatum" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Esh's Domain" + }, { "boss": { "not_spawned": null, @@ -1263,7 +1533,43 @@ "linear": null, "outdoors": null }, - "name": "Forking River Map" + "name": "Forge of the Titans" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Forgotten Reliquary" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Forking River Map" }, { "boss": { @@ -1481,6 +1787,24 @@ }, "name": "Hallowed Ground" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Halls of Delirium Map" + }, { "boss": { "not_spawned": null, @@ -1499,6 +1823,24 @@ }, "name": "Harbinger Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Harbinger's Isle" + }, { "boss": { "not_spawned": null, @@ -1517,6 +1859,24 @@ }, "name": "Haunted Mansion Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Hysteriagate" + }, { "boss": { "not_spawned": null, @@ -1571,6 +1931,24 @@ }, "name": "Infused Beachhead" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Islands of Devastation Map" + }, { "boss": { "not_spawned": null, @@ -1751,6 +2129,24 @@ }, "name": "Lookout Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Lunacy's Watch" + }, { "boss": { "not_spawned": false, @@ -1787,6 +2183,24 @@ }, "name": "Malformation Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Manor of Madness Map" + }, { "boss": { "not_spawned": true, @@ -2039,6 +2453,42 @@ }, "name": "Orchard Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Oriath Delusion" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Oubliette Reliquary" + }, { "boss": { "not_spawned": false, @@ -2147,6 +2597,24 @@ }, "name": "Peninsula Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Perandus Manor" + }, { "boss": { "not_spawned": false, @@ -2237,6 +2705,24 @@ }, "name": "Pit of the Chimera Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Pits of Sorrow Map" + }, { "boss": { "not_spawned": false, @@ -2273,6 +2759,24 @@ }, "name": "Plaza Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Polaric Void" + }, { "boss": { "not_spawned": false, @@ -2327,6 +2831,24 @@ }, "name": "Precinct Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Primeval City Map" + }, { "boss": { "not_spawned": false, @@ -2507,6 +3029,24 @@ }, "name": "Replica Poorjoy's Asylum" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Repository of Derision Map" + }, { "boss": { "not_spawned": false, @@ -2543,6 +3083,42 @@ }, "name": "Rewritten Distant Memory" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "River of Hysteria Map" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Ruins of Despair Map" + }, { "boss": { "not_spawned": false, @@ -2561,6 +3137,42 @@ }, "name": "Scriptorium Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Sea of Isolation Map" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Seething Chyme" + }, { "boss": { "not_spawned": null, @@ -2579,6 +3191,24 @@ }, "name": "Sepulchre Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Shiny Reliquary" + }, { "boss": { "not_spawned": false, @@ -2705,6 +3335,24 @@ }, "name": "Spider Lair Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Spires of Delusion Map" + }, { "boss": { "not_spawned": false, @@ -2723,6 +3371,24 @@ }, "name": "Stagnation Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Steppes Map" + }, { "boss": { "not_spawned": false, @@ -2795,6 +3461,24 @@ }, "name": "Sunken City Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Synthesised World" + }, { "boss": { "not_spawned": false, @@ -2885,6 +3569,24 @@ }, "name": "The Beachhead" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "The Bridge Enraptured" + }, { "boss": { "not_spawned": true, @@ -2903,6 +3605,24 @@ }, "name": "The Coward's Trial" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "The Lake of Kalandra" + }, { "boss": { "not_spawned": null, @@ -2957,6 +3677,24 @@ }, "name": "The Putrid Cloister" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "The Sacred Grove" + }, { "boss": { "not_spawned": null, @@ -2991,7 +3729,25 @@ "linear": null, "outdoors": null }, - "name": "The Tower of Ordeals" + "name": "The Syndrome Encampment" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "The Temple of Atzoatl" }, { "boss": { @@ -3047,6 +3803,24 @@ }, "name": "Thicket Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Timeworn Reliquary" + }, { "boss": { "not_spawned": false, @@ -3101,6 +3875,24 @@ }, "name": "Tropical Island Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Tul's Domain" + }, { "boss": { "not_spawned": null, @@ -3173,6 +3965,24 @@ }, "name": "Untainted Paradise" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Uul-Netol's Domain" + }, { "boss": { "not_spawned": false, @@ -3191,6 +4001,24 @@ }, "name": "Vaal Pyramid Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Vaal Reliquary" + }, { "boss": { "not_spawned": false, @@ -3245,6 +4073,24 @@ }, "name": "Vaults of Atziri" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Vaults of Insanity Map" + }, { "boss": { "not_spawned": null, @@ -3263,6 +4109,42 @@ }, "name": "Villa Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Visceral Reliquary" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Voidborn Reliquary" + }, { "boss": { "not_spawned": false, @@ -3317,6 +4199,24 @@ }, "name": "Wasteland Map" }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Wastes of Lunacy Map" + }, { "boss": { "not_spawned": null, @@ -3370,5 +4270,23 @@ "outdoors": null }, "name": "Wharf Map" + }, + { + "boss": { + "not_spawned": null, + "phases": null, + "rushable": null, + "separated": null, + "soft_phases": null + }, + "image": false, + "layout": { + "delirium_mirror": null, + "few_obstacles": null, + "league_mechanics": null, + "linear": null, + "outdoors": null + }, + "name": "Xoph's Domain" } ] \ No newline at end of file diff --git a/site/src/App.js b/site/src/App.js index f5677409..5b510fa3 100644 --- a/site/src/App.js +++ b/site/src/App.js @@ -39,12 +39,14 @@ function rateMaps( const mapsWithCardValues = foundMaps .filter(m => { switch (mapDisplay) { + case 'atlas+unique+special+act': + return m.atlas || m.type === 'unique map' || m.type === 'special area' || m.type === 'act area' + case 'atlas+unique+special': + return m.atlas || m.type === 'unique map' || m.type === 'special area' case 'atlas+unique': - return m.unique || m.atlas + return m.atlas || m.type === 'unique map' case 'atlas': return m.atlas - case 'unique': - return m.unique default: return true } @@ -100,7 +102,7 @@ function rateMaps( } if (cardValueSource === 'kirac') { - card.value = map.unique ? 0 : card.stack * card.price * (card.weight / card.kiracWeight) + card.value = map.type !== 'map' ? 0 : card.stack * card.price * (card.weight / card.kiracWeight) } else { card.value = card.price * (card.weight / card.mapWeight) * card.dropPoolItems } @@ -410,10 +412,11 @@ function App() { tooltip: <>Which maps are displayed., type: 'select', options: { - all: 'All maps', - atlas: 'Atlas maps', - unique: 'Unique maps', - 'atlas+unique': 'Atlas and unique maps' + all: 'All areas', + atlas: 'Atlas areas', + 'atlas+unique': 'Atlas+Unique areas', + 'atlas+unique+special': 'Atlas+Unique+Special areas', + 'atlas+unique+special+act': 'Atlas+Unique+Special+Act areas' }, def: mapDisplay }, diff --git a/site/src/common.js b/site/src/common.js index 9eb721f4..56a38c39 100644 --- a/site/src/common.js +++ b/site/src/common.js @@ -67,11 +67,11 @@ export function ratingColor(rating, scale = 1) { return color } -export function tierColor(tiers, unique, voidstones = 0) { +export function tierColor(tiers, type, voidstones = 0) { const tier = tiers[voidstones] let color = 'light' - if (unique) { + if (type === 'unique map') { color = 'unique' } else if (tier >= 11) { color = 'danger' diff --git a/site/src/components/Atlas.js b/site/src/components/Atlas.js index f1dc0fc3..5f8b7c35 100644 --- a/site/src/components/Atlas.js +++ b/site/src/components/Atlas.js @@ -31,7 +31,7 @@ function toNode(map, matchingNodes, atlasScore, atlasIcons, atlasLabels, voidsto name: map.name, tiers: map.tiers, icon: map.icon, - unique: map.unique, + type: map.type, score: map.score } }, @@ -68,7 +68,7 @@ function MapNode({ id, data }) { if (atlasScore) { mapColor = `text-${ratingColor(map.score, 10)}` } else { - mapColor = `text-${tierColor(map.tiers, map.unique, data.voidstones)}` + mapColor = `text-${tierColor(map.tiers, map.type, data.voidstones)}` } const buttonClass = `btn btn-badge btn-dark ${mapColor}` + (atlasIcons ? ' atlas-button' : '') @@ -79,7 +79,7 @@ function MapNode({ id, data }) { {!!atlasIcons && ( - + )} {!!atlasLabels && (